diff --git a/CHANGELOG.md b/CHANGELOG.md
index 2437bc0..729b697 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -74,6 +74,14 @@
 - Added `List.unmodifiableOf` with better typing than `List.unmodifiable`.
 - Added `Map.unmodifiableOf` with better typing than `Map.unmodifiable`.
 
+#### `dart:core`
+
+- Added two getters on `int` for efficient bit-counting:
+  `trailingZeroBitCount` (ctz) and `oneBitCount` (popcount). On native
+  platforms they operate on the full 64-bit two's-complement
+  representation; on the web they operate on the least-significant 32
+  bits. See [#52673](https://github.com/dart-lang/sdk/issues/52673).
+
 #### `dart:io`
 
 - The cookie-date parser now uses the correct algorithm again.
diff --git a/DEPS b/DEPS
index 9091156..6632e18 100644
--- a/DEPS
+++ b/DEPS
@@ -59,7 +59,7 @@
 
   # co19 is a cipd package automatically generated for each co19 commit.
   # Use tests/co19/update.sh to update this hash.
-  "co19_rev": "36d96a9edcf73a1b5c745cf44f13f0a1dc4f1462",
+  "co19_rev": "266d9f242d9ddcbb4be96995cd16839b8e577cf3",
 
   # The internal benchmarks to use. See go/dart-benchmarks-internal
   "benchmarks_internal_rev": "6058722b4643b62c757dadc006f00bc3e14c4380",
@@ -83,13 +83,13 @@
   "clang_version": "git_revision:a3f244e2d5550e110daee562b88bee247b75d66c",
 
   # https://chrome-infra-packages.appspot.com/p/gn/gn
-  "gn_version": "git_revision:1740f5c25bcac5a650ee3d1c1ec22bfa25fcd756",
+  "gn_version": "git_revision:78e67afc82faf52b2f7025265d412fd7418d88c2",
 
   "reclient_version": "re_client_version:28341fc74c68f05a5c8be35160ada940c4edb969",
   "download_reclient": True,
 
   # Update from https://chrome-infra-packages.appspot.com/p/fuchsia/sdk/core
-  "fuchsia_sdk_version": "version:31.20260430.4.1",
+  "fuchsia_sdk_version": "version:32.20260508.4.1",
   "download_fuchsia_deps": False,
 
   # Ninja, runs the build based on files generated by GN.
@@ -102,7 +102,7 @@
 
   # Prefer to use hashes of binaryen that have been reviewed & rolled into g3.
   "binaryen_rev" : "604f547f5ccb51cdc02c1b12fe96a6d045c602d5",
-  "boringssl_rev": "a1c146745137642dfb53a1ec12ebe79817b31584",
+  "boringssl_rev": "9730fe2168ced0889a227855cbc28762f49c1bd5",
   "browser-compat-data_tag": "ac8cae697014da1ff7124fba33b0b4245cc6cd1b", # v1.0.22
   "cpu_features_rev": "936b9ab5515dead115606559502e3864958f7f6e",
   "devtools_rev": "23a1bf0ff30bc83b1dc16045d6d9b15da9b4bc9c",
@@ -166,7 +166,7 @@
   # meant to be downloaded by users for local testing. You can self-service
   # update these by following the go/dart-engprod/browsers.md instructions.
   "download_chrome": False,
-  "chrome_tag": "148.0.7778.96",
+  "chrome_tag": "149.0.7827.3",
   "download_firefox": False,
   "firefox_tag": "150.0",
 
diff --git a/benchmarks/Omnibus/dart/Omnibus.dart b/benchmarks/Omnibus/dart/Omnibus.dart
index 393f4c9..ef7e823 100644
--- a/benchmarks/Omnibus/dart/Omnibus.dart
+++ b/benchmarks/Omnibus/dart/Omnibus.dart
@@ -23,9 +23,9 @@
 import '../../RuntimeType/dart/RuntimeType.dart' as lib_RuntimeType;
 import '../../SHA1/dart/sha1.dart' as lib_SHA1;
 import '../../SHA256/dart/sha256.dart' as lib_SHA256;
+import '../../SimdInt32x4/dart/SimdInt32x4.dart' as lib_SimdInt32x4;
 import '../../SkeletalAnimation/dart/SkeletalAnimation.dart'
     as lib_SkeletalAnimation;
-import '../../SimdInt32x4/dart/SimdInt32x4.dart' as lib_SimdInt32x4;
 import '../../SkeletalAnimationSIMD/dart/SkeletalAnimationSIMD.dart'
     as lib_SkeletalAnimationSIMD;
 import '../../SwitchFSM/dart/SwitchFSM.dart' as lib_SwitchFSM;
diff --git a/benchmarks/UiMatrix/dart/uimatrix.dart b/benchmarks/UiMatrix/dart/uimatrix.dart
index d455471..c230f14 100644
--- a/benchmarks/UiMatrix/dart/uimatrix.dart
+++ b/benchmarks/UiMatrix/dart/uimatrix.dart
@@ -225,16 +225,12 @@
   }
 
   const UiMatrix._({
-    required double m00,
-    required double m11,
-    required double m03,
-    required double m13,
-    _MatrixExtension? rest,
-  }) : _m00 = m00,
-       _m11 = m11,
-       _m03 = m03,
-       _m13 = m13,
-       _rest = rest;
+    required this._m00,
+    required this._m11,
+    required this._m03,
+    required this._m13,
+    this._rest,
+  });
 
   final double _m00;
   final double _m11;
@@ -393,30 +389,19 @@
   );
 
   const _MatrixExtension({
-    required double m01,
-    required double m02,
-    required double m10,
-    required double m12,
-    required double m20,
-    required double m21,
-    required double m22,
-    required double m23,
-    required double m30,
-    required double m31,
-    required double m32,
-    required double m33,
-  }) : _m01 = m01,
-       _m02 = m02,
-       _m10 = m10,
-       _m12 = m12,
-       _m20 = m20,
-       _m21 = m21,
-       _m22 = m22,
-       _m23 = m23,
-       _m30 = m30,
-       _m31 = m31,
-       _m32 = m32,
-       _m33 = m33;
+    required this._m01,
+    required this._m02,
+    required this._m10,
+    required this._m12,
+    required this._m20,
+    required this._m21,
+    required this._m22,
+    required this._m23,
+    required this._m30,
+    required this._m31,
+    required this._m32,
+    required this._m33,
+  });
 
   final double _m01;
   final double _m02;
diff --git a/pkg/_fe_analyzer_shared/lib/src/base/diagnostic_message.dart b/pkg/_fe_analyzer_shared/lib/src/base/diagnostic_message.dart
deleted file mode 100644
index d9f5a87..0000000
--- a/pkg/_fe_analyzer_shared/lib/src/base/diagnostic_message.dart
+++ /dev/null
@@ -1,90 +0,0 @@
-// Copyright (c) 2025, the Dart project authors. Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import 'package:_fe_analyzer_shared/src/base/analyzer_public_api.dart';
-import 'package:_fe_analyzer_shared/src/base/errors.dart';
-
-/// A single message associated with a [Diagnostic], consisting of the text of
-/// the message and the location associated with it.
-///
-/// Clients may not extend, implement or mix-in this class.
-@AnalyzerPublicApi(
-  message: 'Exported by package:analyzer/diagnostic/diagnostic.dart',
-)
-abstract class DiagnosticMessage {
-  /// The absolute and normalized path of the file associated with this message.
-  String get filePath;
-
-  /// The length of the source range associated with this message.
-  int get length;
-
-  /// The zero-based offset from the start of the file to the beginning of the
-  /// source range associated with this message.
-  int get offset;
-
-  /// The URL containing documentation about this diagnostic message, if any.
-  ///
-  /// Note: this should not be confused with the location in the user's code
-  /// where the error was reported; that information can be obtained from
-  /// [filePath], [length], and [offset].
-  String? get url;
-
-  /// Gets the text of the message.
-  ///
-  /// If [includeUrl] is `true`, and this diagnostic message has an associated
-  /// URL, it is included in the returned value in a human-readable way.
-  /// Clients that wish to present URLs as simple text can do this.  If
-  /// [includeUrl] is `false`, no URL is included in the returned value.
-  /// Clients that have a special mechanism for presenting URLs (e.g. as a
-  /// clickable link) should do this and then consult the [url] getter to access
-  /// the URL.
-  String messageText({required bool includeUrl});
-}
-
-/// A concrete implementation of a diagnostic message.
-class DiagnosticMessageImpl implements DiagnosticMessage {
-  @override
-  final String filePath;
-
-  @override
-  final int length;
-
-  final String _message;
-
-  @override
-  final int offset;
-
-  @override
-  final String? url;
-
-  /// Initialize a newly created message to represent a [message] reported in
-  /// the file at the given [filePath] at the given [offset] and with the given
-  /// [length].
-  DiagnosticMessageImpl({
-    required this.filePath,
-    required this.length,
-    required String message,
-    required this.offset,
-    required this.url,
-  }) : _message = message;
-
-  @override
-  String messageText({required bool includeUrl}) {
-    if (includeUrl && url != null) {
-      StringBuffer result = new StringBuffer(_message);
-      if (!_message.endsWith('.')) {
-        result.write('.');
-      }
-      result.write('  See $url');
-      return result.toString();
-    }
-    return _message;
-  }
-}
-
-/// An indication of the severity of a [Diagnostic].
-@AnalyzerPublicApi(
-  message: 'exported by package:analyzer/diagnostic/diagnostic.dart',
-)
-enum Severity { error, warning, info }
diff --git a/pkg/_fe_analyzer_shared/lib/src/base/errors.dart b/pkg/_fe_analyzer_shared/lib/src/base/errors.dart
index 0730045..91315d1 100644
--- a/pkg/_fe_analyzer_shared/lib/src/base/errors.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/base/errors.dart
@@ -8,12 +8,7 @@
 import 'dart:math';
 
 import 'package:_fe_analyzer_shared/src/base/analyzer_public_api.dart';
-import 'package:_fe_analyzer_shared/src/base/diagnostic_message.dart';
-import 'package:_fe_analyzer_shared/src/base/source.dart';
-import 'package:_fe_analyzer_shared/src/base/source_range.dart';
-import 'package:_fe_analyzer_shared/src/base/syntactic_entity.dart';
 import 'package:_fe_analyzer_shared/src/scanner/characters.dart';
-import 'package:source_span/source_span.dart';
 
 import 'customized_codes.dart';
 
@@ -76,175 +71,6 @@
   return buffer.join();
 }
 
-/// A diagnostic, as defined by the [Diagnostic Design Guidelines][guidelines]:
-///
-/// > An indication of a specific problem at a specific location within the
-/// > source code being processed by a development tool.
-///
-/// Clients may not extend, implement or mix-in this class.
-///
-/// [guidelines]: https://github.com/dart-lang/sdk/blob/main/pkg/analyzer/doc/implementation/diagnostics.md
-@AnalyzerPublicApi(
-  message: 'Exported by package:analyzer/diagnostic/diagnostic.dart',
-)
-class Diagnostic {
-  /// The diagnostic code associated with the diagnostic.
-  final DiagnosticCode diagnosticCode;
-
-  /// A list of messages that provide context for understanding the problem
-  /// being reported. The list will be empty if there are no such messages.
-  final List<DiagnosticMessage> contextMessages;
-
-  /// A description of how to fix the problem, or `null` if there is no such
-  /// description.
-  final String? correctionMessage;
-
-  /// A message describing what is wrong and why.
-  final DiagnosticMessage problemMessage;
-
-  /// The source in which the diagnostic occurred, or `null` if unknown.
-  final Source source;
-
-  Diagnostic.forValues({
-    required this.source,
-    required int offset,
-    required int length,
-    required this.diagnosticCode,
-    required String message,
-    this.correctionMessage,
-    this.contextMessages = const [],
-  }) : problemMessage = new DiagnosticMessageImpl(
-         filePath: source.fullName,
-         length: length,
-         message: message,
-         offset: offset,
-         url: null,
-       );
-
-  /// Initialize a newly created diagnostic.
-  ///
-  /// The diagnostic is associated with the given [source] and is located at the
-  /// given [offset] with the given [length]. The diagnostic will have the given
-  /// [diagnosticCode] and the list of [arguments] will be used to complete the
-  /// message and correction. If any [contextMessages] are provided, they will
-  /// be recorded with the diagnostic.
-  factory Diagnostic.tmp({
-    required Source source,
-    required int offset,
-    required int length,
-    required DiagnosticCode diagnosticCode,
-    List<Object?> arguments = const [],
-    List<DiagnosticMessage> contextMessages = const [],
-  }) {
-    assert(
-      arguments.length == diagnosticCode.numParameters,
-      'Message $diagnosticCode requires ${diagnosticCode.numParameters} '
-      'argument${diagnosticCode.numParameters == 1 ? '' : 's'}, but '
-      '${arguments.length} '
-      'argument${arguments.length == 1 ? ' was' : 's were'} '
-      'provided',
-    );
-    String message = formatList(diagnosticCode.problemMessage, arguments);
-    String? correctionTemplate = diagnosticCode.correctionMessage;
-    String? correctionMessage;
-    if (correctionTemplate != null) {
-      correctionMessage = formatList(correctionTemplate, arguments);
-    }
-
-    return new Diagnostic.forValues(
-      source: source,
-      offset: offset,
-      length: length,
-      diagnosticCode: diagnosticCode,
-      message: message,
-      correctionMessage: correctionMessage,
-      contextMessages: contextMessages,
-    );
-  }
-
-  /// The template used to create the correction to be displayed for this
-  /// diagnostic, or `null` if there is no correction information for this
-  /// error. The correction should indicate how the user can fix the error.
-  @Deprecated("Use 'correctionMessage' instead.")
-  String? get correction => correctionMessage;
-
-  @Deprecated("Use 'diagnosticCode' instead")
-  DiagnosticCode get errorCode => diagnosticCode;
-
-  @override
-  int get hashCode {
-    int hashCode = offset;
-    hashCode ^= message.hashCode;
-    hashCode ^= source.hashCode;
-    return hashCode;
-  }
-
-  /// The number of characters from the offset to the end of the source which
-  /// encompasses the compilation error.
-  int get length => problemMessage.length;
-
-  /// The message to be displayed for this diagnostic.
-  ///
-  /// The message indicates what is wrong and why it is wrong.
-  String get message => problemMessage.messageText(includeUrl: true);
-
-  /// The character offset from the beginning of the source (zero based) where
-  /// the diagnostic occurred.
-  int get offset => problemMessage.offset;
-
-  Severity get severity {
-    switch (diagnosticCode.severity) {
-      case DiagnosticSeverity.ERROR:
-        return Severity.error;
-      case DiagnosticSeverity.WARNING:
-        return Severity.warning;
-      case DiagnosticSeverity.INFO:
-        return Severity.info;
-      default:
-        throw new StateError('Invalid severity: ${diagnosticCode.severity}');
-    }
-  }
-
-  @override
-  bool operator ==(Object other) {
-    if (identical(other, this)) {
-      return true;
-    }
-    // prepare the other Diagnostic.
-    if (other is Diagnostic) {
-      // Quick checks.
-      if (!identical(diagnosticCode, other.diagnosticCode)) {
-        return false;
-      }
-      if (offset != other.offset || length != other.length) {
-        return false;
-      }
-      // Deep checks.
-      if (message != other.message) {
-        return false;
-      }
-      if (source != other.source) {
-        return false;
-      }
-      return true;
-    }
-    return false;
-  }
-
-  @override
-  String toString() {
-    StringBuffer buffer = new StringBuffer();
-    buffer.write(source.fullName);
-    buffer.write("(");
-    buffer.write(offset);
-    buffer.write("..");
-    buffer.write(offset + length - 1);
-    buffer.write("): ");
-    buffer.write(message);
-    return buffer.toString();
-  }
-}
-
 /// An error code associated with an `AnalysisError`.
 ///
 /// Generally, messages should follow the [Guide for Writing
@@ -376,23 +202,6 @@
   DiagnosticSeverity get severity => type.severity;
 }
 
-/// Private subtype of [DiagnosticCode] that supports runtime checking of
-/// parameter types.
-class DiagnosticCodeWithExpectedTypes extends DiagnosticCodeImpl {
-  final List<ExpectedType>? expectedTypes;
-
-  const DiagnosticCodeWithExpectedTypes({
-    super.correctionMessage,
-    super.hasPublishedDocs = false,
-    super.isUnresolvedIdentifier = false,
-    required super.name,
-    required super.problemMessage,
-    required super.type,
-    required super.uniqueName,
-    this.expectedTypes,
-  });
-}
-
 /// The severity of an [DiagnosticCode].
 @AnalyzerPublicApi(message: 'exported by package:analyzer/error/error.dart')
 class DiagnosticSeverity implements Comparable<DiagnosticSeverity> {
@@ -565,215 +374,3 @@
   @override
   String toString() => name;
 }
-
-/// Common functionality for [DiagnosticCode]-derived classes that represent
-/// errors that take arguments.
-///
-/// This class provides a [withArguments] getter, which can be used to supply
-/// arguments and produce a [LocatableDiagnostic].
-///
-/// Note: the type argument `T` should be instantiated with a function type. But
-/// it is typed as `extends Object` in order to reduce the risk of accidental
-/// dynamic invocation of [withArguments].
-class DiagnosticWithArguments<T extends Object>
-    extends DiagnosticCodeWithExpectedTypes {
-  /// Function accepting named arguments and returning [LocatableDiagnostic].
-  ///
-  /// The value returned by this function can
-  /// be associated with a location in the source code using the
-  /// [LocatableDiagnostic.at] method, and then the result can be passed to
-  /// [DiagnosticReporter.reportError].
-  final T withArguments;
-
-  const DiagnosticWithArguments({
-    required super.name,
-    required super.problemMessage,
-    super.correctionMessage,
-    super.hasPublishedDocs = false,
-    super.isUnresolvedIdentifier = false,
-    required super.type,
-    required super.uniqueName,
-    required super.expectedTypes,
-    required this.withArguments,
-  });
-}
-
-/// Common functionality for [DiagnosticCode]-derived classes that represent
-/// errors that do not take arguments.
-///
-/// This class implements [LocatableDiagnostic], which means that instances can
-/// be associated with a location in the source code using the [at] method, and
-/// then the result can be passed to [DiagnosticReporter.reportError].
-base mixin DiagnosticWithoutArguments on DiagnosticCodeImpl
-    implements LocatableDiagnostic {
-  @override
-  List<Object> get arguments => const [];
-
-  @override
-  DiagnosticCode get code => this;
-
-  @override
-  Iterable<DiagnosticMessage> get contextMessages => const [];
-
-  @override
-  LocatedDiagnostic at(SyntacticEntity node) =>
-      atOffset(offset: node.offset, length: node.length);
-
-  @override
-  LocatedDiagnostic atOffset({required int offset, required int length}) =>
-      new LocatedDiagnostic(this, offset, length);
-
-  @override
-  LocatedDiagnostic atSourceRange(SourceRange sourceRange) =>
-      atOffset(offset: sourceRange.offset, length: sourceRange.length);
-
-  @override
-  LocatedDiagnostic atSourceSpan(SourceSpan span) =>
-      atOffset(offset: span.start.offset, length: span.length);
-
-  @override
-  LocatableDiagnostic withContextMessages(
-    Iterable<DiagnosticMessage> messages,
-  ) => new LocatableDiagnosticImpl(
-    code,
-    arguments,
-    contextMessages: [...messages],
-  );
-}
-
-/// Concrete implementation of [DiagnosticWithoutArguments], used for diagnostic
-/// messages that don't take any arguments.
-///
-/// This needs to be a separate class from [DiagnosticWithoutArguments] because
-/// [DiagnosticWithoutArguments] is a mixin.
-final class DiagnosticWithoutArgumentsImpl
-    extends DiagnosticCodeWithExpectedTypes
-    with DiagnosticWithoutArguments {
-  const DiagnosticWithoutArgumentsImpl({
-    required super.name,
-    required super.problemMessage,
-    super.correctionMessage,
-    super.hasPublishedDocs = false,
-    super.isUnresolvedIdentifier = false,
-    required super.type,
-    required super.uniqueName,
-    super.expectedTypes,
-  });
-}
-
-/// Expected type of a diagnostic code's parameter.
-enum ExpectedType { element, int, name, object, string, token, type, uri }
-
-/// Interface for a diagnostic that does not have any unfilled template
-/// parameters, and hence is ready to be associated with a location in the
-/// source code.
-///
-/// This could either be the result of calling `withArguments` on a diagnostic
-/// code that requires arguments, or it could be a diagnostic code that doesn't
-/// require arguments.
-abstract final class LocatableDiagnostic {
-  /// The arguments that were applied to the diagnostic, or the empty list if
-  /// [code] doesn't accept any arguments.
-  List<Object> get arguments;
-
-  /// The [DiagnosticCode] associated with the diagnostic.
-  DiagnosticCode get code;
-
-  /// The context messages that were applied to the diagnostic.
-  Iterable<DiagnosticMessage> get contextMessages;
-
-  /// Converts this diagnostic to a [LocatedDiagnostic] by applying it to a
-  /// syntactic entity in the source code.
-  ///
-  /// The result may be passed to [DiagnosticReporter.reportError].
-  LocatedDiagnostic at(SyntacticEntity node);
-
-  /// Converts this diagnostic to a [LocatedDiagnostic] by applying it to a
-  /// location in the source code.
-  ///
-  /// The result may be passed to [DiagnosticReporter.reportError].
-  LocatedDiagnostic atOffset({required int offset, required int length});
-
-  /// Converts this diagnostic to a [LocatedDiagnostic] by applying it to a
-  /// location in the source code.
-  ///
-  /// The result may be passed to [DiagnosticReporter.reportError].
-  LocatedDiagnostic atSourceRange(SourceRange sourceRange);
-
-  /// Converts this diagnostic to a [LocatedDiagnostic] by applying it to a
-  /// location in the source code.
-  ///
-  /// The result may be passed to [DiagnosticReporter.reportError].
-  LocatedDiagnostic atSourceSpan(SourceSpan span);
-
-  /// Attaches context messages to this diagnostic.
-  ///
-  /// The return value is a fresh instance of [LocatableDiagnostic]. This allows
-  /// for a literate style of error reporting, e.g.:
-  /// ```dart
-  /// // For an diagnostic code that doesn't take arguments:
-  /// diagnosticReporter.reportError(
-  ///   diagnosticCode.withContextMessages(messages).at(astNode));
-  ///
-  /// // For a diagnostic code that does take arguments:
-  /// diagnosticReporter.reportError(
-  ///   diagnosticCode
-  ///     .withArguments(...)
-  ///     .withContextMessages(messages)
-  ///     .at(astNode));
-  /// ```
-  LocatableDiagnostic withContextMessages(Iterable<DiagnosticMessage> messages);
-}
-
-/// Concrete implementation of [LocatableDiagnostic].
-final class LocatableDiagnosticImpl implements LocatableDiagnostic {
-  @override
-  final DiagnosticCode code;
-
-  @override
-  final List<Object> arguments;
-
-  @override
-  final Iterable<DiagnosticMessage> contextMessages;
-
-  LocatableDiagnosticImpl(
-    this.code,
-    this.arguments, {
-    this.contextMessages = const [],
-  });
-
-  @override
-  LocatedDiagnostic at(SyntacticEntity node) =>
-      atOffset(offset: node.offset, length: node.length);
-
-  @override
-  LocatedDiagnostic atOffset({required int offset, required int length}) =>
-      new LocatedDiagnostic(this, offset, length);
-
-  @override
-  LocatedDiagnostic atSourceRange(SourceRange sourceRange) =>
-      atOffset(offset: sourceRange.offset, length: sourceRange.length);
-
-  @override
-  LocatedDiagnostic atSourceSpan(SourceSpan span) =>
-      atOffset(offset: span.start.offset, length: span.length);
-
-  @override
-  LocatableDiagnostic withContextMessages(
-    Iterable<DiagnosticMessage> messages,
-  ) => new LocatableDiagnosticImpl(
-    code,
-    arguments,
-    contextMessages: [...contextMessages, ...messages],
-  );
-}
-
-/// A diagnostic that does not have any unfilled template parameters, and has
-/// been associated with a location in the source code.
-final class LocatedDiagnostic {
-  final LocatableDiagnostic locatableDiagnostic;
-  final int offset;
-  final int length;
-
-  LocatedDiagnostic(this.locatableDiagnostic, this.offset, this.length);
-}
diff --git a/pkg/_fe_analyzer_shared/lib/src/flow_analysis/flow_analysis.dart b/pkg/_fe_analyzer_shared/lib/src/flow_analysis/flow_analysis.dart
index 0edf674..7d5c28744 100644
--- a/pkg/_fe_analyzer_shared/lib/src/flow_analysis/flow_analysis.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/flow_analysis/flow_analysis.dart
@@ -750,6 +750,7 @@
     required bool isFinal,
     required bool isLate,
     required bool isImplicitlyTyped,
+    bool inheritPromotableProperties = false,
   });
 
   /// Whether the [variable] is definitely assigned in the current state.
@@ -1195,6 +1196,12 @@
     SharedTypeView scrutineeType,
   );
 
+  /// Call this method just before changing the binding of `this`.
+  void thisBinding_begin(ExpressionInfo? targetInfo);
+
+  /// Call this method just after the end of a `this` binding.
+  void thisBinding_end();
+
   /// Call this method just after visiting the expression `this` (or the
   /// pseudo-expression `super`, in the case of the analyzer, which represents
   /// `super.x` as a property get whose target is `super`).
@@ -1956,11 +1963,13 @@
     required bool isFinal,
     required bool isLate,
     required bool isImplicitlyTyped,
+    bool inheritPromotableProperties = false,
   }) {
     _wrap(
       'initialize($variable, $matchedType, $initializerExpressionInfo, '
       'isFinal: $isFinal, isLate: $isLate, '
-      'isImplicitlyTyped: $isImplicitlyTyped)',
+      'isImplicitlyTyped: $isImplicitlyTyped, '
+      'inheritPromotableProperties: $inheritPromotableProperties)',
       () => _wrapped.initialize(
         variable,
         matchedType,
@@ -1968,6 +1977,7 @@
         isFinal: isFinal,
         isLate: isLate,
         isImplicitlyTyped: isImplicitlyTyped,
+        inheritPromotableProperties: inheritPromotableProperties,
       ),
     );
   }
@@ -2499,6 +2509,19 @@
   }
 
   @override
+  void thisBinding_begin(ExpressionInfo? targetInfo) {
+    _wrap(
+      'thisBinding_begin($targetInfo)',
+      () => _wrapped.thisBinding_begin(targetInfo),
+    );
+  }
+
+  @override
+  void thisBinding_end() {
+    _wrap('thisBinding_end()', () => _wrapped.thisBinding_end());
+  }
+
+  @override
   ExpressionInfo thisOrSuper(
     SharedTypeView staticType, {
     required bool isSuper,
@@ -5173,8 +5196,10 @@
   @override
   late final SsaNode _superSsaNode = new SsaNode();
 
+  final List<SsaNode> _thisSsaNodes = [new SsaNode()];
+
   @override
-  late final SsaNode _thisSsaNode = new SsaNode();
+  SsaNode get _thisSsaNode => _thisSsaNodes.last;
 
   @override
   final List<_Reference> _cascadeTargetStack = [];
@@ -5845,6 +5870,7 @@
     required bool isFinal,
     required bool isLate,
     required bool isImplicitlyTyped,
+    bool inheritPromotableProperties = false,
   }) {
     SharedTypeView unpromotedType = operations.variableType(variable);
     int variableKey = promotionKeyStore.keyForVariable(variable);
@@ -5856,6 +5882,7 @@
       isLate: isLate,
       isImplicitlyTyped: isImplicitlyTyped,
       unpromotedType: unpromotedType,
+      inheritPromotableProperties: inheritPromotableProperties,
     );
   }
 
@@ -6644,6 +6671,24 @@
   }
 
   @override
+  void thisBinding_begin(ExpressionInfo? targetInfo) {
+    _Reference? expressionReference = _getExpressionReference(targetInfo);
+    SsaNode ssaNode =
+        expressionReference?.ssaNode ??
+        new SsaNode(
+          conditionVariableState: targetInfo != null && targetInfo.isNonTrivial
+              ? targetInfo
+              : null,
+        );
+    _thisSsaNodes.add(ssaNode);
+  }
+
+  @override
+  void thisBinding_end() {
+    _thisSsaNodes.removeLast();
+  }
+
+  @override
   ExpressionInfo thisOrSuper(
     SharedTypeView staticType, {
     required bool isSuper,
@@ -7445,6 +7490,7 @@
     required bool isLate,
     required bool isImplicitlyTyped,
     required SharedTypeView unpromotedType,
+    bool inheritPromotableProperties = false,
   }) {
     if (isLate) {
       // Don't use expression info for late variables, since we don't know when
@@ -7458,12 +7504,15 @@
       // https://github.com/dart-lang/language/issues/1785.
       expressionInfo = null;
     }
-    SsaNode newSsaNode = new SsaNode(
-      conditionVariableState:
-          expressionInfo != null && expressionInfo.isNonTrivial
-          ? expressionInfo
-          : null,
-    );
+    SsaNode newSsaNode =
+        inheritPromotableProperties && expressionInfo is _Reference
+        ? expressionInfo.ssaNode
+        : new SsaNode(
+            conditionVariableState:
+                expressionInfo != null && expressionInfo.isNonTrivial
+                ? expressionInfo
+                : null,
+          );
     _current = _current.write(
       this,
       null,
@@ -7731,16 +7780,23 @@
     ).restoreConditionVariableState(scrutineeInfo, this, _current);
   }
 
-  TrivialVariableReference _thisOrSuperReference(
+  _Reference _thisOrSuperReference(
     SharedTypeView staticType, {
     required bool isSuper,
-  }) => new TrivialVariableReference(
-    promotionKey: promotionKeyStore.thisPromotionKey,
-    model: _current,
-    type: staticType,
-    isThisOrSuper: true,
-    ssaNode: isSuper ? _superSsaNode : _thisSsaNode,
-  );
+  }) {
+    SsaNode ssaNode = isSuper ? _superSsaNode : _thisSsaNode;
+    return new TrivialVariableReference(
+      promotionKey: promotionKeyStore.thisPromotionKey,
+      model: _current,
+      type: staticType,
+      isThisOrSuper: true,
+      ssaNode: ssaNode,
+    ).restoreConditionVariableState(
+      ssaNode.conditionVariableState,
+      this,
+      _current,
+    );
+  }
 
   TrivialVariableReference _variableReference(
     int variableKey,
diff --git a/pkg/_fe_analyzer_shared/lib/src/parser/forwarding_listener.dart b/pkg/_fe_analyzer_shared/lib/src/parser/forwarding_listener.dart
index 7e8b391..0bdec08 100644
--- a/pkg/_fe_analyzer_shared/lib/src/parser/forwarding_listener.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/parser/forwarding_listener.dart
@@ -228,12 +228,14 @@
   void beginFactory(
     DeclarationKind declarationKind,
     Token lastConsumed,
+    Token? augmentToken,
     Token? externalToken,
     Token? constToken,
   ) {
     listener?.beginFactory(
       declarationKind,
       lastConsumed,
+      augmentToken,
       externalToken,
       constToken,
     );
diff --git a/pkg/_fe_analyzer_shared/lib/src/parser/listener.dart b/pkg/_fe_analyzer_shared/lib/src/parser/listener.dart
index c9dab9a..899aa59 100644
--- a/pkg/_fe_analyzer_shared/lib/src/parser/listener.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/parser/listener.dart
@@ -542,6 +542,7 @@
   void beginFactory(
     DeclarationKind declarationKind,
     Token lastConsumed,
+    Token? augmentToken,
     Token? externalToken,
     Token? constToken,
   ) {}
diff --git a/pkg/_fe_analyzer_shared/lib/src/parser/parser_impl.dart b/pkg/_fe_analyzer_shared/lib/src/parser/parser_impl.dart
index 2813817..8be4b88 100644
--- a/pkg/_fe_analyzer_shared/lib/src/parser/parser_impl.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/parser/parser_impl.dart
@@ -5368,6 +5368,7 @@
             token,
             kind,
             beforeStart,
+            augmentToken,
             externalToken,
             staticToken ?? covariantToken,
             varFinalOrConst,
@@ -5388,6 +5389,7 @@
               token,
               kind,
               beforeStart,
+              augmentToken,
               externalToken,
               staticToken ?? covariantToken,
               varFinalOrConst,
@@ -6098,6 +6100,7 @@
     Token token,
     DeclarationKind kind,
     Token beforeStart,
+    Token? augmentToken,
     Token? externalToken,
     Token? staticOrCovariant,
     Token? varFinalOrConst,
@@ -6131,7 +6134,13 @@
       varFinalOrConst = null;
     }
 
-    listener.beginFactory(kind, beforeStart, externalToken, varFinalOrConst);
+    listener.beginFactory(
+      kind,
+      beforeStart,
+      augmentToken,
+      externalToken,
+      varFinalOrConst,
+    );
     if (!hasName) {
       listener.handleNoIdentifier(token, IdentifierContext.methodDeclaration);
     } else if (token.next!.isA(Keyword.NEW) &&
diff --git a/pkg/_fe_analyzer_shared/pubspec.yaml b/pkg/_fe_analyzer_shared/pubspec.yaml
index dc8d868..1b06f39 100644
--- a/pkg/_fe_analyzer_shared/pubspec.yaml
+++ b/pkg/_fe_analyzer_shared/pubspec.yaml
@@ -12,7 +12,6 @@
 
 dependencies:
   meta: ^1.9.0
-  source_span: ^1.10.0
 
 # We use 'any' version constraints here as we get our package versions from
 # the dart-lang/sdk repo's DEPS file. Note that this is a special case; the
diff --git a/pkg/_fe_analyzer_shared/test/flow_analysis/flow_analysis_test.dart b/pkg/_fe_analyzer_shared/test/flow_analysis/flow_analysis_test.dart
index b442da7..16cadcc 100644
--- a/pkg/_fe_analyzer_shared/test/flow_analysis/flow_analysis_test.dart
+++ b/pkg/_fe_analyzer_shared/test/flow_analysis/flow_analysis_test.dart
@@ -12827,6 +12827,166 @@
         checkAssigned(branch1, false),
       ]);
     });
+
+    test('Anonymous method with target having no ExpressionInfo', () {
+      h.run([
+        expr(
+          'A',
+        ).invokeAnonymousMethod([checkReachable(true)], returnType: 'void'),
+      ]);
+    });
+
+    test('Anonymous method has a different notion of this', () {
+      h.addMember('C', '_field', 'Object', promotable: true);
+      h.thisType = 'C';
+      h.run([
+        this_.as_('C'),
+        this_.property('_field').as_('num'),
+        checkPromoted(this_.property('_field'), 'num'),
+        expr('C').invokeAnonymousMethod([
+          checkNotPromoted(this_.property('_field')),
+          this_.property('_field').as_('int'),
+          checkPromoted(this_.property('_field'), 'int'),
+        ], returnType: 'void'),
+        checkPromoted(this_.property('_field'), 'num'),
+      ]);
+    });
+
+    test(
+      'Anonymous method with target having ExpressionInfo but not a Reference',
+      () {
+        h.addMember('C', '_field', 'Object', promotable: true);
+        h.thisType = 'C';
+        h.run([
+          this_.as_('C'),
+          this_.property('_field').as_('num'),
+          checkPromoted(this_.property('_field'), 'num'),
+          expr('bool').conditional(expr('C'), expr('C')).invokeAnonymousMethod([
+            checkNotPromoted(this_.property('_field')),
+            this_.property('_field').as_('int'),
+            checkPromoted(this_.property('_field'), 'int'),
+          ], returnType: 'void'),
+          checkPromoted(this_.property('_field'), 'num'),
+        ]);
+      },
+    );
+
+    test('Anonymous method promotes this._field '
+        'from localVariable._field and vice versa', () {
+      var x = Var('x');
+      h.addMember('A', '_field', 'Object', promotable: true);
+      h.run([
+        declare(x, type: 'A', initializer: expr('A')),
+        x.property('_field').as_('num'),
+        x.invokeAnonymousMethod([
+          checkPromoted(this_.property('_field'), 'num'),
+          this_.property('_field').as_('int'),
+        ], returnType: 'void'),
+        checkPromoted(x.property('_field'), 'int'),
+      ]);
+    });
+
+    test('Anonymous method promotes this._field '
+        'from instanceVariable._field and vice versa', () {
+      h.addMember('A', '_field', 'Object', promotable: true);
+      h.addMember('B', '_subField', 'Object', promotable: true);
+      h.thisType = 'A';
+      h.run([
+        this_.as_('A'),
+        this_.property('_field').as_('B'),
+        this_.property('_field').property('_subField').as_('num'),
+        this_.property('_field').invokeAnonymousMethod([
+          checkPromoted(this_.property('_subField'), 'num'),
+          this_.property('_subField').as_('int'),
+        ], returnType: 'void'),
+        checkPromoted(this_.property('_field').property('_subField'), 'int'),
+      ]);
+    });
+
+    test('Parameterized anonymous method has the same notion of this', () {
+      h.addMember('C', '_field', 'Object', promotable: true);
+      h.thisType = 'C';
+      h.run([
+        this_.as_('C'),
+        this_.property('_field').as_('num'),
+        checkPromoted(this_.property('_field'), 'num'),
+        expr('C').invokeAnonymousMethod(isParameterless: false, [
+          checkPromoted(this_.property('_field'), 'num'),
+          this_.property('_field').as_('int'),
+          checkPromoted(this_.property('_field'), 'int'),
+        ], returnType: 'void'),
+        checkPromoted(this_.property('_field'), 'int'),
+      ]);
+    });
+
+    test('Parameterized anonymous method with target having ExpressionInfo '
+        'but not a Reference', () {
+      h.addMember('C', '_field', 'Object', promotable: true);
+      h.thisType = 'C';
+      h.run([
+        this_.as_('C'),
+        this_.property('_field').as_('num'),
+        checkPromoted(this_.property('_field'), 'num'),
+        expr('bool')
+            .conditional(expr('C'), expr('C'))
+            .invokeAnonymousMethod(isParameterless: false, [
+              checkPromoted(this_.property('_field'), 'num'),
+              this_.property('_field').as_('int'),
+              checkPromoted(this_.property('_field'), 'int'),
+            ], returnType: 'void'),
+        checkPromoted(this_.property('_field'), 'int'),
+      ]);
+    });
+
+    test('Parameterized anonymous method parameter '
+        'does not inherit promotion', () {
+      var x = Var('x');
+      var p = Var('p');
+      h.addMember('A', '_field', 'Object', promotable: true);
+      h.thisType = 'A';
+      h.run([
+        declare(x, type: 'A', initializer: expr('A')),
+        x.property('_field').as_('num'),
+        x.invokeAnonymousMethod(isParameterless: false, parameter: p, [
+          checkNotPromoted(p.property('_field')),
+          p.property('_field').as_('int'),
+        ], returnType: 'void'),
+        checkPromoted(x.property('_field'), 'num'),
+      ]);
+    });
+
+    test('Parameterized anonymous method does not promote parameter._field '
+        'from instanceVariable._field or vice versa', () {
+      var p = Var('p');
+      h.addMember('A', '_field', 'B', promotable: true);
+      h.addMember('B', '_subField', 'Object', promotable: true);
+      h.thisType = 'A';
+      h.run([
+        this_.as_('A'),
+        this_.property('_field').as_('B'),
+        this_.property('_field').property('_subField').as_('num'),
+        this_
+            .property('_field')
+            .invokeAnonymousMethod(isParameterless: false, parameter: p, [
+              checkNotPromoted(p.property('_subField')),
+              p.property('_subField').as_('int'),
+        ], returnType: 'void'),
+        checkPromoted(this_.property('_field').property('_subField'), 'num'),
+      ]);
+    });
+
+    test('Anonymous method this serves as condition variable', () {
+      var x = Var('x');
+      h.run([
+        declare(x, type: 'int?', initializer: expr('int?')),
+        x.eq(nullLiteral).not.invokeAnonymousMethod(isParameterless: true, [
+          this_.conditional(
+            checkPromoted(x, 'int'),
+            expr('bool'),
+          ),
+        ], returnType: 'bool'),
+      ]);
+    });
   });
 }
 
diff --git a/pkg/_fe_analyzer_shared/test/mini_ast.dart b/pkg/_fe_analyzer_shared/test/mini_ast.dart
index 9a0d0c6..d4c9632 100644
--- a/pkg/_fe_analyzer_shared/test/mini_ast.dart
+++ b/pkg/_fe_analyzer_shared/test/mini_ast.dart
@@ -2453,17 +2453,26 @@
 
   final bool isNullAware;
 
+  final bool isParameterless;
+
+  final Var? parameter;
+
   InvokeAnonymousMethod._(
     this.target,
     this.body, {
     required this.returnType,
     required this.isNullAware,
+    required this.isParameterless,
+    this.parameter,
     required super.location,
   });
 
   @override
   void preVisit(PreVisitor visitor) {
     target.preVisit(visitor);
+    if (parameter != null) {
+      visitor._assignedVariables.declare(parameter!);
+    }
     body.preVisit(visitor);
   }
 
@@ -2484,10 +2493,40 @@
     if (isNullAware) {
       targetResult = h.typeAnalyzer.createNullAwareGuard(target, targetResult);
     }
+    var targetInfo = targetResult.flowAnalysisInfo;
+    var previousThisType = h._thisType;
+    if (isParameterless) {
+      h.flow.thisBinding_begin(targetInfo);
+      h._thisType = targetResult.type.unwrapTypeView();
+    }
     h.flow.anonymousBlockBody_begin();
+    if (parameter != null) {
+      bool isImplicitlyTyped = parameter!._type == null;
+      if (parameter!._type == null) {
+        parameter!._type = targetResult.type.unwrapTypeView<Type>();
+      }
+      h.flow.declare(
+        parameter!,
+        SharedTypeView(parameter!.type),
+        initialized: false,
+      );
+      h.flow.initialize(
+        parameter!,
+        targetResult.type,
+        targetInfo,
+        isFinal: false,
+        isLate: false,
+        isImplicitlyTyped: isImplicitlyTyped,
+        inheritPromotableProperties: isParameterless,
+      );
+    }
     // Analyze the block, and generate its IR.
     body.visit(h);
     h.flow.anonymousBlockBody_end();
+    if (isParameterless) {
+      h._thisType = previousThisType;
+      h.flow.thisBinding_end();
+    }
     // Form the IR for the anonymous method invocation.
     h.irBuilder.apply(
       'anonymous-method',
@@ -4971,6 +5010,8 @@
     List<ProtoStatement> body, {
     required String returnType,
     bool isNullAware = false,
+    bool isParameterless = true,
+    Var? parameter,
   }) {
     var location = computeLocation();
     return new InvokeAnonymousMethod._(
@@ -4978,6 +5019,8 @@
       Block._(body, location: location),
       returnType: Type(returnType),
       isNullAware: isNullAware,
+      isParameterless: isParameterless,
+      parameter: parameter,
       location: location,
     );
   }
@@ -7129,6 +7172,7 @@
       SharedTypeView(thisType),
       isSuper: false,
     );
+    flow.storeExpressionInfo(node, flowAnalysisInfo);
     return new ExpressionTypeAnalysisResult(
       type: SharedTypeView(thisType),
       flowAnalysisInfo: flowAnalysisInfo,
@@ -7151,6 +7195,9 @@
       SharedTypeView(memberType),
     );
     var promotedType = wrappedPromotedType?.unwrapTypeView();
+    if (flowAnalysisInfo != null) {
+      flow.storeExpressionInfo(node, flowAnalysisInfo);
+    }
     return new ExpressionTypeAnalysisResult(
       type: SharedTypeView(promotedType ?? memberType),
       flowAnalysisInfo: flowAnalysisInfo,
@@ -7249,6 +7296,7 @@
   ) {
     var (promotedType, flowAnalysisInfo) = flow.variableRead(variable);
     callback?.call(promotedType?.unwrapTypeView());
+    flow.storeExpressionInfo(node, flowAnalysisInfo);
     return new ExpressionTypeAnalysisResult(
       type: promotedType ?? SharedTypeView(variable.type),
       flowAnalysisInfo: flowAnalysisInfo,
@@ -7843,6 +7891,9 @@
       member,
       SharedTypeView(memberType),
     );
+    if (propertyGetNode != null && flowAnalysisInfo != null) {
+      flow.storeExpressionInfo(propertyGetNode, flowAnalysisInfo);
+    }
     return ExpressionTypeAnalysisResult(
       type: wrappedPromotedType ?? SharedTypeView(memberType),
       flowAnalysisInfo: flowAnalysisInfo,
diff --git a/pkg/analysis_server/doc/design/features/documentHighlight.md b/pkg/analysis_server/doc/design/features/documentHighlight.md
index 9bd01ca..a689b54 100644
--- a/pkg/analysis_server/doc/design/features/documentHighlight.md
+++ b/pkg/analysis_server/doc/design/features/documentHighlight.md
@@ -59,5 +59,22 @@
 - The declaration of an enum introduces the static getter `values` and the
 instance getters `index` and `name`.
 
+## Kinds
+
+Each document highlight has an associated `kind` which allows clients to
+highlight reads and writes differently. The LSP spec says:
+
+> Symbol matches usually have a `DocumentHighlightKind` of `Read` or `Write`
+> whereas fuzzy or textual matches use `Text` as the kind.
+
+TypeScript (which we often try to be consistent with when expected behaviour
+isn't obvious, since the VS Code, LSP and TypeScript teams working closely
+together) uses `Read` and `Write` even for names of types, so we have followed
+that pattern.
+
+- `Write` - assignments (setters, variables, initializers), declarations, argument names
+- `Read` - getters, variable reads, references to types and parameters
+- `Text` - keywords like `for`, `break`, `return`
+
 [languageFidelity]: ../principles/language_fidelity.md
 [textDocument/documentHighlight]: https://microsoft.github.io/language-server-protocol/specifications/lsp/3.17/specification/#textDocument_documentHighlight
diff --git a/pkg/analysis_server/integration_test/lsp_server/integration_tests.dart b/pkg/analysis_server/integration_test/lsp_server/integration_tests.dart
index e6de1a9..4a2f0fd 100644
--- a/pkg/analysis_server/integration_test/lsp_server/integration_tests.dart
+++ b/pkg/analysis_server/integration_test/lsp_server/integration_tests.dart
@@ -9,7 +9,6 @@
 import 'package:analysis_server/lsp_protocol/protocol.dart';
 import 'package:analysis_server/src/lsp/channel/lsp_byte_stream_channel.dart';
 import 'package:analysis_server/src/services/pub/pub_command.dart';
-import 'package:analysis_server/src/session_logger/session_logger.dart';
 import 'package:analyzer/file_system/physical_file_system.dart';
 import 'package:analyzer/instrumentation/instrumentation.dart';
 import 'package:analyzer_plugin/src/utilities/client_uri_converter.dart';
@@ -242,7 +241,6 @@
       inputStream,
       outputStream,
       instrumentationService ?? InstrumentationLogAdapter(PrintableLogger()),
-      sessionLogger: SessionLogger(),
     )..listen(_serverToClient.add);
   }
 
diff --git a/pkg/analysis_server/lib/src/analysis_server.dart b/pkg/analysis_server/lib/src/analysis_server.dart
index d0c4f7b..1a03b46 100644
--- a/pkg/analysis_server/lib/src/analysis_server.dart
+++ b/pkg/analysis_server/lib/src/analysis_server.dart
@@ -1169,6 +1169,7 @@
     await contextManager.dispose();
     await analyticsManager.shutdown();
     await shutdownPerfWitness();
+    await sessionLogger.shutdown();
   }
 
   ResolvedForCompletionResultImpl?
diff --git a/pkg/analysis_server/lib/src/analytics/analytics_manager.dart b/pkg/analysis_server/lib/src/analytics/analytics_manager.dart
index 1d966a0..6516e32 100644
--- a/pkg/analysis_server/lib/src/analytics/analytics_manager.dart
+++ b/pkg/analysis_server/lib/src/analytics/analytics_manager.dart
@@ -4,6 +4,7 @@
 
 import 'dart:async';
 import 'dart:convert';
+import 'dart:io';
 
 import 'package:analysis_server/lsp_protocol/protocol.dart';
 import 'package:analysis_server/protocol/protocol_constants.dart';
@@ -56,6 +57,9 @@
   /// The object used to send analytics.
   final Analytics analytics;
 
+  /// The environment variables.
+  final Map<String, String> _environment;
+
   /// Data about the current session, or `null` if the [startUp] method has not
   /// been invoked.
   SessionData? _sessionData;
@@ -101,7 +105,8 @@
 
   /// Initialize a newly created analytics manager to report to the [analytics]
   /// service.
-  AnalyticsManager(this.analytics) {
+  AnalyticsManager(this.analytics, {Map<String, String>? environment})
+    : _environment = environment ?? Platform.environment {
     if (analytics is! NoOpAnalytics) {
       periodicTimer = Timer.periodic(Duration(minutes: 30), (_) {
         _sendPeriodicData();
@@ -745,6 +750,13 @@
   Future<void> _sendSessionData(SessionData sessionData) async {
     var endTime = DateTime.now().millisecondsSinceEpoch;
     var duration = endTime - sessionData.startTime.millisecondsSinceEpoch;
+
+    // Record the start of the session.
+    var ideName = _environment['DASH__IDE_NAME'] ?? '';
+    var ideVersion = _environment['DASH__IDE_VERSION'] ?? '';
+    var pluginName = _environment['DASH__PLUGIN_NAME'] ?? '';
+    var pluginVersion = _environment['DASH__PLUGIN_VERSION'] ?? '';
+
     analytics.send(
       Event.serverSession(
         flags: sessionData.commandLineArguments,
@@ -752,6 +764,10 @@
         clientId: sessionData.clientId,
         clientVersion: sessionData.clientVersion,
         duration: duration,
+        ideName: ideName,
+        ideVersion: ideVersion,
+        pluginName: pluginName,
+        pluginVersion: pluginVersion,
       ),
     );
     for (var MapEntry(key: pluginId, value: percentileCalculator)
diff --git a/pkg/analysis_server/lib/src/computer/computer_document_highlights.dart b/pkg/analysis_server/lib/src/computer/computer_document_highlights.dart
index 943cd9e..07250bc 100644
--- a/pkg/analysis_server/lib/src/computer/computer_document_highlights.dart
+++ b/pkg/analysis_server/lib/src/computer/computer_document_highlights.dart
@@ -2,6 +2,9 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+import 'package:analysis_server/lsp_protocol/protocol.dart'
+    show DocumentHighlightKind;
+import 'package:analysis_server/src/utilities/extensions/element.dart';
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/ast/token.dart';
 import 'package:analyzer/dart/ast/visitor.dart';
@@ -17,7 +20,9 @@
   DartDocumentHighlightsComputer(this._unit);
 
   /// Computes matching highlight tokens for the requested offset.
-  List<Token> compute(int requestedOffset) {
+  List<({Token token, DocumentHighlightKind kind})> compute(
+    int requestedOffset,
+  ) {
     var coveringNode = _unit.nodeCovering(offset: requestedOffset);
     coveringNode = _adjustNode(requestedOffset, coveringNode);
     if (coveringNode == null) return [];
@@ -71,10 +76,15 @@
     // Add the obvious target element.
     var mainTarget = _getTargetElement(coveringNode)?.canonical;
 
-    // For pattern variables in implicit pattern fields (where the field name
-    // is inferred from the variable name), also include the field element.
-
     var additionalTarget = switch (coveringNode) {
+      FormalParameter(
+        declaredFragment: FormalParameterFragment(
+          :FieldFormalParameterElement element,
+        ),
+      ) =>
+        element.field,
+      // For pattern variables in implicit pattern fields (where the field name
+      // is inferred from the variable name), also include the field element.
       VariablePattern(parent: PatternField(:var element, :var name))
           when name?.name == null =>
         element?.canonical,
@@ -89,7 +99,7 @@
       ...?additionalTarget?.supertypeMembers,
     };
 
-    return _HighlightTargets.elements(mainTarget?.name, allTargets);
+    return _HighlightTargets.elements(allTargets);
   }
 
   /// Gets the target [AstNode] for [node] if it's a node-based highlight group
@@ -147,8 +157,8 @@
 class _DartDocumentHighlightsVisitor extends GeneralizingAstVisitor<void> {
   final _HighlightTargets _target;
 
-  /// Collected tokens matching the target.
-  final Set<Token> tokens = {};
+  /// Collected tokens matching the target along with the kind of reference.
+  final Set<({Token token, DocumentHighlightKind kind})> tokens = {};
 
   /// Stack to track the current function for return/yield keywords.
   final List<AstNode> _functionStack = [];
@@ -159,7 +169,7 @@
   void visitAssignedVariablePattern(AssignedVariablePattern node) {
     var element = node.element;
     if (element != null) {
-      _addOccurrence(element, node.name);
+      _addOccurrence(element, node.name, .Write);
     }
 
     super.visitAssignedVariablePattern(node);
@@ -167,21 +177,25 @@
 
   @override
   void visitBreakStatement(BreakStatement node) {
-    _addNodeOccurrence(node.target, node.breakKeyword);
+    _addNodeOccurrence(node.target, node.breakKeyword, .Text);
 
     super.visitBreakStatement(node);
   }
 
   @override
   void visitCatchClauseParameter(CatchClauseParameter node) {
-    _addOccurrence(node.declaredFragment?.element, node.name);
+    _addOccurrence(node.declaredFragment?.element, node.name, .Write);
 
     super.visitCatchClauseParameter(node);
   }
 
   @override
   void visitClassDeclaration(ClassDeclaration node) {
-    _addOccurrence(node.declaredFragment?.element, node.namePart.typeName);
+    _addOccurrence(
+      node.declaredFragment?.element,
+      node.namePart.typeName,
+      .Write,
+    );
 
     super.visitClassDeclaration(node);
   }
@@ -194,6 +208,7 @@
           node.typeName?.beginToken ??
           node.newKeyword ??
           node.factoryKeyword,
+      .Write,
     );
 
     super.visitConstructorDeclaration(node);
@@ -206,7 +221,7 @@
     if (node.name == null) {
       var element = node.element;
       if (element != null) {
-        _addOccurrence(element, node.type.name);
+        _addOccurrence(element, node.type.name, .Read);
       }
       // Still visit the import prefix if there is one.
       node.type.importPrefix?.accept(this);
@@ -218,14 +233,14 @@
 
   @override
   void visitContinueStatement(ContinueStatement node) {
-    _addNodeOccurrence(node.target, node.continueKeyword);
+    _addNodeOccurrence(node.target, node.continueKeyword, .Text);
 
     super.visitContinueStatement(node);
   }
 
   @override
   void visitDeclaredIdentifier(DeclaredIdentifier node) {
-    _addOccurrence(node.declaredFragment?.element, node.name);
+    _addOccurrence(node.declaredFragment?.element, node.name, .Write);
 
     super.visitDeclaredIdentifier(node);
   }
@@ -233,42 +248,46 @@
   @override
   void visitDeclaredVariablePattern(DeclaredVariablePattern node) {
     var declaredElement = node.declaredFragment?.element;
-    _addOccurrence(declaredElement?.join ?? declaredElement, node.name);
+    _addOccurrence(declaredElement?.join ?? declaredElement, node.name, .Write);
 
     super.visitDeclaredVariablePattern(node);
   }
 
   @override
   void visitDoStatement(DoStatement node) {
-    _addNodeOccurrence(node, node.doKeyword);
+    _addNodeOccurrence(node, node.doKeyword, .Text);
 
     super.visitDoStatement(node);
   }
 
   @override
   void visitEnumConstantDeclaration(EnumConstantDeclaration node) {
-    _addOccurrence(node.declaredFragment?.element, node.name);
+    _addOccurrence(node.declaredFragment?.element, node.name, .Write);
 
     super.visitEnumConstantDeclaration(node);
   }
 
   @override
   void visitEnumDeclaration(EnumDeclaration node) {
-    _addOccurrence(node.declaredFragment?.element, node.namePart.typeName);
+    _addOccurrence(
+      node.declaredFragment?.element,
+      node.namePart.typeName,
+      .Write,
+    );
 
     super.visitEnumDeclaration(node);
   }
 
   @override
   void visitExtensionDeclaration(ExtensionDeclaration node) {
-    _addOccurrence(node.declaredFragment?.element, node.name);
+    _addOccurrence(node.declaredFragment?.element, node.name, .Write);
 
     super.visitExtensionDeclaration(node);
   }
 
   @override
   void visitExtensionOverride(ExtensionOverride node) {
-    _addOccurrence(node.element, node.name);
+    _addOccurrence(node.element, node.name, .Write);
 
     super.visitExtensionOverride(node);
   }
@@ -278,6 +297,7 @@
     _addOccurrence(
       node.declaredFragment?.element,
       node.primaryConstructor.typeName,
+      .Write,
     );
 
     super.visitExtensionTypeDeclaration(node);
@@ -285,14 +305,24 @@
 
   @override
   void visitFormalParameter(FormalParameter node) {
-    _addOccurrence(node.declaredFragment?.element, node.name);
+    var element = node.declaredFragment?.element;
+    if (element is FieldFormalParameterElement) {
+      // These tests have to be separate because of
+      // `DocumentHighlightsTest.test_field_unresolved`
+      if (element.field != null) {
+        _addOccurrence(element, node.name, .Write);
+        _addOccurrence(element.field, node.name, .Write);
+      }
+    } else {
+      _addOccurrence(element, node.name, .Write);
+    }
 
     super.visitFormalParameter(node);
   }
 
   @override
   void visitForStatement(ForStatement node) {
-    _addNodeOccurrence(node, node.forKeyword);
+    _addNodeOccurrence(node, node.forKeyword, .Text);
 
     super.visitForStatement(node);
   }
@@ -306,41 +336,41 @@
 
   @override
   void visitFunctionDeclaration(FunctionDeclaration node) {
-    _addOccurrence(node.declaredFragment?.element, node.name);
+    _addOccurrence(node.declaredFragment?.element, node.name, .Write);
 
     super.visitFunctionDeclaration(node);
   }
 
   @override
   void visitImportPrefixReference(ImportPrefixReference node) {
-    _addOccurrence(node.element, node.name);
+    _addOccurrence(node.element, node.name, .Read);
 
     super.visitImportPrefixReference(node);
   }
 
   @override
   void visitMethodDeclaration(MethodDeclaration node) {
-    _addOccurrence(node.declaredFragment?.element, node.name);
+    _addOccurrence(node.declaredFragment?.element, node.name, .Write);
 
     super.visitMethodDeclaration(node);
   }
 
   @override
   void visitMixinDeclaration(MixinDeclaration node) {
-    _addOccurrence(node.declaredFragment?.element, node.name);
+    _addOccurrence(node.declaredFragment?.element, node.name, .Write);
 
     super.visitMixinDeclaration(node);
   }
 
   @override
   void visitNamedArgument(NamedArgument node) {
-    _addOccurrence(node.correspondingParameter, node.name);
+    _addOccurrence(node.correspondingParameter, node.name, .Write);
     node.argumentExpression.accept(this);
   }
 
   @override
   void visitNamedType(NamedType node) {
-    _addOccurrence(node.element, node.name);
+    _addOccurrence(node.element, node.name, .Read);
 
     super.visitNamedType(node);
   }
@@ -354,7 +384,7 @@
     if (name == null && pattern is VariablePattern) {
       name = pattern.name;
     }
-    _addOccurrence(node.element, name);
+    _addOccurrence(node.element, name, .Write);
 
     super.visitPatternField(node);
   }
@@ -362,7 +392,7 @@
   @override
   void visitPrimaryConstructorName(PrimaryConstructorName node) {
     if (node.parent case PrimaryConstructorDeclaration primary) {
-      _addOccurrence(primary.declaredFragment?.element, node.name);
+      _addOccurrence(primary.declaredFragment?.element, node.name, .Write);
     }
 
     super.visitPrimaryConstructorName(node);
@@ -370,7 +400,7 @@
 
   @override
   void visitReturnStatement(ReturnStatement node) {
-    _addNodeOccurrence(_functionStack.lastOrNull, node.returnKeyword);
+    _addNodeOccurrence(_functionStack.lastOrNull, node.returnKeyword, .Text);
 
     super.visitReturnStatement(node);
   }
@@ -387,61 +417,73 @@
       return;
     }
 
-    _addOccurrence(node.writeOrReadElement, node.token);
+    _addOccurrence(
+      node.writeOrReadElement,
+      node.token,
+      node.writeElement != null ? .Write : .Read,
+    );
 
     return super.visitSimpleIdentifier(node);
   }
 
   @override
   void visitSwitchStatement(SwitchStatement node) {
-    _addNodeOccurrence(node, node.switchKeyword);
+    _addNodeOccurrence(node, node.switchKeyword, .Text);
 
     super.visitSwitchStatement(node);
   }
 
   @override
   void visitTypeAlias(TypeAlias node) {
-    _addOccurrence(node.declaredFragment?.element, node.name);
+    _addOccurrence(node.declaredFragment?.element, node.name, .Write);
 
     super.visitTypeAlias(node);
   }
 
   @override
   void visitTypeParameter(TypeParameter node) {
-    _addOccurrence(node.declaredFragment?.element, node.name);
+    _addOccurrence(node.declaredFragment?.element, node.name, .Write);
 
     super.visitTypeParameter(node);
   }
 
   @override
   void visitVariableDeclaration(VariableDeclaration node) {
-    _addOccurrence(node.declaredFragment?.element, node.name);
+    _addOccurrence(node.declaredFragment?.element, node.name, .Write);
 
     super.visitVariableDeclaration(node);
   }
 
   @override
   void visitWhileStatement(WhileStatement node) {
-    _addNodeOccurrence(node, node.whileKeyword);
+    _addNodeOccurrence(node, node.whileKeyword, .Text);
 
     super.visitWhileStatement(node);
   }
 
   @override
   void visitYieldStatement(YieldStatement node) {
-    _addNodeOccurrence(_functionStack.lastOrNull, node.yieldKeyword);
+    _addNodeOccurrence(_functionStack.lastOrNull, node.yieldKeyword, .Text);
 
     super.visitYieldStatement(node);
   }
 
-  void _addNodeOccurrence(AstNode? node, Token token) {
+  void _addNodeOccurrence(
+    AstNode? node,
+    Token token,
+    DocumentHighlightKind kind,
+  ) {
     // Only add the occurrence if it matches our target node.
     if (node != null && _target.matchesNode(node)) {
-      tokens.add(token);
+      tokens.add((token: token, kind: kind));
     }
   }
 
-  void _addOccurrence(Element? element, Token? token) {
+  void _addOccurrence(
+    Element? element,
+    Token? token,
+    DocumentHighlightKind kind,
+  ) {
     if (element == null || token == null) return;
 
     var canonicalElement = element.canonical;
@@ -462,7 +504,7 @@
     // Only add the occurrence if it's one of our target elements.
     if (_target.matchesElement(canonicalElement) ||
         supertypeMembers.any(_target.matchesElement)) {
-      tokens.add(token);
+      tokens.add((token: token, kind: kind));
     }
   }
 }
@@ -473,23 +515,26 @@
 /// cases (such as a variable pattern) there may be multiple target elements
 /// (such as a variable and the matched getter).
 class _HighlightTargets {
-  final String? _elementName;
   final Set<Element> _targetElements;
+  final Set<String> _targetElementNames;
   final AstNode? _targetNode;
 
-  _HighlightTargets.elements(this._elementName, this._targetElements)
-    : _targetNode = null;
+  _HighlightTargets.elements(this._targetElements)
+    : _targetNode = null,
+      _targetElementNames = {
+        for (var element in _targetElements) ?element.name,
+      };
 
   _HighlightTargets.node(this._targetNode)
-    : _elementName = null,
-      _targetElements = const {};
+    : _targetElements = const {},
+      _targetElementNames = const {};
 
   bool matchesElement(Element element) {
     return _targetElements.contains(element);
   }
 
   bool matchesElementName(Element canonicalElement) {
-    return canonicalElement.name == _elementName;
+    return _targetElementNames.contains(canonicalElement.name);
   }
 
   bool matchesNode(AstNode node) {
@@ -498,18 +543,6 @@
 }
 
 extension on Element {
-  /// Canonicalizes an element so that field formal parameters map to their
-  /// fields and property accessors map to their variables.
-  Element? get canonical {
-    return switch (this) {
-      FieldFormalParameterElement(:var field) => field?.baseElement,
-      PropertyAccessorElement(:var variable)
-          when variable.isOriginDeclaration =>
-        variable.baseElement,
-      _ => baseElement,
-    };
-  }
-
   /// All members in superclasses that this element overrides.
   Iterable<Element> get supertypeMembers {
     var enclosing = enclosingElement;
diff --git a/pkg/analysis_server/lib/src/computer/computer_lazy_type_hierarchy.dart b/pkg/analysis_server/lib/src/computer/computer_lazy_type_hierarchy.dart
index 3366177..8783761 100644
--- a/pkg/analysis_server/lib/src/computer/computer_lazy_type_hierarchy.dart
+++ b/pkg/analysis_server/lib/src/computer/computer_lazy_type_hierarchy.dart
@@ -117,10 +117,7 @@
       }
     }
 
-    var matches = await searchEngine.searchSubtypes(
-      target,
-      SearchEngineCache(),
-    );
+    var matches = await searchEngine.searchSubtypes(target);
     var seenElements = <Element>{};
     return matches
         .where((match) => seenElements.add(match.element))
diff --git a/pkg/analysis_server/lib/src/diagnostic.dart b/pkg/analysis_server/lib/src/diagnostic.dart
index c72add3..04a6790 100644
--- a/pkg/analysis_server/lib/src/diagnostic.dart
+++ b/pkg/analysis_server/lib/src/diagnostic.dart
@@ -3,6 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:_fe_analyzer_shared/src/base/errors.dart';
+import 'package:analyzer/src/diagnostic/diagnostic.dart';
 
 import 'diagnostic.dart' as diag;
 
diff --git a/pkg/analysis_server/lib/src/domains/analysis/occurrences_dart.dart b/pkg/analysis_server/lib/src/domains/analysis/occurrences_dart.dart
index 76b9af5..cb8c587 100644
--- a/pkg/analysis_server/lib/src/domains/analysis/occurrences_dart.dart
+++ b/pkg/analysis_server/lib/src/domains/analysis/occurrences_dart.dart
@@ -4,6 +4,7 @@
 
 import 'package:analysis_server/plugin/analysis/occurrences/occurrences_core.dart';
 import 'package:analysis_server/src/protocol_server.dart' as protocol;
+import 'package:analysis_server/src/utilities/extensions/element.dart';
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/ast/token.dart';
 import 'package:analyzer/dart/ast/visitor.dart';
@@ -262,7 +263,15 @@
   void visitRegularFormalParameter(RegularFormalParameter node) {
     var nameToken = node.name;
     if (nameToken != null) {
-      _addOccurrence(node.declaredFragment!.element, nameToken);
+      var element = node.declaredFragment?.element;
+      if (element is FieldFormalParameterElement) {
+        var field = element.field;
+        if (field != null) {
+          _addOccurrence(field, nameToken);
+        }
+      } else if (element != null) {
+        _addOccurrence(element, nameToken);
+      }
     }
 
     super.visitRegularFormalParameter(node);
@@ -309,22 +318,10 @@
   }
 
   void _addOccurrence(Element element, Token token) {
-    var canonicalElement = _canonicalizeElement(element);
+    var canonicalElement = element.canonical;
     if (canonicalElement == null) {
       return;
     }
     (occurrences[canonicalElement] ??= []).add(token);
   }
-
-  Element? _canonicalizeElement(Element element) {
-    Element? canonicalElement = element;
-    if (canonicalElement is FieldFormalParameterElement) {
-      canonicalElement = canonicalElement.field;
-    } else if (canonicalElement case PropertyAccessorElement(
-      :var variable,
-    ) when variable.isOriginDeclaration) {
-      canonicalElement = variable;
-    }
-    return canonicalElement?.baseElement;
-  }
 }
diff --git a/pkg/analysis_server/lib/src/lsp/channel/lsp_byte_stream_channel.dart b/pkg/analysis_server/lib/src/lsp/channel/lsp_byte_stream_channel.dart
index 918bc33..c525015 100644
--- a/pkg/analysis_server/lib/src/lsp/channel/lsp_byte_stream_channel.dart
+++ b/pkg/analysis_server/lib/src/lsp/channel/lsp_byte_stream_channel.dart
@@ -25,7 +25,7 @@
   final InstrumentationService _instrumentationService;
 
   /// The session logger.
-  final SessionLogger _sessionLogger;
+  final SessionLogger? _sessionLogger;
 
   /// Completer that will be signalled when the input stream is closed.
   final Completer<void> _closed = Completer();
@@ -37,8 +37,8 @@
     this._input,
     this._output,
     this._instrumentationService, {
-    SessionLogger? sessionLogger,
-  }) : _sessionLogger = sessionLogger ?? SessionLogger();
+    this._sessionLogger,
+  });
 
   /// Future that will be completed when the input stream is closed.
   @override
@@ -94,7 +94,7 @@
     }
     _instrumentationService.logRequest(data);
     var json = jsonDecode(data) as Map<String, Object?>;
-    _sessionLogger.logMessage(
+    _sessionLogger?.logMessage(
       from: ProcessId.ide,
       to: ProcessId.server,
       message: json,
@@ -129,7 +129,7 @@
     _write(utf8EncodedBody);
 
     _instrumentationService.logResponse(jsonEncodedBody);
-    _sessionLogger.logMessage(
+    _sessionLogger?.logMessage(
       from: ProcessId.server,
       to: ProcessId.ide,
       message: json,
diff --git a/pkg/analysis_server/lib/src/lsp/handlers/custom/handler_migrate.dart b/pkg/analysis_server/lib/src/lsp/handlers/custom/handler_migrate.dart
index 05b6f20..64ba654 100644
--- a/pkg/analysis_server/lib/src/lsp/handlers/custom/handler_migrate.dart
+++ b/pkg/analysis_server/lib/src/lsp/handlers/custom/handler_migrate.dart
@@ -98,7 +98,10 @@
           );
         }
       } catch (e) {
-        return error(ErrorCodes.InvalidParams, "Failed to parse '$path': $e");
+        return error(
+          ErrorCodes.InvalidParams,
+          "Failed to parse 'pubspec.yaml' at '$path': $e",
+        );
       }
     }
     return success(null);
diff --git a/pkg/analysis_server/lib/src/lsp/handlers/handler_document_highlights.dart b/pkg/analysis_server/lib/src/lsp/handlers/handler_document_highlights.dart
index d4cd7bb..bce41be 100644
--- a/pkg/analysis_server/lib/src/lsp/handlers/handler_document_highlights.dart
+++ b/pkg/analysis_server/lib/src/lsp/handlers/handler_document_highlights.dart
@@ -51,8 +51,13 @@
       // the editor falling back to a text search.
       var highlights = matchingTokens
           .map(
-            (token) => DocumentHighlight(
-              range: toRange(unit.lineInfo, token.offset, token.length),
+            (item) => DocumentHighlight(
+              range: toRange(
+                unit.lineInfo,
+                item.token.offset,
+                item.token.length,
+              ),
+              kind: item.kind,
             ),
           )
           .toList();
diff --git a/pkg/analysis_server/lib/src/search/type_hierarchy.dart b/pkg/analysis_server/lib/src/search/type_hierarchy.dart
index 3b91fd3..b382dab 100644
--- a/pkg/analysis_server/lib/src/search/type_hierarchy.dart
+++ b/pkg/analysis_server/lib/src/search/type_hierarchy.dart
@@ -29,8 +29,7 @@
     var pivotClass = helper.pivotClass;
     if (pivotClass != null) {
       _createSuperItem(pivotClass, null);
-      var searchEngineCache = SearchEngineCache();
-      await _createSubclasses(_items[0], 0, pivotClass, searchEngineCache);
+      await _createSubclasses(_items[0], 0, pivotClass);
       return _items;
     }
     return null;
@@ -50,13 +49,8 @@
     TypeHierarchyItem item,
     int itemId,
     InterfaceElement classElement,
-    SearchEngineCache searchEngineCache,
   ) async {
-    var subElements = await getDirectSubClasses(
-      _searchEngine,
-      classElement,
-      searchEngineCache,
-    );
+    var subElements = await getDirectSubClasses(_searchEngine, classElement);
     var subItemIds = <int>[];
     for (var subElement in subElements) {
       // check for recursion
@@ -89,12 +83,7 @@
     for (var subItemId in subItemIds) {
       var subItem = _items[subItemId];
       var subItemElement = _itemClassElements[subItemId];
-      await _createSubclasses(
-        subItem,
-        subItemId,
-        subItemElement,
-        searchEngineCache,
-      );
+      await _createSubclasses(subItem, subItemId, subItemElement);
     }
   }
 
diff --git a/pkg/analysis_server/lib/src/server/driver.dart b/pkg/analysis_server/lib/src/server/driver.dart
index 397e2f2..2eab66f 100644
--- a/pkg/analysis_server/lib/src/server/driver.dart
+++ b/pkg/analysis_server/lib/src/server/driver.dart
@@ -343,13 +343,10 @@
 
     // Initialize the session logging service.
     var sessionLogFilePath = results.option(sessionLogOption);
-    var sessionLogFile = sessionLogFilePath == null
-        ? null
-        : PhysicalResourceProvider.INSTANCE.getFile(sessionLogFilePath);
-    _sessionLogger = SessionLogger(sessionLogFile: sessionLogFile);
-    _sessionLogger.normalizer.addPathReplacement(
+    _sessionLogger = SessionLogger(filePath: sessionLogFilePath);
+    _sessionLogger.normalizer.addReplacementsForPath(
       defaultSdkPath,
-      '{{dartSdkRoot}}',
+      'dartSdkRoot',
     );
     _sessionLogger.logCommandLine(arguments: arguments);
 
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/add_type_annotation.dart b/pkg/analysis_server/lib/src/services/correction/dart/add_type_annotation.dart
index b7ab34f..71e4046 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/add_type_annotation.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/add_type_annotation.dart
@@ -196,13 +196,10 @@
       return;
     }
 
-    int offset;
-    switch (node) {
-      case ListLiteral():
-        offset = node.leftBracket.offset;
-      case SetOrMapLiteral():
-        offset = node.leftBracket.offset;
-    }
+    var offset = switch (node) {
+      ListLiteral() => node.leftBracket.offset,
+      SetOrMapLiteral() => node.leftBracket.offset,
+    };
 
     await builder.addDartFileEdit(file, (builder) {
       builder.addInsertion(offset, (builder) {
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/convert_default_to_primary_constructor.dart b/pkg/analysis_server/lib/src/services/correction/dart/convert_default_to_primary_constructor.dart
new file mode 100644
index 0000000..a013a38
--- /dev/null
+++ b/pkg/analysis_server/lib/src/services/correction/dart/convert_default_to_primary_constructor.dart
@@ -0,0 +1,46 @@
+// Copyright (c) 2026, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analysis_server/src/services/correction/fix.dart';
+import 'package:analysis_server_plugin/edit/dart/correction_producer.dart';
+import 'package:analyzer/dart/analysis/features.dart';
+import 'package:analyzer/dart/ast/ast.dart';
+import 'package:analyzer/src/dart/ast/ast.dart';
+import 'package:analyzer_plugin/utilities/change_builder/change_builder_core.dart';
+import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
+
+class ConvertDefaultToPrimaryConstructor extends ResolvedCorrectionProducer {
+  ConvertDefaultToPrimaryConstructor({required super.context});
+
+  @override
+  CorrectionApplicability get applicability =>
+      CorrectionApplicability.automatically;
+
+  @override
+  FixKind? get fixKind => DartFixKind.convertDefaultToPrimaryConstructor;
+
+  @override
+  FixKind? get multiFixKind =>
+      DartFixKind.convertDefaultToPrimaryConstructorMulti;
+
+  @override
+  Future<void> compute(ChangeBuilder builder) async {
+    if (!isEnabled(Feature.primary_constructors)) return;
+    if (node case ClassNamePart namePart) {
+      var container = namePart.parent;
+      var members = switch (container) {
+        ClassDeclaration() => container.body.members,
+        EnumDeclaration() => container.body.members,
+        _ => null,
+      };
+      if (members == null) return;
+      if (namePart is! PrimaryConstructorDeclaration &&
+          (!members.any((e) => e is ConstructorDeclaration))) {
+        await builder.addDartFileEdit(file, (builder) {
+          builder.addSimpleInsertion(namePart.typeName.end, '()');
+        });
+      }
+    }
+  }
+}
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/convert_to_declaring_parameter.dart b/pkg/analysis_server/lib/src/services/correction/dart/convert_to_declaring_parameter.dart
index 77ac9af..f6645ca 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/convert_to_declaring_parameter.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/convert_to_declaring_parameter.dart
@@ -3,6 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:analysis_server/src/services/correction/assist.dart';
+import 'package:analysis_server/src/services/correction/fix.dart';
 import 'package:analysis_server_plugin/edit/dart/correction_producer.dart';
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/ast/visitor.dart';
@@ -10,6 +11,7 @@
 import 'package:analyzer/source/source_range.dart';
 import 'package:analyzer_plugin/utilities/assist/assist.dart';
 import 'package:analyzer_plugin/utilities/change_builder/change_builder_core.dart';
+import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
 import 'package:analyzer_plugin/utilities/range_factory.dart';
 
 typedef _RefactorData = ({
@@ -23,13 +25,18 @@
 
   @override
   CorrectionApplicability get applicability =>
-      // Not a fix.
-      CorrectionApplicability.singleLocation;
+      CorrectionApplicability.automatically;
 
   @override
   AssistKind? get assistKind => DartAssistKind.convertToDeclaringParameter;
 
   @override
+  FixKind? get fixKind => DartFixKind.convertToDeclaringParameter;
+
+  @override
+  FixKind? get multiFixKind => DartFixKind.convertToDeclaringParameterMulti;
+
+  @override
   Future<void> compute(ChangeBuilder builder) async {
     var parameter = node;
     if (parameter is! FormalParameter) {
@@ -99,7 +106,8 @@
         }
       }
 
-      // Insert the keyword (and renaming if needed).
+      // Insert the keyword, and a type if the parameter didn't already have a
+      // type.
       var insertedVariable = false;
       if (parameter is FieldFormalParameter) {
         if (parameter.offset == parameter.thisKeyword.offset) {
@@ -131,6 +139,7 @@
           );
         }
       }
+      // Rename the parameter if it's different than the name of the field.
       if (fieldName != parameterName.lexeme) {
         builder.addSimpleReplacement(range.token(parameterName), fieldName);
       }
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/convert_to_primary_constructor.dart b/pkg/analysis_server/lib/src/services/correction/dart/convert_to_primary_constructor.dart
index cb02a59..30dda5a 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/convert_to_primary_constructor.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/convert_to_primary_constructor.dart
@@ -3,6 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:analysis_server/src/services/correction/assist.dart';
+import 'package:analysis_server/src/services/correction/fix.dart';
 import 'package:analysis_server_plugin/edit/dart/correction_producer.dart';
 import 'package:analyzer/dart/analysis/features.dart';
 import 'package:analyzer/dart/ast/ast.dart';
@@ -11,6 +12,7 @@
 import 'package:analyzer/src/utilities/extensions/ast.dart';
 import 'package:analyzer_plugin/utilities/assist/assist.dart';
 import 'package:analyzer_plugin/utilities/change_builder/change_builder_core.dart';
+import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
 import 'package:analyzer_plugin/utilities/range_factory.dart';
 
 class ConvertToPrimaryConstructor extends ResolvedCorrectionProducer {
@@ -18,14 +20,24 @@
 
   @override
   CorrectionApplicability get applicability =>
-      // Not a fix.
-      CorrectionApplicability.singleLocation;
+      CorrectionApplicability.automatically;
 
   @override
   AssistKind? get assistKind => DartAssistKind.convertToPrimaryConstructor;
 
+  /// This is only a fix in order to support the lint usePrimaryConstructors.
+  /// If that lint is removed after testing the primary constructors feature,
+  /// then this producer can be changed back to only producing an assist.
+  @override
+  FixKind get fixKind => DartFixKind.convertToPrimaryConstructor;
+
+  @override
+  FixKind get multiFixKind => DartFixKind.convertToPrimaryConstructorMulti;
+
   /// The constructor being converted to a primary constructor.
   ConstructorDeclaration? get _constructorToConvert {
+    var node = this.node;
+    if (node is ConstructorDeclaration) return node;
     if (node is! SimpleIdentifier) return null;
     var parent = node.parent;
     if (parent is ConstructorDeclaration && parent.typeName == node) {
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/remove_empty_container_body.dart b/pkg/analysis_server/lib/src/services/correction/dart/remove_empty_container_body.dart
new file mode 100644
index 0000000..0f9f5c3
--- /dev/null
+++ b/pkg/analysis_server/lib/src/services/correction/dart/remove_empty_container_body.dart
@@ -0,0 +1,48 @@
+// Copyright (c) 2026, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analysis_server/src/services/correction/fix.dart';
+import 'package:analysis_server_plugin/edit/dart/correction_producer.dart';
+import 'package:analyzer/dart/ast/ast.dart';
+import 'package:analyzer_plugin/utilities/change_builder/change_builder_core.dart';
+import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
+import 'package:analyzer_plugin/utilities/range_factory.dart';
+
+class RemoveEmptyContainerBody extends ResolvedCorrectionProducer {
+  late String containerKind;
+
+  RemoveEmptyContainerBody({required super.context});
+
+  @override
+  CorrectionApplicability get applicability =>
+      CorrectionApplicability.automatically;
+
+  @override
+  List<String>? get fixArguments => [containerKind];
+
+  @override
+  FixKind get fixKind => DartFixKind.removeEmptyContainerBody;
+
+  @override
+  FixKind get multiFixKind => DartFixKind.removeEmptyContainerBodyMulti;
+
+  @override
+  Future<void> compute(ChangeBuilder builder) async {
+    var node = this.node;
+    containerKind = switch (node.parent) {
+      ClassDeclaration() => 'class',
+      MixinDeclaration() => 'mixin',
+      ExtensionDeclaration() => 'extension',
+      ExtensionTypeDeclaration() => 'extension type',
+      // This should never happen.
+      _ => 'container',
+    };
+
+    await builder.addDartFileEdit(file, (builder) {
+      var start = node.beginToken.previous?.end ?? node.offset;
+      var end = node.end;
+      builder.addSimpleReplacement(range.startOffsetEndOffset(start, end), ';');
+    });
+  }
+}
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/sort_child_property_last.dart b/pkg/analysis_server/lib/src/services/correction/dart/sort_child_property_last.dart
index e39ba56..47be241 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/sort_child_property_last.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/sort_child_property_last.dart
@@ -32,12 +32,12 @@
 
   @override
   Future<void> compute(ChangeBuilder builder) async {
-    var childProp = _findNamedArgument(node);
-    if (childProp == null) {
+    var childProperty = _findNamedArgument(node);
+    if (childProperty == null) {
       return;
     }
 
-    var creationExpression = childProp.parent?.parent;
+    var creationExpression = childProperty.parent?.parent;
     if (creationExpression is! InstanceCreationExpression ||
         !creationExpression.isWidgetCreation) {
       return;
@@ -46,7 +46,7 @@
     var args = creationExpression.argumentList;
 
     var last = args.arguments.last;
-    if (last == childProp) {
+    if (last == childProperty) {
       // Already sorted.
       return;
     }
@@ -54,19 +54,47 @@
     await builder.addDartFileEdit(file, (fileEditBuilder) {
       var hasTrailingComma = last.endToken.next!.type == TokenType.COMMA;
 
-      var childStart = childProp.beginToken.previous!.end;
-      var childEnd = childProp.endToken.next!.end;
+      var childStart = childProperty.beginToken.previous!.end;
+      var childEnd = childProperty.endToken.next!.end;
+
+      // There is definitely a next argument since `last != childProperty`.
+      var nextArgument = args.arguments[1];
+      var childLine = unitResult.lineInfo.getLocation(childEnd);
+      var nextLine = unitResult.lineInfo.getLocation(nextArgument.offset);
+      var argsAreOnSameLine = childLine.lineNumber == nextLine.lineNumber;
+      if (!argsAreOnSameLine) {
+        // A comment which comes after the child's trailing comma is technically
+        // not associated with the child, but is clearly meant to be associated
+        // with it. Move it as well.
+        Token? precedingComment = nextArgument.beginToken.precedingComments;
+        while (precedingComment is CommentToken) {
+          var precedingCommentLine = unitResult.lineInfo.getLocation(
+            precedingComment.offset,
+          );
+          if (precedingCommentLine.lineNumber == childLine.lineNumber) {
+            childEnd = precedingComment.end;
+          } else {
+            break;
+          }
+          precedingComment = precedingComment.next;
+        }
+      }
+
+      // The range of the child/children argument which is used for the inserted
+      // text after the last argument. (This might be different from the text
+      // which is deleted, insofar as leading/trailing whitespace is accounted
+      // for.)
       var childRange = range.startOffsetEndOffset(childStart, childEnd);
 
       var deletionRange = childRange;
-      if (childProp == args.arguments.first) {
-        var deletionStart = childProp.offset;
-        var deletionEnd = args.arguments[1].offset;
+      if (childProperty == args.arguments.first) {
+        var deletionStart = childProperty.offset;
+        var deletionEnd = nextArgument.offset;
         deletionRange = range.startOffsetEndOffset(deletionStart, deletionEnd);
       }
 
       if (!hasTrailingComma) {
-        childEnd = childProp.end;
+        childEnd = childProperty.end;
         childRange = range.startOffsetEndOffset(childStart, childEnd);
       }
       var childText = utils.getRangeText(childRange);
@@ -74,7 +102,7 @@
       var insertionPoint = last.end;
       if (hasTrailingComma) {
         insertionPoint = last.endToken.next!.end;
-      } else if (childStart == childProp.offset) {
+      } else if (childStart == childProperty.offset) {
         childText = ', $childText';
       } else {
         childText = ',$childText';
diff --git a/pkg/analysis_server/lib/src/services/correction/error_fix_status.yaml b/pkg/analysis_server/lib/src/services/correction/error_fix_status.yaml
index 33f57c8..f8c27cb 100644
--- a/pkg/analysis_server/lib/src/services/correction/error_fix_status.yaml
+++ b/pkg/analysis_server/lib/src/services/correction/error_fix_status.yaml
@@ -243,6 +243,8 @@
   status: noFix
 augmentation_of_mixin_application_class:
   status: needsEvaluation
+augmentation_return_type_mismatch:
+  status: needsEvaluation
 augmentation_type_parameter_bound:
   status: noFix
 augmentation_type_parameter_count:
@@ -1690,6 +1692,8 @@
   status: hasFix
 use_of_void_result:
   status: noFix
+use_primary_constructors:
+  status: hasFix
 values_declaration_in_enum:
   status: noFix
   since: 2.17
@@ -2126,6 +2130,8 @@
   status: hasFix
 empty_constructor_bodies:
   status: hasFix
+empty_container_bodies:
+  status: hasFix
 empty_statements:
   status: hasFix
 eol_at_end_of_file:
@@ -2152,6 +2158,8 @@
   status: hasFix
 implicit_reopen:
   status: hasFix
+initialize_in_field_declaration:
+  status: needsFix
 invalid_case_patterns:
   status: hasFix
 invalid_runtime_check_with_js_interop_types_catch_clause_js_interop_type:
@@ -2557,6 +2565,8 @@
     to a mounted check on the right element.
 use_colored_box:
   status: hasFix
+use_declaring_parameters:
+  status: hasFix
 use_decorated_box:
   status: hasFix
 use_enums:
diff --git a/pkg/analysis_server/lib/src/services/correction/fix.dart b/pkg/analysis_server/lib/src/services/correction/fix.dart
index 73fc148..c318119 100644
--- a/pkg/analysis_server/lib/src/services/correction/fix.dart
+++ b/pkg/analysis_server/lib/src/services/correction/fix.dart
@@ -383,6 +383,16 @@
     DartFixKindPriority.standard,
     'Convert classes to enums in file',
   );
+  static const convertDefaultToPrimaryConstructor = FixKind(
+    'dart.fix.convert.defaultToPrimaryConstructor',
+    DartFixKindPriority.standard,
+    'Convert the default constructor to a primary constructor',
+  );
+  static const convertDefaultToPrimaryConstructorMulti = FixKind(
+    'dart.fix.convert.defaultToPrimaryConstructor.multi',
+    DartFixKindPriority.standard,
+    'Convert default constructor to primary constructor everywhere in file',
+  );
   static const convertFlutterChild = FixKind(
     'dart.fix.flutter.convert.childToChildren',
     DartFixKindPriority.standard,
@@ -483,6 +493,16 @@
     DartFixKindPriority.inFile,
     "Convert to using 'contains' everywhere in file",
   );
+  static const convertToDeclaringParameter = FixKind(
+    'dart.fix.convert.toDeclaringParameter',
+    DartFixKindPriority.standard,
+    'Convert to a declaring parameter',
+  );
+  static const convertToDeclaringParameterMulti = FixKind(
+    'dart.fix.convert.toDeclaringParameter.multi',
+    DartFixKindPriority.standard,
+    'Convert to declaring parameters everywhere in file',
+  );
   static const convertToDoubleQuotedString = FixKind(
     'dart.fix.convert.toDoubleQuotedString',
     DartFixKindPriority.standard,
@@ -668,6 +688,16 @@
     DartFixKindPriority.inFile,
     "Convert to 'package:' imports everywhere in file",
   );
+  static const convertToPrimaryConstructor = FixKind(
+    'dart.fix.convert.toPrimaryConstructor',
+    DartFixKindPriority.standard,
+    'Convert to a primary constructor',
+  );
+  static const convertToPrimaryConstructorMulti = FixKind(
+    'dart.fix.convert.toPrimaryConstructor.multi',
+    DartFixKindPriority.standard,
+    'Convert to primary constructors everywhere in file',
+  );
   static const convertToRawString = FixKind(
     'dart.fix.convert.toRawString',
     DartFixKindPriority.standard,
@@ -1396,6 +1426,16 @@
     DartFixKindPriority.inFile,
     'Remove empty constructor bodies in file',
   );
+  static const removeEmptyContainerBody = FixKind(
+    'dart.fix.remove.emptyContainerBody',
+    DartFixKindPriority.standard,
+    'Remove empty {0} body',
+  );
+  static const removeEmptyContainerBodyMulti = FixKind(
+    'dart.fix.remove.emptyContainerBody.multi',
+    DartFixKindPriority.inFile,
+    'Remove empty class and enum bodies in file',
+  );
   static const removeEmptyElse = FixKind(
     'dart.fix.remove.emptyElse',
     DartFixKindPriority.standard,
diff --git a/pkg/analysis_server/lib/src/services/correction/fix/data_driven/code_template.dart b/pkg/analysis_server/lib/src/services/correction/fix/data_driven/code_template.dart
index a809126..af8a15d 100644
--- a/pkg/analysis_server/lib/src/services/correction/fix/data_driven/code_template.dart
+++ b/pkg/analysis_server/lib/src/services/correction/fix/data_driven/code_template.dart
@@ -80,7 +80,8 @@
 
   /// Return the invocation containing the given [node]. The invocation will be
   /// either an instance creation expression, function invocation, method
-  /// invocation, or an extension override.
+  /// invocation, or an extension override. For string literals in an import
+  /// directive, the invocation is the import directive.
   static AstNode? _getInvocation(AstNode node) {
     if (node is ArgumentList) {
       return node.parent;
@@ -97,6 +98,11 @@
           return grandparent;
         }
       }
+    } else if (node is SimpleStringLiteral) {
+      var parent = node.parent;
+      if (parent is ImportDirective) {
+        return parent;
+      }
     } else if (node is SimpleIdentifier) {
       var parent = node.parent;
       if (parent is ConstructorName) {
diff --git a/pkg/analysis_server/lib/src/services/correction/fix/data_driven/element_descriptor.dart b/pkg/analysis_server/lib/src/services/correction/fix/data_driven/element_descriptor.dart
index cf216b6..3190981 100644
--- a/pkg/analysis_server/lib/src/services/correction/fix/data_driven/element_descriptor.dart
+++ b/pkg/analysis_server/lib/src/services/correction/fix/data_driven/element_descriptor.dart
@@ -64,6 +64,7 @@
       ElementKind.getterKind =>
         // TODO(brianwilkerson): Handle this case.
         false,
+      ElementKind.libraryKind => _matchesType(node),
       ElementKind.methodKind => _matchesMethod(node),
       ElementKind.mixinKind => _matchesType(node),
       ElementKind.setterKind =>
@@ -170,6 +171,9 @@
       var typeName = _nameFromIdentifier(node);
       return name == typeName;
     }
+    if (node is LibraryImport) {
+      return name == (node as LibraryImport).importedLibrary?.name;
+    }
     if (node is NamedType) {
       return name == node.name.lexeme;
     }
diff --git a/pkg/analysis_server/lib/src/services/correction/fix/data_driven/element_kind.dart b/pkg/analysis_server/lib/src/services/correction/fix/data_driven/element_kind.dart
index 4511470..2e7c151 100644
--- a/pkg/analysis_server/lib/src/services/correction/fix/data_driven/element_kind.dart
+++ b/pkg/analysis_server/lib/src/services/correction/fix/data_driven/element_kind.dart
@@ -13,6 +13,7 @@
   fieldKind('field'),
   functionKind('function'),
   getterKind('getter'),
+  libraryKind('library'),
   methodKind('method'),
   mixinKind('mixin'),
   setterKind('setter'),
diff --git a/pkg/analysis_server/lib/src/services/correction/fix/data_driven/element_matcher.dart b/pkg/analysis_server/lib/src/services/correction/fix/data_driven/element_matcher.dart
index 52ee1af..d6f64a6 100644
--- a/pkg/analysis_server/lib/src/services/correction/fix/data_driven/element_matcher.dart
+++ b/pkg/analysis_server/lib/src/services/correction/fix/data_driven/element_matcher.dart
@@ -125,9 +125,11 @@
     if (validKinds.isNotEmpty && !validKinds.contains(element.kind)) {
       return false;
     }
-    //
+    // If this is a library element, then there are no imported URIs to check.
+    if (element.kind == ElementKind.libraryKind) {
+      return true;
+    }
     // Check whether the element is in an imported library.
-    //
     var libraryUris = element.libraryUris;
     for (var importedUri in importedUris) {
       if (libraryUris.contains(importedUri)) {
@@ -217,6 +219,13 @@
       if (parent is ArgumentList) {
         _buildFromArgumentList(parent);
       }
+      if (parent is ImportDirective && node is SimpleStringLiteral) {
+        _addMatcher(
+          components: [node.value],
+          kinds: [ElementKind.libraryKind],
+          node: parent,
+        );
+      }
     } else if (node is NamedArgument) {
       _buildFromArgumentList(node.parent as ArgumentList);
     } else if (node is NamedType) {
diff --git a/pkg/analysis_server/lib/src/services/correction/fix/data_driven/replaced_by.dart b/pkg/analysis_server/lib/src/services/correction/fix/data_driven/replaced_by.dart
index d724053..77e273d 100644
--- a/pkg/analysis_server/lib/src/services/correction/fix/data_driven/replaced_by.dart
+++ b/pkg/analysis_server/lib/src/services/correction/fix/data_driven/replaced_by.dart
@@ -178,7 +178,9 @@
     var elements = fix.element.components;
     if (elements.isEmpty) return null;
     var simpleName = elements[0];
-    if (node is SimpleIdentifier) {
+    if (node is SimpleStringLiteral && node.stringValue == simpleName) {
+      return range.startOffsetEndOffset(node.contentsOffset, node.contentsEnd);
+    } else if (node is SimpleIdentifier) {
       if (node.name != (simpleName.isNotEmpty ? simpleName : elements[1])) {
         return null;
       }
diff --git a/pkg/analysis_server/lib/src/services/correction/fix/data_driven/transform_set_parser.dart b/pkg/analysis_server/lib/src/services/correction/fix/data_driven/transform_set_parser.dart
index dae192f..a987a49 100644
--- a/pkg/analysis_server/lib/src/services/correction/fix/data_driven/transform_set_parser.dart
+++ b/pkg/analysis_server/lib/src/services/correction/fix/data_driven/transform_set_parser.dart
@@ -70,10 +70,12 @@
   static const String _indexKey = 'index';
   static const String _inMixinKey = 'inMixin';
   static const String _kindKey = 'kind';
+  static const String _libraryKey = 'library';
   static const String _methodKey = 'method';
   static const String _mixinKey = 'mixin';
   static const String _nameKey = 'name';
   static const String _newElementKey = 'newElement';
+  static const String _newLibraryKey = 'newLibrary';
   static const String _newNameKey = 'newName';
   static const String _nullabilityKey = 'nullability';
   static const String _oldNameKey = 'oldName';
@@ -979,6 +981,72 @@
     }
   }
 
+  /// Translate the [node] into an element transform. Return the resulting
+  /// transform, or `null` if the [node] does not represent a valid element
+  /// transform. If the [node] is not valid, use the [context] to
+  /// report the error.
+  Transform? _translateElementTransform(
+    YamlMap node,
+    ErrorContext context,
+    String title,
+    DateTime date,
+    bool bulkApply,
+  ) {
+    var element = _translateElement(
+      node.valueAt(_elementKey),
+      ErrorContext(key: _elementKey, parentNode: node),
+    );
+    elementBeingTransformed = element;
+    transformVariableScope = _translateTemplateVariables(
+      node.valueAt(_variablesKey),
+      ErrorContext(key: _variablesKey, parentNode: node),
+    );
+    var selector = _singleKey(
+      map: node,
+      errorNode: context.parentNode,
+      translators: {
+        const {_changesKey}: (key, value) {
+          var changes = _translateList(
+            value,
+            ErrorContext(key: _changesKey, parentNode: node),
+            _translateChange,
+          );
+          if (changes == null) {
+            // The error has already been reported.
+            _parameterModifications = null;
+            return null;
+          }
+          var parameterModifications = _parameterModifications;
+          if (parameterModifications != null) {
+            changes.add(
+              ModifyParameters(modifications: parameterModifications),
+            );
+            _parameterModifications = null;
+          }
+          return UnconditionalChangesSelector(changes);
+        },
+        const {_oneOfKey}: (key, value) {
+          return _translateConditionalChanges(
+            value,
+            ErrorContext(key: _oneOfKey, parentNode: node),
+          );
+        },
+      },
+    );
+    transformVariableScope = VariableScope.empty;
+    if (element == null || selector == null) {
+      // The error has already been reported.
+      return null;
+    }
+    return Transform(
+      title: title,
+      date: date,
+      bulkApply: bulkApply,
+      element: element,
+      changesSelector: selector,
+    );
+  }
+
   /// Translate the [node] into a value generator. Return the resulting
   /// generator, or `null` if the [node] does not represent a valid value
   /// extractor.
@@ -1043,6 +1111,87 @@
     return null;
   }
 
+  /// Translate the [node] into a [ElementDescriptor]. Return the resulting
+  /// descriptor, or `null` if the [node] does not represent a valid
+  /// descriptor. If the [node] is not valid, use the [context] to
+  /// report the error.
+  ElementDescriptor? _translateLibrary(YamlNode? node, ErrorContext context) {
+    if (node is YamlScalar) {
+      var value = node.value;
+      if (value is! String) {
+        return _reportInvalidValue(node, context, 'String');
+      }
+      var uri = _translateUri(node, context);
+      if (uri != null) {
+        return ElementDescriptor(
+          libraryUris: [],
+          kind: ElementKind.libraryKind,
+          isStatic: false,
+          components: [uri.toString()],
+        );
+      }
+      return null;
+    } else if (node == null) {
+      return _reportMissingKey(context);
+    } else {
+      return _reportInvalidValue(node, context, 'ElementDescriptor');
+    }
+  }
+
+  /// Translate the [node] into a library transform. Return the resulting
+  /// transform, or `null` if the [node] does not represent a valid library
+  /// transform. If the [node] is not valid, use the [context] to
+  /// report the error.
+  Transform? _translateLibraryTransform(
+    YamlMap node,
+    String title,
+    DateTime date,
+    bool bulkApply,
+  ) {
+    var library = _translateLibrary(
+      node.valueAt(_libraryKey),
+      ErrorContext(key: _libraryKey, parentNode: node),
+    );
+    if (library == null) {
+      // The error has already been reported.
+      return null;
+    }
+    elementBeingTransformed = library;
+    var changesNode = node.valueAt(_changesKey);
+    if (changesNode == null) {
+      _reportError(diag.missingKey.withArguments(key: _changesKey), node);
+      return null;
+    }
+    var changes = _translateList(
+      node.valueAt(_changesKey),
+      ErrorContext(key: _changesKey, parentNode: node),
+      _translateReplacedByChangeLibrary,
+    );
+    if (changes == null) {
+      // The error has already been reported.
+      return null;
+    }
+    // If there is more than one change, it's an error.
+    if (changes.length > 1) {
+      _reportError(
+        diag.invalidChangeForKind.withArguments(
+          changeKind: _replacedByKind,
+          elementKind: library.kind.displayName,
+        ),
+        changesNode,
+      );
+      return null;
+    }
+
+    return Transform(
+      title: title,
+      date: date,
+      bulkApply: bulkApply,
+      element: library,
+      changesSelector: UnconditionalChangesSelector(changes),
+    );
+  }
+
   /// Translate the [node] into a list of objects using the [elementTranslator].
   /// Return the resulting list, or `null` if the [node] does not represent a
   /// valid list. If any of the elements of the list can't be translated, they
@@ -1207,6 +1356,47 @@
     );
   }
 
+  /// Translate the [node] into a replaced_by change. Return the resulting
+  /// change, or `null` if the [node] does not represent a valid replaced_by
+  /// change with a different library. This change is used when replacing a
+  /// library import.
+  ReplacedBy? _translateReplacedByChangeLibrary(
+    YamlNode node,
+    ErrorContext context,
+  ) {
+    if (node is YamlMap) {
+      _reportUnsupportedKeys(node, const {_kindKey, _newLibraryKey});
+      var changeKey = _translateString(
+        node.valueAt(_kindKey),
+        ErrorContext(key: _kindKey, parentNode: node),
+      );
+      if (changeKey == null) {
+        // The error has already been reported.
+        return null;
+      }
+      if (changeKey != _replacedByKind) {
+        _reportError(
+          diag.invalidChangeForKind.withArguments(
+            changeKind: _replacedByKind,
+            elementKind: ElementKind.libraryKind.displayName,
+          ),
+          node.valueAt(_kindKey)!,
+        );
+        return null;
+      }
+      var newLibrary = _translateLibrary(
+        node.valueAt(_newLibraryKey),
+        ErrorContext(key: _newLibraryKey, parentNode: node),
+      );
+      if (newLibrary == null) {
+        // The error has already been reported.
+        return null;
+      }
+      return ReplacedBy(newElement: newLibrary, replaceTarget: false);
+    }
+    return null;
+  }
+
   /// Translate the [node] into a string. Return the resulting string, or `null`
   /// if the [node] doesn't represent a valid string. If the [node] isn't valid,
   /// use the [context] to report the error. If the [node] doesn't exist and
@@ -1272,6 +1462,7 @@
         _changesKey,
         _dateKey,
         _elementKey,
+        _libraryKey,
         _oneOfKey,
         _titleKey,
         _variablesKey,
@@ -1291,62 +1482,43 @@
             required: false,
           ) ??
           true;
-      var element = _translateElement(
-        node.valueAt(_elementKey),
-        ErrorContext(key: _elementKey, parentNode: node),
-      );
-      elementBeingTransformed = element;
-      transformVariableScope = _translateTemplateVariables(
-        node.valueAt(_variablesKey),
-        ErrorContext(key: _variablesKey, parentNode: node),
-      );
-      var selector = _singleKey(
-        map: node,
-        errorNode: context.parentNode,
-        translators: {
-          const {_changesKey}: (key, value) {
-            var changes = _translateList(
-              value,
-              ErrorContext(key: _changesKey, parentNode: node),
-              _translateChange,
-            );
-            if (changes == null) {
-              // The error has already been reported.
-              _parameterModifications = null;
-              return null;
-            }
-            var parameterModifications = _parameterModifications;
-            if (parameterModifications != null) {
-              changes.add(
-                ModifyParameters(modifications: parameterModifications),
-              );
-              _parameterModifications = null;
-            }
-            return UnconditionalChangesSelector(changes);
-          },
-          const {_oneOfKey}: (key, value) {
-            return _translateConditionalChanges(
-              value,
-              ErrorContext(key: _oneOfKey, parentNode: node),
-            );
-          },
-        },
-      );
-      transformVariableScope = VariableScope.empty;
-      if (title == null ||
-          date == null ||
-          element == null ||
-          selector == null) {
-        // The error has already been reported.
+
+      if (title == null || date == null) {
         return null;
       }
-      return Transform(
-        title: title,
-        date: date,
-        bulkApply: bulkApply,
-        element: element,
-        changesSelector: selector,
-      );
+      var elementNode = node.valueAt(_elementKey);
+      var libraryNode = node.valueAt(_libraryKey);
+      if (libraryNode == null && elementNode == null) {
+        _reportError(
+          diag.missingOneOfMultipleKeys.withArguments(
+            validKeys: [_elementKey, _libraryKey].quotedAndCommaSeparatedWithOr,
+          ),
+          node,
+        );
+        return null;
+      }
+      if (libraryNode != null && elementNode != null) {
+        _reportError(
+          diag.conflictingKey.withArguments(
+            key: _elementKey,
+            conflictingKey: _libraryKey,
+          ),
+          node,
+        );
+        return null;
+      }
+
+      if (elementNode != null) {
+        return _translateElementTransform(
+          node,
+          context,
+          title,
+          date,
+          bulkApply,
+        );
+      } else {
+        return _translateLibraryTransform(node, title, date, bulkApply);
+      }
     } else {
       return _reportInvalidValue(node, context, 'Map');
     }
diff --git a/pkg/analysis_server/lib/src/services/correction/fix_internal.dart b/pkg/analysis_server/lib/src/services/correction/fix_internal.dart
index 49ada62..f03be85 100644
--- a/pkg/analysis_server/lib/src/services/correction/fix_internal.dart
+++ b/pkg/analysis_server/lib/src/services/correction/fix_internal.dart
@@ -48,6 +48,7 @@
 import 'package:analysis_server/src/services/correction/dart/convert_add_all_to_spread.dart';
 import 'package:analysis_server/src/services/correction/dart/convert_class_to_enum.dart';
 import 'package:analysis_server/src/services/correction/dart/convert_conditional_expression_to_if_element.dart';
+import 'package:analysis_server/src/services/correction/dart/convert_default_to_primary_constructor.dart';
 import 'package:analysis_server/src/services/correction/dart/convert_documentation_into_line.dart';
 import 'package:analysis_server/src/services/correction/dart/convert_flutter_child.dart';
 import 'package:analysis_server/src/services/correction/dart/convert_flutter_children.dart';
@@ -63,6 +64,7 @@
 import 'package:analysis_server/src/services/correction/dart/convert_to_cascade.dart';
 import 'package:analysis_server/src/services/correction/dart/convert_to_constant_pattern.dart';
 import 'package:analysis_server/src/services/correction/dart/convert_to_contains.dart';
+import 'package:analysis_server/src/services/correction/dart/convert_to_declaring_parameter.dart';
 import 'package:analysis_server/src/services/correction/dart/convert_to_expression_function_body.dart';
 import 'package:analysis_server/src/services/correction/dart/convert_to_flutter_style_todo.dart';
 import 'package:analysis_server/src/services/correction/dart/convert_to_for_each.dart';
@@ -80,6 +82,7 @@
 import 'package:analysis_server/src/services/correction/dart/convert_to_null_aware_spread.dart';
 import 'package:analysis_server/src/services/correction/dart/convert_to_on_type.dart';
 import 'package:analysis_server/src/services/correction/dart/convert_to_package_import.dart';
+import 'package:analysis_server/src/services/correction/dart/convert_to_primary_constructor.dart';
 import 'package:analysis_server/src/services/correction/dart/convert_to_raw_string.dart';
 import 'package:analysis_server/src/services/correction/dart/convert_to_relative_import.dart';
 import 'package:analysis_server/src/services/correction/dart/convert_to_set_literal.dart';
@@ -152,6 +155,7 @@
 import 'package:analysis_server/src/services/correction/dart/remove_duplicate_case.dart';
 import 'package:analysis_server/src/services/correction/dart/remove_empty_catch.dart';
 import 'package:analysis_server/src/services/correction/dart/remove_empty_constructor_body.dart';
+import 'package:analysis_server/src/services/correction/dart/remove_empty_container_body.dart';
 import 'package:analysis_server/src/services/correction/dart/remove_empty_else.dart';
 import 'package:analysis_server/src/services/correction/dart/remove_empty_statement.dart';
 import 'package:analysis_server/src/services/correction/dart/remove_extends_clause.dart';
@@ -329,6 +333,7 @@
   diag.discardedFutures: [AddAsync.discardedFutures, WrapInUnawaited.new],
   diag.emptyCatches: [RemoveEmptyCatch.new],
   diag.emptyConstructorBodies: [RemoveEmptyConstructorBody.new],
+  diag.emptyContainerBodies: [RemoveEmptyContainerBody.new],
   diag.emptyStatements: [RemoveEmptyStatement.new, ReplaceWithBrackets.new],
   diag.eolAtEndOfFile: [AddEolAtEndOfFile.new],
   diag.exhaustiveCases: [AddMissingEnumLikeCaseClauses.new],
@@ -478,6 +483,7 @@
   diag.unreachableFromMain: [RemoveUnusedElement.new],
   diag.unrelatedTypeEqualityChecksInExpression: [ReplaceWithIs.new],
   diag.useColoredBox: [ReplaceContainerWithColoredBox.new],
+  diag.useDeclaringParameters: [ConvertToDeclaringParameter.new],
   diag.useDecoratedBox: [ReplaceWithDecoratedBox.new],
   diag.useEnums: [ConvertClassToEnum.new],
   diag.useFullHexValuesForFlutterColors: [ReplaceWithEightDigitHex.new],
@@ -488,6 +494,10 @@
   diag.useKeyInWidgetConstructors: [AddKeyToConstructors.new],
   diag.useNamedConstants: [ReplaceWithNamedConstant.new],
   diag.useNullAwareElements: [ConvertNullCheckToNullAwareElementOrEntry.new],
+  diag.usePrimaryConstructors: [
+    ConvertDefaultToPrimaryConstructor.new,
+    ConvertToPrimaryConstructor.new,
+  ],
   diag.useRawStrings: [ConvertToRawString.new],
   diag.useRethrowWhenPossible: [UseRethrow.new],
   diag.useStringInPartOfDirectives: [ReplaceWithPartOrUriEmpty.new],
@@ -1210,6 +1220,7 @@
     // TODO(brianwilkerson): Support ImportLibrary for non-extension members.
     ImportLibrary.forExtensionMember,
   ],
+  diag.uriDoesNotExist: [DataDriven.new],
   diag.useOfPrivateParameterName: [ChangeArgumentName.new],
   diag.wrongNumberOfTypeArguments: [DataDriven.new],
   diag.wrongNumberOfTypeArgumentsConstructor: [DataDriven.new],
diff --git a/pkg/analysis_server/lib/src/services/search/hierarchy.dart b/pkg/analysis_server/lib/src/services/search/hierarchy.dart
index 35246f4..b417f23 100644
--- a/pkg/analysis_server/lib/src/services/search/hierarchy.dart
+++ b/pkg/analysis_server/lib/src/services/search/hierarchy.dart
@@ -69,9 +69,8 @@
 Future<Set<InterfaceElement>> getDirectSubClasses(
   SearchEngine searchEngine,
   InterfaceElement seed,
-  SearchEngineCache searchEngineCache,
 ) async {
-  var matches = await searchEngine.searchSubtypes(seed, searchEngineCache);
+  var matches = await searchEngine.searchSubtypes(seed);
   return matches.map((match) => match.element).cast<InterfaceElement>().toSet();
 }
 
diff --git a/pkg/analysis_server/lib/src/services/search/search_engine.dart b/pkg/analysis_server/lib/src/services/search/search_engine.dart
index fa1c2d0..d665133 100644
--- a/pkg/analysis_server/lib/src/services/search/search_engine.dart
+++ b/pkg/analysis_server/lib/src/services/search/search_engine.dart
@@ -10,8 +10,6 @@
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/source/source.dart';
 import 'package:analyzer/source/source_range.dart';
-import 'package:analyzer/src/dart/analysis/driver.dart';
-import 'package:analyzer/src/dart/analysis/file_state.dart';
 import 'package:analyzer/src/dart/analysis/search.dart';
 import 'package:analyzer/src/util/performance/operation_performance.dart';
 
@@ -128,11 +126,8 @@
   /// Returns direct subtypes of the given [type].
   ///
   /// [type] - the [InterfaceElement] being subtyped by the found matches.
-  /// [cache] - the [SearchEngineCache] used to speeding up the computation. If
-  ///    empty it will be filled out and can be used on any subsequent query.
   Future<List<SearchMatch>> searchSubtypes(
-    InterfaceElement type,
-    SearchEngineCache cache, {
+    InterfaceElement type, {
     OperationPerformanceImpl? performance,
   });
 
@@ -143,13 +138,6 @@
   Future<List<SearchMatch>> searchTopLevelDeclarations(String pattern);
 }
 
-class SearchEngineCache {
-  List<AnalysisDriver>? drivers;
-  // TODO(jensj): Can `searchedFiles` be removed?
-  SearchedFiles? searchedFiles;
-  Map<AnalysisDriver, List<FileState>>? assignedFiles;
-}
-
 /// Instances of the class [SearchMatch] represent a match found by
 /// [SearchEngine].
 abstract class SearchMatch {
diff --git a/pkg/analysis_server/lib/src/services/search/search_engine_internal.dart b/pkg/analysis_server/lib/src/services/search/search_engine_internal.dart
index 3a130d9..862430a 100644
--- a/pkg/analysis_server/lib/src/services/search/search_engine_internal.dart
+++ b/pkg/analysis_server/lib/src/services/search/search_engine_internal.dart
@@ -2,10 +2,10 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'dart:collection';
-
 import 'package:analysis_server/src/services/search/search_engine.dart';
 import 'package:analyzer/dart/element/element.dart';
+import 'package:analyzer/file_system/file_system.dart';
+import 'package:analyzer/source/file_source.dart';
 import 'package:analyzer/source/source.dart';
 import 'package:analyzer/source/source_range.dart';
 import 'package:analyzer/src/dart/analysis/driver.dart';
@@ -26,13 +26,10 @@
     Set<InterfaceElement> allSubtypes,
     OperationPerformanceImpl performance,
   ) async {
-    var searchEngineCache = SearchEngineCache();
-
     Future<void> addSubtypes(InterfaceElement type) async {
       var directResults = await performance.runAsync(
         '_searchDirectSubtypes',
-        (performance) =>
-            _searchDirectSubtypes(type, searchEngineCache, performance),
+        (performance) => _searchDirectSubtypes(type, performance),
       );
       for (var directResult in directResults) {
         var directSubtype =
@@ -49,9 +46,10 @@
   @override
   Future<Set<String>?> membersOfSubtypes(InterfaceElement type) async {
     var drivers = _drivers.toList();
-    var searchedFiles = _createSearchedFiles(drivers);
+    _discoverAvailableFiles(drivers);
 
-    var libraryUriStr = type.library.uri.toString();
+    var libraryFile = type.library.firstFragment.source.mustBeFile;
+
     var hasSubtypes = false;
     var visitedIds = <String>{};
     var members = <String>{};
@@ -65,14 +63,13 @@
       }
       for (var driver in drivers) {
         var subtypes = await driver.search.subtypes(
-          searchedFiles,
           type: type,
           subtype: subtype,
         );
         for (var subtype in subtypes) {
           hasSubtypes = true;
           members.addAll(
-            subtype.libraryUri == libraryUriStr
+            subtype.library.resource == libraryFile
                 ? subtype.members
                 : subtype.members.where((name) => !name.startsWith('_')),
           );
@@ -95,6 +92,7 @@
   ) async {
     var allResults = <LibraryFragmentSearchMatch>[];
     var drivers = _drivers.toList();
+    _discoverAvailableFiles(drivers);
     for (var driver in drivers) {
       var results = await driver.search.referencesLibraryFragment(fragment);
       allResults.addAll(results);
@@ -108,12 +106,9 @@
   ) async {
     var allResults = <LibraryFragmentSearchMatch>[];
     var drivers = _drivers.toList();
-    var searchedFiles = _createSearchedFiles(drivers);
+    _discoverAvailableFiles(drivers);
     for (var driver in drivers) {
-      var results = await driver.search.referencesLibraryImport(
-        import,
-        searchedFiles,
-      );
+      var results = await driver.search.referencesLibraryImport(import);
       allResults.addAll(results);
     }
     return allResults;
@@ -123,9 +118,9 @@
   Future<List<SearchMatch>> searchMemberDeclarations(String name) async {
     var allDeclarations = <SearchMatch>[];
     var drivers = _drivers.toList();
-    var searchedFiles = _createSearchedFiles(drivers);
+    _discoverAvailableFiles(drivers);
     for (var driver in drivers) {
-      var elements = await driver.search.classMembers(name, searchedFiles);
+      var elements = await driver.search.classMembers(name);
       allDeclarations.addAll(elements.map(SearchMatchImpl.forElement));
     }
     return allDeclarations;
@@ -135,12 +130,9 @@
   Future<List<SearchMatch>> searchMemberReferences(String name) async {
     var allResults = <SearchResult>[];
     var drivers = _drivers.toList();
-    var searchedFiles = _createSearchedFiles(drivers);
+    _discoverAvailableFiles(drivers);
     for (var driver in drivers) {
-      var results = await driver.search.unresolvedMemberReferences(
-        name,
-        searchedFiles,
-      );
+      var results = await driver.search.unresolvedMemberReferences(name);
       allResults.addAll(results);
     }
     return allResults.map(SearchMatchImpl.forSearchResult).toList();
@@ -160,9 +152,9 @@
   Future<List<SearchMatch>> searchReferences(Element element) async {
     var allResults = <SearchResult>[];
     var drivers = _drivers.toList();
-    var searchedFiles = _createSearchedFiles(drivers);
+    _discoverAvailableFiles(drivers);
     for (var driver in drivers) {
-      var results = await driver.search.references(element, searchedFiles);
+      var results = await driver.search.references(element);
       allResults.addAll(results);
     }
     return allResults.map(SearchMatchImpl.forSearchResult).toList();
@@ -170,81 +162,45 @@
 
   @override
   Future<List<SearchMatch>> searchSubtypes(
-    InterfaceElement type,
-    SearchEngineCache searchEngineCache, {
+    InterfaceElement type, {
     OperationPerformanceImpl? performance,
   }) async {
     performance ??= OperationPerformanceImpl('<root>');
-    var results = await _searchDirectSubtypes(
-      type,
-      searchEngineCache,
-      performance,
-    );
+    var results = await _searchDirectSubtypes(type, performance);
     return results.map(SearchMatchImpl.forSearchResult).toList();
   }
 
   @override
   Future<List<SearchMatch>> searchTopLevelDeclarations(String pattern) async {
-    var allElements = HashSet<Element>(
-      hashCode: (e) => e.name.hashCode,
-      equals: (a, b) {
-        return a.lookupName == b.lookupName && a.library?.uri == b.library?.uri;
-      },
-    );
+    var allMatches = <SearchMatch>[];
     var regExp = RegExp(pattern);
     var drivers = _drivers.toList();
+    _discoverAvailableFiles(drivers);
     for (var driver in drivers) {
       var elements = await driver.search.topLevelElements(regExp);
-      allElements.addAll(elements);
+      allMatches.addAll(elements.map(SearchMatchImpl.forElement));
     }
-    return allElements.map(SearchMatchImpl.forElement).toList();
+    return allMatches;
   }
 
-  /// Create a new [SearchedFiles] instance in which added files are owned
-  /// by the drivers that have them added.
-  SearchedFiles _createSearchedFiles(List<AnalysisDriver> drivers) {
-    var searchedFiles = SearchedFiles();
+  void _discoverAvailableFiles(List<AnalysisDriver> drivers) {
     for (var driver in drivers) {
-      searchedFiles.ownAnalyzed(driver.search);
+      driver.discoverAvailableFiles();
     }
-    return searchedFiles;
   }
 
   Future<List<SearchResult>> _searchDirectSubtypes(
     InterfaceElement type,
-    SearchEngineCache searchEngineCache,
     OperationPerformanceImpl performance,
   ) async {
     var allResults = <SearchResult>[];
 
-    // Fill out cache if needed.
-    var drivers = searchEngineCache.drivers ??= _drivers.toList();
-    var searchedFiles = searchEngineCache.searchedFiles ??=
-        _createSearchedFiles(drivers);
-    var assignedFiles = searchEngineCache.assignedFiles;
-    if (assignedFiles == null) {
-      assignedFiles = searchEngineCache.assignedFiles = {};
-      for (var driver in drivers) {
-        var assignedFilesForDrive = assignedFiles[driver] = [];
-        performance.run('discoverAvailableFiles', (_) {
-          return driver.discoverAvailableFiles();
-        });
-        for (var file in driver.fsState.knownFiles) {
-          if (searchedFiles.add(file.path, driver.search)) {
-            assignedFilesForDrive.add(file);
-          }
-        }
-      }
-    }
-
+    var drivers = _drivers.toList();
+    _discoverAvailableFiles(drivers);
     for (var driver in drivers) {
       var results = await performance.runAsync(
         'subTypes',
-        (_) => driver.search.subTypes(
-          type,
-          searchedFiles,
-          filesToCheck: assignedFiles![driver],
-        ),
+        (_) => driver.search.subTypes(type),
       );
       allResults.addAll(results);
     }
@@ -376,3 +332,14 @@
     };
   }
 }
+
+extension _SourceExtension on Source {
+  /// Returns the [File] for this source.
+  ///
+  /// This assumes that the source is a [FileSource], which is safe because
+  /// index and search are only supported in DAS, where all sources are file
+  /// based.
+  File get mustBeFile {
+    return (this as FileSource).file;
+  }
+}
diff --git a/pkg/analysis_server/lib/src/session_logger/log_normalizer.dart b/pkg/analysis_server/lib/src/session_logger/log_normalizer.dart
index 377b00e..fd93ddb 100644
--- a/pkg/analysis_server/lib/src/session_logger/log_normalizer.dart
+++ b/pkg/analysis_server/lib/src/session_logger/log_normalizer.dart
@@ -9,12 +9,9 @@
 import 'package:analysis_server/src/session_logger/log_entry.dart';
 import 'package:collection/collection.dart';
 import 'package:language_server_protocol/json_parsing.dart';
-import 'package:path/path.dart' as path;
 
 /// A utility for normalizing paths in log entries.
 class LogNormalizer {
-  final path.Context pathContext;
-
   /// A map from the path-to-be-replaced to the replacement string.
   ///
   /// Paths are canonicalized to lowercase and the replacement regex is
@@ -22,11 +19,16 @@
   final Map<String, String> _replacements =
       CanonicalizedMap<String, String, String>((key) => key.toLowerCase());
 
+  /// A lazily built reverse map for [_replacements].
+  Map<String, String>? _denormalizedReplacements;
+
   /// A cached regex for all current replacements to allow them to occur in a
   /// single pass.
   RegExp? _replacementPattern;
 
-  LogNormalizer(this.pathContext);
+  /// A cached regex for all current denormalizations to allow them to occur in
+  /// a single pass.
+  RegExp? _denormalizationPattern;
 
   /// Extracts paths and URIs from an LSP initialize request and adds
   /// replacements for each.
@@ -39,22 +41,20 @@
 
     var initializeParams = InitializeParams.fromJson(params);
 
+    // Record rootPath and rootUri separately even though we handle both URIs
+    // and paths for each replacement, because we don't know for certain that
+    // the client provided us the same in each.
     if (initializeParams.rootPath case var rootPath?) {
-      addPathReplacement(rootPath, '{{rootPath}}');
+      addReplacementsForPath(rootPath, 'rootPath');
     }
-
     if (initializeParams.rootUri case var rootUri?) {
-      if (rootUri.isScheme('file')) {
-        addUriReplacement(rootUri, '{{rootUri}}');
-      }
+      addReplacementsForUri(rootUri, 'rootUri');
     }
 
     if (initializeParams.workspaceFolders case var workspaceFolders?) {
       for (var i = 0; i < workspaceFolders.length; i++) {
         var uri = workspaceFolders[i].uri;
-        if (uri.isScheme('file')) {
-          addUriReplacement(uri, '{{workspaceFolder-$i}}');
-        }
+        addReplacementsForUri(uri, 'workspaceFolder-$i');
       }
     }
   }
@@ -64,7 +64,11 @@
   /// Replacements assume the path (or URI) appear as quoted strings in the
   /// JSON (and therefore must be preceeded by a quote and followed by a
   /// path/uri separator or another quote).
-  void addPathReplacement(String inputPath, String replacement) {
+  ///
+  /// The replacement will be formatted as `{{$name}}` for URIs and
+  /// `{{$name:filePath}}` for file paths to allow for reversing this
+  /// replacement.
+  void addReplacementsForPath(String inputPath, String name) {
     if (inputPath.isEmpty) return;
 
     var uri = Uri.file(inputPath);
@@ -76,11 +80,21 @@
         .replace(path: uri.path.replaceAll(':', '%3A'))
         .toString();
 
-    void addWithQuotesAndTrailingSlash(String input, String separator) {
+    void addWithQuotesAndTrailingSlash(
+      String input,
+      List<String> separators,
+      String replacement,
+    ) {
       _replacements['"$input"'] = '"$replacement"';
-      _replacements['"$input$separator'] = '"$replacement$separator';
+      for (var separator in separators) {
+        _replacements['"$input$separator'] = '"$replacement$separator';
+      }
     }
 
+    // Compute replacement strings.
+    var pathReplacement = '{{$name:filePath}}';
+    var uriReplacement = '{{$name}}';
+
     // All replacements must be in the map because we need to look up the values
     // during replacement so if the regex matches variations, we need to be able
     // to find them here.
@@ -92,32 +106,71 @@
     //  from above into it).
 
     // Paths
-    var separator = pathContext.separator;
-    addWithQuotesAndTrailingSlash(inputPath, separator);
-    addWithQuotesAndTrailingSlash(_jsonEncode(inputPath), separator);
+    var pathSeparators = ['/', r'\'];
+    addWithQuotesAndTrailingSlash(
+      _jsonEncode(inputPath),
+      pathSeparators,
+      pathReplacement,
+    );
+    addWithQuotesAndTrailingSlash(inputPath, pathSeparators, pathReplacement);
 
     // URIs
-    separator = '/';
-    addWithQuotesAndTrailingSlash(uriString, separator);
-    addWithQuotesAndTrailingSlash(_jsonEncode(uriString), separator);
-    addWithQuotesAndTrailingSlash(uriStringWithEncodedColons, separator);
+    var uriSeparators = ['/'];
+    addWithQuotesAndTrailingSlash(
+      _jsonEncode(uriString),
+      uriSeparators,
+      uriReplacement,
+    );
+    addWithQuotesAndTrailingSlash(uriString, uriSeparators, uriReplacement);
     addWithQuotesAndTrailingSlash(
       _jsonEncode(uriStringWithEncodedColons),
-      separator,
+      uriSeparators,
+      uriReplacement,
+    );
+    addWithQuotesAndTrailingSlash(
+      uriStringWithEncodedColons,
+      uriSeparators,
+      uriReplacement,
     );
 
     // Reset the cached pattern so it's built on the next call to normalize.
     _replacementPattern = null;
+    _denormalizedReplacements = null;
+    _denormalizationPattern = null;
   }
 
-  /// Adds a replacement for the given [inputUri] in both path and URI form, but raw
-  /// and JSON encoded.
-  void addUriReplacement(Uri uri, String replacement) {
+  /// A convenience method for calling [addReplacementsForPath] when you have a
+  /// [Uri].
+  ///
+  /// Only if the URI is a 'file://' URI will it be recorded.
+  void addReplacementsForUri(Uri uri, String replacement) {
     if (uri.isScheme('file')) {
-      addPathReplacement(uri.toFilePath(), replacement);
+      addReplacementsForPath(uri.toFilePath(), replacement);
     }
   }
 
+  /// Restores [normalizedContent] to full paths/URIs by performing the opposite
+  /// replacements.
+  ///
+  /// Where normalization collapsed multiple equivalent strings into one (for
+  /// example different casing or URI encoding), they will all be restored to
+  /// a single canonical version.
+  String denormalize(String normalizedContent) {
+    if (_replacements.isEmpty) return normalizedContent;
+
+    var denormalizedReplacements = _denormalizedReplacements ??=
+        _buildDenormalizedReplacements();
+
+    var denormalizationPattern = _denormalizationPattern ??= RegExp(
+      denormalizedReplacements.keys.map(RegExp.escape).join('|'),
+    );
+
+    return normalizedContent.replaceAllMapped(
+      denormalizationPattern,
+      (match) => denormalizedReplacements[match[0]]!,
+    );
+  }
+
   /// Returns the given [json] string after replacing any known paths with
   /// placeholders.
   String normalize(String json) {
@@ -141,6 +194,16 @@
     );
   }
 
+  Map<String, String> _buildDenormalizedReplacements() {
+    var denormalizedReplacements = <String, String>{};
+    for (var MapEntry(:key, :value) in _replacements.entries) {
+      // Multiple original strings can normalize to the same placeholder.
+      // Use the first value as the canonical form.
+      denormalizedReplacements.putIfAbsent(value, () => key);
+    }
+    return denormalizedReplacements;
+  }
+
   /// Returns a JSON-encoded version of [inputString] without the surrounding
   /// quotes.
   String _jsonEncode(String inputString) {
diff --git a/pkg/analysis_server/lib/src/session_logger/session_logger.dart b/pkg/analysis_server/lib/src/session_logger/session_logger.dart
index 27285a1..2eb21e4 100644
--- a/pkg/analysis_server/lib/src/session_logger/session_logger.dart
+++ b/pkg/analysis_server/lib/src/session_logger/session_logger.dart
@@ -8,8 +8,6 @@
 import 'package:analysis_server/src/session_logger/log_normalizer.dart';
 import 'package:analysis_server/src/session_logger/process_id.dart';
 import 'package:analysis_server/src/session_logger/session_logger_sink.dart';
-import 'package:analyzer/file_system/file_system.dart';
-import 'package:analyzer/file_system/physical_file_system.dart';
 
 /// Used to write information about a session to a log.
 class SessionLogger {
@@ -25,14 +23,12 @@
   ///
   /// If [filePath] is non-`null`, it also writes log entries to a file at
   /// [filePath].
-  factory SessionLogger({File? sessionLogFile}) {
-    var normalizer = LogNormalizer(
-      PhysicalResourceProvider.INSTANCE.pathContext,
-    );
+  factory SessionLogger({String? filePath}) {
+    var normalizer = LogNormalizer();
     var sink = SessionLoggerInMemorySink(
       maxBufferLength: 1024,
       normalizer: normalizer,
-      sessionLogFile: sessionLogFile,
+      sessionLogFilePath: filePath,
     );
     return SessionLogger._(sink: sink, normalizer: normalizer);
   }
@@ -47,9 +43,9 @@
     required Map<String, Uri> packageRoots,
   }) {
     for (var MapEntry(key: packageName, value: uri) in packageRoots.entries) {
-      normalizer.addUriReplacement(
+      normalizer.addReplacementsForUri(
         uri,
-        '{{context-$index:package-root:$packageName}}',
+        'context-$index:package-root:$packageName',
       );
     }
   }
@@ -85,5 +81,7 @@
   }
 
   /// Shuts down the logger.
-  Future<void> shutdown() async {}
+  Future<void> shutdown() async {
+    await sink?.close();
+  }
 }
diff --git a/pkg/analysis_server/lib/src/session_logger/session_logger_sink.dart b/pkg/analysis_server/lib/src/session_logger/session_logger_sink.dart
index 476c514..bccfbe3 100644
--- a/pkg/analysis_server/lib/src/session_logger/session_logger_sink.dart
+++ b/pkg/analysis_server/lib/src/session_logger/session_logger_sink.dart
@@ -3,29 +3,34 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'dart:convert';
+import 'dart:io' as io;
 
 import 'package:analysis_server/src/session_logger/log_entry.dart';
 import 'package:analysis_server/src/session_logger/log_normalizer.dart';
 import 'package:analysis_server/src/session_logger/process_id.dart';
-import 'package:analyzer/file_system/file_system.dart';
 import 'package:language_server_protocol/protocol_special.dart' show Either2;
 
 /// A sink for a session logger that will write entries to a file.
 final class SessionLoggerFileSink extends SessionLoggerSink {
   /// The sink used to write to the file.
-  final File _file;
+  late final io.IOSink _sink;
 
   @override
   final LogNormalizer _normalizer;
 
   /// Initializes a newly created sink to write to the file at the given
   /// [filePath].
-  SessionLoggerFileSink(this._file, {required this._normalizer});
+  SessionLoggerFileSink(String filePath, {required this._normalizer}) {
+    _sink = io.File(filePath).openWrite();
+  }
+
+  @override
+  Future<void> close() => _sink.close();
 
   @override
   void writeLogEntry(JsonMap entry) {
     var jsonString = _normalizer.normalize(json.encode(entry));
-    _file.writeAsStringSync('$jsonString\n');
+    _sink.writeln(jsonString);
   }
 }
 
@@ -71,11 +76,11 @@
   SessionLoggerInMemorySink({
     required this.maxBufferLength,
     required LogNormalizer normalizer,
-    File? sessionLogFile,
+    String? sessionLogFilePath,
   }) : _normalizer = normalizer,
-       _nextLogger = sessionLogFile == null
+       _nextLogger = sessionLogFilePath == null
            ? null
-           : SessionLoggerFileSink(sessionLogFile, normalizer: normalizer);
+           : SessionLoggerFileSink(sessionLogFilePath, normalizer: normalizer);
 
   /// Returns a list of the entries that have been captured.
   ///
@@ -209,6 +214,8 @@
   /// The normalizer used to normalize paths in log entries.
   LogNormalizer get _normalizer;
 
+  Future<void> close() async {}
+
   /// Writes the given log [entry] to this sink.
   void writeLogEntry(JsonMap entry);
 
diff --git a/pkg/analysis_server/lib/src/utilities/extensions/element.dart b/pkg/analysis_server/lib/src/utilities/extensions/element.dart
index ddba73c..49adc88 100644
--- a/pkg/analysis_server/lib/src/utilities/extensions/element.dart
+++ b/pkg/analysis_server/lib/src/utilities/extensions/element.dart
@@ -23,6 +23,21 @@
 }
 
 extension ElementExtensions on Element {
+  /// Canonicalizes an element so that field formal parameters map to their
+  /// fields and property accessors map to their variables.
+  // TODO(FMorschel): Move this when the occurrences are removed and only LSP is
+  //  supported.
+  Element? get canonical => switch (this) {
+    FieldFormalParameterElement(:var field) when field?.name == name =>
+      field?.baseElement,
+    PropertyAccessorElement(:var variable, :var isOriginVariable)
+        when isOriginVariable ||
+            variable is FieldElement &&
+                variable.isOriginDeclaringFormalParameter =>
+      variable.baseElement,
+    _ => baseElement,
+  };
+
   /// Whether this element, the enclosing class (if there is one), or
   /// the enclosing library, has been annotated with the `@Deprecated()`
   /// annotation.
diff --git a/pkg/analysis_server/test/analysis/notification_occurrences_test.dart b/pkg/analysis_server/test/analysis/notification_occurrences_test.dart
index d3d1990..de8d180 100644
--- a/pkg/analysis_server/test/analysis/notification_occurrences_test.dart
+++ b/pkg/analysis_server/test/analysis/notification_occurrences_test.dart
@@ -691,6 +691,65 @@
 ''');
   }
 
+  Future<void> test_primaryConstructor_declaringParameter() async {
+    await assertOccurrences(kind: .FIELD, '''
+/// This references [/*[0*/i/*0]*/].
+class C({var int? /*[1*/i/*1]*/});
+
+void f(int? parameter) {
+  var c = C(/*[2*/i/*2]*/: parameter);
+  C(/*[3*/i/*3]*/: c./*[4*/i^/*4]*/);
+}
+''');
+  }
+
+  /// For the legacy protocol, the argument name is not treated as a reference
+  /// for the parameter because the protocol currently only supports
+  /// same-length occurrences.
+  Future<void>
+  test_primaryConstructor_declaringPrivateParameter_declaration() async {
+    await assertOccurrences(kind: .FIELD, r'''
+/// This references [/*[0*/_i/*0]*/].
+class C({var int? /*[1*/_i^/*1]*/}) {
+  String toString() => '${/*[2*/_i/*2]*/}';
+}
+
+void f(int? parameter) {
+  var _ = C(i: parameter);
+}
+''');
+  }
+
+  Future<void> test_primaryConstructor_declaringPrivateParameter_field() async {
+    await assertOccurrences(kind: .FIELD, r'''
+/// This references [/*[0*/_i^/*0]*/].
+class C({var int? /*[1*/_i/*1]*/}) {
+  String toString() => '${/*[2*/_i/*2]*/}';
+}
+
+void f(int? parameter) {
+  var _ = C(i: parameter);
+}
+''');
+  }
+
+  /// For the legacy protocol, the argument name is not treated as a reference
+  /// for the parameter because the protocol currently only supports
+  /// same-length occurrences.
+  Future<void>
+  test_primaryConstructor_declaringPrivateParameter_parameter() async {
+    await assertOccurrences(kind: .PARAMETER, r'''
+/// This references [_i].
+class C({var int? _i}) {
+  String toString() => '${_i}';
+}
+
+void f(int? parameter) {
+  var _ = C(/*[0*/i^/*0]*/: parameter);
+}
+''');
+  }
+
   Future<void> test_primaryConstructor_named_constructorName() async {
     await assertOccurrences(
       kind: ElementKind.CONSTRUCTOR,
diff --git a/pkg/analysis_server/test/lsp/augmentation_test.dart b/pkg/analysis_server/test/lsp/augmentation_test.dart
index 3a5421b..746641a 100644
--- a/pkg/analysis_server/test/lsp/augmentation_test.dart
+++ b/pkg/analysis_server/test/lsp/augmentation_test.dart
@@ -125,7 +125,7 @@
 }
 
 augment class A {
-  augment String get [!foo!] => '';
+  augment String get [!foo!];
 }
 ''');
   }
@@ -137,7 +137,7 @@
 }
 
 augment class A {
-  augment String get [!foo!] => '';
+  augment String get [!foo!];
 }
 ''');
   }
@@ -157,13 +157,11 @@
 }
 
 augment class A {
-  augment void foo() {
-    ^
-  }
+  augment void fo^o();
 }
 
 augment class A {
-  augment void [!foo!]() {}
+  augment void [!foo!]();
 }
 ''');
   }
@@ -177,7 +175,7 @@
 }
 
 augment class A {
-  augment void [!foo!]() {}
+  augment void [!foo!]();
 }
 ''');
   }
@@ -189,11 +187,11 @@
 }
 
 augment class A {
-  augment void fo^o() {}
+  augment void fo^o();
 }
 
 augment class A {
-  augment void [!foo!]() {}
+  augment void [!foo!]();
 }
 ''');
   }
@@ -205,7 +203,7 @@
 }
 
 augment class A {
-  augment void [!foo!]() {}
+  augment void [!foo!]();
 }
 ''');
   }
@@ -219,7 +217,7 @@
 }
 
 augment class A {
-  augment set [!foo!](String value) {}
+  augment set [!foo!](String value);
 }
 ''');
   }
@@ -231,7 +229,7 @@
 }
 
 augment class A {
-  augment set [!foo!](String value) {}
+  augment set [!foo!](String value);
 }
 ''');
   }
diff --git a/pkg/analysis_server/test/lsp/augmented_test.dart b/pkg/analysis_server/test/lsp/augmented_test.dart
index 21a80d5..9d5b7e2 100644
--- a/pkg/analysis_server/test/lsp/augmented_test.dart
+++ b/pkg/analysis_server/test/lsp/augmented_test.dart
@@ -125,7 +125,7 @@
 }
 
 augment class A {
-  augment String get foo => '^';
+  augment String get fo^o;
 }
 ''');
   }
@@ -137,7 +137,7 @@
 }
 
 augment class A {
-  augment String get fo^o => '';
+  augment String get fo^o;
 }
 ''');
   }
@@ -157,13 +157,11 @@
 }
 
 augment class A {
-  augment void [!foo!]() {}
+  augment void [!foo!]();
 }
 
 augment class A {
-  augment void foo() {
-    ^
-  }
+  augment void fo^o();
 }
 ''');
   }
@@ -175,9 +173,7 @@
 }
 
 augment class A {
-  augment void foo() {
-    ^
-  }
+  augment void fo^o();
 }
 ''');
   }
@@ -189,11 +185,11 @@
 }
 
 augment class A {
-  augment void [!foo!]() {}
+  augment void [!foo!]();
 }
 
 augment class A {
-  augment void fo^o() {}
+  augment void fo^o();
 }
 ''');
   }
@@ -205,7 +201,7 @@
 }
 
 augment class A {
-  augment void f^oo() {}
+  augment void f^oo();
 }
 ''');
   }
@@ -217,9 +213,7 @@
 }
 
 augment class A {
-  augment set foo(String value) {
-    ^
-  }
+  augment set fo^o(String value);
 }
 ''');
   }
@@ -231,7 +225,7 @@
 }
 
 augment class A {
-  augment set fo^o(String value) {}
+  augment set fo^o(String value);
 }
 ''');
   }
diff --git a/pkg/analysis_server/test/lsp/code_lens/augmentations_test.dart b/pkg/analysis_server/test/lsp/code_lens/augmentations_test.dart
index 2427062..6fc5569 100644
--- a/pkg/analysis_server/test/lsp/code_lens/augmentations_test.dart
+++ b/pkg/analysis_server/test/lsp/code_lens/augmentations_test.dart
@@ -159,7 +159,7 @@
 ''');
     setAugmentationContent(r'''
 augment class A {
-  augment String get [!g!] => '';
+  augment String get [!g!];
 }
 ''');
 
@@ -175,7 +175,7 @@
 ''');
     setAugmentationContent(r'''
 augment class A {
-  augment void [!m!]() {}
+  augment void [!m!]();
 }
 ''');
 
@@ -191,7 +191,7 @@
 ''');
     setAugmentationContent(r'''
 augment class A {
-  augment set [!g!](String value) {}
+  augment set [!g!](String value);
 }
 ''');
 
@@ -236,7 +236,7 @@
 void [!f!]() {}
 ''');
     setAugmentationContent(r'''
-augment void [!f!]() {}
+augment void [!f!]();
 ''');
 
     await initialize();
diff --git a/pkg/analysis_server/test/lsp/document_highlights_test.dart b/pkg/analysis_server/test/lsp/document_highlights_test.dart
index 542ae07..5338c68 100644
--- a/pkg/analysis_server/test/lsp/document_highlights_test.dart
+++ b/pkg/analysis_server/test/lsp/document_highlights_test.dart
@@ -21,37 +21,47 @@
 @reflectiveTest
 class DocumentHighlightsTest extends AbstractLspAnalysisServerTest {
   Future<void> test_bound_topLevelVariable_wildcard() async {
-    await _testMarkedContent('''
+    await _testMarkedContent(
+      '''
 var /*[0*/_/*0]*/ = 1;
 void f() {
   var _ = 2;
   print(/*[1*/_/*1]*/);
 }
-''');
+''',
+      kinds: {0: .Write, 1: .Read},
+    );
   }
 
   Future<void> test_catch_error() async {
-    await _testMarkedContent(r'''
+    await _testMarkedContent(
+      r'''
 void foo() {
   try {} catch (/*[0*/error/*0]*/, stackTrace) {
     print('$/*[1*/error/*1]*/, $stackTrace');
   }
 }
-''');
+''',
+      kinds: {0: .Write, 1: .Read},
+    );
   }
 
   Future<void> test_catch_stack() async {
-    await _testMarkedContent(r'''
+    await _testMarkedContent(
+      r'''
 void foo() {
   try {} catch (error, /*[0*/stackTrace/*0]*/) {
     print('$error, $/*[1*/stackTrace/*1]*/');
   }
 }
-''');
+''',
+      kinds: {0: .Write, 1: .Read},
+    );
   }
 
   Future<void> test_class_field_underscore() async {
-    await _testMarkedContent('''
+    await _testMarkedContent(
+      '''
 class C {
   int /*[0*/_/*0]*/ = 0;
   }
@@ -60,11 +70,14 @@
   int _ = 1;
   C()./*[1*/_/*1]*/;
 }
-''');
+''',
+      kinds: {0: .Write, 1: .Read},
+    );
   }
 
   Future<void> test_class_getterSetter() async {
-    await _testMarkedContent('''
+    await _testMarkedContent(
+      '''
 class A {
   int /*[0*/a/*0]*/ = 1;
 }
@@ -78,11 +91,22 @@
   a./*[3*/a/*3]*/ = b./*[4*/a/*4]*/;
   b./*[5*/a/*5]*/ = a./*[6*/a/*6]*/;
 }
-''');
+''',
+      kinds: {
+        0: .Write,
+        1: .Write,
+        2: .Write,
+        3: .Write,
+        4: .Read,
+        5: .Write,
+        6: .Read,
+      },
+    );
   }
 
   Future<void> test_constructor_secondary_className() async {
-    await _testMarkedContent('''
+    await _testMarkedContent(
+      '''
 class Aaa {
   /*[0*/Aaa/*0]*/();
 }
@@ -91,13 +115,16 @@
   Aaa a = Aaa./*[1*/new/*1]*/();
   var b = /*[2*/Aaa/*2]*/();
 }
-''');
+''',
+      kinds: {0: .Write, 1: .Read, 2: .Read},
+    );
   }
 
   /// The factory keyword is considered the constructor when there's no
   /// constructor name.
   Future<void> test_constructor_secondary_factory() async {
-    await _testMarkedContent('''
+    await _testMarkedContent(
+      '''
 class Aaa {
   new _();
   /*[0*/factory/*0]*/() => Aaa._();
@@ -107,7 +134,9 @@
   Aaa a = Aaa./*[1*/new/*1]*/();
   var b = /*[2*/Aaa/*2]*/();
 }
-''');
+''',
+      kinds: {0: .Write, 1: .Read, 2: .Read},
+    );
   }
 
   /// No matches for factory keyword when there is a constructor name.
@@ -128,7 +157,8 @@
   /// Names match names.
   Future<void>
   test_constructor_secondary_factory_withoutType_named_name() async {
-    await _testMarkedContent('''
+    await _testMarkedContent(
+      '''
 class Aaa {
   new _();
   factory /*[0*/named/*0]*/() => Aaa._();
@@ -137,7 +167,9 @@
 void f() {
   Aaa a = Aaa./*[1*/named/*1]*/();
 }
-''');
+''',
+      kinds: {0: .Write, 1: .Read},
+    );
   }
 
   /// No matches for factory keyword when there is a type name because the type
@@ -157,7 +189,8 @@
 
   /// Type names match type names for invocation/declaration.
   Future<void> test_constructor_secondary_factory_withType_typeName() async {
-    await _testMarkedContent('''
+    await _testMarkedContent(
+      '''
 class Aaa {
   new _();
   factory /*[0*/Aaa/*0]*/() => Aaa._();
@@ -166,11 +199,14 @@
 void f() {
   Aaa a = /*[1*/Aaa/*1]*/();
 }
-''');
+''',
+      kinds: {0: .Write, 1: .Read},
+    );
   }
 
   Future<void> test_constructor_secondary_new() async {
-    await _testMarkedContent('''
+    await _testMarkedContent(
+      '''
 class Aaa {
   /*[0*/new/*0]*/();
 }
@@ -179,7 +215,9 @@
   Aaa a = Aaa./*[1*/new/*1]*/();
   var b = /*[2*/Aaa/*2]*/();
 }
-''');
+''',
+      kinds: {0: .Write, 1: .Read, 2: .Read},
+    );
   }
 
   /// No matches for new keyword when there is a constructor name.
@@ -199,7 +237,8 @@
   /// When `new` is used as the constructor identifier, it's a match for
   /// constructor invocations.
   Future<void> test_constructor_secondary_new_withType_keyword() async {
-    await _testMarkedContent('''
+    await _testMarkedContent(
+      '''
 class Aaa {
   Aaa./*[0*/new/*0]*/();
 }
@@ -208,13 +247,16 @@
   Aaa a = /*[1*/Aaa/*1]*/();
   Aaa b = Aaa./*[2*/new/*2]*/();
 }
-''');
+''',
+      kinds: {0: .Write, 1: .Read, 2: .Read},
+    );
   }
 
   /// When `new` is used as the constructor identifier, the type name is a
   /// match for the type name.
   Future<void> test_constructor_secondary_new_withType_typeName() async {
-    await _testMarkedContent('''
+    await _testMarkedContent(
+      '''
 class /*[0*/Aaa/*0]*/ {
   /*[1*/Aaa/*1]*/.new();
 }
@@ -223,11 +265,14 @@
   /*[2*/Aaa/*2]*/ a = Aaa();
   /*[3*/Aaa/*3]*/ b = /*[4*/Aaa/*4]*/.new();
 }
-''');
+''',
+      kinds: {0: .Write, 1: .Read, 2: .Read, 3: .Read, 4: .Read},
+    );
   }
 
   Future<void> test_constructor_secondary_newNamed() async {
-    await _testMarkedContent('''
+    await _testMarkedContent(
+      '''
 class Aaa {
   new /*[0*/named/*0]*/();
 }
@@ -236,11 +281,14 @@
   Aaa value = Aaa./*[1*/named/*1]*/();
   Aaa./*[2*/named/*2]*/();
 }
-''');
+''',
+      kinds: {0: .Write, 1: .Read, 2: .Read},
+    );
   }
 
   Future<void> test_dartCode_issue5369_field() async {
-    await _testMarkedContent('''
+    await _testMarkedContent(
+      '''
 class A {
   var /*[0*/a/*0]*/ = [''].where((_) => true).toList();
   List<String> f() {
@@ -249,11 +297,14 @@
 }
 
 var a; // Not a reference
-''');
+''',
+      kinds: {0: .Write, 1: .Read},
+    );
   }
 
   Future<void> test_dartCode_issue5369_functionType() async {
-    await _testMarkedContent('''
+    await _testMarkedContent(
+      '''
 class A {
   String m({ required String Function(String input) /*[0*/f/*0]*/ }) {
     return /*[1*/f/*1]*/('');
@@ -261,11 +312,14 @@
 }
 
 var f; // Not a reference
-''');
+''',
+      kinds: {0: .Write, 1: .Read},
+    );
   }
 
   Future<void> test_dartCode_issue5369_localVariable() async {
-    await _testMarkedContent('''
+    await _testMarkedContent(
+      '''
 class A {
   List<String> f() {
     var /*[0*/a/*0]*/ = [''].where((_) => true).toList();
@@ -274,18 +328,24 @@
 }
 
 var a; // Not a reference
-''');
+''',
+      kinds: {0: .Write, 1: .Read},
+    );
   }
 
   Future<void> test_dartCode_issue5369_topLevelVariable() async {
-    await _testMarkedContent('''
+    await _testMarkedContent(
+      '''
 var /*[0*/a/*0]*/ = [''].where((_) => true).toList();
 var b = /*[1*/a/*1]*/;
-''');
+''',
+      kinds: {0: .Write, 1: .Read},
+    );
   }
 
   Future<void> test_dotShorthand_class() async {
-    await _testMarkedContent('''
+    await _testMarkedContent(
+      '''
 A topA = ./*[0*/a/*0]*/;
 class A {
   static A get /*[1*/a/*1]*/ => A();
@@ -296,11 +356,14 @@
   fn(./*[3*/a/*3]*/);
   A aa = A./*[4*/a/*4]*/;
 }
-''');
+''',
+      kinds: {0: .Read, 1: .Write, 2: .Read, 3: .Read, 4: .Read},
+    );
   }
 
   Future<void> test_dotShorthand_enum() async {
-    await _testMarkedContent('''
+    await _testMarkedContent(
+      '''
 const A constA = ./*[0*/a/*0]*/;
 enum A { /*[1*/a/*1]*/ }
 void fn(A a) => print(a);
@@ -309,11 +372,14 @@
   fn(./*[3*/a/*3]*/);
   A aa = A./*[4*/a/*4]*/;
 }
-''');
+''',
+      kinds: {0: .Read, 1: .Write, 2: .Read, 3: .Read, 4: .Read},
+    );
   }
 
   Future<void> test_dotShorthand_extensionType() async {
-    await _testMarkedContent('''
+    await _testMarkedContent(
+      '''
 A topA = ./*[0*/a/*0]*/;
 extension type A(int x) {
   static A get /*[1*/a/*1]*/ => A(1);
@@ -324,11 +390,14 @@
   fn(./*[3*/a/*3]*/);
   A aa = A./*[4*/a/*4]*/;
 }
-''');
+''',
+      kinds: {0: .Read, 1: .Write, 2: .Read, 3: .Read, 4: .Read},
+    );
   }
 
   Future<void> test_enum() async {
-    await _testMarkedContent('''
+    await _testMarkedContent(
+      '''
 enum /*[0*/E/*0]*/ {
   v;
 }
@@ -336,11 +405,14 @@
 void f(/*[1*/E/*1]*/ e) {
   /*[2*/E/*2]*/.v;
 }
-''');
+''',
+      kinds: {0: .Write, 1: .Read, 2: .Read},
+    );
   }
 
   Future<void> test_enum_constant() async {
-    await _testMarkedContent('''
+    await _testMarkedContent(
+      '''
 enum E {
   /*[0*/v/*0]*/;
 }
@@ -348,11 +420,14 @@
 void f() {
   E./*[1*/v/*1]*/;
 }
-''');
+''',
+      kinds: {0: .Write, 1: .Read},
+    );
   }
 
   Future<void> test_enum_field() async {
-    await _testMarkedContent('''
+    await _testMarkedContent(
+      '''
 enum E {
   v;
   final int /*[0*/foo/*0]*/ = 0;
@@ -361,11 +436,14 @@
 void f(E e) {
   e./*[1*/foo/*1]*/;
 }
-''');
+''',
+      kinds: {0: .Write, 1: .Read},
+    );
   }
 
   Future<void> test_enum_getter() async {
-    await _testMarkedContent('''
+    await _testMarkedContent(
+      '''
 enum E {
   v;
   int get /*[0*/foo/*0]*/ => 0;
@@ -374,11 +452,14 @@
 void f(E e) {
   e./*[1*/foo/*1]*/;
 }
-''');
+''',
+      kinds: {0: .Write, 1: .Read},
+    );
   }
 
   Future<void> test_enum_method() async {
-    await _testMarkedContent('''
+    await _testMarkedContent(
+      '''
 enum E {
   v;
   void /*[0*/foo/*0]*/() {}
@@ -387,7 +468,9 @@
 void f(E e) {
   e./*[1*/foo/*1]*/();
 }
-''');
+''',
+      kinds: {0: .Write, 1: .Read},
+    );
   }
 
   Future<void> test_enum_setter() async {
@@ -400,7 +483,7 @@
 void f(E e) {
   e./*[1*/foo/*1]*/ = 0;
 }
-''');
+''', allOfKind: .Write);
   }
 
   Future<void> test_extension() async {
@@ -412,11 +495,12 @@
 extension /*[1*/E/*1]*/<ThisType> on ThisType {
   ThisType get self => this;
 }
-''');
+''', allOfKind: .Write);
   }
 
   Future<void> test_extensionMember() async {
-    await _testMarkedContent('''
+    await _testMarkedContent(
+      '''
 extension on int {
   int get /*[0*/foo/*0]*/ => 0;
 }
@@ -424,11 +508,14 @@
 void f(int v) {
   v./*[1*/foo/*1]*/;
 }
-''');
+''',
+      kinds: {0: .Write, 1: .Read},
+    );
   }
 
   Future<void> test_extensionMember_differentiation() async {
-    await _testMarkedContent('''
+    await _testMarkedContent(
+      '''
 extension on String {
   int get foo => 0;
 }
@@ -441,29 +528,38 @@
   v./*[1*/foo/*1]*/;
   s.foo;
 }
-''');
+''',
+      kinds: {0: .Write, 1: .Read},
+    );
   }
 
   Future<void> test_extensionType() async {
-    await _testMarkedContent('''
+    await _testMarkedContent(
+      '''
 extension type /*[0*/E/*0]*/(int it) {}
 
 void f(/*[1*/E/*1]*/ e) {}
-''');
+''',
+      kinds: {0: .Write, 1: .Read},
+    );
   }
 
   Future<void> test_extensionType_constructor_primary() async {
-    await _testMarkedContent('''
+    await _testMarkedContent(
+      '''
 extension type E./*[0*/named/*0]*/(int it) {}
 
 void f() {
   E./*[1*/named/*1]*/(0);
 }
-''');
+''',
+      kinds: {0: .Write, 1: .Read},
+    );
   }
 
   Future<void> test_extensionType_constructor_secondary() async {
-    await _testMarkedContent('''
+    await _testMarkedContent(
+      '''
 extension type E(int it) {
   E./*[0*/named/*0]*/() : this(0);
 }
@@ -471,11 +567,14 @@
 void f() {
   E./*[1*/named/*1]*/();
 }
-''');
+''',
+      kinds: {0: .Write, 1: .Read},
+    );
   }
 
   Future<void> test_extensionType_getter() async {
-    await _testMarkedContent('''
+    await _testMarkedContent(
+      '''
 extension type E(int it) {
   int get /*[0*/foo/*0]*/ => 0;
 }
@@ -483,11 +582,14 @@
 void f(E e) {
   e./*[1*/foo/*1]*/;
 }
-''');
+''',
+      kinds: {0: .Write, 1: .Read},
+    );
   }
 
   Future<void> test_extensionType_method() async {
-    await _testMarkedContent('''
+    await _testMarkedContent(
+      '''
 extension type E(int it) {
   void /*[0*/foo/*0]*/() {}
 }
@@ -495,7 +597,9 @@
 void f(E e) {
   e./*[1*/foo/*1]*/();
 }
-''');
+''',
+      kinds: {0: .Write, 1: .Read},
+    );
   }
 
   Future<void> test_extensionType_setter() async {
@@ -507,11 +611,12 @@
 void f(E e) {
   e./*[1*/foo/*1]*/ = 0;
 }
-''');
+''', allOfKind: .Write);
   }
 
   Future<void> test_field() async {
-    await _testMarkedContent('''
+    await _testMarkedContent(
+      '''
 class A {
   int /*[0*/fff/*0]*/;
   A(this./*[1*/fff/*1]*/);
@@ -520,7 +625,9 @@
     print(/*[3*/fff/*3]*/);
   }
 }
-''');
+''',
+      kinds: {0: .Write, 1: .Write, 2: .Write, 3: .Read},
+    );
   }
 
   Future<void> test_field_unresolved() async {
@@ -535,49 +642,64 @@
   }
 
   Future<void> test_forInLoop() async {
-    await _testMarkedContent('''
+    await _testMarkedContent(
+      '''
 void f() {
   for (final /*[0*/x/*0]*/ in []) {
     /*[1*/x/*1]*/;
   }
 }
-''');
+''',
+      kinds: {0: .Write, 1: .Read},
+    );
   }
 
   Future<void> test_formalParameters_closure() async {
-    await _testMarkedContent('''
+    await _testMarkedContent(
+      '''
 void f(void Function(int) _) {}
 
 void g() => f((/*[0*/variable/*0]*/) {
 print(/*[1*/variable/*1]*/);
 });
-''');
+''',
+      kinds: {0: .Write, 1: .Read},
+    );
   }
 
   Future<void> test_formalParameters_function() async {
-    await _testMarkedContent('''
+    await _testMarkedContent(
+      '''
 void f(int /*[0*/parameter/*0]*/) {
   print(/*[1*/parameter/*1]*/);
 }
-''');
+''',
+      kinds: {0: .Write, 1: .Read},
+    );
   }
 
   Future<void> test_formalParameters_method() async {
-    await _testMarkedContent('''
+    await _testMarkedContent(
+      '''
 class C {
   void m(int /*[0*/parameter/*0]*/) {
     print(/*[1*/parameter/*1]*/);
   }
 }
-''');
+''',
+      kinds: {0: .Write, 1: .Read},
+    );
   }
 
   Future<void> test_functions() async {
-    await _testMarkedContent('''
+    await _testMarkedContent(
+      '''
 /*[0*/main/*0]*/() {
   /*[1*/main/*1]*/();
 }
-''');
+''',
+      kinds: {0: .Write, 1: .Read},
+    );
   }
 
   Future<void> test_hierarchy_method_extends() async {
@@ -590,11 +712,12 @@
   @override
   void /*[1*/a/*1]*/() {}
 }
-''');
+''', allOfKind: .Write);
   }
 
   Future<void> test_hierarchy_method_extends_implements_fromLeaf() async {
-    await _testMarkedContent('''
+    await _testMarkedContent(
+      '''
 abstract class A {
   void /*[0*/a/*0]*/();
 }
@@ -613,11 +736,14 @@
   i./*[4*/a/*4]*/();
   b./*[5*/a/*5]*/();
 }
-''');
+''',
+      kinds: {0: .Write, 1: .Write, 2: .Write, 3: .Read, 4: .Read, 5: .Read},
+    );
   }
 
   Future<void> test_hierarchy_method_extends_implements_fromRoot() async {
-    await _testMarkedContent('''
+    await _testMarkedContent(
+      '''
 abstract class A {
   void /*[0*/^a/*0]*/();
 }
@@ -636,11 +762,14 @@
   i.a();
   b./*[3*/a/*3]*/();
 }
-''');
+''',
+      kinds: {0: .Write, 1: .Write, 2: .Read, 3: .Read},
+    );
   }
 
   Future<void> test_hierarchy_method_extends_with_fromLeaf() async {
-    await _testMarkedContent('''
+    await _testMarkedContent(
+      '''
 abstract class A {
   void /*[0*/a/*0]*/();
 }
@@ -659,11 +788,14 @@
   m./*[4*/a/*4]*/();
   b./*[5*/a/*5]*/();
 }
-''');
+''',
+      kinds: {0: .Write, 1: .Write, 2: .Write, 3: .Read, 4: .Read, 5: .Read},
+    );
   }
 
   Future<void> test_hierarchy_method_extends_with_fromRoot() async {
-    await _testMarkedContent('''
+    await _testMarkedContent(
+      '''
 abstract class A {
   void /*[0*/a^/*0]*/();
 }
@@ -682,11 +814,14 @@
   m.a();
   b./*[3*/a/*3]*/();
 }
-''');
+''',
+      kinds: {0: .Write, 1: .Write, 2: .Read, 3: .Read},
+    );
   }
 
   Future<void> test_hierarchy_method_extends_with_implements_fromLeaf() async {
-    await _testMarkedContent('''
+    await _testMarkedContent(
+      '''
 abstract class A {
   void /*[0*/a/*0]*/();
 }
@@ -710,11 +845,23 @@
   i./*[6*/a/*6]*/();
   b./*[7*/a/*7]*/();
 }
-''');
+''',
+      kinds: {
+        0: .Write,
+        1: .Write,
+        2: .Write,
+        3: .Write,
+        4: .Read,
+        5: .Read,
+        6: .Read,
+        7: .Read,
+      },
+    );
   }
 
   Future<void> test_hierarchy_method_extends_with_implements_fromRoot() async {
-    await _testMarkedContent('''
+    await _testMarkedContent(
+      '''
 abstract class A {
   void /*[0*/^a/*0]*/();
 }
@@ -738,7 +885,9 @@
   i.a();
   b./*[3*/a/*3]*/();
 }
-''');
+''',
+      kinds: {0: .Write, 1: .Write, 2: .Read, 3: .Read},
+    );
   }
 
   Future<void> test_hierarchy_method_implements() async {
@@ -751,7 +900,7 @@
   @override
   void /*[1*/a/*1]*/() {}
 }
-''');
+''', allOfKind: .Write);
   }
 
   Future<void> test_hierarchy_method_with() async {
@@ -764,11 +913,12 @@
   @override
   void /*[1*/a/*1]*/() {}
 }
-''');
+''', allOfKind: .Write);
   }
 
   Future<void> test_hierarchy_method_with_implements_fromLeaf() async {
-    await _testMarkedContent('''
+    await _testMarkedContent(
+      '''
 mixin M {
   void /*[0*/a/*0]*/() {} // Included because we started at B.a
 }
@@ -787,11 +937,14 @@
   i./*[4*/a/*4]*/();
   b./*[5*/a/*5]*/();
 }
-''');
+''',
+      kinds: {0: .Write, 1: .Write, 2: .Write, 3: .Read, 4: .Read, 5: .Read},
+    );
   }
 
   Future<void> test_hierarchy_method_with_implements_fromRoot() async {
-    await _testMarkedContent('''
+    await _testMarkedContent(
+      '''
 mixin M {
   void /*[0*/^a/*0]*/() {}
 }
@@ -810,7 +963,9 @@
   i.a();
   b./*[3*/a/*3]*/();
 }
-''');
+''',
+      kinds: {0: .Write, 1: .Write, 2: .Read, 3: .Read},
+    );
   }
 
   Future<void> test_invalidLineByOne() async {
@@ -853,7 +1008,7 @@
     }
   }
 }
-''');
+''', allOfKind: .Text);
   }
 
   Future<void> test_keyword_loopWithSwitch_switchExit() async {
@@ -872,7 +1027,7 @@
     }
   }
 }
-''');
+''', allOfKind: .Text);
   }
 
   Future<void> test_keyword_return_function() async {
@@ -881,7 +1036,7 @@
   if (true) /*[0*/return/*0]*/ 1;
   /*[1*/return/*1]*/ 2;
 }
-''');
+''', allOfKind: .Text);
   }
 
   Future<void> test_keyword_return_insideLoop() async {
@@ -899,7 +1054,7 @@
   }
   /*[2*/return/*2]*/ 2;
 }
-''');
+''', allOfKind: .Text);
   }
 
   Future<void> test_keyword_return_method() async {
@@ -910,7 +1065,7 @@
     /*[1*/return/*1]*/ 2;
   }
 }
-''');
+''', allOfKind: .Text);
   }
 
   Future<void> test_keyword_return_nestedClosure() async {
@@ -928,7 +1083,7 @@
   };
   return 1;
 }
-''');
+''', allOfKind: .Text);
   }
 
   Future<void> test_keyword_return_nestedFunction() async {
@@ -943,7 +1098,7 @@
   }
   return 1;
 }
-''');
+''', allOfKind: .Text);
   }
 
   Future<void> test_keyword_yield_asyncGenerator() async {
@@ -962,7 +1117,7 @@
   yield 1;
   yield* Stream.value(0);
 }
-''');
+''', allOfKind: .Text);
   }
 
   Future<void> test_keyword_yield_syncGenerator() async {
@@ -981,17 +1136,20 @@
   yield 1;
   yield* Iterable.empty();
 }
-''');
+''', allOfKind: .Text);
   }
 
   Future<void> test_localVariable() async {
-    await _testMarkedContent('''
+    await _testMarkedContent(
+      '''
 void f() {
   var /*[0*/foo/*0]*/ = 1;
   print(/*[1*/foo/*1]*/);
   /*[2*/foo/*2]*/ = 2;
 }
-''');
+''',
+      kinds: {0: .Write, 1: .Read, 2: .Write},
+    );
   }
 
   Future<void> test_member_field() async {
@@ -1006,11 +1164,12 @@
   a./*[2*/fff/*2]*/ = 1;
   b./*[3*/fff/*3]*/ = '';
 }
-''');
+''', allOfKind: .Write);
   }
 
   Future<void> test_member_method() async {
-    await _testMarkedContent('''
+    await _testMarkedContent(
+      '''
 class A<T> {
   T /*[0*/mmm/*0]*/() => throw 0;
 }
@@ -1020,26 +1179,34 @@
   a./*[1*/mmm/*1]*/();
   b./*[2*/mmm/*2]*/();
 }
-''');
+''',
+      kinds: {0: .Write, 1: .Read, 2: .Read},
+    );
   }
 
   Future<void> test_method_underscore() async {
-    await _testMarkedContent('''
+    await _testMarkedContent(
+      '''
 class C {
   /*[0*/_/*0]*/() {
     /*[1*/_/*1]*/();
   }
 }
-''');
+''',
+      kinds: {0: .Write, 1: .Read},
+    );
   }
 
   Future<void> test_mixin() async {
-    await _testMarkedContent('''
+    await _testMarkedContent(
+      '''
 mixin /*[0*/A/*0]*/ {
   void aaa() {}
 }
 class B with /*[1*/A/*1]*/ {}
-''');
+''',
+      kinds: {0: .Write, 1: .Read},
+    );
   }
 
   Future<void> test_nonDartFile() async {
@@ -1065,7 +1232,7 @@
 void f() {
   /*[0*/print/*0]*/('');
 }
-''');
+''', allOfKind: .Read);
   }
 
   Future<void> test_onlySelf_wildcard() async {
@@ -1073,11 +1240,12 @@
 void f() {
   var /*[0*/_/*0]*/ = '';
 }
-''');
+''', allOfKind: .Write);
   }
 
   Future<void> test_parameter_named() async {
-    await _testMarkedContent('''
+    await _testMarkedContent(
+      '''
 void f(int aaa, int bbb, {int? /*[0*/ccc/*0]*/, int? ddd}) {
   /*[1*/ccc/*1]*/;
   ddd;
@@ -1086,34 +1254,65 @@
 void g() {
   f(0, 1, /*[2*/ccc/*2]*/: 2, ddd: 3);
 }
-''');
+''',
+      kinds: {0: .Write, 1: .Read, 2: .Write},
+    );
   }
 
   Future<void> test_parameter_privateNamed() async {
     await _testMarkedContent('''
 class C {
   int? /*[0*/_aaa/*0]*/;
-  C({this./*[1*/_aaa/*1]*/});
+  C({this./*[1*/_aaa^/*1]*/});
 }
 
 void f() {
   C(/*[2*/aaa/*2]*/: 123);
 }
-''');
+''', allOfKind: .Write);
+  }
+
+  Future<void> test_parameter_privateNamed_argument() async {
+    await _testMarkedContent('''
+class C {
+  int? _aaa;
+  C({this./*[0*/_aaa/*0]*/});
+}
+
+void f() {
+  C(/*[1*/aaa^/*1]*/: 123);
+}
+''', allOfKind: .Write);
+  }
+
+  Future<void> test_parameter_privateNamed_field() async {
+    await _testMarkedContent('''
+class C {
+  int? /*[0*/_aaa^/*0]*/;
+  C({this./*[1*/_aaa/*1]*/});
+}
+
+void f() {
+  C(aaa: 123);
+}
+''', allOfKind: .Write);
   }
 
   Future<void> test_parameter_wildcard() async {
     await _testMarkedContent('''
 void f(int /*[0*/_/*0]*/) {}
-''');
+''', allOfKind: .Write);
   }
 
   Future<void> test_pattern_assignment() async {
-    await _testMarkedContent('''
+    await _testMarkedContent(
+      '''
 void f(String /*[0*/a/*0]*/, String b) {
   (b, /*[1*/a/*1]*/) = (/*[2*/a/*2]*/, b);
 }
-''');
+''',
+      kinds: {0: .Write, 1: .Write, 2: .Read},
+    );
   }
 
   Future<void> test_pattern_assignment_list() async {
@@ -1121,7 +1320,7 @@
 void f(List<int> x, num /*[0*/a/*0]*/) {
   [/*[1*/a/*1]*/] = x;
 }
-''');
+''', allOfKind: .Write);
   }
 
   Future<void> test_pattern_cast_typeName() async {
@@ -1130,20 +1329,24 @@
   var (i as int, s as /*[2*/String/*2]*/) = record;
   return s;
 }
-''');
+''', allOfKind: .Read);
   }
 
   Future<void> test_pattern_cast_variable() async {
-    await _testMarkedContent('''
+    await _testMarkedContent(
+      '''
 void f((num, String) record) {
   var (i as int, /*[0*/s/*0]*/ as String) = record;
   print(/*[1*/s/*1]*/);
 }
-''');
+''',
+      kinds: {0: .Write, 1: .Read},
+    );
   }
 
   Future<void> test_pattern_map() async {
-    await _testMarkedContent('''
+    await _testMarkedContent(
+      '''
 void f(x) {
   switch (x) {
     case {0: String /*[0*/a/*0]*/}:
@@ -1151,7 +1354,9 @@
       break;
   }
 }
-''');
+''',
+      kinds: {0: .Write, 1: .Read},
+    );
   }
 
   Future<void> test_pattern_map_typeArguments() async {
@@ -1164,31 +1369,38 @@
   }
   return '';
 }
-''');
+''', allOfKind: .Read);
   }
 
   Future<void> test_pattern_nullAssert() async {
-    await _testMarkedContent('''
+    await _testMarkedContent(
+      '''
 void f((int?, int?) position) {
   var (x!, /*[0*/y/*0]*/!) = position;
   print(/*[1*/y/*1]*/);
 }
-''');
+''',
+      kinds: {0: .Write, 1: .Read},
+    );
   }
 
   Future<void> test_pattern_nullCheck() async {
-    await _testMarkedContent('''
+    await _testMarkedContent(
+      '''
 void f(String? maybeString) {
   switch (maybeString) {
     case var /*[0*/s/*0]*/?:
       print(/*[1*/s/*1]*/);
   }
 }
-''');
+''',
+      kinds: {0: .Write, 1: .Read},
+    );
   }
 
   Future<void> test_pattern_object_destructure() async {
-    await _testMarkedContent('''
+    await _testMarkedContent(
+      '''
 void f() {
   final MapEntry(:/*[0*/key/*0]*/) = const MapEntry<String, int>('a', 1);
 
@@ -1196,7 +1408,9 @@
     /*[2*/key/*2]*/;
   }
 }
-''');
+''',
+      kinds: {0: .Write, 1: .Write, 2: .Read},
+    );
   }
 
   Future<void> test_pattern_object_destructure_getter() async {
@@ -1208,11 +1422,12 @@
 void f() {
   final A(:/*[1*/key/*1]*/) = A();
 }
-''');
+''', allOfKind: .Write);
   }
 
   Future<void> test_pattern_object_destructure_variable() async {
-    await _testMarkedContent('''
+    await _testMarkedContent(
+      '''
 class A {
   String? /*[0*/key/*0]*/;
 }
@@ -1221,7 +1436,9 @@
   final A(:/*[1*/k^ey/*1]*/) = A();
   /*[2*/key/*2]*/;
 }
-''');
+''',
+      kinds: {0: .Write, 1: .Write, 2: .Read},
+    );
   }
 
   Future<void> test_pattern_object_fieldName() async {
@@ -1236,11 +1453,12 @@
 class Square extends Shape {
   double get /*[1*/length/*1]*/ => 0;
 }
-''');
+''', allOfKind: .Write);
   }
 
   Future<void> test_pattern_object_typeName() async {
-    await _testMarkedContent('''
+    await _testMarkedContent(
+      '''
 double calculateArea(Shape shape) =>
   switch (shape) {
     /*[0*/Square/*0]*/(length: var l) => l * l,
@@ -1251,11 +1469,14 @@
 class /*[1*/Square/*1]*/ extends Shape {
   double get length => 0;
 }
-''');
+''',
+      kinds: {0: .Read, 1: .Write},
+    );
   }
 
   Future<void> test_pattern_object_variable() async {
-    await _testMarkedContent('''
+    await _testMarkedContent(
+      '''
 double calculateArea(Shape shape) =>
   switch (shape) {
     Square(length: var /*[0*/l/*0]*/) => /*[1*/l/*1]*/ * /*[2*/l/*2]*/,
@@ -1266,7 +1487,9 @@
 class Square extends Shape {
   double get length => 0;
 }
-''');
+''',
+      kinds: {0: .Write, 1: .Read, 2: .Read},
+    );
   }
 
   Future<void> test_pattern_record_variable() async {
@@ -1274,11 +1497,12 @@
 void f(({int foo}) x, num /*[0*/a/*0]*/) {
   (foo: /*[1*/a/*1]*/,) = x;
 }
-''');
+''', allOfKind: .Write);
   }
 
   Future<void> test_pattern_relational_variable() async {
-    await _testMarkedContent('''
+    await _testMarkedContent(
+      '''
 String f(int char) {
   const /*[0*/zero/*0]*/ = 0;
   return switch (char) {
@@ -1286,11 +1510,14 @@
     _ => '',
   };
 }
-''');
+''',
+      kinds: {0: .Write, 1: .Read},
+    );
   }
 
   Future<void> test_patternVariable_ifCase_logicalOr() async {
-    await _testMarkedContent('''
+    await _testMarkedContent(
+      '''
 void f(Object? x) {
   if (x case int /*[0*/test/*0]*/ || [int /*[1*/test/*1]*/] when /*[2*/test/*2]*/ > 0) {
     /*[3*/test/*3]*/;
@@ -1298,7 +1525,9 @@
     /*[5*/test/*5]*/ += 2;
   }
 }
-''');
+''',
+      kinds: {0: .Write, 1: .Write, 2: .Read, 3: .Read, 4: .Write, 5: .Write},
+    );
   }
 
   Future<void> test_prefix() async {
@@ -1316,7 +1545,7 @@
 void foo() {}
 
 /*[4*/p/*4]*/.A? a;
-''');
+''', allOfKind: .Read);
   }
 
   Future<void> test_prefix_null() async {
@@ -1327,24 +1556,27 @@
     await _testMarkedContent('''
 import 'dart:core' as /*[0*/core/*0]*/;
 void f(prefix.A? _, /*[1*/core/*1]*/.int _) {}
-''');
+''', allOfKind: .Read);
   }
 
   Future<void> test_prefix_wildcard() async {
     // Ensure no crash.
     await _testMarkedContent('''
 import 'dart:io' as /*[0*/_/*0]*/;
-''');
+''', allOfKind: .Read);
   }
 
   Future<void> test_prefixed() async {
-    await _testMarkedContent('''
+    await _testMarkedContent(
+      '''
 import '' as p;
 
 class /*[0*/A/*0]*/ {}
 
 p./*[1*/A/*1]*/? a;
-''');
+''',
+      kinds: {0: .Write, 1: .Read},
+    );
   }
 
   /// The body/this keyword isn't an occurrence of anything.
@@ -1358,6 +1590,68 @@
 ''');
   }
 
+  Future<void> test_primaryConstructor_declaringParameter_declaration() async {
+    await _testMarkedContent(
+      '''
+/// This references [/*[0*/i/*0]*/].
+class C({var int? /*[1*/i^/*1]*/});
+
+void f(int? parameter) {
+  var c = C(/*[2*/i/*2]*/: parameter);
+  C(/*[3*/i/*3]*/: c./*[4*/i/*4]*/);
+}
+''',
+      kinds: {0: .Read, 1: .Write, 2: .Write, 3: .Write, 4: .Read},
+    );
+  }
+
+  Future<void>
+  test_primaryConstructor_declaringParameter_private_declaration() async {
+    await _testMarkedContent(
+      r'''
+/// This references [/*[0*/_i/*0]*/].
+class C({var int? /*[1*/_i^/*1]*/}) {
+  String toString() => '${/*[2*/_i/*2]*/}';
+}
+
+void f(int? parameter) {
+  var _ = C(/*[3*/i/*3]*/: parameter);
+}
+''',
+      kinds: {0: .Read, 1: .Write, 2: .Read, 3: .Write},
+    );
+  }
+
+  Future<void> test_primaryConstructor_declaringPrivateParameter_field() async {
+    await _testMarkedContent(
+      r'''
+/// This references [/*[0*/_i^/*0]*/].
+class C({var int? /*[1*/_i/*1]*/}) {
+  String toString() => '${/*[2*/_i/*2]*/}';
+}
+
+void f(int? parameter) {
+  var _ = C(i: parameter);
+}
+''',
+      kinds: {0: .Read, 1: .Write, 2: .Read},
+    );
+  }
+
+  Future<void>
+  test_primaryConstructor_declaringPrivateParameter_parameter() async {
+    await _testMarkedContent(r'''
+/// This references [_i].
+class C({var int? /*[0*/_i/*0]*/}) {
+  String toString() => '${_i}';
+}
+
+void f(int? parameter) {
+  var _ = C(/*[1*/i^/*1]*/: parameter);
+}
+''', allOfKind: .Write);
+  }
+
   /// The body/this keyword isn't an occurrence of anything.
   Future<void> test_primaryConstructor_named_body() async {
     await _testMarkedContent('''
@@ -1370,33 +1664,42 @@
   }
 
   Future<void> test_primaryConstructor_named_constructorName() async {
-    await _testMarkedContent('''
+    await _testMarkedContent(
+      '''
 class Aaa./*[0*/named/*0]*/() {
   this {}
 }
 
 Aaa a = Aaa./*[1*/named/*1]*/();
-''');
+''',
+      kinds: {0: .Write, 1: .Read},
+    );
   }
 
   Future<void> test_primaryConstructor_named_typeName() async {
-    await _testMarkedContent('''
+    await _testMarkedContent(
+      '''
 class /*[0*/Aaa/*0]*/.named() {
   this {}
 }
 
 /*[1*/Aaa/*1]*/ a = /*[2*/Aaa/*2]*/.named();
-''');
+''',
+      kinds: {0: .Write, 1: .Read, 2: .Read},
+    );
   }
 
   Future<void> test_primaryConstructor_typeName() async {
-    await _testMarkedContent('''
+    await _testMarkedContent(
+      '''
 class /*[0*/Aaa/*0]*/() {
   this {}
 }
 
 /*[1*/Aaa/*1]*/ a = Aaa();
-''');
+''',
+      kinds: {0: .Write, 1: .Read},
+    );
   }
 
   Future<void> test_primaryConstructor_typeName_constructorInvocation() async {
@@ -1406,7 +1709,7 @@
 }
 
 Aaa a = /*[0*/Aaa/*0]*/();
-''');
+''', allOfKind: .Read);
   }
 
   Future<void> test_recordType_typeName() async {
@@ -1414,11 +1717,12 @@
 /*[0*/double/*0]*/ f((/*[1*/double/*1]*/, /*[2*/double/*2]*/) param) {
   return 0.0;
 }
-''');
+''', allOfKind: .Read);
   }
 
   Future<void> test_shadow_inner() async {
-    await _testMarkedContent('''
+    await _testMarkedContent(
+      '''
 void f() {
   var foo = 1;
   func() {
@@ -1426,11 +1730,14 @@
     print(/*[1*/foo/*1]*/);
   }
 }
-''');
+''',
+      kinds: {0: .Write, 1: .Read},
+    );
   }
 
   Future<void> test_shadow_outer() async {
-    await _testMarkedContent('''
+    await _testMarkedContent(
+      '''
 void f() {
   var /*[0*/foo/*0]*/ = 1;
   func() {
@@ -1439,11 +1746,14 @@
   }
   print(/*[1*/foo/*1]*/);
 }
-''');
+''',
+      kinds: {0: .Write, 1: .Read},
+    );
   }
 
   Future<void> test_superFormalParameter_requiredPositional() async {
-    await _testMarkedContent('''
+    await _testMarkedContent(
+      '''
 class A {
   A(int x);
 }
@@ -1453,28 +1763,36 @@
 
   B(super./*[0*/x/*0]*/) : y = /*[1*/x/*1]*/ * 2;
 }
-''');
+''',
+      kinds: {0: .Write, 1: .Read},
+    );
   }
 
   Future<void> test_topLevelVariable() async {
-    await _testMarkedContent('''
+    await _testMarkedContent(
+      '''
 String /*[0*/foo/*0]*/ = 'bar';
 void f() {
   print(/*[1*/foo/*1]*/);
   /*[2*/foo/*2]*/ = '';
 }
-''');
+''',
+      kinds: {0: .Write, 1: .Read, 2: .Write},
+    );
   }
 
   Future<void> test_topLevelVariable_underscore() async {
-    await _testMarkedContent('''
+    await _testMarkedContent(
+      '''
 String /*[0*/_/*0]*/ = 'bar';
 void f(int _) {
   int _ = 1;
   print(/*[1*/_/*1]*/);
   /*[2*/_/*2]*/ = '';
 }
-''');
+''',
+      kinds: {0: .Write, 1: .Read, 2: .Write},
+    );
   }
 
   Future<void> test_type_class() async {
@@ -1485,11 +1803,12 @@
   /*[2*/int/*2]*/ c = 3;
 }
 /*[3*/int/*3]*/ VVV = 4;
-''');
+''', allOfKind: .Read);
   }
 
   Future<void> test_type_class_constructors() async {
-    await _testMarkedContent('''
+    await _testMarkedContent(
+      '''
 class /*[0*/A/*0]*/ {
   A(); // Default constructor is own entity
   /*[1*/A/*1]*/.named();
@@ -1498,11 +1817,14 @@
 /*[2*/A/*2]*/ a = A(); // Default constructor is own entity
 var b = /*[3*/A/*3]*/.new();
 var c = /*[4*/A/*4]*/.new;
-''');
+''',
+      kinds: {0: .Write, 1: .Read, 2: .Read, 3: .Read, 4: .Read},
+    );
   }
 
   Future<void> test_type_class_constructors2() async {
-    await _testMarkedContent('''
+    await _testMarkedContent(
+      '''
 class /*[0*/A/*0]*/ {
   new(); // Default constructor is own entity
   /*[1*/A/*1]*/.named();
@@ -1511,13 +1833,16 @@
 /*[2*/A/*2]*/ a = A(); // Default constructor is own entity
 var b = /*[3*/A/*3]*/.new();
 var c = /*[4*/A/*4]*/.new;
-''');
+''',
+      kinds: {0: .Write, 1: .Read, 2: .Read, 3: .Read, 4: .Read},
+    );
   }
 
   /// The type name in default constructors are their own entity and not
   /// part of the type name.
   Future<void> test_type_class_constructors_default() async {
-    await _testMarkedContent('''
+    await _testMarkedContent(
+      '''
 class A {
   /*[0*/A/*0]*/();
   A.named();
@@ -1526,14 +1851,19 @@
 A a = /*[1*/A/*1]*/();
 var b = A./*[2*/new/*2]*/();
 var c = A./*[3*/new/*3]*/;
-''');
+''',
+      kinds: {0: .Write, 1: .Read, 2: .Read, 3: .Read},
+    );
   }
 
   Future<void> test_type_class_definition() async {
-    await _testMarkedContent('''
+    await _testMarkedContent(
+      '''
 class /*[0*/A/*0]*/ {}
 /*[1*/A/*1]*/? a;
-''');
+''',
+      kinds: {0: .Write, 1: .Read},
+    );
   }
 
   Future<void> test_type_dynamic() async {
@@ -1543,7 +1873,7 @@
   /*[1*/dynamic/*1]*/ b = 2;
 }
 /*[2*/dynamic/*2]*/ V = 3;
-''');
+''', allOfKind: .Read);
   }
 
   Future<void> test_type_void() async {
@@ -1553,87 +1883,120 @@
   }
 
   Future<void> test_typeAlias_class() async {
-    await _testMarkedContent('''
+    await _testMarkedContent(
+      '''
 class MyClass {}
 mixin MyMixin {}
 class /*[0*/MyAlias/*0]*/ = MyClass with MyMixin;
 /*[1*/MyAlias/*1]*/? a;
-''');
+''',
+      kinds: {0: .Write, 1: .Read},
+    );
   }
 
   Future<void> test_typeAlias_function() async {
-    await _testMarkedContent('''
+    await _testMarkedContent(
+      '''
 typedef /*[0*/myFunc/*0]*/();
 /*[1*/myFunc/*1]*/? f;
-''');
+''',
+      kinds: {0: .Write, 1: .Read},
+    );
   }
 
   Future<void> test_typeAlias_generic() async {
-    await _testMarkedContent('''
+    await _testMarkedContent(
+      '''
 typedef /*[0*/TD/*0]*/ = String;
 
 /*[1*/TD/*1]*/? a;
-''');
+''',
+      kinds: {0: .Write, 1: .Read},
+    );
   }
 
   Future<void> test_typeParameter_class() async {
-    await _testMarkedContent('''
+    await _testMarkedContent(
+      '''
 abstract class A</*[0*/ThisType/*0]*/> {
   /*[1*/ThisType/*1]*/ f();
 }
-''');
+''',
+      kinds: {0: .Write, 1: .Read},
+    );
   }
 
   Future<void> test_typeParameter_enum() async {
-    await _testMarkedContent('''
+    await _testMarkedContent(
+      '''
 enum E</*[0*/ThisType/*0]*/> {
   a;
 
   /*[1*/ThisType/*1]*/ get t => throw Error();
 }
-''');
+''',
+      kinds: {0: .Write, 1: .Read},
+    );
   }
 
   Future<void> test_typeParameter_extension() async {
-    await _testMarkedContent('''
+    await _testMarkedContent(
+      '''
 extension E</*[0*/ThisType/*0]*/> on /*[1*/ThisType/*1]*/ {
   /*[2*/ThisType/*2]*/ f() => this;
 }
-''');
+''',
+      kinds: {0: .Write, 1: .Read, 2: .Read},
+    );
   }
 
   Future<void> test_typeParameter_extensionType() async {
-    await _testMarkedContent('''
+    await _testMarkedContent(
+      '''
 extension type Et</*[0*/ThisType/*0]*/>(/*[1*/ThisType/*1]*/ value) {
   /*[2*/ThisType/*2]*/ get v => value;
 }
-''');
+''',
+      kinds: {0: .Write, 1: .Read, 2: .Read},
+    );
   }
 
   Future<void> test_typeParameter_function() async {
-    await _testMarkedContent('''
+    await _testMarkedContent(
+      '''
 /*[0*/ThisType/*0]*/ f</*[1*/ThisType/*1]*/>() => 0 as /*[2*/ThisType/*2]*/;
-''');
+''',
+      kinds: {0: .Read, 1: .Write, 2: .Read},
+    );
   }
 
   Future<void> test_typeParameter_functionParameter() async {
-    await _testMarkedContent('''
+    await _testMarkedContent(
+      '''
 void f(/*[0*/ThisType/*0]*/ Function</*[1*/ThisType/*1]*/>() f) => f();
-''');
+''',
+      kinds: {0: .Read, 1: .Write},
+    );
   }
 
   Future<void> test_typeParameter_mixin() async {
-    await _testMarkedContent('''
+    await _testMarkedContent(
+      '''
 mixin M</*[0*/ThisType/*0]*/> {
   /*[1*/ThisType/*1]*/ get t;
 }
-''');
+''',
+      kinds: {0: .Write, 1: .Read},
+    );
   }
 
   Future<void> test_typeParameter_typedef() async {
-    await _testMarkedContent('''
+    await _testMarkedContent(
+      '''
 typedef TypeDef</*[0*/ThisType/*0]*/> = /*[1*/ThisType/*1]*/ Function(/*[2*/ThisType/*2]*/);
-''');
+''',
+      kinds: {0: .Write, 1: .Read, 2: .Read},
+    );
   }
 
   /// Create three nested loops for this [loopKeyword] (outer/middle/inner)
@@ -1677,7 +2040,7 @@
     } $loopEnd
 }
 ''';
-    await _testMarkedContent(content);
+    await _testMarkedContent(content, allOfKind: .Text);
   }
 
   /// Tests highlights in a Dart file using the provided content.
@@ -1690,14 +2053,46 @@
   /// If the content contains only ranges, then the start and end of every range
   /// will be tested to ensure the full set of ranges are returned mutually for
   /// each.
-  Future<void> _testMarkedContent(String content) async {
+  ///
+  /// If [allOfKind] is provided, each returned highlight must have the same
+  /// [DocumentHighlightKind]. Otherwise, the kinds will be checked against
+  /// [kinds].
+  Future<void> _testMarkedContent(
+    String content, {
+    DocumentHighlightKind? allOfKind,
+    Map<int, DocumentHighlightKind>? kinds,
+  }) async {
     var code = TestCode.parse(content);
     expect(
       code.positions.isNotEmpty || code.ranges.isNotEmpty,
       isTrue,
-      reason: 'At least one position or range should be marked in the content',
+      reason: 'At least one position or range must be marked in the content',
     );
 
+    if (code.ranges.isEmpty) {
+      expect(
+        allOfKind == null && kinds == null,
+        isTrue,
+        reason:
+            "'allOfKind' and 'kinds' cannot be provided if there are no ranges",
+      );
+    } else {
+      expect(
+        (allOfKind != null) != (kinds != null),
+        isTrue,
+        reason:
+            "Exactly one of 'allOfKind' or 'kinds' must be provided if there are ranges",
+      );
+
+      if (kinds != null && kinds.isNotEmpty) {
+        expect(
+          kinds.values.toSet(),
+          hasLength(greaterThan(1)),
+          reason: "Use 'allOfKind' if all kinds are the same",
+        );
+      }
+    }
+
     await initialize();
     await openFile(mainFileUri, code.code);
 
@@ -1706,12 +2101,21 @@
         : code.ranges.expand((range) => [range.range.start, range.range.end]);
 
     for (var position in positions) {
-      var highlights = await getDocumentHighlights(mainFileUri, position);
+      var highlights = (await getDocumentHighlights(mainFileUri, position))!;
 
       if (code.ranges.isEmpty) {
         expect(highlights, isEmpty);
       } else {
-        code.verifyRanges(highlights!.map((highlight) => highlight.range));
+        code.verifyRanges(highlights.map((highlight) => highlight.range));
+      }
+
+      // Also verify the kinds
+      for (var i = 0; i < highlights.length; i++) {
+        if (kinds != null && !kinds.containsKey(i)) {
+          fail("Range $i was not found in 'kinds'");
+        }
+        var expectedKind = allOfKind ?? kinds![i];
+        expect(highlights[i].kind, expectedKind);
       }
     }
   }
diff --git a/pkg/analysis_server/test/lsp/migrate_test.dart b/pkg/analysis_server/test/lsp/migrate_test.dart
index 6cd11ac..bfbda7c 100644
--- a/pkg/analysis_server/test/lsp/migrate_test.dart
+++ b/pkg/analysis_server/test/lsp/migrate_test.dart
@@ -31,7 +31,10 @@
       response.error,
       isResponseError(
         ErrorCodes.InvalidParams,
-        message: contains("doesn't contain a 'pubspec.yaml' file."),
+        message: contains(
+          "The directory '$projectFolderPath' doesn't contain a 'pubspec.yaml' "
+          'file.',
+        ),
       ),
     );
   }
@@ -52,7 +55,8 @@
       isResponseError(
         ErrorCodes.InvalidParams,
         message: contains(
-          "doesn't refer to a package or pub workspace directory.",
+          "The path '$mainFilePath' doesn't refer to a package or pub workspace"
+          ' directory.',
         ),
       ),
     );
@@ -81,6 +85,28 @@
     );
   }
 
+  Future<void> test_error_invalidPubspec() async {
+    await initialize();
+
+    newFile(pubspecFilePath, 'invalid: [');
+
+    var request = makeRequest(
+      CustomMethods.migrate,
+      DartMigrateParams(uris: [projectFolderUri]),
+    );
+    var response = await sendRequestToServer(request);
+
+    expect(
+      response.error,
+      isResponseError(
+        ErrorCodes.InvalidParams,
+        message: contains(
+          "Failed to parse 'pubspec.yaml' at '$projectFolderPath'",
+        ),
+      ),
+    );
+  }
+
   Future<void> test_error_nonExistentDirectory() async {
     await initialize();
 
@@ -119,7 +145,8 @@
       isResponseError(
         ErrorCodes.InvalidParams,
         message: contains(
-          "is part of a workspace and can't be migrated independently.",
+          "The directory '$projectFolderPath' is part of a workspace and can't "
+          'be migrated independently.',
         ),
       ),
     );
diff --git a/pkg/analysis_server/test/lsp/semantic_tokens_test.dart b/pkg/analysis_server/test/lsp/semantic_tokens_test.dart
index da418f1..bdd5218 100644
--- a/pkg/analysis_server/test/lsp/semantic_tokens_test.dart
+++ b/pkg/analysis_server/test/lsp/semantic_tokens_test.dart
@@ -278,7 +278,7 @@
 
 class A {
   void f() {}
-  String get g => '';
+  String get g;
 }
 ''';
 
@@ -286,9 +286,7 @@
 part of 'main.dart';
 
 augment class A {
-  augment void f() {
-    0;
-  }
+  augment void f();
   augment get g => 'augmented';
 }
 ''';
@@ -318,7 +316,6 @@
         SemanticTokenModifiers.declaration,
         CustomSemanticTokenModifiers.instance,
       ]),
-      _Token("''", SemanticTokenTypes.string),
     ]);
 
     // Augmentation.
@@ -338,7 +335,6 @@
         SemanticTokenModifiers.declaration,
         CustomSemanticTokenModifiers.instance,
       ]),
-      _Token('0', SemanticTokenTypes.number),
       _Token('augment', SemanticTokenTypes.keyword),
       _Token('get', SemanticTokenTypes.keyword),
       _Token('g', SemanticTokenTypes.property, [
diff --git a/pkg/analysis_server/test/lsp/super_test.dart b/pkg/analysis_server/test/lsp/super_test.dart
index 03b7dda..5738f99 100644
--- a/pkg/analysis_server/test/lsp/super_test.dart
+++ b/pkg/analysis_server/test/lsp/super_test.dart
@@ -63,11 +63,11 @@
 }
 
 augment class A {
-  augment void foo() {}
+  augment void foo();
 }
 
 augment class A {
-  augment void [!foo!]() {}
+  augment void [!foo!]();
 }
 
 class B extends A {}
diff --git a/pkg/analysis_server/test/src/analytics/analytics_manager_test.dart b/pkg/analysis_server/test/src/analytics/analytics_manager_test.dart
index 7980474..29a5b40 100644
--- a/pkg/analysis_server/test/src/analytics/analytics_manager_test.dart
+++ b/pkg/analysis_server/test/src/analytics/analytics_manager_test.dart
@@ -39,7 +39,15 @@
 @reflectiveTest
 class AnalyticsManagerTest with ResourceProviderMixin {
   final analytics = _MockAnalytics();
-  late final manager = AnalyticsManager(analytics);
+  late final manager = AnalyticsManager(
+    analytics,
+    environment: {
+      'DASH__IDE_NAME': 'ideName',
+      'DASH__IDE_VERSION': 'ideVersion',
+      'DASH__PLUGIN_NAME': 'pluginName',
+      'DASH__PLUGIN_VERSION': 'pluginVersion',
+    },
+  );
 
   Folder get testPackageRoot => getFolder('/home/package');
 
@@ -499,6 +507,10 @@
           'clientId': clientId,
           'clientVersion': clientVersion,
           'duration': _IsPositiveInt(),
+          'ideName': 'ideName',
+          'ideVersion': 'ideVersion',
+          'pluginName': 'pluginName',
+          'pluginVersion': 'pluginVersion',
         },
       ),
     ]);
diff --git a/pkg/analysis_server/test/src/services/correction/assist/add_type_annotation_test.dart b/pkg/analysis_server/test/src/services/correction/assist/add_type_annotation_test.dart
index 022bc22..330f64a 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/add_type_annotation_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/add_type_annotation_test.dart
@@ -210,6 +210,15 @@
     await assertNoAssist();
   }
 
+  Future<void> test_listLiteral_dynamicElement() async {
+    await resolveTestCode('''
+List<dynamic> list = ^[];
+''');
+    await assertHasAssist('''
+List<dynamic> list = <dynamic>[];
+''');
+  }
+
   Future<void> test_local_addImport_dartUri() async {
     newFile('$testPackageLibPath/my_lib.dart', r'''
 import 'dart:collection';
@@ -714,6 +723,15 @@
     await assertNoAssist();
   }
 
+  Future<void> test_mapLiteral_dynamicKeyAndValue() async {
+    await resolveTestCode('''
+Map<dynamic, dynamic> map = ^{};
+''');
+    await assertHasAssist('''
+Map<dynamic, dynamic> map = <dynamic, dynamic>{};
+''');
+  }
+
   Future<void> test_mapLiteral_notype() async {
     await resolveTestCode('''
 var map = ^{};
@@ -996,6 +1014,15 @@
 ''');
   }
 
+  Future<void> test_setLiteral_dynamicElement() async {
+    await resolveTestCode('''
+Set<dynamic> set = ^{};
+''');
+    await assertHasAssist('''
+Set<dynamic> set = <dynamic>{};
+''');
+  }
+
   Future<void> test_topLevelVariable_int() async {
     await resolveTestCode('''
 ^var v = 0;
diff --git a/pkg/analysis_server/test/src/services/correction/assist/sort_child_property_last_test.dart b/pkg/analysis_server/test/src/services/correction/assist/sort_child_property_last_test.dart
index 32ba4e91..ef3ca93 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/sort_child_property_last_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/sort_child_property_last_test.dart
@@ -59,6 +59,56 @@
     await assertNoAssist();
   }
 
+  Future<void> test_firstArgument_commentAfterArgument() async {
+    await resolveTestCode('''
+import 'package:flutter/material.dart';
+void f() {
+  Column(
+    ^children: [], // comment
+    mainAxisAlignment: .start,
+    crossAxisAlignment: .center,
+  );
+}
+''');
+    await assertHasAssist('''
+import 'package:flutter/material.dart';
+void f() {
+  Column(
+    mainAxisAlignment: .start,
+    crossAxisAlignment: .center,
+    children: [], // comment
+  );
+}
+''');
+    assertExitPosition(after: '], // comment');
+  }
+
+  Future<void> test_middleArgument_commentAfterArgument() async {
+    await resolveTestCode('''
+import 'package:flutter/material.dart';
+void f() {
+  Column(
+    mainAxisAlignment: .start,
+    ^children: [], // comment
+    crossAxisAlignment: .center,
+  );
+}
+''');
+    // TODO(srawlins): It would be better to keep `// comment` with the
+    // `children` argument.
+    await assertHasAssist('''
+import 'package:flutter/material.dart';
+void f() {
+  Column(
+    mainAxisAlignment: .start, // comment
+    crossAxisAlignment: .center,
+    children: [],
+  );
+}
+''');
+    assertExitPosition(after: '],');
+  }
+
   Future<void> test_no_children() async {
     await resolveTestCode('''
 import 'package:flutter/material.dart';
@@ -157,12 +207,8 @@
 import 'package:flutter/material.dart';
 void f() {
   Column(
-    ^children: <Widget>[
-      Text('aaa'),
-      Text('bbbbbb'),
-      Text('ccccccccc'),
-    ],
-    crossAxisAlignment: CrossAxisAlignment.center,
+    ^children: [],
+    crossAxisAlignment: .center,
   );
 }
 ''');
@@ -170,12 +216,8 @@
 import 'package:flutter/material.dart';
 void f() {
   Column(
-    crossAxisAlignment: CrossAxisAlignment.center,
-    children: <Widget>[
-      Text('aaa'),
-      Text('bbbbbb'),
-      Text('ccccccccc'),
-    ],
+    crossAxisAlignment: .center,
+    children: [],
   );
 }
 ''');
diff --git a/pkg/analysis_server/test/src/services/correction/fix/convert_default_to_primary_constructor_test.dart b/pkg/analysis_server/test/src/services/correction/fix/convert_default_to_primary_constructor_test.dart
new file mode 100644
index 0000000..f5114f5
--- /dev/null
+++ b/pkg/analysis_server/test/src/services/correction/fix/convert_default_to_primary_constructor_test.dart
@@ -0,0 +1,46 @@
+// Copyright (c) 2026, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analysis_server/src/services/correction/fix.dart';
+import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'fix_processor.dart';
+
+void main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(ConvertDefaultToPrimaryConstructorTest);
+  });
+}
+
+@reflectiveTest
+class ConvertDefaultToPrimaryConstructorTest extends FixProcessorLintTest {
+  @override
+  FixKind get kind => DartFixKind.convertDefaultToPrimaryConstructor;
+
+  @override
+  String get lintCode => LintNames.use_primary_constructors;
+
+  Future<void> test_class() async {
+    await resolveTestCode('''
+class C^;
+''');
+    await assertHasFix('''
+class C();
+''');
+  }
+
+  Future<void> test_enum() async {
+    await resolveTestCode('''
+enum E^ {
+  a, b;
+}
+''');
+    await assertHasFix('''
+enum E() {
+  a, b;
+}
+''');
+  }
+}
diff --git a/pkg/analysis_server/test/src/services/correction/fix/convert_to_declaring_parameter_test.dart b/pkg/analysis_server/test/src/services/correction/fix/convert_to_declaring_parameter_test.dart
new file mode 100644
index 0000000..522a593
--- /dev/null
+++ b/pkg/analysis_server/test/src/services/correction/fix/convert_to_declaring_parameter_test.dart
@@ -0,0 +1,831 @@
+// Copyright (c) 2026, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analysis_server/src/services/correction/fix.dart';
+import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'fix_processor.dart';
+
+void main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(ConvertToDeclaringParameterInClassBulkTest);
+    defineReflectiveTests(ConvertToDeclaringParameterInClassTest);
+    defineReflectiveTests(ConvertToDeclaringParameterInEnumBulkTest);
+    defineReflectiveTests(ConvertToDeclaringParameterInEnumTest);
+  });
+}
+
+@reflectiveTest
+class ConvertToDeclaringParameterInClassBulkTest extends BulkFixProcessorTest {
+  @override
+  String get lintCode => LintNames.use_declaring_parameters;
+
+  Future<void> test_multipleFields_multipleDeclarations() async {
+    await resolveTestCode('''
+class C(int x, int y) {
+  int x;
+
+  int y;
+
+  this : x = x, y = y;
+}
+''');
+    await assertHasFix('''
+class C(var int x, int y) {
+  int y;
+
+  this : y = y;
+}
+''');
+  }
+
+  Future<void> test_multipleFields_singleDeclaration() async {
+    await resolveTestCode('''
+class C(int x, int y) {
+  int x, y;
+
+  this : x = x, y = y;
+}
+''');
+    await assertHasFix('''
+class C(var int x, int y) {
+  int y;
+
+  this : y = y;
+}
+''');
+  }
+}
+
+@reflectiveTest
+class ConvertToDeclaringParameterInClassTest extends FixProcessorLintTest {
+  @override
+  FixKind get kind => DartFixKind.convertToDeclaringParameter;
+
+  @override
+  String get lintCode => LintNames.use_declaring_parameters;
+
+  Future<void> test_body_withAnnotation() async {
+    await resolveTestCode('''
+class C(int x) {
+  int x;
+
+  @a
+  this : x = x;
+}
+
+const a = 0;
+''');
+    await assertHasFix('''
+class C(var int x) {
+  @a
+  this;
+}
+
+const a = 0;
+''');
+  }
+
+  Future<void> test_body_withAnnotationAndComment() async {
+    await resolveTestCode('''
+class C(int x) {
+  int x;
+
+  /// A comment
+  /// on multiple lines.
+  @a
+  this : x = x;
+}
+
+const a = 0;
+''');
+    await assertHasFix('''
+class C(var int x) {
+  /// A comment
+  /// on multiple lines.
+  @a
+  this;
+}
+
+const a = 0;
+''');
+  }
+
+  Future<void> test_body_withBlock() async {
+    await resolveTestCode('''
+class C(this.x) {
+  int x;
+
+  this {
+    print(x);
+  }
+}
+''');
+    await assertHasFix('''
+class C(var int x) {
+  this {
+    print(x);
+  }
+}
+''');
+  }
+
+  Future<void> test_body_withBlockAndInitializer() async {
+    await resolveTestCode('''
+class C(int x) {
+  int x;
+
+  this : x = x {
+    print(x);
+  }
+}
+''');
+    await assertHasFix('''
+class C(var int x) {
+  this {
+    print(x);
+  }
+}
+''');
+  }
+
+  Future<void> test_body_withDocComment() async {
+    await resolveTestCode('''
+class C(int x) {
+  int x;
+
+  /// A comment
+  /// on multiple lines.
+  this : x = x;
+}
+''');
+    await assertHasFix('''
+class C(var int x) {
+  /// A comment
+  /// on multiple lines.
+  this;
+}
+''');
+  }
+
+  Future<void> test_body_withInitializer_simple() async {
+    await resolveTestCode('''
+class C(int x) {
+  int x;
+
+  this : x = x;
+}
+''');
+    await assertHasFix('''
+class C(var int x) {
+}
+''');
+  }
+
+  Future<void> test_body_withNormalComment_emptyBody() async {
+    await resolveTestCode('''
+class C(int x) {
+  int x;
+
+  // A comment
+  this : x = x;
+}
+''');
+    await assertHasFix('''
+class C(var int x) {
+}
+''');
+  }
+
+  Future<void> test_body_withNormalComment_nonEmptyBody() async {
+    await resolveTestCode('''
+class C(int x) {
+  int x;
+
+  // A comment
+  this : x = x {}
+}
+''');
+    await assertHasFix('''
+class C(var int x) {
+  // A comment
+  this {}
+}
+''');
+  }
+
+  Future<void> test_optionalNamed_fieldFormalParameter_final() async {
+    await resolveTestCode('''
+class C({this.x = 0}) {
+  final int x;
+}
+''');
+    await assertHasFix('''
+class C({final int x = 0}) {
+}
+''');
+  }
+
+  Future<void> test_optionalNamed_fieldFormalParameter_nonFinal() async {
+    await resolveTestCode('''
+class C({this.x = 0}) {
+  int x;
+}
+''');
+    await assertHasFix('''
+class C({var int x = 0}) {
+}
+''');
+  }
+
+  Future<void> test_optionalNamed_simple_final() async {
+    await resolveTestCode('''
+class C({int x = 0}) {
+  final int x;
+
+  this : x = x;
+}
+''');
+    await assertHasFix('''
+class C({final int x = 0}) {
+}
+''');
+  }
+
+  Future<void> test_optionalNamed_simple_nonFinal() async {
+    await resolveTestCode('''
+class C({int x = 0}) {
+  int x;
+
+  this : x = x;
+}
+''');
+    await assertHasFix('''
+class C({var int x = 0}) {
+}
+''');
+  }
+
+  Future<void> test_optionalNamed_simple_nonFinal_privateField() async {
+    await resolveTestCode('''
+class C({int x = 0}) {
+  int _x;
+
+  this : _x = x;
+
+  int get y => _x + 1;
+}
+''');
+    await assertHasFix('''
+class C({var int _x = 0}) {
+
+  int get y => _x + 1;
+}
+''');
+  }
+
+  Future<void> test_optionalPositional_fieldFormalParameter_final() async {
+    await resolveTestCode('''
+class C([this.x = 0]) {
+  final int x;
+}
+''');
+    await assertHasFix('''
+class C([final int x = 0]) {
+}
+''');
+  }
+
+  Future<void> test_optionalPositional_fieldFormalParameter_nonFinal() async {
+    await resolveTestCode('''
+class C([this.x = 0]) {
+  int x;
+}
+''');
+    await assertHasFix('''
+class C([var int x = 0]) {
+}
+''');
+  }
+
+  Future<void> test_optionalPositional_simple_final() async {
+    await resolveTestCode('''
+class C([int x = 0]) {
+  final int x;
+
+  this : x = x;
+}
+''');
+    await assertHasFix('''
+class C([final int x = 0]) {
+}
+''');
+  }
+
+  Future<void> test_optionalPositional_simple_nonFinal() async {
+    await resolveTestCode('''
+class C([int x = 0]) {
+  int x;
+
+  this : x = x;
+}
+''');
+    await assertHasFix('''
+class C([var int x = 0]) {
+}
+''');
+  }
+
+  Future<void> test_privateField() async {
+    await resolveTestCode('''
+class C(int x) {
+  int _x;
+
+  this : _x = x;
+
+  int get y => _x + 1;
+}
+''');
+    await assertHasFix('''
+class C(var int _x) {
+
+  int get y => _x + 1;
+}
+''');
+  }
+
+  Future<void> test_requiredNamed_fieldFormalParameter_final() async {
+    await resolveTestCode('''
+class C({required this.x}) {
+  final int x;
+}
+''');
+    await assertHasFix('''
+class C({required final int x}) {
+}
+''');
+  }
+
+  Future<void> test_requiredNamed_fieldFormalParameter_nonFinal() async {
+    await resolveTestCode('''
+class C({required this.x}) {
+  int x;
+}
+''');
+    await assertHasFix('''
+class C({required var int x}) {
+}
+''');
+  }
+
+  Future<void> test_requiredNamed_simple_final() async {
+    await resolveTestCode('''
+class C({required int x}) {
+  final int x;
+
+  this : x = x;
+}
+''');
+    await assertHasFix('''
+class C({required final int x}) {
+}
+''');
+  }
+
+  Future<void> test_requiredNamed_simple_nonFinal() async {
+    await resolveTestCode('''
+class C({required int x}) {
+  int x;
+
+  this : x = x;
+}
+''');
+    await assertHasFix('''
+class C({required var int x}) {
+}
+''');
+  }
+
+  Future<void> test_requiredPositional_fieldFormalParameter_final() async {
+    await resolveTestCode('''
+class C(this.x) {
+  final int x;
+}
+''');
+    await assertHasFix('''
+class C(final int x) {
+}
+''');
+  }
+
+  Future<void>
+  test_requiredPositional_fieldFormalParameter_nonFinal_noType() async {
+    await resolveTestCode('''
+class C(this.x) {
+  int x;
+}
+''');
+    await assertHasFix('''
+class C(var int x) {
+}
+''');
+  }
+
+  test_requiredPositional_fieldFormalParameter_nonFinal_sameType() async {
+    await resolveTestCode(r'''
+class C(int this.x) {
+  int x;
+}
+''');
+    await assertHasFix('''
+class C(var int x) {
+}
+''');
+  }
+
+  Future<void> test_requiredPositional_simple_final() async {
+    await resolveTestCode('''
+class C(int x) {
+  final int x;
+
+  this : x = x;
+}
+''');
+    await assertHasFix('''
+class C(final int x) {
+}
+''');
+  }
+
+  Future<void> test_requiredPositional_simple_nonFinal() async {
+    await resolveTestCode('''
+class C(int x) {
+  int x;
+
+  this : x = x;
+}
+''');
+    await assertHasFix('''
+class C(var int x) {
+}
+''');
+  }
+
+  Future<void> test_requiredPositional_simple_nonFinal_explicitThis() async {
+    await resolveTestCode('''
+class C(int x) {
+  int x;
+
+  this : this.x = x;
+}
+''');
+    await assertHasFix('''
+class C(var int x) {
+}
+''');
+  }
+
+  Future<void> test_type_imported() async {
+    await resolveTestCode('''
+import 'dart:core' as core;
+
+class C(core.int x) {
+  final core.int x;
+
+  this : x = x;
+}
+''');
+    await assertHasFix('''
+import 'dart:core' as core;
+
+class C(final core.int x) {
+}
+''');
+  }
+
+  Future<void> test_type_typedef_both() async {
+    await resolveTestCode('''
+class C(T x) {
+  final T x;
+
+  this : x = x;
+}
+typedef T = int;
+''');
+    await assertHasFix('''
+class C(final T x) {
+}
+typedef T = int;
+''');
+  }
+
+  Future<void> test_type_typedef_field() async {
+    await resolveTestCode('''
+class C(int x) {
+  final T x;
+
+  this : x = x;
+}
+typedef T = int;
+''');
+    await assertHasFix('''
+class C(final int x) {
+}
+typedef T = int;
+''');
+  }
+
+  Future<void> test_type_typedef_param() async {
+    await resolveTestCode('''
+class C(T x) {
+  final int x;
+
+  this : x = x;
+}
+typedef T = int;
+''');
+    await assertHasFix('''
+class C(final T x) {
+}
+typedef T = int;
+''');
+  }
+}
+
+@reflectiveTest
+class ConvertToDeclaringParameterInEnumBulkTest extends BulkFixProcessorTest {
+  @override
+  String get lintCode => LintNames.use_declaring_parameters;
+
+  Future<void> test_multipleFields_multipleDeclarations() async {
+    await resolveTestCode('''
+enum E(int x, int y) {
+  a(0, 0);
+
+  final int x;
+
+  final int y;
+
+  this : x = x, y = y;
+}
+''');
+    await assertHasFix('''
+enum E(final int x, int y) {
+  a(0, 0);
+
+  final int y;
+
+  this : y = y;
+}
+''');
+  }
+
+  Future<void> test_multipleFields_singleDeclaration() async {
+    await resolveTestCode('''
+enum E(int x, int y) {
+  a(0, 0);
+
+  final int x, y;
+
+  this : x = x, y = y;
+}
+''');
+    await assertHasFix('''
+enum E(final int x, int y) {
+  a(0, 0);
+
+  final int y;
+
+  this : y = y;
+}
+''');
+  }
+}
+
+@reflectiveTest
+class ConvertToDeclaringParameterInEnumTest extends FixProcessorLintTest {
+  @override
+  FixKind get kind => DartFixKind.convertToDeclaringParameter;
+
+  @override
+  String get lintCode => LintNames.use_declaring_parameters;
+
+  Future<void> test_optionalNamed_fieldFormalParameter() async {
+    await resolveTestCode('''
+enum E({this.x = 0}) {
+  a(x: 0);
+
+  final int x;
+}
+''');
+    await assertHasFix('''
+enum E({final int x = 0}) {
+  a(x: 0);
+
+}
+''');
+  }
+
+  Future<void> test_optionalNamed_simple() async {
+    await resolveTestCode('''
+enum E({int x = 0}) {
+  a(x: 0);
+
+  final int x;
+
+  this : x = x;
+}
+''');
+    await assertHasFix('''
+enum E({final int x = 0}) {
+  a(x: 0);
+
+}
+''');
+  }
+
+  Future<void> test_optionalNamed_simple_privateField() async {
+    await resolveTestCode('''
+enum E({int x = 0}) {
+  a(x: 0);
+
+  final int _x;
+
+  this : _x = x;
+
+  int get y => _x + 1;
+}
+''');
+    await assertHasFix('''
+enum E({final int _x = 0}) {
+  a(x: 0);
+
+
+  int get y => _x + 1;
+}
+''');
+  }
+
+  Future<void> test_optionalPositional_fieldFormalParameter() async {
+    await resolveTestCode('''
+enum E([this.x = 0]) {
+  a(0);
+
+  final int x;
+}
+''');
+    await assertHasFix('''
+enum E([final int x = 0]) {
+  a(0);
+
+}
+''');
+  }
+
+  Future<void> test_optionalPositional_simple() async {
+    await resolveTestCode('''
+enum E([int x = 0]) {
+  a(0);
+
+  final int x;
+
+  this : x = x;
+}
+''');
+    // TODO(brianwilkerson): It would be nice to remove the extra blank line.
+    await assertHasFix('''
+enum E([final int x = 0]) {
+  a(0);
+
+}
+''');
+  }
+
+  Future<void> test_privateField() async {
+    await resolveTestCode('''
+enum E(int x) {
+  a(0);
+
+  final int _x;
+
+  this : _x = x;
+
+  int get y => _x + 1;
+}
+''');
+    await assertHasFix('''
+enum E(final int _x) {
+  a(0);
+
+
+  int get y => _x + 1;
+}
+''');
+  }
+
+  Future<void> test_requiredNamed_fieldFormalParameter() async {
+    await resolveTestCode('''
+enum E({required this.x}) {
+  a(x: 0);
+
+  final int x;
+}
+''');
+    await assertHasFix('''
+enum E({required final int x}) {
+  a(x: 0);
+
+}
+''');
+  }
+
+  Future<void> test_requiredNamed_simple() async {
+    await resolveTestCode('''
+enum E({required int x}) {
+  a(x: 0);
+
+  final int x;
+
+  this : x = x;
+}
+''');
+    await assertHasFix('''
+enum E({required final int x}) {
+  a(x: 0);
+
+}
+''');
+  }
+
+  Future<void> test_requiredPositional_fieldFormalParameter() async {
+    await resolveTestCode('''
+enum E(this.x) {
+  a(0);
+
+  final int x;
+}
+''');
+    await assertHasFix('''
+enum E(final int x) {
+  a(0);
+
+}
+''');
+  }
+
+  Future<void> test_requiredPositional_simple() async {
+    await resolveTestCode('''
+enum E(int x) {
+  a(0);
+
+  final int x;
+
+  this : x = x;
+}
+''');
+    await assertHasFix('''
+enum E(final int x) {
+  a(0);
+
+}
+''');
+  }
+
+  Future<void> test_requiredPositional_simple_explicitThis() async {
+    await resolveTestCode('''
+enum E(int x) {
+  a(0);
+
+  final int x;
+
+  this : this.x = x;
+}
+''');
+    await assertHasFix('''
+enum E(final int x) {
+  a(0);
+
+}
+''');
+  }
+
+  Future<void> test_withInitializer_simple() async {
+    await resolveTestCode('''
+enum E(int x) {
+  a(0);
+
+  final int x;
+
+  this : x = x;
+}
+''');
+    await assertHasFix('''
+enum E(final int x) {
+  a(0);
+
+}
+''');
+  }
+}
diff --git a/pkg/analysis_server/test/src/services/correction/fix/convert_to_primary_constructor_test.dart b/pkg/analysis_server/test/src/services/correction/fix/convert_to_primary_constructor_test.dart
new file mode 100644
index 0000000..b967e35
--- /dev/null
+++ b/pkg/analysis_server/test/src/services/correction/fix/convert_to_primary_constructor_test.dart
@@ -0,0 +1,471 @@
+// Copyright (c) 2026, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analysis_server/src/services/correction/fix.dart';
+import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'fix_processor.dart';
+
+void main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(ConvertToPrimaryConstructorClassTest);
+    defineReflectiveTests(ConvertToPrimaryConstructorEnumTest);
+  });
+}
+
+@reflectiveTest
+class ConvertToPrimaryConstructorClassTest extends FixProcessorLintTest {
+  @override
+  FixKind get kind => DartFixKind.convertToPrimaryConstructor;
+
+  @override
+  String get lintCode => LintNames.use_primary_constructors;
+
+  Future<void> test_noParameters_noBody_named() async {
+    await resolveTestCode('''
+class C {
+  C.n();
+}
+''');
+    await assertHasFix('''
+class C.n() {
+}
+''');
+  }
+
+  Future<void> test_noParameters_noBody_unnamed() async {
+    await resolveTestCode('''
+class C {
+  C();
+}
+''');
+    await assertHasFix('''
+class C() {
+}
+''');
+  }
+
+  Future<void> test_noParameters_withBody() async {
+    await resolveTestCode('''
+class C {
+  C() {
+    print('c');
+  }
+}
+''');
+    await assertHasFix('''
+class C() {
+  this {
+    print('c');
+  }
+}
+''');
+  }
+
+  Future<void> test_noParameters_withBodyAndInitializer() async {
+    await resolveTestCode('''
+class C {
+  int _x; // ignore: unused_field
+
+  C() : _x = 0 {
+    print('c');
+  }
+}
+''');
+    await assertHasFix('''
+class C() {
+  int _x; // ignore: unused_field
+
+  this : _x = 0 {
+    print('c');
+  }
+}
+''');
+  }
+
+  Future<void> test_noParameters_withInitializer() async {
+    await resolveTestCode('''
+class C {
+  int _x; // ignore: unused_field
+
+  C() : _x = 0;
+}
+''');
+    await assertHasFix('''
+class C() {
+  int _x; // ignore: unused_field
+
+  this : _x = 0;
+}
+''');
+  }
+
+  Future<void> test_noParameters_withKeyword_const() async {
+    await resolveTestCode('''
+class C {
+  const C();
+}
+''');
+    await assertHasFix('''
+class const C() {
+}
+''');
+  }
+
+  Future<void> test_withAnnotation() async {
+    await resolveTestCode('''
+class C {
+  @a
+  C();
+}
+
+const a = 0;
+''');
+    await assertHasFix('''
+class C() {
+  @a
+  this;
+}
+
+const a = 0;
+''');
+  }
+
+  Future<void> test_withConstructor_factory() async {
+    await resolveTestCode('''
+class C {
+  C();
+
+  factory C.c() => C();
+}
+''');
+    // TODO(brianwilkerson): Remove the extra whitespace.
+    await assertHasFix('''
+class C() {
+
+  factory C.c() => C();
+}
+''');
+  }
+
+  Future<void> test_withConstructor_redirectingGenerative() async {
+    await resolveTestCode('''
+class C {
+  C();
+
+  C.c() : this();
+}
+''');
+    // TODO(brianwilkerson): Remove the extra whitespace.
+    await assertHasFix('''
+class C() {
+
+  C.c() : this();
+}
+''');
+  }
+
+  Future<void> test_withDocComment() async {
+    await resolveTestCode('''
+class C {
+  /// C
+  C();
+}
+
+const a = 0;
+''');
+    await assertHasFix('''
+class C() {
+  /// C
+  this;
+}
+
+const a = 0;
+''');
+  }
+
+  Future<void> test_withParameters_optionalNamed_fieldFormal() async {
+    await resolveTestCode('''
+class C {
+  int x;
+
+  C({this.x = 0});
+}
+''');
+    // TODO(brianwilkerson): Remove the extra whitespace.
+    await assertHasFix('''
+class C({this.x = 0}) {
+  int x;
+
+}
+''');
+  }
+
+  Future<void> test_withParameters_optionalNamed_simple() async {
+    await resolveTestCode('''
+class C {
+  int _x; // ignore: unused_field
+
+  C({int x = 0}) : _x = x;
+}
+''');
+    await assertHasFix('''
+class C({int x = 0}) {
+  int _x; // ignore: unused_field
+
+  this : _x = x;
+}
+''');
+  }
+
+  Future<void> test_withParameters_optionalNamed_super() async {
+    await resolveTestCode('''
+class C extends B {
+  C({super.x = 0});
+}
+
+class B({required this.x}) {
+  int x;
+}
+''');
+    await assertHasFix('''
+class C({super.x = 0}) extends B {
+}
+
+class B({required this.x}) {
+  int x;
+}
+''');
+  }
+
+  Future<void> test_withParameters_optionalPositional_fieldFormal() async {
+    await resolveTestCode('''
+class C {
+  int x;
+
+  C([this.x = 0]);
+}
+''');
+    // TODO(brianwilkerson): Remove the extra whitespace.
+    await assertHasFix('''
+class C([this.x = 0]) {
+  int x;
+
+}
+''');
+  }
+
+  Future<void> test_withParameters_optionalPositional_simple() async {
+    await resolveTestCode('''
+class C {
+  int _x; // ignore: unused_field
+
+  C([int x = 0]) : _x = x;
+}
+''');
+    await assertHasFix('''
+class C([int x = 0]) {
+  int _x; // ignore: unused_field
+
+  this : _x = x;
+}
+''');
+  }
+
+  Future<void> test_withParameters_optionalPositional_super() async {
+    await resolveTestCode('''
+class C extends B {
+  C([super.x = 0]);
+}
+
+class B(this.x) {
+  int x;
+}
+''');
+    await assertHasFix('''
+class C([super.x = 0]) extends B {
+}
+
+class B(this.x) {
+  int x;
+}
+''');
+  }
+
+  Future<void> test_withParameters_requiredNamed_fieldFormal() async {
+    await resolveTestCode('''
+class C {
+  int x;
+
+  C({required this.x});
+}
+''');
+    // TODO(brianwilkerson): Remove the extra whitespace.
+    await assertHasFix('''
+class C({required this.x}) {
+  int x;
+
+}
+''');
+  }
+
+  Future<void> test_withParameters_requiredNamed_simple() async {
+    await resolveTestCode('''
+class C {
+  int _x; // ignore: unused_field
+
+  C({required int x}) : _x = x;
+}
+''');
+    await assertHasFix('''
+class C({required int x}) {
+  int _x; // ignore: unused_field
+
+  this : _x = x;
+}
+''');
+  }
+
+  Future<void> test_withParameters_requiredNamed_super() async {
+    await resolveTestCode('''
+class C extends B {
+  C({required super.x});
+}
+
+class B({required this.x}) {
+  int x;
+}
+''');
+    await assertHasFix('''
+class C({required super.x}) extends B {
+}
+
+class B({required this.x}) {
+  int x;
+}
+''');
+  }
+
+  Future<void> test_withParameters_requiredPositional_fieldFormal() async {
+    await resolveTestCode('''
+class C {
+  int x;
+
+  C(this.x);
+}
+''');
+    // TODO(brianwilkerson): Remove the extra whitespace.
+    await assertHasFix('''
+class C(this.x) {
+  int x;
+
+}
+''');
+  }
+
+  Future<void> test_withParameters_requiredPositional_simple() async {
+    await resolveTestCode('''
+class C {
+  int _x; // ignore: unused_field
+
+  C(int x) : _x = x;
+}
+''');
+    await assertHasFix('''
+class C(int x) {
+  int _x; // ignore: unused_field
+
+  this : _x = x;
+}
+''');
+  }
+
+  Future<void> test_withParameters_requiredPositional_super() async {
+    await resolveTestCode('''
+class C extends B {
+  C(super.x);
+}
+
+class B(this.x) {
+  int x;
+}
+''');
+    await assertHasFix('''
+class C(super.x) extends B {
+}
+
+class B(this.x) {
+  int x;
+}
+''');
+  }
+}
+
+@reflectiveTest
+class ConvertToPrimaryConstructorEnumTest extends FixProcessorLintTest {
+  @override
+  FixKind get kind => DartFixKind.convertToPrimaryConstructor;
+
+  @override
+  String get lintCode => LintNames.use_primary_constructors;
+
+  Future<void> test_noParameters_noBody() async {
+    await resolveTestCode('''
+enum E {
+  a, b;
+
+  const E();
+}
+''');
+    await assertHasFix('''
+enum E() {
+  a, b;
+
+}
+''');
+  }
+
+  Future<void> test_noParameters_withInitializer() async {
+    await resolveTestCode('''
+enum E {
+  a(1), b(2);
+
+  final int x;
+
+  const E(this.x) : assert(x > 0);
+}
+''');
+    await assertHasFix('''
+enum E(this.x) {
+  a(1), b(2);
+
+  final int x;
+
+  this : assert(x > 0);
+}
+''');
+  }
+
+  Future<void> test_withParameters_requiredPositional_simple() async {
+    await resolveTestCode('''
+enum E {
+  a(1), b(2);
+
+  final int _x; // ignore: unused_field
+
+  const E(int x) : _x = x;
+}
+''');
+    await assertHasFix('''
+enum E(int x) {
+  a(1), b(2);
+
+  final int _x; // ignore: unused_field
+
+  this : _x = x;
+}
+''');
+  }
+}
diff --git a/pkg/analysis_server/test/src/services/correction/fix/data_driven/diagnostics/missing_key_test.dart b/pkg/analysis_server/test/src/services/correction/fix/data_driven/diagnostics/missing_key_test.dart
index 66427ed..64bb9b0 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/data_driven/diagnostics/missing_key_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/data_driven/diagnostics/missing_key_test.dart
@@ -233,7 +233,7 @@
   date: 2020-09-14
   changes: []
 ''',
-      [error(diag.missingKey, 25, 43)],
+      [error(diag.missingOneOfMultipleKeys, 25, 43)],
     );
   }
 
diff --git a/pkg/analysis_server/test/src/services/correction/fix/data_driven/flutter_use_case_test.dart b/pkg/analysis_server/test/src/services/correction/fix/data_driven/flutter_use_case_test.dart
index cb33c4a..5672b989b 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/data_driven/flutter_use_case_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/data_driven/flutter_use_case_test.dart
@@ -387,6 +387,49 @@
 ''');
   }
 
+  Future<void> test_flutter_to_material_package_IconButton() async {
+    newFile('$workspaceRootPath/p/lib/flutter.dart', '''
+  class Widget {
+  }
+''');
+
+    newFile('$workspaceRootPath/p2/lib/material.dart', '''
+ class IconButton {
+    const IconButton();
+ }
+''');
+
+    writeTestPackageConfig(
+      config: PackageConfigFileBuilder()
+        ..add(name: 'p', rootFolder: getFolder('$workspaceRootPath/p')),
+    );
+
+    addPackageDataFile('''
+version: 1
+transforms:
+  - title: 'Replace by material from package p2'
+    date: 2023-11-09
+    library: 'package:p/material.dart'
+    changes:
+    - kind: 'replacedBy'
+      newLibrary: 'package:p2/material.dart'
+''');
+
+    await resolveTestCode('''
+import 'package:p/material.dart';
+
+void f(IconButton button) {
+}
+''');
+
+    await assertHasFix('''
+import 'package:p2/material.dart';
+
+void f(IconButton button) {
+}
+''', filter: (error) => error.message.contains('package:'));
+  }
+
   Future<void>
   test_gestures_PointerEnterEvent_fromHoverEvent_deprecated() async {
     setPackageContent('''
diff --git a/pkg/analysis_server/test/src/services/correction/fix/data_driven/transform_set_parser_test.dart b/pkg/analysis_server/test/src/services/correction/fix/data_driven/transform_set_parser_test.dart
index d69efef..2c0776f 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/data_driven/transform_set_parser_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/data_driven/transform_set_parser_test.dart
@@ -704,6 +704,94 @@
     expect(result, null);
   }
 
+  void test_library() {
+    assertNoErrors('''
+version: 1
+transforms:
+- title: 'Rename g'
+  date: 2020-09-10
+  library: 'package:myPackage/test.dart'
+  changes:
+   - kind: 'replacedBy'
+     newLibrary: 'package:p2/material.dart'
+''');
+    var transforms = _transforms(
+      'package:myPackage/test.dart',
+      kinds: [ElementKind.libraryKind],
+      importedUris: [],
+    );
+    expect(transforms, hasLength(1));
+    var transform = transforms[0];
+    expect(transform.title, 'Rename g');
+    expect(_changes(transform), hasLength(1));
+  }
+
+  void test_library_invalidChangeField() {
+    assertErrors(
+      '''
+version: 1
+transforms:
+- title: 'Rename g'
+  date: 2020-09-10
+  library: 'package:myPackage/test.dart'
+  changes:
+   - kind: 'replacedBy'
+     newName: 'f'
+     newLibrary: 'g'
+''',
+      [error(diag.unsupportedKey, 143, 7)],
+    );
+  }
+
+  void test_library_invalidChangeKind() {
+    assertErrors(
+      '''
+version: 1
+transforms:
+- title: 'Rename g'
+  date: 2020-09-10
+  library: 'package:myPackage/test.dart'
+  changes:
+   - kind: 'rename'
+     newLibrary: 'f'
+''',
+      [error(diag.invalidChangeForKind, 125, 8)],
+    );
+  }
+
+  void test_library_multipleChanges() {
+    assertErrors(
+      '''
+version: 1
+transforms:
+- title: 'Rename g'
+  date: 2020-09-10
+  library: 'package:myPackage/test.dart'
+  changes:
+   - kind: 'replacedBy'
+     newLibrary: 'package:p2/material.dart'
+   - kind: 'replacedBy'
+     newLibrary: 'package:p3/material.dart'
+''',
+      [error(diag.invalidChangeForKind, 117, 133)],
+    );
+  }
+
+  void test_noElementOrLibrary() {
+    assertErrors(
+      '''
+version: 1
+transforms:
+- title: 'Rename g'
+  date: 2020-09-10
+  changes: []
+''',
+      [error(diag.missingOneOfMultipleKeys, 25, 51)],
+    );
+    var transforms = _transforms('g');
+    expect(transforms, hasLength(0));
+  }
+
   void test_removeParameter_named() {
     assertNoErrors('''
 version: 1
@@ -933,9 +1021,22 @@
   List<Change<Object>> _changes(Transform transform) =>
       (transform.changesSelector as UnconditionalChangesSelector).changes;
 
-  ElementMatcher _matcher(String name) =>
-      ElementMatcher(importedUris: uris, components: [name], kinds: const []);
+  ElementMatcher _matcher(
+    String name, {
+    List<ElementKind> kinds = const [],
+    List<Uri>? importedUris,
+  }) => ElementMatcher(
+    importedUris: importedUris ?? uris,
+    components: [name],
+    kinds: kinds,
+  );
 
-  List<Transform> _transforms(String name) =>
-      result!.transformsFor(_matcher(name), applyingBulkFixes: false);
+  List<Transform> _transforms(
+    String name, {
+    List<ElementKind> kinds = const [],
+    List<Uri>? importedUris,
+  }) => result!.transformsFor(
+    _matcher(name, kinds: kinds, importedUris: importedUris),
+    applyingBulkFixes: false,
+  );
 }
diff --git a/pkg/analysis_server/test/src/services/correction/fix/fix_processor.dart b/pkg/analysis_server/test/src/services/correction/fix/fix_processor.dart
index f6c9066..4fd0a73 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/fix_processor.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/fix_processor.dart
@@ -99,6 +99,10 @@
 }
 
 /// A base class defining support for writing bulk fix processor tests.
+///
+/// Tests using this base class validate that if there is more than one place to
+/// apply a fix, then the code is valid after applying as many fixes as possible
+/// in a single pass.
 abstract class BulkFixProcessorTest extends AbstractSingleUnitTest {
   /// The source change associated with the fix that was found, or `null` if
   /// neither [assertHasFix] nor [assertHasFixAllFix] has been invoked.
diff --git a/pkg/analysis_server/test/src/services/correction/fix/fix_processor_map_test.dart b/pkg/analysis_server/test/src/services/correction/fix/fix_processor_map_test.dart
index ccdab1f..d278835 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/fix_processor_map_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/fix_processor_map_test.dart
@@ -20,12 +20,14 @@
   static const List<String> lintsAllowedToHaveMultipleBulkFixes = [
     'avoid_types_on_closure_parameters',
     'empty_statements',
-    'prefer_collection_literals',
-    'prefer_const_constructors',
-    'prefer_inlined_adds',
     'omit_local_variable_types',
     'omit_obvious_local_variable_types',
     'omit_obvious_property_types',
+    'prefer_collection_literals',
+    'prefer_const_constructors',
+    'prefer_inlined_adds',
+    // This is safe because the two fixes are mutually exclusive.
+    'use_primary_constructors',
   ];
 
   static const List<String> warningsAllowedToHaveMultipleBulkFixes = [
diff --git a/pkg/analysis_server/test/src/services/correction/fix/remove_empty_container_body_test.dart b/pkg/analysis_server/test/src/services/correction/fix/remove_empty_container_body_test.dart
new file mode 100644
index 0000000..6fc75e5
--- /dev/null
+++ b/pkg/analysis_server/test/src/services/correction/fix/remove_empty_container_body_test.dart
@@ -0,0 +1,99 @@
+// Copyright (c) 2026, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analysis_server/src/services/correction/fix.dart';
+import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'fix_processor.dart';
+
+void main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(RemoveEmptyContainerBodyBulkTest);
+    defineReflectiveTests(RemoveEmptyContainerBodyTest);
+  });
+}
+
+@reflectiveTest
+class RemoveEmptyContainerBodyBulkTest extends BulkFixProcessorTest {
+  @override
+  String get lintCode => LintNames.empty_container_bodies;
+
+  Future<void> test_singleFile() async {
+    await resolveTestCode('''
+class C {}
+
+mixin M {}
+''');
+    await assertHasFix('''
+class C;
+
+mixin M;
+''');
+  }
+}
+
+@reflectiveTest
+class RemoveEmptyContainerBodyTest extends FixProcessorLintTest {
+  @override
+  FixKind get kind => DartFixKind.removeEmptyContainerBody;
+
+  @override
+  String get lintCode => LintNames.empty_container_bodies;
+
+  Future<void> test_class_multipleLines() async {
+    await resolveTestCode('''
+class C {
+}
+''');
+    await assertHasFix('''
+class C;
+''');
+  }
+
+  Future<void> test_class_singleLine() async {
+    await resolveTestCode('''
+class C {}
+''');
+    await assertHasFix('''
+class C;
+''');
+  }
+
+  Future<void> test_class_withExtends() async {
+    await resolveTestCode('''
+class C extends Object {}
+''');
+    await assertHasFix('''
+class C extends Object;
+''');
+  }
+
+  Future<void> test_extension() async {
+    await resolveTestCode('''
+extension E on String {}
+''');
+    await assertHasFix('''
+extension E on String;
+''');
+  }
+
+  Future<void> test_extensionType() async {
+    await resolveTestCode('''
+extension type E(int i) {}
+''');
+    await assertHasFix('''
+extension type E(int i);
+''');
+  }
+
+  Future<void> test_mixin() async {
+    await resolveTestCode('''
+mixin M {}
+''');
+    await assertHasFix('''
+mixin M;
+''');
+  }
+}
diff --git a/pkg/analysis_server/test/src/services/correction/fix/test_all.dart b/pkg/analysis_server/test/src/services/correction/fix/test_all.dart
index 7bd7be8..eeecc0c 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/test_all.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/test_all.dart
@@ -61,6 +61,8 @@
 import 'change_to_test.dart' as change_to;
 import 'change_type_annotation_test.dart' as change_type_annotation;
 import 'convert_class_to_enum_test.dart' as convert_class_to_enum;
+import 'convert_default_to_primary_constructor_test.dart'
+    as convert_default_to_primary_constructor;
 import 'convert_documentation_into_line_test.dart'
     as convert_documentation_into_line;
 import 'convert_flutter_child_test.dart' as convert_flutter_child;
@@ -81,6 +83,8 @@
 import 'convert_to_cascade_test.dart' as convert_to_cascade;
 import 'convert_to_constant_pattern_test.dart' as convert_to_constant_pattern;
 import 'convert_to_contains_test.dart' as convert_to_contains;
+import 'convert_to_declaring_parameter_test.dart'
+    as convert_to_declaring_parameter;
 import 'convert_to_double_quoted_string_test.dart'
     as convert_to_double_quoted_string;
 import 'convert_to_flutter_style_todo_test.dart'
@@ -108,6 +112,8 @@
 import 'convert_to_null_aware_test.dart' as convert_to_null_aware;
 import 'convert_to_on_type_test.dart' as convert_to_on_type;
 import 'convert_to_package_import_test.dart' as convert_to_package_import;
+import 'convert_to_primary_constructor_test.dart'
+    as convert_to_primary_constructor;
 import 'convert_to_raw_string_test.dart' as convert_to_raw_string;
 import 'convert_to_relative_import_test.dart' as convert_to_relative_import;
 import 'convert_to_set_literal_test.dart' as convert_to_set_literal;
@@ -199,6 +205,7 @@
 import 'remove_empty_catch_test.dart' as remove_empty_catch;
 import 'remove_empty_constructor_body_test.dart'
     as remove_empty_constructor_body;
+import 'remove_empty_container_body_test.dart' as remove_empty_container_body;
 import 'remove_empty_else_test.dart' as remove_empty_else;
 import 'remove_empty_statement_test.dart' as remove_empty_statement;
 import 'remove_extends_clause_test.dart' as remove_extends_clause;
@@ -381,6 +388,7 @@
     change_type_annotation.main();
     convert_class_to_enum.main();
     convert_documentation_into_line.main();
+    convert_default_to_primary_constructor.main();
     convert_flutter_child.main();
     convert_flutter_children.main();
     convert_for_each_to_for_loop.main();
@@ -396,6 +404,7 @@
     convert_to_cascade.main();
     convert_to_constant_pattern.main();
     convert_to_contains.main();
+    convert_to_declaring_parameter.main();
     convert_to_double_quoted_string.main();
     convert_to_flutter_style_todo.main();
     convert_to_for_element.main();
@@ -415,6 +424,7 @@
     convert_to_null_aware_spread.main();
     convert_to_on_type.main();
     convert_to_package_import.main();
+    convert_to_primary_constructor.main();
     convert_to_raw_string.main();
     convert_to_relative_import.main();
     convert_to_set_literal.main();
@@ -498,6 +508,7 @@
     remove_duplicate_case.main();
     remove_empty_catch.main();
     remove_empty_constructor_body.main();
+    remove_empty_container_body.main();
     remove_empty_else.main();
     remove_empty_statement.main();
     remove_extends_clause.main();
diff --git a/pkg/analysis_server/test/src/session_logger/log_normalizer_test.dart b/pkg/analysis_server/test/src/session_logger/log_normalizer_test.dart
index 6d07efb..041be51 100644
--- a/pkg/analysis_server/test/src/session_logger/log_normalizer_test.dart
+++ b/pkg/analysis_server/test/src/session_logger/log_normalizer_test.dart
@@ -2,6 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+import 'dart:convert' hide jsonEncode;
+
 import 'package:analysis_server/lsp_protocol/protocol.dart' as lsp;
 import 'package:analysis_server/src/session_logger/log_entry.dart';
 import 'package:analysis_server/src/session_logger/log_normalizer.dart';
@@ -17,18 +19,76 @@
   });
 }
 
+/// A jsonEncode function that formats/indents with two spaces.
+final _jsonEncode = JsonEncoder.withIndent('  ').convert;
+
 @reflectiveTest
 class LogNormalizerTest {
   late LogNormalizer normalizer;
   late String inputPath;
   late Uri inputUri;
+  String get inputUriString => inputUri.toString();
 
   void setUp() {
-    normalizer = LogNormalizer(path.context);
+    normalizer = LogNormalizer();
     inputPath = path.style == path.Style.windows ? r'C:\test' : '/test';
     inputUri = path.toUri(inputPath);
   }
 
+  void test_denormalize() {
+    var root = inputPath;
+    var rootFile = path.join(inputPath, 'file');
+    var nestedProject1 = path.join(inputPath, 'project1');
+    var nestedProject1File = path.join(nestedProject1, 'file');
+    var nestedProject2 = path.join(inputPath, 'project2');
+    var nestedProject2File = path.join(nestedProject2, 'file');
+    var externalProject1 = path.normalize(
+      path.join(inputPath, '..', 'externalProject1'),
+    );
+    var externalProject1File = path.join(externalProject1, 'file');
+
+    normalizer.addReplacementsForPath(root, 'root');
+    normalizer.addReplacementsForPath(nestedProject1, 'nestedProject1');
+    normalizer.addReplacementsForPath(nestedProject2, 'nestedProject2');
+    normalizer.addReplacementsForPath(externalProject1, 'externalProject1');
+
+    var inputPaths = [
+      root,
+      rootFile,
+      nestedProject1,
+      nestedProject1File,
+      nestedProject2,
+      nestedProject2File,
+      externalProject1,
+      externalProject1File,
+    ];
+
+    // For each tested path, include multiple variations we'd expect to be
+    // replaced
+    var testInput = inputPaths
+        .map(
+          // JSON encode each path in a list so that we have correct escaping
+          // to ensure that we restore the correct escaping.
+          (inputPath) => _jsonEncode([
+            inputPath,
+            inputPath.toUpperCase(),
+            inputPath.toLowerCase(),
+            Uri.file(inputPath).toString(),
+            Uri.file(inputPath.toUpperCase()).toString(),
+            Uri.file(inputPath.toLowerCase()).toString(),
+          ]),
+        )
+        .join('\n');
+
+    // Expect normalize + denormalize to be the same if we ignore case (we
+    // ignore case during normalization, so we can't reverse the case to what
+    // it was).
+    expect(
+      normalizer.denormalize(normalizer.normalize(testInput)).toLowerCase(),
+      testInput.toLowerCase(),
+    );
+  }
+
   @SkippedTest(reason: 'Manual benchmark for testing performance/changes')
   void test_normalize_benchmark() {
     // Total number of iterations of the test
@@ -54,7 +114,7 @@
       for (var i = 0; i < numPaths; i++) {
         var folderPath = path.join(inputPath, 'foo$i', 'bar$i');
         paths.add(folderPath);
-        normalizer.addPathReplacement(folderPath, '{{folder-$i}}');
+        normalizer.addReplacementsForPath(folderPath, 'folder-$i');
       }
 
       // Generate a payload.
@@ -86,9 +146,9 @@
       expect(
         output,
         allOf(
-          contains('{{folder-1}}'),
-          contains('{{folder-2}}'),
-          contains('{{folder-3}}'),
+          contains('{{folder-1:filePath}}'),
+          contains('{{folder-2:filePath}}'),
+          contains('{{folder-3:filePath}}'),
         ),
       );
 
@@ -109,10 +169,11 @@
   }
 
   void test_normalize_caseInsensitive() {
-    normalizer.addPathReplacement('old_value', 'new_value');
+    normalizer.addReplacementsForPath(inputPath.toLowerCase(), 'new_value');
 
-    var input = ' "OLD_VALUE" ';
-    var expected = ' "new_value" ';
+    var input =
+        ' "${inputPath.toUpperCase()}" "${inputUriString.toUpperCase()}" ';
+    var expected = ' "{{new_value:filePath}}" "{{new_value}}" ';
 
     expect(normalizer.normalize(input), expected);
   }
@@ -124,14 +185,32 @@
   void test_normalize_handlesEscapedColons() {
     if (path.style != path.Style.windows) return;
 
-    normalizer.addPathReplacement(r'C:\test', 'new_value');
+    normalizer.addReplacementsForPath(r'C:\test', 'new_value');
 
     var input = r' "file:///C:/test" "file:///C%3A/test" "file:///C%3a/test" ';
-    var expected = ' "new_value" "new_value" "new_value" ';
+    var expected = ' "{{new_value}}" "{{new_value}}" "{{new_value}}" ';
 
     expect(normalizer.normalize(input), expected);
   }
 
+  void test_normalize_handlesPathsAndUris() {
+    normalizer.addReplacementsForPath(inputPath, 'workspaceFolder0');
+
+    var testPath = path.join(inputPath, 'a', 'b.dart');
+    var testUri = Uri.file(testPath);
+    var testPayload = _jsonEncode({
+      'filePath': testPath,
+      'fileUri': testUri.toString(),
+    });
+
+    var expectedPayload = _jsonEncode({
+      'filePath': path.join('{{workspaceFolder0:filePath}}', 'a', 'b.dart'),
+      'fileUri': '{{workspaceFolder0}}/a/b.dart',
+    });
+
+    expect(normalizer.normalize(testPayload), expectedPayload);
+  }
+
   void test_normalize_includesAllLspFields() {
     var rootPath = path.join(inputPath, 'rootPath');
     var rootUri = Uri.file(path.join(inputPath, 'rootUri'));
@@ -158,7 +237,8 @@
     );
 
     var input = ' "$rootPath" "$rootUri" "$workspaceFolderUri" ';
-    var expected = ' "{{rootPath}}" "{{rootUri}}" "{{workspaceFolder-0}}" ';
+    var expected =
+        ' "{{rootPath:filePath}}" "{{rootUri}}" "{{workspaceFolder-0}}" ';
 
     expect(normalizer.normalize(input), expected);
   }
@@ -167,14 +247,14 @@
   /// are replaced correctly (and that the parent replacement is not made as
   /// a prefix to the child paths).
   void test_normalize_nestedPaths_posix() {
-    normalizer = LogNormalizer(path.posix);
+    normalizer = LogNormalizer();
     // Add nested path both before and after to ensure we handle both cases.
-    normalizer.addPathReplacement('/root/nested1', '{n1}');
-    normalizer.addPathReplacement('/root', '{r1}');
-    normalizer.addPathReplacement('/root/nested2', '{n2}');
+    normalizer.addReplacementsForPath('/root/nested1', 'n1');
+    normalizer.addReplacementsForPath('/root', 'r1');
+    normalizer.addReplacementsForPath('/root/nested2', 'n2');
 
     var input = ' "/root/nested1" "/root" "/root/nested2" ';
-    var expected = ' "{n1}" "{r1}" "{n2}" ';
+    var expected = ' "{{n1:filePath}}" "{{r1:filePath}}" "{{n2:filePath}}" ';
 
     expect(normalizer.normalize(input), expected);
   }
@@ -183,47 +263,54 @@
   /// are replaced correctly (and that the parent replacement is not made as
   /// a prefix to the child paths).
   void test_normalize_nestedPaths_windows() {
-    normalizer = LogNormalizer(path.windows);
+    normalizer = LogNormalizer();
     // Add nested path both before and after to ensure we handle both cases.
-    normalizer.addPathReplacement(r'C:\root\nested1', '{n1}');
-    normalizer.addPathReplacement(r'C:\root', '{r1}');
-    normalizer.addPathReplacement(r'C:\root\nested2', '{n2}');
+    normalizer.addReplacementsForPath(r'C:\root\nested1', 'n1');
+    normalizer.addReplacementsForPath(r'C:\root', 'r1');
+    normalizer.addReplacementsForPath(r'C:\root\nested2', 'n2');
 
     var input = r' "C:\root\nested1" "C:\root" "C:\root\nested2" ';
-    var expected = ' "{n1}" "{r1}" "{n2}" ';
+    var expected = ' "{{n1:filePath}}" "{{r1:filePath}}" "{{n2:filePath}}" ';
 
     expect(normalizer.normalize(input), expected);
   }
 
   /// A replacement for `/a` should not replace substrings of other paths that
   /// contain `/a`.
-  void test_normalize_overlappingPaths() {
-    normalizer.addPathReplacement('/ab', '{ab}');
-    normalizer.addPathReplacement('/a', '{a}');
+  ///
+  void test_normalize_overlappingPaths_posix() {
+    // This only applies to posix paths because absolute Windows paths can't be
+    // substrings (and prefix matches are tested by the nestedPaths tests).
+    normalizer = LogNormalizer();
 
-    var input = ' "/a" "/ab" "/abc" "/abcd" "/b/a/ab/" ';
-    var expected = ' "{a}" "{ab}" "/abc" "/abcd" "/b/a/ab/" ';
+    normalizer.addReplacementsForPath('/ab', 'ab');
+    normalizer.addReplacementsForPath('/a', 'a');
+    normalizer.addReplacementsForPath('/ac', 'ac');
+
+    var input = ' "/a" "/ab" "/ac" "/abc" "/abcd" "/b/a/ab/" ';
+    var expected =
+        ' "{{a:filePath}}" "{{ab:filePath}}" "{{ac:filePath}}" "/abc" "/abcd" "/b/a/ab/" ';
 
     expect(normalizer.normalize(input), expected);
   }
 
-  /// Paths will be replaced without a trailing path separator if they are the
-  /// end of the string.
+  /// Paths will be replaced even if they don't have a trailing path separator
+  /// if they are the end of the string.
   void test_normalize_path_quoted() {
-    normalizer.addPathReplacement(inputPath, '{replaced}');
+    normalizer.addReplacementsForPath(inputPath, 'replaced');
 
     var input = ' "$inputPath" ';
-    var expected = ' "{replaced}" ';
+    var expected = ' "{{replaced:filePath}}" ';
 
     expect(normalizer.normalize(input), expected);
   }
 
-  /// Paths will be replaced with a trailing path separator.
+  /// Paths will be replaced when they have a trailing path separator.
   void test_normalize_path_quotedWithTrailingSeparator() {
-    normalizer.addPathReplacement(inputPath, '{replaced}');
+    normalizer.addReplacementsForPath(inputPath, 'replaced');
 
     var input = ' "$inputPath${path.separator}foo" ';
-    var expected = ' "{replaced}${path.separator}foo" ';
+    var expected = ' "{{replaced:filePath}}${path.separator}foo" ';
 
     expect(normalizer.normalize(input), expected);
   }
@@ -232,7 +319,7 @@
   /// and require a leading quote and a trailing quote or path separator to
   /// match.
   void test_normalize_path_unquoted() {
-    normalizer.addPathReplacement(inputPath, '{replaced}');
+    normalizer.addReplacementsForPath(inputPath, 'replaced');
 
     var input = ' $inputPath "$inputPath $inputPath${path.separator} ';
     var expected = input;
@@ -241,10 +328,10 @@
   }
 
   void test_normalize_replacesAll() {
-    normalizer.addPathReplacement('old_value', 'new_value');
+    normalizer.addReplacementsForPath(inputPath, 'new_value');
 
-    var input = ' "old_value" ' * 10;
-    var expected = ' "new_value" ' * 10;
+    var input = ' "$inputPath" ' * 10;
+    var expected = ' "{{new_value:filePath}}" ' * 10;
 
     expect(normalizer.normalize(input), expected);
   }
@@ -252,20 +339,20 @@
   /// Uris will be replaced without a trailing uri separator if they are the
   /// end of the string.
   void test_normalize_uri_quoted() {
-    normalizer.addPathReplacement(inputPath, '{replaced}');
+    normalizer.addReplacementsForPath(inputPath, 'replaced');
 
     var input = ' "$inputUri" ';
-    var expected = ' "{replaced}" ';
+    var expected = ' "{{replaced}}" ';
 
     expect(normalizer.normalize(input), expected);
   }
 
   /// Uris will be replaced with a trailing uri separator.
   void test_normalize_uri_quotedWithTrailingSeparator() {
-    normalizer.addPathReplacement(inputPath, '{replaced}');
+    normalizer.addReplacementsForPath(inputPath, 'replaced');
 
     var input = ' "$inputUri/foo" ';
-    var expected = ' "{replaced}/foo" ';
+    var expected = ' "{{replaced}}/foo" ';
 
     expect(normalizer.normalize(input), expected);
   }
@@ -274,7 +361,7 @@
   /// and require a leading quote and a trailing quote or uri separator to
   /// match.
   void test_normalize_uri_unquoted() {
-    normalizer.addPathReplacement(inputPath, '{replaced}');
+    normalizer.addReplacementsForPath(inputPath, 'replaced');
 
     var input = ' $inputUri "$inputUri $inputUri/ ';
     var expected = input;
diff --git a/pkg/analysis_server/test/src/session_logger/session_logger_sink_test.dart b/pkg/analysis_server/test/src/session_logger/session_logger_sink_test.dart
index 0d24f02..a09c777 100644
--- a/pkg/analysis_server/test/src/session_logger/session_logger_sink_test.dart
+++ b/pkg/analysis_server/test/src/session_logger/session_logger_sink_test.dart
@@ -2,11 +2,14 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+import 'dart:io' as io;
+
 import 'package:analysis_server/src/session_logger/log_normalizer.dart';
 import 'package:analysis_server/src/session_logger/session_logger_sink.dart';
 import 'package:analyzer/file_system/memory_file_system.dart';
+import 'package:analyzer/file_system/physical_file_system.dart';
 import 'package:analyzer_testing/utilities/extensions/resource_provider.dart';
-import 'package:path/path.dart' as path show Context;
+import 'package:path/path.dart' as path;
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
@@ -17,26 +20,56 @@
   });
 }
 
+/// Test the [SessionLoggerFileSink], an implementation of [SessionLoggerSink]
+/// that writes to the physical disk via `dart:io`. It doesn't use the
+/// analyzer file abstraction, as it uses `openWrite()` and `IOSink` which are
+/// not implemented in the abstraction.
 @reflectiveTest
 class SessionLoggerFileSinkTest {
   late LogNormalizer normalizer;
-  late MemoryResourceProvider provider;
-  late path.Context pathContext;
+  late io.Directory tempDirectory;
+  late String logPath;
+  late io.File logFile;
+  PhysicalResourceProvider provider = PhysicalResourceProvider.INSTANCE;
+  late path.Context pathContext = provider.pathContext;
+
+  late String Function(String) convertPath = ResourceProviderExtension(
+    provider,
+  ).convertPath;
 
   void setUp() {
-    provider = MemoryResourceProvider();
-    pathContext = provider.pathContext;
-    normalizer = LogNormalizer(pathContext);
+    normalizer = LogNormalizer();
+    tempDirectory = io.Directory.systemTemp.createTempSync(
+      'dartServer_sessionLog_fileSinkTest',
+    );
+    logPath = path.join(tempDirectory.path, 'foo.txt');
+    logFile = io.File(logPath);
+  }
+
+  void tearDown() {
+    tempDirectory.deleteSync(recursive: true);
+  }
+
+  Future<void> test_multipleWrites() async {
+    var fileSink = SessionLoggerFileSink(logPath, normalizer: normalizer);
+
+    // Write multiple entries
+    fileSink.writeLogEntry({'id': 1});
+    fileSink.writeLogEntry({'id': 2});
+    fileSink.writeLogEntry({'id': 3});
+
+    await fileSink.close();
+
+    // Ensure they are all recorded.
+    var content = io.File(logPath).readAsStringSync();
+    expect(content, '{"id":1}\n{"id":2}\n{"id":3}\n');
   }
 
   Future<void> test_normalized() async {
-    var convertPath = ResourceProviderExtension(provider).convertPath;
-    var logPath = convertPath('/foo.txt');
     var pathToNormalize = convertPath('/path/to/normalize');
 
-    var logFile = provider.getFile(logPath);
-    var fileSink = SessionLoggerFileSink(logFile, normalizer: normalizer);
-    normalizer.addPathReplacement(pathToNormalize, '{{normalized}}');
+    var fileSink = SessionLoggerFileSink(logPath, normalizer: normalizer);
+    normalizer.addReplacementsForPath(pathToNormalize, 'normalized');
     fileSink.writeLogEntry({
       'kind': 'message',
       'message': {
@@ -49,7 +82,9 @@
       },
     });
 
-    var content = logFile.readAsStringSync();
+    await fileSink.close();
+
+    var content = io.File(logPath).readAsStringSync();
     expect(
       content,
       '{"kind":"message",'
@@ -69,7 +104,7 @@
   void setUp() {
     provider = MemoryResourceProvider();
     pathContext = provider.pathContext;
-    normalizer = LogNormalizer(pathContext);
+    normalizer = LogNormalizer();
     sink = SessionLoggerInMemorySink(
       maxBufferLength: 10,
       normalizer: normalizer,
@@ -80,7 +115,7 @@
     var convertPath = ResourceProviderExtension(provider).convertPath;
     var pathToNormalize = convertPath('/path/to/normalize');
 
-    normalizer.addPathReplacement(pathToNormalize, '{{normalized}}');
+    normalizer.addReplacementsForPath(pathToNormalize, 'normalized');
     sink.startCapture();
     sink.writeLogEntry({
       'kind': 'message',
diff --git a/pkg/analysis_server/test/tool/log_player/message_equality_test.dart b/pkg/analysis_server/test/tool/log_player/message_equality_test.dart
index f943a52..5b87c79 100644
--- a/pkg/analysis_server/test/tool/log_player/message_equality_test.dart
+++ b/pkg/analysis_server/test/tool/log_player/message_equality_test.dart
@@ -105,6 +105,21 @@
       expect(MessageEquality(ignoredKeys: {'ignoreMe'}).equals(m1, m2), isTrue);
     });
 
+    test('matches result with qualified ignored key differences', () {
+      var m1 = Message({
+        'id': 1,
+        'result': {'a': 1, 'ignoreMe': 2},
+      });
+      var m2 = Message({
+        'id': 1,
+        'result': {'a': 1, 'ignoreMe': 3},
+      });
+      expect(
+        MessageEquality(ignoredKeys: {'result.ignoreMe'}).equals(m1, m2),
+        isTrue,
+      );
+    });
+
     test('matches nested maps in params with ignored keys', () {
       var m1 = Message({
         'method': 'foo',
diff --git a/pkg/analysis_server/tool/log_player/log.dart b/pkg/analysis_server/tool/log_player/log.dart
index c75db37..feef600 100644
--- a/pkg/analysis_server/tool/log_player/log.dart
+++ b/pkg/analysis_server/tool/log_player/log.dart
@@ -15,8 +15,11 @@
 
   /// Creates a log by reading the content of the [file] and decoding it as a
   /// list of entries.
-  factory Log.fromFile(File file, Map<String, String> replacements) {
-    return Log.fromString(file.readAsStringSync(), replacements);
+  ///
+  /// [denormalizer] will be called on the content to reverse any normalization
+  /// that was applied to the log.
+  factory Log.fromFile(File file, String Function(String) denormalizer) {
+    return Log.fromString(file.readAsStringSync(), denormalizer);
   }
 
   /// Creates a log by decoding the [logContent] as a list of entries.
@@ -24,11 +27,14 @@
   /// The [logContent] should be a newline separated list of encoded [LogEntry]
   /// objects matching typical stdio communication patterns.
   ///
-  /// Each entry in [replacements] is all occurences of the key replaced with
-  /// the value.
-  factory Log.fromString(String logContent, Map<String, String> replacements) {
-    for (var entry in replacements.entries) {
-      logContent = logContent.replaceAll(entry.key, entry.value);
+  /// [denormalizer] will be called on the content to reverse any normalization
+  /// that was applied to the log.
+  factory Log.fromString(
+    String logContent, [
+    String Function(String)? denormalizer,
+  ]) {
+    if (denormalizer != null) {
+      logContent = denormalizer(logContent);
     }
     var lines = const LineSplitter().convert(logContent);
     return Log._([
diff --git a/pkg/analysis_server/tool/log_player/log_player.dart b/pkg/analysis_server/tool/log_player/log_player.dart
index edab22a..00720d6 100644
--- a/pkg/analysis_server/tool/log_player/log_player.dart
+++ b/pkg/analysis_server/tool/log_player/log_player.dart
@@ -50,7 +50,15 @@
 
   final Logger logger = Logger.standard();
 
-  LogPlayer({required this.log, this.timeout = const Duration(seconds: 5)});
+  /// Whether to print verbose output, for example full messages when there are
+  /// mismatches.
+  final bool verbose;
+
+  LogPlayer({
+    required this.log,
+    this.timeout = const Duration(seconds: 5),
+    this.verbose = false,
+  });
 
   /// Plays the log.
   Future<void> play() async {
@@ -246,13 +254,19 @@
       } else {
         if (!_shouldSkip(message)) {
           stderr.writeln(
-            'Unexpected message from analysis server: ${message.preview}',
+            'Unexpected message from analysis server: ${_preview(message)}',
           );
         }
       }
     }
   }
 
+  /// Returns a preview of the message, or if in verbose mode, the whole
+  /// JSON payload.
+  String _preview(Message message) {
+    return verbose ? jsonEncode(message.map) : message.preview;
+  }
+
   /// Sends the message in the [entry] to the server.
   Future<void> _sendMessageToServer(
     LogEntry entry,
@@ -313,9 +327,9 @@
       }
       throw TimeoutException(
         'Timed out waiting for analysis server messages:\n\n'
-        '${pendingServerMessageExpectations.map((m) => m.preview).join('\n\n')}'
+        '${pendingServerMessageExpectations.map(_preview).join('\n\n')}'
         '\n\nUnmatched analysis server messages:\n\n'
-        '${extraServerMessages.map((m) => m.preview).join('\n\n')}',
+        '${extraServerMessages.map(_preview).join('\n\n')}',
       );
     } finally {
       progress.finish(showTiming: true);
@@ -324,7 +338,16 @@
 }
 
 extension MessageExtension on Message {
-  static final _messageEquality = MessageEquality(ignoredKeys: {'version'});
+  static final _messageEquality = MessageEquality(
+    ignoredKeys: {
+      // Ignore commands because they change on the server and the log we're
+      // replaying might have been captured with a slightly older SDK.
+      'result.capabilities.executeCommandProvider.commands',
+      // The SDK version is in this field which can include hashes when using
+      // local/bleeding-edge builds.
+      'serverInfo.version',
+    },
+  );
 
   // A preview of the message, first 100 chars followed by "..."
   String get preview {
diff --git a/pkg/analysis_server/tool/log_player/message_equality.dart b/pkg/analysis_server/tool/log_player/message_equality.dart
index 1981686..549e091 100644
--- a/pkg/analysis_server/tool/log_player/message_equality.dart
+++ b/pkg/analysis_server/tool/log_player/message_equality.dart
@@ -27,9 +27,9 @@
     if (!skipMatchId && a.id != b.id) return false;
     return switch (a.method) {
       // No method means this is a response, compare the result.
-      null => _recursiveEquality.equals(a.result, b.result),
+      null => _recursiveEquality.equals(a.result, b.result, path: 'result'),
       // A method means this is a request, compare the params.
-      String() => _recursiveEquality.equals(a.params, b.params),
+      String() => _recursiveEquality.equals(a.params, b.params, path: 'params'),
     };
   }
 
@@ -52,11 +52,11 @@
   _CustomDeepCollectionEquality(this._ignoredKeys);
 
   @override
-  bool equals(Object? e1, Object? e2) {
+  bool equals(Object? e1, Object? e2, {String? path}) {
     if (identical(e1, e2)) return true;
 
     if (e1 is Map<String, Object?> && e2 is Map<String, Object?>) {
-      return _mapEquals(e1, e2);
+      return _mapEquals(e1, e2, path);
     } else if (e1 is List<Object?> && e2 is List<Object?>) {
       if (e1.every((entry) => entry is int)) {
         return _orderedListEquality.equals(e1, e2);
@@ -80,15 +80,41 @@
   @override
   bool isValidKey(Object? o) => true;
 
-  bool _mapEquals(Map<String, Object?> e1, Map<String, Object?> e2) {
-    var keys1 = e1.keys.where((k) => !_ignoredKeys.contains(k)).toSet();
-    var keys2 = e2.keys.where((k) => !_ignoredKeys.contains(k)).toSet();
+  /// Joins an optional [parentPath] and child [key].
+  String _childPath(String? parentPath, String key) =>
+      parentPath != null ? '$parentPath.$key' : key;
+
+  /// Checks if [key] is an ignored field when it exists as a child in a path
+  /// of [parentPath].
+  ///
+  /// Paths can be partial, so an ignored path of  'b.c' will ignore a field
+  /// at 'a.b.c'.
+  bool _isIgnoredPath(String? parentPath, String key) {
+    var actualPath = _childPath(parentPath, key);
+    return _ignoredKeys.any(
+      (ignoredKey) =>
+          actualPath == ignoredKey || actualPath.endsWith('.$ignoredKey'),
+    );
+  }
+
+  /// Checks if [e1] and [e2] are equal, taking into account any ignored paths.
+  ///
+  /// If these maps are not from the top level, [path] is the qualified path to
+  /// them.
+  bool _mapEquals(
+    Map<String, Object?> e1,
+    Map<String, Object?> e2,
+    String? path,
+  ) {
+    var keys1 = e1.keys.where((key) => !_isIgnoredPath(path, key)).toSet();
+    var keys2 = e2.keys.where((key) => !_isIgnoredPath(path, key)).toSet();
 
     if (keys1.length != keys2.length) return false;
 
     for (var key in keys1) {
       if (!keys2.contains(key)) return false;
-      if (!equals(e1[key], e2[key])) return false;
+      var childPath = _childPath(path, key);
+      if (!equals(e1[key], e2[key], path: childPath)) return false;
     }
 
     return true;
diff --git a/pkg/analysis_server/tool/log_player/normalize.dart b/pkg/analysis_server/tool/log_player/normalize.dart
index 074bdc1..50dc791 100644
--- a/pkg/analysis_server/tool/log_player/normalize.dart
+++ b/pkg/analysis_server/tool/log_player/normalize.dart
@@ -4,6 +4,7 @@
 
 import 'dart:io' show Directory, exit;
 
+import 'package:analysis_server/src/session_logger/log_normalizer.dart';
 import 'package:analyzer/file_system/file_system.dart';
 import 'package:analyzer/file_system/physical_file_system.dart';
 import 'package:args/args.dart';
@@ -120,39 +121,29 @@
 // TODO(somebody): Don't take a package config, instead infer them from the
 // workspace directories.
 String normalizeLog(File input, List<ContextRoot> contextRoots) {
-  var content = input.readAsStringSync();
+  var normalizer = LogNormalizer();
 
-  // First, replace the workspace folder paths.
-  var original = Log.fromString(content, {});
+  var content = input.readAsStringSync();
+  var original = Log.fromString(content);
   var initializeMessage = original.entries.firstWhere(
     (log) => log.isMessage && log.message.isInitializeRequest,
   );
-  var workspaceFolders =
-      ((initializeMessage.message.map['params']
-                  as Map<String, Object?>)['workspaceFolders']
-              as List)
-          .cast<Map<String, Object?>>();
-  for (var i = 0; i < workspaceFolders.length; i++) {
-    var folder = workspaceFolders[i];
-    var uri = Uri.parse(folder['uri'] as String);
-    content = content.replaceAll(uri.path, '{{workspaceFolder-$i}}');
-  }
 
-  // Next, replace the Dart SDK path.
-  content = content.replaceAll(sdkPath, '{{dartSdkRoot}}');
+  // Add all the workspace + root paths from the initialize message.
+  normalizer.addLspWorkspaceReplacements(initializeMessage.message);
 
-  // TODO(somebody): Replace the Flutter SDK path with '{{flutterSdkRoot}}'.
-
-  // Finally, replace the package roots.
+  // Additionally add SDKs and packages.
+  normalizer.addReplacementsForPath(sdkPath, 'dartSdkRoot');
+  // TODO(somebody): replace {{flutterSdkRoot}} with the flutter SDK path
   for (var i = 0; i < contextRoots.length; i++) {
-    var contextRoot = contextRoots[i];
-
-    for (var package in contextRoot.packageConfig.packages) {
-      content = content.replaceAll(
-        package.root.toString(),
-        '{{context-$i:package-root:${package.name}}}',
+    for (var package in contextRoots[i].packageConfig.packages) {
+      normalizer.addReplacementsForUri(
+        package.root,
+        'context-$i:package-root:${package.name}',
       );
     }
   }
-  return content;
+
+  // Now normalize the full content.
+  return normalizer.normalize(content);
 }
diff --git a/pkg/analysis_server/tool/log_player/server_driver_main.dart b/pkg/analysis_server/tool/log_player/server_driver_main.dart
index 282a36e..c93618f 100644
--- a/pkg/analysis_server/tool/log_player/server_driver_main.dart
+++ b/pkg/analysis_server/tool/log_player/server_driver_main.dart
@@ -8,6 +8,7 @@
 import 'package:analysis_server/src/server/driver.dart';
 import 'package:analysis_server/src/session_logger/entry_kind.dart';
 import 'package:analysis_server/src/session_logger/log_entry.dart';
+import 'package:analysis_server/src/session_logger/log_normalizer.dart';
 import 'package:analysis_server/src/session_logger/process_id.dart';
 import 'package:analyzer/file_system/physical_file_system.dart';
 import 'package:path/path.dart' as p;
@@ -52,7 +53,11 @@
     throw ArgumentError('Log file does not exist: ${logFile.path}');
   }
   print('Replaying log file at: $path with workspace folder: ${p.current}');
-  var log = Log.fromFile(logFile, {'{{workspaceFolder-0}}': p.current});
+  var normalizer = LogNormalizer()
+    ..addReplacementsForPath(p.current, 'workspaceFolder-0')
+    ..addReplacementsForPath(p.current, 'rootPath')
+    ..addReplacementsForPath(p.current, 'rootUri');
+  var log = Log.fromFile(logFile, normalizer.denormalize);
 
   print('ready, hit enter to send next message');
   var entriesIterator = log.entries.iterator;
diff --git a/pkg/analysis_server/tool/performance/project_generator/git_clone_project_generator.dart b/pkg/analysis_server/tool/performance/project_generator/git_clone_project_generator.dart
index ed09801..50c0bfb 100644
--- a/pkg/analysis_server/tool/performance/project_generator/git_clone_project_generator.dart
+++ b/pkg/analysis_server/tool/performance/project_generator/git_clone_project_generator.dart
@@ -18,11 +18,15 @@
   /// The ref (commit sha, tag, or branch) to check out.
   final String ref;
 
-  /// Relative paths to the sub-directories of the repo to open in the
-  /// workspace.
+  /// Relative paths (using the current platforms separators) to the
+  /// sub-directories of the repo to open in the workspace.
   final Iterable<String>? openSubdirs;
 
-  GitCloneProjectGenerator(this.repo, this.ref, {this.openSubdirs});
+  GitCloneProjectGenerator(this.repo, this.ref, {Iterable<String>? openSubdirs})
+    : // Normalize any path separators to match the current platform.
+      openSubdirs = openSubdirs?.map(
+        (openSubdir) => openSubdir.replaceAll(RegExp(r'\/'), p.separator),
+      );
 
   @override
   String get description => 'Cloning git repo "$repo" at ref "$ref"';
diff --git a/pkg/analysis_server/tool/performance/project_generator/git_worktree_project_generator.dart b/pkg/analysis_server/tool/performance/project_generator/git_worktree_project_generator.dart
index d8737fd..76f1670 100644
--- a/pkg/analysis_server/tool/performance/project_generator/git_worktree_project_generator.dart
+++ b/pkg/analysis_server/tool/performance/project_generator/git_worktree_project_generator.dart
@@ -23,16 +23,19 @@
   /// up a bit differently.
   final bool isSdkRepo;
 
-  /// Relative paths to the sub-directories of the repo that should be open in
-  /// this workspace.
+  /// Relative paths (using the current platforms separators) to the
+  /// sub-directories of the repo to open in the workspace.
   final Iterable<String>? openSubdirs;
 
   GitWorktreeProjectGenerator(
     this.originalRepo,
     this.ref, {
     this.isSdkRepo = false,
-    this.openSubdirs,
-  });
+    Iterable<String>? openSubdirs,
+  }) : // Normalize any path separators to match the current platform.
+       openSubdirs = openSubdirs?.map(
+         (openSubdir) => openSubdir.replaceAll(RegExp(r'\/'), p.separator),
+       );
 
   @override
   String get description =>
diff --git a/pkg/analysis_server/tool/performance/project_generator/project_generator.dart b/pkg/analysis_server/tool/performance/project_generator/project_generator.dart
index 2335dc0..1f08d62 100644
--- a/pkg/analysis_server/tool/performance/project_generator/project_generator.dart
+++ b/pkg/analysis_server/tool/performance/project_generator/project_generator.dart
@@ -34,7 +34,9 @@
       pubspec['dependencies']?['flutter'] != null ||
       pubspec['dev_dependencies']?['flutter'] != null ||
       pubspec['dev_dependencies']?['flutter_test'] != null;
-  var sdk = isFlutter ? 'flutter' : 'dart';
+  var sdk = isFlutter
+      ? (Platform.isWindows ? 'flutter.bat' : 'flutter')
+      : 'dart';
   print('Fetching dependencies with `$sdk pub get` in ${projectDir.path}');
   var pubGetResult = await Process.run(sdk, [
     'pub',
diff --git a/pkg/analysis_server/tool/performance/scenarios/logs/DAS-test1-norm.json b/pkg/analysis_server/tool/performance/scenarios/logs/DAS-test1-norm.json
index 4709cc5..5a2ff62 100644
--- a/pkg/analysis_server/tool/performance/scenarios/logs/DAS-test1-norm.json
+++ b/pkg/analysis_server/tool/performance/scenarios/logs/DAS-test1-norm.json
@@ -1,30 +1,30 @@
 {"time":1768944161578,"kind":"commandLine","argList":["--protocol=lsp","--client-id=VS-Code","--client-version=3.126.0"]}
-{"time":1768944161598,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","id":0,"method":"initialize","params":{"processId":27416,"clientInfo":{"name":"Visual Studio Code","version":"1.108.1"},"locale":"en","rootPath":"c:\\work\\devtools_companion","rootUri":"file://{{workspaceFolder-0}}","capabilities":{"workspace":{"applyEdit":true,"workspaceEdit":{"documentChanges":true,"resourceOperations":["create","rename","delete"],"failureHandling":"textOnlyTransactional","normalizesLineEndings":true,"changeAnnotationSupport":{"groupsOnLabel":true}},"configuration":true,"didChangeWatchedFiles":{"dynamicRegistration":true,"relativePatternSupport":true},"symbol":{"dynamicRegistration":true,"symbolKind":{"valueSet":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26]},"tagSupport":{"valueSet":[1]},"resolveSupport":{"properties":["location.range"]}},"codeLens":{"refreshSupport":true},"executeCommand":{"dynamicRegistration":true},"didChangeConfiguration":{"dynamicRegistration":true},"workspaceFolders":true,"foldingRange":{"refreshSupport":true},"semanticTokens":{"refreshSupport":true},"fileOperations":{"dynamicRegistration":true,"didCreate":true,"didRename":true,"didDelete":true,"willCreate":true,"willRename":true,"willDelete":true},"inlineValue":{"refreshSupport":true},"inlayHint":{"refreshSupport":true},"diagnostics":{"refreshSupport":true}},"textDocument":{"publishDiagnostics":{"relatedInformation":true,"versionSupport":false,"tagSupport":{"valueSet":[1,2]},"codeDescriptionSupport":true,"dataSupport":true},"synchronization":{"dynamicRegistration":true,"willSave":true,"willSaveWaitUntil":true,"didSave":true},"completion":{"dynamicRegistration":true,"contextSupport":true,"completionItem":{"snippetSupport":true,"commitCharactersSupport":true,"documentationFormat":["markdown","plaintext"],"deprecatedSupport":true,"preselectSupport":true,"tagSupport":{"valueSet":[1]},"insertReplaceSupport":true,"resolveSupport":{"properties":["documentation","detail","additionalTextEdits"]},"insertTextModeSupport":{"valueSet":[1,2]},"labelDetailsSupport":true},"insertTextMode":2,"completionItemKind":{"valueSet":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25]},"completionList":{"itemDefaults":["commitCharacters","editRange","insertTextFormat","insertTextMode","data"]}},"hover":{"dynamicRegistration":true,"contentFormat":["markdown","plaintext"]},"signatureHelp":{"dynamicRegistration":true,"signatureInformation":{"documentationFormat":["markdown","plaintext"],"parameterInformation":{"labelOffsetSupport":true},"activeParameterSupport":true},"contextSupport":true},"definition":{"dynamicRegistration":true,"linkSupport":true},"references":{"dynamicRegistration":true},"documentHighlight":{"dynamicRegistration":true},"documentSymbol":{"dynamicRegistration":true,"symbolKind":{"valueSet":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26]},"hierarchicalDocumentSymbolSupport":true,"tagSupport":{"valueSet":[1]},"labelSupport":true},"codeAction":{"dynamicRegistration":true,"isPreferredSupport":true,"disabledSupport":true,"dataSupport":true,"resolveSupport":{"properties":["edit"]},"codeActionLiteralSupport":{"codeActionKind":{"valueSet":["","quickfix","refactor","refactor.extract","refactor.inline","refactor.rewrite","source","source.organizeImports"]}},"honorsChangeAnnotations":true},"codeLens":{"dynamicRegistration":true},"formatting":{"dynamicRegistration":true},"rangeFormatting":{"dynamicRegistration":true,"rangesSupport":true},"onTypeFormatting":{"dynamicRegistration":true},"rename":{"dynamicRegistration":true,"prepareSupport":true,"prepareSupportDefaultBehavior":1,"honorsChangeAnnotations":true},"documentLink":{"dynamicRegistration":true,"tooltipSupport":true},"typeDefinition":{"dynamicRegistration":true,"linkSupport":true},"implementation":{"dynamicRegistration":true,"linkSupport":true},"colorProvider":{"dynamicRegistration":true},"foldingRange":{"dynamicRegistration":true,"rangeLimit":5000,"lineFoldingOnly":true,"foldingRangeKind":{"valueSet":["comment","imports","region"]},"foldingRange":{"collapsedText":false}},"declaration":{"dynamicRegistration":true,"linkSupport":true},"selectionRange":{"dynamicRegistration":true},"callHierarchy":{"dynamicRegistration":true},"semanticTokens":{"dynamicRegistration":true,"tokenTypes":["namespace","type","class","enum","interface","struct","typeParameter","parameter","variable","property","enumMember","event","function","method","macro","keyword","modifier","comment","string","number","regexp","operator","decorator"],"tokenModifiers":["declaration","definition","readonly","static","deprecated","abstract","async","modification","documentation","defaultLibrary"],"formats":["relative"],"requests":{"range":true,"full":{"delta":true}},"multilineTokenSupport":false,"overlappingTokenSupport":false,"serverCancelSupport":true,"augmentsSyntaxTokens":true},"linkedEditingRange":{"dynamicRegistration":true},"typeHierarchy":{"dynamicRegistration":true},"inlineValue":{"dynamicRegistration":true},"inlayHint":{"dynamicRegistration":true,"resolveSupport":{"properties":["tooltip","textEdits","label.tooltip","label.location","label.command"]}},"diagnostic":{"dynamicRegistration":true,"relatedDocumentSupport":false}},"window":{"showMessage":{"messageActionItem":{"additionalPropertiesSupport":true}},"showDocument":{"support":true},"workDoneProgress":true},"general":{"staleRequestSupport":{"cancel":true,"retryOnContentModified":["textDocument/semanticTokens/full","textDocument/semanticTokens/range","textDocument/semanticTokens/full/delta"]},"regularExpressions":{"engine":"ECMAScript","version":"ES2020"},"markdown":{"parser":"marked","version":"1.1.0","allowedTags":["ul","li","p","code","blockquote","ol","h1","h2","h3","h4","h5","h6","hr","em","pre","table","thead","tbody","tr","th","td","div","del","a","strong","br","img","span"]},"positionEncodings":["utf-16"]},"notebookDocument":{"synchronization":{"dynamicRegistration":true,"executionSummarySupport":true}},"experimental":{"supportsWindowShowMessageRequest":true,"commands":["dart.goToLocation"],"dartCodeAction":{"commandParameterSupport":{"supportedKinds":["saveUri"]}},"snippetTextEdit":true}},"initializationOptions":{"allowOpenUri":true,"appHost":"desktop","closingLabels":true,"flutterOutline":true,"onlyAnalyzeProjectsWithOpenFiles":false,"outline":true,"previewSurveys":true,"suggestFromUnimportedLibraries":true,"useInEditorDartFixPrompt":true},"trace":"off","workspaceFolders":[{"uri":"file://{{workspaceFolder-0}}","name":"devtools_companion"}]},"clientRequestTime":1768944160125}}
+{"time":1768944161598,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","id":0,"method":"initialize","params":{"processId":27416,"clientInfo":{"name":"Visual Studio Code","version":"1.108.1"},"locale":"en","rootPath":"c:\\work\\devtools_companion","rootUri":"{{workspaceFolder-0}}","capabilities":{"workspace":{"applyEdit":true,"workspaceEdit":{"documentChanges":true,"resourceOperations":["create","rename","delete"],"failureHandling":"textOnlyTransactional","normalizesLineEndings":true,"changeAnnotationSupport":{"groupsOnLabel":true}},"configuration":true,"didChangeWatchedFiles":{"dynamicRegistration":true,"relativePatternSupport":true},"symbol":{"dynamicRegistration":true,"symbolKind":{"valueSet":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26]},"tagSupport":{"valueSet":[1]},"resolveSupport":{"properties":["location.range"]}},"codeLens":{"refreshSupport":true},"executeCommand":{"dynamicRegistration":true},"didChangeConfiguration":{"dynamicRegistration":true},"workspaceFolders":true,"foldingRange":{"refreshSupport":true},"semanticTokens":{"refreshSupport":true},"fileOperations":{"dynamicRegistration":true,"didCreate":true,"didRename":true,"didDelete":true,"willCreate":true,"willRename":true,"willDelete":true},"inlineValue":{"refreshSupport":true},"inlayHint":{"refreshSupport":true},"diagnostics":{"refreshSupport":true}},"textDocument":{"publishDiagnostics":{"relatedInformation":true,"versionSupport":false,"tagSupport":{"valueSet":[1,2]},"codeDescriptionSupport":true,"dataSupport":true},"synchronization":{"dynamicRegistration":true,"willSave":true,"willSaveWaitUntil":true,"didSave":true},"completion":{"dynamicRegistration":true,"contextSupport":true,"completionItem":{"snippetSupport":true,"commitCharactersSupport":true,"documentationFormat":["markdown","plaintext"],"deprecatedSupport":true,"preselectSupport":true,"tagSupport":{"valueSet":[1]},"insertReplaceSupport":true,"resolveSupport":{"properties":["documentation","detail","additionalTextEdits"]},"insertTextModeSupport":{"valueSet":[1,2]},"labelDetailsSupport":true},"insertTextMode":2,"completionItemKind":{"valueSet":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25]},"completionList":{"itemDefaults":["commitCharacters","editRange","insertTextFormat","insertTextMode","data"]}},"hover":{"dynamicRegistration":true,"contentFormat":["markdown","plaintext"]},"signatureHelp":{"dynamicRegistration":true,"signatureInformation":{"documentationFormat":["markdown","plaintext"],"parameterInformation":{"labelOffsetSupport":true},"activeParameterSupport":true},"contextSupport":true},"definition":{"dynamicRegistration":true,"linkSupport":true},"references":{"dynamicRegistration":true},"documentHighlight":{"dynamicRegistration":true},"documentSymbol":{"dynamicRegistration":true,"symbolKind":{"valueSet":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26]},"hierarchicalDocumentSymbolSupport":true,"tagSupport":{"valueSet":[1]},"labelSupport":true},"codeAction":{"dynamicRegistration":true,"isPreferredSupport":true,"disabledSupport":true,"dataSupport":true,"resolveSupport":{"properties":["edit"]},"codeActionLiteralSupport":{"codeActionKind":{"valueSet":["","quickfix","refactor","refactor.extract","refactor.inline","refactor.rewrite","source","source.organizeImports"]}},"honorsChangeAnnotations":true},"codeLens":{"dynamicRegistration":true},"formatting":{"dynamicRegistration":true},"rangeFormatting":{"dynamicRegistration":true,"rangesSupport":true},"onTypeFormatting":{"dynamicRegistration":true},"rename":{"dynamicRegistration":true,"prepareSupport":true,"prepareSupportDefaultBehavior":1,"honorsChangeAnnotations":true},"documentLink":{"dynamicRegistration":true,"tooltipSupport":true},"typeDefinition":{"dynamicRegistration":true,"linkSupport":true},"implementation":{"dynamicRegistration":true,"linkSupport":true},"colorProvider":{"dynamicRegistration":true},"foldingRange":{"dynamicRegistration":true,"rangeLimit":5000,"lineFoldingOnly":true,"foldingRangeKind":{"valueSet":["comment","imports","region"]},"foldingRange":{"collapsedText":false}},"declaration":{"dynamicRegistration":true,"linkSupport":true},"selectionRange":{"dynamicRegistration":true},"callHierarchy":{"dynamicRegistration":true},"semanticTokens":{"dynamicRegistration":true,"tokenTypes":["namespace","type","class","enum","interface","struct","typeParameter","parameter","variable","property","enumMember","event","function","method","macro","keyword","modifier","comment","string","number","regexp","operator","decorator"],"tokenModifiers":["declaration","definition","readonly","static","deprecated","abstract","async","modification","documentation","defaultLibrary"],"formats":["relative"],"requests":{"range":true,"full":{"delta":true}},"multilineTokenSupport":false,"overlappingTokenSupport":false,"serverCancelSupport":true,"augmentsSyntaxTokens":true},"linkedEditingRange":{"dynamicRegistration":true},"typeHierarchy":{"dynamicRegistration":true},"inlineValue":{"dynamicRegistration":true},"inlayHint":{"dynamicRegistration":true,"resolveSupport":{"properties":["tooltip","textEdits","label.tooltip","label.location","label.command"]}},"diagnostic":{"dynamicRegistration":true,"relatedDocumentSupport":false}},"window":{"showMessage":{"messageActionItem":{"additionalPropertiesSupport":true}},"showDocument":{"support":true},"workDoneProgress":true},"general":{"staleRequestSupport":{"cancel":true,"retryOnContentModified":["textDocument/semanticTokens/full","textDocument/semanticTokens/range","textDocument/semanticTokens/full/delta"]},"regularExpressions":{"engine":"ECMAScript","version":"ES2020"},"markdown":{"parser":"marked","version":"1.1.0","allowedTags":["ul","li","p","code","blockquote","ol","h1","h2","h3","h4","h5","h6","hr","em","pre","table","thead","tbody","tr","th","td","div","del","a","strong","br","img","span"]},"positionEncodings":["utf-16"]},"notebookDocument":{"synchronization":{"dynamicRegistration":true,"executionSummarySupport":true}},"experimental":{"supportsWindowShowMessageRequest":true,"commands":["dart.goToLocation"],"dartCodeAction":{"commandParameterSupport":{"supportedKinds":["saveUri"]}},"snippetTextEdit":true}},"initializationOptions":{"allowOpenUri":true,"appHost":"desktop","closingLabels":true,"flutterOutline":true,"onlyAnalyzeProjectsWithOpenFiles":false,"outline":true,"previewSurveys":true,"suggestFromUnimportedLibraries":true,"useInEditorDartFixPrompt":true},"trace":"off","workspaceFolders":[{"uri":"{{workspaceFolder-0}}","name":"devtools_companion"}]},"clientRequestTime":1768944160125}}
 {"time":1768944161600,"kind":"message","sender":"server","receiver":"ide","message":{"id":0,"jsonrpc":"2.0","result":{"capabilities":{"executeCommandProvider":{"commands":["dart.edit.codeAction.apply","dart.edit.sortMembers","dart.edit.organizeImports","dart.edit.fixAll","dart.edit.fixAllInWorkspace.preview","dart.edit.fixAllInWorkspace","dart.edit.sendWorkspaceEdit","refactor.perform","refactor.validate","dart.logAction","dart.refactor.convert_all_formal_parameters_to_named","dart.refactor.convert_selected_formal_parameters_to_named","dart.refactor.move_selected_formal_parameters_left","dart.refactor.move_top_level_to_file"],"workDoneProgress":true},"experimental":{"updateDiagnosticInformation":{},"textDocument":{"super":{},"augmented":{},"augmentation":{}}},"workspace":{"workspaceFolders":{"changeNotifications":true,"supported":true}},"workspaceSymbolProvider":true},"serverInfo":{"name":"Dart SDK LSP Analysis Server","version":"3.12.0-35.0.dev"}}}}
 {"time":1768944161653,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","method":"initialized","params":{},"clientRequestTime":1768944161614}}
 {"time":1768944161658,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","id":1,"result":[{"analysisExcludedFolders":[],"analyzerAdditionalArgs":[],"analyzerVmAdditionalArgs":[],"analyzerDiagnosticsPort":null,"analyzerPath":null,"analyzerSshHost":null,"analyzerVmServicePort":null,"includeDependenciesInWorkspaceSymbols":true,"notifyAnalyzerErrors":true,"showTodos":true,"showExtensionRecommendations":true,"devToolsBrowser":"chrome","devToolsPort":null,"devToolsReuseWindows":true,"devToolsTheme":"dark","devToolsLocation":{"default":"beside","inspector":"sidebar"},"openDevTools":"never","closeDevTools":"never","shareDevToolsWithFlutter":true,"showInspectorNotificationsForWidgetErrors":true,"customDevTools":{},"autoImportCompletions":true,"automaticCommentSlashes":"tripleSlash","closingLabels":true,"closingLabelsPrefix":" // ","closingLabelsTextStyle":"normal","completeFunctionCalls":true,"documentation":"full","dtdEditorActiveLocationDelay":200,"enableServerSnippets":true,"hotReloadPatterns":[],"enableCompletionCommitCharacters":false,"enableSdkFormatter":true,"enableSnippets":true,"inlayHints":true,"insertArgumentPlaceholders":true,"lineLength":80,"lspSnippetTextEdits":true,"renameFilesWithClasses":"never","showDartPadSampleCodeLens":true,"showMainCodeLens":true,"showTestCodeLens":true,"updateImportsOnRename":true,"warnWhenEditingFilesOutsideWorkspace":true,"warnWhenEditingFilesInPubCache":true,"flutterAdbConnectOnChromeOs":false,"flutterAdditionalArgs":[],"flutterAttachAdditionalArgs":[],"flutterCreateAndroidLanguage":"kotlin","flutterCreateIOSLanguage":"swift","flutterCreatePlatforms":null,"offline":false,"flutterCreateOrganization":null,"flutterCustomEmulators":[],"flutterGutterIcons":true,"flutterHotReloadOnSave":"manual","hotReloadOnSave":"never","flutterGenerateLocalizationsOnSave":"never","flutterOutline":true,"flutterRunAdditionalArgs":[],"flutterScreenshotPath":null,"flutterRememberSelectedDevice":true,"flutterSelectDeviceWhenConnected":true,"flutterShowEmulators":"local","flutterShowWebServerDevice":"remote","flutterTestAdditionalArgs":[],"flutterWebRenderer":"flutter-default","flutterWidgetPreview":"startLazily","flutterWidgetPreviewLocation":"sidebar","useFlutterDev":false,"analyzerInstrumentationLogFile":null,"analyzerLogFile":null,"toolingDaemonLogFile":null,"dapLogFile":null,"devToolsLogFile":null,"extensionLogFile":null,"flutterDaemonLogFile":null,"flutterWidgetPreviewLogFile":null,"mcpServerLogFile":null,"maxLogLineLength":2000,"maxCompletionItems":100000,"enablePub":true,"promptToGetPackages":true,"pubAdditionalArgs":[],"runPubGetOnPubspecChanges":"always","runPubGetOnNestedProjects":"none","buildRunnerAdditionalArgs":[],"cliConsole":"debugConsole","debugExtensionBackendProtocol":"ws","debugSdkLibraries":false,"debugExternalPackageLibraries":false,"evaluateGettersInDebugViews":true,"showGettersInDebugViews":true,"evaluateToStringInDebugViews":true,"hotReloadProgress":"notification","promptToRunIfErrors":true,"showDartDeveloperLogs":true,"showDebuggerNumbersAsHex":false,"showDevToolsDebugToolBarButtons":true,"suppressTestTimeouts":"debug","cliAdditionalArgs":[],"testAdditionalArgs":[],"vmAdditionalArgs":[],"customDartDapPath":null,"customFlutterDapPath":null,"checkForSdkUpdates":true,"sdkPath":null,"sdkPaths":[],"flutterSdkPath":null,"flutterSdkPaths":[],"sdkSwitchingTarget":"workspace","addSdkToTerminalPath":true,"getFlutterSdkCommand":null,"getDartSdkCommand":null,"mcpServer":true,"mcpServerTools":{"analyze_files":false,"dart_fix":false,"dart_format":false,"run_tests":false},"allowTestsOutsideTestFolder":false,"coverageExcludePatterns":[],"openTestView":["testRunStart"],"showSkippedTests":true,"testInvocationMode":"name","projectSearchDepth":5,"env":{},"toolingDaemonAdditionalArgs":[],"normalizeFileCasing":false,"daemonPort":null,"previewCommitCharacters":false,"previewFlutterUiGuides":false,"previewFlutterUiGuidesCustomTracking":false,"previewHotReloadOnSaveWatcher":false,"experimentalRefactors":false,"dynamicTestTracking":true,"experimentalDtdHandlers":false,"analyzeAngularTemplates":true,"additionalAnalyzerFileExtensions":[],"analysisServerFolding":true,"doNotFormat":[],"updateDevTools":false,"flutterTrackWidgetCreation":true,"dartTestLogFile":null,"flutterRunLogFile":null,"flutterTestLogFile":null,"vmServiceLogFile":null,"webDaemonLogFile":null,"onlyAnalyzeProjectsWithOpenFiles":false},{"analysisExcludedFolders":[],"analyzerAdditionalArgs":[],"analyzerVmAdditionalArgs":[],"analyzerDiagnosticsPort":null,"analyzerPath":null,"analyzerSshHost":null,"analyzerVmServicePort":null,"includeDependenciesInWorkspaceSymbols":true,"notifyAnalyzerErrors":true,"showTodos":true,"showExtensionRecommendations":true,"devToolsBrowser":"chrome","devToolsPort":null,"devToolsReuseWindows":true,"devToolsTheme":"dark","devToolsLocation":{"default":"beside","inspector":"sidebar"},"openDevTools":"never","closeDevTools":"never","shareDevToolsWithFlutter":true,"showInspectorNotificationsForWidgetErrors":true,"customDevTools":{},"autoImportCompletions":true,"automaticCommentSlashes":"tripleSlash","closingLabels":true,"closingLabelsPrefix":" // ","closingLabelsTextStyle":"normal","completeFunctionCalls":true,"documentation":"full","dtdEditorActiveLocationDelay":200,"enableServerSnippets":true,"hotReloadPatterns":[],"enableCompletionCommitCharacters":false,"enableSdkFormatter":true,"enableSnippets":true,"inlayHints":true,"insertArgumentPlaceholders":true,"lineLength":80,"lspSnippetTextEdits":true,"renameFilesWithClasses":"never","showDartPadSampleCodeLens":true,"showMainCodeLens":true,"showTestCodeLens":true,"updateImportsOnRename":true,"warnWhenEditingFilesOutsideWorkspace":true,"warnWhenEditingFilesInPubCache":true,"flutterAdbConnectOnChromeOs":false,"flutterAdditionalArgs":[],"flutterAttachAdditionalArgs":[],"flutterCreateAndroidLanguage":"kotlin","flutterCreateIOSLanguage":"swift","flutterCreatePlatforms":null,"offline":false,"flutterCreateOrganization":null,"flutterCustomEmulators":[],"flutterGutterIcons":true,"flutterHotReloadOnSave":"manual","hotReloadOnSave":"never","flutterGenerateLocalizationsOnSave":"never","flutterOutline":true,"flutterRunAdditionalArgs":[],"flutterScreenshotPath":null,"flutterRememberSelectedDevice":true,"flutterSelectDeviceWhenConnected":true,"flutterShowEmulators":"local","flutterShowWebServerDevice":"remote","flutterTestAdditionalArgs":[],"flutterWebRenderer":"flutter-default","flutterWidgetPreview":"startLazily","flutterWidgetPreviewLocation":"sidebar","useFlutterDev":false,"analyzerInstrumentationLogFile":null,"analyzerLogFile":null,"toolingDaemonLogFile":null,"dapLogFile":null,"devToolsLogFile":null,"extensionLogFile":null,"flutterDaemonLogFile":null,"flutterWidgetPreviewLogFile":null,"mcpServerLogFile":null,"maxLogLineLength":2000,"maxCompletionItems":100000,"enablePub":true,"promptToGetPackages":true,"pubAdditionalArgs":[],"runPubGetOnPubspecChanges":"always","runPubGetOnNestedProjects":"none","buildRunnerAdditionalArgs":[],"cliConsole":"debugConsole","debugExtensionBackendProtocol":"ws","debugSdkLibraries":false,"debugExternalPackageLibraries":false,"evaluateGettersInDebugViews":true,"showGettersInDebugViews":true,"evaluateToStringInDebugViews":true,"hotReloadProgress":"notification","promptToRunIfErrors":true,"showDartDeveloperLogs":true,"showDebuggerNumbersAsHex":false,"showDevToolsDebugToolBarButtons":true,"suppressTestTimeouts":"debug","cliAdditionalArgs":[],"testAdditionalArgs":[],"vmAdditionalArgs":[],"customDartDapPath":null,"customFlutterDapPath":null,"checkForSdkUpdates":true,"sdkPath":null,"sdkPaths":[],"flutterSdkPath":null,"flutterSdkPaths":[],"sdkSwitchingTarget":"workspace","addSdkToTerminalPath":true,"getFlutterSdkCommand":null,"getDartSdkCommand":null,"mcpServer":true,"mcpServerTools":{"analyze_files":false,"dart_fix":false,"dart_format":false,"run_tests":false},"allowTestsOutsideTestFolder":false,"coverageExcludePatterns":[],"openTestView":["testRunStart"],"showSkippedTests":true,"testInvocationMode":"name","projectSearchDepth":5,"env":{},"toolingDaemonAdditionalArgs":[],"normalizeFileCasing":false,"daemonPort":null,"previewCommitCharacters":false,"previewFlutterUiGuides":false,"previewFlutterUiGuidesCustomTracking":false,"previewHotReloadOnSaveWatcher":false,"experimentalRefactors":false,"dynamicTestTracking":true,"experimentalDtdHandlers":false,"analyzeAngularTemplates":true,"additionalAnalyzerFileExtensions":[],"analysisServerFolding":true,"doNotFormat":[],"updateDevTools":false,"flutterTrackWidgetCreation":true,"dartTestLogFile":null,"flutterRunLogFile":null,"flutterTestLogFile":null,"vmServiceLogFile":null,"webDaemonLogFile":null,"onlyAnalyzeProjectsWithOpenFiles":false}],"clientRequestTime":1768944161662}}
-{"time":1768944384579,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","id":315,"method":"textDocument/inlayHint","params":{"textDocument":{"uri":"file://{{workspaceFolder-0}}/lib/src/shared/utils/utils.dart"},"range":{"start":{"line":0,"character":0},"end":{"line":29,"character":1}}},"clientRequestTime":1768944384625}}
+{"time":1768944384579,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","id":315,"method":"textDocument/inlayHint","params":{"textDocument":{"uri":"{{workspaceFolder-0}}/lib/src/shared/utils/utils.dart"},"range":{"start":{"line":0,"character":0},"end":{"line":29,"character":1}}},"clientRequestTime":1768944384625}}
 {"time":1768944384580,"kind":"message","sender":"server","receiver":"ide","message":{"id":315,"jsonrpc":"2.0","result":[{"kind":2,"label":[{"location":{"range":{"end":{"character":28,"line":363},"start":{"character":23,"line":363}},"uri":"{{package-root:sky_engine}}lib/core/string.dart"},"value":"start:"}],"paddingRight":true,"position":{"character":42,"line":4}},{"kind":2,"label":[{"location":{"range":{"end":{"character":32,"line":546},"start":{"character":28,"line":546}},"uri":"{{package-root:sky_engine}}lib/core/string.dart"},"value":"from:"}],"paddingRight":true,"position":{"character":32,"line":8}},{"kind":2,"label":[{"location":{"range":{"end":{"character":48,"line":546},"start":{"character":41,"line":546}},"uri":"{{package-root:sky_engine}}lib/core/string.dart"},"value":"replace:"}],"paddingRight":true,"position":{"character":51,"line":8}},{"kind":2,"label":[{"location":{"range":{"end":{"character":17,"line":274},"start":{"character":11,"line":274}},"uri":"{{package-root:sky_engine}}lib/core/regexp.dart"},"value":"source:"}],"paddingRight":true,"position":{"character":39,"line":8}},{"kind":2,"label":[{"location":{"range":{"end":{"character":36,"line":676},"start":{"character":29,"line":676}},"uri":"{{package-root:sky_engine}}lib/core/string.dart"},"value":"pattern:"}],"paddingRight":true,"position":{"character":34,"line":9}},{"kind":2,"label":[{"location":{"range":{"end":{"character":31,"line":463},"start":{"character":22,"line":463}},"uri":"{{package-root:sky_engine}}lib/core/iterable.dart"},"value":"separator:"}],"paddingRight":true,"position":{"character":52,"line":9}},{"kind":2,"label":[{"location":{"range":{"end":{"character":29,"line":187},"start":{"character":22,"line":187}},"uri":"{{package-root:sky_engine}}lib/core/errors.dart"},"value":"message:"}],"paddingRight":true,"position":{"character":33,"line":14}},{"kind":2,"label":[{"location":{"range":{"end":{"character":19,"line":13},"start":{"character":18,"line":13}},"uri":"{{package-root:devtools_companion}}lib/src/shared/utils/utils.dart"},"value":"n:"}],"paddingRight":true,"position":{"character":23,"line":16}},{"kind":2,"label":[{"value":"toElements:"}],"paddingRight":true,"position":{"character":22,"line":20}},{"kind":1,"label":[{"value":"<"},{"value":"dynamic"},{"value":">"}],"position":{"character":21,"line":20}},{"kind":2,"label":[{"location":{"range":{"end":{"character":36,"line":676},"start":{"character":29,"line":676}},"uri":"{{package-root:sky_engine}}lib/core/string.dart"},"value":"pattern:"}],"paddingRight":true,"position":{"character":17,"line":24}},{"kind":2,"label":[{"location":{"range":{"end":{"character":31,"line":463},"start":{"character":22,"line":463}},"uri":"{{package-root:sky_engine}}lib/core/iterable.dart"},"value":"separator:"}],"paddingRight":true,"position":{"character":35,"line":24}}]}}
-{"time":1768944384762,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","id":316,"method":"textDocument/foldingRange","params":{"textDocument":{"uri":"file://{{workspaceFolder-0}}/lib/src/shared/utils/utils.dart"}},"clientRequestTime":1768944384807}}
+{"time":1768944384762,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","id":316,"method":"textDocument/foldingRange","params":{"textDocument":{"uri":"{{workspaceFolder-0}}/lib/src/shared/utils/utils.dart"}},"clientRequestTime":1768944384807}}
 {"time":1768944384763,"kind":"message","sender":"server","receiver":"ide","message":{"id":316,"jsonrpc":"2.0","result":[{"endLine":5,"startLine":2},{"endLine":11,"startLine":7},{"endLine":17,"startLine":13},{"endLine":21,"startLine":19},{"endLine":25,"startLine":23},{"endLine":29,"startLine":27}]}}
-{"time":1768944384827,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","id":317,"method":"textDocument/codeAction","params":{"textDocument":{"uri":"file://{{workspaceFolder-0}}/lib/src/shared/utils/utils.dart"},"range":{"start":{"line":20,"character":28},"end":{"line":20,"character":28}},"context":{"diagnostics":[{"range":{"start":{"line":20,"character":28},"end":{"line":20,"character":29}},"message":"Expected a type name.","code":"expected_type_name","severity":1,"source":"dart"},{"range":{"start":{"line":20,"character":28},"end":{"line":20,"character":29}},"message":"Expected an identifier.","code":"missing_identifier","severity":1,"source":"dart"},{"range":{"start":{"line":20,"character":9},"end":{"line":20,"character":47}},"message":"A value of type 'List<dynamic>' can't be returned from the function 'flatten' because it has a return type of 'List<T>'.","code":"return_of_invalid_type","codeDescription":{"href":"https://dart.dev/diagnostics/return_of_invalid_type"},"severity":1,"source":"dart"}],"triggerKind":2}},"clientRequestTime":1768944384872}}
-{"time":1768944384827,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","id":318,"method":"textDocument/codeLens","params":{"textDocument":{"uri":"file://{{workspaceFolder-0}}/lib/src/shared/utils/utils.dart"}},"clientRequestTime":1768944384872}}
+{"time":1768944384827,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","id":317,"method":"textDocument/codeAction","params":{"textDocument":{"uri":"{{workspaceFolder-0}}/lib/src/shared/utils/utils.dart"},"range":{"start":{"line":20,"character":28},"end":{"line":20,"character":28}},"context":{"diagnostics":[{"range":{"start":{"line":20,"character":28},"end":{"line":20,"character":29}},"message":"Expected a type name.","code":"expected_type_name","severity":1,"source":"dart"},{"range":{"start":{"line":20,"character":28},"end":{"line":20,"character":29}},"message":"Expected an identifier.","code":"missing_identifier","severity":1,"source":"dart"},{"range":{"start":{"line":20,"character":9},"end":{"line":20,"character":47}},"message":"A value of type 'List<dynamic>' can't be returned from the function 'flatten' because it has a return type of 'List<T>'.","code":"return_of_invalid_type","codeDescription":{"href":"https://dart.dev/diagnostics/return_of_invalid_type"},"severity":1,"source":"dart"}],"triggerKind":2}},"clientRequestTime":1768944384872}}
+{"time":1768944384827,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","id":318,"method":"textDocument/codeLens","params":{"textDocument":{"uri":"{{workspaceFolder-0}}/lib/src/shared/utils/utils.dart"}},"clientRequestTime":1768944384872}}
 {"time":1768944384827,"kind":"message","sender":"server","receiver":"ide","message":{"id":91,"jsonrpc":"2.0","method":"window/workDoneProgress/create","params":{"token":"ANALYZING"}}}
 {"time":1768944384827,"kind":"message","sender":"server","receiver":"ide","message":{"id":318,"jsonrpc":"2.0","result":[]}}
 {"time":1768944384892,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","id":91,"result":null,"clientRequestTime":1768944384874}}
 {"time":1768944384892,"kind":"message","sender":"server","receiver":"ide","message":{"jsonrpc":"2.0","method":"$/progress","params":{"token":"ANALYZING","value":{"kind":"begin","title":"Analyzing…"}}}}
 {"time":1768944384892,"kind":"message","sender":"server","receiver":"ide","message":{"jsonrpc":"2.0","method":"$/progress","params":{"token":"ANALYZING","value":{"kind":"end"}}}}
-{"time":1768944384892,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","id":319,"method":"textDocument/semanticTokens/full","params":{"textDocument":{"uri":"file://{{workspaceFolder-0}}/lib/src/shared/utils/utils.dart"}},"clientRequestTime":1768944384902}}
+{"time":1768944384892,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","id":319,"method":"textDocument/semanticTokens/full","params":{"textDocument":{"uri":"{{workspaceFolder-0}}/lib/src/shared/utils/utils.dart"}},"clientRequestTime":1768944384902}}
 {"time":1768944384892,"kind":"message","sender":"server","receiver":"ide","message":{"id":317,"jsonrpc":"2.0","result":[{"command":{"arguments":[{"path":"C:\\work\\devtools_companion\\lib\\src\\shared\\utils\\utils.dart","autoTriggered":true}],"command":"dart.edit.sortMembers","title":"Sort Members"},"kind":"source.sortMembers","title":"Sort Members"},{"command":{"arguments":[{"path":"C:\\work\\devtools_companion\\lib\\src\\shared\\utils\\utils.dart","autoTriggered":true}],"command":"dart.edit.organizeImports","title":"Organize Imports"},"kind":"source.organizeImports","title":"Organize Imports"},{"command":{"arguments":[{"path":"C:\\work\\devtools_companion\\lib\\src\\shared\\utils\\utils.dart","autoTriggered":true}],"command":"dart.edit.fixAll","title":"Fix All"},"kind":"source.fixAll","title":"Fix All"},{"command":{"arguments":[{"action":"dart.fix.create.localVariable"}],"command":"dart.logAction","title":"Log Action"},"diagnostics":[{"code":"undefined_identifier","codeDescription":{"href":"https://dart.dev/diagnostics/undefined_identifier"},"message":"Undefined name 'list'.\nTry correcting the name to one that is defined, or defining the name.","range":{"end":{"character":37,"line":20},"start":{"character":33,"line":20}},"severity":1,"source":"dart"}],"edit":{"documentChanges":[{"edits":[{"insertTextFormat":2,"newText":"${1:Iterable<dynamic>} ${2:list};\r\n  ","range":{"end":{"character":2,"line":20},"start":{"character":2,"line":20}}}],"textDocument":{"uri":"{{package-root:devtools_companion}}lib/src/shared/utils/utils.dart","version":35}}]},"kind":"quickfix.create.localVariable","title":"Create local variable 'list'"},{"command":{"arguments":[{"action":"dart.fix.create.parameter"}],"command":"dart.logAction","title":"Log Action"},"diagnostics":[{"code":"undefined_identifier","codeDescription":{"href":"https://dart.dev/diagnostics/undefined_identifier"},"message":"Undefined name 'list'.\nTry correcting the name to one that is defined, or defining the name.","range":{"end":{"character":37,"line":20},"start":{"character":33,"line":20}},"severity":1,"source":"dart"}],"edit":{"documentChanges":[{"edits":[{"insertTextFormat":2,"newText":", ${1|Iterable<dynamic>,Object|} ${2:list}","range":{"end":{"character":28,"line":20},"start":{"character":28,"line":20}}}],"textDocument":{"uri":"{{package-root:devtools_companion}}lib/src/shared/utils/utils.dart","version":35}}]},"kind":"quickfix.create.parameter","title":"Create required positional parameter 'list'"},{"command":{"arguments":[{"action":"dart.fix.replace.returnType"}],"command":"dart.logAction","title":"Log Action"},"diagnostics":[{"code":"return_of_invalid_type","codeDescription":{"href":"https://dart.dev/diagnostics/return_of_invalid_type"},"message":"A value of type 'List<dynamic>' can't be returned from the function 'flatten' because it has a return type of 'List<T>'.","range":{"end":{"character":47,"line":20},"start":{"character":9,"line":20}},"severity":1,"source":"dart"}],"edit":{"documentChanges":[{"edits":[{"newText":"List<dynamic>","range":{"end":{"character":7,"line":19},"start":{"character":0,"line":19}}}],"textDocument":{"uri":"{{package-root:devtools_companion}}lib/src/shared/utils/utils.dart","version":35}}]},"kind":"quickfix.replace.returnType","title":"Replace the return type with 'List<dynamic>'"},{"command":{"arguments":[{"action":"dart.assist.remove.typeAnnotation"}],"command":"dart.logAction","title":"Log Action"},"diagnostics":[],"edit":{"documentChanges":[{"edits":[{"newText":"","range":{"end":{"character":28,"line":20},"start":{"character":23,"line":20}}}],"textDocument":{"uri":"{{package-root:devtools_companion}}lib/src/shared/utils/utils.dart","version":35}}]},"kind":"refactor.remove.typeAnnotation","title":"Remove type annotation"},{"command":{"arguments":[{"action":"dart.assist.convert.bodyToBlock"}],"command":"dart.logAction","title":"Log Action"},"diagnostics":[],"edit":{"documentChanges":[{"edits":[{"insertTextFormat":2,"newText":" {\r\n    return list;$0\r\n  }","range":{"end":{"character":37,"line":20},"start":{"character":29,"line":20}}}],"textDocument":{"uri":"{{package-root:devtools_companion}}lib/src/shared/utils/utils.dart","version":35}}]},"kind":"refactor.convert.bodyToBlock","title":"Convert to block body"},{"command":{"arguments":["EXTRACT_METHOD","C:\\work\\devtools_companion\\lib\\src\\shared\\utils\\utils.dart",35,584,0,null],"command":"refactor.perform","title":"Extract Method"},"kind":"refactor.extract","title":"Extract Method"}]}}
 {"time":1768944384892,"kind":"message","sender":"server","receiver":"ide","message":{"id":319,"jsonrpc":"2.0","result":{"data":[0,0,34,3,0,2,0,6,2,0,0,7,10,17,36,0,11,6,2,0,0,7,1,6,4,1,2,2,1,256,0,4,1,6,0,0,2,7,11,16,0,9,6,1,256,0,7,1,6,0,1,2,6,1,256,0,7,1,6,0,0,2,1,15,0,0,3,11,4,16,0,16,1,6,0,0,2,9,4,16,0,10,1,15,0,3,0,4,2,0,0,5,12,17,36,0,13,6,2,0,0,7,1,6,4,1,2,6,2,0,0,7,7,5,4,0,10,1,6,0,0,2,10,4,16,0,11,6,2,2,0,7,9,16,0,0,12,2,16,0,0,4,11,4,16,1,2,6,2,0,0,7,8,5,4,0,11,7,5,0,0,8,5,4,16,0,6,2,16,0,0,4,8,11,16,0,9,4,4,16,0,5,2,16,0,1,2,6,1,256,0,7,7,5,0,0,11,8,5,0,3,0,3,2,0,0,4,9,17,36,0,10,3,2,0,0,4,1,6,4,1,2,2,1,256,0,4,1,6,0,0,4,1,15,0,0,3,5,1,256,0,6,13,2,2,0,14,35,16,0,1,2,2,1,256,0,4,1,6,0,0,5,1,15,0,0,5,1,6,0,0,5,1,15,0,0,3,6,1,256,0,7,1,15,0,1,2,6,1,256,0,7,1,6,0,0,4,9,17,0,0,10,1,6,0,0,4,1,15,0,3,0,4,2,0,0,5,1,18,0,0,3,7,17,36,0,8,1,18,0,0,3,4,2,0,0,5,4,2,0,0,5,1,18,0,0,4,5,6,4,1,2,6,1,256,0,7,5,6,0,0,6,6,4,16,0,8,4,5,8,0,10,4,10,0,0,6,6,4,16,3,0,6,2,0,0,7,13,17,36,0,14,6,2,0,0,7,1,6,4,1,2,6,1,256,0,7,1,6,0,0,2,5,4,16,0,6,2,16,0,0,4,8,11,16,0,9,4,4,16,0,5,2,16,0,3,0,6,2,0,0,7,16,17,36,0,17,6,2,0,0,7,7,6,4,1,2,6,1,256,0,7,7,6,0,0,11,18,15,0,0,21,5,15,0]}}}
-{"time":1768944384903,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","id":320,"method":"textDocument/documentSymbol","params":{"textDocument":{"uri":"file://{{workspaceFolder-0}}/lib/src/shared/utils/utils.dart"}},"clientRequestTime":1768944384950}}
+{"time":1768944384903,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","id":320,"method":"textDocument/documentSymbol","params":{"textDocument":{"uri":"{{workspaceFolder-0}}/lib/src/shared/utils/utils.dart"}},"clientRequestTime":1768944384950}}
 {"time":1768944384903,"kind":"message","sender":"server","receiver":"ide","message":{"id":320,"jsonrpc":"2.0","result":[{"deprecated":false,"detail":"(String s)","kind":12,"name":"capitalize","range":{"end":{"character":1,"line":5},"start":{"character":0,"line":2}},"selectionRange":{"end":{"character":17,"line":2},"start":{"character":7,"line":2}}},{"deprecated":false,"detail":"(String s)","kind":12,"name":"isPalindrome","range":{"end":{"character":1,"line":11},"start":{"character":0,"line":7}},"selectionRange":{"end":{"character":17,"line":7},"start":{"character":5,"line":7}}},{"deprecated":false,"detail":"(int n)","kind":12,"name":"factorial","range":{"end":{"character":1,"line":17},"start":{"character":0,"line":13}},"selectionRange":{"end":{"character":13,"line":13},"start":{"character":4,"line":13}}},{"deprecated":false,"detail":"(List<List<T>> lists)","kind":12,"name":"flatten","range":{"end":{"character":1,"line":21},"start":{"character":0,"line":19}},"selectionRange":{"end":{"character":15,"line":19},"start":{"character":8,"line":19}}},{"deprecated":false,"detail":"(String s)","kind":12,"name":"reverseString","range":{"end":{"character":1,"line":25},"start":{"character":0,"line":23}},"selectionRange":{"end":{"character":20,"line":23},"start":{"character":7,"line":23}}},{"deprecated":false,"detail":"(double degrees)","kind":12,"name":"degreesToRadians","range":{"end":{"character":1,"line":29},"start":{"character":0,"line":27}},"selectionRange":{"end":{"character":23,"line":27},"start":{"character":7,"line":27}}}]}}
-{"time":1768944384905,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","id":321,"method":"textDocument/documentSymbol","params":{"textDocument":{"uri":"file://{{workspaceFolder-0}}/lib/src/shared/utils/utils.dart"}},"clientRequestTime":1768944384951}}
+{"time":1768944384905,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","id":321,"method":"textDocument/documentSymbol","params":{"textDocument":{"uri":"{{workspaceFolder-0}}/lib/src/shared/utils/utils.dart"}},"clientRequestTime":1768944384951}}
 {"time":1768944384905,"kind":"message","sender":"server","receiver":"ide","message":{"id":321,"jsonrpc":"2.0","result":[{"deprecated":false,"detail":"(String s)","kind":12,"name":"capitalize","range":{"end":{"character":1,"line":5},"start":{"character":0,"line":2}},"selectionRange":{"end":{"character":17,"line":2},"start":{"character":7,"line":2}}},{"deprecated":false,"detail":"(String s)","kind":12,"name":"isPalindrome","range":{"end":{"character":1,"line":11},"start":{"character":0,"line":7}},"selectionRange":{"end":{"character":17,"line":7},"start":{"character":5,"line":7}}},{"deprecated":false,"detail":"(int n)","kind":12,"name":"factorial","range":{"end":{"character":1,"line":17},"start":{"character":0,"line":13}},"selectionRange":{"end":{"character":13,"line":13},"start":{"character":4,"line":13}}},{"deprecated":false,"detail":"(List<List<T>> lists)","kind":12,"name":"flatten","range":{"end":{"character":1,"line":21},"start":{"character":0,"line":19}},"selectionRange":{"end":{"character":15,"line":19},"start":{"character":8,"line":19}}},{"deprecated":false,"detail":"(String s)","kind":12,"name":"reverseString","range":{"end":{"character":1,"line":25},"start":{"character":0,"line":23}},"selectionRange":{"end":{"character":20,"line":23},"start":{"character":7,"line":23}}},{"deprecated":false,"detail":"(double degrees)","kind":12,"name":"degreesToRadians","range":{"end":{"character":1,"line":29},"start":{"character":0,"line":27}},"selectionRange":{"end":{"character":23,"line":27},"start":{"character":7,"line":27}}}]}}
-{"time":1768944385355,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","id":322,"method":"textDocument/inlayHint","params":{"textDocument":{"uri":"file://{{workspaceFolder-0}}/lib/src/shared/utils/utils.dart"},"range":{"start":{"line":0,"character":0},"end":{"line":29,"character":1}}},"clientRequestTime":1768944385401}}
+{"time":1768944385355,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","id":322,"method":"textDocument/inlayHint","params":{"textDocument":{"uri":"{{workspaceFolder-0}}/lib/src/shared/utils/utils.dart"},"range":{"start":{"line":0,"character":0},"end":{"line":29,"character":1}}},"clientRequestTime":1768944385401}}
 {"time":1768944385355,"kind":"message","sender":"server","receiver":"ide","message":{"id":322,"jsonrpc":"2.0","result":[{"kind":2,"label":[{"location":{"range":{"end":{"character":28,"line":363},"start":{"character":23,"line":363}},"uri":"{{package-root:sky_engine}}lib/core/string.dart"},"value":"start:"}],"paddingRight":true,"position":{"character":42,"line":4}},{"kind":2,"label":[{"location":{"range":{"end":{"character":32,"line":546},"start":{"character":28,"line":546}},"uri":"{{package-root:sky_engine}}lib/core/string.dart"},"value":"from:"}],"paddingRight":true,"position":{"character":32,"line":8}},{"kind":2,"label":[{"location":{"range":{"end":{"character":48,"line":546},"start":{"character":41,"line":546}},"uri":"{{package-root:sky_engine}}lib/core/string.dart"},"value":"replace:"}],"paddingRight":true,"position":{"character":51,"line":8}},{"kind":2,"label":[{"location":{"range":{"end":{"character":17,"line":274},"start":{"character":11,"line":274}},"uri":"{{package-root:sky_engine}}lib/core/regexp.dart"},"value":"source:"}],"paddingRight":true,"position":{"character":39,"line":8}},{"kind":2,"label":[{"location":{"range":{"end":{"character":36,"line":676},"start":{"character":29,"line":676}},"uri":"{{package-root:sky_engine}}lib/core/string.dart"},"value":"pattern:"}],"paddingRight":true,"position":{"character":34,"line":9}},{"kind":2,"label":[{"location":{"range":{"end":{"character":31,"line":463},"start":{"character":22,"line":463}},"uri":"{{package-root:sky_engine}}lib/core/iterable.dart"},"value":"separator:"}],"paddingRight":true,"position":{"character":52,"line":9}},{"kind":2,"label":[{"location":{"range":{"end":{"character":29,"line":187},"start":{"character":22,"line":187}},"uri":"{{package-root:sky_engine}}lib/core/errors.dart"},"value":"message:"}],"paddingRight":true,"position":{"character":33,"line":14}},{"kind":2,"label":[{"location":{"range":{"end":{"character":19,"line":13},"start":{"character":18,"line":13}},"uri":"{{package-root:devtools_companion}}lib/src/shared/utils/utils.dart"},"value":"n:"}],"paddingRight":true,"position":{"character":23,"line":16}},{"kind":2,"label":[{"value":"toElements:"}],"paddingRight":true,"position":{"character":22,"line":20}},{"kind":1,"label":[{"value":"<"},{"value":"dynamic"},{"value":">"}],"position":{"character":21,"line":20}},{"kind":2,"label":[{"location":{"range":{"end":{"character":36,"line":676},"start":{"character":29,"line":676}},"uri":"{{package-root:sky_engine}}lib/core/string.dart"},"value":"pattern:"}],"paddingRight":true,"position":{"character":17,"line":24}},{"kind":2,"label":[{"location":{"range":{"end":{"character":31,"line":463},"start":{"character":22,"line":463}},"uri":"{{package-root:sky_engine}}lib/core/iterable.dart"},"value":"separator:"}],"paddingRight":true,"position":{"character":35,"line":24}}]}}
-{"time":1768944385559,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","id":323,"method":"textDocument/documentLink","params":{"textDocument":{"uri":"file://{{workspaceFolder-0}}/lib/src/shared/utils/utils.dart"}},"clientRequestTime":1768944385605}}
-{"time":1768944385559,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","id":324,"method":"textDocument/documentColor","params":{"textDocument":{"uri":"file://{{workspaceFolder-0}}/lib/src/shared/utils/utils.dart"}},"clientRequestTime":1768944385606}}
+{"time":1768944385559,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","id":323,"method":"textDocument/documentLink","params":{"textDocument":{"uri":"{{workspaceFolder-0}}/lib/src/shared/utils/utils.dart"}},"clientRequestTime":1768944385605}}
+{"time":1768944385559,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","id":324,"method":"textDocument/documentColor","params":{"textDocument":{"uri":"{{workspaceFolder-0}}/lib/src/shared/utils/utils.dart"}},"clientRequestTime":1768944385606}}
 {"time":1768944385559,"kind":"message","sender":"server","receiver":"ide","message":{"id":324,"jsonrpc":"2.0","result":[]}}
 {"time":1768944385559,"kind":"message","sender":"server","receiver":"ide","message":{"id":323,"jsonrpc":"2.0","result":[]}}
 {"time":1768944385587,"kind":"message","sender":"watcher","receiver":"server","message":{"path":"C:\\work\\devtools_companion\\lib\\src\\shared\\utils\\utils.dart","type":"modify"}}
@@ -32,13 +32,13 @@
 {"time":1768944385590,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","id":92,"result":null,"clientRequestTime":1768944385636}}
 {"time":1768944385590,"kind":"message","sender":"server","receiver":"ide","message":{"jsonrpc":"2.0","method":"$/progress","params":{"token":"ANALYZING","value":{"kind":"begin","title":"Analyzing…"}}}}
 {"time":1768944385590,"kind":"message","sender":"server","receiver":"ide","message":{"jsonrpc":"2.0","method":"$/progress","params":{"token":"ANALYZING","value":{"kind":"end"}}}}
-{"time":1768944387341,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","id":325,"method":"textDocument/codeAction","params":{"textDocument":{"uri":"file://{{workspaceFolder-0}}/lib/src/shared/utils/utils.dart"},"range":{"start":{"line":21,"character":1},"end":{"line":21,"character":1}},"context":{"diagnostics":[],"triggerKind":2}},"clientRequestTime":1768944387389}}
+{"time":1768944387341,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","id":325,"method":"textDocument/codeAction","params":{"textDocument":{"uri":"{{workspaceFolder-0}}/lib/src/shared/utils/utils.dart"},"range":{"start":{"line":21,"character":1},"end":{"line":21,"character":1}},"context":{"diagnostics":[],"triggerKind":2}},"clientRequestTime":1768944387389}}
 {"time":1768944387341,"kind":"message","sender":"server","receiver":"ide","message":{"id":93,"jsonrpc":"2.0","method":"window/workDoneProgress/create","params":{"token":"ANALYZING"}}}
 {"time":1768944387341,"kind":"message","sender":"server","receiver":"ide","message":{"id":325,"jsonrpc":"2.0","result":[{"command":{"arguments":[{"path":"C:\\work\\devtools_companion\\lib\\src\\shared\\utils\\utils.dart","autoTriggered":true}],"command":"dart.edit.sortMembers","title":"Sort Members"},"kind":"source.sortMembers","title":"Sort Members"},{"command":{"arguments":[{"path":"C:\\work\\devtools_companion\\lib\\src\\shared\\utils\\utils.dart","autoTriggered":true}],"command":"dart.edit.organizeImports","title":"Organize Imports"},"kind":"source.organizeImports","title":"Organize Imports"},{"command":{"arguments":[{"path":"C:\\work\\devtools_companion\\lib\\src\\shared\\utils\\utils.dart","autoTriggered":true}],"command":"dart.edit.fixAll","title":"Fix All"},"kind":"source.fixAll","title":"Fix All"}]}}
 {"time":1768944387342,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","id":93,"result":null,"clientRequestTime":1768944387391}}
 {"time":1768944387342,"kind":"message","sender":"server","receiver":"ide","message":{"jsonrpc":"2.0","method":"$/progress","params":{"token":"ANALYZING","value":{"kind":"begin","title":"Analyzing…"}}}}
 {"time":1768944387342,"kind":"message","sender":"server","receiver":"ide","message":{"jsonrpc":"2.0","method":"$/progress","params":{"token":"ANALYZING","value":{"kind":"end"}}}}
-{"time":1768944388487,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","method":"textDocument/didChange","params":{"textDocument":{"uri":"file://{{workspaceFolder-0}}/lib/src/shared/utils/utils.dart","version":36},"contentChanges":[{"range":{"start":{"line":20,"character":27},"end":{"line":20,"character":28}},"rangeLength":1,"text":""}]},"clientRequestTime":1768944388536}}
+{"time":1768944388487,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","method":"textDocument/didChange","params":{"textDocument":{"uri":"{{workspaceFolder-0}}/lib/src/shared/utils/utils.dart","version":36},"contentChanges":[{"range":{"start":{"line":20,"character":27},"end":{"line":20,"character":28}},"rangeLength":1,"text":""}]},"clientRequestTime":1768944388536}}
 {"time":1768944388487,"kind":"message","sender":"server","receiver":"ide","message":{"id":94,"jsonrpc":"2.0","method":"window/workDoneProgress/create","params":{"token":"ANALYZING"}}}
 {"time":1768944388493,"kind":"message","sender":"server","receiver":"ide","message":{"jsonrpc":"2.0","method":"textDocument/publishDiagnostics","params":{"diagnostics":[{"code":"prefer_final_locals","codeDescription":{"href":"https://dart.dev/diagnostics/prefer_final_locals"},"message":"Local variables should be final.\nTry making the variable final.","range":{"end":{"character":8,"line":8},"start":{"character":2,"line":8}},"severity":3,"source":"dart"},{"code":"prefer_final_locals","codeDescription":{"href":"https://dart.dev/diagnostics/prefer_final_locals"},"message":"Local variables should be final.\nTry making the variable final.","range":{"end":{"character":8,"line":9},"start":{"character":2,"line":9}},"severity":3,"source":"dart"},{"code":"avoid_redundant_argument_values","codeDescription":{"href":"https://dart.dev/lints/avoid_redundant_argument_values"},"message":"The value of the argument is redundant because it matches the default value.\nTry removing the argument.","range":{"end":{"character":54,"line":9},"start":{"character":52,"line":9}},"severity":3,"source":"dart"},{"code":"avoid_redundant_argument_values","codeDescription":{"href":"https://dart.dev/lints/avoid_redundant_argument_values"},"message":"The value of the argument is redundant because it matches the default value.\nTry removing the argument.","range":{"end":{"character":37,"line":24},"start":{"character":35,"line":24}},"severity":3,"source":"dart"}],"uri":"{{package-root:devtools_companion}}lib/src/shared/utils/utils.dart"}}}
 {"time":1768944388493,"kind":"message","sender":"server","receiver":"ide","message":{"jsonrpc":"2.0","method":"dart/textDocument/publishClosingLabels","params":{"labels":[],"uri":"{{package-root:devtools_companion}}lib/src/shared/utils/utils.dart"}}}
@@ -47,28 +47,28 @@
 {"time":1768944388495,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","id":94,"result":null,"clientRequestTime":1768944388544}}
 {"time":1768944388495,"kind":"message","sender":"server","receiver":"ide","message":{"jsonrpc":"2.0","method":"$/progress","params":{"token":"ANALYZING","value":{"kind":"begin","title":"Analyzing…"}}}}
 {"time":1768944388495,"kind":"message","sender":"server","receiver":"ide","message":{"jsonrpc":"2.0","method":"$/progress","params":{"token":"ANALYZING","value":{"kind":"end"}}}}
-{"time":1768944388510,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","id":326,"method":"textDocument/inlayHint","params":{"textDocument":{"uri":"file://{{workspaceFolder-0}}/lib/src/shared/utils/utils.dart"},"range":{"start":{"line":0,"character":0},"end":{"line":29,"character":1}}},"clientRequestTime":1768944388560}}
+{"time":1768944388510,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","id":326,"method":"textDocument/inlayHint","params":{"textDocument":{"uri":"{{workspaceFolder-0}}/lib/src/shared/utils/utils.dart"},"range":{"start":{"line":0,"character":0},"end":{"line":29,"character":1}}},"clientRequestTime":1768944388560}}
 {"time":1768944388510,"kind":"message","sender":"server","receiver":"ide","message":{"id":326,"jsonrpc":"2.0","result":[{"kind":2,"label":[{"location":{"range":{"end":{"character":28,"line":363},"start":{"character":23,"line":363}},"uri":"{{package-root:sky_engine}}lib/core/string.dart"},"value":"start:"}],"paddingRight":true,"position":{"character":42,"line":4}},{"kind":2,"label":[{"location":{"range":{"end":{"character":32,"line":546},"start":{"character":28,"line":546}},"uri":"{{package-root:sky_engine}}lib/core/string.dart"},"value":"from:"}],"paddingRight":true,"position":{"character":32,"line":8}},{"kind":2,"label":[{"location":{"range":{"end":{"character":48,"line":546},"start":{"character":41,"line":546}},"uri":"{{package-root:sky_engine}}lib/core/string.dart"},"value":"replace:"}],"paddingRight":true,"position":{"character":51,"line":8}},{"kind":2,"label":[{"location":{"range":{"end":{"character":17,"line":274},"start":{"character":11,"line":274}},"uri":"{{package-root:sky_engine}}lib/core/regexp.dart"},"value":"source:"}],"paddingRight":true,"position":{"character":39,"line":8}},{"kind":2,"label":[{"location":{"range":{"end":{"character":36,"line":676},"start":{"character":29,"line":676}},"uri":"{{package-root:sky_engine}}lib/core/string.dart"},"value":"pattern:"}],"paddingRight":true,"position":{"character":34,"line":9}},{"kind":2,"label":[{"location":{"range":{"end":{"character":31,"line":463},"start":{"character":22,"line":463}},"uri":"{{package-root:sky_engine}}lib/core/iterable.dart"},"value":"separator:"}],"paddingRight":true,"position":{"character":52,"line":9}},{"kind":2,"label":[{"location":{"range":{"end":{"character":29,"line":187},"start":{"character":22,"line":187}},"uri":"{{package-root:sky_engine}}lib/core/errors.dart"},"value":"message:"}],"paddingRight":true,"position":{"character":33,"line":14}},{"kind":2,"label":[{"location":{"range":{"end":{"character":19,"line":13},"start":{"character":18,"line":13}},"uri":"{{package-root:devtools_companion}}lib/src/shared/utils/utils.dart"},"value":"n:"}],"paddingRight":true,"position":{"character":23,"line":16}},{"kind":2,"label":[{"value":"toElements:"}],"paddingRight":true,"position":{"character":22,"line":20}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":17,"line":19},"start":{"character":16,"line":19}},"uri":"{{package-root:devtools_companion}}lib/src/shared/utils/utils.dart"},"value":"T"},{"value":">"}],"paddingRight":true,"position":{"character":23,"line":20}},{"kind":1,"label":[{"value":"<"},{"location":{"range":{"end":{"character":17,"line":19},"start":{"character":16,"line":19}},"uri":"{{package-root:devtools_companion}}lib/src/shared/utils/utils.dart"},"value":"T"},{"value":">"}],"position":{"character":21,"line":20}},{"kind":2,"label":[{"location":{"range":{"end":{"character":36,"line":676},"start":{"character":29,"line":676}},"uri":"{{package-root:sky_engine}}lib/core/string.dart"},"value":"pattern:"}],"paddingRight":true,"position":{"character":17,"line":24}},{"kind":2,"label":[{"location":{"range":{"end":{"character":31,"line":463},"start":{"character":22,"line":463}},"uri":"{{package-root:sky_engine}}lib/core/iterable.dart"},"value":"separator:"}],"paddingRight":true,"position":{"character":35,"line":24}}]}}
-{"time":1768944388692,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","id":327,"method":"textDocument/foldingRange","params":{"textDocument":{"uri":"file://{{workspaceFolder-0}}/lib/src/shared/utils/utils.dart"}},"clientRequestTime":1768944388742}}
+{"time":1768944388692,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","id":327,"method":"textDocument/foldingRange","params":{"textDocument":{"uri":"{{workspaceFolder-0}}/lib/src/shared/utils/utils.dart"}},"clientRequestTime":1768944388742}}
 {"time":1768944388692,"kind":"message","sender":"server","receiver":"ide","message":{"id":327,"jsonrpc":"2.0","result":[{"endLine":5,"startLine":2},{"endLine":11,"startLine":7},{"endLine":17,"startLine":13},{"endLine":21,"startLine":19},{"endLine":25,"startLine":23},{"endLine":29,"startLine":27}]}}
-{"time":1768944388758,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","id":328,"method":"textDocument/codeAction","params":{"textDocument":{"uri":"file://{{workspaceFolder-0}}/lib/src/shared/utils/utils.dart"},"range":{"start":{"line":20,"character":27},"end":{"line":20,"character":27}},"context":{"diagnostics":[],"triggerKind":2}},"clientRequestTime":1768944388808}}
-{"time":1768944388758,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","id":329,"method":"textDocument/codeLens","params":{"textDocument":{"uri":"file://{{workspaceFolder-0}}/lib/src/shared/utils/utils.dart"}},"clientRequestTime":1768944388808}}
+{"time":1768944388758,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","id":328,"method":"textDocument/codeAction","params":{"textDocument":{"uri":"{{workspaceFolder-0}}/lib/src/shared/utils/utils.dart"},"range":{"start":{"line":20,"character":27},"end":{"line":20,"character":27}},"context":{"diagnostics":[],"triggerKind":2}},"clientRequestTime":1768944388808}}
+{"time":1768944388758,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","id":329,"method":"textDocument/codeLens","params":{"textDocument":{"uri":"{{workspaceFolder-0}}/lib/src/shared/utils/utils.dart"}},"clientRequestTime":1768944388808}}
 {"time":1768944388759,"kind":"message","sender":"server","receiver":"ide","message":{"id":95,"jsonrpc":"2.0","method":"window/workDoneProgress/create","params":{"token":"ANALYZING"}}}
 {"time":1768944388759,"kind":"message","sender":"server","receiver":"ide","message":{"id":329,"jsonrpc":"2.0","result":[]}}
 {"time":1768944388759,"kind":"message","sender":"server","receiver":"ide","message":{"id":328,"jsonrpc":"2.0","result":[{"command":{"arguments":[{"path":"C:\\work\\devtools_companion\\lib\\src\\shared\\utils\\utils.dart","autoTriggered":true}],"command":"dart.edit.sortMembers","title":"Sort Members"},"kind":"source.sortMembers","title":"Sort Members"},{"command":{"arguments":[{"path":"C:\\work\\devtools_companion\\lib\\src\\shared\\utils\\utils.dart","autoTriggered":true}],"command":"dart.edit.organizeImports","title":"Organize Imports"},"kind":"source.organizeImports","title":"Organize Imports"},{"command":{"arguments":[{"path":"C:\\work\\devtools_companion\\lib\\src\\shared\\utils\\utils.dart","autoTriggered":true}],"command":"dart.edit.fixAll","title":"Fix All"},"kind":"source.fixAll","title":"Fix All"},{"command":{"arguments":[{"action":"dart.assist.add.typeAnnotation"}],"command":"dart.logAction","title":"Log Action"},"diagnostics":[],"edit":{"documentChanges":[{"edits":[{"newText":"List<T> ","range":{"end":{"character":23,"line":20},"start":{"character":23,"line":20}}}],"textDocument":{"uri":"{{package-root:devtools_companion}}lib/src/shared/utils/utils.dart","version":36}}]},"kind":"refactor.add.typeAnnotation","title":"Add type annotation"},{"command":{"arguments":[{"action":"dart.assist.convert.bodyToBlock"}],"command":"dart.logAction","title":"Log Action"},"diagnostics":[],"edit":{"documentChanges":[{"edits":[{"insertTextFormat":2,"newText":" {\r\n    return list;$0\r\n  }","range":{"end":{"character":36,"line":20},"start":{"character":28,"line":20}}}],"textDocument":{"uri":"{{package-root:devtools_companion}}lib/src/shared/utils/utils.dart","version":36}}]},"kind":"refactor.convert.bodyToBlock","title":"Convert to block body"},{"command":{"arguments":["EXTRACT_METHOD","C:\\work\\devtools_companion\\lib\\src\\shared\\utils\\utils.dart",36,583,0,null],"command":"refactor.perform","title":"Extract Method"},"kind":"refactor.extract","title":"Extract Method"}]}}
 {"time":1768944388760,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","id":95,"result":null,"clientRequestTime":1768944388810}}
 {"time":1768944388760,"kind":"message","sender":"server","receiver":"ide","message":{"jsonrpc":"2.0","method":"$/progress","params":{"token":"ANALYZING","value":{"kind":"begin","title":"Analyzing…"}}}}
 {"time":1768944388760,"kind":"message","sender":"server","receiver":"ide","message":{"jsonrpc":"2.0","method":"$/progress","params":{"token":"ANALYZING","value":{"kind":"end"}}}}
-{"time":1768944388787,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","id":330,"method":"textDocument/semanticTokens/full","params":{"textDocument":{"uri":"file://{{workspaceFolder-0}}/lib/src/shared/utils/utils.dart"}},"clientRequestTime":1768944388837}}
+{"time":1768944388787,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","id":330,"method":"textDocument/semanticTokens/full","params":{"textDocument":{"uri":"{{workspaceFolder-0}}/lib/src/shared/utils/utils.dart"}},"clientRequestTime":1768944388837}}
 {"time":1768944388787,"kind":"message","sender":"server","receiver":"ide","message":{"id":330,"jsonrpc":"2.0","result":{"data":[0,0,34,3,0,2,0,6,2,0,0,7,10,17,36,0,11,6,2,0,0,7,1,6,4,1,2,2,1,256,0,4,1,6,0,0,2,7,11,16,0,9,6,1,256,0,7,1,6,0,1,2,6,1,256,0,7,1,6,0,0,2,1,15,0,0,3,11,4,16,0,16,1,6,0,0,2,9,4,16,0,10,1,15,0,3,0,4,2,0,0,5,12,17,36,0,13,6,2,0,0,7,1,6,4,1,2,6,2,0,0,7,7,5,4,0,10,1,6,0,0,2,10,4,16,0,11,6,2,2,0,7,9,16,0,0,12,2,16,0,0,4,11,4,16,1,2,6,2,0,0,7,8,5,4,0,11,7,5,0,0,8,5,4,16,0,6,2,16,0,0,4,8,11,16,0,9,4,4,16,0,5,2,16,0,1,2,6,1,256,0,7,7,5,0,0,11,8,5,0,3,0,3,2,0,0,4,9,17,36,0,10,3,2,0,0,4,1,6,4,1,2,2,1,256,0,4,1,6,0,0,4,1,15,0,0,3,5,1,256,0,6,13,2,2,0,14,35,16,0,1,2,2,1,256,0,4,1,6,0,0,5,1,15,0,0,5,1,6,0,0,5,1,15,0,0,3,6,1,256,0,7,1,15,0,1,2,6,1,256,0,7,1,6,0,0,4,9,17,0,0,10,1,6,0,0,4,1,15,0,3,0,4,2,0,0,5,1,18,0,0,3,7,17,36,0,8,1,18,0,0,3,4,2,0,0,5,4,2,0,0,5,1,18,0,0,4,5,6,4,1,2,6,1,256,0,7,5,6,0,0,6,6,4,16,0,8,4,6,4,0,9,4,6,0,0,6,6,4,16,3,0,6,2,0,0,7,13,17,36,0,14,6,2,0,0,7,1,6,4,1,2,6,1,256,0,7,1,6,0,0,2,5,4,16,0,6,2,16,0,0,4,8,11,16,0,9,4,4,16,0,5,2,16,0,3,0,6,2,0,0,7,16,17,36,0,17,6,2,0,0,7,7,6,4,1,2,6,1,256,0,7,7,6,0,0,11,18,15,0,0,21,5,15,0]}}}
-{"time":1768944388848,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","id":331,"method":"textDocument/documentSymbol","params":{"textDocument":{"uri":"file://{{workspaceFolder-0}}/lib/src/shared/utils/utils.dart"}},"clientRequestTime":1768944388898}}
-{"time":1768944388848,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","id":332,"method":"textDocument/documentSymbol","params":{"textDocument":{"uri":"file://{{workspaceFolder-0}}/lib/src/shared/utils/utils.dart"}},"clientRequestTime":1768944388898}}
+{"time":1768944388848,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","id":331,"method":"textDocument/documentSymbol","params":{"textDocument":{"uri":"{{workspaceFolder-0}}/lib/src/shared/utils/utils.dart"}},"clientRequestTime":1768944388898}}
+{"time":1768944388848,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","id":332,"method":"textDocument/documentSymbol","params":{"textDocument":{"uri":"{{workspaceFolder-0}}/lib/src/shared/utils/utils.dart"}},"clientRequestTime":1768944388898}}
 {"time":1768944388849,"kind":"message","sender":"server","receiver":"ide","message":{"id":331,"jsonrpc":"2.0","result":[{"deprecated":false,"detail":"(String s)","kind":12,"name":"capitalize","range":{"end":{"character":1,"line":5},"start":{"character":0,"line":2}},"selectionRange":{"end":{"character":17,"line":2},"start":{"character":7,"line":2}}},{"deprecated":false,"detail":"(String s)","kind":12,"name":"isPalindrome","range":{"end":{"character":1,"line":11},"start":{"character":0,"line":7}},"selectionRange":{"end":{"character":17,"line":7},"start":{"character":5,"line":7}}},{"deprecated":false,"detail":"(int n)","kind":12,"name":"factorial","range":{"end":{"character":1,"line":17},"start":{"character":0,"line":13}},"selectionRange":{"end":{"character":13,"line":13},"start":{"character":4,"line":13}}},{"deprecated":false,"detail":"(List<List<T>> lists)","kind":12,"name":"flatten","range":{"end":{"character":1,"line":21},"start":{"character":0,"line":19}},"selectionRange":{"end":{"character":15,"line":19},"start":{"character":8,"line":19}}},{"deprecated":false,"detail":"(String s)","kind":12,"name":"reverseString","range":{"end":{"character":1,"line":25},"start":{"character":0,"line":23}},"selectionRange":{"end":{"character":20,"line":23},"start":{"character":7,"line":23}}},{"deprecated":false,"detail":"(double degrees)","kind":12,"name":"degreesToRadians","range":{"end":{"character":1,"line":29},"start":{"character":0,"line":27}},"selectionRange":{"end":{"character":23,"line":27},"start":{"character":7,"line":27}}}]}}
 {"time":1768944388849,"kind":"message","sender":"server","receiver":"ide","message":{"id":332,"jsonrpc":"2.0","result":[{"deprecated":false,"detail":"(String s)","kind":12,"name":"capitalize","range":{"end":{"character":1,"line":5},"start":{"character":0,"line":2}},"selectionRange":{"end":{"character":17,"line":2},"start":{"character":7,"line":2}}},{"deprecated":false,"detail":"(String s)","kind":12,"name":"isPalindrome","range":{"end":{"character":1,"line":11},"start":{"character":0,"line":7}},"selectionRange":{"end":{"character":17,"line":7},"start":{"character":5,"line":7}}},{"deprecated":false,"detail":"(int n)","kind":12,"name":"factorial","range":{"end":{"character":1,"line":17},"start":{"character":0,"line":13}},"selectionRange":{"end":{"character":13,"line":13},"start":{"character":4,"line":13}}},{"deprecated":false,"detail":"(List<List<T>> lists)","kind":12,"name":"flatten","range":{"end":{"character":1,"line":21},"start":{"character":0,"line":19}},"selectionRange":{"end":{"character":15,"line":19},"start":{"character":8,"line":19}}},{"deprecated":false,"detail":"(String s)","kind":12,"name":"reverseString","range":{"end":{"character":1,"line":25},"start":{"character":0,"line":23}},"selectionRange":{"end":{"character":20,"line":23},"start":{"character":7,"line":23}}},{"deprecated":false,"detail":"(double degrees)","kind":12,"name":"degreesToRadians","range":{"end":{"character":1,"line":29},"start":{"character":0,"line":27}},"selectionRange":{"end":{"character":23,"line":27},"start":{"character":7,"line":27}}}]}}
-{"time":1768944389290,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","id":333,"method":"textDocument/inlayHint","params":{"textDocument":{"uri":"file://{{workspaceFolder-0}}/lib/src/shared/utils/utils.dart"},"range":{"start":{"line":0,"character":0},"end":{"line":29,"character":1}}},"clientRequestTime":1768944389340}}
+{"time":1768944389290,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","id":333,"method":"textDocument/inlayHint","params":{"textDocument":{"uri":"{{workspaceFolder-0}}/lib/src/shared/utils/utils.dart"},"range":{"start":{"line":0,"character":0},"end":{"line":29,"character":1}}},"clientRequestTime":1768944389340}}
 {"time":1768944389290,"kind":"message","sender":"server","receiver":"ide","message":{"id":333,"jsonrpc":"2.0","result":[{"kind":2,"label":[{"location":{"range":{"end":{"character":28,"line":363},"start":{"character":23,"line":363}},"uri":"{{package-root:sky_engine}}lib/core/string.dart"},"value":"start:"}],"paddingRight":true,"position":{"character":42,"line":4}},{"kind":2,"label":[{"location":{"range":{"end":{"character":32,"line":546},"start":{"character":28,"line":546}},"uri":"{{package-root:sky_engine}}lib/core/string.dart"},"value":"from:"}],"paddingRight":true,"position":{"character":32,"line":8}},{"kind":2,"label":[{"location":{"range":{"end":{"character":48,"line":546},"start":{"character":41,"line":546}},"uri":"{{package-root:sky_engine}}lib/core/string.dart"},"value":"replace:"}],"paddingRight":true,"position":{"character":51,"line":8}},{"kind":2,"label":[{"location":{"range":{"end":{"character":17,"line":274},"start":{"character":11,"line":274}},"uri":"{{package-root:sky_engine}}lib/core/regexp.dart"},"value":"source:"}],"paddingRight":true,"position":{"character":39,"line":8}},{"kind":2,"label":[{"location":{"range":{"end":{"character":36,"line":676},"start":{"character":29,"line":676}},"uri":"{{package-root:sky_engine}}lib/core/string.dart"},"value":"pattern:"}],"paddingRight":true,"position":{"character":34,"line":9}},{"kind":2,"label":[{"location":{"range":{"end":{"character":31,"line":463},"start":{"character":22,"line":463}},"uri":"{{package-root:sky_engine}}lib/core/iterable.dart"},"value":"separator:"}],"paddingRight":true,"position":{"character":52,"line":9}},{"kind":2,"label":[{"location":{"range":{"end":{"character":29,"line":187},"start":{"character":22,"line":187}},"uri":"{{package-root:sky_engine}}lib/core/errors.dart"},"value":"message:"}],"paddingRight":true,"position":{"character":33,"line":14}},{"kind":2,"label":[{"location":{"range":{"end":{"character":19,"line":13},"start":{"character":18,"line":13}},"uri":"{{package-root:devtools_companion}}lib/src/shared/utils/utils.dart"},"value":"n:"}],"paddingRight":true,"position":{"character":23,"line":16}},{"kind":2,"label":[{"value":"toElements:"}],"paddingRight":true,"position":{"character":22,"line":20}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":17,"line":19},"start":{"character":16,"line":19}},"uri":"{{package-root:devtools_companion}}lib/src/shared/utils/utils.dart"},"value":"T"},{"value":">"}],"paddingRight":true,"position":{"character":23,"line":20}},{"kind":1,"label":[{"value":"<"},{"location":{"range":{"end":{"character":17,"line":19},"start":{"character":16,"line":19}},"uri":"{{package-root:devtools_companion}}lib/src/shared/utils/utils.dart"},"value":"T"},{"value":">"}],"position":{"character":21,"line":20}},{"kind":2,"label":[{"location":{"range":{"end":{"character":36,"line":676},"start":{"character":29,"line":676}},"uri":"{{package-root:sky_engine}}lib/core/string.dart"},"value":"pattern:"}],"paddingRight":true,"position":{"character":17,"line":24}},{"kind":2,"label":[{"location":{"range":{"end":{"character":31,"line":463},"start":{"character":22,"line":463}},"uri":"{{package-root:sky_engine}}lib/core/iterable.dart"},"value":"separator:"}],"paddingRight":true,"position":{"character":35,"line":24}}]}}
-{"time":1768944389494,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","id":334,"method":"textDocument/documentLink","params":{"textDocument":{"uri":"file://{{workspaceFolder-0}}/lib/src/shared/utils/utils.dart"}},"clientRequestTime":1768944389544}}
-{"time":1768944389494,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","id":335,"method":"textDocument/documentColor","params":{"textDocument":{"uri":"file://{{workspaceFolder-0}}/lib/src/shared/utils/utils.dart"}},"clientRequestTime":1768944389544}}
+{"time":1768944389494,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","id":334,"method":"textDocument/documentLink","params":{"textDocument":{"uri":"{{workspaceFolder-0}}/lib/src/shared/utils/utils.dart"}},"clientRequestTime":1768944389544}}
+{"time":1768944389494,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","id":335,"method":"textDocument/documentColor","params":{"textDocument":{"uri":"{{workspaceFolder-0}}/lib/src/shared/utils/utils.dart"}},"clientRequestTime":1768944389544}}
 {"time":1768944389494,"kind":"message","sender":"server","receiver":"ide","message":{"id":335,"jsonrpc":"2.0","result":[]}}
 {"time":1768944389494,"kind":"message","sender":"server","receiver":"ide","message":{"id":334,"jsonrpc":"2.0","result":[]}}
 {"time":1768944389524,"kind":"message","sender":"watcher","receiver":"server","message":{"path":"C:\\work\\devtools_companion\\lib\\src\\shared\\utils\\utils.dart","type":"modify"}}
@@ -76,30 +76,30 @@
 {"time":1768944389525,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","id":96,"result":null,"clientRequestTime":1768944389576}}
 {"time":1768944389525,"kind":"message","sender":"server","receiver":"ide","message":{"jsonrpc":"2.0","method":"$/progress","params":{"token":"ANALYZING","value":{"kind":"begin","title":"Analyzing…"}}}}
 {"time":1768944389525,"kind":"message","sender":"server","receiver":"ide","message":{"jsonrpc":"2.0","method":"$/progress","params":{"token":"ANALYZING","value":{"kind":"end"}}}}
-{"time":1768944390340,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","id":336,"method":"textDocument/hover","params":{"textDocument":{"uri":"file://{{workspaceFolder-0}}/lib/src/shared/utils/utils.dart"},"position":{"line":24,"character":27}},"clientRequestTime":1768944390390}}
+{"time":1768944390340,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","id":336,"method":"textDocument/hover","params":{"textDocument":{"uri":"{{workspaceFolder-0}}/lib/src/shared/utils/utils.dart"},"position":{"line":24,"character":27}},"clientRequestTime":1768944390390}}
 {"time":1768944390340,"kind":"message","sender":"server","receiver":"ide","message":{"id":336,"jsonrpc":"2.0","result":{"contents":{"kind":"markdown","value":"```dart\nIterable<String> get reversed\n```\nType: `Iterable<String>`\n\nDeclared in `List` in _dart:core_.\n\n---\nAn [Iterable] of the objects in this list in reverse order.\n```dart\nfinal numbers = <String>['two', 'three', 'four'];\nfinal reverseOrder = numbers.reversed;\nprint(reverseOrder.toList()); // [four, three, two]\n```"},"range":{"end":{"character":29,"line":24},"start":{"character":21,"line":24}}}}}
-{"time":1768944391021,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","id":337,"method":"textDocument/codeAction","params":{"textDocument":{"uri":"file://{{workspaceFolder-0}}/lib/src/shared/utils/utils.dart"},"range":{"start":{"line":24,"character":39},"end":{"line":24,"character":39}},"context":{"diagnostics":[],"triggerKind":2}},"clientRequestTime":1768944391072}}
+{"time":1768944391021,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","id":337,"method":"textDocument/codeAction","params":{"textDocument":{"uri":"{{workspaceFolder-0}}/lib/src/shared/utils/utils.dart"},"range":{"start":{"line":24,"character":39},"end":{"line":24,"character":39}},"context":{"diagnostics":[],"triggerKind":2}},"clientRequestTime":1768944391072}}
 {"time":1768944391021,"kind":"message","sender":"server","receiver":"ide","message":{"id":97,"jsonrpc":"2.0","method":"window/workDoneProgress/create","params":{"token":"ANALYZING"}}}
 {"time":1768944391023,"kind":"message","sender":"server","receiver":"ide","message":{"id":337,"jsonrpc":"2.0","result":[{"command":{"arguments":[{"path":"C:\\work\\devtools_companion\\lib\\src\\shared\\utils\\utils.dart","autoTriggered":true}],"command":"dart.edit.sortMembers","title":"Sort Members"},"kind":"source.sortMembers","title":"Sort Members"},{"command":{"arguments":[{"path":"C:\\work\\devtools_companion\\lib\\src\\shared\\utils\\utils.dart","autoTriggered":true}],"command":"dart.edit.organizeImports","title":"Organize Imports"},"kind":"source.organizeImports","title":"Organize Imports"},{"command":{"arguments":[{"path":"C:\\work\\devtools_companion\\lib\\src\\shared\\utils\\utils.dart","autoTriggered":true}],"command":"dart.edit.fixAll","title":"Fix All"},"kind":"source.fixAll","title":"Fix All"},{"command":{"arguments":[{"action":"dart.fix.remove.argument"}],"command":"dart.logAction","title":"Log Action"},"diagnostics":[{"code":"avoid_redundant_argument_values","codeDescription":{"href":"https://dart.dev/lints/avoid_redundant_argument_values"},"message":"The value of the argument is redundant because it matches the default value.\nTry removing the argument.","range":{"end":{"character":37,"line":24},"start":{"character":35,"line":24}},"severity":3,"source":"dart"}],"edit":{"documentChanges":[{"edits":[{"newText":"","range":{"end":{"character":37,"line":24},"start":{"character":35,"line":24}}}],"textDocument":{"uri":"{{package-root:devtools_companion}}lib/src/shared/utils/utils.dart","version":36}}]},"kind":"quickfix.remove.argument","title":"Remove argument"},{"command":{"arguments":[{"action":"dart.fix.remove.argument.multi"}],"command":"dart.logAction","title":"Log Action"},"diagnostics":[{"code":"avoid_redundant_argument_values","codeDescription":{"href":"https://dart.dev/lints/avoid_redundant_argument_values"},"message":"The value of the argument is redundant because it matches the default value.\nTry removing the argument.","range":{"end":{"character":37,"line":24},"start":{"character":35,"line":24}},"severity":3,"source":"dart"}],"edit":{"documentChanges":[{"edits":[{"newText":"","range":{"end":{"character":54,"line":9},"start":{"character":52,"line":9}}},{"newText":"","range":{"end":{"character":37,"line":24},"start":{"character":35,"line":24}}}],"textDocument":{"uri":"{{package-root:devtools_companion}}lib/src/shared/utils/utils.dart","version":36}}]},"kind":"quickfix.remove.argument.multi","title":"Remove arguments in file"},{"command":{"arguments":[{"action":"dart.fix.ignore.line"}],"command":"dart.logAction","title":"Log Action"},"diagnostics":[{"code":"avoid_redundant_argument_values","codeDescription":{"href":"https://dart.dev/lints/avoid_redundant_argument_values"},"message":"The value of the argument is redundant because it matches the default value.\nTry removing the argument.","range":{"end":{"character":37,"line":24},"start":{"character":35,"line":24}},"severity":3,"source":"dart"}],"edit":{"documentChanges":[{"edits":[{"newText":"  // ignore: avoid_redundant_argument_values\r\n","range":{"end":{"character":0,"line":24},"start":{"character":0,"line":24}}}],"textDocument":{"uri":"{{package-root:devtools_companion}}lib/src/shared/utils/utils.dart","version":36}}]},"kind":"quickfix.ignore.line","title":"Ignore 'avoid_redundant_argument_values' for this line"},{"command":{"arguments":[{"action":"dart.fix.ignore.file"}],"command":"dart.logAction","title":"Log Action"},"diagnostics":[{"code":"avoid_redundant_argument_values","codeDescription":{"href":"https://dart.dev/lints/avoid_redundant_argument_values"},"message":"The value of the argument is redundant because it matches the default value.\nTry removing the argument.","range":{"end":{"character":37,"line":24},"start":{"character":35,"line":24}},"severity":3,"source":"dart"}],"edit":{"documentChanges":[{"edits":[{"newText":"\r\n// ignore_for_file: avoid_redundant_argument_values\r\n","range":{"end":{"character":0,"line":1},"start":{"character":0,"line":1}}}],"textDocument":{"uri":"{{package-root:devtools_companion}}lib/src/shared/utils/utils.dart","version":36}}]},"kind":"quickfix.ignore.file","title":"Ignore 'avoid_redundant_argument_values' for the whole file"},{"command":{"arguments":[{"action":"dart.fix.ignore.analysis"}],"command":"dart.logAction","title":"Log Action"},"diagnostics":[{"code":"avoid_redundant_argument_values","codeDescription":{"href":"https://dart.dev/lints/avoid_redundant_argument_values"},"message":"The value of the argument is redundant because it matches the default value.\nTry removing the argument.","range":{"end":{"character":37,"line":24},"start":{"character":35,"line":24}},"severity":3,"source":"dart"}],"edit":{"documentChanges":[{"edits":[{"newText":"analyzer:\r\n  errors:\r\n    avoid_redundant_argument_values: ignore\r\n","range":{"end":{"character":0,"line":0},"start":{"character":0,"line":0}}}],"textDocument":{"uri":"{{package-root:devtools_companion}}analysis_options.yaml","version":null}}]},"kind":"quickfix.ignore.analysis","title":"Ignore 'avoid_redundant_argument_values' in `analysis_options.yaml`"}]}}
 {"time":1768944391024,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","id":97,"result":null,"clientRequestTime":1768944391074}}
 {"time":1768944391024,"kind":"message","sender":"server","receiver":"ide","message":{"jsonrpc":"2.0","method":"$/progress","params":{"token":"ANALYZING","value":{"kind":"begin","title":"Analyzing…"}}}}
 {"time":1768944391024,"kind":"message","sender":"server","receiver":"ide","message":{"jsonrpc":"2.0","method":"$/progress","params":{"token":"ANALYZING","value":{"kind":"end"}}}}
-{"time":1768944391066,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","id":338,"method":"textDocument/hover","params":{"textDocument":{"uri":"file://{{workspaceFolder-0}}/lib/src/shared/utils/utils.dart"},"position":{"line":24,"character":38}},"clientRequestTime":1768944391118}}
+{"time":1768944391066,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","id":338,"method":"textDocument/hover","params":{"textDocument":{"uri":"{{workspaceFolder-0}}/lib/src/shared/utils/utils.dart"},"position":{"line":24,"character":38}},"clientRequestTime":1768944391118}}
 {"time":1768944391066,"kind":"message","sender":"server","receiver":"ide","message":{"id":338,"jsonrpc":"2.0","result":null}}
-{"time":1768944391461,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","id":339,"method":"textDocument/codeAction","params":{"textDocument":{"uri":"file://{{workspaceFolder-0}}/lib/src/shared/utils/utils.dart"},"range":{"start":{"line":24,"character":38},"end":{"line":24,"character":39}},"context":{"diagnostics":[],"triggerKind":2}},"clientRequestTime":1768944391511}}
+{"time":1768944391461,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","id":339,"method":"textDocument/codeAction","params":{"textDocument":{"uri":"{{workspaceFolder-0}}/lib/src/shared/utils/utils.dart"},"range":{"start":{"line":24,"character":38},"end":{"line":24,"character":39}},"context":{"diagnostics":[],"triggerKind":2}},"clientRequestTime":1768944391511}}
 {"time":1768944391461,"kind":"message","sender":"server","receiver":"ide","message":{"id":98,"jsonrpc":"2.0","method":"window/workDoneProgress/create","params":{"token":"ANALYZING"}}}
 {"time":1768944391464,"kind":"message","sender":"server","receiver":"ide","message":{"id":339,"jsonrpc":"2.0","result":[{"command":{"arguments":[{"path":"C:\\work\\devtools_companion\\lib\\src\\shared\\utils\\utils.dart","autoTriggered":true}],"command":"dart.edit.sortMembers","title":"Sort Members"},"kind":"source.sortMembers","title":"Sort Members"},{"command":{"arguments":[{"path":"C:\\work\\devtools_companion\\lib\\src\\shared\\utils\\utils.dart","autoTriggered":true}],"command":"dart.edit.organizeImports","title":"Organize Imports"},"kind":"source.organizeImports","title":"Organize Imports"},{"command":{"arguments":[{"path":"C:\\work\\devtools_companion\\lib\\src\\shared\\utils\\utils.dart","autoTriggered":true}],"command":"dart.edit.fixAll","title":"Fix All"},"kind":"source.fixAll","title":"Fix All"},{"command":{"arguments":[{"action":"dart.fix.remove.argument"}],"command":"dart.logAction","title":"Log Action"},"diagnostics":[{"code":"avoid_redundant_argument_values","codeDescription":{"href":"https://dart.dev/lints/avoid_redundant_argument_values"},"message":"The value of the argument is redundant because it matches the default value.\nTry removing the argument.","range":{"end":{"character":37,"line":24},"start":{"character":35,"line":24}},"severity":3,"source":"dart"}],"edit":{"documentChanges":[{"edits":[{"newText":"","range":{"end":{"character":37,"line":24},"start":{"character":35,"line":24}}}],"textDocument":{"uri":"{{package-root:devtools_companion}}lib/src/shared/utils/utils.dart","version":36}}]},"kind":"quickfix.remove.argument","title":"Remove argument"},{"command":{"arguments":[{"action":"dart.fix.remove.argument.multi"}],"command":"dart.logAction","title":"Log Action"},"diagnostics":[{"code":"avoid_redundant_argument_values","codeDescription":{"href":"https://dart.dev/lints/avoid_redundant_argument_values"},"message":"The value of the argument is redundant because it matches the default value.\nTry removing the argument.","range":{"end":{"character":37,"line":24},"start":{"character":35,"line":24}},"severity":3,"source":"dart"}],"edit":{"documentChanges":[{"edits":[{"newText":"","range":{"end":{"character":54,"line":9},"start":{"character":52,"line":9}}},{"newText":"","range":{"end":{"character":37,"line":24},"start":{"character":35,"line":24}}}],"textDocument":{"uri":"{{package-root:devtools_companion}}lib/src/shared/utils/utils.dart","version":36}}]},"kind":"quickfix.remove.argument.multi","title":"Remove arguments in file"},{"command":{"arguments":[{"action":"dart.fix.ignore.line"}],"command":"dart.logAction","title":"Log Action"},"diagnostics":[{"code":"avoid_redundant_argument_values","codeDescription":{"href":"https://dart.dev/lints/avoid_redundant_argument_values"},"message":"The value of the argument is redundant because it matches the default value.\nTry removing the argument.","range":{"end":{"character":37,"line":24},"start":{"character":35,"line":24}},"severity":3,"source":"dart"}],"edit":{"documentChanges":[{"edits":[{"newText":"  // ignore: avoid_redundant_argument_values\r\n","range":{"end":{"character":0,"line":24},"start":{"character":0,"line":24}}}],"textDocument":{"uri":"{{package-root:devtools_companion}}lib/src/shared/utils/utils.dart","version":36}}]},"kind":"quickfix.ignore.line","title":"Ignore 'avoid_redundant_argument_values' for this line"},{"command":{"arguments":[{"action":"dart.fix.ignore.file"}],"command":"dart.logAction","title":"Log Action"},"diagnostics":[{"code":"avoid_redundant_argument_values","codeDescription":{"href":"https://dart.dev/lints/avoid_redundant_argument_values"},"message":"The value of the argument is redundant because it matches the default value.\nTry removing the argument.","range":{"end":{"character":37,"line":24},"start":{"character":35,"line":24}},"severity":3,"source":"dart"}],"edit":{"documentChanges":[{"edits":[{"newText":"\r\n// ignore_for_file: avoid_redundant_argument_values\r\n","range":{"end":{"character":0,"line":1},"start":{"character":0,"line":1}}}],"textDocument":{"uri":"{{package-root:devtools_companion}}lib/src/shared/utils/utils.dart","version":36}}]},"kind":"quickfix.ignore.file","title":"Ignore 'avoid_redundant_argument_values' for the whole file"},{"command":{"arguments":[{"action":"dart.fix.ignore.analysis"}],"command":"dart.logAction","title":"Log Action"},"diagnostics":[{"code":"avoid_redundant_argument_values","codeDescription":{"href":"https://dart.dev/lints/avoid_redundant_argument_values"},"message":"The value of the argument is redundant because it matches the default value.\nTry removing the argument.","range":{"end":{"character":37,"line":24},"start":{"character":35,"line":24}},"severity":3,"source":"dart"}],"edit":{"documentChanges":[{"edits":[{"newText":"analyzer:\r\n  errors:\r\n    avoid_redundant_argument_values: ignore\r\n","range":{"end":{"character":0,"line":0},"start":{"character":0,"line":0}}}],"textDocument":{"uri":"{{package-root:devtools_companion}}analysis_options.yaml","version":null}}]},"kind":"quickfix.ignore.analysis","title":"Ignore 'avoid_redundant_argument_values' in `analysis_options.yaml`"}]}}
 {"time":1768944391465,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","id":98,"result":null,"clientRequestTime":1768944391515}}
 {"time":1768944391465,"kind":"message","sender":"server","receiver":"ide","message":{"jsonrpc":"2.0","method":"$/progress","params":{"token":"ANALYZING","value":{"kind":"begin","title":"Analyzing…"}}}}
 {"time":1768944391465,"kind":"message","sender":"server","receiver":"ide","message":{"jsonrpc":"2.0","method":"$/progress","params":{"token":"ANALYZING","value":{"kind":"end"}}}}
-{"time":1768944392291,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","id":340,"method":"textDocument/codeAction","params":{"textDocument":{"uri":"file://{{workspaceFolder-0}}/lib/src/shared/utils/utils.dart"},"range":{"start":{"line":24,"character":38},"end":{"line":24,"character":38}},"context":{"diagnostics":[],"triggerKind":2}},"clientRequestTime":1768944392343}}
+{"time":1768944392291,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","id":340,"method":"textDocument/codeAction","params":{"textDocument":{"uri":"{{workspaceFolder-0}}/lib/src/shared/utils/utils.dart"},"range":{"start":{"line":24,"character":38},"end":{"line":24,"character":38}},"context":{"diagnostics":[],"triggerKind":2}},"clientRequestTime":1768944392343}}
 {"time":1768944392291,"kind":"message","sender":"server","receiver":"ide","message":{"id":99,"jsonrpc":"2.0","method":"window/workDoneProgress/create","params":{"token":"ANALYZING"}}}
 {"time":1768944392293,"kind":"message","sender":"server","receiver":"ide","message":{"id":340,"jsonrpc":"2.0","result":[{"command":{"arguments":[{"path":"C:\\work\\devtools_companion\\lib\\src\\shared\\utils\\utils.dart","autoTriggered":true}],"command":"dart.edit.sortMembers","title":"Sort Members"},"kind":"source.sortMembers","title":"Sort Members"},{"command":{"arguments":[{"path":"C:\\work\\devtools_companion\\lib\\src\\shared\\utils\\utils.dart","autoTriggered":true}],"command":"dart.edit.organizeImports","title":"Organize Imports"},"kind":"source.organizeImports","title":"Organize Imports"},{"command":{"arguments":[{"path":"C:\\work\\devtools_companion\\lib\\src\\shared\\utils\\utils.dart","autoTriggered":true}],"command":"dart.edit.fixAll","title":"Fix All"},"kind":"source.fixAll","title":"Fix All"},{"command":{"arguments":[{"action":"dart.fix.remove.argument"}],"command":"dart.logAction","title":"Log Action"},"diagnostics":[{"code":"avoid_redundant_argument_values","codeDescription":{"href":"https://dart.dev/lints/avoid_redundant_argument_values"},"message":"The value of the argument is redundant because it matches the default value.\nTry removing the argument.","range":{"end":{"character":37,"line":24},"start":{"character":35,"line":24}},"severity":3,"source":"dart"}],"edit":{"documentChanges":[{"edits":[{"newText":"","range":{"end":{"character":37,"line":24},"start":{"character":35,"line":24}}}],"textDocument":{"uri":"{{package-root:devtools_companion}}lib/src/shared/utils/utils.dart","version":36}}]},"kind":"quickfix.remove.argument","title":"Remove argument"},{"command":{"arguments":[{"action":"dart.fix.remove.argument.multi"}],"command":"dart.logAction","title":"Log Action"},"diagnostics":[{"code":"avoid_redundant_argument_values","codeDescription":{"href":"https://dart.dev/lints/avoid_redundant_argument_values"},"message":"The value of the argument is redundant because it matches the default value.\nTry removing the argument.","range":{"end":{"character":37,"line":24},"start":{"character":35,"line":24}},"severity":3,"source":"dart"}],"edit":{"documentChanges":[{"edits":[{"newText":"","range":{"end":{"character":54,"line":9},"start":{"character":52,"line":9}}},{"newText":"","range":{"end":{"character":37,"line":24},"start":{"character":35,"line":24}}}],"textDocument":{"uri":"{{package-root:devtools_companion}}lib/src/shared/utils/utils.dart","version":36}}]},"kind":"quickfix.remove.argument.multi","title":"Remove arguments in file"},{"command":{"arguments":[{"action":"dart.fix.ignore.line"}],"command":"dart.logAction","title":"Log Action"},"diagnostics":[{"code":"avoid_redundant_argument_values","codeDescription":{"href":"https://dart.dev/lints/avoid_redundant_argument_values"},"message":"The value of the argument is redundant because it matches the default value.\nTry removing the argument.","range":{"end":{"character":37,"line":24},"start":{"character":35,"line":24}},"severity":3,"source":"dart"}],"edit":{"documentChanges":[{"edits":[{"newText":"  // ignore: avoid_redundant_argument_values\r\n","range":{"end":{"character":0,"line":24},"start":{"character":0,"line":24}}}],"textDocument":{"uri":"{{package-root:devtools_companion}}lib/src/shared/utils/utils.dart","version":36}}]},"kind":"quickfix.ignore.line","title":"Ignore 'avoid_redundant_argument_values' for this line"},{"command":{"arguments":[{"action":"dart.fix.ignore.file"}],"command":"dart.logAction","title":"Log Action"},"diagnostics":[{"code":"avoid_redundant_argument_values","codeDescription":{"href":"https://dart.dev/lints/avoid_redundant_argument_values"},"message":"The value of the argument is redundant because it matches the default value.\nTry removing the argument.","range":{"end":{"character":37,"line":24},"start":{"character":35,"line":24}},"severity":3,"source":"dart"}],"edit":{"documentChanges":[{"edits":[{"newText":"\r\n// ignore_for_file: avoid_redundant_argument_values\r\n","range":{"end":{"character":0,"line":1},"start":{"character":0,"line":1}}}],"textDocument":{"uri":"{{package-root:devtools_companion}}lib/src/shared/utils/utils.dart","version":36}}]},"kind":"quickfix.ignore.file","title":"Ignore 'avoid_redundant_argument_values' for the whole file"},{"command":{"arguments":[{"action":"dart.fix.ignore.analysis"}],"command":"dart.logAction","title":"Log Action"},"diagnostics":[{"code":"avoid_redundant_argument_values","codeDescription":{"href":"https://dart.dev/lints/avoid_redundant_argument_values"},"message":"The value of the argument is redundant because it matches the default value.\nTry removing the argument.","range":{"end":{"character":37,"line":24},"start":{"character":35,"line":24}},"severity":3,"source":"dart"}],"edit":{"documentChanges":[{"edits":[{"newText":"analyzer:\r\n  errors:\r\n    avoid_redundant_argument_values: ignore\r\n","range":{"end":{"character":0,"line":0},"start":{"character":0,"line":0}}}],"textDocument":{"uri":"{{package-root:devtools_companion}}analysis_options.yaml","version":null}}]},"kind":"quickfix.ignore.analysis","title":"Ignore 'avoid_redundant_argument_values' in `analysis_options.yaml`"},{"command":{"arguments":["EXTRACT_METHOD","C:\\work\\devtools_companion\\lib\\src\\shared\\utils\\utils.dart",36,682,0,null],"command":"refactor.perform","title":"Extract Method"},"kind":"refactor.extract","title":"Extract Method"},{"command":{"arguments":["EXTRACT_LOCAL_VARIABLE","C:\\work\\devtools_companion\\lib\\src\\shared\\utils\\utils.dart",36,682,0,null],"command":"refactor.perform","title":"Extract Local Variable"},"kind":"refactor.extract","title":"Extract Local Variable"}]}}
 {"time":1768944392293,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","id":99,"result":null,"clientRequestTime":1768944392345}}
 {"time":1768944392293,"kind":"message","sender":"server","receiver":"ide","message":{"jsonrpc":"2.0","method":"$/progress","params":{"token":"ANALYZING","value":{"kind":"begin","title":"Analyzing…"}}}}
 {"time":1768944392293,"kind":"message","sender":"server","receiver":"ide","message":{"jsonrpc":"2.0","method":"$/progress","params":{"token":"ANALYZING","value":{"kind":"end"}}}}
-{"time":1768944392356,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","method":"textDocument/didChange","params":{"textDocument":{"uri":"file://{{workspaceFolder-0}}/lib/src/shared/utils/utils.dart","version":37},"contentChanges":[{"range":{"start":{"line":24,"character":38},"end":{"line":24,"character":38}},"rangeLength":0,"text":"."}]},"clientRequestTime":1768944392409}}
-{"time":1768944392356,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","id":341,"method":"textDocument/completion","params":{"textDocument":{"uri":"file://{{workspaceFolder-0}}/lib/src/shared/utils/utils.dart"},"position":{"line":24,"character":39},"context":{"triggerKind":2,"triggerCharacter":"."}},"clientRequestTime":1768944392409}}
+{"time":1768944392356,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","method":"textDocument/didChange","params":{"textDocument":{"uri":"{{workspaceFolder-0}}/lib/src/shared/utils/utils.dart","version":37},"contentChanges":[{"range":{"start":{"line":24,"character":38},"end":{"line":24,"character":38}},"rangeLength":0,"text":"."}]},"clientRequestTime":1768944392409}}
+{"time":1768944392356,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","id":341,"method":"textDocument/completion","params":{"textDocument":{"uri":"{{workspaceFolder-0}}/lib/src/shared/utils/utils.dart"},"position":{"line":24,"character":39},"context":{"triggerKind":2,"triggerCharacter":"."}},"clientRequestTime":1768944392409}}
 {"time":1768944392356,"kind":"message","sender":"server","receiver":"ide","message":{"id":100,"jsonrpc":"2.0","method":"window/workDoneProgress/create","params":{"token":"ANALYZING"}}}
 {"time":1768944392360,"kind":"message","sender":"server","receiver":"ide","message":{"id":341,"jsonrpc":"2.0","result":{"isIncomplete":false,"itemDefaults":{"editRange":{"end":{"character":39,"line":24},"start":{"character":39,"line":24}},"insertTextMode":1},"items":[{"detail":"int","documentation":{"kind":"markdown","value":"The length of the string.\n\nReturns the number of UTF-16 code units in this string. The number\nof [runes] might be fewer if the string contains characters outside\nthe Basic Multilingual Plane (plane 0):\n```dart\n'Dart'.length;          // 4\n'Dart'.runes.length;    // 4\n\nvar clef = '\\u{1D11E}';\nclef.length;            // 2\nclef.runes.length;      // 1\n```"},"kind":10,"label":"length","labelDetails":{"detail":" int"},"sortText":"9437"},{"detail":"List<int>","documentation":{"kind":"markdown","value":"An unmodifiable list of the UTF-16 code units of this string."},"kind":10,"label":"codeUnits","labelDetails":{"detail":" List<int>"},"sortText":"9437"},{"detail":"bool","documentation":{"kind":"markdown","value":"Whether this string is not empty."},"kind":10,"label":"isNotEmpty","labelDetails":{"detail":" bool"},"sortText":"9437"},{"detail":"bool","documentation":{"kind":"markdown","value":"Whether this string is empty."},"kind":10,"label":"isEmpty","labelDetails":{"detail":" bool"},"sortText":"9437"},{"detail":"Runes","documentation":{"kind":"markdown","value":"An [Iterable] of Unicode code-points of this string.\n\nIf the string contains surrogate pairs, they are combined and returned\nas one integer by this iterator. Unmatched surrogate halves are treated\nlike valid 16-bit code-units."},"kind":10,"label":"runes","labelDetails":{"detail":" Runes"},"sortText":"9437"},{"detail":"int","documentation":{"kind":"markdown","value":"A hash code derived from the code units of the string.\n\nThis is compatible with [operator ==]. Strings with the same sequence\nof code units have the same hash code."},"kind":10,"label":"hashCode","labelDetails":{"detail":" int"},"sortText":"9437"},{"detail":"Type","documentation":{"kind":"markdown","value":"A representation of the runtime type of the object."},"kind":10,"label":"runtimeType","labelDetails":{"detail":" Type"},"sortText":"9439"},{"detail":"(Pattern from, String to, [int startIndex = 0]) → String","documentation":{"kind":"markdown","value":"Creates a new string with the first occurrence of [from] replaced by [to].\n\nFinds the first match of [from] in this string, starting from [startIndex],\nand creates a new string where that match is replaced with the [to] string.\n\nExample:\n```dart\n'0.0001'.replaceFirst(RegExp(r'0'), ''); // '.0001'\n'0.0001'.replaceFirst(RegExp(r'0'), '7', 1); // '0.7001'\n```"},"insertTextFormat":2,"kind":2,"label":"replaceFirst","labelDetails":{"detail":"(…) → String"},"sortText":"9444","textEditText":"replaceFirst(${1:from}, ${2:to})"},{"detail":"() → String","documentation":{"kind":"markdown","value":"The string without any leading whitespace.\n\nAs [trim], but only removes leading whitespace.\n```dart\nfinal string = ' Dart '.trimLeft();\nprint(string); // 'Dart '\n```"},"insertTextFormat":2,"kind":2,"label":"trimLeft","labelDetails":{"detail":"() → String"},"sortText":"9444","textEditText":"trimLeft()"},{"detail":"() → String","documentation":{"kind":"markdown","value":"The string without any trailing whitespace.\n\nAs [trim], but only removes trailing whitespace.\n```dart\nfinal string = ' Dart '.trimRight();\nprint(string); // ' Dart'\n```"},"insertTextFormat":2,"kind":2,"label":"trimRight","labelDetails":{"detail":"() → String"},"sortText":"9444","textEditText":"trimRight()"},{"detail":"(int width, [String padding = ' ']) → String","documentation":{"kind":"markdown","value":"Pads this string on the left if it is shorter than [width].\n\nReturns a new string that prepends [padding] onto this string\none time for each position the length is less than [width].\n\n```dart\nconst string = 'D';\nprint(string.padLeft(4)); // '   D'\nprint(string.padLeft(2, 'x')); // 'xD'\nprint(string.padLeft(4, 'y')); // 'yyyD'\nprint(string.padLeft(4, '>>')); // '>>>>>>D'\n```\n\nIf [width] is already smaller than or equal to `this.length`,\nno padding is added. A negative `width` is treated as zero.\n\nIf [padding] has length different from 1, the result will not\nhave length `width`. This may be useful for cases where the\npadding is a longer string representing a single character, like\n`\"&nbsp;\"` or `\"\\u{10002}`\".\nIn that case, the user should make sure that `this.length` is\nthe correct measure of the string's length."},"insertTextFormat":2,"kind":2,"label":"padLeft","labelDetails":{"detail":"(…) → String"},"sortText":"9444","textEditText":"padLeft(${0:width})"},{"detail":"(int width, [String padding = ' ']) → String","documentation":{"kind":"markdown","value":"Pads this string on the right if it is shorter than [width].\n\nReturns a new string that appends [padding] after this string\none time for each position the length is less than [width].\n\n```dart\nconst string = 'D';\nprint(string.padRight(4)); // 'D    '\nprint(string.padRight(2, 'x')); // 'Dx'\nprint(string.padRight(4, 'y')); // 'Dyyy'\nprint(string.padRight(4, '>>')); // 'D>>>>>>'\n```\n\nIf [width] is already smaller than or equal to `this.length`,\nno padding is added. A negative `width` is treated as zero.\n\nIf [padding] has length different from 1, the result will not\nhave length `width`. This may be useful for cases where the\npadding is a longer string representing a single character, like\n`\"&nbsp;\"` or `\"\\u{10002}`\".\nIn that case, the user should make sure that `this.length` is\nthe correct measure of the string's length."},"insertTextFormat":2,"kind":2,"label":"padRight","labelDetails":{"detail":"(…) → String"},"sortText":"9444","textEditText":"padRight(${0:width})"},{"detail":"(int start, [int? end]) → String","documentation":{"kind":"markdown","value":"The substring of this string from [start], inclusive, to [end], exclusive.\n\nExample:\n```dart\nconst string = 'dartlang';\nvar result = string.substring(1); // 'artlang'\nresult = string.substring(1, 4); // 'art'\n```\n\nBoth [start] and [end] must be non-negative and no greater than [length];\n[end], if provided, must be greater than or equal to [start]."},"insertTextFormat":2,"kind":2,"label":"substring","labelDetails":{"detail":"(…) → String"},"sortText":"9444","textEditText":"substring(${0:start})"},{"detail":"() → String","documentation":{"kind":"markdown","value":"A string representation of this object.\n\nSome classes have a default textual representation,\noften paired with a static `parse` function (like [int.parse]).\nThese classes will provide the textual representation as\ntheir string representation.\n\nOther classes have no meaningful textual representation\nthat a program will care about.\nSuch classes will typically override `toString` to provide\nuseful information when inspecting the object,\nmainly for debugging or logging."},"insertTextFormat":2,"kind":2,"label":"toString","labelDetails":{"detail":"() → String"},"sortText":"9444","textEditText":"toString()"},{"detail":"(Pattern from, String Function(Match) replace, [int startIndex = 0]) → String","documentation":{"kind":"markdown","value":"Replace the first occurrence of [from] in this string.\n\n```dart\nconst string = 'Dart is fun';\nprint(string.replaceFirstMapped(\n'fun', (m) => 'open source')); // Dart is open source\n\nprint(string.replaceFirstMapped(\nRegExp(r'\\w(\\w*)'), (m) => '<${m[0]}-${m[1]}>')); // <Dart-art> is fun\n```\n\nReturns a new string, which is this string\nexcept that the first match of [from], starting from [startIndex],\nis replaced by the result of calling [replace] with the match object.\n\nThe [startIndex] must be non-negative and no greater than [length]."},"insertTextFormat":2,"kind":2,"label":"replaceFirstMapped","labelDetails":{"detail":"(…) → String"},"sortText":"9444","textEditText":"replaceFirstMapped(${1:from}, ${2:replace})"},{"detail":"(Pattern from, String replace) → String","documentation":{"kind":"markdown","value":"Replaces all substrings that match [from] with [replace].\n\nCreates a new string in which the non-overlapping substrings matching\n[from] (the ones iterated by `from.allMatches(thisString)`) are replaced\nby the literal string [replace].\n```dart\n'resume'.replaceAll(RegExp(r'e'), 'é'); // 'résumé'\n```\nNotice that the [replace] string is not interpreted. If the replacement\ndepends on the match (for example, on a [RegExp]'s capture groups), use\nthe [replaceAllMapped] method instead."},"insertTextFormat":2,"kind":2,"label":"replaceAll","labelDetails":{"detail":"(…) → String"},"sortText":"9444","textEditText":"replaceAll(${1:from}, ${2:replace})"},{"detail":"(Pattern from, String Function(Match) replace) → String","documentation":{"kind":"markdown","value":"Replace all substrings that match [from] by a computed string.\n\nCreates a new string in which the non-overlapping substrings that match\n[from] (the ones iterated by `from.allMatches(thisString)`) are replaced\nby the result of calling [replace] on the corresponding [Match] object.\n\nThis can be used to replace matches with new content that depends on the\nmatch, unlike [replaceAll] where the replacement string is always the same.\n\nThe [replace] function is called with the [Match] generated\nby the pattern, and its result is used as replacement.\n\nThe function defined below converts each word in a string to simplified\n'pig latin' using [replaceAllMapped]:\n```dart\nString pigLatin(String words) => words.replaceAllMapped(\nRegExp(r'\\b(\\w*?)([aeiou]\\w*)', caseSensitive: false),\n(Match m) => \"${m[2]}${m[1]}${m[1]!.isEmpty ? 'way' : 'ay'}\");\n\nfinal result = pigLatin('I have a secret now!');\nprint(result); // 'Iway avehay away ecretsay ownay!'\n```"},"insertTextFormat":2,"kind":2,"label":"replaceAllMapped","labelDetails":{"detail":"(…) → String"},"sortText":"9444","textEditText":"replaceAllMapped(${1:from}, ${2:replace})"},{"detail":"(int start, int? end, String replacement) → String","documentation":{"kind":"markdown","value":"Replaces the substring from [start] to [end] with [replacement].\n\nCreates a new string equivalent to:\n```dart\nthis.substring(0, start) + replacement + this.substring(end)\n```\nExample:\n```dart\nconst string = 'Dart is fun';\nfinal result = string.replaceRange(8, null, 'open source');\nprint(result); // Dart is open source\n```\nThe [start] and [end] indices must specify a valid range of this string.\nThat is `0 <= start <= end <= this.length`.\nIf [end] is `null`, it defaults to [length]."},"insertTextFormat":2,"kind":2,"label":"replaceRange","labelDetails":{"detail":"(…) → String"},"sortText":"9444","textEditText":"replaceRange(${1:start}, ${2:end}, ${3:replacement})"},{"detail":"() → String","documentation":{"kind":"markdown","value":"Converts all characters in this string to upper case.\n\nIf the string is already in all upper case, this method returns `this`.\n```dart\n'alphabet'.toUpperCase(); // 'ALPHABET'\n'ABC'.toUpperCase(); // 'ABC'\n```\nThis function uses the language independent Unicode mapping and thus only\nworks in some languages."},"insertTextFormat":2,"kind":2,"label":"toUpperCase","labelDetails":{"detail":"() → String"},"sortText":"9444","textEditText":"toUpperCase()"},{"detail":"(Pattern pattern, {String Function(Match)? onMatch, String Function(String)? onNonMatch}) → String","documentation":{"kind":"markdown","value":"Splits the string, converts its parts, and combines them into a new\nstring.\n\nThe [pattern] is used to split the string\ninto parts and separating matches.\nEach match of [Pattern.allMatches] of [pattern] on this string is\nused as a match, and the substrings between the end of one match\n(or the start of the string) and the start of the next match (or the\nend of the string) is treated as a non-matched part.\n(There is no omission of leading or trailing empty matchs, like\nin [split], all matches and parts between the are included.)\n\nEach match is converted to a string by calling [onMatch]. If [onMatch]\nis omitted, the matched substring is used.\n\nEach non-matched part is converted to a string by a call to [onNonMatch].\nIf [onNonMatch] is omitted, the non-matching substring itself is used.\n\nThen all the converted parts are concatenated into the resulting string.\n```dart\nfinal result = 'Eats shoots leaves'.splitMapJoin(RegExp(r'shoots'),\nonMatch: (m) => '${m[0]}', // (or no onMatch at all)\nonNonMatch: (n) => '*');\nprint(result); // *shoots*\n```"},"insertTextFormat":2,"kind":2,"label":"splitMapJoin","labelDetails":{"detail":"(…) → String"},"sortText":"9444","textEditText":"splitMapJoin(${0:pattern})"},{"detail":"() → String","documentation":{"kind":"markdown","value":"Converts all characters in this string to lower case.\n\nIf the string is already in all lower case, this method returns `this`.\n```dart\n'ALPHABET'.toLowerCase(); // 'alphabet'\n'abc'.toLowerCase(); // 'abc'\n```\nThis function uses the language independent Unicode mapping and thus only\nworks in some languages."},"insertTextFormat":2,"kind":2,"label":"toLowerCase","labelDetails":{"detail":"() → String"},"sortText":"9444","textEditText":"toLowerCase()"},{"detail":"() → String","documentation":{"kind":"markdown","value":"The string without any leading and trailing whitespace.\n\nIf the string contains leading or trailing whitespace, a new string with no\nleading and no trailing whitespace is returned:\n```dart\nfinal trimmed = '\\tDart is fun\\n'.trim();\nprint(trimmed); // 'Dart is fun'\n```\nOtherwise, the original string itself is returned:\n```dart\nconst string1 = 'Dart';\nfinal string2 = string1.trim(); // 'Dart'\nprint(identical(string1, string2)); // true\n```\nWhitespace is defined by the Unicode White_Space property (as defined in\nversion 6.2 or later) and the BOM character, 0xFEFF.\n\nHere is the list of trimmed characters according to Unicode version 6.3:\n```plaintext\n0009..000D    ; White_Space # Cc   <control-0009>..<control-000D>\n0020          ; White_Space # Zs   SPACE\n0085          ; White_Space # Cc   <control-0085>\n00A0          ; White_Space # Zs   NO-BREAK SPACE\n1680          ; White_Space # Zs   OGHAM SPACE MARK\n2000..200A    ; White_Space # Zs   EN QUAD..HAIR SPACE\n2028          ; White_Space # Zl   LINE SEPARATOR\n2029          ; White_Space # Zp   PARAGRAPH SEPARATOR\n202F          ; White_Space # Zs   NARROW NO-BREAK SPACE\n205F          ; White_Space # Zs   MEDIUM MATHEMATICAL SPACE\n3000          ; White_Space # Zs   IDEOGRAPHIC SPACE\n\nFEFF          ; BOM                ZERO WIDTH NO_BREAK SPACE\n```\nSome later versions of Unicode do not include U+0085 as a whitespace\ncharacter. Whether it is trimmed depends on the Unicode version\nused by the system."},"insertTextFormat":2,"kind":2,"label":"trim","labelDetails":{"detail":"() → String"},"sortText":"9444","textEditText":"trim()"},{"detail":"(int index) → int","documentation":{"kind":"markdown","value":"Returns the 16-bit UTF-16 code unit at the given [index]."},"insertTextFormat":2,"kind":2,"label":"codeUnitAt","labelDetails":{"detail":"(…) → int"},"sortText":"9492","textEditText":"codeUnitAt(${0:index})"},{"detail":"(Pattern other, [int startIndex = 0]) → bool","documentation":{"kind":"markdown","value":"Whether this string contains a match of [other].\n\nExample:\n```dart\nconst string = 'Dart strings';\nfinal containsD = string.contains('D'); // true\nfinal containsUpperCase = string.contains(RegExp(r'[A-Z]')); // true\n```\nIf [startIndex] is provided, this method matches only at or after that\nindex:\n```dart\nconst string = 'Dart strings';\nfinal containsD = string.contains(RegExp('D'), 0); // true\nfinal caseSensitive = string.contains(RegExp(r'[A-Z]'), 1); // false\n```\nThe [startIndex] must not be negative or greater than [length]."},"insertTextFormat":2,"kind":2,"label":"contains","labelDetails":{"detail":"(…) → bool"},"sortText":"9492","textEditText":"contains(${0:other})"},{"detail":"(Pattern pattern, [int? start]) → int","documentation":{"kind":"markdown","value":"The starting position of the last match [pattern] in this string.\n\nFinds a match of pattern by searching backward starting at [start]:\n```dart\nconst string = 'Dartisans';\nprint(string.lastIndexOf('a')); // 6\nprint(string.lastIndexOf(RegExp(r'a(r|n)'))); // 6\n```\nReturns -1 if [pattern] could not be found in this string.\n```dart\nconst string = 'Dartisans';\nprint(string.lastIndexOf(RegExp(r'DART'))); // -1\n```\nIf [start] is omitted, search starts from the end of the string.\nIf supplied, [start] must be non-negative and not greater than [length]."},"insertTextFormat":2,"kind":2,"label":"lastIndexOf","labelDetails":{"detail":"(…) → int"},"sortText":"9492","textEditText":"lastIndexOf(${0:pattern})"},{"detail":"(Pattern pattern, [int start = 0]) → int","documentation":{"kind":"markdown","value":"Returns the position of the first match of [pattern] in this string,\nstarting at [start], inclusive:\n```dart\nconst string = 'Dartisans';\nprint(string.indexOf('art')); // 1\nprint(string.indexOf(RegExp(r'[A-Z][a-z]'))); // 0\n```\nReturns -1 if no match is found:\n```dart\nconst string = 'Dartisans';\nstring.indexOf(RegExp(r'dart')); // -1\n```\nThe [start] must be non-negative and not greater than [length]."},"insertTextFormat":2,"kind":2,"label":"indexOf","labelDetails":{"detail":"(…) → int"},"sortText":"9492","textEditText":"indexOf(${0:pattern})"},{"detail":"(Pattern pattern, [int index = 0]) → bool","documentation":{"kind":"markdown","value":"Whether this string starts with a match of [pattern].\n\n```dart\nconst string = 'Dart is open source';\nprint(string.startsWith('Dar')); // true\nprint(string.startsWith(RegExp(r'[A-Z][a-z]'))); // true\n```\nIf [index] is provided, this method checks if the substring starting\nat that index starts with a match of [pattern]:\n```dart\nconst string = 'Dart';\nprint(string.startsWith('art', 0)); // false\nprint(string.startsWith('art', 1)); // true\nprint(string.startsWith(RegExp(r'\\w{3}'), 2)); // false\n```\n[index] must not be negative or greater than [length].\n\nA [RegExp] containing '^' does not match if the [index] is greater than\nzero and the regexp is not multi-line.\nThe pattern works on the string as a whole, and does not extract\na substring starting at [index] first:\n```dart\nconst string = 'Dart';\nprint(string.startsWith(RegExp(r'^art'), 1)); // false\nprint(string.startsWith(RegExp(r'art'), 1)); // true\n```"},"insertTextFormat":2,"kind":2,"label":"startsWith","labelDetails":{"detail":"(…) → bool"},"sortText":"9492","textEditText":"startsWith(${0:pattern})"},{"detail":"(String other) → bool","documentation":{"kind":"markdown","value":"Whether this string ends with [other].\n\nFor example:\n```dart\nconst string = 'Dart is open source';\nprint(string.endsWith('urce')); // true\n```"},"insertTextFormat":2,"kind":2,"label":"endsWith","labelDetails":{"detail":"(…) → bool"},"sortText":"9492","textEditText":"endsWith(${0:other})"},{"detail":"(String other) → int","documentation":{"kind":"markdown","value":"Compares this string to [other].\n\nReturns a negative value if `this` is ordered before `other`,\na positive value if `this` is ordered after `other`,\nor zero if `this` and `other` are equivalent.\n\nThe ordering is the same as the ordering of the code units at the first\nposition where the two strings differ.\nIf one string is a prefix of the other,\nthen the shorter string is ordered before the longer string.\nIf the strings have exactly the same content, they are equivalent with\nregard to the ordering.\nOrdering does not check for Unicode equivalence.\nThe comparison is case sensitive.\n```dart\nvar relation = 'Dart'.compareTo('Go');\nprint(relation); // < 0\nrelation = 'Go'.compareTo('Forward');\nprint(relation); // > 0\nrelation = 'Forward'.compareTo('Forward');\nprint(relation); // 0\n```"},"insertTextFormat":2,"kind":2,"label":"compareTo","labelDetails":{"detail":"(…) → int"},"sortText":"9492","textEditText":"compareTo(${0:other})"},{"detail":"(String string, [int start = 0]) → Iterable<Match>","documentation":{"kind":"markdown","value":"Matches this pattern against the string repeatedly.\n\nIf [start] is provided, matching will start at that index.\n\nThe returned iterable lazily finds non-overlapping matches\nof the pattern in the [string].\nIf a user only requests the first match,\nthis function should not compute all possible matches.\n\nThe matches are found by repeatedly finding the first match\nof the pattern in the string, initially starting from [start],\nand then from the end of the previous match (but always\nat least one position later than the *start* of the previous\nmatch, in case the pattern matches an empty substring).\n```dart\nRegExp exp = RegExp(r'(\\w+)');\nvar str = 'Dash is a bird';\nIterable<Match> matches = exp.allMatches(str, 8);\nfor (final Match m in matches) {\nString match = m[0]!;\nprint(match);\n}\n```\nThe output of the example is:\n```\na\nbird\n```"},"insertTextFormat":2,"kind":2,"label":"allMatches","labelDetails":{"detail":"(…) → Iterable<Match>"},"sortText":"9492","textEditText":"allMatches(${0:string})"},{"detail":"(String string, [int start = 0]) → Match?","documentation":{"kind":"markdown","value":"Matches this pattern against the start of `string`.\n\nReturns a match if the pattern matches a substring of [string]\nstarting at [start], and `null` if the pattern doesn't match\nat that point.\n\nThe [start] must be non-negative and no greater than `string.length`.\n```dart\nfinal string = 'Dash is a bird';\n\nvar regExp = RegExp(r'bird');\nvar match = regExp.matchAsPrefix(string, 10); // Match found.\n\nregExp = RegExp(r'bird');\nmatch = regExp.matchAsPrefix(string); // null\n```"},"insertTextFormat":2,"kind":2,"label":"matchAsPrefix","labelDetails":{"detail":"(…) → Match?"},"sortText":"9492","textEditText":"matchAsPrefix(${0:string})"},{"detail":"(Pattern pattern) → List<String>","documentation":{"kind":"markdown","value":"Splits the string at matches of [pattern] and returns a list of substrings.\n\nFinds all the matches of `pattern` in this string,\nas by using [Pattern.allMatches],\nand returns the list of the substrings between the matches,\nbefore the first match, and after the last match.\n```dart\nconst string = 'Hello world!';\nfinal splitted = string.split(' ');\nprint(splitted); // [Hello, world!];\n```\nIf the pattern doesn't match this string at all,\nthe result is always a list containing only the original string.\n\nIf the [pattern] is a [String], then it's always the case that:\n```dart\nstring.split(pattern).join(pattern) == string\n```\n\nIf the first match is an empty match at the start of the string,\nthe empty substring before it is not included in the result.\nIf the last match is an empty match at the end of the string,\nthe empty substring after it is not included in the result.\nIf a match is empty, and it immediately follows a previous\nmatch (it starts at the position where the previous match ended),\nthen the empty substring between the two matches is not\nincluded in the result.\n```dart\nconst string = 'abba';\nfinal re = RegExp(r'b*');\n// re.allMatches(string) will find four matches:\n// * empty match before first \"a\".\n// * match of \"bb\"\n// * empty match after \"bb\", before second \"a\"\n// * empty match after second \"a\".\nprint(string.split(re)); // [a, a]\n```\n\nA non-empty match at the start or end of the string, or after another\nmatch, is not treated specially, and will introduce empty substrings\nin the result:\n```dart\nconst string = 'abbaa';\nfinal splitted = string.split('a'); // ['', 'bb', '', '']\n```\n\nIf this string is the empty string, the result is an empty list\nif `pattern` matches the empty string, since the empty string\nbefore and after the first-and-last empty match are not included.\n(It is still a list containing the original empty string `[\"\"]`\nif the pattern doesn't match).\n```dart\nconst string = '';\nprint(string.split('')); // []\nprint(string.split('a')); // []\n```\n\nSplitting with an empty pattern splits the string into single-code unit\nstrings.\n```dart\nconst string = 'Pub';\nprint(string.split('')); // [P, u, b]\n\n// Same as:\nvar codeUnitStrings = [\nfor (final unit in string.codeUnits) String.fromCharCode(unit)\n];\nprint(codeUnitStrings); // [P, u, b]\n```\n\nSplitting happens at UTF-16 code unit boundaries,\nand not at rune (Unicode code point) boundaries:\n```dart\n// String made up of two code units, but one rune.\nconst string = '\\u{1D11E}';\nfinal splitted = string.split('');\nprint(splitted); // ['\\ud834', '\\udd1e'] - 2 unpaired surrogate values\n```\nTo get a list of strings containing the individual runes of a string,\nyou should not use split.\nYou can instead get a string for each rune as follows:\n```dart\nconst string = '\\u{1F642}';\nfor (final rune in string.runes) {\nprint(String.fromCharCode(rune));\n}\n```"},"insertTextFormat":2,"kind":2,"label":"split","labelDetails":{"detail":"(…) → List<String>"},"sortText":"9492","textEditText":"split(${0:pattern})"},{"data":{"file":"C:\\work\\devtools_companion\\lib\\src\\shared\\utils\\utils.dart","importUris":["package:flutter/cupertino.dart"],"ref":"package:characters/src/extensions.dart;StringCharacters;characters"},"detail":"Characters","kind":10,"label":"characters","labelDetails":{"description":"package:flutter/cupertino.dart","detail":" Characters"},"sortText":"9520"},{"data":{"file":"C:\\work\\devtools_companion\\lib\\src\\shared\\utils\\utils.dart","importUris":["package:flutter/material.dart"],"ref":"package:characters/src/extensions.dart;StringCharacters;characters"},"detail":"Characters","kind":10,"label":"characters","labelDetails":{"description":"package:flutter/material.dart","detail":" Characters"},"sortText":"9520"},{"data":{"file":"C:\\work\\devtools_companion\\lib\\src\\shared\\utils\\utils.dart","importUris":["package:flutter/widgets.dart"],"ref":"package:characters/src/extensions.dart;StringCharacters;characters"},"detail":"Characters","kind":10,"label":"characters","labelDetails":{"description":"package:flutter/widgets.dart","detail":" Characters"},"sortText":"9520"},{"data":{"file":"C:\\work\\devtools_companion\\lib\\src\\shared\\utils\\utils.dart","importUris":["package:shadcn_ui/shadcn_ui.dart"],"ref":"package:universal_image/src/flutter_universal_image.dart;$String;base64Bytes"},"detail":"Uint8List","kind":10,"label":"base64Bytes","labelDetails":{"description":"package:shadcn_ui/shadcn_ui.dart","detail":" Uint8List"},"sortText":"9520"},{"data":{"file":"C:\\work\\devtools_companion\\lib\\src\\shared\\utils\\utils.dart","importUris":["dart:js_interop"],"ref":"dart:js_interop;ObjectToJSBoxedDartObject;toJSBox"},"detail":"JSBoxedDartObject","kind":10,"label":"toJSBox","labelDetails":{"description":"dart:js_interop","detail":" JSBoxedDartObject"},"sortText":"9520"},{"data":{"file":"C:\\work\\devtools_companion\\lib\\src\\shared\\utils\\utils.dart","importUris":["dart:js_interop"],"ref":"dart:js_interop;ObjectToExternalDartReference;toExternalReference"},"detail":"ExternalDartReference<T>","kind":10,"label":"toExternalReference","labelDetails":{"description":"dart:js_interop","detail":" ExternalDartReference<T>"},"sortText":"9520"},{"data":{"file":"C:\\work\\devtools_companion\\lib\\src\\shared\\utils\\utils.dart","importUris":["dart:js_interop"],"ref":"dart:js_interop;StringToJSString;toJS"},"detail":"JSString","kind":10,"label":"toJS","labelDetails":{"description":"dart:js_interop","detail":" JSString"},"sortText":"9520"},{"data":{"file":"C:\\work\\devtools_companion\\lib\\src\\shared\\utils\\utils.dart","importUris":["dart:nativewrappers/_internal/vm/lib/ffi_allocation_patch.dart"],"ref":"dart:nativewrappers/_internal/vm/lib/ffi_allocation_patch.dart;AllocatorAlloc;call"},"detail":"([int count = 1]) → InvalidType","insertTextFormat":2,"kind":2,"label":"call","labelDetails":{"description":"dart:nativewrappers/_internal/vm/lib/ffi_allocation_patch.dart","detail":"(…) → InvalidType"},"sortText":"9533","textEditText":"call($0)"},{"data":{"file":"C:\\work\\devtools_companion\\lib\\src\\shared\\utils\\utils.dart","importUris":["dart:js_interop"],"ref":"dart:js_interop;NullableObjectUtilExtension;jsify"},"detail":"() → JSAny?","insertTextFormat":2,"kind":2,"label":"jsify","labelDetails":{"description":"dart:js_interop","detail":"() → JSAny?"},"sortText":"9548","textEditText":"jsify()"},{"detail":"(Invocation invocation) → dynamic","documentation":{"kind":"markdown","value":"Invoked when a nonexistent method or property is accessed.\n\nA dynamic member invocation can attempt to call a member which\ndoesn't exist on the receiving object. Example:\n```dart\ndynamic object = 1;\nobject.add(42); // Statically allowed, run-time error\n```\nThis invalid code will invoke the `noSuchMethod` method\nof the integer `1` with an [Invocation] representing the\n`.add(42)` call and arguments (which then throws).\n\nClasses can override [noSuchMethod] to provide custom behavior\nfor such invalid dynamic invocations.\n\nA class with a non-default [noSuchMethod] invocation can also\nomit implementations for members of its interface.\nExample:\n```dart\nclass MockList<T> implements List<T> {\nnoSuchMethod(Invocation invocation) {\nlog(invocation);\nsuper.noSuchMethod(invocation); // Will throw.\n}\n}\nvoid main() {\nMockList().add(42);\n}\n```\nThis code has no compile-time warnings or errors even though\nthe `MockList` class has no concrete implementation of\nany of the `List` interface methods.\nCalls to `List` methods are forwarded to `noSuchMethod`,\nso this code will `log` an invocation similar to\n`Invocation.method(#add, [42])` and then throw.\n\nIf a value is returned from `noSuchMethod`,\nit becomes the result of the original invocation.\nIf the value is not of a type that can be returned by the original\ninvocation, a type error occurs at the invocation.\n\nThe default behavior is to throw a [NoSuchMethodError]."},"insertTextFormat":2,"kind":2,"label":"noSuchMethod","labelDetails":{"detail":"(…) → dynamic"},"sortText":"9554","textEditText":"noSuchMethod(${0:invocation})"}]}}}
 {"time":1768944392365,"kind":"message","sender":"server","receiver":"ide","message":{"jsonrpc":"2.0","method":"textDocument/publishDiagnostics","params":{"diagnostics":[{"code":"missing_identifier","message":"Expected an identifier.","range":{"end":{"character":40,"line":24},"start":{"character":39,"line":24}},"severity":1,"source":"dart"},{"code":"prefer_final_locals","codeDescription":{"href":"https://dart.dev/diagnostics/prefer_final_locals"},"message":"Local variables should be final.\nTry making the variable final.","range":{"end":{"character":8,"line":8},"start":{"character":2,"line":8}},"severity":3,"source":"dart"},{"code":"prefer_final_locals","codeDescription":{"href":"https://dart.dev/diagnostics/prefer_final_locals"},"message":"Local variables should be final.\nTry making the variable final.","range":{"end":{"character":8,"line":9},"start":{"character":2,"line":9}},"severity":3,"source":"dart"},{"code":"avoid_redundant_argument_values","codeDescription":{"href":"https://dart.dev/lints/avoid_redundant_argument_values"},"message":"The value of the argument is redundant because it matches the default value.\nTry removing the argument.","range":{"end":{"character":54,"line":9},"start":{"character":52,"line":9}},"severity":3,"source":"dart"},{"code":"avoid_redundant_argument_values","codeDescription":{"href":"https://dart.dev/lints/avoid_redundant_argument_values"},"message":"The value of the argument is redundant because it matches the default value.\nTry removing the argument.","range":{"end":{"character":37,"line":24},"start":{"character":35,"line":24}},"severity":3,"source":"dart"}],"uri":"{{package-root:devtools_companion}}lib/src/shared/utils/utils.dart"}}}
@@ -111,28 +111,28 @@
 {"time":1768944392366,"kind":"message","sender":"server","receiver":"ide","message":{"jsonrpc":"2.0","method":"$/progress","params":{"token":"ANALYZING","value":{"kind":"end"}}}}
 {"time":1768944392373,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","id":342,"method":"completionItem/resolve","params":{"label":"codeUnits","labelDetails":{"detail":" List<int>"},"detail":"List<int>","documentation":{"kind":"markdown","value":"An unmodifiable list of the UTF-16 code units of this string."},"insertTextFormat":1,"textEdit":{"newText":"codeUnits","range":{"start":{"line":24,"character":39},"end":{"line":24,"character":39}}},"kind":10,"sortText":"9437","insertTextMode":1},"clientRequestTime":1768944392424}}
 {"time":1768944392373,"kind":"message","sender":"server","receiver":"ide","message":{"id":342,"jsonrpc":"2.0","result":{"detail":"List<int>","documentation":{"kind":"markdown","value":"An unmodifiable list of the UTF-16 code units of this string."},"insertTextFormat":1,"insertTextMode":1,"kind":10,"label":"codeUnits","labelDetails":{"detail":" List<int>"},"sortText":"9437","textEdit":{"newText":"codeUnits","range":{"end":{"character":39,"line":24},"start":{"character":39,"line":24}}}}}}
-{"time":1768944392386,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","id":343,"method":"textDocument/inlayHint","params":{"textDocument":{"uri":"file://{{workspaceFolder-0}}/lib/src/shared/utils/utils.dart"},"range":{"start":{"line":0,"character":0},"end":{"line":29,"character":1}}},"clientRequestTime":1768944392439}}
+{"time":1768944392386,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","id":343,"method":"textDocument/inlayHint","params":{"textDocument":{"uri":"{{workspaceFolder-0}}/lib/src/shared/utils/utils.dart"},"range":{"start":{"line":0,"character":0},"end":{"line":29,"character":1}}},"clientRequestTime":1768944392439}}
 {"time":1768944392387,"kind":"message","sender":"server","receiver":"ide","message":{"id":343,"jsonrpc":"2.0","result":[{"kind":2,"label":[{"location":{"range":{"end":{"character":28,"line":363},"start":{"character":23,"line":363}},"uri":"{{package-root:sky_engine}}lib/core/string.dart"},"value":"start:"}],"paddingRight":true,"position":{"character":42,"line":4}},{"kind":2,"label":[{"location":{"range":{"end":{"character":32,"line":546},"start":{"character":28,"line":546}},"uri":"{{package-root:sky_engine}}lib/core/string.dart"},"value":"from:"}],"paddingRight":true,"position":{"character":32,"line":8}},{"kind":2,"label":[{"location":{"range":{"end":{"character":48,"line":546},"start":{"character":41,"line":546}},"uri":"{{package-root:sky_engine}}lib/core/string.dart"},"value":"replace:"}],"paddingRight":true,"position":{"character":51,"line":8}},{"kind":2,"label":[{"location":{"range":{"end":{"character":17,"line":274},"start":{"character":11,"line":274}},"uri":"{{package-root:sky_engine}}lib/core/regexp.dart"},"value":"source:"}],"paddingRight":true,"position":{"character":39,"line":8}},{"kind":2,"label":[{"location":{"range":{"end":{"character":36,"line":676},"start":{"character":29,"line":676}},"uri":"{{package-root:sky_engine}}lib/core/string.dart"},"value":"pattern:"}],"paddingRight":true,"position":{"character":34,"line":9}},{"kind":2,"label":[{"location":{"range":{"end":{"character":31,"line":463},"start":{"character":22,"line":463}},"uri":"{{package-root:sky_engine}}lib/core/iterable.dart"},"value":"separator:"}],"paddingRight":true,"position":{"character":52,"line":9}},{"kind":2,"label":[{"location":{"range":{"end":{"character":29,"line":187},"start":{"character":22,"line":187}},"uri":"{{package-root:sky_engine}}lib/core/errors.dart"},"value":"message:"}],"paddingRight":true,"position":{"character":33,"line":14}},{"kind":2,"label":[{"location":{"range":{"end":{"character":19,"line":13},"start":{"character":18,"line":13}},"uri":"{{package-root:devtools_companion}}lib/src/shared/utils/utils.dart"},"value":"n:"}],"paddingRight":true,"position":{"character":23,"line":16}},{"kind":2,"label":[{"value":"toElements:"}],"paddingRight":true,"position":{"character":22,"line":20}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":17,"line":19},"start":{"character":16,"line":19}},"uri":"{{package-root:devtools_companion}}lib/src/shared/utils/utils.dart"},"value":"T"},{"value":">"}],"paddingRight":true,"position":{"character":23,"line":20}},{"kind":1,"label":[{"value":"<"},{"location":{"range":{"end":{"character":17,"line":19},"start":{"character":16,"line":19}},"uri":"{{package-root:devtools_companion}}lib/src/shared/utils/utils.dart"},"value":"T"},{"value":">"}],"position":{"character":21,"line":20}},{"kind":2,"label":[{"location":{"range":{"end":{"character":36,"line":676},"start":{"character":29,"line":676}},"uri":"{{package-root:sky_engine}}lib/core/string.dart"},"value":"pattern:"}],"paddingRight":true,"position":{"character":17,"line":24}},{"kind":2,"label":[{"location":{"range":{"end":{"character":31,"line":463},"start":{"character":22,"line":463}},"uri":"{{package-root:sky_engine}}lib/core/iterable.dart"},"value":"separator:"}],"paddingRight":true,"position":{"character":35,"line":24}}]}}
-{"time":1768944392569,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","id":344,"method":"textDocument/foldingRange","params":{"textDocument":{"uri":"file://{{workspaceFolder-0}}/lib/src/shared/utils/utils.dart"}},"clientRequestTime":1768944392622}}
+{"time":1768944392569,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","id":344,"method":"textDocument/foldingRange","params":{"textDocument":{"uri":"{{workspaceFolder-0}}/lib/src/shared/utils/utils.dart"}},"clientRequestTime":1768944392622}}
 {"time":1768944392569,"kind":"message","sender":"server","receiver":"ide","message":{"id":344,"jsonrpc":"2.0","result":[{"endLine":5,"startLine":2},{"endLine":11,"startLine":7},{"endLine":17,"startLine":13},{"endLine":21,"startLine":19},{"endLine":25,"startLine":23},{"endLine":29,"startLine":27}]}}
-{"time":1768944392632,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","id":345,"method":"textDocument/codeAction","params":{"textDocument":{"uri":"file://{{workspaceFolder-0}}/lib/src/shared/utils/utils.dart"},"range":{"start":{"line":24,"character":39},"end":{"line":24,"character":39}},"context":{"diagnostics":[{"range":{"start":{"line":24,"character":39},"end":{"line":24,"character":40}},"message":"Expected an identifier.","code":"missing_identifier","severity":1,"source":"dart"}],"triggerKind":2}},"clientRequestTime":1768944392685}}
-{"time":1768944392632,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","id":346,"method":"textDocument/codeLens","params":{"textDocument":{"uri":"file://{{workspaceFolder-0}}/lib/src/shared/utils/utils.dart"}},"clientRequestTime":1768944392685}}
+{"time":1768944392632,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","id":345,"method":"textDocument/codeAction","params":{"textDocument":{"uri":"{{workspaceFolder-0}}/lib/src/shared/utils/utils.dart"},"range":{"start":{"line":24,"character":39},"end":{"line":24,"character":39}},"context":{"diagnostics":[{"range":{"start":{"line":24,"character":39},"end":{"line":24,"character":40}},"message":"Expected an identifier.","code":"missing_identifier","severity":1,"source":"dart"}],"triggerKind":2}},"clientRequestTime":1768944392685}}
+{"time":1768944392632,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","id":346,"method":"textDocument/codeLens","params":{"textDocument":{"uri":"{{workspaceFolder-0}}/lib/src/shared/utils/utils.dart"}},"clientRequestTime":1768944392685}}
 {"time":1768944392632,"kind":"message","sender":"server","receiver":"ide","message":{"id":101,"jsonrpc":"2.0","method":"window/workDoneProgress/create","params":{"token":"ANALYZING"}}}
 {"time":1768944392632,"kind":"message","sender":"server","receiver":"ide","message":{"id":346,"jsonrpc":"2.0","result":[]}}
 {"time":1768944392634,"kind":"message","sender":"server","receiver":"ide","message":{"id":345,"jsonrpc":"2.0","result":[{"command":{"arguments":[{"path":"C:\\work\\devtools_companion\\lib\\src\\shared\\utils\\utils.dart","autoTriggered":true}],"command":"dart.edit.sortMembers","title":"Sort Members"},"kind":"source.sortMembers","title":"Sort Members"},{"command":{"arguments":[{"path":"C:\\work\\devtools_companion\\lib\\src\\shared\\utils\\utils.dart","autoTriggered":true}],"command":"dart.edit.organizeImports","title":"Organize Imports"},"kind":"source.organizeImports","title":"Organize Imports"},{"command":{"arguments":[{"path":"C:\\work\\devtools_companion\\lib\\src\\shared\\utils\\utils.dart","autoTriggered":true}],"command":"dart.edit.fixAll","title":"Fix All"},"kind":"source.fixAll","title":"Fix All"},{"command":{"arguments":[{"action":"dart.fix.remove.argument"}],"command":"dart.logAction","title":"Log Action"},"diagnostics":[{"code":"avoid_redundant_argument_values","codeDescription":{"href":"https://dart.dev/lints/avoid_redundant_argument_values"},"message":"The value of the argument is redundant because it matches the default value.\nTry removing the argument.","range":{"end":{"character":37,"line":24},"start":{"character":35,"line":24}},"severity":3,"source":"dart"}],"edit":{"documentChanges":[{"edits":[{"newText":"","range":{"end":{"character":37,"line":24},"start":{"character":35,"line":24}}}],"textDocument":{"uri":"{{package-root:devtools_companion}}lib/src/shared/utils/utils.dart","version":37}}]},"kind":"quickfix.remove.argument","title":"Remove argument"},{"command":{"arguments":[{"action":"dart.fix.remove.argument.multi"}],"command":"dart.logAction","title":"Log Action"},"diagnostics":[{"code":"avoid_redundant_argument_values","codeDescription":{"href":"https://dart.dev/lints/avoid_redundant_argument_values"},"message":"The value of the argument is redundant because it matches the default value.\nTry removing the argument.","range":{"end":{"character":37,"line":24},"start":{"character":35,"line":24}},"severity":3,"source":"dart"}],"edit":{"documentChanges":[{"edits":[{"newText":"","range":{"end":{"character":54,"line":9},"start":{"character":52,"line":9}}},{"newText":"","range":{"end":{"character":37,"line":24},"start":{"character":35,"line":24}}}],"textDocument":{"uri":"{{package-root:devtools_companion}}lib/src/shared/utils/utils.dart","version":37}}]},"kind":"quickfix.remove.argument.multi","title":"Remove arguments in file"},{"command":{"arguments":[{"action":"dart.fix.ignore.line"}],"command":"dart.logAction","title":"Log Action"},"diagnostics":[{"code":"avoid_redundant_argument_values","codeDescription":{"href":"https://dart.dev/lints/avoid_redundant_argument_values"},"message":"The value of the argument is redundant because it matches the default value.\nTry removing the argument.","range":{"end":{"character":37,"line":24},"start":{"character":35,"line":24}},"severity":3,"source":"dart"}],"edit":{"documentChanges":[{"edits":[{"newText":"  // ignore: avoid_redundant_argument_values\r\n","range":{"end":{"character":0,"line":24},"start":{"character":0,"line":24}}}],"textDocument":{"uri":"{{package-root:devtools_companion}}lib/src/shared/utils/utils.dart","version":37}}]},"kind":"quickfix.ignore.line","title":"Ignore 'avoid_redundant_argument_values' for this line"},{"command":{"arguments":[{"action":"dart.fix.ignore.file"}],"command":"dart.logAction","title":"Log Action"},"diagnostics":[{"code":"avoid_redundant_argument_values","codeDescription":{"href":"https://dart.dev/lints/avoid_redundant_argument_values"},"message":"The value of the argument is redundant because it matches the default value.\nTry removing the argument.","range":{"end":{"character":37,"line":24},"start":{"character":35,"line":24}},"severity":3,"source":"dart"}],"edit":{"documentChanges":[{"edits":[{"newText":"\r\n// ignore_for_file: avoid_redundant_argument_values\r\n","range":{"end":{"character":0,"line":1},"start":{"character":0,"line":1}}}],"textDocument":{"uri":"{{package-root:devtools_companion}}lib/src/shared/utils/utils.dart","version":37}}]},"kind":"quickfix.ignore.file","title":"Ignore 'avoid_redundant_argument_values' for the whole file"},{"command":{"arguments":[{"action":"dart.fix.ignore.analysis"}],"command":"dart.logAction","title":"Log Action"},"diagnostics":[{"code":"avoid_redundant_argument_values","codeDescription":{"href":"https://dart.dev/lints/avoid_redundant_argument_values"},"message":"The value of the argument is redundant because it matches the default value.\nTry removing the argument.","range":{"end":{"character":37,"line":24},"start":{"character":35,"line":24}},"severity":3,"source":"dart"}],"edit":{"documentChanges":[{"edits":[{"newText":"analyzer:\r\n  errors:\r\n    avoid_redundant_argument_values: ignore\r\n","range":{"end":{"character":0,"line":0},"start":{"character":0,"line":0}}}],"textDocument":{"uri":"{{package-root:devtools_companion}}analysis_options.yaml","version":null}}]},"kind":"quickfix.ignore.analysis","title":"Ignore 'avoid_redundant_argument_values' in `analysis_options.yaml`"},{"command":{"arguments":["EXTRACT_METHOD","C:\\work\\devtools_companion\\lib\\src\\shared\\utils\\utils.dart",37,683,0,null],"command":"refactor.perform","title":"Extract Method"},"kind":"refactor.extract","title":"Extract Method"},{"command":{"arguments":["EXTRACT_LOCAL_VARIABLE","C:\\work\\devtools_companion\\lib\\src\\shared\\utils\\utils.dart",37,683,0,null],"command":"refactor.perform","title":"Extract Local Variable"},"kind":"refactor.extract","title":"Extract Local Variable"}]}}
 {"time":1768944392634,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","id":101,"result":null,"clientRequestTime":1768944392686}}
 {"time":1768944392634,"kind":"message","sender":"server","receiver":"ide","message":{"jsonrpc":"2.0","method":"$/progress","params":{"token":"ANALYZING","value":{"kind":"begin","title":"Analyzing…"}}}}
 {"time":1768944392634,"kind":"message","sender":"server","receiver":"ide","message":{"jsonrpc":"2.0","method":"$/progress","params":{"token":"ANALYZING","value":{"kind":"end"}}}}
-{"time":1768944392660,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","id":347,"method":"textDocument/semanticTokens/full","params":{"textDocument":{"uri":"file://{{workspaceFolder-0}}/lib/src/shared/utils/utils.dart"}},"clientRequestTime":1768944392714}}
+{"time":1768944392660,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","id":347,"method":"textDocument/semanticTokens/full","params":{"textDocument":{"uri":"{{workspaceFolder-0}}/lib/src/shared/utils/utils.dart"}},"clientRequestTime":1768944392714}}
 {"time":1768944392661,"kind":"message","sender":"server","receiver":"ide","message":{"id":347,"jsonrpc":"2.0","result":{"data":[0,0,34,3,0,2,0,6,2,0,0,7,10,17,36,0,11,6,2,0,0,7,1,6,4,1,2,2,1,256,0,4,1,6,0,0,2,7,11,16,0,9,6,1,256,0,7,1,6,0,1,2,6,1,256,0,7,1,6,0,0,2,1,15,0,0,3,11,4,16,0,16,1,6,0,0,2,9,4,16,0,10,1,15,0,3,0,4,2,0,0,5,12,17,36,0,13,6,2,0,0,7,1,6,4,1,2,6,2,0,0,7,7,5,4,0,10,1,6,0,0,2,10,4,16,0,11,6,2,2,0,7,9,16,0,0,12,2,16,0,0,4,11,4,16,1,2,6,2,0,0,7,8,5,4,0,11,7,5,0,0,8,5,4,16,0,6,2,16,0,0,4,8,11,16,0,9,4,4,16,0,5,2,16,0,1,2,6,1,256,0,7,7,5,0,0,11,8,5,0,3,0,3,2,0,0,4,9,17,36,0,10,3,2,0,0,4,1,6,4,1,2,2,1,256,0,4,1,6,0,0,4,1,15,0,0,3,5,1,256,0,6,13,2,2,0,14,35,16,0,1,2,2,1,256,0,4,1,6,0,0,5,1,15,0,0,5,1,6,0,0,5,1,15,0,0,3,6,1,256,0,7,1,15,0,1,2,6,1,256,0,7,1,6,0,0,4,9,17,0,0,10,1,6,0,0,4,1,15,0,3,0,4,2,0,0,5,1,18,0,0,3,7,17,36,0,8,1,18,0,0,3,4,2,0,0,5,4,2,0,0,5,1,18,0,0,4,5,6,4,1,2,6,1,256,0,7,5,6,0,0,6,6,4,16,0,8,4,6,4,0,9,4,6,0,0,6,6,4,16,3,0,6,2,0,0,7,13,17,36,0,14,6,2,0,0,7,1,6,4,1,2,6,1,256,0,7,1,6,0,0,2,5,4,16,0,6,2,16,0,0,4,8,11,16,0,9,4,4,16,0,5,2,16,0,3,0,6,2,0,0,7,16,17,36,0,17,6,2,0,0,7,7,6,4,1,2,6,1,256,0,7,7,6,0,0,11,18,15,0,0,21,5,15,0]}}}
-{"time":1768944392707,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","id":348,"method":"textDocument/documentSymbol","params":{"textDocument":{"uri":"file://{{workspaceFolder-0}}/lib/src/shared/utils/utils.dart"}},"clientRequestTime":1768944392761}}
+{"time":1768944392707,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","id":348,"method":"textDocument/documentSymbol","params":{"textDocument":{"uri":"{{workspaceFolder-0}}/lib/src/shared/utils/utils.dart"}},"clientRequestTime":1768944392761}}
 {"time":1768944392708,"kind":"message","sender":"server","receiver":"ide","message":{"id":348,"jsonrpc":"2.0","result":[{"deprecated":false,"detail":"(String s)","kind":12,"name":"capitalize","range":{"end":{"character":1,"line":5},"start":{"character":0,"line":2}},"selectionRange":{"end":{"character":17,"line":2},"start":{"character":7,"line":2}}},{"deprecated":false,"detail":"(String s)","kind":12,"name":"isPalindrome","range":{"end":{"character":1,"line":11},"start":{"character":0,"line":7}},"selectionRange":{"end":{"character":17,"line":7},"start":{"character":5,"line":7}}},{"deprecated":false,"detail":"(int n)","kind":12,"name":"factorial","range":{"end":{"character":1,"line":17},"start":{"character":0,"line":13}},"selectionRange":{"end":{"character":13,"line":13},"start":{"character":4,"line":13}}},{"deprecated":false,"detail":"(List<List<T>> lists)","kind":12,"name":"flatten","range":{"end":{"character":1,"line":21},"start":{"character":0,"line":19}},"selectionRange":{"end":{"character":15,"line":19},"start":{"character":8,"line":19}}},{"deprecated":false,"detail":"(String s)","kind":12,"name":"reverseString","range":{"end":{"character":1,"line":25},"start":{"character":0,"line":23}},"selectionRange":{"end":{"character":20,"line":23},"start":{"character":7,"line":23}}},{"deprecated":false,"detail":"(double degrees)","kind":12,"name":"degreesToRadians","range":{"end":{"character":1,"line":29},"start":{"character":0,"line":27}},"selectionRange":{"end":{"character":23,"line":27},"start":{"character":7,"line":27}}}]}}
-{"time":1768944392716,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","id":349,"method":"textDocument/documentSymbol","params":{"textDocument":{"uri":"file://{{workspaceFolder-0}}/lib/src/shared/utils/utils.dart"}},"clientRequestTime":1768944392770}}
+{"time":1768944392716,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","id":349,"method":"textDocument/documentSymbol","params":{"textDocument":{"uri":"{{workspaceFolder-0}}/lib/src/shared/utils/utils.dart"}},"clientRequestTime":1768944392770}}
 {"time":1768944392716,"kind":"message","sender":"server","receiver":"ide","message":{"id":349,"jsonrpc":"2.0","result":[{"deprecated":false,"detail":"(String s)","kind":12,"name":"capitalize","range":{"end":{"character":1,"line":5},"start":{"character":0,"line":2}},"selectionRange":{"end":{"character":17,"line":2},"start":{"character":7,"line":2}}},{"deprecated":false,"detail":"(String s)","kind":12,"name":"isPalindrome","range":{"end":{"character":1,"line":11},"start":{"character":0,"line":7}},"selectionRange":{"end":{"character":17,"line":7},"start":{"character":5,"line":7}}},{"deprecated":false,"detail":"(int n)","kind":12,"name":"factorial","range":{"end":{"character":1,"line":17},"start":{"character":0,"line":13}},"selectionRange":{"end":{"character":13,"line":13},"start":{"character":4,"line":13}}},{"deprecated":false,"detail":"(List<List<T>> lists)","kind":12,"name":"flatten","range":{"end":{"character":1,"line":21},"start":{"character":0,"line":19}},"selectionRange":{"end":{"character":15,"line":19},"start":{"character":8,"line":19}}},{"deprecated":false,"detail":"(String s)","kind":12,"name":"reverseString","range":{"end":{"character":1,"line":25},"start":{"character":0,"line":23}},"selectionRange":{"end":{"character":20,"line":23},"start":{"character":7,"line":23}}},{"deprecated":false,"detail":"(double degrees)","kind":12,"name":"degreesToRadians","range":{"end":{"character":1,"line":29},"start":{"character":0,"line":27}},"selectionRange":{"end":{"character":23,"line":27},"start":{"character":7,"line":27}}}]}}
-{"time":1768944393156,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","id":350,"method":"textDocument/inlayHint","params":{"textDocument":{"uri":"file://{{workspaceFolder-0}}/lib/src/shared/utils/utils.dart"},"range":{"start":{"line":0,"character":0},"end":{"line":29,"character":1}}},"clientRequestTime":1768944393209}}
+{"time":1768944393156,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","id":350,"method":"textDocument/inlayHint","params":{"textDocument":{"uri":"{{workspaceFolder-0}}/lib/src/shared/utils/utils.dart"},"range":{"start":{"line":0,"character":0},"end":{"line":29,"character":1}}},"clientRequestTime":1768944393209}}
 {"time":1768944393157,"kind":"message","sender":"server","receiver":"ide","message":{"id":350,"jsonrpc":"2.0","result":[{"kind":2,"label":[{"location":{"range":{"end":{"character":28,"line":363},"start":{"character":23,"line":363}},"uri":"{{package-root:sky_engine}}lib/core/string.dart"},"value":"start:"}],"paddingRight":true,"position":{"character":42,"line":4}},{"kind":2,"label":[{"location":{"range":{"end":{"character":32,"line":546},"start":{"character":28,"line":546}},"uri":"{{package-root:sky_engine}}lib/core/string.dart"},"value":"from:"}],"paddingRight":true,"position":{"character":32,"line":8}},{"kind":2,"label":[{"location":{"range":{"end":{"character":48,"line":546},"start":{"character":41,"line":546}},"uri":"{{package-root:sky_engine}}lib/core/string.dart"},"value":"replace:"}],"paddingRight":true,"position":{"character":51,"line":8}},{"kind":2,"label":[{"location":{"range":{"end":{"character":17,"line":274},"start":{"character":11,"line":274}},"uri":"{{package-root:sky_engine}}lib/core/regexp.dart"},"value":"source:"}],"paddingRight":true,"position":{"character":39,"line":8}},{"kind":2,"label":[{"location":{"range":{"end":{"character":36,"line":676},"start":{"character":29,"line":676}},"uri":"{{package-root:sky_engine}}lib/core/string.dart"},"value":"pattern:"}],"paddingRight":true,"position":{"character":34,"line":9}},{"kind":2,"label":[{"location":{"range":{"end":{"character":31,"line":463},"start":{"character":22,"line":463}},"uri":"{{package-root:sky_engine}}lib/core/iterable.dart"},"value":"separator:"}],"paddingRight":true,"position":{"character":52,"line":9}},{"kind":2,"label":[{"location":{"range":{"end":{"character":29,"line":187},"start":{"character":22,"line":187}},"uri":"{{package-root:sky_engine}}lib/core/errors.dart"},"value":"message:"}],"paddingRight":true,"position":{"character":33,"line":14}},{"kind":2,"label":[{"location":{"range":{"end":{"character":19,"line":13},"start":{"character":18,"line":13}},"uri":"{{package-root:devtools_companion}}lib/src/shared/utils/utils.dart"},"value":"n:"}],"paddingRight":true,"position":{"character":23,"line":16}},{"kind":2,"label":[{"value":"toElements:"}],"paddingRight":true,"position":{"character":22,"line":20}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":17,"line":19},"start":{"character":16,"line":19}},"uri":"{{package-root:devtools_companion}}lib/src/shared/utils/utils.dart"},"value":"T"},{"value":">"}],"paddingRight":true,"position":{"character":23,"line":20}},{"kind":1,"label":[{"value":"<"},{"location":{"range":{"end":{"character":17,"line":19},"start":{"character":16,"line":19}},"uri":"{{package-root:devtools_companion}}lib/src/shared/utils/utils.dart"},"value":"T"},{"value":">"}],"position":{"character":21,"line":20}},{"kind":2,"label":[{"location":{"range":{"end":{"character":36,"line":676},"start":{"character":29,"line":676}},"uri":"{{package-root:sky_engine}}lib/core/string.dart"},"value":"pattern:"}],"paddingRight":true,"position":{"character":17,"line":24}},{"kind":2,"label":[{"location":{"range":{"end":{"character":31,"line":463},"start":{"character":22,"line":463}},"uri":"{{package-root:sky_engine}}lib/core/iterable.dart"},"value":"separator:"}],"paddingRight":true,"position":{"character":35,"line":24}}]}}
-{"time":1768944393357,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","id":351,"method":"textDocument/documentLink","params":{"textDocument":{"uri":"file://{{workspaceFolder-0}}/lib/src/shared/utils/utils.dart"}},"clientRequestTime":1768944393410}}
-{"time":1768944393357,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","id":352,"method":"textDocument/documentColor","params":{"textDocument":{"uri":"file://{{workspaceFolder-0}}/lib/src/shared/utils/utils.dart"}},"clientRequestTime":1768944393410}}
+{"time":1768944393357,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","id":351,"method":"textDocument/documentLink","params":{"textDocument":{"uri":"{{workspaceFolder-0}}/lib/src/shared/utils/utils.dart"}},"clientRequestTime":1768944393410}}
+{"time":1768944393357,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","id":352,"method":"textDocument/documentColor","params":{"textDocument":{"uri":"{{workspaceFolder-0}}/lib/src/shared/utils/utils.dart"}},"clientRequestTime":1768944393410}}
 {"time":1768944393358,"kind":"message","sender":"server","receiver":"ide","message":{"id":352,"jsonrpc":"2.0","result":[]}}
 {"time":1768944393358,"kind":"message","sender":"server","receiver":"ide","message":{"id":351,"jsonrpc":"2.0","result":[]}}
 {"time":1768944393370,"kind":"message","sender":"watcher","receiver":"server","message":{"path":"C:\\work\\devtools_companion\\lib\\src\\shared\\utils\\utils.dart","type":"modify"}}
@@ -142,7 +142,7 @@
 {"time":1768944393371,"kind":"message","sender":"server","receiver":"ide","message":{"jsonrpc":"2.0","method":"$/progress","params":{"token":"ANALYZING","value":{"kind":"end"}}}}
 {"time":1768944393897,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","id":353,"method":"completionItem/resolve","params":{"label":"hashCode","labelDetails":{"detail":" int"},"detail":"int","documentation":{"kind":"markdown","value":"A hash code derived from the code units of the string.\n\nThis is compatible with [operator ==]. Strings with the same sequence\nof code units have the same hash code."},"insertTextFormat":1,"textEdit":{"newText":"hashCode","range":{"start":{"line":24,"character":39},"end":{"line":24,"character":39}}},"kind":10,"sortText":"9437","insertTextMode":1},"clientRequestTime":1768944393950}}
 {"time":1768944393897,"kind":"message","sender":"server","receiver":"ide","message":{"id":353,"jsonrpc":"2.0","result":{"detail":"int","documentation":{"kind":"markdown","value":"A hash code derived from the code units of the string.\n\nThis is compatible with [operator ==]. Strings with the same sequence\nof code units have the same hash code."},"insertTextFormat":1,"insertTextMode":1,"kind":10,"label":"hashCode","labelDetails":{"detail":" int"},"sortText":"9437","textEdit":{"newText":"hashCode","range":{"end":{"character":39,"line":24},"start":{"character":39,"line":24}}}}}}
-{"time":1768944394170,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","method":"textDocument/didChange","params":{"textDocument":{"uri":"file://{{workspaceFolder-0}}/lib/src/shared/utils/utils.dart","version":38},"contentChanges":[{"range":{"start":{"line":24,"character":39},"end":{"line":24,"character":39}},"rangeLength":0,"text":"hashCode"}]},"clientRequestTime":1768944394223}}
+{"time":1768944394170,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","method":"textDocument/didChange","params":{"textDocument":{"uri":"{{workspaceFolder-0}}/lib/src/shared/utils/utils.dart","version":38},"contentChanges":[{"range":{"start":{"line":24,"character":39},"end":{"line":24,"character":39}},"rangeLength":0,"text":"hashCode"}]},"clientRequestTime":1768944394223}}
 {"time":1768944394170,"kind":"message","sender":"server","receiver":"ide","message":{"id":103,"jsonrpc":"2.0","method":"window/workDoneProgress/create","params":{"token":"ANALYZING"}}}
 {"time":1768944394177,"kind":"message","sender":"server","receiver":"ide","message":{"jsonrpc":"2.0","method":"textDocument/publishDiagnostics","params":{"diagnostics":[{"code":"return_of_invalid_type","codeDescription":{"href":"https://dart.dev/diagnostics/return_of_invalid_type"},"message":"A value of type 'int' can't be returned from the function 'reverseString' because it has a return type of 'String'.","range":{"end":{"character":47,"line":24},"start":{"character":9,"line":24}},"severity":1,"source":"dart"},{"code":"prefer_final_locals","codeDescription":{"href":"https://dart.dev/diagnostics/prefer_final_locals"},"message":"Local variables should be final.\nTry making the variable final.","range":{"end":{"character":8,"line":8},"start":{"character":2,"line":8}},"severity":3,"source":"dart"},{"code":"prefer_final_locals","codeDescription":{"href":"https://dart.dev/diagnostics/prefer_final_locals"},"message":"Local variables should be final.\nTry making the variable final.","range":{"end":{"character":8,"line":9},"start":{"character":2,"line":9}},"severity":3,"source":"dart"},{"code":"avoid_redundant_argument_values","codeDescription":{"href":"https://dart.dev/lints/avoid_redundant_argument_values"},"message":"The value of the argument is redundant because it matches the default value.\nTry removing the argument.","range":{"end":{"character":54,"line":9},"start":{"character":52,"line":9}},"severity":3,"source":"dart"},{"code":"avoid_redundant_argument_values","codeDescription":{"href":"https://dart.dev/lints/avoid_redundant_argument_values"},"message":"The value of the argument is redundant because it matches the default value.\nTry removing the argument.","range":{"end":{"character":37,"line":24},"start":{"character":35,"line":24}},"severity":3,"source":"dart"}],"uri":"{{package-root:devtools_companion}}lib/src/shared/utils/utils.dart"}}}
 {"time":1768944394177,"kind":"message","sender":"server","receiver":"ide","message":{"jsonrpc":"2.0","method":"dart/textDocument/publishClosingLabels","params":{"labels":[],"uri":"{{package-root:devtools_companion}}lib/src/shared/utils/utils.dart"}}}
@@ -151,28 +151,28 @@
 {"time":1768944394189,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","id":103,"result":null,"clientRequestTime":1768944394243}}
 {"time":1768944394189,"kind":"message","sender":"server","receiver":"ide","message":{"jsonrpc":"2.0","method":"$/progress","params":{"token":"ANALYZING","value":{"kind":"begin","title":"Analyzing…"}}}}
 {"time":1768944394189,"kind":"message","sender":"server","receiver":"ide","message":{"jsonrpc":"2.0","method":"$/progress","params":{"token":"ANALYZING","value":{"kind":"end"}}}}
-{"time":1768944394191,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","id":354,"method":"textDocument/inlayHint","params":{"textDocument":{"uri":"file://{{workspaceFolder-0}}/lib/src/shared/utils/utils.dart"},"range":{"start":{"line":0,"character":0},"end":{"line":29,"character":1}}},"clientRequestTime":1768944394245}}
+{"time":1768944394191,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","id":354,"method":"textDocument/inlayHint","params":{"textDocument":{"uri":"{{workspaceFolder-0}}/lib/src/shared/utils/utils.dart"},"range":{"start":{"line":0,"character":0},"end":{"line":29,"character":1}}},"clientRequestTime":1768944394245}}
 {"time":1768944394192,"kind":"message","sender":"server","receiver":"ide","message":{"id":354,"jsonrpc":"2.0","result":[{"kind":2,"label":[{"location":{"range":{"end":{"character":28,"line":363},"start":{"character":23,"line":363}},"uri":"{{package-root:sky_engine}}lib/core/string.dart"},"value":"start:"}],"paddingRight":true,"position":{"character":42,"line":4}},{"kind":2,"label":[{"location":{"range":{"end":{"character":32,"line":546},"start":{"character":28,"line":546}},"uri":"{{package-root:sky_engine}}lib/core/string.dart"},"value":"from:"}],"paddingRight":true,"position":{"character":32,"line":8}},{"kind":2,"label":[{"location":{"range":{"end":{"character":48,"line":546},"start":{"character":41,"line":546}},"uri":"{{package-root:sky_engine}}lib/core/string.dart"},"value":"replace:"}],"paddingRight":true,"position":{"character":51,"line":8}},{"kind":2,"label":[{"location":{"range":{"end":{"character":17,"line":274},"start":{"character":11,"line":274}},"uri":"{{package-root:sky_engine}}lib/core/regexp.dart"},"value":"source:"}],"paddingRight":true,"position":{"character":39,"line":8}},{"kind":2,"label":[{"location":{"range":{"end":{"character":36,"line":676},"start":{"character":29,"line":676}},"uri":"{{package-root:sky_engine}}lib/core/string.dart"},"value":"pattern:"}],"paddingRight":true,"position":{"character":34,"line":9}},{"kind":2,"label":[{"location":{"range":{"end":{"character":31,"line":463},"start":{"character":22,"line":463}},"uri":"{{package-root:sky_engine}}lib/core/iterable.dart"},"value":"separator:"}],"paddingRight":true,"position":{"character":52,"line":9}},{"kind":2,"label":[{"location":{"range":{"end":{"character":29,"line":187},"start":{"character":22,"line":187}},"uri":"{{package-root:sky_engine}}lib/core/errors.dart"},"value":"message:"}],"paddingRight":true,"position":{"character":33,"line":14}},{"kind":2,"label":[{"location":{"range":{"end":{"character":19,"line":13},"start":{"character":18,"line":13}},"uri":"{{package-root:devtools_companion}}lib/src/shared/utils/utils.dart"},"value":"n:"}],"paddingRight":true,"position":{"character":23,"line":16}},{"kind":2,"label":[{"value":"toElements:"}],"paddingRight":true,"position":{"character":22,"line":20}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":17,"line":19},"start":{"character":16,"line":19}},"uri":"{{package-root:devtools_companion}}lib/src/shared/utils/utils.dart"},"value":"T"},{"value":">"}],"paddingRight":true,"position":{"character":23,"line":20}},{"kind":1,"label":[{"value":"<"},{"location":{"range":{"end":{"character":17,"line":19},"start":{"character":16,"line":19}},"uri":"{{package-root:devtools_companion}}lib/src/shared/utils/utils.dart"},"value":"T"},{"value":">"}],"position":{"character":21,"line":20}},{"kind":2,"label":[{"location":{"range":{"end":{"character":36,"line":676},"start":{"character":29,"line":676}},"uri":"{{package-root:sky_engine}}lib/core/string.dart"},"value":"pattern:"}],"paddingRight":true,"position":{"character":17,"line":24}},{"kind":2,"label":[{"location":{"range":{"end":{"character":31,"line":463},"start":{"character":22,"line":463}},"uri":"{{package-root:sky_engine}}lib/core/iterable.dart"},"value":"separator:"}],"paddingRight":true,"position":{"character":35,"line":24}}]}}
-{"time":1768944394381,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","id":355,"method":"textDocument/foldingRange","params":{"textDocument":{"uri":"file://{{workspaceFolder-0}}/lib/src/shared/utils/utils.dart"}},"clientRequestTime":1768944394434}}
+{"time":1768944394381,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","id":355,"method":"textDocument/foldingRange","params":{"textDocument":{"uri":"{{workspaceFolder-0}}/lib/src/shared/utils/utils.dart"}},"clientRequestTime":1768944394434}}
 {"time":1768944394381,"kind":"message","sender":"server","receiver":"ide","message":{"id":355,"jsonrpc":"2.0","result":[{"endLine":5,"startLine":2},{"endLine":11,"startLine":7},{"endLine":17,"startLine":13},{"endLine":21,"startLine":19},{"endLine":25,"startLine":23},{"endLine":29,"startLine":27}]}}
-{"time":1768944394442,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","id":356,"method":"textDocument/codeAction","params":{"textDocument":{"uri":"file://{{workspaceFolder-0}}/lib/src/shared/utils/utils.dart"},"range":{"start":{"line":24,"character":47},"end":{"line":24,"character":47}},"context":{"diagnostics":[{"range":{"start":{"line":24,"character":9},"end":{"line":24,"character":47}},"message":"A value of type 'int' can't be returned from the function 'reverseString' because it has a return type of 'String'.","code":"return_of_invalid_type","codeDescription":{"href":"https://dart.dev/diagnostics/return_of_invalid_type"},"severity":1,"source":"dart"}],"triggerKind":2}},"clientRequestTime":1768944394496}}
-{"time":1768944394442,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","id":357,"method":"textDocument/codeLens","params":{"textDocument":{"uri":"file://{{workspaceFolder-0}}/lib/src/shared/utils/utils.dart"}},"clientRequestTime":1768944394496}}
+{"time":1768944394442,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","id":356,"method":"textDocument/codeAction","params":{"textDocument":{"uri":"{{workspaceFolder-0}}/lib/src/shared/utils/utils.dart"},"range":{"start":{"line":24,"character":47},"end":{"line":24,"character":47}},"context":{"diagnostics":[{"range":{"start":{"line":24,"character":9},"end":{"line":24,"character":47}},"message":"A value of type 'int' can't be returned from the function 'reverseString' because it has a return type of 'String'.","code":"return_of_invalid_type","codeDescription":{"href":"https://dart.dev/diagnostics/return_of_invalid_type"},"severity":1,"source":"dart"}],"triggerKind":2}},"clientRequestTime":1768944394496}}
+{"time":1768944394442,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","id":357,"method":"textDocument/codeLens","params":{"textDocument":{"uri":"{{workspaceFolder-0}}/lib/src/shared/utils/utils.dart"}},"clientRequestTime":1768944394496}}
 {"time":1768944394443,"kind":"message","sender":"server","receiver":"ide","message":{"id":104,"jsonrpc":"2.0","method":"window/workDoneProgress/create","params":{"token":"ANALYZING"}}}
 {"time":1768944394443,"kind":"message","sender":"server","receiver":"ide","message":{"id":357,"jsonrpc":"2.0","result":[]}}
 {"time":1768944394445,"kind":"message","sender":"server","receiver":"ide","message":{"id":356,"jsonrpc":"2.0","result":[{"command":{"arguments":[{"path":"C:\\work\\devtools_companion\\lib\\src\\shared\\utils\\utils.dart","autoTriggered":true}],"command":"dart.edit.sortMembers","title":"Sort Members"},"kind":"source.sortMembers","title":"Sort Members"},{"command":{"arguments":[{"path":"C:\\work\\devtools_companion\\lib\\src\\shared\\utils\\utils.dart","autoTriggered":true}],"command":"dart.edit.organizeImports","title":"Organize Imports"},"kind":"source.organizeImports","title":"Organize Imports"},{"command":{"arguments":[{"path":"C:\\work\\devtools_companion\\lib\\src\\shared\\utils\\utils.dart","autoTriggered":true}],"command":"dart.edit.fixAll","title":"Fix All"},"kind":"source.fixAll","title":"Fix All"},{"command":{"arguments":[{"action":"dart.fix.replace.returnType"}],"command":"dart.logAction","title":"Log Action"},"diagnostics":[{"code":"return_of_invalid_type","codeDescription":{"href":"https://dart.dev/diagnostics/return_of_invalid_type"},"message":"A value of type 'int' can't be returned from the function 'reverseString' because it has a return type of 'String'.","range":{"end":{"character":47,"line":24},"start":{"character":9,"line":24}},"severity":1,"source":"dart"}],"edit":{"documentChanges":[{"edits":[{"newText":"int","range":{"end":{"character":6,"line":23},"start":{"character":0,"line":23}}}],"textDocument":{"uri":"{{package-root:devtools_companion}}lib/src/shared/utils/utils.dart","version":38}}]},"kind":"quickfix.replace.returnType","title":"Replace the return type with 'int'"},{"command":{"arguments":[{"action":"dart.fix.remove.argument"}],"command":"dart.logAction","title":"Log Action"},"diagnostics":[{"code":"avoid_redundant_argument_values","codeDescription":{"href":"https://dart.dev/lints/avoid_redundant_argument_values"},"message":"The value of the argument is redundant because it matches the default value.\nTry removing the argument.","range":{"end":{"character":37,"line":24},"start":{"character":35,"line":24}},"severity":3,"source":"dart"}],"edit":{"documentChanges":[{"edits":[{"newText":"","range":{"end":{"character":37,"line":24},"start":{"character":35,"line":24}}}],"textDocument":{"uri":"{{package-root:devtools_companion}}lib/src/shared/utils/utils.dart","version":38}}]},"kind":"quickfix.remove.argument","title":"Remove argument"},{"command":{"arguments":[{"action":"dart.fix.remove.argument.multi"}],"command":"dart.logAction","title":"Log Action"},"diagnostics":[{"code":"avoid_redundant_argument_values","codeDescription":{"href":"https://dart.dev/lints/avoid_redundant_argument_values"},"message":"The value of the argument is redundant because it matches the default value.\nTry removing the argument.","range":{"end":{"character":37,"line":24},"start":{"character":35,"line":24}},"severity":3,"source":"dart"}],"edit":{"documentChanges":[{"edits":[{"newText":"","range":{"end":{"character":54,"line":9},"start":{"character":52,"line":9}}},{"newText":"","range":{"end":{"character":37,"line":24},"start":{"character":35,"line":24}}}],"textDocument":{"uri":"{{package-root:devtools_companion}}lib/src/shared/utils/utils.dart","version":38}}]},"kind":"quickfix.remove.argument.multi","title":"Remove arguments in file"},{"command":{"arguments":[{"action":"dart.fix.ignore.line"}],"command":"dart.logAction","title":"Log Action"},"diagnostics":[{"code":"avoid_redundant_argument_values","codeDescription":{"href":"https://dart.dev/lints/avoid_redundant_argument_values"},"message":"The value of the argument is redundant because it matches the default value.\nTry removing the argument.","range":{"end":{"character":37,"line":24},"start":{"character":35,"line":24}},"severity":3,"source":"dart"}],"edit":{"documentChanges":[{"edits":[{"newText":"  // ignore: avoid_redundant_argument_values\r\n","range":{"end":{"character":0,"line":24},"start":{"character":0,"line":24}}}],"textDocument":{"uri":"{{package-root:devtools_companion}}lib/src/shared/utils/utils.dart","version":38}}]},"kind":"quickfix.ignore.line","title":"Ignore 'avoid_redundant_argument_values' for this line"},{"command":{"arguments":[{"action":"dart.fix.ignore.file"}],"command":"dart.logAction","title":"Log Action"},"diagnostics":[{"code":"avoid_redundant_argument_values","codeDescription":{"href":"https://dart.dev/lints/avoid_redundant_argument_values"},"message":"The value of the argument is redundant because it matches the default value.\nTry removing the argument.","range":{"end":{"character":37,"line":24},"start":{"character":35,"line":24}},"severity":3,"source":"dart"}],"edit":{"documentChanges":[{"edits":[{"newText":"\r\n// ignore_for_file: avoid_redundant_argument_values\r\n","range":{"end":{"character":0,"line":1},"start":{"character":0,"line":1}}}],"textDocument":{"uri":"{{package-root:devtools_companion}}lib/src/shared/utils/utils.dart","version":38}}]},"kind":"quickfix.ignore.file","title":"Ignore 'avoid_redundant_argument_values' for the whole file"},{"command":{"arguments":[{"action":"dart.fix.ignore.analysis"}],"command":"dart.logAction","title":"Log Action"},"diagnostics":[{"code":"avoid_redundant_argument_values","codeDescription":{"href":"https://dart.dev/lints/avoid_redundant_argument_values"},"message":"The value of the argument is redundant because it matches the default value.\nTry removing the argument.","range":{"end":{"character":37,"line":24},"start":{"character":35,"line":24}},"severity":3,"source":"dart"}],"edit":{"documentChanges":[{"edits":[{"newText":"analyzer:\r\n  errors:\r\n    avoid_redundant_argument_values: ignore\r\n","range":{"end":{"character":0,"line":0},"start":{"character":0,"line":0}}}],"textDocument":{"uri":"{{package-root:devtools_companion}}analysis_options.yaml","version":null}}]},"kind":"quickfix.ignore.analysis","title":"Ignore 'avoid_redundant_argument_values' in `analysis_options.yaml`"},{"command":{"arguments":["EXTRACT_METHOD","C:\\work\\devtools_companion\\lib\\src\\shared\\utils\\utils.dart",38,691,0,null],"command":"refactor.perform","title":"Extract Method"},"kind":"refactor.extract","title":"Extract Method"},{"command":{"arguments":["EXTRACT_LOCAL_VARIABLE","C:\\work\\devtools_companion\\lib\\src\\shared\\utils\\utils.dart",38,691,0,null],"command":"refactor.perform","title":"Extract Local Variable"},"kind":"refactor.extract","title":"Extract Local Variable"},{"command":{"arguments":["INLINE_METHOD","C:\\work\\devtools_companion\\lib\\src\\shared\\utils\\utils.dart",38,691,0,null],"command":"refactor.perform","title":"Inline Method"},"kind":"refactor.inline","title":"Inline Method"}]}}
 {"time":1768944394445,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","id":104,"result":null,"clientRequestTime":1768944394497}}
 {"time":1768944394445,"kind":"message","sender":"server","receiver":"ide","message":{"jsonrpc":"2.0","method":"$/progress","params":{"token":"ANALYZING","value":{"kind":"begin","title":"Analyzing…"}}}}
 {"time":1768944394445,"kind":"message","sender":"server","receiver":"ide","message":{"jsonrpc":"2.0","method":"$/progress","params":{"token":"ANALYZING","value":{"kind":"end"}}}}
-{"time":1768944394468,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","id":358,"method":"textDocument/semanticTokens/full","params":{"textDocument":{"uri":"file://{{workspaceFolder-0}}/lib/src/shared/utils/utils.dart"}},"clientRequestTime":1768944394521}}
+{"time":1768944394468,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","id":358,"method":"textDocument/semanticTokens/full","params":{"textDocument":{"uri":"{{workspaceFolder-0}}/lib/src/shared/utils/utils.dart"}},"clientRequestTime":1768944394521}}
 {"time":1768944394468,"kind":"message","sender":"server","receiver":"ide","message":{"id":358,"jsonrpc":"2.0","result":{"data":[0,0,34,3,0,2,0,6,2,0,0,7,10,17,36,0,11,6,2,0,0,7,1,6,4,1,2,2,1,256,0,4,1,6,0,0,2,7,11,16,0,9,6,1,256,0,7,1,6,0,1,2,6,1,256,0,7,1,6,0,0,2,1,15,0,0,3,11,4,16,0,16,1,6,0,0,2,9,4,16,0,10,1,15,0,3,0,4,2,0,0,5,12,17,36,0,13,6,2,0,0,7,1,6,4,1,2,6,2,0,0,7,7,5,4,0,10,1,6,0,0,2,10,4,16,0,11,6,2,2,0,7,9,16,0,0,12,2,16,0,0,4,11,4,16,1,2,6,2,0,0,7,8,5,4,0,11,7,5,0,0,8,5,4,16,0,6,2,16,0,0,4,8,11,16,0,9,4,4,16,0,5,2,16,0,1,2,6,1,256,0,7,7,5,0,0,11,8,5,0,3,0,3,2,0,0,4,9,17,36,0,10,3,2,0,0,4,1,6,4,1,2,2,1,256,0,4,1,6,0,0,4,1,15,0,0,3,5,1,256,0,6,13,2,2,0,14,35,16,0,1,2,2,1,256,0,4,1,6,0,0,5,1,15,0,0,5,1,6,0,0,5,1,15,0,0,3,6,1,256,0,7,1,15,0,1,2,6,1,256,0,7,1,6,0,0,4,9,17,0,0,10,1,6,0,0,4,1,15,0,3,0,4,2,0,0,5,1,18,0,0,3,7,17,36,0,8,1,18,0,0,3,4,2,0,0,5,4,2,0,0,5,1,18,0,0,4,5,6,4,1,2,6,1,256,0,7,5,6,0,0,6,6,4,16,0,8,4,6,4,0,9,4,6,0,0,6,6,4,16,3,0,6,2,0,0,7,13,17,36,0,14,6,2,0,0,7,1,6,4,1,2,6,1,256,0,7,1,6,0,0,2,5,4,16,0,6,2,16,0,0,4,8,11,16,0,9,4,4,16,0,5,2,16,0,0,4,8,11,16,3,0,6,2,0,0,7,16,17,36,0,17,6,2,0,0,7,7,6,4,1,2,6,1,256,0,7,7,6,0,0,11,18,15,0,0,21,5,15,0]}}}
-{"time":1768944394519,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","id":359,"method":"textDocument/documentSymbol","params":{"textDocument":{"uri":"file://{{workspaceFolder-0}}/lib/src/shared/utils/utils.dart"}},"clientRequestTime":1768944394573}}
+{"time":1768944394519,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","id":359,"method":"textDocument/documentSymbol","params":{"textDocument":{"uri":"{{workspaceFolder-0}}/lib/src/shared/utils/utils.dart"}},"clientRequestTime":1768944394573}}
 {"time":1768944394520,"kind":"message","sender":"server","receiver":"ide","message":{"id":359,"jsonrpc":"2.0","result":[{"deprecated":false,"detail":"(String s)","kind":12,"name":"capitalize","range":{"end":{"character":1,"line":5},"start":{"character":0,"line":2}},"selectionRange":{"end":{"character":17,"line":2},"start":{"character":7,"line":2}}},{"deprecated":false,"detail":"(String s)","kind":12,"name":"isPalindrome","range":{"end":{"character":1,"line":11},"start":{"character":0,"line":7}},"selectionRange":{"end":{"character":17,"line":7},"start":{"character":5,"line":7}}},{"deprecated":false,"detail":"(int n)","kind":12,"name":"factorial","range":{"end":{"character":1,"line":17},"start":{"character":0,"line":13}},"selectionRange":{"end":{"character":13,"line":13},"start":{"character":4,"line":13}}},{"deprecated":false,"detail":"(List<List<T>> lists)","kind":12,"name":"flatten","range":{"end":{"character":1,"line":21},"start":{"character":0,"line":19}},"selectionRange":{"end":{"character":15,"line":19},"start":{"character":8,"line":19}}},{"deprecated":false,"detail":"(String s)","kind":12,"name":"reverseString","range":{"end":{"character":1,"line":25},"start":{"character":0,"line":23}},"selectionRange":{"end":{"character":20,"line":23},"start":{"character":7,"line":23}}},{"deprecated":false,"detail":"(double degrees)","kind":12,"name":"degreesToRadians","range":{"end":{"character":1,"line":29},"start":{"character":0,"line":27}},"selectionRange":{"end":{"character":23,"line":27},"start":{"character":7,"line":27}}}]}}
-{"time":1768944394524,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","id":360,"method":"textDocument/documentSymbol","params":{"textDocument":{"uri":"file://{{workspaceFolder-0}}/lib/src/shared/utils/utils.dart"}},"clientRequestTime":1768944394578}}
+{"time":1768944394524,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","id":360,"method":"textDocument/documentSymbol","params":{"textDocument":{"uri":"{{workspaceFolder-0}}/lib/src/shared/utils/utils.dart"}},"clientRequestTime":1768944394578}}
 {"time":1768944394524,"kind":"message","sender":"server","receiver":"ide","message":{"id":360,"jsonrpc":"2.0","result":[{"deprecated":false,"detail":"(String s)","kind":12,"name":"capitalize","range":{"end":{"character":1,"line":5},"start":{"character":0,"line":2}},"selectionRange":{"end":{"character":17,"line":2},"start":{"character":7,"line":2}}},{"deprecated":false,"detail":"(String s)","kind":12,"name":"isPalindrome","range":{"end":{"character":1,"line":11},"start":{"character":0,"line":7}},"selectionRange":{"end":{"character":17,"line":7},"start":{"character":5,"line":7}}},{"deprecated":false,"detail":"(int n)","kind":12,"name":"factorial","range":{"end":{"character":1,"line":17},"start":{"character":0,"line":13}},"selectionRange":{"end":{"character":13,"line":13},"start":{"character":4,"line":13}}},{"deprecated":false,"detail":"(List<List<T>> lists)","kind":12,"name":"flatten","range":{"end":{"character":1,"line":21},"start":{"character":0,"line":19}},"selectionRange":{"end":{"character":15,"line":19},"start":{"character":8,"line":19}}},{"deprecated":false,"detail":"(String s)","kind":12,"name":"reverseString","range":{"end":{"character":1,"line":25},"start":{"character":0,"line":23}},"selectionRange":{"end":{"character":20,"line":23},"start":{"character":7,"line":23}}},{"deprecated":false,"detail":"(double degrees)","kind":12,"name":"degreesToRadians","range":{"end":{"character":1,"line":29},"start":{"character":0,"line":27}},"selectionRange":{"end":{"character":23,"line":27},"start":{"character":7,"line":27}}}]}}
-{"time":1768944394974,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","id":361,"method":"textDocument/inlayHint","params":{"textDocument":{"uri":"file://{{workspaceFolder-0}}/lib/src/shared/utils/utils.dart"},"range":{"start":{"line":0,"character":0},"end":{"line":29,"character":1}}},"clientRequestTime":1768944395026}}
+{"time":1768944394974,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","id":361,"method":"textDocument/inlayHint","params":{"textDocument":{"uri":"{{workspaceFolder-0}}/lib/src/shared/utils/utils.dart"},"range":{"start":{"line":0,"character":0},"end":{"line":29,"character":1}}},"clientRequestTime":1768944395026}}
 {"time":1768944394974,"kind":"message","sender":"server","receiver":"ide","message":{"id":361,"jsonrpc":"2.0","result":[{"kind":2,"label":[{"location":{"range":{"end":{"character":28,"line":363},"start":{"character":23,"line":363}},"uri":"{{package-root:sky_engine}}lib/core/string.dart"},"value":"start:"}],"paddingRight":true,"position":{"character":42,"line":4}},{"kind":2,"label":[{"location":{"range":{"end":{"character":32,"line":546},"start":{"character":28,"line":546}},"uri":"{{package-root:sky_engine}}lib/core/string.dart"},"value":"from:"}],"paddingRight":true,"position":{"character":32,"line":8}},{"kind":2,"label":[{"location":{"range":{"end":{"character":48,"line":546},"start":{"character":41,"line":546}},"uri":"{{package-root:sky_engine}}lib/core/string.dart"},"value":"replace:"}],"paddingRight":true,"position":{"character":51,"line":8}},{"kind":2,"label":[{"location":{"range":{"end":{"character":17,"line":274},"start":{"character":11,"line":274}},"uri":"{{package-root:sky_engine}}lib/core/regexp.dart"},"value":"source:"}],"paddingRight":true,"position":{"character":39,"line":8}},{"kind":2,"label":[{"location":{"range":{"end":{"character":36,"line":676},"start":{"character":29,"line":676}},"uri":"{{package-root:sky_engine}}lib/core/string.dart"},"value":"pattern:"}],"paddingRight":true,"position":{"character":34,"line":9}},{"kind":2,"label":[{"location":{"range":{"end":{"character":31,"line":463},"start":{"character":22,"line":463}},"uri":"{{package-root:sky_engine}}lib/core/iterable.dart"},"value":"separator:"}],"paddingRight":true,"position":{"character":52,"line":9}},{"kind":2,"label":[{"location":{"range":{"end":{"character":29,"line":187},"start":{"character":22,"line":187}},"uri":"{{package-root:sky_engine}}lib/core/errors.dart"},"value":"message:"}],"paddingRight":true,"position":{"character":33,"line":14}},{"kind":2,"label":[{"location":{"range":{"end":{"character":19,"line":13},"start":{"character":18,"line":13}},"uri":"{{package-root:devtools_companion}}lib/src/shared/utils/utils.dart"},"value":"n:"}],"paddingRight":true,"position":{"character":23,"line":16}},{"kind":2,"label":[{"value":"toElements:"}],"paddingRight":true,"position":{"character":22,"line":20}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":17,"line":19},"start":{"character":16,"line":19}},"uri":"{{package-root:devtools_companion}}lib/src/shared/utils/utils.dart"},"value":"T"},{"value":">"}],"paddingRight":true,"position":{"character":23,"line":20}},{"kind":1,"label":[{"value":"<"},{"location":{"range":{"end":{"character":17,"line":19},"start":{"character":16,"line":19}},"uri":"{{package-root:devtools_companion}}lib/src/shared/utils/utils.dart"},"value":"T"},{"value":">"}],"position":{"character":21,"line":20}},{"kind":2,"label":[{"location":{"range":{"end":{"character":36,"line":676},"start":{"character":29,"line":676}},"uri":"{{package-root:sky_engine}}lib/core/string.dart"},"value":"pattern:"}],"paddingRight":true,"position":{"character":17,"line":24}},{"kind":2,"label":[{"location":{"range":{"end":{"character":31,"line":463},"start":{"character":22,"line":463}},"uri":"{{package-root:sky_engine}}lib/core/iterable.dart"},"value":"separator:"}],"paddingRight":true,"position":{"character":35,"line":24}}]}}
-{"time":1768944395176,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","id":362,"method":"textDocument/documentLink","params":{"textDocument":{"uri":"file://{{workspaceFolder-0}}/lib/src/shared/utils/utils.dart"}},"clientRequestTime":1768944395175}}
-{"time":1768944395176,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","id":363,"method":"textDocument/documentColor","params":{"textDocument":{"uri":"file://{{workspaceFolder-0}}/lib/src/shared/utils/utils.dart"}},"clientRequestTime":1768944395176}}
+{"time":1768944395176,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","id":362,"method":"textDocument/documentLink","params":{"textDocument":{"uri":"{{workspaceFolder-0}}/lib/src/shared/utils/utils.dart"}},"clientRequestTime":1768944395175}}
+{"time":1768944395176,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","id":363,"method":"textDocument/documentColor","params":{"textDocument":{"uri":"{{workspaceFolder-0}}/lib/src/shared/utils/utils.dart"}},"clientRequestTime":1768944395176}}
 {"time":1768944395176,"kind":"message","sender":"server","receiver":"ide","message":{"id":363,"jsonrpc":"2.0","result":[]}}
 {"time":1768944395176,"kind":"message","sender":"server","receiver":"ide","message":{"id":362,"jsonrpc":"2.0","result":[]}}
 {"time":1768944395206,"kind":"message","sender":"watcher","receiver":"server","message":{"path":"C:\\work\\devtools_companion\\lib\\src\\shared\\utils\\utils.dart","type":"modify"}}
@@ -180,7 +180,7 @@
 {"time":1768944395207,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","id":105,"result":null,"clientRequestTime":1768944395207}}
 {"time":1768944395207,"kind":"message","sender":"server","receiver":"ide","message":{"jsonrpc":"2.0","method":"$/progress","params":{"token":"ANALYZING","value":{"kind":"begin","title":"Analyzing…"}}}}
 {"time":1768944395207,"kind":"message","sender":"server","receiver":"ide","message":{"jsonrpc":"2.0","method":"$/progress","params":{"token":"ANALYZING","value":{"kind":"end"}}}}
-{"time":1768944395811,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","method":"textDocument/didChange","params":{"textDocument":{"uri":"file://{{workspaceFolder-0}}/lib/src/shared/utils/utils.dart","version":39},"contentChanges":[{"range":{"start":{"line":24,"character":39},"end":{"line":24,"character":47}},"rangeLength":8,"text":""}]},"clientRequestTime":1768944395811}}
+{"time":1768944395811,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","method":"textDocument/didChange","params":{"textDocument":{"uri":"{{workspaceFolder-0}}/lib/src/shared/utils/utils.dart","version":39},"contentChanges":[{"range":{"start":{"line":24,"character":39},"end":{"line":24,"character":47}},"rangeLength":8,"text":""}]},"clientRequestTime":1768944395811}}
 {"time":1768944395811,"kind":"message","sender":"server","receiver":"ide","message":{"id":106,"jsonrpc":"2.0","method":"window/workDoneProgress/create","params":{"token":"ANALYZING"}}}
 {"time":1768944395818,"kind":"message","sender":"server","receiver":"ide","message":{"jsonrpc":"2.0","method":"textDocument/publishDiagnostics","params":{"diagnostics":[{"code":"missing_identifier","message":"Expected an identifier.","range":{"end":{"character":40,"line":24},"start":{"character":39,"line":24}},"severity":1,"source":"dart"},{"code":"prefer_final_locals","codeDescription":{"href":"https://dart.dev/diagnostics/prefer_final_locals"},"message":"Local variables should be final.\nTry making the variable final.","range":{"end":{"character":8,"line":8},"start":{"character":2,"line":8}},"severity":3,"source":"dart"},{"code":"prefer_final_locals","codeDescription":{"href":"https://dart.dev/diagnostics/prefer_final_locals"},"message":"Local variables should be final.\nTry making the variable final.","range":{"end":{"character":8,"line":9},"start":{"character":2,"line":9}},"severity":3,"source":"dart"},{"code":"avoid_redundant_argument_values","codeDescription":{"href":"https://dart.dev/lints/avoid_redundant_argument_values"},"message":"The value of the argument is redundant because it matches the default value.\nTry removing the argument.","range":{"end":{"character":54,"line":9},"start":{"character":52,"line":9}},"severity":3,"source":"dart"},{"code":"avoid_redundant_argument_values","codeDescription":{"href":"https://dart.dev/lints/avoid_redundant_argument_values"},"message":"The value of the argument is redundant because it matches the default value.\nTry removing the argument.","range":{"end":{"character":37,"line":24},"start":{"character":35,"line":24}},"severity":3,"source":"dart"}],"uri":"{{package-root:devtools_companion}}lib/src/shared/utils/utils.dart"}}}
 {"time":1768944395818,"kind":"message","sender":"server","receiver":"ide","message":{"jsonrpc":"2.0","method":"dart/textDocument/publishClosingLabels","params":{"labels":[],"uri":"{{package-root:devtools_companion}}lib/src/shared/utils/utils.dart"}}}
@@ -189,27 +189,27 @@
 {"time":1768944395820,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","id":106,"result":null,"clientRequestTime":1768944395820}}
 {"time":1768944395820,"kind":"message","sender":"server","receiver":"ide","message":{"jsonrpc":"2.0","method":"$/progress","params":{"token":"ANALYZING","value":{"kind":"begin","title":"Analyzing…"}}}}
 {"time":1768944395820,"kind":"message","sender":"server","receiver":"ide","message":{"jsonrpc":"2.0","method":"$/progress","params":{"token":"ANALYZING","value":{"kind":"end"}}}}
-{"time":1768944395835,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","id":364,"method":"textDocument/inlayHint","params":{"textDocument":{"uri":"file://{{workspaceFolder-0}}/lib/src/shared/utils/utils.dart"},"range":{"start":{"line":0,"character":0},"end":{"line":29,"character":1}}},"clientRequestTime":1768944395835}}
+{"time":1768944395835,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","id":364,"method":"textDocument/inlayHint","params":{"textDocument":{"uri":"{{workspaceFolder-0}}/lib/src/shared/utils/utils.dart"},"range":{"start":{"line":0,"character":0},"end":{"line":29,"character":1}}},"clientRequestTime":1768944395835}}
 {"time":1768944395835,"kind":"message","sender":"server","receiver":"ide","message":{"id":364,"jsonrpc":"2.0","result":[{"kind":2,"label":[{"location":{"range":{"end":{"character":28,"line":363},"start":{"character":23,"line":363}},"uri":"{{package-root:sky_engine}}lib/core/string.dart"},"value":"start:"}],"paddingRight":true,"position":{"character":42,"line":4}},{"kind":2,"label":[{"location":{"range":{"end":{"character":32,"line":546},"start":{"character":28,"line":546}},"uri":"{{package-root:sky_engine}}lib/core/string.dart"},"value":"from:"}],"paddingRight":true,"position":{"character":32,"line":8}},{"kind":2,"label":[{"location":{"range":{"end":{"character":48,"line":546},"start":{"character":41,"line":546}},"uri":"{{package-root:sky_engine}}lib/core/string.dart"},"value":"replace:"}],"paddingRight":true,"position":{"character":51,"line":8}},{"kind":2,"label":[{"location":{"range":{"end":{"character":17,"line":274},"start":{"character":11,"line":274}},"uri":"{{package-root:sky_engine}}lib/core/regexp.dart"},"value":"source:"}],"paddingRight":true,"position":{"character":39,"line":8}},{"kind":2,"label":[{"location":{"range":{"end":{"character":36,"line":676},"start":{"character":29,"line":676}},"uri":"{{package-root:sky_engine}}lib/core/string.dart"},"value":"pattern:"}],"paddingRight":true,"position":{"character":34,"line":9}},{"kind":2,"label":[{"location":{"range":{"end":{"character":31,"line":463},"start":{"character":22,"line":463}},"uri":"{{package-root:sky_engine}}lib/core/iterable.dart"},"value":"separator:"}],"paddingRight":true,"position":{"character":52,"line":9}},{"kind":2,"label":[{"location":{"range":{"end":{"character":29,"line":187},"start":{"character":22,"line":187}},"uri":"{{package-root:sky_engine}}lib/core/errors.dart"},"value":"message:"}],"paddingRight":true,"position":{"character":33,"line":14}},{"kind":2,"label":[{"location":{"range":{"end":{"character":19,"line":13},"start":{"character":18,"line":13}},"uri":"{{package-root:devtools_companion}}lib/src/shared/utils/utils.dart"},"value":"n:"}],"paddingRight":true,"position":{"character":23,"line":16}},{"kind":2,"label":[{"value":"toElements:"}],"paddingRight":true,"position":{"character":22,"line":20}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":17,"line":19},"start":{"character":16,"line":19}},"uri":"{{package-root:devtools_companion}}lib/src/shared/utils/utils.dart"},"value":"T"},{"value":">"}],"paddingRight":true,"position":{"character":23,"line":20}},{"kind":1,"label":[{"value":"<"},{"location":{"range":{"end":{"character":17,"line":19},"start":{"character":16,"line":19}},"uri":"{{package-root:devtools_companion}}lib/src/shared/utils/utils.dart"},"value":"T"},{"value":">"}],"position":{"character":21,"line":20}},{"kind":2,"label":[{"location":{"range":{"end":{"character":36,"line":676},"start":{"character":29,"line":676}},"uri":"{{package-root:sky_engine}}lib/core/string.dart"},"value":"pattern:"}],"paddingRight":true,"position":{"character":17,"line":24}},{"kind":2,"label":[{"location":{"range":{"end":{"character":31,"line":463},"start":{"character":22,"line":463}},"uri":"{{package-root:sky_engine}}lib/core/iterable.dart"},"value":"separator:"}],"paddingRight":true,"position":{"character":35,"line":24}}]}}
-{"time":1768944396021,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","id":365,"method":"textDocument/foldingRange","params":{"textDocument":{"uri":"file://{{workspaceFolder-0}}/lib/src/shared/utils/utils.dart"}},"clientRequestTime":1768944396020}}
+{"time":1768944396021,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","id":365,"method":"textDocument/foldingRange","params":{"textDocument":{"uri":"{{workspaceFolder-0}}/lib/src/shared/utils/utils.dart"}},"clientRequestTime":1768944396020}}
 {"time":1768944396021,"kind":"message","sender":"server","receiver":"ide","message":{"id":365,"jsonrpc":"2.0","result":[{"endLine":5,"startLine":2},{"endLine":11,"startLine":7},{"endLine":17,"startLine":13},{"endLine":21,"startLine":19},{"endLine":25,"startLine":23},{"endLine":29,"startLine":27}]}}
-{"time":1768944396074,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","id":366,"method":"textDocument/codeAction","params":{"textDocument":{"uri":"file://{{workspaceFolder-0}}/lib/src/shared/utils/utils.dart"},"range":{"start":{"line":24,"character":39},"end":{"line":24,"character":39}},"context":{"diagnostics":[{"range":{"start":{"line":24,"character":39},"end":{"line":24,"character":40}},"message":"Expected an identifier.","code":"missing_identifier","severity":1,"source":"dart"}],"triggerKind":2}},"clientRequestTime":1768944396074}}
-{"time":1768944396074,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","id":367,"method":"textDocument/codeLens","params":{"textDocument":{"uri":"file://{{workspaceFolder-0}}/lib/src/shared/utils/utils.dart"}},"clientRequestTime":1768944396074}}
+{"time":1768944396074,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","id":366,"method":"textDocument/codeAction","params":{"textDocument":{"uri":"{{workspaceFolder-0}}/lib/src/shared/utils/utils.dart"},"range":{"start":{"line":24,"character":39},"end":{"line":24,"character":39}},"context":{"diagnostics":[{"range":{"start":{"line":24,"character":39},"end":{"line":24,"character":40}},"message":"Expected an identifier.","code":"missing_identifier","severity":1,"source":"dart"}],"triggerKind":2}},"clientRequestTime":1768944396074}}
+{"time":1768944396074,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","id":367,"method":"textDocument/codeLens","params":{"textDocument":{"uri":"{{workspaceFolder-0}}/lib/src/shared/utils/utils.dart"}},"clientRequestTime":1768944396074}}
 {"time":1768944396074,"kind":"message","sender":"server","receiver":"ide","message":{"id":107,"jsonrpc":"2.0","method":"window/workDoneProgress/create","params":{"token":"ANALYZING"}}}
 {"time":1768944396074,"kind":"message","sender":"server","receiver":"ide","message":{"id":367,"jsonrpc":"2.0","result":[]}}
 {"time":1768944396076,"kind":"message","sender":"server","receiver":"ide","message":{"id":366,"jsonrpc":"2.0","result":[{"command":{"arguments":[{"path":"C:\\work\\devtools_companion\\lib\\src\\shared\\utils\\utils.dart","autoTriggered":true}],"command":"dart.edit.sortMembers","title":"Sort Members"},"kind":"source.sortMembers","title":"Sort Members"},{"command":{"arguments":[{"path":"C:\\work\\devtools_companion\\lib\\src\\shared\\utils\\utils.dart","autoTriggered":true}],"command":"dart.edit.organizeImports","title":"Organize Imports"},"kind":"source.organizeImports","title":"Organize Imports"},{"command":{"arguments":[{"path":"C:\\work\\devtools_companion\\lib\\src\\shared\\utils\\utils.dart","autoTriggered":true}],"command":"dart.edit.fixAll","title":"Fix All"},"kind":"source.fixAll","title":"Fix All"},{"command":{"arguments":[{"action":"dart.fix.remove.argument"}],"command":"dart.logAction","title":"Log Action"},"diagnostics":[{"code":"avoid_redundant_argument_values","codeDescription":{"href":"https://dart.dev/lints/avoid_redundant_argument_values"},"message":"The value of the argument is redundant because it matches the default value.\nTry removing the argument.","range":{"end":{"character":37,"line":24},"start":{"character":35,"line":24}},"severity":3,"source":"dart"}],"edit":{"documentChanges":[{"edits":[{"newText":"","range":{"end":{"character":37,"line":24},"start":{"character":35,"line":24}}}],"textDocument":{"uri":"{{package-root:devtools_companion}}lib/src/shared/utils/utils.dart","version":39}}]},"kind":"quickfix.remove.argument","title":"Remove argument"},{"command":{"arguments":[{"action":"dart.fix.remove.argument.multi"}],"command":"dart.logAction","title":"Log Action"},"diagnostics":[{"code":"avoid_redundant_argument_values","codeDescription":{"href":"https://dart.dev/lints/avoid_redundant_argument_values"},"message":"The value of the argument is redundant because it matches the default value.\nTry removing the argument.","range":{"end":{"character":37,"line":24},"start":{"character":35,"line":24}},"severity":3,"source":"dart"}],"edit":{"documentChanges":[{"edits":[{"newText":"","range":{"end":{"character":54,"line":9},"start":{"character":52,"line":9}}},{"newText":"","range":{"end":{"character":37,"line":24},"start":{"character":35,"line":24}}}],"textDocument":{"uri":"{{package-root:devtools_companion}}lib/src/shared/utils/utils.dart","version":39}}]},"kind":"quickfix.remove.argument.multi","title":"Remove arguments in file"},{"command":{"arguments":[{"action":"dart.fix.ignore.line"}],"command":"dart.logAction","title":"Log Action"},"diagnostics":[{"code":"avoid_redundant_argument_values","codeDescription":{"href":"https://dart.dev/lints/avoid_redundant_argument_values"},"message":"The value of the argument is redundant because it matches the default value.\nTry removing the argument.","range":{"end":{"character":37,"line":24},"start":{"character":35,"line":24}},"severity":3,"source":"dart"}],"edit":{"documentChanges":[{"edits":[{"newText":"  // ignore: avoid_redundant_argument_values\r\n","range":{"end":{"character":0,"line":24},"start":{"character":0,"line":24}}}],"textDocument":{"uri":"{{package-root:devtools_companion}}lib/src/shared/utils/utils.dart","version":39}}]},"kind":"quickfix.ignore.line","title":"Ignore 'avoid_redundant_argument_values' for this line"},{"command":{"arguments":[{"action":"dart.fix.ignore.file"}],"command":"dart.logAction","title":"Log Action"},"diagnostics":[{"code":"avoid_redundant_argument_values","codeDescription":{"href":"https://dart.dev/lints/avoid_redundant_argument_values"},"message":"The value of the argument is redundant because it matches the default value.\nTry removing the argument.","range":{"end":{"character":37,"line":24},"start":{"character":35,"line":24}},"severity":3,"source":"dart"}],"edit":{"documentChanges":[{"edits":[{"newText":"\r\n// ignore_for_file: avoid_redundant_argument_values\r\n","range":{"end":{"character":0,"line":1},"start":{"character":0,"line":1}}}],"textDocument":{"uri":"{{package-root:devtools_companion}}lib/src/shared/utils/utils.dart","version":39}}]},"kind":"quickfix.ignore.file","title":"Ignore 'avoid_redundant_argument_values' for the whole file"},{"command":{"arguments":[{"action":"dart.fix.ignore.analysis"}],"command":"dart.logAction","title":"Log Action"},"diagnostics":[{"code":"avoid_redundant_argument_values","codeDescription":{"href":"https://dart.dev/lints/avoid_redundant_argument_values"},"message":"The value of the argument is redundant because it matches the default value.\nTry removing the argument.","range":{"end":{"character":37,"line":24},"start":{"character":35,"line":24}},"severity":3,"source":"dart"}],"edit":{"documentChanges":[{"edits":[{"newText":"analyzer:\r\n  errors:\r\n    avoid_redundant_argument_values: ignore\r\n","range":{"end":{"character":0,"line":0},"start":{"character":0,"line":0}}}],"textDocument":{"uri":"{{package-root:devtools_companion}}analysis_options.yaml","version":null}}]},"kind":"quickfix.ignore.analysis","title":"Ignore 'avoid_redundant_argument_values' in `analysis_options.yaml`"},{"command":{"arguments":["EXTRACT_METHOD","C:\\work\\devtools_companion\\lib\\src\\shared\\utils\\utils.dart",39,683,0,null],"command":"refactor.perform","title":"Extract Method"},"kind":"refactor.extract","title":"Extract Method"},{"command":{"arguments":["EXTRACT_LOCAL_VARIABLE","C:\\work\\devtools_companion\\lib\\src\\shared\\utils\\utils.dart",39,683,0,null],"command":"refactor.perform","title":"Extract Local Variable"},"kind":"refactor.extract","title":"Extract Local Variable"}]}}
 {"time":1768944396076,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","id":107,"result":null,"clientRequestTime":1768944396075}}
 {"time":1768944396076,"kind":"message","sender":"server","receiver":"ide","message":{"jsonrpc":"2.0","method":"$/progress","params":{"token":"ANALYZING","value":{"kind":"begin","title":"Analyzing…"}}}}
 {"time":1768944396076,"kind":"message","sender":"server","receiver":"ide","message":{"jsonrpc":"2.0","method":"$/progress","params":{"token":"ANALYZING","value":{"kind":"end"}}}}
-{"time":1768944396113,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","id":368,"method":"textDocument/semanticTokens/full","params":{"textDocument":{"uri":"file://{{workspaceFolder-0}}/lib/src/shared/utils/utils.dart"}},"clientRequestTime":1768944396112}}
+{"time":1768944396113,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","id":368,"method":"textDocument/semanticTokens/full","params":{"textDocument":{"uri":"{{workspaceFolder-0}}/lib/src/shared/utils/utils.dart"}},"clientRequestTime":1768944396112}}
 {"time":1768944396113,"kind":"message","sender":"server","receiver":"ide","message":{"id":368,"jsonrpc":"2.0","result":{"data":[0,0,34,3,0,2,0,6,2,0,0,7,10,17,36,0,11,6,2,0,0,7,1,6,4,1,2,2,1,256,0,4,1,6,0,0,2,7,11,16,0,9,6,1,256,0,7,1,6,0,1,2,6,1,256,0,7,1,6,0,0,2,1,15,0,0,3,11,4,16,0,16,1,6,0,0,2,9,4,16,0,10,1,15,0,3,0,4,2,0,0,5,12,17,36,0,13,6,2,0,0,7,1,6,4,1,2,6,2,0,0,7,7,5,4,0,10,1,6,0,0,2,10,4,16,0,11,6,2,2,0,7,9,16,0,0,12,2,16,0,0,4,11,4,16,1,2,6,2,0,0,7,8,5,4,0,11,7,5,0,0,8,5,4,16,0,6,2,16,0,0,4,8,11,16,0,9,4,4,16,0,5,2,16,0,1,2,6,1,256,0,7,7,5,0,0,11,8,5,0,3,0,3,2,0,0,4,9,17,36,0,10,3,2,0,0,4,1,6,4,1,2,2,1,256,0,4,1,6,0,0,4,1,15,0,0,3,5,1,256,0,6,13,2,2,0,14,35,16,0,1,2,2,1,256,0,4,1,6,0,0,5,1,15,0,0,5,1,6,0,0,5,1,15,0,0,3,6,1,256,0,7,1,15,0,1,2,6,1,256,0,7,1,6,0,0,4,9,17,0,0,10,1,6,0,0,4,1,15,0,3,0,4,2,0,0,5,1,18,0,0,3,7,17,36,0,8,1,18,0,0,3,4,2,0,0,5,4,2,0,0,5,1,18,0,0,4,5,6,4,1,2,6,1,256,0,7,5,6,0,0,6,6,4,16,0,8,4,6,4,0,9,4,6,0,0,6,6,4,16,3,0,6,2,0,0,7,13,17,36,0,14,6,2,0,0,7,1,6,4,1,2,6,1,256,0,7,1,6,0,0,2,5,4,16,0,6,2,16,0,0,4,8,11,16,0,9,4,4,16,0,5,2,16,0,3,0,6,2,0,0,7,16,17,36,0,17,6,2,0,0,7,7,6,4,1,2,6,1,256,0,7,7,6,0,0,11,18,15,0,0,21,5,15,0]}}}
-{"time":1768944396161,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","id":369,"method":"textDocument/documentSymbol","params":{"textDocument":{"uri":"file://{{workspaceFolder-0}}/lib/src/shared/utils/utils.dart"}},"clientRequestTime":1768944396160}}
+{"time":1768944396161,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","id":369,"method":"textDocument/documentSymbol","params":{"textDocument":{"uri":"{{workspaceFolder-0}}/lib/src/shared/utils/utils.dart"}},"clientRequestTime":1768944396160}}
 {"time":1768944396162,"kind":"message","sender":"server","receiver":"ide","message":{"id":369,"jsonrpc":"2.0","result":[{"deprecated":false,"detail":"(String s)","kind":12,"name":"capitalize","range":{"end":{"character":1,"line":5},"start":{"character":0,"line":2}},"selectionRange":{"end":{"character":17,"line":2},"start":{"character":7,"line":2}}},{"deprecated":false,"detail":"(String s)","kind":12,"name":"isPalindrome","range":{"end":{"character":1,"line":11},"start":{"character":0,"line":7}},"selectionRange":{"end":{"character":17,"line":7},"start":{"character":5,"line":7}}},{"deprecated":false,"detail":"(int n)","kind":12,"name":"factorial","range":{"end":{"character":1,"line":17},"start":{"character":0,"line":13}},"selectionRange":{"end":{"character":13,"line":13},"start":{"character":4,"line":13}}},{"deprecated":false,"detail":"(List<List<T>> lists)","kind":12,"name":"flatten","range":{"end":{"character":1,"line":21},"start":{"character":0,"line":19}},"selectionRange":{"end":{"character":15,"line":19},"start":{"character":8,"line":19}}},{"deprecated":false,"detail":"(String s)","kind":12,"name":"reverseString","range":{"end":{"character":1,"line":25},"start":{"character":0,"line":23}},"selectionRange":{"end":{"character":20,"line":23},"start":{"character":7,"line":23}}},{"deprecated":false,"detail":"(double degrees)","kind":12,"name":"degreesToRadians","range":{"end":{"character":1,"line":29},"start":{"character":0,"line":27}},"selectionRange":{"end":{"character":23,"line":27},"start":{"character":7,"line":27}}}]}}
-{"time":1768944396166,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","id":370,"method":"textDocument/documentSymbol","params":{"textDocument":{"uri":"file://{{workspaceFolder-0}}/lib/src/shared/utils/utils.dart"}},"clientRequestTime":1768944396165}}
+{"time":1768944396166,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","id":370,"method":"textDocument/documentSymbol","params":{"textDocument":{"uri":"{{workspaceFolder-0}}/lib/src/shared/utils/utils.dart"}},"clientRequestTime":1768944396165}}
 {"time":1768944396166,"kind":"message","sender":"server","receiver":"ide","message":{"id":370,"jsonrpc":"2.0","result":[{"deprecated":false,"detail":"(String s)","kind":12,"name":"capitalize","range":{"end":{"character":1,"line":5},"start":{"character":0,"line":2}},"selectionRange":{"end":{"character":17,"line":2},"start":{"character":7,"line":2}}},{"deprecated":false,"detail":"(String s)","kind":12,"name":"isPalindrome","range":{"end":{"character":1,"line":11},"start":{"character":0,"line":7}},"selectionRange":{"end":{"character":17,"line":7},"start":{"character":5,"line":7}}},{"deprecated":false,"detail":"(int n)","kind":12,"name":"factorial","range":{"end":{"character":1,"line":17},"start":{"character":0,"line":13}},"selectionRange":{"end":{"character":13,"line":13},"start":{"character":4,"line":13}}},{"deprecated":false,"detail":"(List<List<T>> lists)","kind":12,"name":"flatten","range":{"end":{"character":1,"line":21},"start":{"character":0,"line":19}},"selectionRange":{"end":{"character":15,"line":19},"start":{"character":8,"line":19}}},{"deprecated":false,"detail":"(String s)","kind":12,"name":"reverseString","range":{"end":{"character":1,"line":25},"start":{"character":0,"line":23}},"selectionRange":{"end":{"character":20,"line":23},"start":{"character":7,"line":23}}},{"deprecated":false,"detail":"(double degrees)","kind":12,"name":"degreesToRadians","range":{"end":{"character":1,"line":29},"start":{"character":0,"line":27}},"selectionRange":{"end":{"character":23,"line":27},"start":{"character":7,"line":27}}}]}}
-{"time":1768944396616,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","id":371,"method":"textDocument/inlayHint","params":{"textDocument":{"uri":"file://{{workspaceFolder-0}}/lib/src/shared/utils/utils.dart"},"range":{"start":{"line":0,"character":0},"end":{"line":29,"character":1}}},"clientRequestTime":1768944396614}}
+{"time":1768944396616,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","id":371,"method":"textDocument/inlayHint","params":{"textDocument":{"uri":"{{workspaceFolder-0}}/lib/src/shared/utils/utils.dart"},"range":{"start":{"line":0,"character":0},"end":{"line":29,"character":1}}},"clientRequestTime":1768944396614}}
 {"time":1768944396616,"kind":"message","sender":"server","receiver":"ide","message":{"id":371,"jsonrpc":"2.0","result":[{"kind":2,"label":[{"location":{"range":{"end":{"character":28,"line":363},"start":{"character":23,"line":363}},"uri":"{{package-root:sky_engine}}lib/core/string.dart"},"value":"start:"}],"paddingRight":true,"position":{"character":42,"line":4}},{"kind":2,"label":[{"location":{"range":{"end":{"character":32,"line":546},"start":{"character":28,"line":546}},"uri":"{{package-root:sky_engine}}lib/core/string.dart"},"value":"from:"}],"paddingRight":true,"position":{"character":32,"line":8}},{"kind":2,"label":[{"location":{"range":{"end":{"character":48,"line":546},"start":{"character":41,"line":546}},"uri":"{{package-root:sky_engine}}lib/core/string.dart"},"value":"replace:"}],"paddingRight":true,"position":{"character":51,"line":8}},{"kind":2,"label":[{"location":{"range":{"end":{"character":17,"line":274},"start":{"character":11,"line":274}},"uri":"{{package-root:sky_engine}}lib/core/regexp.dart"},"value":"source:"}],"paddingRight":true,"position":{"character":39,"line":8}},{"kind":2,"label":[{"location":{"range":{"end":{"character":36,"line":676},"start":{"character":29,"line":676}},"uri":"{{package-root:sky_engine}}lib/core/string.dart"},"value":"pattern:"}],"paddingRight":true,"position":{"character":34,"line":9}},{"kind":2,"label":[{"location":{"range":{"end":{"character":31,"line":463},"start":{"character":22,"line":463}},"uri":"{{package-root:sky_engine}}lib/core/iterable.dart"},"value":"separator:"}],"paddingRight":true,"position":{"character":52,"line":9}},{"kind":2,"label":[{"location":{"range":{"end":{"character":29,"line":187},"start":{"character":22,"line":187}},"uri":"{{package-root:sky_engine}}lib/core/errors.dart"},"value":"message:"}],"paddingRight":true,"position":{"character":33,"line":14}},{"kind":2,"label":[{"location":{"range":{"end":{"character":19,"line":13},"start":{"character":18,"line":13}},"uri":"{{package-root:devtools_companion}}lib/src/shared/utils/utils.dart"},"value":"n:"}],"paddingRight":true,"position":{"character":23,"line":16}},{"kind":2,"label":[{"value":"toElements:"}],"paddingRight":true,"position":{"character":22,"line":20}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":17,"line":19},"start":{"character":16,"line":19}},"uri":"{{package-root:devtools_companion}}lib/src/shared/utils/utils.dart"},"value":"T"},{"value":">"}],"paddingRight":true,"position":{"character":23,"line":20}},{"kind":1,"label":[{"value":"<"},{"location":{"range":{"end":{"character":17,"line":19},"start":{"character":16,"line":19}},"uri":"{{package-root:devtools_companion}}lib/src/shared/utils/utils.dart"},"value":"T"},{"value":">"}],"position":{"character":21,"line":20}},{"kind":2,"label":[{"location":{"range":{"end":{"character":36,"line":676},"start":{"character":29,"line":676}},"uri":"{{package-root:sky_engine}}lib/core/string.dart"},"value":"pattern:"}],"paddingRight":true,"position":{"character":17,"line":24}},{"kind":2,"label":[{"location":{"range":{"end":{"character":31,"line":463},"start":{"character":22,"line":463}},"uri":"{{package-root:sky_engine}}lib/core/iterable.dart"},"value":"separator:"}],"paddingRight":true,"position":{"character":35,"line":24}}]}}
-{"time":1768944396755,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","method":"textDocument/didChange","params":{"textDocument":{"uri":"file://{{workspaceFolder-0}}/lib/src/shared/utils/utils.dart","version":40},"contentChanges":[{"range":{"start":{"line":24,"character":38},"end":{"line":24,"character":39}},"rangeLength":1,"text":""}]},"clientRequestTime":1768944396755}}
+{"time":1768944396755,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","method":"textDocument/didChange","params":{"textDocument":{"uri":"{{workspaceFolder-0}}/lib/src/shared/utils/utils.dart","version":40},"contentChanges":[{"range":{"start":{"line":24,"character":38},"end":{"line":24,"character":39}},"rangeLength":1,"text":""}]},"clientRequestTime":1768944396755}}
 {"time":1768944396755,"kind":"message","sender":"server","receiver":"ide","message":{"id":108,"jsonrpc":"2.0","method":"window/workDoneProgress/create","params":{"token":"ANALYZING"}}}
 {"time":1768944396760,"kind":"message","sender":"server","receiver":"ide","message":{"jsonrpc":"2.0","method":"textDocument/publishDiagnostics","params":{"diagnostics":[{"code":"prefer_final_locals","codeDescription":{"href":"https://dart.dev/diagnostics/prefer_final_locals"},"message":"Local variables should be final.\nTry making the variable final.","range":{"end":{"character":8,"line":8},"start":{"character":2,"line":8}},"severity":3,"source":"dart"},{"code":"prefer_final_locals","codeDescription":{"href":"https://dart.dev/diagnostics/prefer_final_locals"},"message":"Local variables should be final.\nTry making the variable final.","range":{"end":{"character":8,"line":9},"start":{"character":2,"line":9}},"severity":3,"source":"dart"},{"code":"avoid_redundant_argument_values","codeDescription":{"href":"https://dart.dev/lints/avoid_redundant_argument_values"},"message":"The value of the argument is redundant because it matches the default value.\nTry removing the argument.","range":{"end":{"character":54,"line":9},"start":{"character":52,"line":9}},"severity":3,"source":"dart"},{"code":"avoid_redundant_argument_values","codeDescription":{"href":"https://dart.dev/lints/avoid_redundant_argument_values"},"message":"The value of the argument is redundant because it matches the default value.\nTry removing the argument.","range":{"end":{"character":37,"line":24},"start":{"character":35,"line":24}},"severity":3,"source":"dart"}],"uri":"{{package-root:devtools_companion}}lib/src/shared/utils/utils.dart"}}}
 {"time":1768944396760,"kind":"message","sender":"server","receiver":"ide","message":{"jsonrpc":"2.0","method":"dart/textDocument/publishClosingLabels","params":{"labels":[],"uri":"{{package-root:devtools_companion}}lib/src/shared/utils/utils.dart"}}}
@@ -218,36 +218,36 @@
 {"time":1768944396762,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","id":108,"result":null,"clientRequestTime":1768944396762}}
 {"time":1768944396762,"kind":"message","sender":"server","receiver":"ide","message":{"jsonrpc":"2.0","method":"$/progress","params":{"token":"ANALYZING","value":{"kind":"begin","title":"Analyzing…"}}}}
 {"time":1768944396762,"kind":"message","sender":"server","receiver":"ide","message":{"jsonrpc":"2.0","method":"$/progress","params":{"token":"ANALYZING","value":{"kind":"end"}}}}
-{"time":1768944396780,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","id":372,"method":"textDocument/inlayHint","params":{"textDocument":{"uri":"file://{{workspaceFolder-0}}/lib/src/shared/utils/utils.dart"},"range":{"start":{"line":0,"character":0},"end":{"line":29,"character":1}}},"clientRequestTime":1768944396779}}
+{"time":1768944396780,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","id":372,"method":"textDocument/inlayHint","params":{"textDocument":{"uri":"{{workspaceFolder-0}}/lib/src/shared/utils/utils.dart"},"range":{"start":{"line":0,"character":0},"end":{"line":29,"character":1}}},"clientRequestTime":1768944396779}}
 {"time":1768944396780,"kind":"message","sender":"server","receiver":"ide","message":{"id":372,"jsonrpc":"2.0","result":[{"kind":2,"label":[{"location":{"range":{"end":{"character":28,"line":363},"start":{"character":23,"line":363}},"uri":"{{package-root:sky_engine}}lib/core/string.dart"},"value":"start:"}],"paddingRight":true,"position":{"character":42,"line":4}},{"kind":2,"label":[{"location":{"range":{"end":{"character":32,"line":546},"start":{"character":28,"line":546}},"uri":"{{package-root:sky_engine}}lib/core/string.dart"},"value":"from:"}],"paddingRight":true,"position":{"character":32,"line":8}},{"kind":2,"label":[{"location":{"range":{"end":{"character":48,"line":546},"start":{"character":41,"line":546}},"uri":"{{package-root:sky_engine}}lib/core/string.dart"},"value":"replace:"}],"paddingRight":true,"position":{"character":51,"line":8}},{"kind":2,"label":[{"location":{"range":{"end":{"character":17,"line":274},"start":{"character":11,"line":274}},"uri":"{{package-root:sky_engine}}lib/core/regexp.dart"},"value":"source:"}],"paddingRight":true,"position":{"character":39,"line":8}},{"kind":2,"label":[{"location":{"range":{"end":{"character":36,"line":676},"start":{"character":29,"line":676}},"uri":"{{package-root:sky_engine}}lib/core/string.dart"},"value":"pattern:"}],"paddingRight":true,"position":{"character":34,"line":9}},{"kind":2,"label":[{"location":{"range":{"end":{"character":31,"line":463},"start":{"character":22,"line":463}},"uri":"{{package-root:sky_engine}}lib/core/iterable.dart"},"value":"separator:"}],"paddingRight":true,"position":{"character":52,"line":9}},{"kind":2,"label":[{"location":{"range":{"end":{"character":29,"line":187},"start":{"character":22,"line":187}},"uri":"{{package-root:sky_engine}}lib/core/errors.dart"},"value":"message:"}],"paddingRight":true,"position":{"character":33,"line":14}},{"kind":2,"label":[{"location":{"range":{"end":{"character":19,"line":13},"start":{"character":18,"line":13}},"uri":"{{package-root:devtools_companion}}lib/src/shared/utils/utils.dart"},"value":"n:"}],"paddingRight":true,"position":{"character":23,"line":16}},{"kind":2,"label":[{"value":"toElements:"}],"paddingRight":true,"position":{"character":22,"line":20}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":17,"line":19},"start":{"character":16,"line":19}},"uri":"{{package-root:devtools_companion}}lib/src/shared/utils/utils.dart"},"value":"T"},{"value":">"}],"paddingRight":true,"position":{"character":23,"line":20}},{"kind":1,"label":[{"value":"<"},{"location":{"range":{"end":{"character":17,"line":19},"start":{"character":16,"line":19}},"uri":"{{package-root:devtools_companion}}lib/src/shared/utils/utils.dart"},"value":"T"},{"value":">"}],"position":{"character":21,"line":20}},{"kind":2,"label":[{"location":{"range":{"end":{"character":36,"line":676},"start":{"character":29,"line":676}},"uri":"{{package-root:sky_engine}}lib/core/string.dart"},"value":"pattern:"}],"paddingRight":true,"position":{"character":17,"line":24}},{"kind":2,"label":[{"location":{"range":{"end":{"character":31,"line":463},"start":{"character":22,"line":463}},"uri":"{{package-root:sky_engine}}lib/core/iterable.dart"},"value":"separator:"}],"paddingRight":true,"position":{"character":35,"line":24}}]}}
-{"time":1768944396811,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","id":373,"method":"textDocument/documentColor","params":{"textDocument":{"uri":"file://{{workspaceFolder-0}}/lib/src/shared/utils/utils.dart"}},"clientRequestTime":1768944396809}}
+{"time":1768944396811,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","id":373,"method":"textDocument/documentColor","params":{"textDocument":{"uri":"{{workspaceFolder-0}}/lib/src/shared/utils/utils.dart"}},"clientRequestTime":1768944396809}}
 {"time":1768944396811,"kind":"message","sender":"server","receiver":"ide","message":{"id":373,"jsonrpc":"2.0","result":[]}}
-{"time":1768944396964,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","id":374,"method":"textDocument/foldingRange","params":{"textDocument":{"uri":"file://{{workspaceFolder-0}}/lib/src/shared/utils/utils.dart"}},"clientRequestTime":1768944396963}}
+{"time":1768944396964,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","id":374,"method":"textDocument/foldingRange","params":{"textDocument":{"uri":"{{workspaceFolder-0}}/lib/src/shared/utils/utils.dart"}},"clientRequestTime":1768944396963}}
 {"time":1768944396964,"kind":"message","sender":"server","receiver":"ide","message":{"id":374,"jsonrpc":"2.0","result":[{"endLine":5,"startLine":2},{"endLine":11,"startLine":7},{"endLine":17,"startLine":13},{"endLine":21,"startLine":19},{"endLine":25,"startLine":23},{"endLine":29,"startLine":27}]}}
-{"time":1768944397024,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","id":375,"method":"textDocument/codeAction","params":{"textDocument":{"uri":"file://{{workspaceFolder-0}}/lib/src/shared/utils/utils.dart"},"range":{"start":{"line":24,"character":38},"end":{"line":24,"character":38}},"context":{"diagnostics":[],"triggerKind":2}},"clientRequestTime":1768944397024}}
-{"time":1768944397024,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","id":376,"method":"textDocument/codeLens","params":{"textDocument":{"uri":"file://{{workspaceFolder-0}}/lib/src/shared/utils/utils.dart"}},"clientRequestTime":1768944397024}}
+{"time":1768944397024,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","id":375,"method":"textDocument/codeAction","params":{"textDocument":{"uri":"{{workspaceFolder-0}}/lib/src/shared/utils/utils.dart"},"range":{"start":{"line":24,"character":38},"end":{"line":24,"character":38}},"context":{"diagnostics":[],"triggerKind":2}},"clientRequestTime":1768944397024}}
+{"time":1768944397024,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","id":376,"method":"textDocument/codeLens","params":{"textDocument":{"uri":"{{workspaceFolder-0}}/lib/src/shared/utils/utils.dart"}},"clientRequestTime":1768944397024}}
 {"time":1768944397025,"kind":"message","sender":"server","receiver":"ide","message":{"id":109,"jsonrpc":"2.0","method":"window/workDoneProgress/create","params":{"token":"ANALYZING"}}}
 {"time":1768944397025,"kind":"message","sender":"server","receiver":"ide","message":{"id":376,"jsonrpc":"2.0","result":[]}}
 {"time":1768944397026,"kind":"message","sender":"server","receiver":"ide","message":{"id":375,"jsonrpc":"2.0","result":[{"command":{"arguments":[{"path":"C:\\work\\devtools_companion\\lib\\src\\shared\\utils\\utils.dart","autoTriggered":true}],"command":"dart.edit.sortMembers","title":"Sort Members"},"kind":"source.sortMembers","title":"Sort Members"},{"command":{"arguments":[{"path":"C:\\work\\devtools_companion\\lib\\src\\shared\\utils\\utils.dart","autoTriggered":true}],"command":"dart.edit.organizeImports","title":"Organize Imports"},"kind":"source.organizeImports","title":"Organize Imports"},{"command":{"arguments":[{"path":"C:\\work\\devtools_companion\\lib\\src\\shared\\utils\\utils.dart","autoTriggered":true}],"command":"dart.edit.fixAll","title":"Fix All"},"kind":"source.fixAll","title":"Fix All"},{"command":{"arguments":[{"action":"dart.fix.remove.argument"}],"command":"dart.logAction","title":"Log Action"},"diagnostics":[{"code":"avoid_redundant_argument_values","codeDescription":{"href":"https://dart.dev/lints/avoid_redundant_argument_values"},"message":"The value of the argument is redundant because it matches the default value.\nTry removing the argument.","range":{"end":{"character":37,"line":24},"start":{"character":35,"line":24}},"severity":3,"source":"dart"}],"edit":{"documentChanges":[{"edits":[{"newText":"","range":{"end":{"character":37,"line":24},"start":{"character":35,"line":24}}}],"textDocument":{"uri":"{{package-root:devtools_companion}}lib/src/shared/utils/utils.dart","version":40}}]},"kind":"quickfix.remove.argument","title":"Remove argument"},{"command":{"arguments":[{"action":"dart.fix.remove.argument.multi"}],"command":"dart.logAction","title":"Log Action"},"diagnostics":[{"code":"avoid_redundant_argument_values","codeDescription":{"href":"https://dart.dev/lints/avoid_redundant_argument_values"},"message":"The value of the argument is redundant because it matches the default value.\nTry removing the argument.","range":{"end":{"character":37,"line":24},"start":{"character":35,"line":24}},"severity":3,"source":"dart"}],"edit":{"documentChanges":[{"edits":[{"newText":"","range":{"end":{"character":54,"line":9},"start":{"character":52,"line":9}}},{"newText":"","range":{"end":{"character":37,"line":24},"start":{"character":35,"line":24}}}],"textDocument":{"uri":"{{package-root:devtools_companion}}lib/src/shared/utils/utils.dart","version":40}}]},"kind":"quickfix.remove.argument.multi","title":"Remove arguments in file"},{"command":{"arguments":[{"action":"dart.fix.ignore.line"}],"command":"dart.logAction","title":"Log Action"},"diagnostics":[{"code":"avoid_redundant_argument_values","codeDescription":{"href":"https://dart.dev/lints/avoid_redundant_argument_values"},"message":"The value of the argument is redundant because it matches the default value.\nTry removing the argument.","range":{"end":{"character":37,"line":24},"start":{"character":35,"line":24}},"severity":3,"source":"dart"}],"edit":{"documentChanges":[{"edits":[{"newText":"  // ignore: avoid_redundant_argument_values\r\n","range":{"end":{"character":0,"line":24},"start":{"character":0,"line":24}}}],"textDocument":{"uri":"{{package-root:devtools_companion}}lib/src/shared/utils/utils.dart","version":40}}]},"kind":"quickfix.ignore.line","title":"Ignore 'avoid_redundant_argument_values' for this line"},{"command":{"arguments":[{"action":"dart.fix.ignore.file"}],"command":"dart.logAction","title":"Log Action"},"diagnostics":[{"code":"avoid_redundant_argument_values","codeDescription":{"href":"https://dart.dev/lints/avoid_redundant_argument_values"},"message":"The value of the argument is redundant because it matches the default value.\nTry removing the argument.","range":{"end":{"character":37,"line":24},"start":{"character":35,"line":24}},"severity":3,"source":"dart"}],"edit":{"documentChanges":[{"edits":[{"newText":"\r\n// ignore_for_file: avoid_redundant_argument_values\r\n","range":{"end":{"character":0,"line":1},"start":{"character":0,"line":1}}}],"textDocument":{"uri":"{{package-root:devtools_companion}}lib/src/shared/utils/utils.dart","version":40}}]},"kind":"quickfix.ignore.file","title":"Ignore 'avoid_redundant_argument_values' for the whole file"},{"command":{"arguments":[{"action":"dart.fix.ignore.analysis"}],"command":"dart.logAction","title":"Log Action"},"diagnostics":[{"code":"avoid_redundant_argument_values","codeDescription":{"href":"https://dart.dev/lints/avoid_redundant_argument_values"},"message":"The value of the argument is redundant because it matches the default value.\nTry removing the argument.","range":{"end":{"character":37,"line":24},"start":{"character":35,"line":24}},"severity":3,"source":"dart"}],"edit":{"documentChanges":[{"edits":[{"newText":"analyzer:\r\n  errors:\r\n    avoid_redundant_argument_values: ignore\r\n","range":{"end":{"character":0,"line":0},"start":{"character":0,"line":0}}}],"textDocument":{"uri":"{{package-root:devtools_companion}}analysis_options.yaml","version":null}}]},"kind":"quickfix.ignore.analysis","title":"Ignore 'avoid_redundant_argument_values' in `analysis_options.yaml`"},{"command":{"arguments":["EXTRACT_METHOD","C:\\work\\devtools_companion\\lib\\src\\shared\\utils\\utils.dart",40,682,0,null],"command":"refactor.perform","title":"Extract Method"},"kind":"refactor.extract","title":"Extract Method"},{"command":{"arguments":["EXTRACT_LOCAL_VARIABLE","C:\\work\\devtools_companion\\lib\\src\\shared\\utils\\utils.dart",40,682,0,null],"command":"refactor.perform","title":"Extract Local Variable"},"kind":"refactor.extract","title":"Extract Local Variable"}]}}
 {"time":1768944397027,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","id":109,"result":null,"clientRequestTime":1768944397026}}
 {"time":1768944397027,"kind":"message","sender":"server","receiver":"ide","message":{"jsonrpc":"2.0","method":"$/progress","params":{"token":"ANALYZING","value":{"kind":"begin","title":"Analyzing…"}}}}
 {"time":1768944397027,"kind":"message","sender":"server","receiver":"ide","message":{"jsonrpc":"2.0","method":"$/progress","params":{"token":"ANALYZING","value":{"kind":"end"}}}}
-{"time":1768944397056,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","id":377,"method":"textDocument/semanticTokens/full","params":{"textDocument":{"uri":"file://{{workspaceFolder-0}}/lib/src/shared/utils/utils.dart"}},"clientRequestTime":1768944397056}}
+{"time":1768944397056,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","id":377,"method":"textDocument/semanticTokens/full","params":{"textDocument":{"uri":"{{workspaceFolder-0}}/lib/src/shared/utils/utils.dart"}},"clientRequestTime":1768944397056}}
 {"time":1768944397056,"kind":"message","sender":"server","receiver":"ide","message":{"id":377,"jsonrpc":"2.0","result":{"data":[0,0,34,3,0,2,0,6,2,0,0,7,10,17,36,0,11,6,2,0,0,7,1,6,4,1,2,2,1,256,0,4,1,6,0,0,2,7,11,16,0,9,6,1,256,0,7,1,6,0,1,2,6,1,256,0,7,1,6,0,0,2,1,15,0,0,3,11,4,16,0,16,1,6,0,0,2,9,4,16,0,10,1,15,0,3,0,4,2,0,0,5,12,17,36,0,13,6,2,0,0,7,1,6,4,1,2,6,2,0,0,7,7,5,4,0,10,1,6,0,0,2,10,4,16,0,11,6,2,2,0,7,9,16,0,0,12,2,16,0,0,4,11,4,16,1,2,6,2,0,0,7,8,5,4,0,11,7,5,0,0,8,5,4,16,0,6,2,16,0,0,4,8,11,16,0,9,4,4,16,0,5,2,16,0,1,2,6,1,256,0,7,7,5,0,0,11,8,5,0,3,0,3,2,0,0,4,9,17,36,0,10,3,2,0,0,4,1,6,4,1,2,2,1,256,0,4,1,6,0,0,4,1,15,0,0,3,5,1,256,0,6,13,2,2,0,14,35,16,0,1,2,2,1,256,0,4,1,6,0,0,5,1,15,0,0,5,1,6,0,0,5,1,15,0,0,3,6,1,256,0,7,1,15,0,1,2,6,1,256,0,7,1,6,0,0,4,9,17,0,0,10,1,6,0,0,4,1,15,0,3,0,4,2,0,0,5,1,18,0,0,3,7,17,36,0,8,1,18,0,0,3,4,2,0,0,5,4,2,0,0,5,1,18,0,0,4,5,6,4,1,2,6,1,256,0,7,5,6,0,0,6,6,4,16,0,8,4,6,4,0,9,4,6,0,0,6,6,4,16,3,0,6,2,0,0,7,13,17,36,0,14,6,2,0,0,7,1,6,4,1,2,6,1,256,0,7,1,6,0,0,2,5,4,16,0,6,2,16,0,0,4,8,11,16,0,9,4,4,16,0,5,2,16,0,3,0,6,2,0,0,7,16,17,36,0,17,6,2,0,0,7,7,6,4,1,2,6,1,256,0,7,7,6,0,0,11,18,15,0,0,21,5,15,0]}}}
-{"time":1768944397118,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","id":378,"method":"textDocument/documentSymbol","params":{"textDocument":{"uri":"file://{{workspaceFolder-0}}/lib/src/shared/utils/utils.dart"}},"clientRequestTime":1768944397118}}
-{"time":1768944397120,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","id":379,"method":"textDocument/documentSymbol","params":{"textDocument":{"uri":"file://{{workspaceFolder-0}}/lib/src/shared/utils/utils.dart"}},"clientRequestTime":1768944397118}}
+{"time":1768944397118,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","id":378,"method":"textDocument/documentSymbol","params":{"textDocument":{"uri":"{{workspaceFolder-0}}/lib/src/shared/utils/utils.dart"}},"clientRequestTime":1768944397118}}
+{"time":1768944397120,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","id":379,"method":"textDocument/documentSymbol","params":{"textDocument":{"uri":"{{workspaceFolder-0}}/lib/src/shared/utils/utils.dart"}},"clientRequestTime":1768944397118}}
 {"time":1768944397120,"kind":"message","sender":"server","receiver":"ide","message":{"id":378,"jsonrpc":"2.0","result":[{"deprecated":false,"detail":"(String s)","kind":12,"name":"capitalize","range":{"end":{"character":1,"line":5},"start":{"character":0,"line":2}},"selectionRange":{"end":{"character":17,"line":2},"start":{"character":7,"line":2}}},{"deprecated":false,"detail":"(String s)","kind":12,"name":"isPalindrome","range":{"end":{"character":1,"line":11},"start":{"character":0,"line":7}},"selectionRange":{"end":{"character":17,"line":7},"start":{"character":5,"line":7}}},{"deprecated":false,"detail":"(int n)","kind":12,"name":"factorial","range":{"end":{"character":1,"line":17},"start":{"character":0,"line":13}},"selectionRange":{"end":{"character":13,"line":13},"start":{"character":4,"line":13}}},{"deprecated":false,"detail":"(List<List<T>> lists)","kind":12,"name":"flatten","range":{"end":{"character":1,"line":21},"start":{"character":0,"line":19}},"selectionRange":{"end":{"character":15,"line":19},"start":{"character":8,"line":19}}},{"deprecated":false,"detail":"(String s)","kind":12,"name":"reverseString","range":{"end":{"character":1,"line":25},"start":{"character":0,"line":23}},"selectionRange":{"end":{"character":20,"line":23},"start":{"character":7,"line":23}}},{"deprecated":false,"detail":"(double degrees)","kind":12,"name":"degreesToRadians","range":{"end":{"character":1,"line":29},"start":{"character":0,"line":27}},"selectionRange":{"end":{"character":23,"line":27},"start":{"character":7,"line":27}}}]}}
 {"time":1768944397120,"kind":"message","sender":"server","receiver":"ide","message":{"id":379,"jsonrpc":"2.0","result":[{"deprecated":false,"detail":"(String s)","kind":12,"name":"capitalize","range":{"end":{"character":1,"line":5},"start":{"character":0,"line":2}},"selectionRange":{"end":{"character":17,"line":2},"start":{"character":7,"line":2}}},{"deprecated":false,"detail":"(String s)","kind":12,"name":"isPalindrome","range":{"end":{"character":1,"line":11},"start":{"character":0,"line":7}},"selectionRange":{"end":{"character":17,"line":7},"start":{"character":5,"line":7}}},{"deprecated":false,"detail":"(int n)","kind":12,"name":"factorial","range":{"end":{"character":1,"line":17},"start":{"character":0,"line":13}},"selectionRange":{"end":{"character":13,"line":13},"start":{"character":4,"line":13}}},{"deprecated":false,"detail":"(List<List<T>> lists)","kind":12,"name":"flatten","range":{"end":{"character":1,"line":21},"start":{"character":0,"line":19}},"selectionRange":{"end":{"character":15,"line":19},"start":{"character":8,"line":19}}},{"deprecated":false,"detail":"(String s)","kind":12,"name":"reverseString","range":{"end":{"character":1,"line":25},"start":{"character":0,"line":23}},"selectionRange":{"end":{"character":20,"line":23},"start":{"character":7,"line":23}}},{"deprecated":false,"detail":"(double degrees)","kind":12,"name":"degreesToRadians","range":{"end":{"character":1,"line":29},"start":{"character":0,"line":27}},"selectionRange":{"end":{"character":23,"line":27},"start":{"character":7,"line":27}}}]}}
-{"time":1768944397563,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","id":380,"method":"textDocument/inlayHint","params":{"textDocument":{"uri":"file://{{workspaceFolder-0}}/lib/src/shared/utils/utils.dart"},"range":{"start":{"line":0,"character":0},"end":{"line":29,"character":1}}},"clientRequestTime":1768944397561}}
+{"time":1768944397563,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","id":380,"method":"textDocument/inlayHint","params":{"textDocument":{"uri":"{{workspaceFolder-0}}/lib/src/shared/utils/utils.dart"},"range":{"start":{"line":0,"character":0},"end":{"line":29,"character":1}}},"clientRequestTime":1768944397561}}
 {"time":1768944397563,"kind":"message","sender":"server","receiver":"ide","message":{"id":380,"jsonrpc":"2.0","result":[{"kind":2,"label":[{"location":{"range":{"end":{"character":28,"line":363},"start":{"character":23,"line":363}},"uri":"{{package-root:sky_engine}}lib/core/string.dart"},"value":"start:"}],"paddingRight":true,"position":{"character":42,"line":4}},{"kind":2,"label":[{"location":{"range":{"end":{"character":32,"line":546},"start":{"character":28,"line":546}},"uri":"{{package-root:sky_engine}}lib/core/string.dart"},"value":"from:"}],"paddingRight":true,"position":{"character":32,"line":8}},{"kind":2,"label":[{"location":{"range":{"end":{"character":48,"line":546},"start":{"character":41,"line":546}},"uri":"{{package-root:sky_engine}}lib/core/string.dart"},"value":"replace:"}],"paddingRight":true,"position":{"character":51,"line":8}},{"kind":2,"label":[{"location":{"range":{"end":{"character":17,"line":274},"start":{"character":11,"line":274}},"uri":"{{package-root:sky_engine}}lib/core/regexp.dart"},"value":"source:"}],"paddingRight":true,"position":{"character":39,"line":8}},{"kind":2,"label":[{"location":{"range":{"end":{"character":36,"line":676},"start":{"character":29,"line":676}},"uri":"{{package-root:sky_engine}}lib/core/string.dart"},"value":"pattern:"}],"paddingRight":true,"position":{"character":34,"line":9}},{"kind":2,"label":[{"location":{"range":{"end":{"character":31,"line":463},"start":{"character":22,"line":463}},"uri":"{{package-root:sky_engine}}lib/core/iterable.dart"},"value":"separator:"}],"paddingRight":true,"position":{"character":52,"line":9}},{"kind":2,"label":[{"location":{"range":{"end":{"character":29,"line":187},"start":{"character":22,"line":187}},"uri":"{{package-root:sky_engine}}lib/core/errors.dart"},"value":"message:"}],"paddingRight":true,"position":{"character":33,"line":14}},{"kind":2,"label":[{"location":{"range":{"end":{"character":19,"line":13},"start":{"character":18,"line":13}},"uri":"{{package-root:devtools_companion}}lib/src/shared/utils/utils.dart"},"value":"n:"}],"paddingRight":true,"position":{"character":23,"line":16}},{"kind":2,"label":[{"value":"toElements:"}],"paddingRight":true,"position":{"character":22,"line":20}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":17,"line":19},"start":{"character":16,"line":19}},"uri":"{{package-root:devtools_companion}}lib/src/shared/utils/utils.dart"},"value":"T"},{"value":">"}],"paddingRight":true,"position":{"character":23,"line":20}},{"kind":1,"label":[{"value":"<"},{"location":{"range":{"end":{"character":17,"line":19},"start":{"character":16,"line":19}},"uri":"{{package-root:devtools_companion}}lib/src/shared/utils/utils.dart"},"value":"T"},{"value":">"}],"position":{"character":21,"line":20}},{"kind":2,"label":[{"location":{"range":{"end":{"character":36,"line":676},"start":{"character":29,"line":676}},"uri":"{{package-root:sky_engine}}lib/core/string.dart"},"value":"pattern:"}],"paddingRight":true,"position":{"character":17,"line":24}},{"kind":2,"label":[{"location":{"range":{"end":{"character":31,"line":463},"start":{"character":22,"line":463}},"uri":"{{package-root:sky_engine}}lib/core/iterable.dart"},"value":"separator:"}],"paddingRight":true,"position":{"character":35,"line":24}}]}}
-{"time":1768944397765,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","id":381,"method":"textDocument/documentLink","params":{"textDocument":{"uri":"file://{{workspaceFolder-0}}/lib/src/shared/utils/utils.dart"}},"clientRequestTime":1768944397765}}
+{"time":1768944397765,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","id":381,"method":"textDocument/documentLink","params":{"textDocument":{"uri":"{{workspaceFolder-0}}/lib/src/shared/utils/utils.dart"}},"clientRequestTime":1768944397765}}
 {"time":1768944397765,"kind":"message","sender":"server","receiver":"ide","message":{"id":381,"jsonrpc":"2.0","result":[]}}
 {"time":1768944397779,"kind":"message","sender":"watcher","receiver":"server","message":{"path":"C:\\work\\devtools_companion\\lib\\src\\shared\\utils\\utils.dart","type":"modify"}}
 {"time":1768944397779,"kind":"message","sender":"server","receiver":"ide","message":{"id":110,"jsonrpc":"2.0","method":"window/workDoneProgress/create","params":{"token":"ANALYZING"}}}
 {"time":1768944397781,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","id":110,"result":null,"clientRequestTime":1768944397780}}
 {"time":1768944397781,"kind":"message","sender":"server","receiver":"ide","message":{"jsonrpc":"2.0","method":"$/progress","params":{"token":"ANALYZING","value":{"kind":"begin","title":"Analyzing…"}}}}
 {"time":1768944397781,"kind":"message","sender":"server","receiver":"ide","message":{"jsonrpc":"2.0","method":"$/progress","params":{"token":"ANALYZING","value":{"kind":"end"}}}}
-{"time":1768944398686,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","id":382,"method":"textDocument/codeAction","params":{"textDocument":{"uri":"file://{{workspaceFolder-0}}/lib/src/shared/utils/utils.dart"},"range":{"start":{"line":29,"character":1},"end":{"line":29,"character":1}},"context":{"diagnostics":[],"triggerKind":2}},"clientRequestTime":1768944398685}}
+{"time":1768944398686,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","id":382,"method":"textDocument/codeAction","params":{"textDocument":{"uri":"{{workspaceFolder-0}}/lib/src/shared/utils/utils.dart"},"range":{"start":{"line":29,"character":1},"end":{"line":29,"character":1}},"context":{"diagnostics":[],"triggerKind":2}},"clientRequestTime":1768944398685}}
 {"time":1768944398686,"kind":"message","sender":"server","receiver":"ide","message":{"id":111,"jsonrpc":"2.0","method":"window/workDoneProgress/create","params":{"token":"ANALYZING"}}}
 {"time":1768944398686,"kind":"message","sender":"server","receiver":"ide","message":{"id":382,"jsonrpc":"2.0","result":[{"command":{"arguments":[{"path":"C:\\work\\devtools_companion\\lib\\src\\shared\\utils\\utils.dart","autoTriggered":true}],"command":"dart.edit.sortMembers","title":"Sort Members"},"kind":"source.sortMembers","title":"Sort Members"},{"command":{"arguments":[{"path":"C:\\work\\devtools_companion\\lib\\src\\shared\\utils\\utils.dart","autoTriggered":true}],"command":"dart.edit.organizeImports","title":"Organize Imports"},"kind":"source.organizeImports","title":"Organize Imports"},{"command":{"arguments":[{"path":"C:\\work\\devtools_companion\\lib\\src\\shared\\utils\\utils.dart","autoTriggered":true}],"command":"dart.edit.fixAll","title":"Fix All"},"kind":"source.fixAll","title":"Fix All"}]}}
 {"time":1768944398687,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","id":111,"result":null,"clientRequestTime":1768944398687}}
@@ -258,5 +258,5 @@
 {"time":1768944400609,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","id":112,"result":null,"clientRequestTime":1768944400609}}
 {"time":1768944400609,"kind":"message","sender":"server","receiver":"ide","message":{"jsonrpc":"2.0","method":"$/progress","params":{"token":"ANALYZING","value":{"kind":"begin","title":"Analyzing…"}}}}
 {"time":1768944400609,"kind":"message","sender":"server","receiver":"ide","message":{"jsonrpc":"2.0","method":"$/progress","params":{"token":"ANALYZING","value":{"kind":"end"}}}}
-{"time":1768944400830,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","id":383,"method":"textDocument/codeLens","params":{"textDocument":{"uri":"file://{{workspaceFolder-0}}/lib/src/shared/utils/utils.dart"}},"clientRequestTime":1768944400829}}
+{"time":1768944400830,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","id":383,"method":"textDocument/codeLens","params":{"textDocument":{"uri":"{{workspaceFolder-0}}/lib/src/shared/utils/utils.dart"}},"clientRequestTime":1768944400829}}
 {"time":1768944400830,"kind":"message","sender":"server","receiver":"ide","message":{"id":383,"jsonrpc":"2.0","result":[]}}
diff --git a/pkg/analysis_server/tool/performance/scenarios/logs/package_build_find_references.json b/pkg/analysis_server/tool/performance/scenarios/logs/package_build_find_references.json
index 25a3f78..219697c 100644
--- a/pkg/analysis_server/tool/performance/scenarios/logs/package_build_find_references.json
+++ b/pkg/analysis_server/tool/performance/scenarios/logs/package_build_find_references.json
@@ -1,8 +1,8 @@
 {"time":1767818629504,"kind":"commandLine","argList":["--protocol=lsp","--port=49370","--client-id=VS-Code-Remote","--client-version=3.126.0","--with-fine-dependencies"]}
-{"time":1767818629796,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","id":0,"method":"initialize","params":{"processId":3937876,"clientInfo":{"name":"code-server","version":"1.98.2"},"locale":"en","rootPath":"{{workspaceFolder-0}}","rootUri":"file://{{workspaceFolder-0}}","capabilities":{"workspace":{"applyEdit":true,"workspaceEdit":{"documentChanges":true,"resourceOperations":["create","rename","delete"],"failureHandling":"textOnlyTransactional","normalizesLineEndings":true,"changeAnnotationSupport":{"groupsOnLabel":true}},"configuration":true,"didChangeWatchedFiles":{"dynamicRegistration":true,"relativePatternSupport":true},"symbol":{"dynamicRegistration":true,"symbolKind":{"valueSet":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26]},"tagSupport":{"valueSet":[1]},"resolveSupport":{"properties":["location.range"]}},"codeLens":{"refreshSupport":true},"executeCommand":{"dynamicRegistration":true},"didChangeConfiguration":{"dynamicRegistration":true},"workspaceFolders":true,"foldingRange":{"refreshSupport":true},"semanticTokens":{"refreshSupport":true},"fileOperations":{"dynamicRegistration":true,"didCreate":true,"didRename":true,"didDelete":true,"willCreate":true,"willRename":true,"willDelete":true},"inlineValue":{"refreshSupport":true},"inlayHint":{"refreshSupport":true},"diagnostics":{"refreshSupport":true}},"textDocument":{"publishDiagnostics":{"relatedInformation":true,"versionSupport":false,"tagSupport":{"valueSet":[1,2]},"codeDescriptionSupport":true,"dataSupport":true},"synchronization":{"dynamicRegistration":true,"willSave":true,"willSaveWaitUntil":true,"didSave":true},"completion":{"dynamicRegistration":true,"contextSupport":true,"completionItem":{"snippetSupport":true,"commitCharactersSupport":true,"documentationFormat":["markdown","plaintext"],"deprecatedSupport":true,"preselectSupport":true,"tagSupport":{"valueSet":[1]},"insertReplaceSupport":true,"resolveSupport":{"properties":["documentation","detail","additionalTextEdits"]},"insertTextModeSupport":{"valueSet":[1,2]},"labelDetailsSupport":true},"insertTextMode":2,"completionItemKind":{"valueSet":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25]},"completionList":{"itemDefaults":["commitCharacters","editRange","insertTextFormat","insertTextMode","data"]}},"hover":{"dynamicRegistration":true,"contentFormat":["markdown","plaintext"]},"signatureHelp":{"dynamicRegistration":true,"signatureInformation":{"documentationFormat":["markdown","plaintext"],"parameterInformation":{"labelOffsetSupport":true},"activeParameterSupport":true},"contextSupport":true},"definition":{"dynamicRegistration":true,"linkSupport":true},"references":{"dynamicRegistration":true},"documentHighlight":{"dynamicRegistration":true},"documentSymbol":{"dynamicRegistration":true,"symbolKind":{"valueSet":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26]},"hierarchicalDocumentSymbolSupport":true,"tagSupport":{"valueSet":[1]},"labelSupport":true},"codeAction":{"dynamicRegistration":true,"isPreferredSupport":true,"disabledSupport":true,"dataSupport":true,"resolveSupport":{"properties":["edit"]},"codeActionLiteralSupport":{"codeActionKind":{"valueSet":["","quickfix","refactor","refactor.extract","refactor.inline","refactor.rewrite","source","source.organizeImports"]}},"honorsChangeAnnotations":true},"codeLens":{"dynamicRegistration":true},"formatting":{"dynamicRegistration":true},"rangeFormatting":{"dynamicRegistration":true,"rangesSupport":true},"onTypeFormatting":{"dynamicRegistration":true},"rename":{"dynamicRegistration":true,"prepareSupport":true,"prepareSupportDefaultBehavior":1,"honorsChangeAnnotations":true},"documentLink":{"dynamicRegistration":true,"tooltipSupport":true},"typeDefinition":{"dynamicRegistration":true,"linkSupport":true},"implementation":{"dynamicRegistration":true,"linkSupport":true},"colorProvider":{"dynamicRegistration":true},"foldingRange":{"dynamicRegistration":true,"rangeLimit":5000,"lineFoldingOnly":true,"foldingRangeKind":{"valueSet":["comment","imports","region"]},"foldingRange":{"collapsedText":false}},"declaration":{"dynamicRegistration":true,"linkSupport":true},"selectionRange":{"dynamicRegistration":true},"callHierarchy":{"dynamicRegistration":true},"semanticTokens":{"dynamicRegistration":true,"tokenTypes":["namespace","type","class","enum","interface","struct","typeParameter","parameter","variable","property","enumMember","event","function","method","macro","keyword","modifier","comment","string","number","regexp","operator","decorator"],"tokenModifiers":["declaration","definition","readonly","static","deprecated","abstract","async","modification","documentation","defaultLibrary"],"formats":["relative"],"requests":{"range":true,"full":{"delta":true}},"multilineTokenSupport":false,"overlappingTokenSupport":false,"serverCancelSupport":true,"augmentsSyntaxTokens":true},"linkedEditingRange":{"dynamicRegistration":true},"typeHierarchy":{"dynamicRegistration":true},"inlineValue":{"dynamicRegistration":true},"inlayHint":{"dynamicRegistration":true,"resolveSupport":{"properties":["tooltip","textEdits","label.tooltip","label.location","label.command"]}},"diagnostic":{"dynamicRegistration":true,"relatedDocumentSupport":false}},"window":{"showMessage":{"messageActionItem":{"additionalPropertiesSupport":true}},"showDocument":{"support":true},"workDoneProgress":true},"general":{"staleRequestSupport":{"cancel":true,"retryOnContentModified":["textDocument/semanticTokens/full","textDocument/semanticTokens/range","textDocument/semanticTokens/full/delta"]},"regularExpressions":{"engine":"ECMAScript","version":"ES2020"},"markdown":{"parser":"marked","version":"1.1.0","allowedTags":["ul","li","p","code","blockquote","ol","h1","h2","h3","h4","h5","h6","hr","em","pre","table","thead","tbody","tr","th","td","div","del","a","strong","br","img","span"]},"positionEncodings":["utf-16"]},"notebookDocument":{"synchronization":{"dynamicRegistration":true,"executionSummarySupport":true}},"experimental":{"supportsWindowShowMessageRequest":true,"commands":["dart.goToLocation"],"dartCodeAction":{"commandParameterSupport":{"supportedKinds":["saveUri"]}},"snippetTextEdit":true}},"initializationOptions":{"allowOpenUri":true,"appHost":"server-distro","closingLabels":true,"flutterOutline":false,"hostKind":"server-distro","onlyAnalyzeProjectsWithOpenFiles":false,"outline":true,"previewSurveys":true,"remoteName":"127.0.0.1:49363","suggestFromUnimportedLibraries":true,"useInEditorDartFixPrompt":true},"trace":"off","workspaceFolders":[{"uri":"file://{{workspaceFolder-0}}","name":"build"}]},"clientRequestTime":1767818629794}}
+{"time":1767818629796,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","id":0,"method":"initialize","params":{"processId":3937876,"clientInfo":{"name":"code-server","version":"1.98.2"},"locale":"en","rootPath":"{{workspaceFolder-0:filePath}}","rootUri":"{{workspaceFolder-0}}","capabilities":{"workspace":{"applyEdit":true,"workspaceEdit":{"documentChanges":true,"resourceOperations":["create","rename","delete"],"failureHandling":"textOnlyTransactional","normalizesLineEndings":true,"changeAnnotationSupport":{"groupsOnLabel":true}},"configuration":true,"didChangeWatchedFiles":{"dynamicRegistration":true,"relativePatternSupport":true},"symbol":{"dynamicRegistration":true,"symbolKind":{"valueSet":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26]},"tagSupport":{"valueSet":[1]},"resolveSupport":{"properties":["location.range"]}},"codeLens":{"refreshSupport":true},"executeCommand":{"dynamicRegistration":true},"didChangeConfiguration":{"dynamicRegistration":true},"workspaceFolders":true,"foldingRange":{"refreshSupport":true},"semanticTokens":{"refreshSupport":true},"fileOperations":{"dynamicRegistration":true,"didCreate":true,"didRename":true,"didDelete":true,"willCreate":true,"willRename":true,"willDelete":true},"inlineValue":{"refreshSupport":true},"inlayHint":{"refreshSupport":true},"diagnostics":{"refreshSupport":true}},"textDocument":{"publishDiagnostics":{"relatedInformation":true,"versionSupport":false,"tagSupport":{"valueSet":[1,2]},"codeDescriptionSupport":true,"dataSupport":true},"synchronization":{"dynamicRegistration":true,"willSave":true,"willSaveWaitUntil":true,"didSave":true},"completion":{"dynamicRegistration":true,"contextSupport":true,"completionItem":{"snippetSupport":true,"commitCharactersSupport":true,"documentationFormat":["markdown","plaintext"],"deprecatedSupport":true,"preselectSupport":true,"tagSupport":{"valueSet":[1]},"insertReplaceSupport":true,"resolveSupport":{"properties":["documentation","detail","additionalTextEdits"]},"insertTextModeSupport":{"valueSet":[1,2]},"labelDetailsSupport":true},"insertTextMode":2,"completionItemKind":{"valueSet":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25]},"completionList":{"itemDefaults":["commitCharacters","editRange","insertTextFormat","insertTextMode","data"]}},"hover":{"dynamicRegistration":true,"contentFormat":["markdown","plaintext"]},"signatureHelp":{"dynamicRegistration":true,"signatureInformation":{"documentationFormat":["markdown","plaintext"],"parameterInformation":{"labelOffsetSupport":true},"activeParameterSupport":true},"contextSupport":true},"definition":{"dynamicRegistration":true,"linkSupport":true},"references":{"dynamicRegistration":true},"documentHighlight":{"dynamicRegistration":true},"documentSymbol":{"dynamicRegistration":true,"symbolKind":{"valueSet":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26]},"hierarchicalDocumentSymbolSupport":true,"tagSupport":{"valueSet":[1]},"labelSupport":true},"codeAction":{"dynamicRegistration":true,"isPreferredSupport":true,"disabledSupport":true,"dataSupport":true,"resolveSupport":{"properties":["edit"]},"codeActionLiteralSupport":{"codeActionKind":{"valueSet":["","quickfix","refactor","refactor.extract","refactor.inline","refactor.rewrite","source","source.organizeImports"]}},"honorsChangeAnnotations":true},"codeLens":{"dynamicRegistration":true},"formatting":{"dynamicRegistration":true},"rangeFormatting":{"dynamicRegistration":true,"rangesSupport":true},"onTypeFormatting":{"dynamicRegistration":true},"rename":{"dynamicRegistration":true,"prepareSupport":true,"prepareSupportDefaultBehavior":1,"honorsChangeAnnotations":true},"documentLink":{"dynamicRegistration":true,"tooltipSupport":true},"typeDefinition":{"dynamicRegistration":true,"linkSupport":true},"implementation":{"dynamicRegistration":true,"linkSupport":true},"colorProvider":{"dynamicRegistration":true},"foldingRange":{"dynamicRegistration":true,"rangeLimit":5000,"lineFoldingOnly":true,"foldingRangeKind":{"valueSet":["comment","imports","region"]},"foldingRange":{"collapsedText":false}},"declaration":{"dynamicRegistration":true,"linkSupport":true},"selectionRange":{"dynamicRegistration":true},"callHierarchy":{"dynamicRegistration":true},"semanticTokens":{"dynamicRegistration":true,"tokenTypes":["namespace","type","class","enum","interface","struct","typeParameter","parameter","variable","property","enumMember","event","function","method","macro","keyword","modifier","comment","string","number","regexp","operator","decorator"],"tokenModifiers":["declaration","definition","readonly","static","deprecated","abstract","async","modification","documentation","defaultLibrary"],"formats":["relative"],"requests":{"range":true,"full":{"delta":true}},"multilineTokenSupport":false,"overlappingTokenSupport":false,"serverCancelSupport":true,"augmentsSyntaxTokens":true},"linkedEditingRange":{"dynamicRegistration":true},"typeHierarchy":{"dynamicRegistration":true},"inlineValue":{"dynamicRegistration":true},"inlayHint":{"dynamicRegistration":true,"resolveSupport":{"properties":["tooltip","textEdits","label.tooltip","label.location","label.command"]}},"diagnostic":{"dynamicRegistration":true,"relatedDocumentSupport":false}},"window":{"showMessage":{"messageActionItem":{"additionalPropertiesSupport":true}},"showDocument":{"support":true},"workDoneProgress":true},"general":{"staleRequestSupport":{"cancel":true,"retryOnContentModified":["textDocument/semanticTokens/full","textDocument/semanticTokens/range","textDocument/semanticTokens/full/delta"]},"regularExpressions":{"engine":"ECMAScript","version":"ES2020"},"markdown":{"parser":"marked","version":"1.1.0","allowedTags":["ul","li","p","code","blockquote","ol","h1","h2","h3","h4","h5","h6","hr","em","pre","table","thead","tbody","tr","th","td","div","del","a","strong","br","img","span"]},"positionEncodings":["utf-16"]},"notebookDocument":{"synchronization":{"dynamicRegistration":true,"executionSummarySupport":true}},"experimental":{"supportsWindowShowMessageRequest":true,"commands":["dart.goToLocation"],"dartCodeAction":{"commandParameterSupport":{"supportedKinds":["saveUri"]}},"snippetTextEdit":true}},"initializationOptions":{"allowOpenUri":true,"appHost":"server-distro","closingLabels":true,"flutterOutline":false,"hostKind":"server-distro","onlyAnalyzeProjectsWithOpenFiles":false,"outline":true,"previewSurveys":true,"remoteName":"127.0.0.1:49363","suggestFromUnimportedLibraries":true,"useInEditorDartFixPrompt":true},"trace":"off","workspaceFolders":[{"uri":"{{workspaceFolder-0}}","name":"build"}]},"clientRequestTime":1767818629794}}
 {"time":1767818629820,"kind":"message","sender":"server","receiver":"ide","message":{"id":0,"jsonrpc":"2.0","result":{"capabilities":{"executeCommandProvider":{"commands":["dart.edit.codeAction.apply","dart.edit.sortMembers","dart.edit.organizeImports","dart.edit.fixAll","dart.edit.fixAllInWorkspace.preview","dart.edit.fixAllInWorkspace","dart.edit.sendWorkspaceEdit","refactor.perform","refactor.validate","dart.logAction","dart.refactor.convert_all_formal_parameters_to_named","dart.refactor.convert_selected_formal_parameters_to_named","dart.refactor.move_selected_formal_parameters_left","dart.refactor.move_top_level_to_file"],"workDoneProgress":true},"experimental":{"updateDiagnosticInformation":{},"textDocument":{"super":{},"augmented":{},"augmentation":{}}},"workspace":{"workspaceFolders":{"changeNotifications":true,"supported":true}},"workspaceSymbolProvider":true},"serverInfo":{"name":"Dart SDK LSP Analysis Server","version":"3.11.0-edge"}}}}
 {"time":1767818629824,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","method":"initialized","params":{},"clientRequestTime":1767818629823}}
-{"time":1767818629826,"kind":"message","sender":"server","receiver":"ide","message":{"id":1,"jsonrpc":"2.0","method":"workspace/configuration","params":{"items":[{"scopeUri":"file://{{workspaceFolder-0}}","section":"dart"},{"section":"dart"}]}}}
+{"time":1767818629826,"kind":"message","sender":"server","receiver":"ide","message":{"id":1,"jsonrpc":"2.0","method":"workspace/configuration","params":{"items":[{"scopeUri":"{{workspaceFolder-0}}","section":"dart"},{"section":"dart"}]}}}
 {"time":1767818629826,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","id":1,"result":[{"analysisExcludedFolders":[],"clientRequestTime":1767818629826}]}}
 {"time":1767818732257,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","id":206,"method":"textDocument/hover","params":{"textDocument":{"uri":"{{package-root:build_workspace}}build/lib/src/asset_id.dart"},"position":{"line":7,"character":10}},"clientRequestTime":1767818732256}}
 {"time":1767818732257,"kind":"message","sender":"server","receiver":"ide","message":{"id":206,"jsonrpc":"2.0","result":{"contents":{"kind":"markdown","value":"```dart\nclass AssetId implements Comparable<AssetId>\n```\nDeclared in _package:build/src/asset_id.dart_.\n\n---\nA file in a `build_runner` build."},"range":{"end":{"character":13,"line":7},"start":{"character":6,"line":7}}}}}
@@ -10,7 +10,7 @@
 {"time":1767818732375,"kind":"message","sender":"server","receiver":"ide","message":{"id":207,"jsonrpc":"2.0","result":[{"range":{"end":{"character":13,"line":7},"start":{"character":6,"line":7}}},{"range":{"end":{"character":43,"line":7},"start":{"character":36,"line":7}}},{"range":{"end":{"character":17,"line":26},"start":{"character":10,"line":26}}},{"range":{"end":{"character":25,"line":34},"start":{"character":18,"line":34}}},{"range":{"end":{"character":17,"line":50},"start":{"character":10,"line":50}}},{"range":{"end":{"character":43,"line":50},"start":{"character":36,"line":50}}},{"range":{"end":{"character":24,"line":75},"start":{"character":17,"line":75}}},{"range":{"end":{"character":18,"line":79},"start":{"character":11,"line":79}}},{"range":{"end":{"character":17,"line":81},"start":{"character":10,"line":81}}},{"range":{"end":{"character":25,"line":95},"start":{"character":18,"line":95}}},{"range":{"end":{"character":9,"line":96},"start":{"character":2,"line":96}}},{"range":{"end":{"character":25,"line":98},"start":{"character":18,"line":98}}},{"range":{"end":{"character":9,"line":100},"start":{"character":2,"line":100}}},{"range":{"end":{"character":9,"line":104},"start":{"character":2,"line":104}}},{"range":{"end":{"character":30,"line":108},"start":{"character":23,"line":108}}},{"range":{"end":{"character":18,"line":110},"start":{"character":11,"line":110}}},{"range":{"end":{"character":22,"line":115},"start":{"character":15,"line":115}}},{"range":{"end":{"character":23,"line":121},"start":{"character":16,"line":121}}},{"range":{"end":{"character":20,"line":128},"start":{"character":13,"line":128}}},{"range":{"end":{"character":25,"line":150},"start":{"character":18,"line":150}}}]}}
 {"time":1767818732724,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","id":208,"method":"textDocument/codeAction","params":{"textDocument":{"uri":"{{package-root:build_workspace}}build/lib/src/asset_id.dart"},"range":{"start":{"line":7,"character":6},"end":{"line":7,"character":13}},"context":{"diagnostics":[],"triggerKind":2}},"clientRequestTime":1767818732724}}
 {"time":1767818732725,"kind":"message","sender":"server","receiver":"ide","message":{"id":53,"jsonrpc":"2.0","method":"window/workDoneProgress/create","params":{"token":"ANALYZING"}}}
-{"time":1767818732725,"kind":"message","sender":"server","receiver":"ide","message":{"id":208,"jsonrpc":"2.0","result":[{"command":{"arguments":[{"path":"{{workspaceFolder-0}}/build/lib/src/asset_id.dart","autoTriggered":true}],"command":"dart.edit.sortMembers","title":"Sort Members"},"kind":"source.sortMembers","title":"Sort Members"},{"command":{"arguments":[{"path":"{{workspaceFolder-0}}/build/lib/src/asset_id.dart","autoTriggered":true}],"command":"dart.edit.organizeImports","title":"Organize Imports"},"kind":"source.organizeImports","title":"Organize Imports"},{"command":{"arguments":[{"path":"{{workspaceFolder-0}}/build/lib/src/asset_id.dart","autoTriggered":true}],"command":"dart.edit.fixAll","title":"Fix All"},"kind":"source.fixAll","title":"Fix All"},{"command":{"arguments":[{"filePath":"{{workspaceFolder-0}}/build/lib/src/asset_id.dart","selectionOffset":300,"selectionLength":7,"arguments":["{{package-root:build_workspace}}build/lib/src/asset_id.dart"]}],"command":"dart.refactor.move_top_level_to_file","title":"Move 'AssetId' to file"},"data":{"parameters":[{"actionLabel":"Move","defaultValue":"{{package-root:build_workspace}}build/lib/src/asset_id.dart","filters":{"Dart":["dart"]},"kind":"saveUri","parameterLabel":"Move to:","parameterTitle":"Select a file to move to"}]},"kind":"refactor.move","title":"Move 'AssetId' to file"}]}}
+{"time":1767818732725,"kind":"message","sender":"server","receiver":"ide","message":{"id":208,"jsonrpc":"2.0","result":[{"command":{"arguments":[{"path":"{{workspaceFolder-0:filePath}}/build/lib/src/asset_id.dart","autoTriggered":true}],"command":"dart.edit.sortMembers","title":"Sort Members"},"kind":"source.sortMembers","title":"Sort Members"},{"command":{"arguments":[{"path":"{{workspaceFolder-0:filePath}}/build/lib/src/asset_id.dart","autoTriggered":true}],"command":"dart.edit.organizeImports","title":"Organize Imports"},"kind":"source.organizeImports","title":"Organize Imports"},{"command":{"arguments":[{"path":"{{workspaceFolder-0:filePath}}/build/lib/src/asset_id.dart","autoTriggered":true}],"command":"dart.edit.fixAll","title":"Fix All"},"kind":"source.fixAll","title":"Fix All"},{"command":{"arguments":[{"filePath":"{{workspaceFolder-0:filePath}}/build/lib/src/asset_id.dart","selectionOffset":300,"selectionLength":7,"arguments":["{{package-root:build_workspace}}build/lib/src/asset_id.dart"]}],"command":"dart.refactor.move_top_level_to_file","title":"Move 'AssetId' to file"},"data":{"parameters":[{"actionLabel":"Move","defaultValue":"{{package-root:build_workspace}}build/lib/src/asset_id.dart","filters":{"Dart":["dart"]},"kind":"saveUri","parameterLabel":"Move to:","parameterTitle":"Select a file to move to"}]},"kind":"refactor.move","title":"Move 'AssetId' to file"}]}}
 {"time":1767818732726,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","id":53,"result":null,"clientRequestTime":1767818732726}}
 {"time":1767818732726,"kind":"message","sender":"server","receiver":"ide","message":{"jsonrpc":"2.0","method":"$/progress","params":{"token":"ANALYZING","value":{"kind":"begin","title":"Analyzing…"}}}}
 {"time":1767818732726,"kind":"message","sender":"server","receiver":"ide","message":{"jsonrpc":"2.0","method":"$/progress","params":{"token":"ANALYZING","value":{"kind":"end"}}}}
diff --git a/pkg/analysis_server/tool/performance/scenarios/logs/project_pigeon_format_generated_file.json b/pkg/analysis_server/tool/performance/scenarios/logs/project_pigeon_format_generated_file.json
index ddb7701..3aa93c9 100644
--- a/pkg/analysis_server/tool/performance/scenarios/logs/project_pigeon_format_generated_file.json
+++ b/pkg/analysis_server/tool/performance/scenarios/logs/project_pigeon_format_generated_file.json
@@ -1,22 +1,22 @@
 {"time":1771003751266,"kind":"commandLine","argList":["--protocol=lsp","--client-id=VS-Code","--client-version=3.128.0","--session-log=/Users/keertip/vscode.json","--enable-experiment=primary-constructors"]}
-{"time":1771003751298,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","id":0,"method":"initialize","params":{"processId":26504,"clientInfo":{"name":"Visual Studio Code","version":"1.109.1"},"locale":"en","rootPath":"{{workspaceFolder-0}}","rootUri":"file://{{workspaceFolder-0}}","capabilities":{"workspace":{"applyEdit":true,"workspaceEdit":{"documentChanges":true,"resourceOperations":["create","rename","delete"],"failureHandling":"textOnlyTransactional","normalizesLineEndings":true,"changeAnnotationSupport":{"groupsOnLabel":true}},"configuration":true,"didChangeWatchedFiles":{"dynamicRegistration":true,"relativePatternSupport":true},"symbol":{"dynamicRegistration":true,"symbolKind":{"valueSet":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26]},"tagSupport":{"valueSet":[1]},"resolveSupport":{"properties":["location.range"]}},"codeLens":{"refreshSupport":true},"executeCommand":{"dynamicRegistration":true},"didChangeConfiguration":{"dynamicRegistration":true},"workspaceFolders":true,"foldingRange":{"refreshSupport":true},"semanticTokens":{"refreshSupport":true},"fileOperations":{"dynamicRegistration":true,"didCreate":true,"didRename":true,"didDelete":true,"willCreate":true,"willRename":true,"willDelete":true},"inlineValue":{"refreshSupport":true},"inlayHint":{"refreshSupport":true},"diagnostics":{"refreshSupport":true}},"textDocument":{"publishDiagnostics":{"relatedInformation":true,"versionSupport":false,"tagSupport":{"valueSet":[1,2]},"codeDescriptionSupport":true,"dataSupport":true},"synchronization":{"dynamicRegistration":true,"willSave":true,"willSaveWaitUntil":true,"didSave":true},"completion":{"dynamicRegistration":true,"contextSupport":true,"completionItem":{"snippetSupport":true,"commitCharactersSupport":true,"documentationFormat":["markdown","plaintext"],"deprecatedSupport":true,"preselectSupport":true,"tagSupport":{"valueSet":[1]},"insertReplaceSupport":true,"resolveSupport":{"properties":["documentation","detail","additionalTextEdits"]},"insertTextModeSupport":{"valueSet":[1,2]},"labelDetailsSupport":true},"insertTextMode":2,"completionItemKind":{"valueSet":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25]},"completionList":{"itemDefaults":["commitCharacters","editRange","insertTextFormat","insertTextMode","data"]}},"hover":{"dynamicRegistration":true,"contentFormat":["markdown","plaintext"]},"signatureHelp":{"dynamicRegistration":true,"signatureInformation":{"documentationFormat":["markdown","plaintext"],"parameterInformation":{"labelOffsetSupport":true},"activeParameterSupport":true},"contextSupport":true},"definition":{"dynamicRegistration":true,"linkSupport":true},"references":{"dynamicRegistration":true},"documentHighlight":{"dynamicRegistration":true},"documentSymbol":{"dynamicRegistration":true,"symbolKind":{"valueSet":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26]},"hierarchicalDocumentSymbolSupport":true,"tagSupport":{"valueSet":[1]},"labelSupport":true},"codeAction":{"dynamicRegistration":true,"isPreferredSupport":true,"disabledSupport":true,"dataSupport":true,"resolveSupport":{"properties":["edit"]},"codeActionLiteralSupport":{"codeActionKind":{"valueSet":["","quickfix","refactor","refactor.extract","refactor.inline","refactor.rewrite","source","source.organizeImports"]}},"honorsChangeAnnotations":true},"codeLens":{"dynamicRegistration":true},"formatting":{"dynamicRegistration":true},"rangeFormatting":{"dynamicRegistration":true,"rangesSupport":true},"onTypeFormatting":{"dynamicRegistration":true},"rename":{"dynamicRegistration":true,"prepareSupport":true,"prepareSupportDefaultBehavior":1,"honorsChangeAnnotations":true},"documentLink":{"dynamicRegistration":true,"tooltipSupport":true},"typeDefinition":{"dynamicRegistration":true,"linkSupport":true},"implementation":{"dynamicRegistration":true,"linkSupport":true},"colorProvider":{"dynamicRegistration":true},"foldingRange":{"dynamicRegistration":true,"rangeLimit":5000,"lineFoldingOnly":true,"foldingRangeKind":{"valueSet":["comment","imports","region"]},"foldingRange":{"collapsedText":false}},"declaration":{"dynamicRegistration":true,"linkSupport":true},"selectionRange":{"dynamicRegistration":true},"callHierarchy":{"dynamicRegistration":true},"semanticTokens":{"dynamicRegistration":true,"tokenTypes":["namespace","type","class","enum","interface","struct","typeParameter","parameter","variable","property","enumMember","event","function","method","macro","keyword","modifier","comment","string","number","regexp","operator","decorator"],"tokenModifiers":["declaration","definition","readonly","static","deprecated","abstract","async","modification","documentation","defaultLibrary"],"formats":["relative"],"requests":{"range":true,"full":{"delta":true}},"multilineTokenSupport":false,"overlappingTokenSupport":false,"serverCancelSupport":true,"augmentsSyntaxTokens":true},"linkedEditingRange":{"dynamicRegistration":true},"typeHierarchy":{"dynamicRegistration":true},"inlineValue":{"dynamicRegistration":true},"inlayHint":{"dynamicRegistration":true,"resolveSupport":{"properties":["tooltip","textEdits","label.tooltip","label.location","label.command"]}},"diagnostic":{"dynamicRegistration":true,"relatedDocumentSupport":false}},"window":{"showMessage":{"messageActionItem":{"additionalPropertiesSupport":true}},"showDocument":{"support":true},"workDoneProgress":true},"general":{"staleRequestSupport":{"cancel":true,"retryOnContentModified":["textDocument/semanticTokens/full","textDocument/semanticTokens/range","textDocument/semanticTokens/full/delta"]},"regularExpressions":{"engine":"ECMAScript","version":"ES2020"},"markdown":{"parser":"marked","version":"1.1.0","allowedTags":["ul","li","p","code","blockquote","ol","h1","h2","h3","h4","h5","h6","hr","em","pre","table","thead","tbody","tr","th","td","div","del","a","strong","br","img","span"]},"positionEncodings":["utf-16"]},"notebookDocument":{"synchronization":{"dynamicRegistration":true,"executionSummarySupport":true}},"experimental":{"supportsWindowShowMessageRequest":true,"commands":["dart.goToLocation"],"dartCodeAction":{"commandParameterSupport":{"supportedKinds":["saveUri"]}},"snippetTextEdit":true}},"initializationOptions":{"allowOpenUri":true,"appHost":"desktop","closingLabels":true,"flutterOutline":true,"onlyAnalyzeProjectsWithOpenFiles":false,"outline":true,"previewSurveys":true,"suggestFromUnimportedLibraries":true,"useInEditorDartFixPrompt":true},"trace":"off","workspaceFolders":[{"uri":"file://{{workspaceFolder-0}}","name":"pigeon"}]},"clientRequestTime":1771003750961}}
+{"time":1771003751298,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","id":0,"method":"initialize","params":{"processId":26504,"clientInfo":{"name":"Visual Studio Code","version":"1.109.1"},"locale":"en","rootPath":"{{workspaceFolder-0:filePath}}","rootUri":"{{workspaceFolder-0}}","capabilities":{"workspace":{"applyEdit":true,"workspaceEdit":{"documentChanges":true,"resourceOperations":["create","rename","delete"],"failureHandling":"textOnlyTransactional","normalizesLineEndings":true,"changeAnnotationSupport":{"groupsOnLabel":true}},"configuration":true,"didChangeWatchedFiles":{"dynamicRegistration":true,"relativePatternSupport":true},"symbol":{"dynamicRegistration":true,"symbolKind":{"valueSet":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26]},"tagSupport":{"valueSet":[1]},"resolveSupport":{"properties":["location.range"]}},"codeLens":{"refreshSupport":true},"executeCommand":{"dynamicRegistration":true},"didChangeConfiguration":{"dynamicRegistration":true},"workspaceFolders":true,"foldingRange":{"refreshSupport":true},"semanticTokens":{"refreshSupport":true},"fileOperations":{"dynamicRegistration":true,"didCreate":true,"didRename":true,"didDelete":true,"willCreate":true,"willRename":true,"willDelete":true},"inlineValue":{"refreshSupport":true},"inlayHint":{"refreshSupport":true},"diagnostics":{"refreshSupport":true}},"textDocument":{"publishDiagnostics":{"relatedInformation":true,"versionSupport":false,"tagSupport":{"valueSet":[1,2]},"codeDescriptionSupport":true,"dataSupport":true},"synchronization":{"dynamicRegistration":true,"willSave":true,"willSaveWaitUntil":true,"didSave":true},"completion":{"dynamicRegistration":true,"contextSupport":true,"completionItem":{"snippetSupport":true,"commitCharactersSupport":true,"documentationFormat":["markdown","plaintext"],"deprecatedSupport":true,"preselectSupport":true,"tagSupport":{"valueSet":[1]},"insertReplaceSupport":true,"resolveSupport":{"properties":["documentation","detail","additionalTextEdits"]},"insertTextModeSupport":{"valueSet":[1,2]},"labelDetailsSupport":true},"insertTextMode":2,"completionItemKind":{"valueSet":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25]},"completionList":{"itemDefaults":["commitCharacters","editRange","insertTextFormat","insertTextMode","data"]}},"hover":{"dynamicRegistration":true,"contentFormat":["markdown","plaintext"]},"signatureHelp":{"dynamicRegistration":true,"signatureInformation":{"documentationFormat":["markdown","plaintext"],"parameterInformation":{"labelOffsetSupport":true},"activeParameterSupport":true},"contextSupport":true},"definition":{"dynamicRegistration":true,"linkSupport":true},"references":{"dynamicRegistration":true},"documentHighlight":{"dynamicRegistration":true},"documentSymbol":{"dynamicRegistration":true,"symbolKind":{"valueSet":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26]},"hierarchicalDocumentSymbolSupport":true,"tagSupport":{"valueSet":[1]},"labelSupport":true},"codeAction":{"dynamicRegistration":true,"isPreferredSupport":true,"disabledSupport":true,"dataSupport":true,"resolveSupport":{"properties":["edit"]},"codeActionLiteralSupport":{"codeActionKind":{"valueSet":["","quickfix","refactor","refactor.extract","refactor.inline","refactor.rewrite","source","source.organizeImports"]}},"honorsChangeAnnotations":true},"codeLens":{"dynamicRegistration":true},"formatting":{"dynamicRegistration":true},"rangeFormatting":{"dynamicRegistration":true,"rangesSupport":true},"onTypeFormatting":{"dynamicRegistration":true},"rename":{"dynamicRegistration":true,"prepareSupport":true,"prepareSupportDefaultBehavior":1,"honorsChangeAnnotations":true},"documentLink":{"dynamicRegistration":true,"tooltipSupport":true},"typeDefinition":{"dynamicRegistration":true,"linkSupport":true},"implementation":{"dynamicRegistration":true,"linkSupport":true},"colorProvider":{"dynamicRegistration":true},"foldingRange":{"dynamicRegistration":true,"rangeLimit":5000,"lineFoldingOnly":true,"foldingRangeKind":{"valueSet":["comment","imports","region"]},"foldingRange":{"collapsedText":false}},"declaration":{"dynamicRegistration":true,"linkSupport":true},"selectionRange":{"dynamicRegistration":true},"callHierarchy":{"dynamicRegistration":true},"semanticTokens":{"dynamicRegistration":true,"tokenTypes":["namespace","type","class","enum","interface","struct","typeParameter","parameter","variable","property","enumMember","event","function","method","macro","keyword","modifier","comment","string","number","regexp","operator","decorator"],"tokenModifiers":["declaration","definition","readonly","static","deprecated","abstract","async","modification","documentation","defaultLibrary"],"formats":["relative"],"requests":{"range":true,"full":{"delta":true}},"multilineTokenSupport":false,"overlappingTokenSupport":false,"serverCancelSupport":true,"augmentsSyntaxTokens":true},"linkedEditingRange":{"dynamicRegistration":true},"typeHierarchy":{"dynamicRegistration":true},"inlineValue":{"dynamicRegistration":true},"inlayHint":{"dynamicRegistration":true,"resolveSupport":{"properties":["tooltip","textEdits","label.tooltip","label.location","label.command"]}},"diagnostic":{"dynamicRegistration":true,"relatedDocumentSupport":false}},"window":{"showMessage":{"messageActionItem":{"additionalPropertiesSupport":true}},"showDocument":{"support":true},"workDoneProgress":true},"general":{"staleRequestSupport":{"cancel":true,"retryOnContentModified":["textDocument/semanticTokens/full","textDocument/semanticTokens/range","textDocument/semanticTokens/full/delta"]},"regularExpressions":{"engine":"ECMAScript","version":"ES2020"},"markdown":{"parser":"marked","version":"1.1.0","allowedTags":["ul","li","p","code","blockquote","ol","h1","h2","h3","h4","h5","h6","hr","em","pre","table","thead","tbody","tr","th","td","div","del","a","strong","br","img","span"]},"positionEncodings":["utf-16"]},"notebookDocument":{"synchronization":{"dynamicRegistration":true,"executionSummarySupport":true}},"experimental":{"supportsWindowShowMessageRequest":true,"commands":["dart.goToLocation"],"dartCodeAction":{"commandParameterSupport":{"supportedKinds":["saveUri"]}},"snippetTextEdit":true}},"initializationOptions":{"allowOpenUri":true,"appHost":"desktop","closingLabels":true,"flutterOutline":true,"onlyAnalyzeProjectsWithOpenFiles":false,"outline":true,"previewSurveys":true,"suggestFromUnimportedLibraries":true,"useInEditorDartFixPrompt":true},"trace":"off","workspaceFolders":[{"uri":"{{workspaceFolder-0}}","name":"pigeon"}]},"clientRequestTime":1771003750961}}
 {"time":1771003751308,"kind":"message","sender":"server","receiver":"ide","message":{"id":0,"jsonrpc":"2.0","result":{"capabilities":{"executeCommandProvider":{"commands":["dart.edit.codeAction.apply","dart.edit.sortMembers","dart.edit.organizeImports","dart.edit.fixAll","dart.edit.fixAllInWorkspace.preview","dart.edit.fixAllInWorkspace","dart.edit.sendWorkspaceEdit","refactor.perform","refactor.validate","dart.logAction","dart.refactor.convert_all_formal_parameters_to_named","dart.refactor.convert_selected_formal_parameters_to_named","dart.refactor.move_selected_formal_parameters_left","dart.refactor.move_top_level_to_file"],"workDoneProgress":true},"experimental":{"updateDiagnosticInformation":{},"textDocument":{"super":{},"augmented":{},"augmentation":{}}},"workspace":{"workspaceFolders":{"changeNotifications":true,"supported":true}},"workspaceSymbolProvider":true},"serverInfo":{"name":"Dart SDK LSP Analysis Server","version":"3.12.0-edge.e1928bc20f24a68a322a14857f18296d6c05f413"}}}}
 {"time":1771003751310,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","method":"initialized","params":{},"clientRequestTime":1771003751310}}
-{"time":1771003752942,"kind":"message","sender":"server","receiver":"ide","message":{"id":5,"jsonrpc":"2.0","method":"workspace/configuration","params":{"items":[{"scopeUri":"file://{{workspaceFolder-0}}","section":"dart"},{"section":"dart"}]}}}
+{"time":1771003752942,"kind":"message","sender":"server","receiver":"ide","message":{"id":5,"jsonrpc":"2.0","method":"workspace/configuration","params":{"items":[{"scopeUri":"{{workspaceFolder-0}}","section":"dart"},{"section":"dart"}]}}}
 {"time":1771003752949,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","id":5,"result":[{"analysisExcludedFolders":[],"analyzerAdditionalArgs":["--session-log=/Users/keertip/vscode.json","--enable-experiment=primary-constructors"],"analyzerVmAdditionalArgs":[],"analyzerDiagnosticsPort":null,"analyzerPath":null,"analyzerSshHost":null,"analyzerVmServicePort":null,"includeDependenciesInWorkspaceSymbols":true,"notifyAnalyzerErrors":true,"showTodos":false,"showExtensionRecommendations":true,"devToolsBrowser":"chrome","devToolsPort":null,"devToolsReuseWindows":true,"devToolsTheme":"dark","devToolsLocation":{"default":"beside","inspector":"sidebar"},"openDevTools":"never","closeDevTools":"never","shareDevToolsWithFlutter":true,"showInspectorNotificationsForWidgetErrors":true,"customDevTools":{},"autoImportCompletions":true,"automaticCommentSlashes":"tripleSlash","closingLabels":true,"closingLabelsPrefix":" // ","closingLabelsTextStyle":"normal","completeFunctionCalls":true,"documentation":"full","dtdEditorActiveLocationDelay":200,"enableServerSnippets":true,"hotReloadPatterns":[],"enableCompletionCommitCharacters":false,"enableSdkFormatter":true,"enableSnippets":true,"inlayHints":true,"insertArgumentPlaceholders":true,"lineLength":80,"lspSnippetTextEdits":true,"renameFilesWithClasses":"never","showDartPadSampleCodeLens":true,"showMainCodeLens":true,"showTestCodeLens":true,"updateImportsOnRename":true,"warnWhenEditingFilesOutsideWorkspace":true,"warnWhenEditingFilesInPubCache":true,"flutterAdbConnectOnChromeOs":false,"flutterAdditionalArgs":[],"flutterAttachAdditionalArgs":[],"flutterCreateAndroidLanguage":"kotlin","flutterCreateIOSLanguage":"swift","flutterCreatePlatforms":null,"offline":false,"flutterCreateOrganization":null,"flutterCustomEmulators":[],"flutterGutterIcons":true,"flutterHotReloadOnSave":"manual","hotReloadOnSave":"never","flutterGenerateLocalizationsOnSave":"never","flutterOutline":true,"flutterRunAdditionalArgs":[],"flutterScreenshotPath":null,"flutterRememberSelectedDevice":true,"flutterSelectDeviceWhenConnected":true,"flutterShowEmulators":"local","flutterShowWebServerDevice":"remote","flutterTestAdditionalArgs":[],"flutterWebRenderer":"flutter-default","flutterWidgetPreview":"startLazily","flutterWidgetPreviewLocation":"sidebar","useFlutterDev":false,"analyzerInstrumentationLogFile":null,"analyzerLogFile":null,"toolingDaemonLogFile":null,"dapLogFile":null,"devToolsLogFile":null,"extensionLogFile":null,"flutterDaemonLogFile":null,"flutterWidgetPreviewLogFile":null,"mcpServerLogFile":null,"maxLogLineLength":2000,"maxCompletionItems":100000,"enablePub":true,"promptToGetPackages":true,"pubAdditionalArgs":[],"runPubGetOnPubspecChanges":"always","runPubGetOnNestedProjects":"none","buildRunnerAdditionalArgs":[],"cliConsole":"debugConsole","debugExtensionBackendProtocol":"ws","debugSdkLibraries":false,"debugExternalPackageLibraries":false,"evaluateGettersInDebugViews":true,"showGettersInDebugViews":true,"evaluateToStringInDebugViews":true,"hotReloadProgress":"notification","promptToRunIfErrors":true,"showDartDeveloperLogs":true,"showDebuggerNumbersAsHex":false,"showDevToolsDebugToolBarButtons":true,"suppressTestTimeouts":"debug","cliAdditionalArgs":[],"testAdditionalArgs":[],"vmAdditionalArgs":[],"customDartDapPath":null,"customFlutterDapPath":null,"checkForSdkUpdates":true,"sdkPath":"{{dartSdkRoot}}","sdkPaths":[],"flutterSdkPath":"/Users/keertip/src/flutter/bin","flutterSdkPaths":[],"sdkSwitchingTarget":"workspace","addSdkToTerminalPath":true,"getFlutterSdkCommand":null,"getDartSdkCommand":null,"mcpServer":true,"mcpServerTools":{"analyze_files":false,"dart_fix":false,"dart_format":false,"run_tests":false},"allowTestsOutsideTestFolder":false,"coverageExcludePatterns":[],"openTestView":["testRunStart"],"showSkippedTests":true,"testInvocationMode":"name","projectSearchDepth":5,"env":{},"toolingDaemonAdditionalArgs":[],"normalizeFileCasing":false,"daemonPort":null,"previewCommitCharacters":false,"previewFlutterUiGuides":false,"previewFlutterUiGuidesCustomTracking":false,"previewHotReloadOnSaveWatcher":false,"experimentalRefactors":false,"dynamicTestTracking":true,"experimentalDtdHandlers":false,"analyzeAngularTemplates":true,"additionalAnalyzerFileExtensions":[],"analysisServerFolding":true,"doNotFormat":[],"updateDevTools":true,"flutterTrackWidgetCreation":true,"dartTestLogFile":null,"flutterRunLogFile":null,"flutterTestLogFile":null,"vmServiceLogFile":null,"webDaemonLogFile":null,"onlyAnalyzeProjectsWithOpenFiles":false},{"analysisExcludedFolders":[],"analyzerAdditionalArgs":["--session-log=/Users/keertip/vscode.json","--enable-experiment=primary-constructors"],"analyzerVmAdditionalArgs":[],"analyzerDiagnosticsPort":null,"analyzerPath":null,"analyzerSshHost":null,"analyzerVmServicePort":null,"includeDependenciesInWorkspaceSymbols":true,"notifyAnalyzerErrors":true,"showTodos":false,"showExtensionRecommendations":true,"devToolsBrowser":"chrome","devToolsPort":null,"devToolsReuseWindows":true,"devToolsTheme":"dark","devToolsLocation":{"default":"beside","inspector":"sidebar"},"openDevTools":"never","closeDevTools":"never","shareDevToolsWithFlutter":true,"showInspectorNotificationsForWidgetErrors":true,"customDevTools":{},"autoImportCompletions":true,"automaticCommentSlashes":"tripleSlash","closingLabels":true,"closingLabelsPrefix":" // ","closingLabelsTextStyle":"normal","completeFunctionCalls":true,"documentation":"full","dtdEditorActiveLocationDelay":200,"enableServerSnippets":true,"hotReloadPatterns":[],"enableCompletionCommitCharacters":false,"enableSdkFormatter":true,"enableSnippets":true,"inlayHints":true,"insertArgumentPlaceholders":true,"lineLength":80,"lspSnippetTextEdits":true,"renameFilesWithClasses":"never","showDartPadSampleCodeLens":true,"showMainCodeLens":true,"showTestCodeLens":true,"updateImportsOnRename":true,"warnWhenEditingFilesOutsideWorkspace":true,"warnWhenEditingFilesInPubCache":true,"flutterAdbConnectOnChromeOs":false,"flutterAdditionalArgs":[],"flutterAttachAdditionalArgs":[],"flutterCreateAndroidLanguage":"kotlin","flutterCreateIOSLanguage":"swift","flutterCreatePlatforms":null,"offline":false,"flutterCreateOrganization":null,"flutterCustomEmulators":[],"flutterGutterIcons":true,"flutterHotReloadOnSave":"manual","hotReloadOnSave":"never","flutterGenerateLocalizationsOnSave":"never","flutterOutline":true,"flutterRunAdditionalArgs":[],"flutterScreenshotPath":null,"flutterRememberSelectedDevice":true,"flutterSelectDeviceWhenConnected":true,"flutterShowEmulators":"local","flutterShowWebServerDevice":"remote","flutterTestAdditionalArgs":[],"flutterWebRenderer":"flutter-default","flutterWidgetPreview":"startLazily","flutterWidgetPreviewLocation":"sidebar","useFlutterDev":false,"analyzerInstrumentationLogFile":null,"analyzerLogFile":null,"toolingDaemonLogFile":null,"dapLogFile":null,"devToolsLogFile":null,"extensionLogFile":null,"flutterDaemonLogFile":null,"flutterWidgetPreviewLogFile":null,"mcpServerLogFile":null,"maxLogLineLength":2000,"maxCompletionItems":100000,"enablePub":true,"promptToGetPackages":true,"pubAdditionalArgs":[],"runPubGetOnPubspecChanges":"always","runPubGetOnNestedProjects":"none","buildRunnerAdditionalArgs":[],"cliConsole":"debugConsole","debugExtensionBackendProtocol":"ws","debugSdkLibraries":false,"debugExternalPackageLibraries":false,"evaluateGettersInDebugViews":true,"showGettersInDebugViews":true,"evaluateToStringInDebugViews":true,"hotReloadProgress":"notification","promptToRunIfErrors":true,"showDartDeveloperLogs":true,"showDebuggerNumbersAsHex":false,"showDevToolsDebugToolBarButtons":true,"suppressTestTimeouts":"debug","cliAdditionalArgs":[],"testAdditionalArgs":[],"vmAdditionalArgs":[],"customDartDapPath":null,"customFlutterDapPath":null,"checkForSdkUpdates":true,"sdkPath":"{{dartSdkRoot}}","sdkPaths":[],"flutterSdkPath":"/Users/keertip/src/flutter/bin","flutterSdkPaths":[],"sdkSwitchingTarget":"workspace","addSdkToTerminalPath":true,"getFlutterSdkCommand":null,"getDartSdkCommand":null,"mcpServer":true,"mcpServerTools":{"analyze_files":false,"dart_fix":false,"dart_format":false,"run_tests":false},"allowTestsOutsideTestFolder":false,"coverageExcludePatterns":[],"openTestView":["testRunStart"],"showSkippedTests":true,"testInvocationMode":"name","projectSearchDepth":5,"env":{},"toolingDaemonAdditionalArgs":[],"normalizeFileCasing":false,"daemonPort":null,"previewCommitCharacters":false,"previewFlutterUiGuides":false,"previewFlutterUiGuidesCustomTracking":false,"previewHotReloadOnSaveWatcher":false,"experimentalRefactors":false,"dynamicTestTracking":true,"experimentalDtdHandlers":false,"analyzeAngularTemplates":true,"additionalAnalyzerFileExtensions":[],"analysisServerFolding":true,"doNotFormat":[],"updateDevTools":true,"flutterTrackWidgetCreation":true,"dartTestLogFile":null,"flutterRunLogFile":null,"flutterTestLogFile":null,"vmServiceLogFile":null,"webDaemonLogFile":null,"onlyAnalyzeProjectsWithOpenFiles":false}],"clientRequestTime":1771003752944}}
-{"time":1771003781818,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","method":"textDocument/didOpen","params":{"textDocument":{"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart","languageId":"dart","version":1,"text":"// Copyright 2013 The Flutter Authors\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n//\n// Autogenerated from Pigeon, do not edit directly.\n// See also: https://pub.dev/packages/pigeon\n// ignore_for_file: public_member_api_docs, non_constant_identifier_names, avoid_as, unused_import, unnecessary_parenthesis, prefer_null_aware_operators, omit_local_variable_types, omit_obvious_local_variable_types, unused_shown_name, unnecessary_import, no_leading_underscores_for_local_identifiers\n\nimport 'dart:async';\nimport 'dart:typed_data' show Float64List, Int32List, Int64List, Uint8List;\n\nimport 'package:flutter/foundation.dart' show ReadBuffer, WriteBuffer;\nimport 'package:flutter/services.dart';\n\nPlatformException _createConnectionError(String channelName) {\n  return PlatformException(\n    code: 'channel-error',\n    message: 'Unable to establish connection on channel: \"$channelName\".',\n  );\n}\n\nList<Object?> wrapResponse({\n  Object? result,\n  PlatformException? error,\n  bool empty = false,\n}) {\n  if (empty) {\n    return <Object?>[];\n  }\n  if (error == null) {\n    return <Object?>[result];\n  }\n  return <Object?>[error.code, error.message, error.details];\n}\n\nbool _deepEquals(Object? a, Object? b) {\n  if (a is List && b is List) {\n    return a.length == b.length &&\n        a.indexed.every(\n          ((int, dynamic) item) => _deepEquals(item.$2, b[item.$1]),\n        );\n  }\n  if (a is Map && b is Map) {\n    return a.length == b.length &&\n        a.entries.every(\n          (MapEntry<Object?, Object?> entry) =>\n              (b as Map<Object?, Object?>).containsKey(entry.key) &&\n              _deepEquals(entry.value, b[entry.key]),\n        );\n  }\n  return a == b;\n}\n\nenum AnEnum { one, two, three, fortyTwo, fourHundredTwentyTwo }\n\nenum AnotherEnum { justInCase }\n\nclass UnusedClass {\n  UnusedClass({this.aField});\n\n  Object? aField;\n\n  List<Object?> _toList() {\n    return <Object?>[aField];\n  }\n\n  Object encode() {\n    return _toList();\n  }\n\n  static UnusedClass decode(Object result) {\n    result as List<Object?>;\n    return UnusedClass(aField: result[0]);\n  }\n\n  @override\n  // ignore: avoid_equals_and_hash_code_on_mutable_classes\n  bool operator ==(Object other) {\n    if (other is! UnusedClass || other.runtimeType != runtimeType) {\n      return false;\n    }\n    if (identical(this, other)) {\n      return true;\n    }\n    return _deepEquals(encode(), other.encode());\n  }\n\n  @override\n  // ignore: avoid_equals_and_hash_code_on_mutable_classes\n  int get hashCode => Object.hashAll(_toList());\n}\n\n/// A class containing all supported types.\nclass AllTypes {\n  AllTypes({\n    this.aBool = false,\n    this.anInt = 0,\n    this.anInt64 = 0,\n    this.aDouble = 0,\n    required this.aByteArray,\n    required this.a4ByteArray,\n    required this.a8ByteArray,\n    required this.aFloatArray,\n    this.anEnum = AnEnum.one,\n    this.anotherEnum = AnotherEnum.justInCase,\n    this.aString = '',\n    this.anObject = 0,\n    required this.list,\n    required this.stringList,\n    required this.intList,\n    required this.doubleList,\n    required this.boolList,\n    required this.enumList,\n    required this.objectList,\n    required this.listList,\n    required this.mapList,\n    required this.map,\n    required this.stringMap,\n    required this.intMap,\n    required this.enumMap,\n    required this.objectMap,\n    required this.listMap,\n    required this.mapMap,\n  });\n\n  bool aBool;\n\n  int anInt;\n\n  int anInt64;\n\n  double aDouble;\n\n  Uint8List aByteArray;\n\n  Int32List a4ByteArray;\n\n  Int64List a8ByteArray;\n\n  Float64List aFloatArray;\n\n  AnEnum anEnum;\n\n  AnotherEnum anotherEnum;\n\n  String aString;\n\n  Object anObject;\n\n  List<Object?> list;\n\n  List<String> stringList;\n\n  List<int> intList;\n\n  List<double> doubleList;\n\n  List<bool> boolList;\n\n  List<AnEnum> enumList;\n\n  List<Object> objectList;\n\n  List<List<Object?>> listList;\n\n  List<Map<Object?, Object?>> mapList;\n\n  Map<Object?, Object?> map;\n\n  Map<String, String> stringMap;\n\n  Map<int, int> intMap;\n\n  Map<AnEnum, AnEnum> enumMap;\n\n  Map<Object, Object> objectMap;\n\n  Map<int, List<Object?>> listMap;\n\n  Map<int, Map<Object?, Object?>> mapMap;\n\n  List<Object?> _toList() {\n    return <Object?>[\n      aBool,\n      anInt,\n      anInt64,\n      aDouble,\n      aByteArray,\n      a4ByteArray,\n      a8ByteArray,\n      aFloatArray,\n      anEnum,\n      anotherEnum,\n      aString,\n      anObject,\n      list,\n      stringList,\n      intList,\n      doubleList,\n      boolList,\n      enumList,\n      objectList,\n      listList,\n      mapList,\n      map,\n      stringMap,\n      intMap,\n      enumMap,\n      objectMap,\n      listMap,\n      mapMap,\n    ];\n  }\n\n  Object encode() {\n    return _toList();\n  }\n\n  static AllTypes decode(Object result) {\n    result as List<Object?>;\n    return AllTypes(\n      aBool: result[0]! as bool,\n      anInt: result[1]! as int,\n      anInt64: result[2]! as int,\n      aDouble: result[3]! as double,\n      aByteArray: result[4]! as Uint8List,\n      a4ByteArray: result[5]! as Int32List,\n      a8ByteArray: result[6]! as Int64List,\n      aFloatArray: result[7]! as Float64List,\n      anEnum: result[8]! as AnEnum,\n      anotherEnum: result[9]! as AnotherEnum,\n      aString: result[10]! as String,\n      anObject: result[11]!,\n      list: result[12]! as List<Object?>,\n      stringList: (result[13] as List<Object?>?)!.cast<String>(),\n      intList: (result[14] as List<Object?>?)!.cast<int>(),\n      doubleList: (result[15] as List<Object?>?)!.cast<double>(),\n      boolList: (result[16] as List<Object?>?)!.cast<bool>(),\n      enumList: (result[17] as List<Object?>?)!.cast<AnEnum>(),\n      objectList: (result[18] as List<Object?>?)!.cast<Object>(),\n      listList: (result[19] as List<Object?>?)!.cast<List<Object?>>(),\n      mapList: (result[20] as List<Object?>?)!.cast<Map<Object?, Object?>>(),\n      map: result[21]! as Map<Object?, Object?>,\n      stringMap: (result[22] as Map<Object?, Object?>?)!.cast<String, String>(),\n      intMap: (result[23] as Map<Object?, Object?>?)!.cast<int, int>(),\n      enumMap: (result[24] as Map<Object?, Object?>?)!.cast<AnEnum, AnEnum>(),\n      objectMap: (result[25] as Map<Object?, Object?>?)!.cast<Object, Object>(),\n      listMap: (result[26] as Map<Object?, Object?>?)!\n          .cast<int, List<Object?>>(),\n      mapMap: (result[27] as Map<Object?, Object?>?)!\n          .cast<int, Map<Object?, Object?>>(),\n    );\n  }\n\n  @override\n  // ignore: avoid_equals_and_hash_code_on_mutable_classes\n  bool operator ==(Object other) {\n    if (other is! AllTypes || other.runtimeType != runtimeType) {\n      return false;\n    }\n    if (identical(this, other)) {\n      return true;\n    }\n    return _deepEquals(encode(), other.encode());\n  }\n\n  @override\n  // ignore: avoid_equals_and_hash_code_on_mutable_classes\n  int get hashCode => Object.hashAll(_toList());\n}\n\n/// A class containing all supported nullable types.\nclass AllNullableTypes {\n  AllNullableTypes({\n    this.aNullableBool,\n    this.aNullableInt,\n    this.aNullableInt64,\n    this.aNullableDouble,\n    this.aNullableByteArray,\n    this.aNullable4ByteArray,\n    this.aNullable8ByteArray,\n    this.aNullableFloatArray,\n    this.aNullableEnum,\n    this.anotherNullableEnum,\n    this.aNullableString,\n    this.aNullableObject,\n    this.allNullableTypes,\n    this.list,\n    this.stringList,\n    this.intList,\n    this.doubleList,\n    this.boolList,\n    this.enumList,\n    this.objectList,\n    this.listList,\n    this.mapList,\n    this.recursiveClassList,\n    this.map,\n    this.stringMap,\n    this.intMap,\n    this.enumMap,\n    this.objectMap,\n    this.listMap,\n    this.mapMap,\n    this.recursiveClassMap,\n  });\n\n  bool? aNullableBool;\n\n  int? aNullableInt;\n\n  int? aNullableInt64;\n\n  double? aNullableDouble;\n\n  Uint8List? aNullableByteArray;\n\n  Int32List? aNullable4ByteArray;\n\n  Int64List? aNullable8ByteArray;\n\n  Float64List? aNullableFloatArray;\n\n  AnEnum? aNullableEnum;\n\n  AnotherEnum? anotherNullableEnum;\n\n  String? aNullableString;\n\n  Object? aNullableObject;\n\n  AllNullableTypes? allNullableTypes;\n\n  List<Object?>? list;\n\n  List<String?>? stringList;\n\n  List<int?>? intList;\n\n  List<double?>? doubleList;\n\n  List<bool?>? boolList;\n\n  List<AnEnum?>? enumList;\n\n  List<Object?>? objectList;\n\n  List<List<Object?>?>? listList;\n\n  List<Map<Object?, Object?>?>? mapList;\n\n  List<AllNullableTypes?>? recursiveClassList;\n\n  Map<Object?, Object?>? map;\n\n  Map<String?, String?>? stringMap;\n\n  Map<int?, int?>? intMap;\n\n  Map<AnEnum?, AnEnum?>? enumMap;\n\n  Map<Object?, Object?>? objectMap;\n\n  Map<int?, List<Object?>?>? listMap;\n\n  Map<int?, Map<Object?, Object?>?>? mapMap;\n\n  Map<int?, AllNullableTypes?>? recursiveClassMap;\n\n  List<Object?> _toList() {\n    return <Object?>[\n      aNullableBool,\n      aNullableInt,\n      aNullableInt64,\n      aNullableDouble,\n      aNullableByteArray,\n      aNullable4ByteArray,\n      aNullable8ByteArray,\n      aNullableFloatArray,\n      aNullableEnum,\n      anotherNullableEnum,\n      aNullableString,\n      aNullableObject,\n      allNullableTypes,\n      list,\n      stringList,\n      intList,\n      doubleList,\n      boolList,\n      enumList,\n      objectList,\n      listList,\n      mapList,\n      recursiveClassList,\n      map,\n      stringMap,\n      intMap,\n      enumMap,\n      objectMap,\n      listMap,\n      mapMap,\n      recursiveClassMap,\n    ];\n  }\n\n  Object encode() {\n    return _toList();\n  }\n\n  static AllNullableTypes decode(Object result) {\n    result as List<Object?>;\n    return AllNullableTypes(\n      aNullableBool: result[0] as bool?,\n      aNullableInt: result[1] as int?,\n      aNullableInt64: result[2] as int?,\n      aNullableDouble: result[3] as double?,\n      aNullableByteArray: result[4] as Uint8List?,\n      aNullable4ByteArray: result[5] as Int32List?,\n      aNullable8ByteArray: result[6] as Int64List?,\n      aNullableFloatArray: result[7] as Float64List?,\n      aNullableEnum: result[8] as AnEnum?,\n      anotherNullableEnum: result[9] as AnotherEnum?,\n      aNullableString: result[10] as String?,\n      aNullableObject: result[11],\n      allNullableTypes: result[12] as AllNullableTypes?,\n      list: result[13] as List<Object?>?,\n      stringList: (result[14] as List<Object?>?)?.cast<String?>(),\n      intList: (result[15] as List<Object?>?)?.cast<int?>(),\n      doubleList: (result[16] as List<Object?>?)?.cast<double?>(),\n      boolList: (result[17] as List<Object?>?)?.cast<bool?>(),\n      enumList: (result[18] as List<Object?>?)?.cast<AnEnum?>(),\n      objectList: (result[19] as List<Object?>?)?.cast<Object?>(),\n      listList: (result[20] as List<Object?>?)?.cast<List<Object?>?>(),\n      mapList: (result[21] as List<Object?>?)?.cast<Map<Object?, Object?>?>(),\n      recursiveClassList: (result[22] as List<Object?>?)\n          ?.cast<AllNullableTypes?>(),\n      map: result[23] as Map<Object?, Object?>?,\n      stringMap: (result[24] as Map<Object?, Object?>?)\n          ?.cast<String?, String?>(),\n      intMap: (result[25] as Map<Object?, Object?>?)?.cast<int?, int?>(),\n      enumMap: (result[26] as Map<Object?, Object?>?)?.cast<AnEnum?, AnEnum?>(),\n      objectMap: (result[27] as Map<Object?, Object?>?)\n          ?.cast<Object?, Object?>(),\n      listMap: (result[28] as Map<Object?, Object?>?)\n          ?.cast<int?, List<Object?>?>(),\n      mapMap: (result[29] as Map<Object?, Object?>?)\n          ?.cast<int?, Map<Object?, Object?>?>(),\n      recursiveClassMap: (result[30] as Map<Object?, Object?>?)\n          ?.cast<int?, AllNullableTypes?>(),\n    );\n  }\n\n  @override\n  // ignore: avoid_equals_and_hash_code_on_mutable_classes\n  bool operator ==(Object other) {\n    if (other is! AllNullableTypes || other.runtimeType != runtimeType) {\n      return false;\n    }\n    if (identical(this, other)) {\n      return true;\n    }\n    return _deepEquals(encode(), other.encode());\n  }\n\n  @override\n  // ignore: avoid_equals_and_hash_code_on_mutable_classes\n  int get hashCode => Object.hashAll(_toList());\n}\n\n/// The primary purpose for this class is to ensure coverage of Swift structs\n/// with nullable items, as the primary [AllNullableTypes] class is being used to\n/// test Swift classes.\nclass AllNullableTypesWithoutRecursion {\n  AllNullableTypesWithoutRecursion({\n    this.aNullableBool,\n    this.aNullableInt,\n    this.aNullableInt64,\n    this.aNullableDouble,\n    this.aNullableByteArray,\n    this.aNullable4ByteArray,\n    this.aNullable8ByteArray,\n    this.aNullableFloatArray,\n    this.aNullableEnum,\n    this.anotherNullableEnum,\n    this.aNullableString,\n    this.aNullableObject,\n    this.list,\n    this.stringList,\n    this.intList,\n    this.doubleList,\n    this.boolList,\n    this.enumList,\n    this.objectList,\n    this.listList,\n    this.mapList,\n    this.map,\n    this.stringMap,\n    this.intMap,\n    this.enumMap,\n    this.objectMap,\n    this.listMap,\n    this.mapMap,\n  });\n\n  bool? aNullableBool;\n\n  int? aNullableInt;\n\n  int? aNullableInt64;\n\n  double? aNullableDouble;\n\n  Uint8List? aNullableByteArray;\n\n  Int32List? aNullable4ByteArray;\n\n  Int64List? aNullable8ByteArray;\n\n  Float64List? aNullableFloatArray;\n\n  AnEnum? aNullableEnum;\n\n  AnotherEnum? anotherNullableEnum;\n\n  String? aNullableString;\n\n  Object? aNullableObject;\n\n  List<Object?>? list;\n\n  List<String?>? stringList;\n\n  List<int?>? intList;\n\n  List<double?>? doubleList;\n\n  List<bool?>? boolList;\n\n  List<AnEnum?>? enumList;\n\n  List<Object?>? objectList;\n\n  List<List<Object?>?>? listList;\n\n  List<Map<Object?, Object?>?>? mapList;\n\n  Map<Object?, Object?>? map;\n\n  Map<String?, String?>? stringMap;\n\n  Map<int?, int?>? intMap;\n\n  Map<AnEnum?, AnEnum?>? enumMap;\n\n  Map<Object?, Object?>? objectMap;\n\n  Map<int?, List<Object?>?>? listMap;\n\n  Map<int?, Map<Object?, Object?>?>? mapMap;\n\n  List<Object?> _toList() {\n    return <Object?>[\n      aNullableBool,\n      aNullableInt,\n      aNullableInt64,\n      aNullableDouble,\n      aNullableByteArray,\n      aNullable4ByteArray,\n      aNullable8ByteArray,\n      aNullableFloatArray,\n      aNullableEnum,\n      anotherNullableEnum,\n      aNullableString,\n      aNullableObject,\n      list,\n      stringList,\n      intList,\n      doubleList,\n      boolList,\n      enumList,\n      objectList,\n      listList,\n      mapList,\n      map,\n      stringMap,\n      intMap,\n      enumMap,\n      objectMap,\n      listMap,\n      mapMap,\n    ];\n  }\n\n  Object encode() {\n    return _toList();\n  }\n\n  static AllNullableTypesWithoutRecursion decode(Object result) {\n    result as List<Object?>;\n    return AllNullableTypesWithoutRecursion(\n      aNullableBool: result[0] as bool?,\n      aNullableInt: result[1] as int?,\n      aNullableInt64: result[2] as int?,\n      aNullableDouble: result[3] as double?,\n      aNullableByteArray: result[4] as Uint8List?,\n      aNullable4ByteArray: result[5] as Int32List?,\n      aNullable8ByteArray: result[6] as Int64List?,\n      aNullableFloatArray: result[7] as Float64List?,\n      aNullableEnum: result[8] as AnEnum?,\n      anotherNullableEnum: result[9] as AnotherEnum?,\n      aNullableString: result[10] as String?,\n      aNullableObject: result[11],\n      list: result[12] as List<Object?>?,\n      stringList: (result[13] as List<Object?>?)?.cast<String?>(),\n      intList: (result[14] as List<Object?>?)?.cast<int?>(),\n      doubleList: (result[15] as List<Object?>?)?.cast<double?>(),\n      boolList: (result[16] as List<Object?>?)?.cast<bool?>(),\n      enumList: (result[17] as List<Object?>?)?.cast<AnEnum?>(),\n      objectList: (result[18] as List<Object?>?)?.cast<Object?>(),\n      listList: (result[19] as List<Object?>?)?.cast<List<Object?>?>(),\n      mapList: (result[20] as List<Object?>?)?.cast<Map<Object?, Object?>?>(),\n      map: result[21] as Map<Object?, Object?>?,\n      stringMap: (result[22] as Map<Object?, Object?>?)\n          ?.cast<String?, String?>(),\n      intMap: (result[23] as Map<Object?, Object?>?)?.cast<int?, int?>(),\n      enumMap: (result[24] as Map<Object?, Object?>?)?.cast<AnEnum?, AnEnum?>(),\n      objectMap: (result[25] as Map<Object?, Object?>?)\n          ?.cast<Object?, Object?>(),\n      listMap: (result[26] as Map<Object?, Object?>?)\n          ?.cast<int?, List<Object?>?>(),\n      mapMap: (result[27] as Map<Object?, Object?>?)\n          ?.cast<int?, Map<Object?, Object?>?>(),\n    );\n  }\n\n  @override\n  // ignore: avoid_equals_and_hash_code_on_mutable_classes\n  bool operator ==(Object other) {\n    if (other is! AllNullableTypesWithoutRecursion ||\n        other.runtimeType != runtimeType) {\n      return false;\n    }\n    if (identical(this, other)) {\n      return true;\n    }\n    return _deepEquals(encode(), other.encode());\n  }\n\n  @override\n  // ignore: avoid_equals_and_hash_code_on_mutable_classes\n  int get hashCode => Object.hashAll(_toList());\n}\n\n/// A class for testing nested class handling.\n///\n/// This is needed to test nested nullable and non-nullable classes,\n/// `AllNullableTypes` is non-nullable here as it is easier to instantiate\n/// than `AllTypes` when testing doesn't require both (ie. testing null classes).\nclass AllClassesWrapper {\n  AllClassesWrapper({\n    required this.allNullableTypes,\n    this.allNullableTypesWithoutRecursion,\n    this.allTypes,\n    required this.classList,\n    this.nullableClassList,\n    required this.classMap,\n    this.nullableClassMap,\n  });\n\n  AllNullableTypes allNullableTypes;\n\n  AllNullableTypesWithoutRecursion? allNullableTypesWithoutRecursion;\n\n  AllTypes? allTypes;\n\n  List<AllTypes?> classList;\n\n  List<AllNullableTypesWithoutRecursion?>? nullableClassList;\n\n  Map<int?, AllTypes?> classMap;\n\n  Map<int?, AllNullableTypesWithoutRecursion?>? nullableClassMap;\n\n  List<Object?> _toList() {\n    return <Object?>[\n      allNullableTypes,\n      allNullableTypesWithoutRecursion,\n      allTypes,\n      classList,\n      nullableClassList,\n      classMap,\n      nullableClassMap,\n    ];\n  }\n\n  Object encode() {\n    return _toList();\n  }\n\n  static AllClassesWrapper decode(Object result) {\n    result as List<Object?>;\n    return AllClassesWrapper(\n      allNullableTypes: result[0]! as AllNullableTypes,\n      allNullableTypesWithoutRecursion:\n          result[1] as AllNullableTypesWithoutRecursion?,\n      allTypes: result[2] as AllTypes?,\n      classList: (result[3] as List<Object?>?)!.cast<AllTypes?>(),\n      nullableClassList: (result[4] as List<Object?>?)\n          ?.cast<AllNullableTypesWithoutRecursion?>(),\n      classMap: (result[5] as Map<Object?, Object?>?)!.cast<int?, AllTypes?>(),\n      nullableClassMap: (result[6] as Map<Object?, Object?>?)\n          ?.cast<int?, AllNullableTypesWithoutRecursion?>(),\n    );\n  }\n\n  @override\n  // ignore: avoid_equals_and_hash_code_on_mutable_classes\n  bool operator ==(Object other) {\n    if (other is! AllClassesWrapper || other.runtimeType != runtimeType) {\n      return false;\n    }\n    if (identical(this, other)) {\n      return true;\n    }\n    return _deepEquals(encode(), other.encode());\n  }\n\n  @override\n  // ignore: avoid_equals_and_hash_code_on_mutable_classes\n  int get hashCode => Object.hashAll(_toList());\n}\n\n/// A data class containing a List, used in unit tests.\nclass TestMessage {\n  TestMessage({this.testList});\n\n  List<Object?>? testList;\n\n  List<Object?> _toList() {\n    return <Object?>[testList];\n  }\n\n  Object encode() {\n    return _toList();\n  }\n\n  static TestMessage decode(Object result) {\n    result as List<Object?>;\n    return TestMessage(testList: result[0] as List<Object?>?);\n  }\n\n  @override\n  // ignore: avoid_equals_and_hash_code_on_mutable_classes\n  bool operator ==(Object other) {\n    if (other is! TestMessage || other.runtimeType != runtimeType) {\n      return false;\n    }\n    if (identical(this, other)) {\n      return true;\n    }\n    return _deepEquals(encode(), other.encode());\n  }\n\n  @override\n  // ignore: avoid_equals_and_hash_code_on_mutable_classes\n  int get hashCode => Object.hashAll(_toList());\n}\n\nclass _PigeonCodec extends StandardMessageCodec {\n  const _PigeonCodec();\n  @override\n  void writeValue(WriteBuffer buffer, Object? value) {\n    if (value is int) {\n      buffer.putUint8(4);\n      buffer.putInt64(value);\n    } else if (value is AnEnum) {\n      buffer.putUint8(129);\n      writeValue(buffer, value.index);\n    } else if (value is AnotherEnum) {\n      buffer.putUint8(130);\n      writeValue(buffer, value.index);\n    } else if (value is UnusedClass) {\n      buffer.putUint8(131);\n      writeValue(buffer, value.encode());\n    } else if (value is AllTypes) {\n      buffer.putUint8(132);\n      writeValue(buffer, value.encode());\n    } else if (value is AllNullableTypes) {\n      buffer.putUint8(133);\n      writeValue(buffer, value.encode());\n    } else if (value is AllNullableTypesWithoutRecursion) {\n      buffer.putUint8(134);\n      writeValue(buffer, value.encode());\n    } else if (value is AllClassesWrapper) {\n      buffer.putUint8(135);\n      writeValue(buffer, value.encode());\n    } else if (value is TestMessage) {\n      buffer.putUint8(136);\n      writeValue(buffer, value.encode());\n    } else {\n      super.writeValue(buffer, value);\n    }\n  }\n\n  @override\n  Object? readValueOfType(int type, ReadBuffer buffer) {\n    switch (type) {\n      case 129:\n        final value = readValue(buffer) as int?;\n        return value == null ? null : AnEnum.values[value];\n      case 130:\n        final value = readValue(buffer) as int?;\n        return value == null ? null : AnotherEnum.values[value];\n      case 131:\n        return UnusedClass.decode(readValue(buffer)!);\n      case 132:\n        return AllTypes.decode(readValue(buffer)!);\n      case 133:\n        return AllNullableTypes.decode(readValue(buffer)!);\n      case 134:\n        return AllNullableTypesWithoutRecursion.decode(readValue(buffer)!);\n      case 135:\n        return AllClassesWrapper.decode(readValue(buffer)!);\n      case 136:\n        return TestMessage.decode(readValue(buffer)!);\n      default:\n        return super.readValueOfType(type, buffer);\n    }\n  }\n}\n\n/// The core interface that each host language plugin must implement in\n/// platform_test integration tests.\nclass HostIntegrationCoreApi {\n  /// Constructor for [HostIntegrationCoreApi].  The [binaryMessenger] named argument is\n  /// available for dependency injection.  If it is left null, the default\n  /// BinaryMessenger will be used which routes to the host platform.\n  HostIntegrationCoreApi({\n    BinaryMessenger? binaryMessenger,\n    String messageChannelSuffix = '',\n  }) : pigeonVar_binaryMessenger = binaryMessenger,\n       pigeonVar_messageChannelSuffix = messageChannelSuffix.isNotEmpty\n           ? '.$messageChannelSuffix'\n           : '';\n  final BinaryMessenger? pigeonVar_binaryMessenger;\n\n  static const MessageCodec<Object?> pigeonChannelCodec = _PigeonCodec();\n\n  final String pigeonVar_messageChannelSuffix;\n\n  /// A no-op function taking no arguments and returning no value, to sanity\n  /// test basic calling.\n  Future<void> noop() async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.noop$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(null);\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else {\n      return;\n    }\n  }\n\n  /// Returns the passed object, to test serialization and deserialization.\n  Future<AllTypes> echoAllTypes(AllTypes everything) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.echoAllTypes$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[everything],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else if (pigeonVar_replyList[0] == null) {\n      throw PlatformException(\n        code: 'null-error',\n        message: 'Host platform returned null value for non-null return value.',\n      );\n    } else {\n      return (pigeonVar_replyList[0] as AllTypes?)!;\n    }\n  }\n\n  /// Returns an error, to test error handling.\n  Future<Object?> throwError() async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.throwError$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(null);\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else {\n      return pigeonVar_replyList[0];\n    }\n  }\n\n  /// Returns an error from a void function, to test error handling.\n  Future<void> throwErrorFromVoid() async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.throwErrorFromVoid$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(null);\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else {\n      return;\n    }\n  }\n\n  /// Returns a Flutter error, to test error handling.\n  Future<Object?> throwFlutterError() async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.throwFlutterError$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(null);\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else {\n      return pigeonVar_replyList[0];\n    }\n  }\n\n  /// Returns passed in int.\n  Future<int> echoInt(int anInt) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.echoInt$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[anInt],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else if (pigeonVar_replyList[0] == null) {\n      throw PlatformException(\n        code: 'null-error',\n        message: 'Host platform returned null value for non-null return value.',\n      );\n    } else {\n      return (pigeonVar_replyList[0] as int?)!;\n    }\n  }\n\n  /// Returns passed in double.\n  Future<double> echoDouble(double aDouble) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.echoDouble$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[aDouble],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else if (pigeonVar_replyList[0] == null) {\n      throw PlatformException(\n        code: 'null-error',\n        message: 'Host platform returned null value for non-null return value.',\n      );\n    } else {\n      return (pigeonVar_replyList[0] as double?)!;\n    }\n  }\n\n  /// Returns the passed in boolean.\n  Future<bool> echoBool(bool aBool) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.echoBool$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[aBool],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else if (pigeonVar_replyList[0] == null) {\n      throw PlatformException(\n        code: 'null-error',\n        message: 'Host platform returned null value for non-null return value.',\n      );\n    } else {\n      return (pigeonVar_replyList[0] as bool?)!;\n    }\n  }\n\n  /// Returns the passed in string.\n  Future<String> echoString(String aString) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.echoString$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[aString],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else if (pigeonVar_replyList[0] == null) {\n      throw PlatformException(\n        code: 'null-error',\n        message: 'Host platform returned null value for non-null return value.',\n      );\n    } else {\n      return (pigeonVar_replyList[0] as String?)!;\n    }\n  }\n\n  /// Returns the passed in Uint8List.\n  Future<Uint8List> echoUint8List(Uint8List aUint8List) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.echoUint8List$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[aUint8List],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else if (pigeonVar_replyList[0] == null) {\n      throw PlatformException(\n        code: 'null-error',\n        message: 'Host platform returned null value for non-null return value.',\n      );\n    } else {\n      return (pigeonVar_replyList[0] as Uint8List?)!;\n    }\n  }\n\n  /// Returns the passed in generic Object.\n  Future<Object> echoObject(Object anObject) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.echoObject$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[anObject],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else if (pigeonVar_replyList[0] == null) {\n      throw PlatformException(\n        code: 'null-error',\n        message: 'Host platform returned null value for non-null return value.',\n      );\n    } else {\n      return pigeonVar_replyList[0]!;\n    }\n  }\n\n  /// Returns the passed list, to test serialization and deserialization.\n  Future<List<Object?>> echoList(List<Object?> list) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.echoList$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[list],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else if (pigeonVar_replyList[0] == null) {\n      throw PlatformException(\n        code: 'null-error',\n        message: 'Host platform returned null value for non-null return value.',\n      );\n    } else {\n      return (pigeonVar_replyList[0] as List<Object?>?)!.cast<Object?>();\n    }\n  }\n\n  /// Returns the passed list, to test serialization and deserialization.\n  Future<List<AnEnum?>> echoEnumList(List<AnEnum?> enumList) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.echoEnumList$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[enumList],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else if (pigeonVar_replyList[0] == null) {\n      throw PlatformException(\n        code: 'null-error',\n        message: 'Host platform returned null value for non-null return value.',\n      );\n    } else {\n      return (pigeonVar_replyList[0] as List<Object?>?)!.cast<AnEnum?>();\n    }\n  }\n\n  /// Returns the passed list, to test serialization and deserialization.\n  Future<List<AllNullableTypes?>> echoClassList(\n    List<AllNullableTypes?> classList,\n  ) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.echoClassList$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[classList],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else if (pigeonVar_replyList[0] == null) {\n      throw PlatformException(\n        code: 'null-error',\n        message: 'Host platform returned null value for non-null return value.',\n      );\n    } else {\n      return (pigeonVar_replyList[0] as List<Object?>?)!\n          .cast<AllNullableTypes?>();\n    }\n  }\n\n  /// Returns the passed list, to test serialization and deserialization.\n  Future<List<AnEnum>> echoNonNullEnumList(List<AnEnum> enumList) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.echoNonNullEnumList$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[enumList],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else if (pigeonVar_replyList[0] == null) {\n      throw PlatformException(\n        code: 'null-error',\n        message: 'Host platform returned null value for non-null return value.',\n      );\n    } else {\n      return (pigeonVar_replyList[0] as List<Object?>?)!.cast<AnEnum>();\n    }\n  }\n\n  /// Returns the passed list, to test serialization and deserialization.\n  Future<List<AllNullableTypes>> echoNonNullClassList(\n    List<AllNullableTypes> classList,\n  ) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.echoNonNullClassList$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[classList],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else if (pigeonVar_replyList[0] == null) {\n      throw PlatformException(\n        code: 'null-error',\n        message: 'Host platform returned null value for non-null return value.',\n      );\n    } else {\n      return (pigeonVar_replyList[0] as List<Object?>?)!\n          .cast<AllNullableTypes>();\n    }\n  }\n\n  /// Returns the passed map, to test serialization and deserialization.\n  Future<Map<Object?, Object?>> echoMap(Map<Object?, Object?> map) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.echoMap$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[map],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else if (pigeonVar_replyList[0] == null) {\n      throw PlatformException(\n        code: 'null-error',\n        message: 'Host platform returned null value for non-null return value.',\n      );\n    } else {\n      return (pigeonVar_replyList[0] as Map<Object?, Object?>?)!\n          .cast<Object?, Object?>();\n    }\n  }\n\n  /// Returns the passed map, to test serialization and deserialization.\n  Future<Map<String?, String?>> echoStringMap(\n    Map<String?, String?> stringMap,\n  ) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.echoStringMap$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[stringMap],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else if (pigeonVar_replyList[0] == null) {\n      throw PlatformException(\n        code: 'null-error',\n        message: 'Host platform returned null value for non-null return value.',\n      );\n    } else {\n      return (pigeonVar_replyList[0] as Map<Object?, Object?>?)!\n          .cast<String?, String?>();\n    }\n  }\n\n  /// Returns the passed map, to test serialization and deserialization.\n  Future<Map<int?, int?>> echoIntMap(Map<int?, int?> intMap) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.echoIntMap$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[intMap],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else if (pigeonVar_replyList[0] == null) {\n      throw PlatformException(\n        code: 'null-error',\n        message: 'Host platform returned null value for non-null return value.',\n      );\n    } else {\n      return (pigeonVar_replyList[0] as Map<Object?, Object?>?)!\n          .cast<int?, int?>();\n    }\n  }\n\n  /// Returns the passed map, to test serialization and deserialization.\n  Future<Map<AnEnum?, AnEnum?>> echoEnumMap(\n    Map<AnEnum?, AnEnum?> enumMap,\n  ) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.echoEnumMap$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[enumMap],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else if (pigeonVar_replyList[0] == null) {\n      throw PlatformException(\n        code: 'null-error',\n        message: 'Host platform returned null value for non-null return value.',\n      );\n    } else {\n      return (pigeonVar_replyList[0] as Map<Object?, Object?>?)!\n          .cast<AnEnum?, AnEnum?>();\n    }\n  }\n\n  /// Returns the passed map, to test serialization and deserialization.\n  Future<Map<int?, AllNullableTypes?>> echoClassMap(\n    Map<int?, AllNullableTypes?> classMap,\n  ) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.echoClassMap$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[classMap],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else if (pigeonVar_replyList[0] == null) {\n      throw PlatformException(\n        code: 'null-error',\n        message: 'Host platform returned null value for non-null return value.',\n      );\n    } else {\n      return (pigeonVar_replyList[0] as Map<Object?, Object?>?)!\n          .cast<int?, AllNullableTypes?>();\n    }\n  }\n\n  /// Returns the passed map, to test serialization and deserialization.\n  Future<Map<String, String>> echoNonNullStringMap(\n    Map<String, String> stringMap,\n  ) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.echoNonNullStringMap$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[stringMap],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else if (pigeonVar_replyList[0] == null) {\n      throw PlatformException(\n        code: 'null-error',\n        message: 'Host platform returned null value for non-null return value.',\n      );\n    } else {\n      return (pigeonVar_replyList[0] as Map<Object?, Object?>?)!\n          .cast<String, String>();\n    }\n  }\n\n  /// Returns the passed map, to test serialization and deserialization.\n  Future<Map<int, int>> echoNonNullIntMap(Map<int, int> intMap) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.echoNonNullIntMap$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[intMap],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else if (pigeonVar_replyList[0] == null) {\n      throw PlatformException(\n        code: 'null-error',\n        message: 'Host platform returned null value for non-null return value.',\n      );\n    } else {\n      return (pigeonVar_replyList[0] as Map<Object?, Object?>?)!\n          .cast<int, int>();\n    }\n  }\n\n  /// Returns the passed map, to test serialization and deserialization.\n  Future<Map<AnEnum, AnEnum>> echoNonNullEnumMap(\n    Map<AnEnum, AnEnum> enumMap,\n  ) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.echoNonNullEnumMap$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[enumMap],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else if (pigeonVar_replyList[0] == null) {\n      throw PlatformException(\n        code: 'null-error',\n        message: 'Host platform returned null value for non-null return value.',\n      );\n    } else {\n      return (pigeonVar_replyList[0] as Map<Object?, Object?>?)!\n          .cast<AnEnum, AnEnum>();\n    }\n  }\n\n  /// Returns the passed map, to test serialization and deserialization.\n  Future<Map<int, AllNullableTypes>> echoNonNullClassMap(\n    Map<int, AllNullableTypes> classMap,\n  ) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.echoNonNullClassMap$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[classMap],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else if (pigeonVar_replyList[0] == null) {\n      throw PlatformException(\n        code: 'null-error',\n        message: 'Host platform returned null value for non-null return value.',\n      );\n    } else {\n      return (pigeonVar_replyList[0] as Map<Object?, Object?>?)!\n          .cast<int, AllNullableTypes>();\n    }\n  }\n\n  /// Returns the passed class to test nested class serialization and deserialization.\n  Future<AllClassesWrapper> echoClassWrapper(AllClassesWrapper wrapper) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.echoClassWrapper$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[wrapper],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else if (pigeonVar_replyList[0] == null) {\n      throw PlatformException(\n        code: 'null-error',\n        message: 'Host platform returned null value for non-null return value.',\n      );\n    } else {\n      return (pigeonVar_replyList[0] as AllClassesWrapper?)!;\n    }\n  }\n\n  /// Returns the passed enum to test serialization and deserialization.\n  Future<AnEnum> echoEnum(AnEnum anEnum) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.echoEnum$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[anEnum],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else if (pigeonVar_replyList[0] == null) {\n      throw PlatformException(\n        code: 'null-error',\n        message: 'Host platform returned null value for non-null return value.',\n      );\n    } else {\n      return (pigeonVar_replyList[0] as AnEnum?)!;\n    }\n  }\n\n  /// Returns the passed enum to test serialization and deserialization.\n  Future<AnotherEnum> echoAnotherEnum(AnotherEnum anotherEnum) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.echoAnotherEnum$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[anotherEnum],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else if (pigeonVar_replyList[0] == null) {\n      throw PlatformException(\n        code: 'null-error',\n        message: 'Host platform returned null value for non-null return value.',\n      );\n    } else {\n      return (pigeonVar_replyList[0] as AnotherEnum?)!;\n    }\n  }\n\n  /// Returns the default string.\n  Future<String> echoNamedDefaultString({String aString = 'default'}) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.echoNamedDefaultString$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[aString],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else if (pigeonVar_replyList[0] == null) {\n      throw PlatformException(\n        code: 'null-error',\n        message: 'Host platform returned null value for non-null return value.',\n      );\n    } else {\n      return (pigeonVar_replyList[0] as String?)!;\n    }\n  }\n\n  /// Returns passed in double.\n  Future<double> echoOptionalDefaultDouble([double aDouble = 3.14]) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.echoOptionalDefaultDouble$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[aDouble],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else if (pigeonVar_replyList[0] == null) {\n      throw PlatformException(\n        code: 'null-error',\n        message: 'Host platform returned null value for non-null return value.',\n      );\n    } else {\n      return (pigeonVar_replyList[0] as double?)!;\n    }\n  }\n\n  /// Returns passed in int.\n  Future<int> echoRequiredInt({required int anInt}) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.echoRequiredInt$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[anInt],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else if (pigeonVar_replyList[0] == null) {\n      throw PlatformException(\n        code: 'null-error',\n        message: 'Host platform returned null value for non-null return value.',\n      );\n    } else {\n      return (pigeonVar_replyList[0] as int?)!;\n    }\n  }\n\n  /// Returns the passed object, to test serialization and deserialization.\n  Future<AllNullableTypes?> echoAllNullableTypes(\n    AllNullableTypes? everything,\n  ) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.echoAllNullableTypes$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[everything],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else {\n      return (pigeonVar_replyList[0] as AllNullableTypes?);\n    }\n  }\n\n  /// Returns the passed object, to test serialization and deserialization.\n  Future<AllNullableTypesWithoutRecursion?>\n  echoAllNullableTypesWithoutRecursion(\n    AllNullableTypesWithoutRecursion? everything,\n  ) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.echoAllNullableTypesWithoutRecursion$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[everything],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else {\n      return (pigeonVar_replyList[0] as AllNullableTypesWithoutRecursion?);\n    }\n  }\n\n  /// Returns the inner `aString` value from the wrapped object, to test\n  /// sending of nested objects.\n  Future<String?> extractNestedNullableString(AllClassesWrapper wrapper) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.extractNestedNullableString$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[wrapper],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else {\n      return (pigeonVar_replyList[0] as String?);\n    }\n  }\n\n  /// Returns the inner `aString` value from the wrapped object, to test\n  /// sending of nested objects.\n  Future<AllClassesWrapper> createNestedNullableString(\n    String? nullableString,\n  ) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.createNestedNullableString$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[nullableString],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else if (pigeonVar_replyList[0] == null) {\n      throw PlatformException(\n        code: 'null-error',\n        message: 'Host platform returned null value for non-null return value.',\n      );\n    } else {\n      return (pigeonVar_replyList[0] as AllClassesWrapper?)!;\n    }\n  }\n\n  /// Returns passed in arguments of multiple types.\n  Future<AllNullableTypes> sendMultipleNullableTypes(\n    bool? aNullableBool,\n    int? aNullableInt,\n    String? aNullableString,\n  ) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.sendMultipleNullableTypes$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[aNullableBool, aNullableInt, aNullableString],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else if (pigeonVar_replyList[0] == null) {\n      throw PlatformException(\n        code: 'null-error',\n        message: 'Host platform returned null value for non-null return value.',\n      );\n    } else {\n      return (pigeonVar_replyList[0] as AllNullableTypes?)!;\n    }\n  }\n\n  /// Returns passed in arguments of multiple types.\n  Future<AllNullableTypesWithoutRecursion>\n  sendMultipleNullableTypesWithoutRecursion(\n    bool? aNullableBool,\n    int? aNullableInt,\n    String? aNullableString,\n  ) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.sendMultipleNullableTypesWithoutRecursion$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[aNullableBool, aNullableInt, aNullableString],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else if (pigeonVar_replyList[0] == null) {\n      throw PlatformException(\n        code: 'null-error',\n        message: 'Host platform returned null value for non-null return value.',\n      );\n    } else {\n      return (pigeonVar_replyList[0] as AllNullableTypesWithoutRecursion?)!;\n    }\n  }\n\n  /// Returns passed in int.\n  Future<int?> echoNullableInt(int? aNullableInt) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.echoNullableInt$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[aNullableInt],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else {\n      return (pigeonVar_replyList[0] as int?);\n    }\n  }\n\n  /// Returns passed in double.\n  Future<double?> echoNullableDouble(double? aNullableDouble) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.echoNullableDouble$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[aNullableDouble],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else {\n      return (pigeonVar_replyList[0] as double?);\n    }\n  }\n\n  /// Returns the passed in boolean.\n  Future<bool?> echoNullableBool(bool? aNullableBool) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.echoNullableBool$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[aNullableBool],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else {\n      return (pigeonVar_replyList[0] as bool?);\n    }\n  }\n\n  /// Returns the passed in string.\n  Future<String?> echoNullableString(String? aNullableString) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.echoNullableString$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[aNullableString],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else {\n      return (pigeonVar_replyList[0] as String?);\n    }\n  }\n\n  /// Returns the passed in Uint8List.\n  Future<Uint8List?> echoNullableUint8List(\n    Uint8List? aNullableUint8List,\n  ) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.echoNullableUint8List$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[aNullableUint8List],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else {\n      return (pigeonVar_replyList[0] as Uint8List?);\n    }\n  }\n\n  /// Returns the passed in generic Object.\n  Future<Object?> echoNullableObject(Object? aNullableObject) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.echoNullableObject$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[aNullableObject],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else {\n      return pigeonVar_replyList[0];\n    }\n  }\n\n  /// Returns the passed list, to test serialization and deserialization.\n  Future<List<Object?>?> echoNullableList(List<Object?>? aNullableList) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.echoNullableList$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[aNullableList],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else {\n      return (pigeonVar_replyList[0] as List<Object?>?)?.cast<Object?>();\n    }\n  }\n\n  /// Returns the passed list, to test serialization and deserialization.\n  Future<List<AnEnum?>?> echoNullableEnumList(List<AnEnum?>? enumList) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.echoNullableEnumList$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[enumList],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else {\n      return (pigeonVar_replyList[0] as List<Object?>?)?.cast<AnEnum?>();\n    }\n  }\n\n  /// Returns the passed list, to test serialization and deserialization.\n  Future<List<AllNullableTypes?>?> echoNullableClassList(\n    List<AllNullableTypes?>? classList,\n  ) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.echoNullableClassList$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[classList],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else {\n      return (pigeonVar_replyList[0] as List<Object?>?)\n          ?.cast<AllNullableTypes?>();\n    }\n  }\n\n  /// Returns the passed list, to test serialization and deserialization.\n  Future<List<AnEnum>?> echoNullableNonNullEnumList(\n    List<AnEnum>? enumList,\n  ) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.echoNullableNonNullEnumList$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[enumList],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else {\n      return (pigeonVar_replyList[0] as List<Object?>?)?.cast<AnEnum>();\n    }\n  }\n\n  /// Returns the passed list, to test serialization and deserialization.\n  Future<List<AllNullableTypes>?> echoNullableNonNullClassList(\n    List<AllNullableTypes>? classList,\n  ) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.echoNullableNonNullClassList$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[classList],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else {\n      return (pigeonVar_replyList[0] as List<Object?>?)\n          ?.cast<AllNullableTypes>();\n    }\n  }\n\n  /// Returns the passed map, to test serialization and deserialization.\n  Future<Map<Object?, Object?>?> echoNullableMap(\n    Map<Object?, Object?>? map,\n  ) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.echoNullableMap$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[map],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else {\n      return (pigeonVar_replyList[0] as Map<Object?, Object?>?)\n          ?.cast<Object?, Object?>();\n    }\n  }\n\n  /// Returns the passed map, to test serialization and deserialization.\n  Future<Map<String?, String?>?> echoNullableStringMap(\n    Map<String?, String?>? stringMap,\n  ) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.echoNullableStringMap$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[stringMap],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else {\n      return (pigeonVar_replyList[0] as Map<Object?, Object?>?)\n          ?.cast<String?, String?>();\n    }\n  }\n\n  /// Returns the passed map, to test serialization and deserialization.\n  Future<Map<int?, int?>?> echoNullableIntMap(Map<int?, int?>? intMap) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.echoNullableIntMap$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[intMap],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else {\n      return (pigeonVar_replyList[0] as Map<Object?, Object?>?)\n          ?.cast<int?, int?>();\n    }\n  }\n\n  /// Returns the passed map, to test serialization and deserialization.\n  Future<Map<AnEnum?, AnEnum?>?> echoNullableEnumMap(\n    Map<AnEnum?, AnEnum?>? enumMap,\n  ) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.echoNullableEnumMap$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[enumMap],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else {\n      return (pigeonVar_replyList[0] as Map<Object?, Object?>?)\n          ?.cast<AnEnum?, AnEnum?>();\n    }\n  }\n\n  /// Returns the passed map, to test serialization and deserialization.\n  Future<Map<int?, AllNullableTypes?>?> echoNullableClassMap(\n    Map<int?, AllNullableTypes?>? classMap,\n  ) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.echoNullableClassMap$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[classMap],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else {\n      return (pigeonVar_replyList[0] as Map<Object?, Object?>?)\n          ?.cast<int?, AllNullableTypes?>();\n    }\n  }\n\n  /// Returns the passed map, to test serialization and deserialization.\n  Future<Map<String, String>?> echoNullableNonNullStringMap(\n    Map<String, String>? stringMap,\n  ) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.echoNullableNonNullStringMap$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[stringMap],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else {\n      return (pigeonVar_replyList[0] as Map<Object?, Object?>?)\n          ?.cast<String, String>();\n    }\n  }\n\n  /// Returns the passed map, to test serialization and deserialization.\n  Future<Map<int, int>?> echoNullableNonNullIntMap(\n    Map<int, int>? intMap,\n  ) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.echoNullableNonNullIntMap$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[intMap],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else {\n      return (pigeonVar_replyList[0] as Map<Object?, Object?>?)\n          ?.cast<int, int>();\n    }\n  }\n\n  /// Returns the passed map, to test serialization and deserialization.\n  Future<Map<AnEnum, AnEnum>?> echoNullableNonNullEnumMap(\n    Map<AnEnum, AnEnum>? enumMap,\n  ) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.echoNullableNonNullEnumMap$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[enumMap],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else {\n      return (pigeonVar_replyList[0] as Map<Object?, Object?>?)\n          ?.cast<AnEnum, AnEnum>();\n    }\n  }\n\n  /// Returns the passed map, to test serialization and deserialization.\n  Future<Map<int, AllNullableTypes>?> echoNullableNonNullClassMap(\n    Map<int, AllNullableTypes>? classMap,\n  ) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.echoNullableNonNullClassMap$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[classMap],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else {\n      return (pigeonVar_replyList[0] as Map<Object?, Object?>?)\n          ?.cast<int, AllNullableTypes>();\n    }\n  }\n\n  Future<AnEnum?> echoNullableEnum(AnEnum? anEnum) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.echoNullableEnum$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[anEnum],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else {\n      return (pigeonVar_replyList[0] as AnEnum?);\n    }\n  }\n\n  Future<AnotherEnum?> echoAnotherNullableEnum(AnotherEnum? anotherEnum) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.echoAnotherNullableEnum$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[anotherEnum],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else {\n      return (pigeonVar_replyList[0] as AnotherEnum?);\n    }\n  }\n\n  /// Returns passed in int.\n  Future<int?> echoOptionalNullableInt([int? aNullableInt]) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.echoOptionalNullableInt$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[aNullableInt],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else {\n      return (pigeonVar_replyList[0] as int?);\n    }\n  }\n\n  /// Returns the passed in string.\n  Future<String?> echoNamedNullableString({String? aNullableString}) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.echoNamedNullableString$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[aNullableString],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else {\n      return (pigeonVar_replyList[0] as String?);\n    }\n  }\n\n  /// A no-op function taking no arguments and returning no value, to sanity\n  /// test basic asynchronous calling.\n  Future<void> noopAsync() async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.noopAsync$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(null);\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else {\n      return;\n    }\n  }\n\n  /// Returns passed in int asynchronously.\n  Future<int> echoAsyncInt(int anInt) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.echoAsyncInt$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[anInt],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else if (pigeonVar_replyList[0] == null) {\n      throw PlatformException(\n        code: 'null-error',\n        message: 'Host platform returned null value for non-null return value.',\n      );\n    } else {\n      return (pigeonVar_replyList[0] as int?)!;\n    }\n  }\n\n  /// Returns passed in double asynchronously.\n  Future<double> echoAsyncDouble(double aDouble) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.echoAsyncDouble$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[aDouble],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else if (pigeonVar_replyList[0] == null) {\n      throw PlatformException(\n        code: 'null-error',\n        message: 'Host platform returned null value for non-null return value.',\n      );\n    } else {\n      return (pigeonVar_replyList[0] as double?)!;\n    }\n  }\n\n  /// Returns the passed in boolean asynchronously.\n  Future<bool> echoAsyncBool(bool aBool) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.echoAsyncBool$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[aBool],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else if (pigeonVar_replyList[0] == null) {\n      throw PlatformException(\n        code: 'null-error',\n        message: 'Host platform returned null value for non-null return value.',\n      );\n    } else {\n      return (pigeonVar_replyList[0] as bool?)!;\n    }\n  }\n\n  /// Returns the passed string asynchronously.\n  Future<String> echoAsyncString(String aString) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.echoAsyncString$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[aString],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else if (pigeonVar_replyList[0] == null) {\n      throw PlatformException(\n        code: 'null-error',\n        message: 'Host platform returned null value for non-null return value.',\n      );\n    } else {\n      return (pigeonVar_replyList[0] as String?)!;\n    }\n  }\n\n  /// Returns the passed in Uint8List asynchronously.\n  Future<Uint8List> echoAsyncUint8List(Uint8List aUint8List) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.echoAsyncUint8List$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[aUint8List],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else if (pigeonVar_replyList[0] == null) {\n      throw PlatformException(\n        code: 'null-error',\n        message: 'Host platform returned null value for non-null return value.',\n      );\n    } else {\n      return (pigeonVar_replyList[0] as Uint8List?)!;\n    }\n  }\n\n  /// Returns the passed in generic Object asynchronously.\n  Future<Object> echoAsyncObject(Object anObject) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.echoAsyncObject$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[anObject],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else if (pigeonVar_replyList[0] == null) {\n      throw PlatformException(\n        code: 'null-error',\n        message: 'Host platform returned null value for non-null return value.',\n      );\n    } else {\n      return pigeonVar_replyList[0]!;\n    }\n  }\n\n  /// Returns the passed list, to test asynchronous serialization and deserialization.\n  Future<List<Object?>> echoAsyncList(List<Object?> list) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.echoAsyncList$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[list],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else if (pigeonVar_replyList[0] == null) {\n      throw PlatformException(\n        code: 'null-error',\n        message: 'Host platform returned null value for non-null return value.',\n      );\n    } else {\n      return (pigeonVar_replyList[0] as List<Object?>?)!.cast<Object?>();\n    }\n  }\n\n  /// Returns the passed list, to test asynchronous serialization and deserialization.\n  Future<List<AnEnum?>> echoAsyncEnumList(List<AnEnum?> enumList) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.echoAsyncEnumList$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[enumList],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else if (pigeonVar_replyList[0] == null) {\n      throw PlatformException(\n        code: 'null-error',\n        message: 'Host platform returned null value for non-null return value.',\n      );\n    } else {\n      return (pigeonVar_replyList[0] as List<Object?>?)!.cast<AnEnum?>();\n    }\n  }\n\n  /// Returns the passed list, to test asynchronous serialization and deserialization.\n  Future<List<AllNullableTypes?>> echoAsyncClassList(\n    List<AllNullableTypes?> classList,\n  ) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.echoAsyncClassList$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[classList],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else if (pigeonVar_replyList[0] == null) {\n      throw PlatformException(\n        code: 'null-error',\n        message: 'Host platform returned null value for non-null return value.',\n      );\n    } else {\n      return (pigeonVar_replyList[0] as List<Object?>?)!\n          .cast<AllNullableTypes?>();\n    }\n  }\n\n  /// Returns the passed map, to test asynchronous serialization and deserialization.\n  Future<Map<Object?, Object?>> echoAsyncMap(Map<Object?, Object?> map) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.echoAsyncMap$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[map],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else if (pigeonVar_replyList[0] == null) {\n      throw PlatformException(\n        code: 'null-error',\n        message: 'Host platform returned null value for non-null return value.',\n      );\n    } else {\n      return (pigeonVar_replyList[0] as Map<Object?, Object?>?)!\n          .cast<Object?, Object?>();\n    }\n  }\n\n  /// Returns the passed map, to test asynchronous serialization and deserialization.\n  Future<Map<String?, String?>> echoAsyncStringMap(\n    Map<String?, String?> stringMap,\n  ) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.echoAsyncStringMap$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[stringMap],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else if (pigeonVar_replyList[0] == null) {\n      throw PlatformException(\n        code: 'null-error',\n        message: 'Host platform returned null value for non-null return value.',\n      );\n    } else {\n      return (pigeonVar_replyList[0] as Map<Object?, Object?>?)!\n          .cast<String?, String?>();\n    }\n  }\n\n  /// Returns the passed map, to test asynchronous serialization and deserialization.\n  Future<Map<int?, int?>> echoAsyncIntMap(Map<int?, int?> intMap) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.echoAsyncIntMap$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[intMap],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else if (pigeonVar_replyList[0] == null) {\n      throw PlatformException(\n        code: 'null-error',\n        message: 'Host platform returned null value for non-null return value.',\n      );\n    } else {\n      return (pigeonVar_replyList[0] as Map<Object?, Object?>?)!\n          .cast<int?, int?>();\n    }\n  }\n\n  /// Returns the passed map, to test asynchronous serialization and deserialization.\n  Future<Map<AnEnum?, AnEnum?>> echoAsyncEnumMap(\n    Map<AnEnum?, AnEnum?> enumMap,\n  ) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.echoAsyncEnumMap$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[enumMap],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else if (pigeonVar_replyList[0] == null) {\n      throw PlatformException(\n        code: 'null-error',\n        message: 'Host platform returned null value for non-null return value.',\n      );\n    } else {\n      return (pigeonVar_replyList[0] as Map<Object?, Object?>?)!\n          .cast<AnEnum?, AnEnum?>();\n    }\n  }\n\n  /// Returns the passed map, to test asynchronous serialization and deserialization.\n  Future<Map<int?, AllNullableTypes?>> echoAsyncClassMap(\n    Map<int?, AllNullableTypes?> classMap,\n  ) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.echoAsyncClassMap$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[classMap],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else if (pigeonVar_replyList[0] == null) {\n      throw PlatformException(\n        code: 'null-error',\n        message: 'Host platform returned null value for non-null return value.',\n      );\n    } else {\n      return (pigeonVar_replyList[0] as Map<Object?, Object?>?)!\n          .cast<int?, AllNullableTypes?>();\n    }\n  }\n\n  /// Returns the passed enum, to test asynchronous serialization and deserialization.\n  Future<AnEnum> echoAsyncEnum(AnEnum anEnum) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.echoAsyncEnum$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[anEnum],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else if (pigeonVar_replyList[0] == null) {\n      throw PlatformException(\n        code: 'null-error',\n        message: 'Host platform returned null value for non-null return value.',\n      );\n    } else {\n      return (pigeonVar_replyList[0] as AnEnum?)!;\n    }\n  }\n\n  /// Returns the passed enum, to test asynchronous serialization and deserialization.\n  Future<AnotherEnum> echoAnotherAsyncEnum(AnotherEnum anotherEnum) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.echoAnotherAsyncEnum$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[anotherEnum],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else if (pigeonVar_replyList[0] == null) {\n      throw PlatformException(\n        code: 'null-error',\n        message: 'Host platform returned null value for non-null return value.',\n      );\n    } else {\n      return (pigeonVar_replyList[0] as AnotherEnum?)!;\n    }\n  }\n\n  /// Responds with an error from an async function returning a value.\n  Future<Object?> throwAsyncError() async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.throwAsyncError$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(null);\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else {\n      return pigeonVar_replyList[0];\n    }\n  }\n\n  /// Responds with an error from an async void function.\n  Future<void> throwAsyncErrorFromVoid() async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.throwAsyncErrorFromVoid$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(null);\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else {\n      return;\n    }\n  }\n\n  /// Responds with a Flutter error from an async function returning a value.\n  Future<Object?> throwAsyncFlutterError() async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.throwAsyncFlutterError$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(null);\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else {\n      return pigeonVar_replyList[0];\n    }\n  }\n\n  /// Returns the passed object, to test async serialization and deserialization.\n  Future<AllTypes> echoAsyncAllTypes(AllTypes everything) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.echoAsyncAllTypes$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[everything],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else if (pigeonVar_replyList[0] == null) {\n      throw PlatformException(\n        code: 'null-error',\n        message: 'Host platform returned null value for non-null return value.',\n      );\n    } else {\n      return (pigeonVar_replyList[0] as AllTypes?)!;\n    }\n  }\n\n  /// Returns the passed object, to test serialization and deserialization.\n  Future<AllNullableTypes?> echoAsyncNullableAllNullableTypes(\n    AllNullableTypes? everything,\n  ) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.echoAsyncNullableAllNullableTypes$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[everything],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else {\n      return (pigeonVar_replyList[0] as AllNullableTypes?);\n    }\n  }\n\n  /// Returns the passed object, to test serialization and deserialization.\n  Future<AllNullableTypesWithoutRecursion?>\n  echoAsyncNullableAllNullableTypesWithoutRecursion(\n    AllNullableTypesWithoutRecursion? everything,\n  ) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.echoAsyncNullableAllNullableTypesWithoutRecursion$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[everything],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else {\n      return (pigeonVar_replyList[0] as AllNullableTypesWithoutRecursion?);\n    }\n  }\n\n  /// Returns passed in int asynchronously.\n  Future<int?> echoAsyncNullableInt(int? anInt) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.echoAsyncNullableInt$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[anInt],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else {\n      return (pigeonVar_replyList[0] as int?);\n    }\n  }\n\n  /// Returns passed in double asynchronously.\n  Future<double?> echoAsyncNullableDouble(double? aDouble) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.echoAsyncNullableDouble$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[aDouble],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else {\n      return (pigeonVar_replyList[0] as double?);\n    }\n  }\n\n  /// Returns the passed in boolean asynchronously.\n  Future<bool?> echoAsyncNullableBool(bool? aBool) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.echoAsyncNullableBool$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[aBool],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else {\n      return (pigeonVar_replyList[0] as bool?);\n    }\n  }\n\n  /// Returns the passed string asynchronously.\n  Future<String?> echoAsyncNullableString(String? aString) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.echoAsyncNullableString$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[aString],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else {\n      return (pigeonVar_replyList[0] as String?);\n    }\n  }\n\n  /// Returns the passed in Uint8List asynchronously.\n  Future<Uint8List?> echoAsyncNullableUint8List(Uint8List? aUint8List) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.echoAsyncNullableUint8List$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[aUint8List],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else {\n      return (pigeonVar_replyList[0] as Uint8List?);\n    }\n  }\n\n  /// Returns the passed in generic Object asynchronously.\n  Future<Object?> echoAsyncNullableObject(Object? anObject) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.echoAsyncNullableObject$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[anObject],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else {\n      return pigeonVar_replyList[0];\n    }\n  }\n\n  /// Returns the passed list, to test asynchronous serialization and deserialization.\n  Future<List<Object?>?> echoAsyncNullableList(List<Object?>? list) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.echoAsyncNullableList$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[list],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else {\n      return (pigeonVar_replyList[0] as List<Object?>?)?.cast<Object?>();\n    }\n  }\n\n  /// Returns the passed list, to test asynchronous serialization and deserialization.\n  Future<List<AnEnum?>?> echoAsyncNullableEnumList(\n    List<AnEnum?>? enumList,\n  ) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.echoAsyncNullableEnumList$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[enumList],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else {\n      return (pigeonVar_replyList[0] as List<Object?>?)?.cast<AnEnum?>();\n    }\n  }\n\n  /// Returns the passed list, to test asynchronous serialization and deserialization.\n  Future<List<AllNullableTypes?>?> echoAsyncNullableClassList(\n    List<AllNullableTypes?>? classList,\n  ) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.echoAsyncNullableClassList$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[classList],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else {\n      return (pigeonVar_replyList[0] as List<Object?>?)\n          ?.cast<AllNullableTypes?>();\n    }\n  }\n\n  /// Returns the passed map, to test asynchronous serialization and deserialization.\n  Future<Map<Object?, Object?>?> echoAsyncNullableMap(\n    Map<Object?, Object?>? map,\n  ) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.echoAsyncNullableMap$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[map],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else {\n      return (pigeonVar_replyList[0] as Map<Object?, Object?>?)\n          ?.cast<Object?, Object?>();\n    }\n  }\n\n  /// Returns the passed map, to test asynchronous serialization and deserialization.\n  Future<Map<String?, String?>?> echoAsyncNullableStringMap(\n    Map<String?, String?>? stringMap,\n  ) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.echoAsyncNullableStringMap$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[stringMap],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else {\n      return (pigeonVar_replyList[0] as Map<Object?, Object?>?)\n          ?.cast<String?, String?>();\n    }\n  }\n\n  /// Returns the passed map, to test asynchronous serialization and deserialization.\n  Future<Map<int?, int?>?> echoAsyncNullableIntMap(\n    Map<int?, int?>? intMap,\n  ) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.echoAsyncNullableIntMap$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[intMap],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else {\n      return (pigeonVar_replyList[0] as Map<Object?, Object?>?)\n          ?.cast<int?, int?>();\n    }\n  }\n\n  /// Returns the passed map, to test asynchronous serialization and deserialization.\n  Future<Map<AnEnum?, AnEnum?>?> echoAsyncNullableEnumMap(\n    Map<AnEnum?, AnEnum?>? enumMap,\n  ) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.echoAsyncNullableEnumMap$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[enumMap],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else {\n      return (pigeonVar_replyList[0] as Map<Object?, Object?>?)\n          ?.cast<AnEnum?, AnEnum?>();\n    }\n  }\n\n  /// Returns the passed map, to test asynchronous serialization and deserialization.\n  Future<Map<int?, AllNullableTypes?>?> echoAsyncNullableClassMap(\n    Map<int?, AllNullableTypes?>? classMap,\n  ) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.echoAsyncNullableClassMap$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[classMap],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else {\n      return (pigeonVar_replyList[0] as Map<Object?, Object?>?)\n          ?.cast<int?, AllNullableTypes?>();\n    }\n  }\n\n  /// Returns the passed enum, to test asynchronous serialization and deserialization.\n  Future<AnEnum?> echoAsyncNullableEnum(AnEnum? anEnum) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.echoAsyncNullableEnum$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[anEnum],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else {\n      return (pigeonVar_replyList[0] as AnEnum?);\n    }\n  }\n\n  /// Returns the passed enum, to test asynchronous serialization and deserialization.\n  Future<AnotherEnum?> echoAnotherAsyncNullableEnum(\n    AnotherEnum? anotherEnum,\n  ) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.echoAnotherAsyncNullableEnum$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[anotherEnum],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else {\n      return (pigeonVar_replyList[0] as AnotherEnum?);\n    }\n  }\n\n  /// Returns true if the handler is run on a main thread, which should be\n  /// true since there is no TaskQueue annotation.\n  Future<bool> defaultIsMainThread() async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.defaultIsMainThread$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(null);\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else if (pigeonVar_replyList[0] == null) {\n      throw PlatformException(\n        code: 'null-error',\n        message: 'Host platform returned null value for non-null return value.',\n      );\n    } else {\n      return (pigeonVar_replyList[0] as bool?)!;\n    }\n  }\n\n  /// Returns true if the handler is run on a non-main thread, which should be\n  /// true for any platform with TaskQueue support.\n  Future<bool> taskQueueIsBackgroundThread() async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.taskQueueIsBackgroundThread$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(null);\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else if (pigeonVar_replyList[0] == null) {\n      throw PlatformException(\n        code: 'null-error',\n        message: 'Host platform returned null value for non-null return value.',\n      );\n    } else {\n      return (pigeonVar_replyList[0] as bool?)!;\n    }\n  }\n\n  Future<void> callFlutterNoop() async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.callFlutterNoop$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(null);\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else {\n      return;\n    }\n  }\n\n  Future<Object?> callFlutterThrowError() async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.callFlutterThrowError$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(null);\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else {\n      return pigeonVar_replyList[0];\n    }\n  }\n\n  Future<void> callFlutterThrowErrorFromVoid() async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.callFlutterThrowErrorFromVoid$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(null);\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else {\n      return;\n    }\n  }\n\n  Future<AllTypes> callFlutterEchoAllTypes(AllTypes everything) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.callFlutterEchoAllTypes$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[everything],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else if (pigeonVar_replyList[0] == null) {\n      throw PlatformException(\n        code: 'null-error',\n        message: 'Host platform returned null value for non-null return value.',\n      );\n    } else {\n      return (pigeonVar_replyList[0] as AllTypes?)!;\n    }\n  }\n\n  Future<AllNullableTypes?> callFlutterEchoAllNullableTypes(\n    AllNullableTypes? everything,\n  ) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.callFlutterEchoAllNullableTypes$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[everything],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else {\n      return (pigeonVar_replyList[0] as AllNullableTypes?);\n    }\n  }\n\n  Future<AllNullableTypes> callFlutterSendMultipleNullableTypes(\n    bool? aNullableBool,\n    int? aNullableInt,\n    String? aNullableString,\n  ) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.callFlutterSendMultipleNullableTypes$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[aNullableBool, aNullableInt, aNullableString],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else if (pigeonVar_replyList[0] == null) {\n      throw PlatformException(\n        code: 'null-error',\n        message: 'Host platform returned null value for non-null return value.',\n      );\n    } else {\n      return (pigeonVar_replyList[0] as AllNullableTypes?)!;\n    }\n  }\n\n  Future<AllNullableTypesWithoutRecursion?>\n  callFlutterEchoAllNullableTypesWithoutRecursion(\n    AllNullableTypesWithoutRecursion? everything,\n  ) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.callFlutterEchoAllNullableTypesWithoutRecursion$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[everything],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else {\n      return (pigeonVar_replyList[0] as AllNullableTypesWithoutRecursion?);\n    }\n  }\n\n  Future<AllNullableTypesWithoutRecursion>\n  callFlutterSendMultipleNullableTypesWithoutRecursion(\n    bool? aNullableBool,\n    int? aNullableInt,\n    String? aNullableString,\n  ) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.callFlutterSendMultipleNullableTypesWithoutRecursion$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[aNullableBool, aNullableInt, aNullableString],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else if (pigeonVar_replyList[0] == null) {\n      throw PlatformException(\n        code: 'null-error',\n        message: 'Host platform returned null value for non-null return value.',\n      );\n    } else {\n      return (pigeonVar_replyList[0] as AllNullableTypesWithoutRecursion?)!;\n    }\n  }\n\n  Future<bool> callFlutterEchoBool(bool aBool) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.callFlutterEchoBool$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[aBool],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else if (pigeonVar_replyList[0] == null) {\n      throw PlatformException(\n        code: 'null-error',\n        message: 'Host platform returned null value for non-null return value.',\n      );\n    } else {\n      return (pigeonVar_replyList[0] as bool?)!;\n    }\n  }\n\n  Future<int> callFlutterEchoInt(int anInt) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.callFlutterEchoInt$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[anInt],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else if (pigeonVar_replyList[0] == null) {\n      throw PlatformException(\n        code: 'null-error',\n        message: 'Host platform returned null value for non-null return value.',\n      );\n    } else {\n      return (pigeonVar_replyList[0] as int?)!;\n    }\n  }\n\n  Future<double> callFlutterEchoDouble(double aDouble) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.callFlutterEchoDouble$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[aDouble],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else if (pigeonVar_replyList[0] == null) {\n      throw PlatformException(\n        code: 'null-error',\n        message: 'Host platform returned null value for non-null return value.',\n      );\n    } else {\n      return (pigeonVar_replyList[0] as double?)!;\n    }\n  }\n\n  Future<String> callFlutterEchoString(String aString) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.callFlutterEchoString$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[aString],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else if (pigeonVar_replyList[0] == null) {\n      throw PlatformException(\n        code: 'null-error',\n        message: 'Host platform returned null value for non-null return value.',\n      );\n    } else {\n      return (pigeonVar_replyList[0] as String?)!;\n    }\n  }\n\n  Future<Uint8List> callFlutterEchoUint8List(Uint8List list) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.callFlutterEchoUint8List$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[list],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else if (pigeonVar_replyList[0] == null) {\n      throw PlatformException(\n        code: 'null-error',\n        message: 'Host platform returned null value for non-null return value.',\n      );\n    } else {\n      return (pigeonVar_replyList[0] as Uint8List?)!;\n    }\n  }\n\n  Future<List<Object?>> callFlutterEchoList(List<Object?> list) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.callFlutterEchoList$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[list],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else if (pigeonVar_replyList[0] == null) {\n      throw PlatformException(\n        code: 'null-error',\n        message: 'Host platform returned null value for non-null return value.',\n      );\n    } else {\n      return (pigeonVar_replyList[0] as List<Object?>?)!.cast<Object?>();\n    }\n  }\n\n  Future<List<AnEnum?>> callFlutterEchoEnumList(List<AnEnum?> enumList) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.callFlutterEchoEnumList$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[enumList],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else if (pigeonVar_replyList[0] == null) {\n      throw PlatformException(\n        code: 'null-error',\n        message: 'Host platform returned null value for non-null return value.',\n      );\n    } else {\n      return (pigeonVar_replyList[0] as List<Object?>?)!.cast<AnEnum?>();\n    }\n  }\n\n  Future<List<AllNullableTypes?>> callFlutterEchoClassList(\n    List<AllNullableTypes?> classList,\n  ) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.callFlutterEchoClassList$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[classList],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else if (pigeonVar_replyList[0] == null) {\n      throw PlatformException(\n        code: 'null-error',\n        message: 'Host platform returned null value for non-null return value.',\n      );\n    } else {\n      return (pigeonVar_replyList[0] as List<Object?>?)!\n          .cast<AllNullableTypes?>();\n    }\n  }\n\n  Future<List<AnEnum>> callFlutterEchoNonNullEnumList(\n    List<AnEnum> enumList,\n  ) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.callFlutterEchoNonNullEnumList$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[enumList],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else if (pigeonVar_replyList[0] == null) {\n      throw PlatformException(\n        code: 'null-error',\n        message: 'Host platform returned null value for non-null return value.',\n      );\n    } else {\n      return (pigeonVar_replyList[0] as List<Object?>?)!.cast<AnEnum>();\n    }\n  }\n\n  Future<List<AllNullableTypes>> callFlutterEchoNonNullClassList(\n    List<AllNullableTypes> classList,\n  ) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.callFlutterEchoNonNullClassList$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[classList],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else if (pigeonVar_replyList[0] == null) {\n      throw PlatformException(\n        code: 'null-error',\n        message: 'Host platform returned null value for non-null return value.',\n      );\n    } else {\n      return (pigeonVar_replyList[0] as List<Object?>?)!\n          .cast<AllNullableTypes>();\n    }\n  }\n\n  Future<Map<Object?, Object?>> callFlutterEchoMap(\n    Map<Object?, Object?> map,\n  ) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.callFlutterEchoMap$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[map],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else if (pigeonVar_replyList[0] == null) {\n      throw PlatformException(\n        code: 'null-error',\n        message: 'Host platform returned null value for non-null return value.',\n      );\n    } else {\n      return (pigeonVar_replyList[0] as Map<Object?, Object?>?)!\n          .cast<Object?, Object?>();\n    }\n  }\n\n  Future<Map<String?, String?>> callFlutterEchoStringMap(\n    Map<String?, String?> stringMap,\n  ) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.callFlutterEchoStringMap$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[stringMap],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else if (pigeonVar_replyList[0] == null) {\n      throw PlatformException(\n        code: 'null-error',\n        message: 'Host platform returned null value for non-null return value.',\n      );\n    } else {\n      return (pigeonVar_replyList[0] as Map<Object?, Object?>?)!\n          .cast<String?, String?>();\n    }\n  }\n\n  Future<Map<int?, int?>> callFlutterEchoIntMap(Map<int?, int?> intMap) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.callFlutterEchoIntMap$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[intMap],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else if (pigeonVar_replyList[0] == null) {\n      throw PlatformException(\n        code: 'null-error',\n        message: 'Host platform returned null value for non-null return value.',\n      );\n    } else {\n      return (pigeonVar_replyList[0] as Map<Object?, Object?>?)!\n          .cast<int?, int?>();\n    }\n  }\n\n  Future<Map<AnEnum?, AnEnum?>> callFlutterEchoEnumMap(\n    Map<AnEnum?, AnEnum?> enumMap,\n  ) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.callFlutterEchoEnumMap$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[enumMap],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else if (pigeonVar_replyList[0] == null) {\n      throw PlatformException(\n        code: 'null-error',\n        message: 'Host platform returned null value for non-null return value.',\n      );\n    } else {\n      return (pigeonVar_replyList[0] as Map<Object?, Object?>?)!\n          .cast<AnEnum?, AnEnum?>();\n    }\n  }\n\n  Future<Map<int?, AllNullableTypes?>> callFlutterEchoClassMap(\n    Map<int?, AllNullableTypes?> classMap,\n  ) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.callFlutterEchoClassMap$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[classMap],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else if (pigeonVar_replyList[0] == null) {\n      throw PlatformException(\n        code: 'null-error',\n        message: 'Host platform returned null value for non-null return value.',\n      );\n    } else {\n      return (pigeonVar_replyList[0] as Map<Object?, Object?>?)!\n          .cast<int?, AllNullableTypes?>();\n    }\n  }\n\n  Future<Map<String, String>> callFlutterEchoNonNullStringMap(\n    Map<String, String> stringMap,\n  ) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.callFlutterEchoNonNullStringMap$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[stringMap],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else if (pigeonVar_replyList[0] == null) {\n      throw PlatformException(\n        code: 'null-error',\n        message: 'Host platform returned null value for non-null return value.',\n      );\n    } else {\n      return (pigeonVar_replyList[0] as Map<Object?, Object?>?)!\n          .cast<String, String>();\n    }\n  }\n\n  Future<Map<int, int>> callFlutterEchoNonNullIntMap(\n    Map<int, int> intMap,\n  ) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.callFlutterEchoNonNullIntMap$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[intMap],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else if (pigeonVar_replyList[0] == null) {\n      throw PlatformException(\n        code: 'null-error',\n        message: 'Host platform returned null value for non-null return value.',\n      );\n    } else {\n      return (pigeonVar_replyList[0] as Map<Object?, Object?>?)!\n          .cast<int, int>();\n    }\n  }\n\n  Future<Map<AnEnum, AnEnum>> callFlutterEchoNonNullEnumMap(\n    Map<AnEnum, AnEnum> enumMap,\n  ) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.callFlutterEchoNonNullEnumMap$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[enumMap],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else if (pigeonVar_replyList[0] == null) {\n      throw PlatformException(\n        code: 'null-error',\n        message: 'Host platform returned null value for non-null return value.',\n      );\n    } else {\n      return (pigeonVar_replyList[0] as Map<Object?, Object?>?)!\n          .cast<AnEnum, AnEnum>();\n    }\n  }\n\n  Future<Map<int, AllNullableTypes>> callFlutterEchoNonNullClassMap(\n    Map<int, AllNullableTypes> classMap,\n  ) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.callFlutterEchoNonNullClassMap$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[classMap],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else if (pigeonVar_replyList[0] == null) {\n      throw PlatformException(\n        code: 'null-error',\n        message: 'Host platform returned null value for non-null return value.',\n      );\n    } else {\n      return (pigeonVar_replyList[0] as Map<Object?, Object?>?)!\n          .cast<int, AllNullableTypes>();\n    }\n  }\n\n  Future<AnEnum> callFlutterEchoEnum(AnEnum anEnum) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.callFlutterEchoEnum$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[anEnum],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else if (pigeonVar_replyList[0] == null) {\n      throw PlatformException(\n        code: 'null-error',\n        message: 'Host platform returned null value for non-null return value.',\n      );\n    } else {\n      return (pigeonVar_replyList[0] as AnEnum?)!;\n    }\n  }\n\n  Future<AnotherEnum> callFlutterEchoAnotherEnum(\n    AnotherEnum anotherEnum,\n  ) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.callFlutterEchoAnotherEnum$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[anotherEnum],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else if (pigeonVar_replyList[0] == null) {\n      throw PlatformException(\n        code: 'null-error',\n        message: 'Host platform returned null value for non-null return value.',\n      );\n    } else {\n      return (pigeonVar_replyList[0] as AnotherEnum?)!;\n    }\n  }\n\n  Future<bool?> callFlutterEchoNullableBool(bool? aBool) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.callFlutterEchoNullableBool$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[aBool],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else {\n      return (pigeonVar_replyList[0] as bool?);\n    }\n  }\n\n  Future<int?> callFlutterEchoNullableInt(int? anInt) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.callFlutterEchoNullableInt$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[anInt],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else {\n      return (pigeonVar_replyList[0] as int?);\n    }\n  }\n\n  Future<double?> callFlutterEchoNullableDouble(double? aDouble) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.callFlutterEchoNullableDouble$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[aDouble],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else {\n      return (pigeonVar_replyList[0] as double?);\n    }\n  }\n\n  Future<String?> callFlutterEchoNullableString(String? aString) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.callFlutterEchoNullableString$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[aString],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else {\n      return (pigeonVar_replyList[0] as String?);\n    }\n  }\n\n  Future<Uint8List?> callFlutterEchoNullableUint8List(Uint8List? list) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.callFlutterEchoNullableUint8List$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[list],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else {\n      return (pigeonVar_replyList[0] as Uint8List?);\n    }\n  }\n\n  Future<List<Object?>?> callFlutterEchoNullableList(\n    List<Object?>? list,\n  ) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.callFlutterEchoNullableList$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[list],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else {\n      return (pigeonVar_replyList[0] as List<Object?>?)?.cast<Object?>();\n    }\n  }\n\n  Future<List<AnEnum?>?> callFlutterEchoNullableEnumList(\n    List<AnEnum?>? enumList,\n  ) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.callFlutterEchoNullableEnumList$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[enumList],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else {\n      return (pigeonVar_replyList[0] as List<Object?>?)?.cast<AnEnum?>();\n    }\n  }\n\n  Future<List<AllNullableTypes?>?> callFlutterEchoNullableClassList(\n    List<AllNullableTypes?>? classList,\n  ) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.callFlutterEchoNullableClassList$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[classList],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else {\n      return (pigeonVar_replyList[0] as List<Object?>?)\n          ?.cast<AllNullableTypes?>();\n    }\n  }\n\n  Future<List<AnEnum>?> callFlutterEchoNullableNonNullEnumList(\n    List<AnEnum>? enumList,\n  ) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.callFlutterEchoNullableNonNullEnumList$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[enumList],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else {\n      return (pigeonVar_replyList[0] as List<Object?>?)?.cast<AnEnum>();\n    }\n  }\n\n  Future<List<AllNullableTypes>?> callFlutterEchoNullableNonNullClassList(\n    List<AllNullableTypes>? classList,\n  ) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.callFlutterEchoNullableNonNullClassList$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[classList],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else {\n      return (pigeonVar_replyList[0] as List<Object?>?)\n          ?.cast<AllNullableTypes>();\n    }\n  }\n\n  Future<Map<Object?, Object?>?> callFlutterEchoNullableMap(\n    Map<Object?, Object?>? map,\n  ) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.callFlutterEchoNullableMap$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[map],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else {\n      return (pigeonVar_replyList[0] as Map<Object?, Object?>?)\n          ?.cast<Object?, Object?>();\n    }\n  }\n\n  Future<Map<String?, String?>?> callFlutterEchoNullableStringMap(\n    Map<String?, String?>? stringMap,\n  ) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.callFlutterEchoNullableStringMap$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[stringMap],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else {\n      return (pigeonVar_replyList[0] as Map<Object?, Object?>?)\n          ?.cast<String?, String?>();\n    }\n  }\n\n  Future<Map<int?, int?>?> callFlutterEchoNullableIntMap(\n    Map<int?, int?>? intMap,\n  ) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.callFlutterEchoNullableIntMap$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[intMap],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else {\n      return (pigeonVar_replyList[0] as Map<Object?, Object?>?)\n          ?.cast<int?, int?>();\n    }\n  }\n\n  Future<Map<AnEnum?, AnEnum?>?> callFlutterEchoNullableEnumMap(\n    Map<AnEnum?, AnEnum?>? enumMap,\n  ) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.callFlutterEchoNullableEnumMap$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[enumMap],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else {\n      return (pigeonVar_replyList[0] as Map<Object?, Object?>?)\n          ?.cast<AnEnum?, AnEnum?>();\n    }\n  }\n\n  Future<Map<int?, AllNullableTypes?>?> callFlutterEchoNullableClassMap(\n    Map<int?, AllNullableTypes?>? classMap,\n  ) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.callFlutterEchoNullableClassMap$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[classMap],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else {\n      return (pigeonVar_replyList[0] as Map<Object?, Object?>?)\n          ?.cast<int?, AllNullableTypes?>();\n    }\n  }\n\n  Future<Map<String, String>?> callFlutterEchoNullableNonNullStringMap(\n    Map<String, String>? stringMap,\n  ) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.callFlutterEchoNullableNonNullStringMap$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[stringMap],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else {\n      return (pigeonVar_replyList[0] as Map<Object?, Object?>?)\n          ?.cast<String, String>();\n    }\n  }\n\n  Future<Map<int, int>?> callFlutterEchoNullableNonNullIntMap(\n    Map<int, int>? intMap,\n  ) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.callFlutterEchoNullableNonNullIntMap$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[intMap],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else {\n      return (pigeonVar_replyList[0] as Map<Object?, Object?>?)\n          ?.cast<int, int>();\n    }\n  }\n\n  Future<Map<AnEnum, AnEnum>?> callFlutterEchoNullableNonNullEnumMap(\n    Map<AnEnum, AnEnum>? enumMap,\n  ) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.callFlutterEchoNullableNonNullEnumMap$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[enumMap],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else {\n      return (pigeonVar_replyList[0] as Map<Object?, Object?>?)\n          ?.cast<AnEnum, AnEnum>();\n    }\n  }\n\n  Future<Map<int, AllNullableTypes>?> callFlutterEchoNullableNonNullClassMap(\n    Map<int, AllNullableTypes>? classMap,\n  ) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.callFlutterEchoNullableNonNullClassMap$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[classMap],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else {\n      return (pigeonVar_replyList[0] as Map<Object?, Object?>?)\n          ?.cast<int, AllNullableTypes>();\n    }\n  }\n\n  Future<AnEnum?> callFlutterEchoNullableEnum(AnEnum? anEnum) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.callFlutterEchoNullableEnum$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[anEnum],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else {\n      return (pigeonVar_replyList[0] as AnEnum?);\n    }\n  }\n\n  Future<AnotherEnum?> callFlutterEchoAnotherNullableEnum(\n    AnotherEnum? anotherEnum,\n  ) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.callFlutterEchoAnotherNullableEnum$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[anotherEnum],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else {\n      return (pigeonVar_replyList[0] as AnotherEnum?);\n    }\n  }\n\n  Future<String> callFlutterSmallApiEchoString(String aString) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.callFlutterSmallApiEchoString$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[aString],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else if (pigeonVar_replyList[0] == null) {\n      throw PlatformException(\n        code: 'null-error',\n        message: 'Host platform returned null value for non-null return value.',\n      );\n    } else {\n      return (pigeonVar_replyList[0] as String?)!;\n    }\n  }\n}\n\n/// The core interface that the Dart platform_test code implements for host\n/// integration tests to call into.\nabstract class FlutterIntegrationCoreApi {\n  static const MessageCodec<Object?> pigeonChannelCodec = _PigeonCodec();\n\n  /// A no-op function taking no arguments and returning no value, to sanity\n  /// test basic calling.\n  void noop();\n\n  /// Responds with an error from an async function returning a value.\n  Object? throwError();\n\n  /// Responds with an error from an async void function.\n  void throwErrorFromVoid();\n\n  /// Returns the passed object, to test serialization and deserialization.\n  AllTypes echoAllTypes(AllTypes everything);\n\n  /// Returns the passed object, to test serialization and deserialization.\n  AllNullableTypes? echoAllNullableTypes(AllNullableTypes? everything);\n\n  /// Returns passed in arguments of multiple types.\n  ///\n  /// Tests multiple-arity FlutterApi handling.\n  AllNullableTypes sendMultipleNullableTypes(\n    bool? aNullableBool,\n    int? aNullableInt,\n    String? aNullableString,\n  );\n\n  /// Returns the passed object, to test serialization and deserialization.\n  AllNullableTypesWithoutRecursion? echoAllNullableTypesWithoutRecursion(\n    AllNullableTypesWithoutRecursion? everything,\n  );\n\n  /// Returns passed in arguments of multiple types.\n  ///\n  /// Tests multiple-arity FlutterApi handling.\n  AllNullableTypesWithoutRecursion sendMultipleNullableTypesWithoutRecursion(\n    bool? aNullableBool,\n    int? aNullableInt,\n    String? aNullableString,\n  );\n\n  /// Returns the passed boolean, to test serialization and deserialization.\n  bool echoBool(bool aBool);\n\n  /// Returns the passed int, to test serialization and deserialization.\n  int echoInt(int anInt);\n\n  /// Returns the passed double, to test serialization and deserialization.\n  double echoDouble(double aDouble);\n\n  /// Returns the passed string, to test serialization and deserialization.\n  String echoString(String aString);\n\n  /// Returns the passed byte list, to test serialization and deserialization.\n  Uint8List echoUint8List(Uint8List list);\n\n  /// Returns the passed list, to test serialization and deserialization.\n  List<Object?> echoList(List<Object?> list);\n\n  /// Returns the passed list, to test serialization and deserialization.\n  List<AnEnum?> echoEnumList(List<AnEnum?> enumList);\n\n  /// Returns the passed list, to test serialization and deserialization.\n  List<AllNullableTypes?> echoClassList(List<AllNullableTypes?> classList);\n\n  /// Returns the passed list, to test serialization and deserialization.\n  List<AnEnum> echoNonNullEnumList(List<AnEnum> enumList);\n\n  /// Returns the passed list, to test serialization and deserialization.\n  List<AllNullableTypes> echoNonNullClassList(List<AllNullableTypes> classList);\n\n  /// Returns the passed map, to test serialization and deserialization.\n  Map<Object?, Object?> echoMap(Map<Object?, Object?> map);\n\n  /// Returns the passed map, to test serialization and deserialization.\n  Map<String?, String?> echoStringMap(Map<String?, String?> stringMap);\n\n  /// Returns the passed map, to test serialization and deserialization.\n  Map<int?, int?> echoIntMap(Map<int?, int?> intMap);\n\n  /// Returns the passed map, to test serialization and deserialization.\n  Map<AnEnum?, AnEnum?> echoEnumMap(Map<AnEnum?, AnEnum?> enumMap);\n\n  /// Returns the passed map, to test serialization and deserialization.\n  Map<int?, AllNullableTypes?> echoClassMap(\n    Map<int?, AllNullableTypes?> classMap,\n  );\n\n  /// Returns the passed map, to test serialization and deserialization.\n  Map<String, String> echoNonNullStringMap(Map<String, String> stringMap);\n\n  /// Returns the passed map, to test serialization and deserialization.\n  Map<int, int> echoNonNullIntMap(Map<int, int> intMap);\n\n  /// Returns the passed map, to test serialization and deserialization.\n  Map<AnEnum, AnEnum> echoNonNullEnumMap(Map<AnEnum, AnEnum> enumMap);\n\n  /// Returns the passed map, to test serialization and deserialization.\n  Map<int, AllNullableTypes> echoNonNullClassMap(\n    Map<int, AllNullableTypes> classMap,\n  );\n\n  /// Returns the passed enum to test serialization and deserialization.\n  AnEnum echoEnum(AnEnum anEnum);\n\n  /// Returns the passed enum to test serialization and deserialization.\n  AnotherEnum echoAnotherEnum(AnotherEnum anotherEnum);\n\n  /// Returns the passed boolean, to test serialization and deserialization.\n  bool? echoNullableBool(bool? aBool);\n\n  /// Returns the passed int, to test serialization and deserialization.\n  int? echoNullableInt(int? anInt);\n\n  /// Returns the passed double, to test serialization and deserialization.\n  double? echoNullableDouble(double? aDouble);\n\n  /// Returns the passed string, to test serialization and deserialization.\n  String? echoNullableString(String? aString);\n\n  /// Returns the passed byte list, to test serialization and deserialization.\n  Uint8List? echoNullableUint8List(Uint8List? list);\n\n  /// Returns the passed list, to test serialization and deserialization.\n  List<Object?>? echoNullableList(List<Object?>? list);\n\n  /// Returns the passed list, to test serialization and deserialization.\n  List<AnEnum?>? echoNullableEnumList(List<AnEnum?>? enumList);\n\n  /// Returns the passed list, to test serialization and deserialization.\n  List<AllNullableTypes?>? echoNullableClassList(\n    List<AllNullableTypes?>? classList,\n  );\n\n  /// Returns the passed list, to test serialization and deserialization.\n  List<AnEnum>? echoNullableNonNullEnumList(List<AnEnum>? enumList);\n\n  /// Returns the passed list, to test serialization and deserialization.\n  List<AllNullableTypes>? echoNullableNonNullClassList(\n    List<AllNullableTypes>? classList,\n  );\n\n  /// Returns the passed map, to test serialization and deserialization.\n  Map<Object?, Object?>? echoNullableMap(Map<Object?, Object?>? map);\n\n  /// Returns the passed map, to test serialization and deserialization.\n  Map<String?, String?>? echoNullableStringMap(\n    Map<String?, String?>? stringMap,\n  );\n\n  /// Returns the passed map, to test serialization and deserialization.\n  Map<int?, int?>? echoNullableIntMap(Map<int?, int?>? intMap);\n\n  /// Returns the passed map, to test serialization and deserialization.\n  Map<AnEnum?, AnEnum?>? echoNullableEnumMap(Map<AnEnum?, AnEnum?>? enumMap);\n\n  /// Returns the passed map, to test serialization and deserialization.\n  Map<int?, AllNullableTypes?>? echoNullableClassMap(\n    Map<int?, AllNullableTypes?>? classMap,\n  );\n\n  /// Returns the passed map, to test serialization and deserialization.\n  Map<String, String>? echoNullableNonNullStringMap(\n    Map<String, String>? stringMap,\n  );\n\n  /// Returns the passed map, to test serialization and deserialization.\n  Map<int, int>? echoNullableNonNullIntMap(Map<int, int>? intMap);\n\n  /// Returns the passed map, to test serialization and deserialization.\n  Map<AnEnum, AnEnum>? echoNullableNonNullEnumMap(Map<AnEnum, AnEnum>? enumMap);\n\n  /// Returns the passed map, to test serialization and deserialization.\n  Map<int, AllNullableTypes>? echoNullableNonNullClassMap(\n    Map<int, AllNullableTypes>? classMap,\n  );\n\n  /// Returns the passed enum to test serialization and deserialization.\n  AnEnum? echoNullableEnum(AnEnum? anEnum);\n\n  /// Returns the passed enum to test serialization and deserialization.\n  AnotherEnum? echoAnotherNullableEnum(AnotherEnum? anotherEnum);\n\n  /// A no-op function taking no arguments and returning no value, to sanity\n  /// test basic asynchronous calling.\n  Future<void> noopAsync();\n\n  /// Returns the passed in generic Object asynchronously.\n  Future<String> echoAsyncString(String aString);\n\n  static void setUp(\n    FlutterIntegrationCoreApi? api, {\n    BinaryMessenger? binaryMessenger,\n    String messageChannelSuffix = '',\n  }) {\n    messageChannelSuffix = messageChannelSuffix.isNotEmpty\n        ? '.$messageChannelSuffix'\n        : '';\n    {\n      final pigeonVar_channel = BasicMessageChannel<Object?>(\n        'dev.flutter.pigeon.pigeon_integration_tests.FlutterIntegrationCoreApi.noop$messageChannelSuffix',\n        pigeonChannelCodec,\n        binaryMessenger: binaryMessenger,\n      );\n      if (api == null) {\n        pigeonVar_channel.setMessageHandler(null);\n      } else {\n        pigeonVar_channel.setMessageHandler((Object? message) async {\n          try {\n            api.noop();\n            return wrapResponse(empty: true);\n          } on PlatformException catch (e) {\n            return wrapResponse(error: e);\n          } catch (e) {\n            return wrapResponse(\n              error: PlatformException(code: 'error', message: e.toString()),\n            );\n          }\n        });\n      }\n    }\n    {\n      final pigeonVar_channel = BasicMessageChannel<Object?>(\n        'dev.flutter.pigeon.pigeon_integration_tests.FlutterIntegrationCoreApi.throwError$messageChannelSuffix',\n        pigeonChannelCodec,\n        binaryMessenger: binaryMessenger,\n      );\n      if (api == null) {\n        pigeonVar_channel.setMessageHandler(null);\n      } else {\n        pigeonVar_channel.setMessageHandler((Object? message) async {\n          try {\n            final Object? output = api.throwError();\n            return wrapResponse(result: output);\n          } on PlatformException catch (e) {\n            return wrapResponse(error: e);\n          } catch (e) {\n            return wrapResponse(\n              error: PlatformException(code: 'error', message: e.toString()),\n            );\n          }\n        });\n      }\n    }\n    {\n      final pigeonVar_channel = BasicMessageChannel<Object?>(\n        'dev.flutter.pigeon.pigeon_integration_tests.FlutterIntegrationCoreApi.throwErrorFromVoid$messageChannelSuffix',\n        pigeonChannelCodec,\n        binaryMessenger: binaryMessenger,\n      );\n      if (api == null) {\n        pigeonVar_channel.setMessageHandler(null);\n      } else {\n        pigeonVar_channel.setMessageHandler((Object? message) async {\n          try {\n            api.throwErrorFromVoid();\n            return wrapResponse(empty: true);\n          } on PlatformException catch (e) {\n            return wrapResponse(error: e);\n          } catch (e) {\n            return wrapResponse(\n              error: PlatformException(code: 'error', message: e.toString()),\n            );\n          }\n        });\n      }\n    }\n    {\n      final pigeonVar_channel = BasicMessageChannel<Object?>(\n        'dev.flutter.pigeon.pigeon_integration_tests.FlutterIntegrationCoreApi.echoAllTypes$messageChannelSuffix',\n        pigeonChannelCodec,\n        binaryMessenger: binaryMessenger,\n      );\n      if (api == null) {\n        pigeonVar_channel.setMessageHandler(null);\n      } else {\n        pigeonVar_channel.setMessageHandler((Object? message) async {\n          assert(\n            message != null,\n            'Argument for dev.flutter.pigeon.pigeon_integration_tests.FlutterIntegrationCoreApi.echoAllTypes was null.',\n          );\n          final List<Object?> args = (message as List<Object?>?)!;\n          final AllTypes? arg_everything = (args[0] as AllTypes?);\n          assert(\n            arg_everything != null,\n            'Argument for dev.flutter.pigeon.pigeon_integration_tests.FlutterIntegrationCoreApi.echoAllTypes was null, expected non-null AllTypes.',\n          );\n          try {\n            final AllTypes output = api.echoAllTypes(arg_everything!);\n            return wrapResponse(result: output);\n          } on PlatformException catch (e) {\n            return wrapResponse(error: e);\n          } catch (e) {\n            return wrapResponse(\n              error: PlatformException(code: 'error', message: e.toString()),\n            );\n          }\n        });\n      }\n    }\n    {\n      final pigeonVar_channel = BasicMessageChannel<Object?>(\n        'dev.flutter.pigeon.pigeon_integration_tests.FlutterIntegrationCoreApi.echoAllNullableTypes$messageChannelSuffix',\n        pigeonChannelCodec,\n        binaryMessenger: binaryMessenger,\n      );\n      if (api == null) {\n        pigeonVar_channel.setMessageHandler(null);\n      } else {\n        pigeonVar_channel.setMessageHandler((Object? message) async {\n          assert(\n            message != null,\n            'Argument for dev.flutter.pigeon.pigeon_integration_tests.FlutterIntegrationCoreApi.echoAllNullableTypes was null.',\n          );\n          final List<Object?> args = (message as List<Object?>?)!;\n          final AllNullableTypes? arg_everything =\n              (args[0] as AllNullableTypes?);\n          try {\n            final AllNullableTypes? output = api.echoAllNullableTypes(\n              arg_everything,\n            );\n            return wrapResponse(result: output);\n          } on PlatformException catch (e) {\n            return wrapResponse(error: e);\n          } catch (e) {\n            return wrapResponse(\n              error: PlatformException(code: 'error', message: e.toString()),\n            );\n          }\n        });\n      }\n    }\n    {\n      final pigeonVar_channel = BasicMessageChannel<Object?>(\n        'dev.flutter.pigeon.pigeon_integration_tests.FlutterIntegrationCoreApi.sendMultipleNullableTypes$messageChannelSuffix',\n        pigeonChannelCodec,\n        binaryMessenger: binaryMessenger,\n      );\n      if (api == null) {\n        pigeonVar_channel.setMessageHandler(null);\n      } else {\n        pigeonVar_channel.setMessageHandler((Object? message) async {\n          assert(\n            message != null,\n            'Argument for dev.flutter.pigeon.pigeon_integration_tests.FlutterIntegrationCoreApi.sendMultipleNullableTypes was null.',\n          );\n          final List<Object?> args = (message as List<Object?>?)!;\n          final bool? arg_aNullableBool = (args[0] as bool?);\n          final int? arg_aNullableInt = (args[1] as int?);\n          final String? arg_aNullableString = (args[2] as String?);\n          try {\n            final AllNullableTypes output = api.sendMultipleNullableTypes(\n              arg_aNullableBool,\n              arg_aNullableInt,\n              arg_aNullableString,\n            );\n            return wrapResponse(result: output);\n          } on PlatformException catch (e) {\n            return wrapResponse(error: e);\n          } catch (e) {\n            return wrapResponse(\n              error: PlatformException(code: 'error', message: e.toString()),\n            );\n          }\n        });\n      }\n    }\n    {\n      final pigeonVar_channel = BasicMessageChannel<Object?>(\n        'dev.flutter.pigeon.pigeon_integration_tests.FlutterIntegrationCoreApi.echoAllNullableTypesWithoutRecursion$messageChannelSuffix',\n        pigeonChannelCodec,\n        binaryMessenger: binaryMessenger,\n      );\n      if (api == null) {\n        pigeonVar_channel.setMessageHandler(null);\n      } else {\n        pigeonVar_channel.setMessageHandler((Object? message) async {\n          assert(\n            message != null,\n            'Argument for dev.flutter.pigeon.pigeon_integration_tests.FlutterIntegrationCoreApi.echoAllNullableTypesWithoutRecursion was null.',\n          );\n          final List<Object?> args = (message as List<Object?>?)!;\n          final AllNullableTypesWithoutRecursion? arg_everything =\n              (args[0] as AllNullableTypesWithoutRecursion?);\n          try {\n            final AllNullableTypesWithoutRecursion? output = api\n                .echoAllNullableTypesWithoutRecursion(arg_everything);\n            return wrapResponse(result: output);\n          } on PlatformException catch (e) {\n            return wrapResponse(error: e);\n          } catch (e) {\n            return wrapResponse(\n              error: PlatformException(code: 'error', message: e.toString()),\n            );\n          }\n        });\n      }\n    }\n    {\n      final pigeonVar_channel = BasicMessageChannel<Object?>(\n        'dev.flutter.pigeon.pigeon_integration_tests.FlutterIntegrationCoreApi.sendMultipleNullableTypesWithoutRecursion$messageChannelSuffix',\n        pigeonChannelCodec,\n        binaryMessenger: binaryMessenger,\n      );\n      if (api == null) {\n        pigeonVar_channel.setMessageHandler(null);\n      } else {\n        pigeonVar_channel.setMessageHandler((Object? message) async {\n          assert(\n            message != null,\n            'Argument for dev.flutter.pigeon.pigeon_integration_tests.FlutterIntegrationCoreApi.sendMultipleNullableTypesWithoutRecursion was null.',\n          );\n          final List<Object?> args = (message as List<Object?>?)!;\n          final bool? arg_aNullableBool = (args[0] as bool?);\n          final int? arg_aNullableInt = (args[1] as int?);\n          final String? arg_aNullableString = (args[2] as String?);\n          try {\n            final AllNullableTypesWithoutRecursion output = api\n                .sendMultipleNullableTypesWithoutRecursion(\n                  arg_aNullableBool,\n                  arg_aNullableInt,\n                  arg_aNullableString,\n                );\n            return wrapResponse(result: output);\n          } on PlatformException catch (e) {\n            return wrapResponse(error: e);\n          } catch (e) {\n            return wrapResponse(\n              error: PlatformException(code: 'error', message: e.toString()),\n            );\n          }\n        });\n      }\n    }\n    {\n      final pigeonVar_channel = BasicMessageChannel<Object?>(\n        'dev.flutter.pigeon.pigeon_integration_tests.FlutterIntegrationCoreApi.echoBool$messageChannelSuffix',\n        pigeonChannelCodec,\n        binaryMessenger: binaryMessenger,\n      );\n      if (api == null) {\n        pigeonVar_channel.setMessageHandler(null);\n      } else {\n        pigeonVar_channel.setMessageHandler((Object? message) async {\n          assert(\n            message != null,\n            'Argument for dev.flutter.pigeon.pigeon_integration_tests.FlutterIntegrationCoreApi.echoBool was null.',\n          );\n          final List<Object?> args = (message as List<Object?>?)!;\n          final bool? arg_aBool = (args[0] as bool?);\n          assert(\n            arg_aBool != null,\n            'Argument for dev.flutter.pigeon.pigeon_integration_tests.FlutterIntegrationCoreApi.echoBool was null, expected non-null bool.',\n          );\n          try {\n            final bool output = api.echoBool(arg_aBool!);\n            return wrapResponse(result: output);\n          } on PlatformException catch (e) {\n            return wrapResponse(error: e);\n          } catch (e) {\n            return wrapResponse(\n              error: PlatformException(code: 'error', message: e.toString()),\n            );\n          }\n        });\n      }\n    }\n    {\n      final pigeonVar_channel = BasicMessageChannel<Object?>(\n        'dev.flutter.pigeon.pigeon_integration_tests.FlutterIntegrationCoreApi.echoInt$messageChannelSuffix',\n        pigeonChannelCodec,\n        binaryMessenger: binaryMessenger,\n      );\n      if (api == null) {\n        pigeonVar_channel.setMessageHandler(null);\n      } else {\n        pigeonVar_channel.setMessageHandler((Object? message) async {\n          assert(\n            message != null,\n            'Argument for dev.flutter.pigeon.pigeon_integration_tests.FlutterIntegrationCoreApi.echoInt was null.',\n          );\n          final List<Object?> args = (message as List<Object?>?)!;\n          final int? arg_anInt = (args[0] as int?);\n          assert(\n            arg_anInt != null,\n            'Argument for dev.flutter.pigeon.pigeon_integration_tests.FlutterIntegrationCoreApi.echoInt was null, expected non-null int.',\n          );\n          try {\n            final int output = api.echoInt(arg_anInt!);\n            return wrapResponse(result: output);\n          } on PlatformException catch (e) {\n            return wrapResponse(error: e);\n          } catch (e) {\n            return wrapResponse(\n              error: PlatformException(code: 'error', message: e.toString()),\n            );\n          }\n        });\n      }\n    }\n    {\n      final pigeonVar_channel = BasicMessageChannel<Object?>(\n        'dev.flutter.pigeon.pigeon_integration_tests.FlutterIntegrationCoreApi.echoDouble$messageChannelSuffix',\n        pigeonChannelCodec,\n        binaryMessenger: binaryMessenger,\n      );\n      if (api == null) {\n        pigeonVar_channel.setMessageHandler(null);\n      } else {\n        pigeonVar_channel.setMessageHandler((Object? message) async {\n          assert(\n            message != null,\n            'Argument for dev.flutter.pigeon.pigeon_integration_tests.FlutterIntegrationCoreApi.echoDouble was null.',\n          );\n          final List<Object?> args = (message as List<Object?>?)!;\n          final double? arg_aDouble = (args[0] as double?);\n          assert(\n            arg_aDouble != null,\n            'Argument for dev.flutter.pigeon.pigeon_integration_tests.FlutterIntegrationCoreApi.echoDouble was null, expected non-null double.',\n          );\n          try {\n            final double output = api.echoDouble(arg_aDouble!);\n            return wrapResponse(result: output);\n          } on PlatformException catch (e) {\n            return wrapResponse(error: e);\n          } catch (e) {\n            return wrapResponse(\n              error: PlatformException(code: 'error', message: e.toString()),\n            );\n          }\n        });\n      }\n    }\n    {\n      final pigeonVar_channel = BasicMessageChannel<Object?>(\n        'dev.flutter.pigeon.pigeon_integration_tests.FlutterIntegrationCoreApi.echoString$messageChannelSuffix',\n        pigeonChannelCodec,\n        binaryMessenger: binaryMessenger,\n      );\n      if (api == null) {\n        pigeonVar_channel.setMessageHandler(null);\n      } else {\n        pigeonVar_channel.setMessageHandler((Object? message) async {\n          assert(\n            message != null,\n            'Argument for dev.flutter.pigeon.pigeon_integration_tests.FlutterIntegrationCoreApi.echoString was null.',\n          );\n          final List<Object?> args = (message as List<Object?>?)!;\n          final String? arg_aString = (args[0] as String?);\n          assert(\n            arg_aString != null,\n            'Argument for dev.flutter.pigeon.pigeon_integration_tests.FlutterIntegrationCoreApi.echoString was null, expected non-null String.',\n          );\n          try {\n            final String output = api.echoString(arg_aString!);\n            return wrapResponse(result: output);\n          } on PlatformException catch (e) {\n            return wrapResponse(error: e);\n          } catch (e) {\n            return wrapResponse(\n              error: PlatformException(code: 'error', message: e.toString()),\n            );\n          }\n        });\n      }\n    }\n    {\n      final pigeonVar_channel = BasicMessageChannel<Object?>(\n        'dev.flutter.pigeon.pigeon_integration_tests.FlutterIntegrationCoreApi.echoUint8List$messageChannelSuffix',\n        pigeonChannelCodec,\n        binaryMessenger: binaryMessenger,\n      );\n      if (api == null) {\n        pigeonVar_channel.setMessageHandler(null);\n      } else {\n        pigeonVar_channel.setMessageHandler((Object? message) async {\n          assert(\n            message != null,\n            'Argument for dev.flutter.pigeon.pigeon_integration_tests.FlutterIntegrationCoreApi.echoUint8List was null.',\n          );\n          final List<Object?> args = (message as List<Object?>?)!;\n          final Uint8List? arg_list = (args[0] as Uint8List?);\n          assert(\n            arg_list != null,\n            'Argument for dev.flutter.pigeon.pigeon_integration_tests.FlutterIntegrationCoreApi.echoUint8List was null, expected non-null Uint8List.',\n          );\n          try {\n            final Uint8List output = api.echoUint8List(arg_list!);\n            return wrapResponse(result: output);\n          } on PlatformException catch (e) {\n            return wrapResponse(error: e);\n          } catch (e) {\n            return wrapResponse(\n              error: PlatformException(code: 'error', message: e.toString()),\n            );\n          }\n        });\n      }\n    }\n    {\n      final pigeonVar_channel = BasicMessageChannel<Object?>(\n        'dev.flutter.pigeon.pigeon_integration_tests.FlutterIntegrationCoreApi.echoList$messageChannelSuffix',\n        pigeonChannelCodec,\n        binaryMessenger: binaryMessenger,\n      );\n      if (api == null) {\n        pigeonVar_channel.setMessageHandler(null);\n      } else {\n        pigeonVar_channel.setMessageHandler((Object? message) async {\n          assert(\n            message != null,\n            'Argument for dev.flutter.pigeon.pigeon_integration_tests.FlutterIntegrationCoreApi.echoList was null.',\n          );\n          final List<Object?> args = (message as List<Object?>?)!;\n          final List<Object?>? arg_list = (args[0] as List<Object?>?)\n              ?.cast<Object?>();\n          assert(\n            arg_list != null,\n            'Argument for dev.flutter.pigeon.pigeon_integration_tests.FlutterIntegrationCoreApi.echoList was null, expected non-null List<Object?>.',\n          );\n          try {\n            final List<Object?> output = api.echoList(arg_list!);\n            return wrapResponse(result: output);\n          } on PlatformException catch (e) {\n            return wrapResponse(error: e);\n          } catch (e) {\n            return wrapResponse(\n              error: PlatformException(code: 'error', message: e.toString()),\n            );\n          }\n        });\n      }\n    }\n    {\n      final pigeonVar_channel = BasicMessageChannel<Object?>(\n        'dev.flutter.pigeon.pigeon_integration_tests.FlutterIntegrationCoreApi.echoEnumList$messageChannelSuffix',\n        pigeonChannelCodec,\n        binaryMessenger: binaryMessenger,\n      );\n      if (api == null) {\n        pigeonVar_channel.setMessageHandler(null);\n      } else {\n        pigeonVar_channel.setMessageHandler((Object? message) async {\n          assert(\n            message != null,\n            'Argument for dev.flutter.pigeon.pigeon_integration_tests.FlutterIntegrationCoreApi.echoEnumList was null.',\n          );\n          final List<Object?> args = (message as List<Object?>?)!;\n          final List<AnEnum?>? arg_enumList = (args[0] as List<Object?>?)\n              ?.cast<AnEnum?>();\n          assert(\n            arg_enumList != null,\n            'Argument for dev.flutter.pigeon.pigeon_integration_tests.FlutterIntegrationCoreApi.echoEnumList was null, expected non-null List<AnEnum?>.',\n          );\n          try {\n            final List<AnEnum?> output = api.echoEnumList(arg_enumList!);\n            return wrapResponse(result: output);\n          } on PlatformException catch (e) {\n            return wrapResponse(error: e);\n          } catch (e) {\n            return wrapResponse(\n              error: PlatformException(code: 'error', message: e.toString()),\n            );\n          }\n        });\n      }\n    }\n    {\n      final pigeonVar_channel = BasicMessageChannel<Object?>(\n        'dev.flutter.pigeon.pigeon_integration_tests.FlutterIntegrationCoreApi.echoClassList$messageChannelSuffix',\n        pigeonChannelCodec,\n        binaryMessenger: binaryMessenger,\n      );\n      if (api == null) {\n        pigeonVar_channel.setMessageHandler(null);\n      } else {\n        pigeonVar_channel.setMessageHandler((Object? message) async {\n          assert(\n            message != null,\n            'Argument for dev.flutter.pigeon.pigeon_integration_tests.FlutterIntegrationCoreApi.echoClassList was null.',\n          );\n          final List<Object?> args = (message as List<Object?>?)!;\n          final List<AllNullableTypes?>? arg_classList =\n              (args[0] as List<Object?>?)?.cast<AllNullableTypes?>();\n          assert(\n            arg_classList != null,\n            'Argument for dev.flutter.pigeon.pigeon_integration_tests.FlutterIntegrationCoreApi.echoClassList was null, expected non-null List<AllNullableTypes?>.',\n          );\n          try {\n            final List<AllNullableTypes?> output = api.echoClassList(\n              arg_classList!,\n            );\n            return wrapResponse(result: output);\n          } on PlatformException catch (e) {\n            return wrapResponse(error: e);\n          } catch (e) {\n            return wrapResponse(\n              error: PlatformException(code: 'error', message: e.toString()),\n            );\n          }\n        });\n      }\n    }\n    {\n      final pigeonVar_channel = BasicMessageChannel<Object?>(\n        'dev.flutter.pigeon.pigeon_integration_tests.FlutterIntegrationCoreApi.echoNonNullEnumList$messageChannelSuffix',\n        pigeonChannelCodec,\n        binaryMessenger: binaryMessenger,\n      );\n      if (api == null) {\n        pigeonVar_channel.setMessageHandler(null);\n      } else {\n        pigeonVar_channel.setMessageHandler((Object? message) async {\n          assert(\n            message != null,\n            'Argument for dev.flutter.pigeon.pigeon_integration_tests.FlutterIntegrationCoreApi.echoNonNullEnumList was null.',\n          );\n          final List<Object?> args = (message as List<Object?>?)!;\n          final List<AnEnum>? arg_enumList = (args[0] as List<Object?>?)\n              ?.cast<AnEnum>();\n          assert(\n            arg_enumList != null,\n            'Argument for dev.flutter.pigeon.pigeon_integration_tests.FlutterIntegrationCoreApi.echoNonNullEnumList was null, expected non-null List<AnEnum>.',\n          );\n          try {\n            final List<AnEnum> output = api.echoNonNullEnumList(arg_enumList!);\n            return wrapResponse(result: output);\n          } on PlatformException catch (e) {\n            return wrapResponse(error: e);\n          } catch (e) {\n            return wrapResponse(\n              error: PlatformException(code: 'error', message: e.toString()),\n            );\n          }\n        });\n      }\n    }\n    {\n      final pigeonVar_channel = BasicMessageChannel<Object?>(\n        'dev.flutter.pigeon.pigeon_integration_tests.FlutterIntegrationCoreApi.echoNonNullClassList$messageChannelSuffix',\n        pigeonChannelCodec,\n        binaryMessenger: binaryMessenger,\n      );\n      if (api == null) {\n        pigeonVar_channel.setMessageHandler(null);\n      } else {\n        pigeonVar_channel.setMessageHandler((Object? message) async {\n          assert(\n            message != null,\n            'Argument for dev.flutter.pigeon.pigeon_integration_tests.FlutterIntegrationCoreApi.echoNonNullClassList was null.',\n          );\n          final List<Object?> args = (message as List<Object?>?)!;\n          final List<AllNullableTypes>? arg_classList =\n              (args[0] as List<Object?>?)?.cast<AllNullableTypes>();\n          assert(\n            arg_classList != null,\n            'Argument for dev.flutter.pigeon.pigeon_integration_tests.FlutterIntegrationCoreApi.echoNonNullClassList was null, expected non-null List<AllNullableTypes>.',\n          );\n          try {\n            final List<AllNullableTypes> output = api.echoNonNullClassList(\n              arg_classList!,\n            );\n            return wrapResponse(result: output);\n          } on PlatformException catch (e) {\n            return wrapResponse(error: e);\n          } catch (e) {\n            return wrapResponse(\n              error: PlatformException(code: 'error', message: e.toString()),\n            );\n          }\n        });\n      }\n    }\n    {\n      final pigeonVar_channel = BasicMessageChannel<Object?>(\n        'dev.flutter.pigeon.pigeon_integration_tests.FlutterIntegrationCoreApi.echoMap$messageChannelSuffix',\n        pigeonChannelCodec,\n        binaryMessenger: binaryMessenger,\n      );\n      if (api == null) {\n        pigeonVar_channel.setMessageHandler(null);\n      } else {\n        pigeonVar_channel.setMessageHandler((Object? message) async {\n          assert(\n            message != null,\n            'Argument for dev.flutter.pigeon.pigeon_integration_tests.FlutterIntegrationCoreApi.echoMap was null.',\n          );\n          final List<Object?> args = (message as List<Object?>?)!;\n          final Map<Object?, Object?>? arg_map =\n              (args[0] as Map<Object?, Object?>?)?.cast<Object?, Object?>();\n          assert(\n            arg_map != null,\n            'Argument for dev.flutter.pigeon.pigeon_integration_tests.FlutterIntegrationCoreApi.echoMap was null, expected non-null Map<Object?, Object?>.',\n          );\n          try {\n            final Map<Object?, Object?> output = api.echoMap(arg_map!);\n            return wrapResponse(result: output);\n          } on PlatformException catch (e) {\n            return wrapResponse(error: e);\n          } catch (e) {\n            return wrapResponse(\n              error: PlatformException(code: 'error', message: e.toString()),\n            );\n          }\n        });\n      }\n    }\n    {\n      final pigeonVar_channel = BasicMessageChannel<Object?>(\n        'dev.flutter.pigeon.pigeon_integration_tests.FlutterIntegrationCoreApi.echoStringMap$messageChannelSuffix',\n        pigeonChannelCodec,\n        binaryMessenger: binaryMessenger,\n      );\n      if (api == null) {\n        pigeonVar_channel.setMessageHandler(null);\n      } else {\n        pigeonVar_channel.setMessageHandler((Object? message) async {\n          assert(\n            message != null,\n            'Argument for dev.flutter.pigeon.pigeon_integration_tests.FlutterIntegrationCoreApi.echoStringMap was null.',\n          );\n          final List<Object?> args = (message as List<Object?>?)!;\n          final Map<String?, String?>? arg_stringMap =\n              (args[0] as Map<Object?, Object?>?)?.cast<String?, String?>();\n          assert(\n            arg_stringMap != null,\n            'Argument for dev.flutter.pigeon.pigeon_integration_tests.FlutterIntegrationCoreApi.echoStringMap was null, expected non-null Map<String?, String?>.',\n          );\n          try {\n            final Map<String?, String?> output = api.echoStringMap(\n              arg_stringMap!,\n            );\n            return wrapResponse(result: output);\n          } on PlatformException catch (e) {\n            return wrapResponse(error: e);\n          } catch (e) {\n            return wrapResponse(\n              error: PlatformException(code: 'error', message: e.toString()),\n            );\n          }\n        });\n      }\n    }\n    {\n      final pigeonVar_channel = BasicMessageChannel<Object?>(\n        'dev.flutter.pigeon.pigeon_integration_tests.FlutterIntegrationCoreApi.echoIntMap$messageChannelSuffix',\n        pigeonChannelCodec,\n        binaryMessenger: binaryMessenger,\n      );\n      if (api == null) {\n        pigeonVar_channel.setMessageHandler(null);\n      } else {\n        pigeonVar_channel.setMessageHandler((Object? message) async {\n          assert(\n            message != null,\n            'Argument for dev.flutter.pigeon.pigeon_integration_tests.FlutterIntegrationCoreApi.echoIntMap was null.',\n          );\n          final List<Object?> args = (message as List<Object?>?)!;\n          final Map<int?, int?>? arg_intMap =\n              (args[0] as Map<Object?, Object?>?)?.cast<int?, int?>();\n          assert(\n            arg_intMap != null,\n            'Argument for dev.flutter.pigeon.pigeon_integration_tests.FlutterIntegrationCoreApi.echoIntMap was null, expected non-null Map<int?, int?>.',\n          );\n          try {\n            final Map<int?, int?> output = api.echoIntMap(arg_intMap!);\n            return wrapResponse(result: output);\n          } on PlatformException catch (e) {\n            return wrapResponse(error: e);\n          } catch (e) {\n            return wrapResponse(\n              error: PlatformException(code: 'error', message: e.toString()),\n            );\n          }\n        });\n      }\n    }\n    {\n      final pigeonVar_channel = BasicMessageChannel<Object?>(\n        'dev.flutter.pigeon.pigeon_integration_tests.FlutterIntegrationCoreApi.echoEnumMap$messageChannelSuffix',\n        pigeonChannelCodec,\n        binaryMessenger: binaryMessenger,\n      );\n      if (api == null) {\n        pigeonVar_channel.setMessageHandler(null);\n      } else {\n        pigeonVar_channel.setMessageHandler((Object? message) async {\n          assert(\n            message != null,\n            'Argument for dev.flutter.pigeon.pigeon_integration_tests.FlutterIntegrationCoreApi.echoEnumMap was null.',\n          );\n          final List<Object?> args = (message as List<Object?>?)!;\n          final Map<AnEnum?, AnEnum?>? arg_enumMap =\n              (args[0] as Map<Object?, Object?>?)?.cast<AnEnum?, AnEnum?>();\n          assert(\n            arg_enumMap != null,\n            'Argument for dev.flutter.pigeon.pigeon_integration_tests.FlutterIntegrationCoreApi.echoEnumMap was null, expected non-null Map<AnEnum?, AnEnum?>.',\n          );\n          try {\n            final Map<AnEnum?, AnEnum?> output = api.echoEnumMap(arg_enumMap!);\n            return wrapResponse(result: output);\n          } on PlatformException catch (e) {\n            return wrapResponse(error: e);\n          } catch (e) {\n            return wrapResponse(\n              error: PlatformException(code: 'error', message: e.toString()),\n            );\n          }\n        });\n      }\n    }\n    {\n      final pigeonVar_channel = BasicMessageChannel<Object?>(\n        'dev.flutter.pigeon.pigeon_integration_tests.FlutterIntegrationCoreApi.echoClassMap$messageChannelSuffix',\n        pigeonChannelCodec,\n        binaryMessenger: binaryMessenger,\n      );\n      if (api == null) {\n        pigeonVar_channel.setMessageHandler(null);\n      } else {\n        pigeonVar_channel.setMessageHandler((Object? message) async {\n          assert(\n            message != null,\n            'Argument for dev.flutter.pigeon.pigeon_integration_tests.FlutterIntegrationCoreApi.echoClassMap was null.',\n          );\n          final List<Object?> args = (message as List<Object?>?)!;\n          final Map<int?, AllNullableTypes?>? arg_classMap =\n              (args[0] as Map<Object?, Object?>?)\n                  ?.cast<int?, AllNullableTypes?>();\n          assert(\n            arg_classMap != null,\n            'Argument for dev.flutter.pigeon.pigeon_integration_tests.FlutterIntegrationCoreApi.echoClassMap was null, expected non-null Map<int?, AllNullableTypes?>.',\n          );\n          try {\n            final Map<int?, AllNullableTypes?> output = api.echoClassMap(\n              arg_classMap!,\n            );\n            return wrapResponse(result: output);\n          } on PlatformException catch (e) {\n            return wrapResponse(error: e);\n          } catch (e) {\n            return wrapResponse(\n              error: PlatformException(code: 'error', message: e.toString()),\n            );\n          }\n        });\n      }\n    }\n    {\n      final pigeonVar_channel = BasicMessageChannel<Object?>(\n        'dev.flutter.pigeon.pigeon_integration_tests.FlutterIntegrationCoreApi.echoNonNullStringMap$messageChannelSuffix',\n        pigeonChannelCodec,\n        binaryMessenger: binaryMessenger,\n      );\n      if (api == null) {\n        pigeonVar_channel.setMessageHandler(null);\n      } else {\n        pigeonVar_channel.setMessageHandler((Object? message) async {\n          assert(\n            message != null,\n            'Argument for dev.flutter.pigeon.pigeon_integration_tests.FlutterIntegrationCoreApi.echoNonNullStringMap was null.',\n          );\n          final List<Object?> args = (message as List<Object?>?)!;\n          final Map<String, String>? arg_stringMap =\n              (args[0] as Map<Object?, Object?>?)?.cast<String, String>();\n          assert(\n            arg_stringMap != null,\n            'Argument for dev.flutter.pigeon.pigeon_integration_tests.FlutterIntegrationCoreApi.echoNonNullStringMap was null, expected non-null Map<String, String>.',\n          );\n          try {\n            final Map<String, String> output = api.echoNonNullStringMap(\n              arg_stringMap!,\n            );\n            return wrapResponse(result: output);\n          } on PlatformException catch (e) {\n            return wrapResponse(error: e);\n          } catch (e) {\n            return wrapResponse(\n              error: PlatformException(code: 'error', message: e.toString()),\n            );\n          }\n        });\n      }\n    }\n    {\n      final pigeonVar_channel = BasicMessageChannel<Object?>(\n        'dev.flutter.pigeon.pigeon_integration_tests.FlutterIntegrationCoreApi.echoNonNullIntMap$messageChannelSuffix',\n        pigeonChannelCodec,\n        binaryMessenger: binaryMessenger,\n      );\n      if (api == null) {\n        pigeonVar_channel.setMessageHandler(null);\n      } else {\n        pigeonVar_channel.setMessageHandler((Object? message) async {\n          assert(\n            message != null,\n            'Argument for dev.flutter.pigeon.pigeon_integration_tests.FlutterIntegrationCoreApi.echoNonNullIntMap was null.',\n          );\n          final List<Object?> args = (message as List<Object?>?)!;\n          final Map<int, int>? arg_intMap = (args[0] as Map<Object?, Object?>?)\n              ?.cast<int, int>();\n          assert(\n            arg_intMap != null,\n            'Argument for dev.flutter.pigeon.pigeon_integration_tests.FlutterIntegrationCoreApi.echoNonNullIntMap was null, expected non-null Map<int, int>.',\n          );\n          try {\n            final Map<int, int> output = api.echoNonNullIntMap(arg_intMap!);\n            return wrapResponse(result: output);\n          } on PlatformException catch (e) {\n            return wrapResponse(error: e);\n          } catch (e) {\n            return wrapResponse(\n              error: PlatformException(code: 'error', message: e.toString()),\n            );\n          }\n        });\n      }\n    }\n    {\n      final pigeonVar_channel = BasicMessageChannel<Object?>(\n        'dev.flutter.pigeon.pigeon_integration_tests.FlutterIntegrationCoreApi.echoNonNullEnumMap$messageChannelSuffix',\n        pigeonChannelCodec,\n        binaryMessenger: binaryMessenger,\n      );\n      if (api == null) {\n        pigeonVar_channel.setMessageHandler(null);\n      } else {\n        pigeonVar_channel.setMessageHandler((Object? message) async {\n          assert(\n            message != null,\n            'Argument for dev.flutter.pigeon.pigeon_integration_tests.FlutterIntegrationCoreApi.echoNonNullEnumMap was null.',\n          );\n          final List<Object?> args = (message as List<Object?>?)!;\n          final Map<AnEnum, AnEnum>? arg_enumMap =\n              (args[0] as Map<Object?, Object?>?)?.cast<AnEnum, AnEnum>();\n          assert(\n            arg_enumMap != null,\n            'Argument for dev.flutter.pigeon.pigeon_integration_tests.FlutterIntegrationCoreApi.echoNonNullEnumMap was null, expected non-null Map<AnEnum, AnEnum>.',\n          );\n          try {\n            final Map<AnEnum, AnEnum> output = api.echoNonNullEnumMap(\n              arg_enumMap!,\n            );\n            return wrapResponse(result: output);\n          } on PlatformException catch (e) {\n            return wrapResponse(error: e);\n          } catch (e) {\n            return wrapResponse(\n              error: PlatformException(code: 'error', message: e.toString()),\n            );\n          }\n        });\n      }\n    }\n    {\n      final pigeonVar_channel = BasicMessageChannel<Object?>(\n        'dev.flutter.pigeon.pigeon_integration_tests.FlutterIntegrationCoreApi.echoNonNullClassMap$messageChannelSuffix',\n        pigeonChannelCodec,\n        binaryMessenger: binaryMessenger,\n      );\n      if (api == null) {\n        pigeonVar_channel.setMessageHandler(null);\n      } else {\n        pigeonVar_channel.setMessageHandler((Object? message) async {\n          assert(\n            message != null,\n            'Argument for dev.flutter.pigeon.pigeon_integration_tests.FlutterIntegrationCoreApi.echoNonNullClassMap was null.',\n          );\n          final List<Object?> args = (message as List<Object?>?)!;\n          final Map<int, AllNullableTypes>? arg_classMap =\n              (args[0] as Map<Object?, Object?>?)\n                  ?.cast<int, AllNullableTypes>();\n          assert(\n            arg_classMap != null,\n            'Argument for dev.flutter.pigeon.pigeon_integration_tests.FlutterIntegrationCoreApi.echoNonNullClassMap was null, expected non-null Map<int, AllNullableTypes>.',\n          );\n          try {\n            final Map<int, AllNullableTypes> output = api.echoNonNullClassMap(\n              arg_classMap!,\n            );\n            return wrapResponse(result: output);\n          } on PlatformException catch (e) {\n            return wrapResponse(error: e);\n          } catch (e) {\n            return wrapResponse(\n              error: PlatformException(code: 'error', message: e.toString()),\n            );\n          }\n        });\n      }\n    }\n    {\n      final pigeonVar_channel = BasicMessageChannel<Object?>(\n        'dev.flutter.pigeon.pigeon_integration_tests.FlutterIntegrationCoreApi.echoEnum$messageChannelSuffix',\n        pigeonChannelCodec,\n        binaryMessenger: binaryMessenger,\n      );\n      if (api == null) {\n        pigeonVar_channel.setMessageHandler(null);\n      } else {\n        pigeonVar_channel.setMessageHandler((Object? message) async {\n          assert(\n            message != null,\n            'Argument for dev.flutter.pigeon.pigeon_integration_tests.FlutterIntegrationCoreApi.echoEnum was null.',\n          );\n          final List<Object?> args = (message as List<Object?>?)!;\n          final AnEnum? arg_anEnum = (args[0] as AnEnum?);\n          assert(\n            arg_anEnum != null,\n            'Argument for dev.flutter.pigeon.pigeon_integration_tests.FlutterIntegrationCoreApi.echoEnum was null, expected non-null AnEnum.',\n          );\n          try {\n            final AnEnum output = api.echoEnum(arg_anEnum!);\n            return wrapResponse(result: output);\n          } on PlatformException catch (e) {\n            return wrapResponse(error: e);\n          } catch (e) {\n            return wrapResponse(\n              error: PlatformException(code: 'error', message: e.toString()),\n            );\n          }\n        });\n      }\n    }\n    {\n      final pigeonVar_channel = BasicMessageChannel<Object?>(\n        'dev.flutter.pigeon.pigeon_integration_tests.FlutterIntegrationCoreApi.echoAnotherEnum$messageChannelSuffix',\n        pigeonChannelCodec,\n        binaryMessenger: binaryMessenger,\n      );\n      if (api == null) {\n        pigeonVar_channel.setMessageHandler(null);\n      } else {\n        pigeonVar_channel.setMessageHandler((Object? message) async {\n          assert(\n            message != null,\n            'Argument for dev.flutter.pigeon.pigeon_integration_tests.FlutterIntegrationCoreApi.echoAnotherEnum was null.',\n          );\n          final List<Object?> args = (message as List<Object?>?)!;\n          final AnotherEnum? arg_anotherEnum = (args[0] as AnotherEnum?);\n          assert(\n            arg_anotherEnum != null,\n            'Argument for dev.flutter.pigeon.pigeon_integration_tests.FlutterIntegrationCoreApi.echoAnotherEnum was null, expected non-null AnotherEnum.',\n          );\n          try {\n            final AnotherEnum output = api.echoAnotherEnum(arg_anotherEnum!);\n            return wrapResponse(result: output);\n          } on PlatformException catch (e) {\n            return wrapResponse(error: e);\n          } catch (e) {\n            return wrapResponse(\n              error: PlatformException(code: 'error', message: e.toString()),\n            );\n          }\n        });\n      }\n    }\n    {\n      final pigeonVar_channel = BasicMessageChannel<Object?>(\n        'dev.flutter.pigeon.pigeon_integration_tests.FlutterIntegrationCoreApi.echoNullableBool$messageChannelSuffix',\n        pigeonChannelCodec,\n        binaryMessenger: binaryMessenger,\n      );\n      if (api == null) {\n        pigeonVar_channel.setMessageHandler(null);\n      } else {\n        pigeonVar_channel.setMessageHandler((Object? message) async {\n          assert(\n            message != null,\n            'Argument for dev.flutter.pigeon.pigeon_integration_tests.FlutterIntegrationCoreApi.echoNullableBool was null.',\n          );\n          final List<Object?> args = (message as List<Object?>?)!;\n          final bool? arg_aBool = (args[0] as bool?);\n          try {\n            final bool? output = api.echoNullableBool(arg_aBool);\n            return wrapResponse(result: output);\n          } on PlatformException catch (e) {\n            return wrapResponse(error: e);\n          } catch (e) {\n            return wrapResponse(\n              error: PlatformException(code: 'error', message: e.toString()),\n            );\n          }\n        });\n      }\n    }\n    {\n      final pigeonVar_channel = BasicMessageChannel<Object?>(\n        'dev.flutter.pigeon.pigeon_integration_tests.FlutterIntegrationCoreApi.echoNullableInt$messageChannelSuffix',\n        pigeonChannelCodec,\n        binaryMessenger: binaryMessenger,\n      );\n      if (api == null) {\n        pigeonVar_channel.setMessageHandler(null);\n      } else {\n        pigeonVar_channel.setMessageHandler((Object? message) async {\n          assert(\n            message != null,\n            'Argument for dev.flutter.pigeon.pigeon_integration_tests.FlutterIntegrationCoreApi.echoNullableInt was null.',\n          );\n          final List<Object?> args = (message as List<Object?>?)!;\n          final int? arg_anInt = (args[0] as int?);\n          try {\n            final int? output = api.echoNullableInt(arg_anInt);\n            return wrapResponse(result: output);\n          } on PlatformException catch (e) {\n            return wrapResponse(error: e);\n          } catch (e) {\n            return wrapResponse(\n              error: PlatformException(code: 'error', message: e.toString()),\n            );\n          }\n        });\n      }\n    }\n    {\n      final pigeonVar_channel = BasicMessageChannel<Object?>(\n        'dev.flutter.pigeon.pigeon_integration_tests.FlutterIntegrationCoreApi.echoNullableDouble$messageChannelSuffix',\n        pigeonChannelCodec,\n        binaryMessenger: binaryMessenger,\n      );\n      if (api == null) {\n        pigeonVar_channel.setMessageHandler(null);\n      } else {\n        pigeonVar_channel.setMessageHandler((Object? message) async {\n          assert(\n            message != null,\n            'Argument for dev.flutter.pigeon.pigeon_integration_tests.FlutterIntegrationCoreApi.echoNullableDouble was null.',\n          );\n          final List<Object?> args = (message as List<Object?>?)!;\n          final double? arg_aDouble = (args[0] as double?);\n          try {\n            final double? output = api.echoNullableDouble(arg_aDouble);\n            return wrapResponse(result: output);\n          } on PlatformException catch (e) {\n            return wrapResponse(error: e);\n          } catch (e) {\n            return wrapResponse(\n              error: PlatformException(code: 'error', message: e.toString()),\n            );\n          }\n        });\n      }\n    }\n    {\n      final pigeonVar_channel = BasicMessageChannel<Object?>(\n        'dev.flutter.pigeon.pigeon_integration_tests.FlutterIntegrationCoreApi.echoNullableString$messageChannelSuffix',\n        pigeonChannelCodec,\n        binaryMessenger: binaryMessenger,\n      );\n      if (api == null) {\n        pigeonVar_channel.setMessageHandler(null);\n      } else {\n        pigeonVar_channel.setMessageHandler((Object? message) async {\n          assert(\n            message != null,\n            'Argument for dev.flutter.pigeon.pigeon_integration_tests.FlutterIntegrationCoreApi.echoNullableString was null.',\n          );\n          final List<Object?> args = (message as List<Object?>?)!;\n          final String? arg_aString = (args[0] as String?);\n          try {\n            final String? output = api.echoNullableString(arg_aString);\n            return wrapResponse(result: output);\n          } on PlatformException catch (e) {\n            return wrapResponse(error: e);\n          } catch (e) {\n            return wrapResponse(\n              error: PlatformException(code: 'error', message: e.toString()),\n            );\n          }\n        });\n      }\n    }\n    {\n      final pigeonVar_channel = BasicMessageChannel<Object?>(\n        'dev.flutter.pigeon.pigeon_integration_tests.FlutterIntegrationCoreApi.echoNullableUint8List$messageChannelSuffix',\n        pigeonChannelCodec,\n        binaryMessenger: binaryMessenger,\n      );\n      if (api == null) {\n        pigeonVar_channel.setMessageHandler(null);\n      } else {\n        pigeonVar_channel.setMessageHandler((Object? message) async {\n          assert(\n            message != null,\n            'Argument for dev.flutter.pigeon.pigeon_integration_tests.FlutterIntegrationCoreApi.echoNullableUint8List was null.',\n          );\n          final List<Object?> args = (message as List<Object?>?)!;\n          final Uint8List? arg_list = (args[0] as Uint8List?);\n          try {\n            final Uint8List? output = api.echoNullableUint8List(arg_list);\n            return wrapResponse(result: output);\n          } on PlatformException catch (e) {\n            return wrapResponse(error: e);\n          } catch (e) {\n            return wrapResponse(\n              error: PlatformException(code: 'error', message: e.toString()),\n            );\n          }\n        });\n      }\n    }\n    {\n      final pigeonVar_channel = BasicMessageChannel<Object?>(\n        'dev.flutter.pigeon.pigeon_integration_tests.FlutterIntegrationCoreApi.echoNullableList$messageChannelSuffix',\n        pigeonChannelCodec,\n        binaryMessenger: binaryMessenger,\n      );\n      if (api == null) {\n        pigeonVar_channel.setMessageHandler(null);\n      } else {\n        pigeonVar_channel.setMessageHandler((Object? message) async {\n          assert(\n            message != null,\n            'Argument for dev.flutter.pigeon.pigeon_integration_tests.FlutterIntegrationCoreApi.echoNullableList was null.',\n          );\n          final List<Object?> args = (message as List<Object?>?)!;\n          final List<Object?>? arg_list = (args[0] as List<Object?>?)\n              ?.cast<Object?>();\n          try {\n            final List<Object?>? output = api.echoNullableList(arg_list);\n            return wrapResponse(result: output);\n          } on PlatformException catch (e) {\n            return wrapResponse(error: e);\n          } catch (e) {\n            return wrapResponse(\n              error: PlatformException(code: 'error', message: e.toString()),\n            );\n          }\n        });\n      }\n    }\n    {\n      final pigeonVar_channel = BasicMessageChannel<Object?>(\n        'dev.flutter.pigeon.pigeon_integration_tests.FlutterIntegrationCoreApi.echoNullableEnumList$messageChannelSuffix',\n        pigeonChannelCodec,\n        binaryMessenger: binaryMessenger,\n      );\n      if (api == null) {\n        pigeonVar_channel.setMessageHandler(null);\n      } else {\n        pigeonVar_channel.setMessageHandler((Object? message) async {\n          assert(\n            message != null,\n            'Argument for dev.flutter.pigeon.pigeon_integration_tests.FlutterIntegrationCoreApi.echoNullableEnumList was null.',\n          );\n          final List<Object?> args = (message as List<Object?>?)!;\n          final List<AnEnum?>? arg_enumList = (args[0] as List<Object?>?)\n              ?.cast<AnEnum?>();\n          try {\n            final List<AnEnum?>? output = api.echoNullableEnumList(\n              arg_enumList,\n            );\n            return wrapResponse(result: output);\n          } on PlatformException catch (e) {\n            return wrapResponse(error: e);\n          } catch (e) {\n            return wrapResponse(\n              error: PlatformException(code: 'error', message: e.toString()),\n            );\n          }\n        });\n      }\n    }\n    {\n      final pigeonVar_channel = BasicMessageChannel<Object?>(\n        'dev.flutter.pigeon.pigeon_integration_tests.FlutterIntegrationCoreApi.echoNullableClassList$messageChannelSuffix',\n        pigeonChannelCodec,\n        binaryMessenger: binaryMessenger,\n      );\n      if (api == null) {\n        pigeonVar_channel.setMessageHandler(null);\n      } else {\n        pigeonVar_channel.setMessageHandler((Object? message) async {\n          assert(\n            message != null,\n            'Argument for dev.flutter.pigeon.pigeon_integration_tests.FlutterIntegrationCoreApi.echoNullableClassList was null.',\n          );\n          final List<Object?> args = (message as List<Object?>?)!;\n          final List<AllNullableTypes?>? arg_classList =\n              (args[0] as List<Object?>?)?.cast<AllNullableTypes?>();\n          try {\n            final List<AllNullableTypes?>? output = api.echoNullableClassList(\n              arg_classList,\n            );\n            return wrapResponse(result: output);\n          } on PlatformException catch (e) {\n            return wrapResponse(error: e);\n          } catch (e) {\n            return wrapResponse(\n              error: PlatformException(code: 'error', message: e.toString()),\n            );\n          }\n        });\n      }\n    }\n    {\n      final pigeonVar_channel = BasicMessageChannel<Object?>(\n        'dev.flutter.pigeon.pigeon_integration_tests.FlutterIntegrationCoreApi.echoNullableNonNullEnumList$messageChannelSuffix',\n        pigeonChannelCodec,\n        binaryMessenger: binaryMessenger,\n      );\n      if (api == null) {\n        pigeonVar_channel.setMessageHandler(null);\n      } else {\n        pigeonVar_channel.setMessageHandler((Object? message) async {\n          assert(\n            message != null,\n            'Argument for dev.flutter.pigeon.pigeon_integration_tests.FlutterIntegrationCoreApi.echoNullableNonNullEnumList was null.',\n          );\n          final List<Object?> args = (message as List<Object?>?)!;\n          final List<AnEnum>? arg_enumList = (args[0] as List<Object?>?)\n              ?.cast<AnEnum>();\n          try {\n            final List<AnEnum>? output = api.echoNullableNonNullEnumList(\n              arg_enumList,\n            );\n            return wrapResponse(result: output);\n          } on PlatformException catch (e) {\n            return wrapResponse(error: e);\n          } catch (e) {\n            return wrapResponse(\n              error: PlatformException(code: 'error', message: e.toString()),\n            );\n          }\n        });\n      }\n    }\n    {\n      final pigeonVar_channel = BasicMessageChannel<Object?>(\n        'dev.flutter.pigeon.pigeon_integration_tests.FlutterIntegrationCoreApi.echoNullableNonNullClassList$messageChannelSuffix',\n        pigeonChannelCodec,\n        binaryMessenger: binaryMessenger,\n      );\n      if (api == null) {\n        pigeonVar_channel.setMessageHandler(null);\n      } else {\n        pigeonVar_channel.setMessageHandler((Object? message) async {\n          assert(\n            message != null,\n            'Argument for dev.flutter.pigeon.pigeon_integration_tests.FlutterIntegrationCoreApi.echoNullableNonNullClassList was null.',\n          );\n          final List<Object?> args = (message as List<Object?>?)!;\n          final List<AllNullableTypes>? arg_classList =\n              (args[0] as List<Object?>?)?.cast<AllNullableTypes>();\n          try {\n            final List<AllNullableTypes>? output = api\n                .echoNullableNonNullClassList(arg_classList);\n            return wrapResponse(result: output);\n          } on PlatformException catch (e) {\n            return wrapResponse(error: e);\n          } catch (e) {\n            return wrapResponse(\n              error: PlatformException(code: 'error', message: e.toString()),\n            );\n          }\n        });\n      }\n    }\n    {\n      final pigeonVar_channel = BasicMessageChannel<Object?>(\n        'dev.flutter.pigeon.pigeon_integration_tests.FlutterIntegrationCoreApi.echoNullableMap$messageChannelSuffix',\n        pigeonChannelCodec,\n        binaryMessenger: binaryMessenger,\n      );\n      if (api == null) {\n        pigeonVar_channel.setMessageHandler(null);\n      } else {\n        pigeonVar_channel.setMessageHandler((Object? message) async {\n          assert(\n            message != null,\n            'Argument for dev.flutter.pigeon.pigeon_integration_tests.FlutterIntegrationCoreApi.echoNullableMap was null.',\n          );\n          final List<Object?> args = (message as List<Object?>?)!;\n          final Map<Object?, Object?>? arg_map =\n              (args[0] as Map<Object?, Object?>?)?.cast<Object?, Object?>();\n          try {\n            final Map<Object?, Object?>? output = api.echoNullableMap(arg_map);\n            return wrapResponse(result: output);\n          } on PlatformException catch (e) {\n            return wrapResponse(error: e);\n          } catch (e) {\n            return wrapResponse(\n              error: PlatformException(code: 'error', message: e.toString()),\n            );\n          }\n        });\n      }\n    }\n    {\n      final pigeonVar_channel = BasicMessageChannel<Object?>(\n        'dev.flutter.pigeon.pigeon_integration_tests.FlutterIntegrationCoreApi.echoNullableStringMap$messageChannelSuffix',\n        pigeonChannelCodec,\n        binaryMessenger: binaryMessenger,\n      );\n      if (api == null) {\n        pigeonVar_channel.setMessageHandler(null);\n      } else {\n        pigeonVar_channel.setMessageHandler((Object? message) async {\n          assert(\n            message != null,\n            'Argument for dev.flutter.pigeon.pigeon_integration_tests.FlutterIntegrationCoreApi.echoNullableStringMap was null.',\n          );\n          final List<Object?> args = (message as List<Object?>?)!;\n          final Map<String?, String?>? arg_stringMap =\n              (args[0] as Map<Object?, Object?>?)?.cast<String?, String?>();\n          try {\n            final Map<String?, String?>? output = api.echoNullableStringMap(\n              arg_stringMap,\n            );\n            return wrapResponse(result: output);\n          } on PlatformException catch (e) {\n            return wrapResponse(error: e);\n          } catch (e) {\n            return wrapResponse(\n              error: PlatformException(code: 'error', message: e.toString()),\n            );\n          }\n        });\n      }\n    }\n    {\n      final pigeonVar_channel = BasicMessageChannel<Object?>(\n        'dev.flutter.pigeon.pigeon_integration_tests.FlutterIntegrationCoreApi.echoNullableIntMap$messageChannelSuffix',\n        pigeonChannelCodec,\n        binaryMessenger: binaryMessenger,\n      );\n      if (api == null) {\n        pigeonVar_channel.setMessageHandler(null);\n      } else {\n        pigeonVar_channel.setMessageHandler((Object? message) async {\n          assert(\n            message != null,\n            'Argument for dev.flutter.pigeon.pigeon_integration_tests.FlutterIntegrationCoreApi.echoNullableIntMap was null.',\n          );\n          final List<Object?> args = (message as List<Object?>?)!;\n          final Map<int?, int?>? arg_intMap =\n              (args[0] as Map<Object?, Object?>?)?.cast<int?, int?>();\n          try {\n            final Map<int?, int?>? output = api.echoNullableIntMap(arg_intMap);\n            return wrapResponse(result: output);\n          } on PlatformException catch (e) {\n            return wrapResponse(error: e);\n          } catch (e) {\n            return wrapResponse(\n              error: PlatformException(code: 'error', message: e.toString()),\n            );\n          }\n        });\n      }\n    }\n    {\n      final pigeonVar_channel = BasicMessageChannel<Object?>(\n        'dev.flutter.pigeon.pigeon_integration_tests.FlutterIntegrationCoreApi.echoNullableEnumMap$messageChannelSuffix',\n        pigeonChannelCodec,\n        binaryMessenger: binaryMessenger,\n      );\n      if (api == null) {\n        pigeonVar_channel.setMessageHandler(null);\n      } else {\n        pigeonVar_channel.setMessageHandler((Object? message) async {\n          assert(\n            message != null,\n            'Argument for dev.flutter.pigeon.pigeon_integration_tests.FlutterIntegrationCoreApi.echoNullableEnumMap was null.',\n          );\n          final List<Object?> args = (message as List<Object?>?)!;\n          final Map<AnEnum?, AnEnum?>? arg_enumMap =\n              (args[0] as Map<Object?, Object?>?)?.cast<AnEnum?, AnEnum?>();\n          try {\n            final Map<AnEnum?, AnEnum?>? output = api.echoNullableEnumMap(\n              arg_enumMap,\n            );\n            return wrapResponse(result: output);\n          } on PlatformException catch (e) {\n            return wrapResponse(error: e);\n          } catch (e) {\n            return wrapResponse(\n              error: PlatformException(code: 'error', message: e.toString()),\n            );\n          }\n        });\n      }\n    }\n    {\n      final pigeonVar_channel = BasicMessageChannel<Object?>(\n        'dev.flutter.pigeon.pigeon_integration_tests.FlutterIntegrationCoreApi.echoNullableClassMap$messageChannelSuffix',\n        pigeonChannelCodec,\n        binaryMessenger: binaryMessenger,\n      );\n      if (api == null) {\n        pigeonVar_channel.setMessageHandler(null);\n      } else {\n        pigeonVar_channel.setMessageHandler((Object? message) async {\n          assert(\n            message != null,\n            'Argument for dev.flutter.pigeon.pigeon_integration_tests.FlutterIntegrationCoreApi.echoNullableClassMap was null.',\n          );\n          final List<Object?> args = (message as List<Object?>?)!;\n          final Map<int?, AllNullableTypes?>? arg_classMap =\n              (args[0] as Map<Object?, Object?>?)\n                  ?.cast<int?, AllNullableTypes?>();\n          try {\n            final Map<int?, AllNullableTypes?>? output = api\n                .echoNullableClassMap(arg_classMap);\n            return wrapResponse(result: output);\n          } on PlatformException catch (e) {\n            return wrapResponse(error: e);\n          } catch (e) {\n            return wrapResponse(\n              error: PlatformException(code: 'error', message: e.toString()),\n            );\n          }\n        });\n      }\n    }\n    {\n      final pigeonVar_channel = BasicMessageChannel<Object?>(\n        'dev.flutter.pigeon.pigeon_integration_tests.FlutterIntegrationCoreApi.echoNullableNonNullStringMap$messageChannelSuffix',\n        pigeonChannelCodec,\n        binaryMessenger: binaryMessenger,\n      );\n      if (api == null) {\n        pigeonVar_channel.setMessageHandler(null);\n      } else {\n        pigeonVar_channel.setMessageHandler((Object? message) async {\n          assert(\n            message != null,\n            'Argument for dev.flutter.pigeon.pigeon_integration_tests.FlutterIntegrationCoreApi.echoNullableNonNullStringMap was null.',\n          );\n          final List<Object?> args = (message as List<Object?>?)!;\n          final Map<String, String>? arg_stringMap =\n              (args[0] as Map<Object?, Object?>?)?.cast<String, String>();\n          try {\n            final Map<String, String>? output = api\n                .echoNullableNonNullStringMap(arg_stringMap);\n            return wrapResponse(result: output);\n          } on PlatformException catch (e) {\n            return wrapResponse(error: e);\n          } catch (e) {\n            return wrapResponse(\n              error: PlatformException(code: 'error', message: e.toString()),\n            );\n          }\n        });\n      }\n    }\n    {\n      final pigeonVar_channel = BasicMessageChannel<Object?>(\n        'dev.flutter.pigeon.pigeon_integration_tests.FlutterIntegrationCoreApi.echoNullableNonNullIntMap$messageChannelSuffix',\n        pigeonChannelCodec,\n        binaryMessenger: binaryMessenger,\n      );\n      if (api == null) {\n        pigeonVar_channel.setMessageHandler(null);\n      } else {\n        pigeonVar_channel.setMessageHandler((Object? message) async {\n          assert(\n            message != null,\n            'Argument for dev.flutter.pigeon.pigeon_integration_tests.FlutterIntegrationCoreApi.echoNullableNonNullIntMap was null.',\n          );\n          final List<Object?> args = (message as List<Object?>?)!;\n          final Map<int, int>? arg_intMap = (args[0] as Map<Object?, Object?>?)\n              ?.cast<int, int>();\n          try {\n            final Map<int, int>? output = api.echoNullableNonNullIntMap(\n              arg_intMap,\n            );\n            return wrapResponse(result: output);\n          } on PlatformException catch (e) {\n            return wrapResponse(error: e);\n          } catch (e) {\n            return wrapResponse(\n              error: PlatformException(code: 'error', message: e.toString()),\n            );\n          }\n        });\n      }\n    }\n    {\n      final pigeonVar_channel = BasicMessageChannel<Object?>(\n        'dev.flutter.pigeon.pigeon_integration_tests.FlutterIntegrationCoreApi.echoNullableNonNullEnumMap$messageChannelSuffix',\n        pigeonChannelCodec,\n        binaryMessenger: binaryMessenger,\n      );\n      if (api == null) {\n        pigeonVar_channel.setMessageHandler(null);\n      } else {\n        pigeonVar_channel.setMessageHandler((Object? message) async {\n          assert(\n            message != null,\n            'Argument for dev.flutter.pigeon.pigeon_integration_tests.FlutterIntegrationCoreApi.echoNullableNonNullEnumMap was null.',\n          );\n          final List<Object?> args = (message as List<Object?>?)!;\n          final Map<AnEnum, AnEnum>? arg_enumMap =\n              (args[0] as Map<Object?, Object?>?)?.cast<AnEnum, AnEnum>();\n          try {\n            final Map<AnEnum, AnEnum>? output = api.echoNullableNonNullEnumMap(\n              arg_enumMap,\n            );\n            return wrapResponse(result: output);\n          } on PlatformException catch (e) {\n            return wrapResponse(error: e);\n          } catch (e) {\n            return wrapResponse(\n              error: PlatformException(code: 'error', message: e.toString()),\n            );\n          }\n        });\n      }\n    }\n    {\n      final pigeonVar_channel = BasicMessageChannel<Object?>(\n        'dev.flutter.pigeon.pigeon_integration_tests.FlutterIntegrationCoreApi.echoNullableNonNullClassMap$messageChannelSuffix',\n        pigeonChannelCodec,\n        binaryMessenger: binaryMessenger,\n      );\n      if (api == null) {\n        pigeonVar_channel.setMessageHandler(null);\n      } else {\n        pigeonVar_channel.setMessageHandler((Object? message) async {\n          assert(\n            message != null,\n            'Argument for dev.flutter.pigeon.pigeon_integration_tests.FlutterIntegrationCoreApi.echoNullableNonNullClassMap was null.',\n          );\n          final List<Object?> args = (message as List<Object?>?)!;\n          final Map<int, AllNullableTypes>? arg_classMap =\n              (args[0] as Map<Object?, Object?>?)\n                  ?.cast<int, AllNullableTypes>();\n          try {\n            final Map<int, AllNullableTypes>? output = api\n                .echoNullableNonNullClassMap(arg_classMap);\n            return wrapResponse(result: output);\n          } on PlatformException catch (e) {\n            return wrapResponse(error: e);\n          } catch (e) {\n            return wrapResponse(\n              error: PlatformException(code: 'error', message: e.toString()),\n            );\n          }\n        });\n      }\n    }\n    {\n      final pigeonVar_channel = BasicMessageChannel<Object?>(\n        'dev.flutter.pigeon.pigeon_integration_tests.FlutterIntegrationCoreApi.echoNullableEnum$messageChannelSuffix',\n        pigeonChannelCodec,\n        binaryMessenger: binaryMessenger,\n      );\n      if (api == null) {\n        pigeonVar_channel.setMessageHandler(null);\n      } else {\n        pigeonVar_channel.setMessageHandler((Object? message) async {\n          assert(\n            message != null,\n            'Argument for dev.flutter.pigeon.pigeon_integration_tests.FlutterIntegrationCoreApi.echoNullableEnum was null.',\n          );\n          final List<Object?> args = (message as List<Object?>?)!;\n          final AnEnum? arg_anEnum = (args[0] as AnEnum?);\n          try {\n            final AnEnum? output = api.echoNullableEnum(arg_anEnum);\n            return wrapResponse(result: output);\n          } on PlatformException catch (e) {\n            return wrapResponse(error: e);\n          } catch (e) {\n            return wrapResponse(\n              error: PlatformException(code: 'error', message: e.toString()),\n            );\n          }\n        });\n      }\n    }\n    {\n      final pigeonVar_channel = BasicMessageChannel<Object?>(\n        'dev.flutter.pigeon.pigeon_integration_tests.FlutterIntegrationCoreApi.echoAnotherNullableEnum$messageChannelSuffix',\n        pigeonChannelCodec,\n        binaryMessenger: binaryMessenger,\n      );\n      if (api == null) {\n        pigeonVar_channel.setMessageHandler(null);\n      } else {\n        pigeonVar_channel.setMessageHandler((Object? message) async {\n          assert(\n            message != null,\n            'Argument for dev.flutter.pigeon.pigeon_integration_tests.FlutterIntegrationCoreApi.echoAnotherNullableEnum was null.',\n          );\n          final List<Object?> args = (message as List<Object?>?)!;\n          final AnotherEnum? arg_anotherEnum = (args[0] as AnotherEnum?);\n          try {\n            final AnotherEnum? output = api.echoAnotherNullableEnum(\n              arg_anotherEnum,\n            );\n            return wrapResponse(result: output);\n          } on PlatformException catch (e) {\n            return wrapResponse(error: e);\n          } catch (e) {\n            return wrapResponse(\n              error: PlatformException(code: 'error', message: e.toString()),\n            );\n          }\n        });\n      }\n    }\n    {\n      final pigeonVar_channel = BasicMessageChannel<Object?>(\n        'dev.flutter.pigeon.pigeon_integration_tests.FlutterIntegrationCoreApi.noopAsync$messageChannelSuffix',\n        pigeonChannelCodec,\n        binaryMessenger: binaryMessenger,\n      );\n      if (api == null) {\n        pigeonVar_channel.setMessageHandler(null);\n      } else {\n        pigeonVar_channel.setMessageHandler((Object? message) async {\n          try {\n            await api.noopAsync();\n            return wrapResponse(empty: true);\n          } on PlatformException catch (e) {\n            return wrapResponse(error: e);\n          } catch (e) {\n            return wrapResponse(\n              error: PlatformException(code: 'error', message: e.toString()),\n            );\n          }\n        });\n      }\n    }\n    {\n      final pigeonVar_channel = BasicMessageChannel<Object?>(\n        'dev.flutter.pigeon.pigeon_integration_tests.FlutterIntegrationCoreApi.echoAsyncString$messageChannelSuffix',\n        pigeonChannelCodec,\n        binaryMessenger: binaryMessenger,\n      );\n      if (api == null) {\n        pigeonVar_channel.setMessageHandler(null);\n      } else {\n        pigeonVar_channel.setMessageHandler((Object? message) async {\n          assert(\n            message != null,\n            'Argument for dev.flutter.pigeon.pigeon_integration_tests.FlutterIntegrationCoreApi.echoAsyncString was null.',\n          );\n          final List<Object?> args = (message as List<Object?>?)!;\n          final String? arg_aString = (args[0] as String?);\n          assert(\n            arg_aString != null,\n            'Argument for dev.flutter.pigeon.pigeon_integration_tests.FlutterIntegrationCoreApi.echoAsyncString was null, expected non-null String.',\n          );\n          try {\n            final String output = await api.echoAsyncString(arg_aString!);\n            return wrapResponse(result: output);\n          } on PlatformException catch (e) {\n            return wrapResponse(error: e);\n          } catch (e) {\n            return wrapResponse(\n              error: PlatformException(code: 'error', message: e.toString()),\n            );\n          }\n        });\n      }\n    }\n  }\n}\n\n/// An API that can be implemented for minimal, compile-only tests.\nclass HostTrivialApi {\n  /// Constructor for [HostTrivialApi].  The [binaryMessenger] named argument is\n  /// available for dependency injection.  If it is left null, the default\n  /// BinaryMessenger will be used which routes to the host platform.\n  HostTrivialApi({\n    BinaryMessenger? binaryMessenger,\n    String messageChannelSuffix = '',\n  }) : pigeonVar_binaryMessenger = binaryMessenger,\n       pigeonVar_messageChannelSuffix = messageChannelSuffix.isNotEmpty\n           ? '.$messageChannelSuffix'\n           : '';\n  final BinaryMessenger? pigeonVar_binaryMessenger;\n\n  static const MessageCodec<Object?> pigeonChannelCodec = _PigeonCodec();\n\n  final String pigeonVar_messageChannelSuffix;\n\n  Future<void> noop() async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostTrivialApi.noop$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(null);\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else {\n      return;\n    }\n  }\n}\n\n/// A simple API implemented in some unit tests.\nclass HostSmallApi {\n  /// Constructor for [HostSmallApi].  The [binaryMessenger] named argument is\n  /// available for dependency injection.  If it is left null, the default\n  /// BinaryMessenger will be used which routes to the host platform.\n  HostSmallApi({\n    BinaryMessenger? binaryMessenger,\n    String messageChannelSuffix = '',\n  }) : pigeonVar_binaryMessenger = binaryMessenger,\n       pigeonVar_messageChannelSuffix = messageChannelSuffix.isNotEmpty\n           ? '.$messageChannelSuffix'\n           : '';\n  final BinaryMessenger? pigeonVar_binaryMessenger;\n\n  static const MessageCodec<Object?> pigeonChannelCodec = _PigeonCodec();\n\n  final String pigeonVar_messageChannelSuffix;\n\n  Future<String> echo(String aString) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostSmallApi.echo$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[aString],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else if (pigeonVar_replyList[0] == null) {\n      throw PlatformException(\n        code: 'null-error',\n        message: 'Host platform returned null value for non-null return value.',\n      );\n    } else {\n      return (pigeonVar_replyList[0] as String?)!;\n    }\n  }\n\n  Future<void> voidVoid() async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostSmallApi.voidVoid$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(null);\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else {\n      return;\n    }\n  }\n}\n\n/// A simple API called in some unit tests.\nabstract class FlutterSmallApi {\n  static const MessageCodec<Object?> pigeonChannelCodec = _PigeonCodec();\n\n  TestMessage echoWrappedList(TestMessage msg);\n\n  String echoString(String aString);\n\n  static void setUp(\n    FlutterSmallApi? api, {\n    BinaryMessenger? binaryMessenger,\n    String messageChannelSuffix = '',\n  }) {\n    messageChannelSuffix = messageChannelSuffix.isNotEmpty\n        ? '.$messageChannelSuffix'\n        : '';\n    {\n      final pigeonVar_channel = BasicMessageChannel<Object?>(\n        'dev.flutter.pigeon.pigeon_integration_tests.FlutterSmallApi.echoWrappedList$messageChannelSuffix',\n        pigeonChannelCodec,\n        binaryMessenger: binaryMessenger,\n      );\n      if (api == null) {\n        pigeonVar_channel.setMessageHandler(null);\n      } else {\n        pigeonVar_channel.setMessageHandler((Object? message) async {\n          assert(\n            message != null,\n            'Argument for dev.flutter.pigeon.pigeon_integration_tests.FlutterSmallApi.echoWrappedList was null.',\n          );\n          final List<Object?> args = (message as List<Object?>?)!;\n          final TestMessage? arg_msg = (args[0] as TestMessage?);\n          assert(\n            arg_msg != null,\n            'Argument for dev.flutter.pigeon.pigeon_integration_tests.FlutterSmallApi.echoWrappedList was null, expected non-null TestMessage.',\n          );\n          try {\n            final TestMessage output = api.echoWrappedList(arg_msg!);\n            return wrapResponse(result: output);\n          } on PlatformException catch (e) {\n            return wrapResponse(error: e);\n          } catch (e) {\n            return wrapResponse(\n              error: PlatformException(code: 'error', message: e.toString()),\n            );\n          }\n        });\n      }\n    }\n    {\n      final pigeonVar_channel = BasicMessageChannel<Object?>(\n        'dev.flutter.pigeon.pigeon_integration_tests.FlutterSmallApi.echoString$messageChannelSuffix',\n        pigeonChannelCodec,\n        binaryMessenger: binaryMessenger,\n      );\n      if (api == null) {\n        pigeonVar_channel.setMessageHandler(null);\n      } else {\n        pigeonVar_channel.setMessageHandler((Object? message) async {\n          assert(\n            message != null,\n            'Argument for dev.flutter.pigeon.pigeon_integration_tests.FlutterSmallApi.echoString was null.',\n          );\n          final List<Object?> args = (message as List<Object?>?)!;\n          final String? arg_aString = (args[0] as String?);\n          assert(\n            arg_aString != null,\n            'Argument for dev.flutter.pigeon.pigeon_integration_tests.FlutterSmallApi.echoString was null, expected non-null String.',\n          );\n          try {\n            final String output = api.echoString(arg_aString!);\n            return wrapResponse(result: output);\n          } on PlatformException catch (e) {\n            return wrapResponse(error: e);\n          } catch (e) {\n            return wrapResponse(\n              error: PlatformException(code: 'error', message: e.toString()),\n            );\n          }\n        });\n      }\n    }\n  }\n}\n"}},"clientRequestTime":1771003781798}}
-{"time":1771003781821,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","id":4,"method":"textDocument/documentColor","params":{"textDocument":{"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"}},"clientRequestTime":1771003781802}}
-{"time":1771003781821,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","id":5,"method":"textDocument/codeAction","params":{"textDocument":{"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"range":{"start":{"line":0,"character":0},"end":{"line":0,"character":0}},"context":{"diagnostics":[],"triggerKind":2}},"clientRequestTime":1771003781803}}
-{"time":1771003781821,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","id":6,"method":"textDocument/documentSymbol","params":{"textDocument":{"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"}},"clientRequestTime":1771003781809}}
-{"time":1771003781821,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","id":7,"method":"textDocument/semanticTokens/full","params":{"textDocument":{"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"}},"clientRequestTime":1771003781810}}
+{"time":1771003781818,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","method":"textDocument/didOpen","params":{"textDocument":{"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart","languageId":"dart","version":1,"text":"// Copyright 2013 The Flutter Authors\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n//\n// Autogenerated from Pigeon, do not edit directly.\n// See also: https://pub.dev/packages/pigeon\n// ignore_for_file: public_member_api_docs, non_constant_identifier_names, avoid_as, unused_import, unnecessary_parenthesis, prefer_null_aware_operators, omit_local_variable_types, omit_obvious_local_variable_types, unused_shown_name, unnecessary_import, no_leading_underscores_for_local_identifiers\n\nimport 'dart:async';\nimport 'dart:typed_data' show Float64List, Int32List, Int64List, Uint8List;\n\nimport 'package:flutter/foundation.dart' show ReadBuffer, WriteBuffer;\nimport 'package:flutter/services.dart';\n\nPlatformException _createConnectionError(String channelName) {\n  return PlatformException(\n    code: 'channel-error',\n    message: 'Unable to establish connection on channel: \"$channelName\".',\n  );\n}\n\nList<Object?> wrapResponse({\n  Object? result,\n  PlatformException? error,\n  bool empty = false,\n}) {\n  if (empty) {\n    return <Object?>[];\n  }\n  if (error == null) {\n    return <Object?>[result];\n  }\n  return <Object?>[error.code, error.message, error.details];\n}\n\nbool _deepEquals(Object? a, Object? b) {\n  if (a is List && b is List) {\n    return a.length == b.length &&\n        a.indexed.every(\n          ((int, dynamic) item) => _deepEquals(item.$2, b[item.$1]),\n        );\n  }\n  if (a is Map && b is Map) {\n    return a.length == b.length &&\n        a.entries.every(\n          (MapEntry<Object?, Object?> entry) =>\n              (b as Map<Object?, Object?>).containsKey(entry.key) &&\n              _deepEquals(entry.value, b[entry.key]),\n        );\n  }\n  return a == b;\n}\n\nenum AnEnum { one, two, three, fortyTwo, fourHundredTwentyTwo }\n\nenum AnotherEnum { justInCase }\n\nclass UnusedClass {\n  UnusedClass({this.aField});\n\n  Object? aField;\n\n  List<Object?> _toList() {\n    return <Object?>[aField];\n  }\n\n  Object encode() {\n    return _toList();\n  }\n\n  static UnusedClass decode(Object result) {\n    result as List<Object?>;\n    return UnusedClass(aField: result[0]);\n  }\n\n  @override\n  // ignore: avoid_equals_and_hash_code_on_mutable_classes\n  bool operator ==(Object other) {\n    if (other is! UnusedClass || other.runtimeType != runtimeType) {\n      return false;\n    }\n    if (identical(this, other)) {\n      return true;\n    }\n    return _deepEquals(encode(), other.encode());\n  }\n\n  @override\n  // ignore: avoid_equals_and_hash_code_on_mutable_classes\n  int get hashCode => Object.hashAll(_toList());\n}\n\n/// A class containing all supported types.\nclass AllTypes {\n  AllTypes({\n    this.aBool = false,\n    this.anInt = 0,\n    this.anInt64 = 0,\n    this.aDouble = 0,\n    required this.aByteArray,\n    required this.a4ByteArray,\n    required this.a8ByteArray,\n    required this.aFloatArray,\n    this.anEnum = AnEnum.one,\n    this.anotherEnum = AnotherEnum.justInCase,\n    this.aString = '',\n    this.anObject = 0,\n    required this.list,\n    required this.stringList,\n    required this.intList,\n    required this.doubleList,\n    required this.boolList,\n    required this.enumList,\n    required this.objectList,\n    required this.listList,\n    required this.mapList,\n    required this.map,\n    required this.stringMap,\n    required this.intMap,\n    required this.enumMap,\n    required this.objectMap,\n    required this.listMap,\n    required this.mapMap,\n  });\n\n  bool aBool;\n\n  int anInt;\n\n  int anInt64;\n\n  double aDouble;\n\n  Uint8List aByteArray;\n\n  Int32List a4ByteArray;\n\n  Int64List a8ByteArray;\n\n  Float64List aFloatArray;\n\n  AnEnum anEnum;\n\n  AnotherEnum anotherEnum;\n\n  String aString;\n\n  Object anObject;\n\n  List<Object?> list;\n\n  List<String> stringList;\n\n  List<int> intList;\n\n  List<double> doubleList;\n\n  List<bool> boolList;\n\n  List<AnEnum> enumList;\n\n  List<Object> objectList;\n\n  List<List<Object?>> listList;\n\n  List<Map<Object?, Object?>> mapList;\n\n  Map<Object?, Object?> map;\n\n  Map<String, String> stringMap;\n\n  Map<int, int> intMap;\n\n  Map<AnEnum, AnEnum> enumMap;\n\n  Map<Object, Object> objectMap;\n\n  Map<int, List<Object?>> listMap;\n\n  Map<int, Map<Object?, Object?>> mapMap;\n\n  List<Object?> _toList() {\n    return <Object?>[\n      aBool,\n      anInt,\n      anInt64,\n      aDouble,\n      aByteArray,\n      a4ByteArray,\n      a8ByteArray,\n      aFloatArray,\n      anEnum,\n      anotherEnum,\n      aString,\n      anObject,\n      list,\n      stringList,\n      intList,\n      doubleList,\n      boolList,\n      enumList,\n      objectList,\n      listList,\n      mapList,\n      map,\n      stringMap,\n      intMap,\n      enumMap,\n      objectMap,\n      listMap,\n      mapMap,\n    ];\n  }\n\n  Object encode() {\n    return _toList();\n  }\n\n  static AllTypes decode(Object result) {\n    result as List<Object?>;\n    return AllTypes(\n      aBool: result[0]! as bool,\n      anInt: result[1]! as int,\n      anInt64: result[2]! as int,\n      aDouble: result[3]! as double,\n      aByteArray: result[4]! as Uint8List,\n      a4ByteArray: result[5]! as Int32List,\n      a8ByteArray: result[6]! as Int64List,\n      aFloatArray: result[7]! as Float64List,\n      anEnum: result[8]! as AnEnum,\n      anotherEnum: result[9]! as AnotherEnum,\n      aString: result[10]! as String,\n      anObject: result[11]!,\n      list: result[12]! as List<Object?>,\n      stringList: (result[13] as List<Object?>?)!.cast<String>(),\n      intList: (result[14] as List<Object?>?)!.cast<int>(),\n      doubleList: (result[15] as List<Object?>?)!.cast<double>(),\n      boolList: (result[16] as List<Object?>?)!.cast<bool>(),\n      enumList: (result[17] as List<Object?>?)!.cast<AnEnum>(),\n      objectList: (result[18] as List<Object?>?)!.cast<Object>(),\n      listList: (result[19] as List<Object?>?)!.cast<List<Object?>>(),\n      mapList: (result[20] as List<Object?>?)!.cast<Map<Object?, Object?>>(),\n      map: result[21]! as Map<Object?, Object?>,\n      stringMap: (result[22] as Map<Object?, Object?>?)!.cast<String, String>(),\n      intMap: (result[23] as Map<Object?, Object?>?)!.cast<int, int>(),\n      enumMap: (result[24] as Map<Object?, Object?>?)!.cast<AnEnum, AnEnum>(),\n      objectMap: (result[25] as Map<Object?, Object?>?)!.cast<Object, Object>(),\n      listMap: (result[26] as Map<Object?, Object?>?)!\n          .cast<int, List<Object?>>(),\n      mapMap: (result[27] as Map<Object?, Object?>?)!\n          .cast<int, Map<Object?, Object?>>(),\n    );\n  }\n\n  @override\n  // ignore: avoid_equals_and_hash_code_on_mutable_classes\n  bool operator ==(Object other) {\n    if (other is! AllTypes || other.runtimeType != runtimeType) {\n      return false;\n    }\n    if (identical(this, other)) {\n      return true;\n    }\n    return _deepEquals(encode(), other.encode());\n  }\n\n  @override\n  // ignore: avoid_equals_and_hash_code_on_mutable_classes\n  int get hashCode => Object.hashAll(_toList());\n}\n\n/// A class containing all supported nullable types.\nclass AllNullableTypes {\n  AllNullableTypes({\n    this.aNullableBool,\n    this.aNullableInt,\n    this.aNullableInt64,\n    this.aNullableDouble,\n    this.aNullableByteArray,\n    this.aNullable4ByteArray,\n    this.aNullable8ByteArray,\n    this.aNullableFloatArray,\n    this.aNullableEnum,\n    this.anotherNullableEnum,\n    this.aNullableString,\n    this.aNullableObject,\n    this.allNullableTypes,\n    this.list,\n    this.stringList,\n    this.intList,\n    this.doubleList,\n    this.boolList,\n    this.enumList,\n    this.objectList,\n    this.listList,\n    this.mapList,\n    this.recursiveClassList,\n    this.map,\n    this.stringMap,\n    this.intMap,\n    this.enumMap,\n    this.objectMap,\n    this.listMap,\n    this.mapMap,\n    this.recursiveClassMap,\n  });\n\n  bool? aNullableBool;\n\n  int? aNullableInt;\n\n  int? aNullableInt64;\n\n  double? aNullableDouble;\n\n  Uint8List? aNullableByteArray;\n\n  Int32List? aNullable4ByteArray;\n\n  Int64List? aNullable8ByteArray;\n\n  Float64List? aNullableFloatArray;\n\n  AnEnum? aNullableEnum;\n\n  AnotherEnum? anotherNullableEnum;\n\n  String? aNullableString;\n\n  Object? aNullableObject;\n\n  AllNullableTypes? allNullableTypes;\n\n  List<Object?>? list;\n\n  List<String?>? stringList;\n\n  List<int?>? intList;\n\n  List<double?>? doubleList;\n\n  List<bool?>? boolList;\n\n  List<AnEnum?>? enumList;\n\n  List<Object?>? objectList;\n\n  List<List<Object?>?>? listList;\n\n  List<Map<Object?, Object?>?>? mapList;\n\n  List<AllNullableTypes?>? recursiveClassList;\n\n  Map<Object?, Object?>? map;\n\n  Map<String?, String?>? stringMap;\n\n  Map<int?, int?>? intMap;\n\n  Map<AnEnum?, AnEnum?>? enumMap;\n\n  Map<Object?, Object?>? objectMap;\n\n  Map<int?, List<Object?>?>? listMap;\n\n  Map<int?, Map<Object?, Object?>?>? mapMap;\n\n  Map<int?, AllNullableTypes?>? recursiveClassMap;\n\n  List<Object?> _toList() {\n    return <Object?>[\n      aNullableBool,\n      aNullableInt,\n      aNullableInt64,\n      aNullableDouble,\n      aNullableByteArray,\n      aNullable4ByteArray,\n      aNullable8ByteArray,\n      aNullableFloatArray,\n      aNullableEnum,\n      anotherNullableEnum,\n      aNullableString,\n      aNullableObject,\n      allNullableTypes,\n      list,\n      stringList,\n      intList,\n      doubleList,\n      boolList,\n      enumList,\n      objectList,\n      listList,\n      mapList,\n      recursiveClassList,\n      map,\n      stringMap,\n      intMap,\n      enumMap,\n      objectMap,\n      listMap,\n      mapMap,\n      recursiveClassMap,\n    ];\n  }\n\n  Object encode() {\n    return _toList();\n  }\n\n  static AllNullableTypes decode(Object result) {\n    result as List<Object?>;\n    return AllNullableTypes(\n      aNullableBool: result[0] as bool?,\n      aNullableInt: result[1] as int?,\n      aNullableInt64: result[2] as int?,\n      aNullableDouble: result[3] as double?,\n      aNullableByteArray: result[4] as Uint8List?,\n      aNullable4ByteArray: result[5] as Int32List?,\n      aNullable8ByteArray: result[6] as Int64List?,\n      aNullableFloatArray: result[7] as Float64List?,\n      aNullableEnum: result[8] as AnEnum?,\n      anotherNullableEnum: result[9] as AnotherEnum?,\n      aNullableString: result[10] as String?,\n      aNullableObject: result[11],\n      allNullableTypes: result[12] as AllNullableTypes?,\n      list: result[13] as List<Object?>?,\n      stringList: (result[14] as List<Object?>?)?.cast<String?>(),\n      intList: (result[15] as List<Object?>?)?.cast<int?>(),\n      doubleList: (result[16] as List<Object?>?)?.cast<double?>(),\n      boolList: (result[17] as List<Object?>?)?.cast<bool?>(),\n      enumList: (result[18] as List<Object?>?)?.cast<AnEnum?>(),\n      objectList: (result[19] as List<Object?>?)?.cast<Object?>(),\n      listList: (result[20] as List<Object?>?)?.cast<List<Object?>?>(),\n      mapList: (result[21] as List<Object?>?)?.cast<Map<Object?, Object?>?>(),\n      recursiveClassList: (result[22] as List<Object?>?)\n          ?.cast<AllNullableTypes?>(),\n      map: result[23] as Map<Object?, Object?>?,\n      stringMap: (result[24] as Map<Object?, Object?>?)\n          ?.cast<String?, String?>(),\n      intMap: (result[25] as Map<Object?, Object?>?)?.cast<int?, int?>(),\n      enumMap: (result[26] as Map<Object?, Object?>?)?.cast<AnEnum?, AnEnum?>(),\n      objectMap: (result[27] as Map<Object?, Object?>?)\n          ?.cast<Object?, Object?>(),\n      listMap: (result[28] as Map<Object?, Object?>?)\n          ?.cast<int?, List<Object?>?>(),\n      mapMap: (result[29] as Map<Object?, Object?>?)\n          ?.cast<int?, Map<Object?, Object?>?>(),\n      recursiveClassMap: (result[30] as Map<Object?, Object?>?)\n          ?.cast<int?, AllNullableTypes?>(),\n    );\n  }\n\n  @override\n  // ignore: avoid_equals_and_hash_code_on_mutable_classes\n  bool operator ==(Object other) {\n    if (other is! AllNullableTypes || other.runtimeType != runtimeType) {\n      return false;\n    }\n    if (identical(this, other)) {\n      return true;\n    }\n    return _deepEquals(encode(), other.encode());\n  }\n\n  @override\n  // ignore: avoid_equals_and_hash_code_on_mutable_classes\n  int get hashCode => Object.hashAll(_toList());\n}\n\n/// The primary purpose for this class is to ensure coverage of Swift structs\n/// with nullable items, as the primary [AllNullableTypes] class is being used to\n/// test Swift classes.\nclass AllNullableTypesWithoutRecursion {\n  AllNullableTypesWithoutRecursion({\n    this.aNullableBool,\n    this.aNullableInt,\n    this.aNullableInt64,\n    this.aNullableDouble,\n    this.aNullableByteArray,\n    this.aNullable4ByteArray,\n    this.aNullable8ByteArray,\n    this.aNullableFloatArray,\n    this.aNullableEnum,\n    this.anotherNullableEnum,\n    this.aNullableString,\n    this.aNullableObject,\n    this.list,\n    this.stringList,\n    this.intList,\n    this.doubleList,\n    this.boolList,\n    this.enumList,\n    this.objectList,\n    this.listList,\n    this.mapList,\n    this.map,\n    this.stringMap,\n    this.intMap,\n    this.enumMap,\n    this.objectMap,\n    this.listMap,\n    this.mapMap,\n  });\n\n  bool? aNullableBool;\n\n  int? aNullableInt;\n\n  int? aNullableInt64;\n\n  double? aNullableDouble;\n\n  Uint8List? aNullableByteArray;\n\n  Int32List? aNullable4ByteArray;\n\n  Int64List? aNullable8ByteArray;\n\n  Float64List? aNullableFloatArray;\n\n  AnEnum? aNullableEnum;\n\n  AnotherEnum? anotherNullableEnum;\n\n  String? aNullableString;\n\n  Object? aNullableObject;\n\n  List<Object?>? list;\n\n  List<String?>? stringList;\n\n  List<int?>? intList;\n\n  List<double?>? doubleList;\n\n  List<bool?>? boolList;\n\n  List<AnEnum?>? enumList;\n\n  List<Object?>? objectList;\n\n  List<List<Object?>?>? listList;\n\n  List<Map<Object?, Object?>?>? mapList;\n\n  Map<Object?, Object?>? map;\n\n  Map<String?, String?>? stringMap;\n\n  Map<int?, int?>? intMap;\n\n  Map<AnEnum?, AnEnum?>? enumMap;\n\n  Map<Object?, Object?>? objectMap;\n\n  Map<int?, List<Object?>?>? listMap;\n\n  Map<int?, Map<Object?, Object?>?>? mapMap;\n\n  List<Object?> _toList() {\n    return <Object?>[\n      aNullableBool,\n      aNullableInt,\n      aNullableInt64,\n      aNullableDouble,\n      aNullableByteArray,\n      aNullable4ByteArray,\n      aNullable8ByteArray,\n      aNullableFloatArray,\n      aNullableEnum,\n      anotherNullableEnum,\n      aNullableString,\n      aNullableObject,\n      list,\n      stringList,\n      intList,\n      doubleList,\n      boolList,\n      enumList,\n      objectList,\n      listList,\n      mapList,\n      map,\n      stringMap,\n      intMap,\n      enumMap,\n      objectMap,\n      listMap,\n      mapMap,\n    ];\n  }\n\n  Object encode() {\n    return _toList();\n  }\n\n  static AllNullableTypesWithoutRecursion decode(Object result) {\n    result as List<Object?>;\n    return AllNullableTypesWithoutRecursion(\n      aNullableBool: result[0] as bool?,\n      aNullableInt: result[1] as int?,\n      aNullableInt64: result[2] as int?,\n      aNullableDouble: result[3] as double?,\n      aNullableByteArray: result[4] as Uint8List?,\n      aNullable4ByteArray: result[5] as Int32List?,\n      aNullable8ByteArray: result[6] as Int64List?,\n      aNullableFloatArray: result[7] as Float64List?,\n      aNullableEnum: result[8] as AnEnum?,\n      anotherNullableEnum: result[9] as AnotherEnum?,\n      aNullableString: result[10] as String?,\n      aNullableObject: result[11],\n      list: result[12] as List<Object?>?,\n      stringList: (result[13] as List<Object?>?)?.cast<String?>(),\n      intList: (result[14] as List<Object?>?)?.cast<int?>(),\n      doubleList: (result[15] as List<Object?>?)?.cast<double?>(),\n      boolList: (result[16] as List<Object?>?)?.cast<bool?>(),\n      enumList: (result[17] as List<Object?>?)?.cast<AnEnum?>(),\n      objectList: (result[18] as List<Object?>?)?.cast<Object?>(),\n      listList: (result[19] as List<Object?>?)?.cast<List<Object?>?>(),\n      mapList: (result[20] as List<Object?>?)?.cast<Map<Object?, Object?>?>(),\n      map: result[21] as Map<Object?, Object?>?,\n      stringMap: (result[22] as Map<Object?, Object?>?)\n          ?.cast<String?, String?>(),\n      intMap: (result[23] as Map<Object?, Object?>?)?.cast<int?, int?>(),\n      enumMap: (result[24] as Map<Object?, Object?>?)?.cast<AnEnum?, AnEnum?>(),\n      objectMap: (result[25] as Map<Object?, Object?>?)\n          ?.cast<Object?, Object?>(),\n      listMap: (result[26] as Map<Object?, Object?>?)\n          ?.cast<int?, List<Object?>?>(),\n      mapMap: (result[27] as Map<Object?, Object?>?)\n          ?.cast<int?, Map<Object?, Object?>?>(),\n    );\n  }\n\n  @override\n  // ignore: avoid_equals_and_hash_code_on_mutable_classes\n  bool operator ==(Object other) {\n    if (other is! AllNullableTypesWithoutRecursion ||\n        other.runtimeType != runtimeType) {\n      return false;\n    }\n    if (identical(this, other)) {\n      return true;\n    }\n    return _deepEquals(encode(), other.encode());\n  }\n\n  @override\n  // ignore: avoid_equals_and_hash_code_on_mutable_classes\n  int get hashCode => Object.hashAll(_toList());\n}\n\n/// A class for testing nested class handling.\n///\n/// This is needed to test nested nullable and non-nullable classes,\n/// `AllNullableTypes` is non-nullable here as it is easier to instantiate\n/// than `AllTypes` when testing doesn't require both (ie. testing null classes).\nclass AllClassesWrapper {\n  AllClassesWrapper({\n    required this.allNullableTypes,\n    this.allNullableTypesWithoutRecursion,\n    this.allTypes,\n    required this.classList,\n    this.nullableClassList,\n    required this.classMap,\n    this.nullableClassMap,\n  });\n\n  AllNullableTypes allNullableTypes;\n\n  AllNullableTypesWithoutRecursion? allNullableTypesWithoutRecursion;\n\n  AllTypes? allTypes;\n\n  List<AllTypes?> classList;\n\n  List<AllNullableTypesWithoutRecursion?>? nullableClassList;\n\n  Map<int?, AllTypes?> classMap;\n\n  Map<int?, AllNullableTypesWithoutRecursion?>? nullableClassMap;\n\n  List<Object?> _toList() {\n    return <Object?>[\n      allNullableTypes,\n      allNullableTypesWithoutRecursion,\n      allTypes,\n      classList,\n      nullableClassList,\n      classMap,\n      nullableClassMap,\n    ];\n  }\n\n  Object encode() {\n    return _toList();\n  }\n\n  static AllClassesWrapper decode(Object result) {\n    result as List<Object?>;\n    return AllClassesWrapper(\n      allNullableTypes: result[0]! as AllNullableTypes,\n      allNullableTypesWithoutRecursion:\n          result[1] as AllNullableTypesWithoutRecursion?,\n      allTypes: result[2] as AllTypes?,\n      classList: (result[3] as List<Object?>?)!.cast<AllTypes?>(),\n      nullableClassList: (result[4] as List<Object?>?)\n          ?.cast<AllNullableTypesWithoutRecursion?>(),\n      classMap: (result[5] as Map<Object?, Object?>?)!.cast<int?, AllTypes?>(),\n      nullableClassMap: (result[6] as Map<Object?, Object?>?)\n          ?.cast<int?, AllNullableTypesWithoutRecursion?>(),\n    );\n  }\n\n  @override\n  // ignore: avoid_equals_and_hash_code_on_mutable_classes\n  bool operator ==(Object other) {\n    if (other is! AllClassesWrapper || other.runtimeType != runtimeType) {\n      return false;\n    }\n    if (identical(this, other)) {\n      return true;\n    }\n    return _deepEquals(encode(), other.encode());\n  }\n\n  @override\n  // ignore: avoid_equals_and_hash_code_on_mutable_classes\n  int get hashCode => Object.hashAll(_toList());\n}\n\n/// A data class containing a List, used in unit tests.\nclass TestMessage {\n  TestMessage({this.testList});\n\n  List<Object?>? testList;\n\n  List<Object?> _toList() {\n    return <Object?>[testList];\n  }\n\n  Object encode() {\n    return _toList();\n  }\n\n  static TestMessage decode(Object result) {\n    result as List<Object?>;\n    return TestMessage(testList: result[0] as List<Object?>?);\n  }\n\n  @override\n  // ignore: avoid_equals_and_hash_code_on_mutable_classes\n  bool operator ==(Object other) {\n    if (other is! TestMessage || other.runtimeType != runtimeType) {\n      return false;\n    }\n    if (identical(this, other)) {\n      return true;\n    }\n    return _deepEquals(encode(), other.encode());\n  }\n\n  @override\n  // ignore: avoid_equals_and_hash_code_on_mutable_classes\n  int get hashCode => Object.hashAll(_toList());\n}\n\nclass _PigeonCodec extends StandardMessageCodec {\n  const _PigeonCodec();\n  @override\n  void writeValue(WriteBuffer buffer, Object? value) {\n    if (value is int) {\n      buffer.putUint8(4);\n      buffer.putInt64(value);\n    } else if (value is AnEnum) {\n      buffer.putUint8(129);\n      writeValue(buffer, value.index);\n    } else if (value is AnotherEnum) {\n      buffer.putUint8(130);\n      writeValue(buffer, value.index);\n    } else if (value is UnusedClass) {\n      buffer.putUint8(131);\n      writeValue(buffer, value.encode());\n    } else if (value is AllTypes) {\n      buffer.putUint8(132);\n      writeValue(buffer, value.encode());\n    } else if (value is AllNullableTypes) {\n      buffer.putUint8(133);\n      writeValue(buffer, value.encode());\n    } else if (value is AllNullableTypesWithoutRecursion) {\n      buffer.putUint8(134);\n      writeValue(buffer, value.encode());\n    } else if (value is AllClassesWrapper) {\n      buffer.putUint8(135);\n      writeValue(buffer, value.encode());\n    } else if (value is TestMessage) {\n      buffer.putUint8(136);\n      writeValue(buffer, value.encode());\n    } else {\n      super.writeValue(buffer, value);\n    }\n  }\n\n  @override\n  Object? readValueOfType(int type, ReadBuffer buffer) {\n    switch (type) {\n      case 129:\n        final value = readValue(buffer) as int?;\n        return value == null ? null : AnEnum.values[value];\n      case 130:\n        final value = readValue(buffer) as int?;\n        return value == null ? null : AnotherEnum.values[value];\n      case 131:\n        return UnusedClass.decode(readValue(buffer)!);\n      case 132:\n        return AllTypes.decode(readValue(buffer)!);\n      case 133:\n        return AllNullableTypes.decode(readValue(buffer)!);\n      case 134:\n        return AllNullableTypesWithoutRecursion.decode(readValue(buffer)!);\n      case 135:\n        return AllClassesWrapper.decode(readValue(buffer)!);\n      case 136:\n        return TestMessage.decode(readValue(buffer)!);\n      default:\n        return super.readValueOfType(type, buffer);\n    }\n  }\n}\n\n/// The core interface that each host language plugin must implement in\n/// platform_test integration tests.\nclass HostIntegrationCoreApi {\n  /// Constructor for [HostIntegrationCoreApi].  The [binaryMessenger] named argument is\n  /// available for dependency injection.  If it is left null, the default\n  /// BinaryMessenger will be used which routes to the host platform.\n  HostIntegrationCoreApi({\n    BinaryMessenger? binaryMessenger,\n    String messageChannelSuffix = '',\n  }) : pigeonVar_binaryMessenger = binaryMessenger,\n       pigeonVar_messageChannelSuffix = messageChannelSuffix.isNotEmpty\n           ? '.$messageChannelSuffix'\n           : '';\n  final BinaryMessenger? pigeonVar_binaryMessenger;\n\n  static const MessageCodec<Object?> pigeonChannelCodec = _PigeonCodec();\n\n  final String pigeonVar_messageChannelSuffix;\n\n  /// A no-op function taking no arguments and returning no value, to sanity\n  /// test basic calling.\n  Future<void> noop() async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.noop$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(null);\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else {\n      return;\n    }\n  }\n\n  /// Returns the passed object, to test serialization and deserialization.\n  Future<AllTypes> echoAllTypes(AllTypes everything) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.echoAllTypes$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[everything],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else if (pigeonVar_replyList[0] == null) {\n      throw PlatformException(\n        code: 'null-error',\n        message: 'Host platform returned null value for non-null return value.',\n      );\n    } else {\n      return (pigeonVar_replyList[0] as AllTypes?)!;\n    }\n  }\n\n  /// Returns an error, to test error handling.\n  Future<Object?> throwError() async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.throwError$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(null);\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else {\n      return pigeonVar_replyList[0];\n    }\n  }\n\n  /// Returns an error from a void function, to test error handling.\n  Future<void> throwErrorFromVoid() async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.throwErrorFromVoid$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(null);\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else {\n      return;\n    }\n  }\n\n  /// Returns a Flutter error, to test error handling.\n  Future<Object?> throwFlutterError() async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.throwFlutterError$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(null);\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else {\n      return pigeonVar_replyList[0];\n    }\n  }\n\n  /// Returns passed in int.\n  Future<int> echoInt(int anInt) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.echoInt$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[anInt],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else if (pigeonVar_replyList[0] == null) {\n      throw PlatformException(\n        code: 'null-error',\n        message: 'Host platform returned null value for non-null return value.',\n      );\n    } else {\n      return (pigeonVar_replyList[0] as int?)!;\n    }\n  }\n\n  /// Returns passed in double.\n  Future<double> echoDouble(double aDouble) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.echoDouble$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[aDouble],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else if (pigeonVar_replyList[0] == null) {\n      throw PlatformException(\n        code: 'null-error',\n        message: 'Host platform returned null value for non-null return value.',\n      );\n    } else {\n      return (pigeonVar_replyList[0] as double?)!;\n    }\n  }\n\n  /// Returns the passed in boolean.\n  Future<bool> echoBool(bool aBool) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.echoBool$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[aBool],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else if (pigeonVar_replyList[0] == null) {\n      throw PlatformException(\n        code: 'null-error',\n        message: 'Host platform returned null value for non-null return value.',\n      );\n    } else {\n      return (pigeonVar_replyList[0] as bool?)!;\n    }\n  }\n\n  /// Returns the passed in string.\n  Future<String> echoString(String aString) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.echoString$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[aString],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else if (pigeonVar_replyList[0] == null) {\n      throw PlatformException(\n        code: 'null-error',\n        message: 'Host platform returned null value for non-null return value.',\n      );\n    } else {\n      return (pigeonVar_replyList[0] as String?)!;\n    }\n  }\n\n  /// Returns the passed in Uint8List.\n  Future<Uint8List> echoUint8List(Uint8List aUint8List) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.echoUint8List$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[aUint8List],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else if (pigeonVar_replyList[0] == null) {\n      throw PlatformException(\n        code: 'null-error',\n        message: 'Host platform returned null value for non-null return value.',\n      );\n    } else {\n      return (pigeonVar_replyList[0] as Uint8List?)!;\n    }\n  }\n\n  /// Returns the passed in generic Object.\n  Future<Object> echoObject(Object anObject) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.echoObject$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[anObject],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else if (pigeonVar_replyList[0] == null) {\n      throw PlatformException(\n        code: 'null-error',\n        message: 'Host platform returned null value for non-null return value.',\n      );\n    } else {\n      return pigeonVar_replyList[0]!;\n    }\n  }\n\n  /// Returns the passed list, to test serialization and deserialization.\n  Future<List<Object?>> echoList(List<Object?> list) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.echoList$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[list],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else if (pigeonVar_replyList[0] == null) {\n      throw PlatformException(\n        code: 'null-error',\n        message: 'Host platform returned null value for non-null return value.',\n      );\n    } else {\n      return (pigeonVar_replyList[0] as List<Object?>?)!.cast<Object?>();\n    }\n  }\n\n  /// Returns the passed list, to test serialization and deserialization.\n  Future<List<AnEnum?>> echoEnumList(List<AnEnum?> enumList) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.echoEnumList$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[enumList],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else if (pigeonVar_replyList[0] == null) {\n      throw PlatformException(\n        code: 'null-error',\n        message: 'Host platform returned null value for non-null return value.',\n      );\n    } else {\n      return (pigeonVar_replyList[0] as List<Object?>?)!.cast<AnEnum?>();\n    }\n  }\n\n  /// Returns the passed list, to test serialization and deserialization.\n  Future<List<AllNullableTypes?>> echoClassList(\n    List<AllNullableTypes?> classList,\n  ) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.echoClassList$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[classList],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else if (pigeonVar_replyList[0] == null) {\n      throw PlatformException(\n        code: 'null-error',\n        message: 'Host platform returned null value for non-null return value.',\n      );\n    } else {\n      return (pigeonVar_replyList[0] as List<Object?>?)!\n          .cast<AllNullableTypes?>();\n    }\n  }\n\n  /// Returns the passed list, to test serialization and deserialization.\n  Future<List<AnEnum>> echoNonNullEnumList(List<AnEnum> enumList) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.echoNonNullEnumList$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[enumList],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else if (pigeonVar_replyList[0] == null) {\n      throw PlatformException(\n        code: 'null-error',\n        message: 'Host platform returned null value for non-null return value.',\n      );\n    } else {\n      return (pigeonVar_replyList[0] as List<Object?>?)!.cast<AnEnum>();\n    }\n  }\n\n  /// Returns the passed list, to test serialization and deserialization.\n  Future<List<AllNullableTypes>> echoNonNullClassList(\n    List<AllNullableTypes> classList,\n  ) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.echoNonNullClassList$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[classList],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else if (pigeonVar_replyList[0] == null) {\n      throw PlatformException(\n        code: 'null-error',\n        message: 'Host platform returned null value for non-null return value.',\n      );\n    } else {\n      return (pigeonVar_replyList[0] as List<Object?>?)!\n          .cast<AllNullableTypes>();\n    }\n  }\n\n  /// Returns the passed map, to test serialization and deserialization.\n  Future<Map<Object?, Object?>> echoMap(Map<Object?, Object?> map) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.echoMap$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[map],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else if (pigeonVar_replyList[0] == null) {\n      throw PlatformException(\n        code: 'null-error',\n        message: 'Host platform returned null value for non-null return value.',\n      );\n    } else {\n      return (pigeonVar_replyList[0] as Map<Object?, Object?>?)!\n          .cast<Object?, Object?>();\n    }\n  }\n\n  /// Returns the passed map, to test serialization and deserialization.\n  Future<Map<String?, String?>> echoStringMap(\n    Map<String?, String?> stringMap,\n  ) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.echoStringMap$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[stringMap],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else if (pigeonVar_replyList[0] == null) {\n      throw PlatformException(\n        code: 'null-error',\n        message: 'Host platform returned null value for non-null return value.',\n      );\n    } else {\n      return (pigeonVar_replyList[0] as Map<Object?, Object?>?)!\n          .cast<String?, String?>();\n    }\n  }\n\n  /// Returns the passed map, to test serialization and deserialization.\n  Future<Map<int?, int?>> echoIntMap(Map<int?, int?> intMap) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.echoIntMap$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[intMap],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else if (pigeonVar_replyList[0] == null) {\n      throw PlatformException(\n        code: 'null-error',\n        message: 'Host platform returned null value for non-null return value.',\n      );\n    } else {\n      return (pigeonVar_replyList[0] as Map<Object?, Object?>?)!\n          .cast<int?, int?>();\n    }\n  }\n\n  /// Returns the passed map, to test serialization and deserialization.\n  Future<Map<AnEnum?, AnEnum?>> echoEnumMap(\n    Map<AnEnum?, AnEnum?> enumMap,\n  ) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.echoEnumMap$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[enumMap],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else if (pigeonVar_replyList[0] == null) {\n      throw PlatformException(\n        code: 'null-error',\n        message: 'Host platform returned null value for non-null return value.',\n      );\n    } else {\n      return (pigeonVar_replyList[0] as Map<Object?, Object?>?)!\n          .cast<AnEnum?, AnEnum?>();\n    }\n  }\n\n  /// Returns the passed map, to test serialization and deserialization.\n  Future<Map<int?, AllNullableTypes?>> echoClassMap(\n    Map<int?, AllNullableTypes?> classMap,\n  ) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.echoClassMap$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[classMap],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else if (pigeonVar_replyList[0] == null) {\n      throw PlatformException(\n        code: 'null-error',\n        message: 'Host platform returned null value for non-null return value.',\n      );\n    } else {\n      return (pigeonVar_replyList[0] as Map<Object?, Object?>?)!\n          .cast<int?, AllNullableTypes?>();\n    }\n  }\n\n  /// Returns the passed map, to test serialization and deserialization.\n  Future<Map<String, String>> echoNonNullStringMap(\n    Map<String, String> stringMap,\n  ) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.echoNonNullStringMap$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[stringMap],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else if (pigeonVar_replyList[0] == null) {\n      throw PlatformException(\n        code: 'null-error',\n        message: 'Host platform returned null value for non-null return value.',\n      );\n    } else {\n      return (pigeonVar_replyList[0] as Map<Object?, Object?>?)!\n          .cast<String, String>();\n    }\n  }\n\n  /// Returns the passed map, to test serialization and deserialization.\n  Future<Map<int, int>> echoNonNullIntMap(Map<int, int> intMap) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.echoNonNullIntMap$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[intMap],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else if (pigeonVar_replyList[0] == null) {\n      throw PlatformException(\n        code: 'null-error',\n        message: 'Host platform returned null value for non-null return value.',\n      );\n    } else {\n      return (pigeonVar_replyList[0] as Map<Object?, Object?>?)!\n          .cast<int, int>();\n    }\n  }\n\n  /// Returns the passed map, to test serialization and deserialization.\n  Future<Map<AnEnum, AnEnum>> echoNonNullEnumMap(\n    Map<AnEnum, AnEnum> enumMap,\n  ) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.echoNonNullEnumMap$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[enumMap],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else if (pigeonVar_replyList[0] == null) {\n      throw PlatformException(\n        code: 'null-error',\n        message: 'Host platform returned null value for non-null return value.',\n      );\n    } else {\n      return (pigeonVar_replyList[0] as Map<Object?, Object?>?)!\n          .cast<AnEnum, AnEnum>();\n    }\n  }\n\n  /// Returns the passed map, to test serialization and deserialization.\n  Future<Map<int, AllNullableTypes>> echoNonNullClassMap(\n    Map<int, AllNullableTypes> classMap,\n  ) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.echoNonNullClassMap$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[classMap],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else if (pigeonVar_replyList[0] == null) {\n      throw PlatformException(\n        code: 'null-error',\n        message: 'Host platform returned null value for non-null return value.',\n      );\n    } else {\n      return (pigeonVar_replyList[0] as Map<Object?, Object?>?)!\n          .cast<int, AllNullableTypes>();\n    }\n  }\n\n  /// Returns the passed class to test nested class serialization and deserialization.\n  Future<AllClassesWrapper> echoClassWrapper(AllClassesWrapper wrapper) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.echoClassWrapper$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[wrapper],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else if (pigeonVar_replyList[0] == null) {\n      throw PlatformException(\n        code: 'null-error',\n        message: 'Host platform returned null value for non-null return value.',\n      );\n    } else {\n      return (pigeonVar_replyList[0] as AllClassesWrapper?)!;\n    }\n  }\n\n  /// Returns the passed enum to test serialization and deserialization.\n  Future<AnEnum> echoEnum(AnEnum anEnum) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.echoEnum$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[anEnum],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else if (pigeonVar_replyList[0] == null) {\n      throw PlatformException(\n        code: 'null-error',\n        message: 'Host platform returned null value for non-null return value.',\n      );\n    } else {\n      return (pigeonVar_replyList[0] as AnEnum?)!;\n    }\n  }\n\n  /// Returns the passed enum to test serialization and deserialization.\n  Future<AnotherEnum> echoAnotherEnum(AnotherEnum anotherEnum) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.echoAnotherEnum$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[anotherEnum],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else if (pigeonVar_replyList[0] == null) {\n      throw PlatformException(\n        code: 'null-error',\n        message: 'Host platform returned null value for non-null return value.',\n      );\n    } else {\n      return (pigeonVar_replyList[0] as AnotherEnum?)!;\n    }\n  }\n\n  /// Returns the default string.\n  Future<String> echoNamedDefaultString({String aString = 'default'}) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.echoNamedDefaultString$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[aString],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else if (pigeonVar_replyList[0] == null) {\n      throw PlatformException(\n        code: 'null-error',\n        message: 'Host platform returned null value for non-null return value.',\n      );\n    } else {\n      return (pigeonVar_replyList[0] as String?)!;\n    }\n  }\n\n  /// Returns passed in double.\n  Future<double> echoOptionalDefaultDouble([double aDouble = 3.14]) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.echoOptionalDefaultDouble$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[aDouble],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else if (pigeonVar_replyList[0] == null) {\n      throw PlatformException(\n        code: 'null-error',\n        message: 'Host platform returned null value for non-null return value.',\n      );\n    } else {\n      return (pigeonVar_replyList[0] as double?)!;\n    }\n  }\n\n  /// Returns passed in int.\n  Future<int> echoRequiredInt({required int anInt}) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.echoRequiredInt$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[anInt],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else if (pigeonVar_replyList[0] == null) {\n      throw PlatformException(\n        code: 'null-error',\n        message: 'Host platform returned null value for non-null return value.',\n      );\n    } else {\n      return (pigeonVar_replyList[0] as int?)!;\n    }\n  }\n\n  /// Returns the passed object, to test serialization and deserialization.\n  Future<AllNullableTypes?> echoAllNullableTypes(\n    AllNullableTypes? everything,\n  ) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.echoAllNullableTypes$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[everything],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else {\n      return (pigeonVar_replyList[0] as AllNullableTypes?);\n    }\n  }\n\n  /// Returns the passed object, to test serialization and deserialization.\n  Future<AllNullableTypesWithoutRecursion?>\n  echoAllNullableTypesWithoutRecursion(\n    AllNullableTypesWithoutRecursion? everything,\n  ) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.echoAllNullableTypesWithoutRecursion$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[everything],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else {\n      return (pigeonVar_replyList[0] as AllNullableTypesWithoutRecursion?);\n    }\n  }\n\n  /// Returns the inner `aString` value from the wrapped object, to test\n  /// sending of nested objects.\n  Future<String?> extractNestedNullableString(AllClassesWrapper wrapper) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.extractNestedNullableString$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[wrapper],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else {\n      return (pigeonVar_replyList[0] as String?);\n    }\n  }\n\n  /// Returns the inner `aString` value from the wrapped object, to test\n  /// sending of nested objects.\n  Future<AllClassesWrapper> createNestedNullableString(\n    String? nullableString,\n  ) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.createNestedNullableString$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[nullableString],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else if (pigeonVar_replyList[0] == null) {\n      throw PlatformException(\n        code: 'null-error',\n        message: 'Host platform returned null value for non-null return value.',\n      );\n    } else {\n      return (pigeonVar_replyList[0] as AllClassesWrapper?)!;\n    }\n  }\n\n  /// Returns passed in arguments of multiple types.\n  Future<AllNullableTypes> sendMultipleNullableTypes(\n    bool? aNullableBool,\n    int? aNullableInt,\n    String? aNullableString,\n  ) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.sendMultipleNullableTypes$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[aNullableBool, aNullableInt, aNullableString],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else if (pigeonVar_replyList[0] == null) {\n      throw PlatformException(\n        code: 'null-error',\n        message: 'Host platform returned null value for non-null return value.',\n      );\n    } else {\n      return (pigeonVar_replyList[0] as AllNullableTypes?)!;\n    }\n  }\n\n  /// Returns passed in arguments of multiple types.\n  Future<AllNullableTypesWithoutRecursion>\n  sendMultipleNullableTypesWithoutRecursion(\n    bool? aNullableBool,\n    int? aNullableInt,\n    String? aNullableString,\n  ) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.sendMultipleNullableTypesWithoutRecursion$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[aNullableBool, aNullableInt, aNullableString],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else if (pigeonVar_replyList[0] == null) {\n      throw PlatformException(\n        code: 'null-error',\n        message: 'Host platform returned null value for non-null return value.',\n      );\n    } else {\n      return (pigeonVar_replyList[0] as AllNullableTypesWithoutRecursion?)!;\n    }\n  }\n\n  /// Returns passed in int.\n  Future<int?> echoNullableInt(int? aNullableInt) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.echoNullableInt$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[aNullableInt],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else {\n      return (pigeonVar_replyList[0] as int?);\n    }\n  }\n\n  /// Returns passed in double.\n  Future<double?> echoNullableDouble(double? aNullableDouble) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.echoNullableDouble$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[aNullableDouble],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else {\n      return (pigeonVar_replyList[0] as double?);\n    }\n  }\n\n  /// Returns the passed in boolean.\n  Future<bool?> echoNullableBool(bool? aNullableBool) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.echoNullableBool$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[aNullableBool],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else {\n      return (pigeonVar_replyList[0] as bool?);\n    }\n  }\n\n  /// Returns the passed in string.\n  Future<String?> echoNullableString(String? aNullableString) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.echoNullableString$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[aNullableString],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else {\n      return (pigeonVar_replyList[0] as String?);\n    }\n  }\n\n  /// Returns the passed in Uint8List.\n  Future<Uint8List?> echoNullableUint8List(\n    Uint8List? aNullableUint8List,\n  ) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.echoNullableUint8List$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[aNullableUint8List],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else {\n      return (pigeonVar_replyList[0] as Uint8List?);\n    }\n  }\n\n  /// Returns the passed in generic Object.\n  Future<Object?> echoNullableObject(Object? aNullableObject) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.echoNullableObject$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[aNullableObject],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else {\n      return pigeonVar_replyList[0];\n    }\n  }\n\n  /// Returns the passed list, to test serialization and deserialization.\n  Future<List<Object?>?> echoNullableList(List<Object?>? aNullableList) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.echoNullableList$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[aNullableList],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else {\n      return (pigeonVar_replyList[0] as List<Object?>?)?.cast<Object?>();\n    }\n  }\n\n  /// Returns the passed list, to test serialization and deserialization.\n  Future<List<AnEnum?>?> echoNullableEnumList(List<AnEnum?>? enumList) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.echoNullableEnumList$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[enumList],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else {\n      return (pigeonVar_replyList[0] as List<Object?>?)?.cast<AnEnum?>();\n    }\n  }\n\n  /// Returns the passed list, to test serialization and deserialization.\n  Future<List<AllNullableTypes?>?> echoNullableClassList(\n    List<AllNullableTypes?>? classList,\n  ) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.echoNullableClassList$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[classList],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else {\n      return (pigeonVar_replyList[0] as List<Object?>?)\n          ?.cast<AllNullableTypes?>();\n    }\n  }\n\n  /// Returns the passed list, to test serialization and deserialization.\n  Future<List<AnEnum>?> echoNullableNonNullEnumList(\n    List<AnEnum>? enumList,\n  ) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.echoNullableNonNullEnumList$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[enumList],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else {\n      return (pigeonVar_replyList[0] as List<Object?>?)?.cast<AnEnum>();\n    }\n  }\n\n  /// Returns the passed list, to test serialization and deserialization.\n  Future<List<AllNullableTypes>?> echoNullableNonNullClassList(\n    List<AllNullableTypes>? classList,\n  ) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.echoNullableNonNullClassList$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[classList],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else {\n      return (pigeonVar_replyList[0] as List<Object?>?)\n          ?.cast<AllNullableTypes>();\n    }\n  }\n\n  /// Returns the passed map, to test serialization and deserialization.\n  Future<Map<Object?, Object?>?> echoNullableMap(\n    Map<Object?, Object?>? map,\n  ) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.echoNullableMap$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[map],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else {\n      return (pigeonVar_replyList[0] as Map<Object?, Object?>?)\n          ?.cast<Object?, Object?>();\n    }\n  }\n\n  /// Returns the passed map, to test serialization and deserialization.\n  Future<Map<String?, String?>?> echoNullableStringMap(\n    Map<String?, String?>? stringMap,\n  ) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.echoNullableStringMap$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[stringMap],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else {\n      return (pigeonVar_replyList[0] as Map<Object?, Object?>?)\n          ?.cast<String?, String?>();\n    }\n  }\n\n  /// Returns the passed map, to test serialization and deserialization.\n  Future<Map<int?, int?>?> echoNullableIntMap(Map<int?, int?>? intMap) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.echoNullableIntMap$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[intMap],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else {\n      return (pigeonVar_replyList[0] as Map<Object?, Object?>?)\n          ?.cast<int?, int?>();\n    }\n  }\n\n  /// Returns the passed map, to test serialization and deserialization.\n  Future<Map<AnEnum?, AnEnum?>?> echoNullableEnumMap(\n    Map<AnEnum?, AnEnum?>? enumMap,\n  ) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.echoNullableEnumMap$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[enumMap],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else {\n      return (pigeonVar_replyList[0] as Map<Object?, Object?>?)\n          ?.cast<AnEnum?, AnEnum?>();\n    }\n  }\n\n  /// Returns the passed map, to test serialization and deserialization.\n  Future<Map<int?, AllNullableTypes?>?> echoNullableClassMap(\n    Map<int?, AllNullableTypes?>? classMap,\n  ) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.echoNullableClassMap$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[classMap],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else {\n      return (pigeonVar_replyList[0] as Map<Object?, Object?>?)\n          ?.cast<int?, AllNullableTypes?>();\n    }\n  }\n\n  /// Returns the passed map, to test serialization and deserialization.\n  Future<Map<String, String>?> echoNullableNonNullStringMap(\n    Map<String, String>? stringMap,\n  ) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.echoNullableNonNullStringMap$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[stringMap],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else {\n      return (pigeonVar_replyList[0] as Map<Object?, Object?>?)\n          ?.cast<String, String>();\n    }\n  }\n\n  /// Returns the passed map, to test serialization and deserialization.\n  Future<Map<int, int>?> echoNullableNonNullIntMap(\n    Map<int, int>? intMap,\n  ) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.echoNullableNonNullIntMap$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[intMap],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else {\n      return (pigeonVar_replyList[0] as Map<Object?, Object?>?)\n          ?.cast<int, int>();\n    }\n  }\n\n  /// Returns the passed map, to test serialization and deserialization.\n  Future<Map<AnEnum, AnEnum>?> echoNullableNonNullEnumMap(\n    Map<AnEnum, AnEnum>? enumMap,\n  ) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.echoNullableNonNullEnumMap$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[enumMap],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else {\n      return (pigeonVar_replyList[0] as Map<Object?, Object?>?)\n          ?.cast<AnEnum, AnEnum>();\n    }\n  }\n\n  /// Returns the passed map, to test serialization and deserialization.\n  Future<Map<int, AllNullableTypes>?> echoNullableNonNullClassMap(\n    Map<int, AllNullableTypes>? classMap,\n  ) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.echoNullableNonNullClassMap$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[classMap],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else {\n      return (pigeonVar_replyList[0] as Map<Object?, Object?>?)\n          ?.cast<int, AllNullableTypes>();\n    }\n  }\n\n  Future<AnEnum?> echoNullableEnum(AnEnum? anEnum) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.echoNullableEnum$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[anEnum],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else {\n      return (pigeonVar_replyList[0] as AnEnum?);\n    }\n  }\n\n  Future<AnotherEnum?> echoAnotherNullableEnum(AnotherEnum? anotherEnum) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.echoAnotherNullableEnum$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[anotherEnum],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else {\n      return (pigeonVar_replyList[0] as AnotherEnum?);\n    }\n  }\n\n  /// Returns passed in int.\n  Future<int?> echoOptionalNullableInt([int? aNullableInt]) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.echoOptionalNullableInt$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[aNullableInt],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else {\n      return (pigeonVar_replyList[0] as int?);\n    }\n  }\n\n  /// Returns the passed in string.\n  Future<String?> echoNamedNullableString({String? aNullableString}) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.echoNamedNullableString$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[aNullableString],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else {\n      return (pigeonVar_replyList[0] as String?);\n    }\n  }\n\n  /// A no-op function taking no arguments and returning no value, to sanity\n  /// test basic asynchronous calling.\n  Future<void> noopAsync() async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.noopAsync$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(null);\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else {\n      return;\n    }\n  }\n\n  /// Returns passed in int asynchronously.\n  Future<int> echoAsyncInt(int anInt) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.echoAsyncInt$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[anInt],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else if (pigeonVar_replyList[0] == null) {\n      throw PlatformException(\n        code: 'null-error',\n        message: 'Host platform returned null value for non-null return value.',\n      );\n    } else {\n      return (pigeonVar_replyList[0] as int?)!;\n    }\n  }\n\n  /// Returns passed in double asynchronously.\n  Future<double> echoAsyncDouble(double aDouble) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.echoAsyncDouble$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[aDouble],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else if (pigeonVar_replyList[0] == null) {\n      throw PlatformException(\n        code: 'null-error',\n        message: 'Host platform returned null value for non-null return value.',\n      );\n    } else {\n      return (pigeonVar_replyList[0] as double?)!;\n    }\n  }\n\n  /// Returns the passed in boolean asynchronously.\n  Future<bool> echoAsyncBool(bool aBool) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.echoAsyncBool$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[aBool],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else if (pigeonVar_replyList[0] == null) {\n      throw PlatformException(\n        code: 'null-error',\n        message: 'Host platform returned null value for non-null return value.',\n      );\n    } else {\n      return (pigeonVar_replyList[0] as bool?)!;\n    }\n  }\n\n  /// Returns the passed string asynchronously.\n  Future<String> echoAsyncString(String aString) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.echoAsyncString$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[aString],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else if (pigeonVar_replyList[0] == null) {\n      throw PlatformException(\n        code: 'null-error',\n        message: 'Host platform returned null value for non-null return value.',\n      );\n    } else {\n      return (pigeonVar_replyList[0] as String?)!;\n    }\n  }\n\n  /// Returns the passed in Uint8List asynchronously.\n  Future<Uint8List> echoAsyncUint8List(Uint8List aUint8List) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.echoAsyncUint8List$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[aUint8List],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else if (pigeonVar_replyList[0] == null) {\n      throw PlatformException(\n        code: 'null-error',\n        message: 'Host platform returned null value for non-null return value.',\n      );\n    } else {\n      return (pigeonVar_replyList[0] as Uint8List?)!;\n    }\n  }\n\n  /// Returns the passed in generic Object asynchronously.\n  Future<Object> echoAsyncObject(Object anObject) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.echoAsyncObject$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[anObject],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else if (pigeonVar_replyList[0] == null) {\n      throw PlatformException(\n        code: 'null-error',\n        message: 'Host platform returned null value for non-null return value.',\n      );\n    } else {\n      return pigeonVar_replyList[0]!;\n    }\n  }\n\n  /// Returns the passed list, to test asynchronous serialization and deserialization.\n  Future<List<Object?>> echoAsyncList(List<Object?> list) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.echoAsyncList$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[list],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else if (pigeonVar_replyList[0] == null) {\n      throw PlatformException(\n        code: 'null-error',\n        message: 'Host platform returned null value for non-null return value.',\n      );\n    } else {\n      return (pigeonVar_replyList[0] as List<Object?>?)!.cast<Object?>();\n    }\n  }\n\n  /// Returns the passed list, to test asynchronous serialization and deserialization.\n  Future<List<AnEnum?>> echoAsyncEnumList(List<AnEnum?> enumList) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.echoAsyncEnumList$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[enumList],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else if (pigeonVar_replyList[0] == null) {\n      throw PlatformException(\n        code: 'null-error',\n        message: 'Host platform returned null value for non-null return value.',\n      );\n    } else {\n      return (pigeonVar_replyList[0] as List<Object?>?)!.cast<AnEnum?>();\n    }\n  }\n\n  /// Returns the passed list, to test asynchronous serialization and deserialization.\n  Future<List<AllNullableTypes?>> echoAsyncClassList(\n    List<AllNullableTypes?> classList,\n  ) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.echoAsyncClassList$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[classList],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else if (pigeonVar_replyList[0] == null) {\n      throw PlatformException(\n        code: 'null-error',\n        message: 'Host platform returned null value for non-null return value.',\n      );\n    } else {\n      return (pigeonVar_replyList[0] as List<Object?>?)!\n          .cast<AllNullableTypes?>();\n    }\n  }\n\n  /// Returns the passed map, to test asynchronous serialization and deserialization.\n  Future<Map<Object?, Object?>> echoAsyncMap(Map<Object?, Object?> map) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.echoAsyncMap$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[map],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else if (pigeonVar_replyList[0] == null) {\n      throw PlatformException(\n        code: 'null-error',\n        message: 'Host platform returned null value for non-null return value.',\n      );\n    } else {\n      return (pigeonVar_replyList[0] as Map<Object?, Object?>?)!\n          .cast<Object?, Object?>();\n    }\n  }\n\n  /// Returns the passed map, to test asynchronous serialization and deserialization.\n  Future<Map<String?, String?>> echoAsyncStringMap(\n    Map<String?, String?> stringMap,\n  ) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.echoAsyncStringMap$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[stringMap],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else if (pigeonVar_replyList[0] == null) {\n      throw PlatformException(\n        code: 'null-error',\n        message: 'Host platform returned null value for non-null return value.',\n      );\n    } else {\n      return (pigeonVar_replyList[0] as Map<Object?, Object?>?)!\n          .cast<String?, String?>();\n    }\n  }\n\n  /// Returns the passed map, to test asynchronous serialization and deserialization.\n  Future<Map<int?, int?>> echoAsyncIntMap(Map<int?, int?> intMap) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.echoAsyncIntMap$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[intMap],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else if (pigeonVar_replyList[0] == null) {\n      throw PlatformException(\n        code: 'null-error',\n        message: 'Host platform returned null value for non-null return value.',\n      );\n    } else {\n      return (pigeonVar_replyList[0] as Map<Object?, Object?>?)!\n          .cast<int?, int?>();\n    }\n  }\n\n  /// Returns the passed map, to test asynchronous serialization and deserialization.\n  Future<Map<AnEnum?, AnEnum?>> echoAsyncEnumMap(\n    Map<AnEnum?, AnEnum?> enumMap,\n  ) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.echoAsyncEnumMap$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[enumMap],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else if (pigeonVar_replyList[0] == null) {\n      throw PlatformException(\n        code: 'null-error',\n        message: 'Host platform returned null value for non-null return value.',\n      );\n    } else {\n      return (pigeonVar_replyList[0] as Map<Object?, Object?>?)!\n          .cast<AnEnum?, AnEnum?>();\n    }\n  }\n\n  /// Returns the passed map, to test asynchronous serialization and deserialization.\n  Future<Map<int?, AllNullableTypes?>> echoAsyncClassMap(\n    Map<int?, AllNullableTypes?> classMap,\n  ) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.echoAsyncClassMap$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[classMap],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else if (pigeonVar_replyList[0] == null) {\n      throw PlatformException(\n        code: 'null-error',\n        message: 'Host platform returned null value for non-null return value.',\n      );\n    } else {\n      return (pigeonVar_replyList[0] as Map<Object?, Object?>?)!\n          .cast<int?, AllNullableTypes?>();\n    }\n  }\n\n  /// Returns the passed enum, to test asynchronous serialization and deserialization.\n  Future<AnEnum> echoAsyncEnum(AnEnum anEnum) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.echoAsyncEnum$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[anEnum],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else if (pigeonVar_replyList[0] == null) {\n      throw PlatformException(\n        code: 'null-error',\n        message: 'Host platform returned null value for non-null return value.',\n      );\n    } else {\n      return (pigeonVar_replyList[0] as AnEnum?)!;\n    }\n  }\n\n  /// Returns the passed enum, to test asynchronous serialization and deserialization.\n  Future<AnotherEnum> echoAnotherAsyncEnum(AnotherEnum anotherEnum) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.echoAnotherAsyncEnum$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[anotherEnum],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else if (pigeonVar_replyList[0] == null) {\n      throw PlatformException(\n        code: 'null-error',\n        message: 'Host platform returned null value for non-null return value.',\n      );\n    } else {\n      return (pigeonVar_replyList[0] as AnotherEnum?)!;\n    }\n  }\n\n  /// Responds with an error from an async function returning a value.\n  Future<Object?> throwAsyncError() async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.throwAsyncError$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(null);\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else {\n      return pigeonVar_replyList[0];\n    }\n  }\n\n  /// Responds with an error from an async void function.\n  Future<void> throwAsyncErrorFromVoid() async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.throwAsyncErrorFromVoid$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(null);\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else {\n      return;\n    }\n  }\n\n  /// Responds with a Flutter error from an async function returning a value.\n  Future<Object?> throwAsyncFlutterError() async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.throwAsyncFlutterError$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(null);\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else {\n      return pigeonVar_replyList[0];\n    }\n  }\n\n  /// Returns the passed object, to test async serialization and deserialization.\n  Future<AllTypes> echoAsyncAllTypes(AllTypes everything) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.echoAsyncAllTypes$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[everything],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else if (pigeonVar_replyList[0] == null) {\n      throw PlatformException(\n        code: 'null-error',\n        message: 'Host platform returned null value for non-null return value.',\n      );\n    } else {\n      return (pigeonVar_replyList[0] as AllTypes?)!;\n    }\n  }\n\n  /// Returns the passed object, to test serialization and deserialization.\n  Future<AllNullableTypes?> echoAsyncNullableAllNullableTypes(\n    AllNullableTypes? everything,\n  ) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.echoAsyncNullableAllNullableTypes$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[everything],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else {\n      return (pigeonVar_replyList[0] as AllNullableTypes?);\n    }\n  }\n\n  /// Returns the passed object, to test serialization and deserialization.\n  Future<AllNullableTypesWithoutRecursion?>\n  echoAsyncNullableAllNullableTypesWithoutRecursion(\n    AllNullableTypesWithoutRecursion? everything,\n  ) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.echoAsyncNullableAllNullableTypesWithoutRecursion$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[everything],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else {\n      return (pigeonVar_replyList[0] as AllNullableTypesWithoutRecursion?);\n    }\n  }\n\n  /// Returns passed in int asynchronously.\n  Future<int?> echoAsyncNullableInt(int? anInt) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.echoAsyncNullableInt$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[anInt],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else {\n      return (pigeonVar_replyList[0] as int?);\n    }\n  }\n\n  /// Returns passed in double asynchronously.\n  Future<double?> echoAsyncNullableDouble(double? aDouble) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.echoAsyncNullableDouble$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[aDouble],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else {\n      return (pigeonVar_replyList[0] as double?);\n    }\n  }\n\n  /// Returns the passed in boolean asynchronously.\n  Future<bool?> echoAsyncNullableBool(bool? aBool) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.echoAsyncNullableBool$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[aBool],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else {\n      return (pigeonVar_replyList[0] as bool?);\n    }\n  }\n\n  /// Returns the passed string asynchronously.\n  Future<String?> echoAsyncNullableString(String? aString) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.echoAsyncNullableString$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[aString],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else {\n      return (pigeonVar_replyList[0] as String?);\n    }\n  }\n\n  /// Returns the passed in Uint8List asynchronously.\n  Future<Uint8List?> echoAsyncNullableUint8List(Uint8List? aUint8List) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.echoAsyncNullableUint8List$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[aUint8List],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else {\n      return (pigeonVar_replyList[0] as Uint8List?);\n    }\n  }\n\n  /// Returns the passed in generic Object asynchronously.\n  Future<Object?> echoAsyncNullableObject(Object? anObject) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.echoAsyncNullableObject$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[anObject],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else {\n      return pigeonVar_replyList[0];\n    }\n  }\n\n  /// Returns the passed list, to test asynchronous serialization and deserialization.\n  Future<List<Object?>?> echoAsyncNullableList(List<Object?>? list) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.echoAsyncNullableList$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[list],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else {\n      return (pigeonVar_replyList[0] as List<Object?>?)?.cast<Object?>();\n    }\n  }\n\n  /// Returns the passed list, to test asynchronous serialization and deserialization.\n  Future<List<AnEnum?>?> echoAsyncNullableEnumList(\n    List<AnEnum?>? enumList,\n  ) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.echoAsyncNullableEnumList$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[enumList],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else {\n      return (pigeonVar_replyList[0] as List<Object?>?)?.cast<AnEnum?>();\n    }\n  }\n\n  /// Returns the passed list, to test asynchronous serialization and deserialization.\n  Future<List<AllNullableTypes?>?> echoAsyncNullableClassList(\n    List<AllNullableTypes?>? classList,\n  ) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.echoAsyncNullableClassList$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[classList],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else {\n      return (pigeonVar_replyList[0] as List<Object?>?)\n          ?.cast<AllNullableTypes?>();\n    }\n  }\n\n  /// Returns the passed map, to test asynchronous serialization and deserialization.\n  Future<Map<Object?, Object?>?> echoAsyncNullableMap(\n    Map<Object?, Object?>? map,\n  ) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.echoAsyncNullableMap$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[map],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else {\n      return (pigeonVar_replyList[0] as Map<Object?, Object?>?)\n          ?.cast<Object?, Object?>();\n    }\n  }\n\n  /// Returns the passed map, to test asynchronous serialization and deserialization.\n  Future<Map<String?, String?>?> echoAsyncNullableStringMap(\n    Map<String?, String?>? stringMap,\n  ) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.echoAsyncNullableStringMap$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[stringMap],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else {\n      return (pigeonVar_replyList[0] as Map<Object?, Object?>?)\n          ?.cast<String?, String?>();\n    }\n  }\n\n  /// Returns the passed map, to test asynchronous serialization and deserialization.\n  Future<Map<int?, int?>?> echoAsyncNullableIntMap(\n    Map<int?, int?>? intMap,\n  ) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.echoAsyncNullableIntMap$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[intMap],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else {\n      return (pigeonVar_replyList[0] as Map<Object?, Object?>?)\n          ?.cast<int?, int?>();\n    }\n  }\n\n  /// Returns the passed map, to test asynchronous serialization and deserialization.\n  Future<Map<AnEnum?, AnEnum?>?> echoAsyncNullableEnumMap(\n    Map<AnEnum?, AnEnum?>? enumMap,\n  ) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.echoAsyncNullableEnumMap$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[enumMap],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else {\n      return (pigeonVar_replyList[0] as Map<Object?, Object?>?)\n          ?.cast<AnEnum?, AnEnum?>();\n    }\n  }\n\n  /// Returns the passed map, to test asynchronous serialization and deserialization.\n  Future<Map<int?, AllNullableTypes?>?> echoAsyncNullableClassMap(\n    Map<int?, AllNullableTypes?>? classMap,\n  ) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.echoAsyncNullableClassMap$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[classMap],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else {\n      return (pigeonVar_replyList[0] as Map<Object?, Object?>?)\n          ?.cast<int?, AllNullableTypes?>();\n    }\n  }\n\n  /// Returns the passed enum, to test asynchronous serialization and deserialization.\n  Future<AnEnum?> echoAsyncNullableEnum(AnEnum? anEnum) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.echoAsyncNullableEnum$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[anEnum],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else {\n      return (pigeonVar_replyList[0] as AnEnum?);\n    }\n  }\n\n  /// Returns the passed enum, to test asynchronous serialization and deserialization.\n  Future<AnotherEnum?> echoAnotherAsyncNullableEnum(\n    AnotherEnum? anotherEnum,\n  ) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.echoAnotherAsyncNullableEnum$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[anotherEnum],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else {\n      return (pigeonVar_replyList[0] as AnotherEnum?);\n    }\n  }\n\n  /// Returns true if the handler is run on a main thread, which should be\n  /// true since there is no TaskQueue annotation.\n  Future<bool> defaultIsMainThread() async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.defaultIsMainThread$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(null);\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else if (pigeonVar_replyList[0] == null) {\n      throw PlatformException(\n        code: 'null-error',\n        message: 'Host platform returned null value for non-null return value.',\n      );\n    } else {\n      return (pigeonVar_replyList[0] as bool?)!;\n    }\n  }\n\n  /// Returns true if the handler is run on a non-main thread, which should be\n  /// true for any platform with TaskQueue support.\n  Future<bool> taskQueueIsBackgroundThread() async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.taskQueueIsBackgroundThread$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(null);\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else if (pigeonVar_replyList[0] == null) {\n      throw PlatformException(\n        code: 'null-error',\n        message: 'Host platform returned null value for non-null return value.',\n      );\n    } else {\n      return (pigeonVar_replyList[0] as bool?)!;\n    }\n  }\n\n  Future<void> callFlutterNoop() async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.callFlutterNoop$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(null);\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else {\n      return;\n    }\n  }\n\n  Future<Object?> callFlutterThrowError() async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.callFlutterThrowError$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(null);\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else {\n      return pigeonVar_replyList[0];\n    }\n  }\n\n  Future<void> callFlutterThrowErrorFromVoid() async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.callFlutterThrowErrorFromVoid$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(null);\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else {\n      return;\n    }\n  }\n\n  Future<AllTypes> callFlutterEchoAllTypes(AllTypes everything) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.callFlutterEchoAllTypes$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[everything],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else if (pigeonVar_replyList[0] == null) {\n      throw PlatformException(\n        code: 'null-error',\n        message: 'Host platform returned null value for non-null return value.',\n      );\n    } else {\n      return (pigeonVar_replyList[0] as AllTypes?)!;\n    }\n  }\n\n  Future<AllNullableTypes?> callFlutterEchoAllNullableTypes(\n    AllNullableTypes? everything,\n  ) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.callFlutterEchoAllNullableTypes$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[everything],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else {\n      return (pigeonVar_replyList[0] as AllNullableTypes?);\n    }\n  }\n\n  Future<AllNullableTypes> callFlutterSendMultipleNullableTypes(\n    bool? aNullableBool,\n    int? aNullableInt,\n    String? aNullableString,\n  ) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.callFlutterSendMultipleNullableTypes$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[aNullableBool, aNullableInt, aNullableString],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else if (pigeonVar_replyList[0] == null) {\n      throw PlatformException(\n        code: 'null-error',\n        message: 'Host platform returned null value for non-null return value.',\n      );\n    } else {\n      return (pigeonVar_replyList[0] as AllNullableTypes?)!;\n    }\n  }\n\n  Future<AllNullableTypesWithoutRecursion?>\n  callFlutterEchoAllNullableTypesWithoutRecursion(\n    AllNullableTypesWithoutRecursion? everything,\n  ) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.callFlutterEchoAllNullableTypesWithoutRecursion$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[everything],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else {\n      return (pigeonVar_replyList[0] as AllNullableTypesWithoutRecursion?);\n    }\n  }\n\n  Future<AllNullableTypesWithoutRecursion>\n  callFlutterSendMultipleNullableTypesWithoutRecursion(\n    bool? aNullableBool,\n    int? aNullableInt,\n    String? aNullableString,\n  ) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.callFlutterSendMultipleNullableTypesWithoutRecursion$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[aNullableBool, aNullableInt, aNullableString],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else if (pigeonVar_replyList[0] == null) {\n      throw PlatformException(\n        code: 'null-error',\n        message: 'Host platform returned null value for non-null return value.',\n      );\n    } else {\n      return (pigeonVar_replyList[0] as AllNullableTypesWithoutRecursion?)!;\n    }\n  }\n\n  Future<bool> callFlutterEchoBool(bool aBool) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.callFlutterEchoBool$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[aBool],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else if (pigeonVar_replyList[0] == null) {\n      throw PlatformException(\n        code: 'null-error',\n        message: 'Host platform returned null value for non-null return value.',\n      );\n    } else {\n      return (pigeonVar_replyList[0] as bool?)!;\n    }\n  }\n\n  Future<int> callFlutterEchoInt(int anInt) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.callFlutterEchoInt$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[anInt],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else if (pigeonVar_replyList[0] == null) {\n      throw PlatformException(\n        code: 'null-error',\n        message: 'Host platform returned null value for non-null return value.',\n      );\n    } else {\n      return (pigeonVar_replyList[0] as int?)!;\n    }\n  }\n\n  Future<double> callFlutterEchoDouble(double aDouble) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.callFlutterEchoDouble$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[aDouble],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else if (pigeonVar_replyList[0] == null) {\n      throw PlatformException(\n        code: 'null-error',\n        message: 'Host platform returned null value for non-null return value.',\n      );\n    } else {\n      return (pigeonVar_replyList[0] as double?)!;\n    }\n  }\n\n  Future<String> callFlutterEchoString(String aString) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.callFlutterEchoString$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[aString],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else if (pigeonVar_replyList[0] == null) {\n      throw PlatformException(\n        code: 'null-error',\n        message: 'Host platform returned null value for non-null return value.',\n      );\n    } else {\n      return (pigeonVar_replyList[0] as String?)!;\n    }\n  }\n\n  Future<Uint8List> callFlutterEchoUint8List(Uint8List list) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.callFlutterEchoUint8List$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[list],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else if (pigeonVar_replyList[0] == null) {\n      throw PlatformException(\n        code: 'null-error',\n        message: 'Host platform returned null value for non-null return value.',\n      );\n    } else {\n      return (pigeonVar_replyList[0] as Uint8List?)!;\n    }\n  }\n\n  Future<List<Object?>> callFlutterEchoList(List<Object?> list) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.callFlutterEchoList$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[list],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else if (pigeonVar_replyList[0] == null) {\n      throw PlatformException(\n        code: 'null-error',\n        message: 'Host platform returned null value for non-null return value.',\n      );\n    } else {\n      return (pigeonVar_replyList[0] as List<Object?>?)!.cast<Object?>();\n    }\n  }\n\n  Future<List<AnEnum?>> callFlutterEchoEnumList(List<AnEnum?> enumList) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.callFlutterEchoEnumList$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[enumList],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else if (pigeonVar_replyList[0] == null) {\n      throw PlatformException(\n        code: 'null-error',\n        message: 'Host platform returned null value for non-null return value.',\n      );\n    } else {\n      return (pigeonVar_replyList[0] as List<Object?>?)!.cast<AnEnum?>();\n    }\n  }\n\n  Future<List<AllNullableTypes?>> callFlutterEchoClassList(\n    List<AllNullableTypes?> classList,\n  ) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.callFlutterEchoClassList$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[classList],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else if (pigeonVar_replyList[0] == null) {\n      throw PlatformException(\n        code: 'null-error',\n        message: 'Host platform returned null value for non-null return value.',\n      );\n    } else {\n      return (pigeonVar_replyList[0] as List<Object?>?)!\n          .cast<AllNullableTypes?>();\n    }\n  }\n\n  Future<List<AnEnum>> callFlutterEchoNonNullEnumList(\n    List<AnEnum> enumList,\n  ) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.callFlutterEchoNonNullEnumList$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[enumList],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else if (pigeonVar_replyList[0] == null) {\n      throw PlatformException(\n        code: 'null-error',\n        message: 'Host platform returned null value for non-null return value.',\n      );\n    } else {\n      return (pigeonVar_replyList[0] as List<Object?>?)!.cast<AnEnum>();\n    }\n  }\n\n  Future<List<AllNullableTypes>> callFlutterEchoNonNullClassList(\n    List<AllNullableTypes> classList,\n  ) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.callFlutterEchoNonNullClassList$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[classList],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else if (pigeonVar_replyList[0] == null) {\n      throw PlatformException(\n        code: 'null-error',\n        message: 'Host platform returned null value for non-null return value.',\n      );\n    } else {\n      return (pigeonVar_replyList[0] as List<Object?>?)!\n          .cast<AllNullableTypes>();\n    }\n  }\n\n  Future<Map<Object?, Object?>> callFlutterEchoMap(\n    Map<Object?, Object?> map,\n  ) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.callFlutterEchoMap$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[map],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else if (pigeonVar_replyList[0] == null) {\n      throw PlatformException(\n        code: 'null-error',\n        message: 'Host platform returned null value for non-null return value.',\n      );\n    } else {\n      return (pigeonVar_replyList[0] as Map<Object?, Object?>?)!\n          .cast<Object?, Object?>();\n    }\n  }\n\n  Future<Map<String?, String?>> callFlutterEchoStringMap(\n    Map<String?, String?> stringMap,\n  ) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.callFlutterEchoStringMap$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[stringMap],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else if (pigeonVar_replyList[0] == null) {\n      throw PlatformException(\n        code: 'null-error',\n        message: 'Host platform returned null value for non-null return value.',\n      );\n    } else {\n      return (pigeonVar_replyList[0] as Map<Object?, Object?>?)!\n          .cast<String?, String?>();\n    }\n  }\n\n  Future<Map<int?, int?>> callFlutterEchoIntMap(Map<int?, int?> intMap) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.callFlutterEchoIntMap$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[intMap],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else if (pigeonVar_replyList[0] == null) {\n      throw PlatformException(\n        code: 'null-error',\n        message: 'Host platform returned null value for non-null return value.',\n      );\n    } else {\n      return (pigeonVar_replyList[0] as Map<Object?, Object?>?)!\n          .cast<int?, int?>();\n    }\n  }\n\n  Future<Map<AnEnum?, AnEnum?>> callFlutterEchoEnumMap(\n    Map<AnEnum?, AnEnum?> enumMap,\n  ) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.callFlutterEchoEnumMap$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[enumMap],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else if (pigeonVar_replyList[0] == null) {\n      throw PlatformException(\n        code: 'null-error',\n        message: 'Host platform returned null value for non-null return value.',\n      );\n    } else {\n      return (pigeonVar_replyList[0] as Map<Object?, Object?>?)!\n          .cast<AnEnum?, AnEnum?>();\n    }\n  }\n\n  Future<Map<int?, AllNullableTypes?>> callFlutterEchoClassMap(\n    Map<int?, AllNullableTypes?> classMap,\n  ) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.callFlutterEchoClassMap$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[classMap],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else if (pigeonVar_replyList[0] == null) {\n      throw PlatformException(\n        code: 'null-error',\n        message: 'Host platform returned null value for non-null return value.',\n      );\n    } else {\n      return (pigeonVar_replyList[0] as Map<Object?, Object?>?)!\n          .cast<int?, AllNullableTypes?>();\n    }\n  }\n\n  Future<Map<String, String>> callFlutterEchoNonNullStringMap(\n    Map<String, String> stringMap,\n  ) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.callFlutterEchoNonNullStringMap$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[stringMap],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else if (pigeonVar_replyList[0] == null) {\n      throw PlatformException(\n        code: 'null-error',\n        message: 'Host platform returned null value for non-null return value.',\n      );\n    } else {\n      return (pigeonVar_replyList[0] as Map<Object?, Object?>?)!\n          .cast<String, String>();\n    }\n  }\n\n  Future<Map<int, int>> callFlutterEchoNonNullIntMap(\n    Map<int, int> intMap,\n  ) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.callFlutterEchoNonNullIntMap$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[intMap],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else if (pigeonVar_replyList[0] == null) {\n      throw PlatformException(\n        code: 'null-error',\n        message: 'Host platform returned null value for non-null return value.',\n      );\n    } else {\n      return (pigeonVar_replyList[0] as Map<Object?, Object?>?)!\n          .cast<int, int>();\n    }\n  }\n\n  Future<Map<AnEnum, AnEnum>> callFlutterEchoNonNullEnumMap(\n    Map<AnEnum, AnEnum> enumMap,\n  ) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.callFlutterEchoNonNullEnumMap$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[enumMap],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else if (pigeonVar_replyList[0] == null) {\n      throw PlatformException(\n        code: 'null-error',\n        message: 'Host platform returned null value for non-null return value.',\n      );\n    } else {\n      return (pigeonVar_replyList[0] as Map<Object?, Object?>?)!\n          .cast<AnEnum, AnEnum>();\n    }\n  }\n\n  Future<Map<int, AllNullableTypes>> callFlutterEchoNonNullClassMap(\n    Map<int, AllNullableTypes> classMap,\n  ) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.callFlutterEchoNonNullClassMap$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[classMap],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else if (pigeonVar_replyList[0] == null) {\n      throw PlatformException(\n        code: 'null-error',\n        message: 'Host platform returned null value for non-null return value.',\n      );\n    } else {\n      return (pigeonVar_replyList[0] as Map<Object?, Object?>?)!\n          .cast<int, AllNullableTypes>();\n    }\n  }\n\n  Future<AnEnum> callFlutterEchoEnum(AnEnum anEnum) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.callFlutterEchoEnum$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[anEnum],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else if (pigeonVar_replyList[0] == null) {\n      throw PlatformException(\n        code: 'null-error',\n        message: 'Host platform returned null value for non-null return value.',\n      );\n    } else {\n      return (pigeonVar_replyList[0] as AnEnum?)!;\n    }\n  }\n\n  Future<AnotherEnum> callFlutterEchoAnotherEnum(\n    AnotherEnum anotherEnum,\n  ) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.callFlutterEchoAnotherEnum$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[anotherEnum],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else if (pigeonVar_replyList[0] == null) {\n      throw PlatformException(\n        code: 'null-error',\n        message: 'Host platform returned null value for non-null return value.',\n      );\n    } else {\n      return (pigeonVar_replyList[0] as AnotherEnum?)!;\n    }\n  }\n\n  Future<bool?> callFlutterEchoNullableBool(bool? aBool) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.callFlutterEchoNullableBool$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[aBool],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else {\n      return (pigeonVar_replyList[0] as bool?);\n    }\n  }\n\n  Future<int?> callFlutterEchoNullableInt(int? anInt) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.callFlutterEchoNullableInt$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[anInt],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else {\n      return (pigeonVar_replyList[0] as int?);\n    }\n  }\n\n  Future<double?> callFlutterEchoNullableDouble(double? aDouble) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.callFlutterEchoNullableDouble$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[aDouble],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else {\n      return (pigeonVar_replyList[0] as double?);\n    }\n  }\n\n  Future<String?> callFlutterEchoNullableString(String? aString) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.callFlutterEchoNullableString$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[aString],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else {\n      return (pigeonVar_replyList[0] as String?);\n    }\n  }\n\n  Future<Uint8List?> callFlutterEchoNullableUint8List(Uint8List? list) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.callFlutterEchoNullableUint8List$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[list],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else {\n      return (pigeonVar_replyList[0] as Uint8List?);\n    }\n  }\n\n  Future<List<Object?>?> callFlutterEchoNullableList(\n    List<Object?>? list,\n  ) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.callFlutterEchoNullableList$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[list],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else {\n      return (pigeonVar_replyList[0] as List<Object?>?)?.cast<Object?>();\n    }\n  }\n\n  Future<List<AnEnum?>?> callFlutterEchoNullableEnumList(\n    List<AnEnum?>? enumList,\n  ) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.callFlutterEchoNullableEnumList$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[enumList],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else {\n      return (pigeonVar_replyList[0] as List<Object?>?)?.cast<AnEnum?>();\n    }\n  }\n\n  Future<List<AllNullableTypes?>?> callFlutterEchoNullableClassList(\n    List<AllNullableTypes?>? classList,\n  ) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.callFlutterEchoNullableClassList$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[classList],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else {\n      return (pigeonVar_replyList[0] as List<Object?>?)\n          ?.cast<AllNullableTypes?>();\n    }\n  }\n\n  Future<List<AnEnum>?> callFlutterEchoNullableNonNullEnumList(\n    List<AnEnum>? enumList,\n  ) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.callFlutterEchoNullableNonNullEnumList$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[enumList],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else {\n      return (pigeonVar_replyList[0] as List<Object?>?)?.cast<AnEnum>();\n    }\n  }\n\n  Future<List<AllNullableTypes>?> callFlutterEchoNullableNonNullClassList(\n    List<AllNullableTypes>? classList,\n  ) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.callFlutterEchoNullableNonNullClassList$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[classList],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else {\n      return (pigeonVar_replyList[0] as List<Object?>?)\n          ?.cast<AllNullableTypes>();\n    }\n  }\n\n  Future<Map<Object?, Object?>?> callFlutterEchoNullableMap(\n    Map<Object?, Object?>? map,\n  ) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.callFlutterEchoNullableMap$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[map],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else {\n      return (pigeonVar_replyList[0] as Map<Object?, Object?>?)\n          ?.cast<Object?, Object?>();\n    }\n  }\n\n  Future<Map<String?, String?>?> callFlutterEchoNullableStringMap(\n    Map<String?, String?>? stringMap,\n  ) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.callFlutterEchoNullableStringMap$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[stringMap],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else {\n      return (pigeonVar_replyList[0] as Map<Object?, Object?>?)\n          ?.cast<String?, String?>();\n    }\n  }\n\n  Future<Map<int?, int?>?> callFlutterEchoNullableIntMap(\n    Map<int?, int?>? intMap,\n  ) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.callFlutterEchoNullableIntMap$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[intMap],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else {\n      return (pigeonVar_replyList[0] as Map<Object?, Object?>?)\n          ?.cast<int?, int?>();\n    }\n  }\n\n  Future<Map<AnEnum?, AnEnum?>?> callFlutterEchoNullableEnumMap(\n    Map<AnEnum?, AnEnum?>? enumMap,\n  ) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.callFlutterEchoNullableEnumMap$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[enumMap],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else {\n      return (pigeonVar_replyList[0] as Map<Object?, Object?>?)\n          ?.cast<AnEnum?, AnEnum?>();\n    }\n  }\n\n  Future<Map<int?, AllNullableTypes?>?> callFlutterEchoNullableClassMap(\n    Map<int?, AllNullableTypes?>? classMap,\n  ) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.callFlutterEchoNullableClassMap$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[classMap],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else {\n      return (pigeonVar_replyList[0] as Map<Object?, Object?>?)\n          ?.cast<int?, AllNullableTypes?>();\n    }\n  }\n\n  Future<Map<String, String>?> callFlutterEchoNullableNonNullStringMap(\n    Map<String, String>? stringMap,\n  ) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.callFlutterEchoNullableNonNullStringMap$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[stringMap],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else {\n      return (pigeonVar_replyList[0] as Map<Object?, Object?>?)\n          ?.cast<String, String>();\n    }\n  }\n\n  Future<Map<int, int>?> callFlutterEchoNullableNonNullIntMap(\n    Map<int, int>? intMap,\n  ) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.callFlutterEchoNullableNonNullIntMap$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[intMap],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else {\n      return (pigeonVar_replyList[0] as Map<Object?, Object?>?)\n          ?.cast<int, int>();\n    }\n  }\n\n  Future<Map<AnEnum, AnEnum>?> callFlutterEchoNullableNonNullEnumMap(\n    Map<AnEnum, AnEnum>? enumMap,\n  ) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.callFlutterEchoNullableNonNullEnumMap$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[enumMap],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else {\n      return (pigeonVar_replyList[0] as Map<Object?, Object?>?)\n          ?.cast<AnEnum, AnEnum>();\n    }\n  }\n\n  Future<Map<int, AllNullableTypes>?> callFlutterEchoNullableNonNullClassMap(\n    Map<int, AllNullableTypes>? classMap,\n  ) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.callFlutterEchoNullableNonNullClassMap$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[classMap],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else {\n      return (pigeonVar_replyList[0] as Map<Object?, Object?>?)\n          ?.cast<int, AllNullableTypes>();\n    }\n  }\n\n  Future<AnEnum?> callFlutterEchoNullableEnum(AnEnum? anEnum) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.callFlutterEchoNullableEnum$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[anEnum],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else {\n      return (pigeonVar_replyList[0] as AnEnum?);\n    }\n  }\n\n  Future<AnotherEnum?> callFlutterEchoAnotherNullableEnum(\n    AnotherEnum? anotherEnum,\n  ) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.callFlutterEchoAnotherNullableEnum$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[anotherEnum],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else {\n      return (pigeonVar_replyList[0] as AnotherEnum?);\n    }\n  }\n\n  Future<String> callFlutterSmallApiEchoString(String aString) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.callFlutterSmallApiEchoString$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[aString],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else if (pigeonVar_replyList[0] == null) {\n      throw PlatformException(\n        code: 'null-error',\n        message: 'Host platform returned null value for non-null return value.',\n      );\n    } else {\n      return (pigeonVar_replyList[0] as String?)!;\n    }\n  }\n}\n\n/// The core interface that the Dart platform_test code implements for host\n/// integration tests to call into.\nabstract class FlutterIntegrationCoreApi {\n  static const MessageCodec<Object?> pigeonChannelCodec = _PigeonCodec();\n\n  /// A no-op function taking no arguments and returning no value, to sanity\n  /// test basic calling.\n  void noop();\n\n  /// Responds with an error from an async function returning a value.\n  Object? throwError();\n\n  /// Responds with an error from an async void function.\n  void throwErrorFromVoid();\n\n  /// Returns the passed object, to test serialization and deserialization.\n  AllTypes echoAllTypes(AllTypes everything);\n\n  /// Returns the passed object, to test serialization and deserialization.\n  AllNullableTypes? echoAllNullableTypes(AllNullableTypes? everything);\n\n  /// Returns passed in arguments of multiple types.\n  ///\n  /// Tests multiple-arity FlutterApi handling.\n  AllNullableTypes sendMultipleNullableTypes(\n    bool? aNullableBool,\n    int? aNullableInt,\n    String? aNullableString,\n  );\n\n  /// Returns the passed object, to test serialization and deserialization.\n  AllNullableTypesWithoutRecursion? echoAllNullableTypesWithoutRecursion(\n    AllNullableTypesWithoutRecursion? everything,\n  );\n\n  /// Returns passed in arguments of multiple types.\n  ///\n  /// Tests multiple-arity FlutterApi handling.\n  AllNullableTypesWithoutRecursion sendMultipleNullableTypesWithoutRecursion(\n    bool? aNullableBool,\n    int? aNullableInt,\n    String? aNullableString,\n  );\n\n  /// Returns the passed boolean, to test serialization and deserialization.\n  bool echoBool(bool aBool);\n\n  /// Returns the passed int, to test serialization and deserialization.\n  int echoInt(int anInt);\n\n  /// Returns the passed double, to test serialization and deserialization.\n  double echoDouble(double aDouble);\n\n  /// Returns the passed string, to test serialization and deserialization.\n  String echoString(String aString);\n\n  /// Returns the passed byte list, to test serialization and deserialization.\n  Uint8List echoUint8List(Uint8List list);\n\n  /// Returns the passed list, to test serialization and deserialization.\n  List<Object?> echoList(List<Object?> list);\n\n  /// Returns the passed list, to test serialization and deserialization.\n  List<AnEnum?> echoEnumList(List<AnEnum?> enumList);\n\n  /// Returns the passed list, to test serialization and deserialization.\n  List<AllNullableTypes?> echoClassList(List<AllNullableTypes?> classList);\n\n  /// Returns the passed list, to test serialization and deserialization.\n  List<AnEnum> echoNonNullEnumList(List<AnEnum> enumList);\n\n  /// Returns the passed list, to test serialization and deserialization.\n  List<AllNullableTypes> echoNonNullClassList(List<AllNullableTypes> classList);\n\n  /// Returns the passed map, to test serialization and deserialization.\n  Map<Object?, Object?> echoMap(Map<Object?, Object?> map);\n\n  /// Returns the passed map, to test serialization and deserialization.\n  Map<String?, String?> echoStringMap(Map<String?, String?> stringMap);\n\n  /// Returns the passed map, to test serialization and deserialization.\n  Map<int?, int?> echoIntMap(Map<int?, int?> intMap);\n\n  /// Returns the passed map, to test serialization and deserialization.\n  Map<AnEnum?, AnEnum?> echoEnumMap(Map<AnEnum?, AnEnum?> enumMap);\n\n  /// Returns the passed map, to test serialization and deserialization.\n  Map<int?, AllNullableTypes?> echoClassMap(\n    Map<int?, AllNullableTypes?> classMap,\n  );\n\n  /// Returns the passed map, to test serialization and deserialization.\n  Map<String, String> echoNonNullStringMap(Map<String, String> stringMap);\n\n  /// Returns the passed map, to test serialization and deserialization.\n  Map<int, int> echoNonNullIntMap(Map<int, int> intMap);\n\n  /// Returns the passed map, to test serialization and deserialization.\n  Map<AnEnum, AnEnum> echoNonNullEnumMap(Map<AnEnum, AnEnum> enumMap);\n\n  /// Returns the passed map, to test serialization and deserialization.\n  Map<int, AllNullableTypes> echoNonNullClassMap(\n    Map<int, AllNullableTypes> classMap,\n  );\n\n  /// Returns the passed enum to test serialization and deserialization.\n  AnEnum echoEnum(AnEnum anEnum);\n\n  /// Returns the passed enum to test serialization and deserialization.\n  AnotherEnum echoAnotherEnum(AnotherEnum anotherEnum);\n\n  /// Returns the passed boolean, to test serialization and deserialization.\n  bool? echoNullableBool(bool? aBool);\n\n  /// Returns the passed int, to test serialization and deserialization.\n  int? echoNullableInt(int? anInt);\n\n  /// Returns the passed double, to test serialization and deserialization.\n  double? echoNullableDouble(double? aDouble);\n\n  /// Returns the passed string, to test serialization and deserialization.\n  String? echoNullableString(String? aString);\n\n  /// Returns the passed byte list, to test serialization and deserialization.\n  Uint8List? echoNullableUint8List(Uint8List? list);\n\n  /// Returns the passed list, to test serialization and deserialization.\n  List<Object?>? echoNullableList(List<Object?>? list);\n\n  /// Returns the passed list, to test serialization and deserialization.\n  List<AnEnum?>? echoNullableEnumList(List<AnEnum?>? enumList);\n\n  /// Returns the passed list, to test serialization and deserialization.\n  List<AllNullableTypes?>? echoNullableClassList(\n    List<AllNullableTypes?>? classList,\n  );\n\n  /// Returns the passed list, to test serialization and deserialization.\n  List<AnEnum>? echoNullableNonNullEnumList(List<AnEnum>? enumList);\n\n  /// Returns the passed list, to test serialization and deserialization.\n  List<AllNullableTypes>? echoNullableNonNullClassList(\n    List<AllNullableTypes>? classList,\n  );\n\n  /// Returns the passed map, to test serialization and deserialization.\n  Map<Object?, Object?>? echoNullableMap(Map<Object?, Object?>? map);\n\n  /// Returns the passed map, to test serialization and deserialization.\n  Map<String?, String?>? echoNullableStringMap(\n    Map<String?, String?>? stringMap,\n  );\n\n  /// Returns the passed map, to test serialization and deserialization.\n  Map<int?, int?>? echoNullableIntMap(Map<int?, int?>? intMap);\n\n  /// Returns the passed map, to test serialization and deserialization.\n  Map<AnEnum?, AnEnum?>? echoNullableEnumMap(Map<AnEnum?, AnEnum?>? enumMap);\n\n  /// Returns the passed map, to test serialization and deserialization.\n  Map<int?, AllNullableTypes?>? echoNullableClassMap(\n    Map<int?, AllNullableTypes?>? classMap,\n  );\n\n  /// Returns the passed map, to test serialization and deserialization.\n  Map<String, String>? echoNullableNonNullStringMap(\n    Map<String, String>? stringMap,\n  );\n\n  /// Returns the passed map, to test serialization and deserialization.\n  Map<int, int>? echoNullableNonNullIntMap(Map<int, int>? intMap);\n\n  /// Returns the passed map, to test serialization and deserialization.\n  Map<AnEnum, AnEnum>? echoNullableNonNullEnumMap(Map<AnEnum, AnEnum>? enumMap);\n\n  /// Returns the passed map, to test serialization and deserialization.\n  Map<int, AllNullableTypes>? echoNullableNonNullClassMap(\n    Map<int, AllNullableTypes>? classMap,\n  );\n\n  /// Returns the passed enum to test serialization and deserialization.\n  AnEnum? echoNullableEnum(AnEnum? anEnum);\n\n  /// Returns the passed enum to test serialization and deserialization.\n  AnotherEnum? echoAnotherNullableEnum(AnotherEnum? anotherEnum);\n\n  /// A no-op function taking no arguments and returning no value, to sanity\n  /// test basic asynchronous calling.\n  Future<void> noopAsync();\n\n  /// Returns the passed in generic Object asynchronously.\n  Future<String> echoAsyncString(String aString);\n\n  static void setUp(\n    FlutterIntegrationCoreApi? api, {\n    BinaryMessenger? binaryMessenger,\n    String messageChannelSuffix = '',\n  }) {\n    messageChannelSuffix = messageChannelSuffix.isNotEmpty\n        ? '.$messageChannelSuffix'\n        : '';\n    {\n      final pigeonVar_channel = BasicMessageChannel<Object?>(\n        'dev.flutter.pigeon.pigeon_integration_tests.FlutterIntegrationCoreApi.noop$messageChannelSuffix',\n        pigeonChannelCodec,\n        binaryMessenger: binaryMessenger,\n      );\n      if (api == null) {\n        pigeonVar_channel.setMessageHandler(null);\n      } else {\n        pigeonVar_channel.setMessageHandler((Object? message) async {\n          try {\n            api.noop();\n            return wrapResponse(empty: true);\n          } on PlatformException catch (e) {\n            return wrapResponse(error: e);\n          } catch (e) {\n            return wrapResponse(\n              error: PlatformException(code: 'error', message: e.toString()),\n            );\n          }\n        });\n      }\n    }\n    {\n      final pigeonVar_channel = BasicMessageChannel<Object?>(\n        'dev.flutter.pigeon.pigeon_integration_tests.FlutterIntegrationCoreApi.throwError$messageChannelSuffix',\n        pigeonChannelCodec,\n        binaryMessenger: binaryMessenger,\n      );\n      if (api == null) {\n        pigeonVar_channel.setMessageHandler(null);\n      } else {\n        pigeonVar_channel.setMessageHandler((Object? message) async {\n          try {\n            final Object? output = api.throwError();\n            return wrapResponse(result: output);\n          } on PlatformException catch (e) {\n            return wrapResponse(error: e);\n          } catch (e) {\n            return wrapResponse(\n              error: PlatformException(code: 'error', message: e.toString()),\n            );\n          }\n        });\n      }\n    }\n    {\n      final pigeonVar_channel = BasicMessageChannel<Object?>(\n        'dev.flutter.pigeon.pigeon_integration_tests.FlutterIntegrationCoreApi.throwErrorFromVoid$messageChannelSuffix',\n        pigeonChannelCodec,\n        binaryMessenger: binaryMessenger,\n      );\n      if (api == null) {\n        pigeonVar_channel.setMessageHandler(null);\n      } else {\n        pigeonVar_channel.setMessageHandler((Object? message) async {\n          try {\n            api.throwErrorFromVoid();\n            return wrapResponse(empty: true);\n          } on PlatformException catch (e) {\n            return wrapResponse(error: e);\n          } catch (e) {\n            return wrapResponse(\n              error: PlatformException(code: 'error', message: e.toString()),\n            );\n          }\n        });\n      }\n    }\n    {\n      final pigeonVar_channel = BasicMessageChannel<Object?>(\n        'dev.flutter.pigeon.pigeon_integration_tests.FlutterIntegrationCoreApi.echoAllTypes$messageChannelSuffix',\n        pigeonChannelCodec,\n        binaryMessenger: binaryMessenger,\n      );\n      if (api == null) {\n        pigeonVar_channel.setMessageHandler(null);\n      } else {\n        pigeonVar_channel.setMessageHandler((Object? message) async {\n          assert(\n            message != null,\n            'Argument for dev.flutter.pigeon.pigeon_integration_tests.FlutterIntegrationCoreApi.echoAllTypes was null.',\n          );\n          final List<Object?> args = (message as List<Object?>?)!;\n          final AllTypes? arg_everything = (args[0] as AllTypes?);\n          assert(\n            arg_everything != null,\n            'Argument for dev.flutter.pigeon.pigeon_integration_tests.FlutterIntegrationCoreApi.echoAllTypes was null, expected non-null AllTypes.',\n          );\n          try {\n            final AllTypes output = api.echoAllTypes(arg_everything!);\n            return wrapResponse(result: output);\n          } on PlatformException catch (e) {\n            return wrapResponse(error: e);\n          } catch (e) {\n            return wrapResponse(\n              error: PlatformException(code: 'error', message: e.toString()),\n            );\n          }\n        });\n      }\n    }\n    {\n      final pigeonVar_channel = BasicMessageChannel<Object?>(\n        'dev.flutter.pigeon.pigeon_integration_tests.FlutterIntegrationCoreApi.echoAllNullableTypes$messageChannelSuffix',\n        pigeonChannelCodec,\n        binaryMessenger: binaryMessenger,\n      );\n      if (api == null) {\n        pigeonVar_channel.setMessageHandler(null);\n      } else {\n        pigeonVar_channel.setMessageHandler((Object? message) async {\n          assert(\n            message != null,\n            'Argument for dev.flutter.pigeon.pigeon_integration_tests.FlutterIntegrationCoreApi.echoAllNullableTypes was null.',\n          );\n          final List<Object?> args = (message as List<Object?>?)!;\n          final AllNullableTypes? arg_everything =\n              (args[0] as AllNullableTypes?);\n          try {\n            final AllNullableTypes? output = api.echoAllNullableTypes(\n              arg_everything,\n            );\n            return wrapResponse(result: output);\n          } on PlatformException catch (e) {\n            return wrapResponse(error: e);\n          } catch (e) {\n            return wrapResponse(\n              error: PlatformException(code: 'error', message: e.toString()),\n            );\n          }\n        });\n      }\n    }\n    {\n      final pigeonVar_channel = BasicMessageChannel<Object?>(\n        'dev.flutter.pigeon.pigeon_integration_tests.FlutterIntegrationCoreApi.sendMultipleNullableTypes$messageChannelSuffix',\n        pigeonChannelCodec,\n        binaryMessenger: binaryMessenger,\n      );\n      if (api == null) {\n        pigeonVar_channel.setMessageHandler(null);\n      } else {\n        pigeonVar_channel.setMessageHandler((Object? message) async {\n          assert(\n            message != null,\n            'Argument for dev.flutter.pigeon.pigeon_integration_tests.FlutterIntegrationCoreApi.sendMultipleNullableTypes was null.',\n          );\n          final List<Object?> args = (message as List<Object?>?)!;\n          final bool? arg_aNullableBool = (args[0] as bool?);\n          final int? arg_aNullableInt = (args[1] as int?);\n          final String? arg_aNullableString = (args[2] as String?);\n          try {\n            final AllNullableTypes output = api.sendMultipleNullableTypes(\n              arg_aNullableBool,\n              arg_aNullableInt,\n              arg_aNullableString,\n            );\n            return wrapResponse(result: output);\n          } on PlatformException catch (e) {\n            return wrapResponse(error: e);\n          } catch (e) {\n            return wrapResponse(\n              error: PlatformException(code: 'error', message: e.toString()),\n            );\n          }\n        });\n      }\n    }\n    {\n      final pigeonVar_channel = BasicMessageChannel<Object?>(\n        'dev.flutter.pigeon.pigeon_integration_tests.FlutterIntegrationCoreApi.echoAllNullableTypesWithoutRecursion$messageChannelSuffix',\n        pigeonChannelCodec,\n        binaryMessenger: binaryMessenger,\n      );\n      if (api == null) {\n        pigeonVar_channel.setMessageHandler(null);\n      } else {\n        pigeonVar_channel.setMessageHandler((Object? message) async {\n          assert(\n            message != null,\n            'Argument for dev.flutter.pigeon.pigeon_integration_tests.FlutterIntegrationCoreApi.echoAllNullableTypesWithoutRecursion was null.',\n          );\n          final List<Object?> args = (message as List<Object?>?)!;\n          final AllNullableTypesWithoutRecursion? arg_everything =\n              (args[0] as AllNullableTypesWithoutRecursion?);\n          try {\n            final AllNullableTypesWithoutRecursion? output = api\n                .echoAllNullableTypesWithoutRecursion(arg_everything);\n            return wrapResponse(result: output);\n          } on PlatformException catch (e) {\n            return wrapResponse(error: e);\n          } catch (e) {\n            return wrapResponse(\n              error: PlatformException(code: 'error', message: e.toString()),\n            );\n          }\n        });\n      }\n    }\n    {\n      final pigeonVar_channel = BasicMessageChannel<Object?>(\n        'dev.flutter.pigeon.pigeon_integration_tests.FlutterIntegrationCoreApi.sendMultipleNullableTypesWithoutRecursion$messageChannelSuffix',\n        pigeonChannelCodec,\n        binaryMessenger: binaryMessenger,\n      );\n      if (api == null) {\n        pigeonVar_channel.setMessageHandler(null);\n      } else {\n        pigeonVar_channel.setMessageHandler((Object? message) async {\n          assert(\n            message != null,\n            'Argument for dev.flutter.pigeon.pigeon_integration_tests.FlutterIntegrationCoreApi.sendMultipleNullableTypesWithoutRecursion was null.',\n          );\n          final List<Object?> args = (message as List<Object?>?)!;\n          final bool? arg_aNullableBool = (args[0] as bool?);\n          final int? arg_aNullableInt = (args[1] as int?);\n          final String? arg_aNullableString = (args[2] as String?);\n          try {\n            final AllNullableTypesWithoutRecursion output = api\n                .sendMultipleNullableTypesWithoutRecursion(\n                  arg_aNullableBool,\n                  arg_aNullableInt,\n                  arg_aNullableString,\n                );\n            return wrapResponse(result: output);\n          } on PlatformException catch (e) {\n            return wrapResponse(error: e);\n          } catch (e) {\n            return wrapResponse(\n              error: PlatformException(code: 'error', message: e.toString()),\n            );\n          }\n        });\n      }\n    }\n    {\n      final pigeonVar_channel = BasicMessageChannel<Object?>(\n        'dev.flutter.pigeon.pigeon_integration_tests.FlutterIntegrationCoreApi.echoBool$messageChannelSuffix',\n        pigeonChannelCodec,\n        binaryMessenger: binaryMessenger,\n      );\n      if (api == null) {\n        pigeonVar_channel.setMessageHandler(null);\n      } else {\n        pigeonVar_channel.setMessageHandler((Object? message) async {\n          assert(\n            message != null,\n            'Argument for dev.flutter.pigeon.pigeon_integration_tests.FlutterIntegrationCoreApi.echoBool was null.',\n          );\n          final List<Object?> args = (message as List<Object?>?)!;\n          final bool? arg_aBool = (args[0] as bool?);\n          assert(\n            arg_aBool != null,\n            'Argument for dev.flutter.pigeon.pigeon_integration_tests.FlutterIntegrationCoreApi.echoBool was null, expected non-null bool.',\n          );\n          try {\n            final bool output = api.echoBool(arg_aBool!);\n            return wrapResponse(result: output);\n          } on PlatformException catch (e) {\n            return wrapResponse(error: e);\n          } catch (e) {\n            return wrapResponse(\n              error: PlatformException(code: 'error', message: e.toString()),\n            );\n          }\n        });\n      }\n    }\n    {\n      final pigeonVar_channel = BasicMessageChannel<Object?>(\n        'dev.flutter.pigeon.pigeon_integration_tests.FlutterIntegrationCoreApi.echoInt$messageChannelSuffix',\n        pigeonChannelCodec,\n        binaryMessenger: binaryMessenger,\n      );\n      if (api == null) {\n        pigeonVar_channel.setMessageHandler(null);\n      } else {\n        pigeonVar_channel.setMessageHandler((Object? message) async {\n          assert(\n            message != null,\n            'Argument for dev.flutter.pigeon.pigeon_integration_tests.FlutterIntegrationCoreApi.echoInt was null.',\n          );\n          final List<Object?> args = (message as List<Object?>?)!;\n          final int? arg_anInt = (args[0] as int?);\n          assert(\n            arg_anInt != null,\n            'Argument for dev.flutter.pigeon.pigeon_integration_tests.FlutterIntegrationCoreApi.echoInt was null, expected non-null int.',\n          );\n          try {\n            final int output = api.echoInt(arg_anInt!);\n            return wrapResponse(result: output);\n          } on PlatformException catch (e) {\n            return wrapResponse(error: e);\n          } catch (e) {\n            return wrapResponse(\n              error: PlatformException(code: 'error', message: e.toString()),\n            );\n          }\n        });\n      }\n    }\n    {\n      final pigeonVar_channel = BasicMessageChannel<Object?>(\n        'dev.flutter.pigeon.pigeon_integration_tests.FlutterIntegrationCoreApi.echoDouble$messageChannelSuffix',\n        pigeonChannelCodec,\n        binaryMessenger: binaryMessenger,\n      );\n      if (api == null) {\n        pigeonVar_channel.setMessageHandler(null);\n      } else {\n        pigeonVar_channel.setMessageHandler((Object? message) async {\n          assert(\n            message != null,\n            'Argument for dev.flutter.pigeon.pigeon_integration_tests.FlutterIntegrationCoreApi.echoDouble was null.',\n          );\n          final List<Object?> args = (message as List<Object?>?)!;\n          final double? arg_aDouble = (args[0] as double?);\n          assert(\n            arg_aDouble != null,\n            'Argument for dev.flutter.pigeon.pigeon_integration_tests.FlutterIntegrationCoreApi.echoDouble was null, expected non-null double.',\n          );\n          try {\n            final double output = api.echoDouble(arg_aDouble!);\n            return wrapResponse(result: output);\n          } on PlatformException catch (e) {\n            return wrapResponse(error: e);\n          } catch (e) {\n            return wrapResponse(\n              error: PlatformException(code: 'error', message: e.toString()),\n            );\n          }\n        });\n      }\n    }\n    {\n      final pigeonVar_channel = BasicMessageChannel<Object?>(\n        'dev.flutter.pigeon.pigeon_integration_tests.FlutterIntegrationCoreApi.echoString$messageChannelSuffix',\n        pigeonChannelCodec,\n        binaryMessenger: binaryMessenger,\n      );\n      if (api == null) {\n        pigeonVar_channel.setMessageHandler(null);\n      } else {\n        pigeonVar_channel.setMessageHandler((Object? message) async {\n          assert(\n            message != null,\n            'Argument for dev.flutter.pigeon.pigeon_integration_tests.FlutterIntegrationCoreApi.echoString was null.',\n          );\n          final List<Object?> args = (message as List<Object?>?)!;\n          final String? arg_aString = (args[0] as String?);\n          assert(\n            arg_aString != null,\n            'Argument for dev.flutter.pigeon.pigeon_integration_tests.FlutterIntegrationCoreApi.echoString was null, expected non-null String.',\n          );\n          try {\n            final String output = api.echoString(arg_aString!);\n            return wrapResponse(result: output);\n          } on PlatformException catch (e) {\n            return wrapResponse(error: e);\n          } catch (e) {\n            return wrapResponse(\n              error: PlatformException(code: 'error', message: e.toString()),\n            );\n          }\n        });\n      }\n    }\n    {\n      final pigeonVar_channel = BasicMessageChannel<Object?>(\n        'dev.flutter.pigeon.pigeon_integration_tests.FlutterIntegrationCoreApi.echoUint8List$messageChannelSuffix',\n        pigeonChannelCodec,\n        binaryMessenger: binaryMessenger,\n      );\n      if (api == null) {\n        pigeonVar_channel.setMessageHandler(null);\n      } else {\n        pigeonVar_channel.setMessageHandler((Object? message) async {\n          assert(\n            message != null,\n            'Argument for dev.flutter.pigeon.pigeon_integration_tests.FlutterIntegrationCoreApi.echoUint8List was null.',\n          );\n          final List<Object?> args = (message as List<Object?>?)!;\n          final Uint8List? arg_list = (args[0] as Uint8List?);\n          assert(\n            arg_list != null,\n            'Argument for dev.flutter.pigeon.pigeon_integration_tests.FlutterIntegrationCoreApi.echoUint8List was null, expected non-null Uint8List.',\n          );\n          try {\n            final Uint8List output = api.echoUint8List(arg_list!);\n            return wrapResponse(result: output);\n          } on PlatformException catch (e) {\n            return wrapResponse(error: e);\n          } catch (e) {\n            return wrapResponse(\n              error: PlatformException(code: 'error', message: e.toString()),\n            );\n          }\n        });\n      }\n    }\n    {\n      final pigeonVar_channel = BasicMessageChannel<Object?>(\n        'dev.flutter.pigeon.pigeon_integration_tests.FlutterIntegrationCoreApi.echoList$messageChannelSuffix',\n        pigeonChannelCodec,\n        binaryMessenger: binaryMessenger,\n      );\n      if (api == null) {\n        pigeonVar_channel.setMessageHandler(null);\n      } else {\n        pigeonVar_channel.setMessageHandler((Object? message) async {\n          assert(\n            message != null,\n            'Argument for dev.flutter.pigeon.pigeon_integration_tests.FlutterIntegrationCoreApi.echoList was null.',\n          );\n          final List<Object?> args = (message as List<Object?>?)!;\n          final List<Object?>? arg_list = (args[0] as List<Object?>?)\n              ?.cast<Object?>();\n          assert(\n            arg_list != null,\n            'Argument for dev.flutter.pigeon.pigeon_integration_tests.FlutterIntegrationCoreApi.echoList was null, expected non-null List<Object?>.',\n          );\n          try {\n            final List<Object?> output = api.echoList(arg_list!);\n            return wrapResponse(result: output);\n          } on PlatformException catch (e) {\n            return wrapResponse(error: e);\n          } catch (e) {\n            return wrapResponse(\n              error: PlatformException(code: 'error', message: e.toString()),\n            );\n          }\n        });\n      }\n    }\n    {\n      final pigeonVar_channel = BasicMessageChannel<Object?>(\n        'dev.flutter.pigeon.pigeon_integration_tests.FlutterIntegrationCoreApi.echoEnumList$messageChannelSuffix',\n        pigeonChannelCodec,\n        binaryMessenger: binaryMessenger,\n      );\n      if (api == null) {\n        pigeonVar_channel.setMessageHandler(null);\n      } else {\n        pigeonVar_channel.setMessageHandler((Object? message) async {\n          assert(\n            message != null,\n            'Argument for dev.flutter.pigeon.pigeon_integration_tests.FlutterIntegrationCoreApi.echoEnumList was null.',\n          );\n          final List<Object?> args = (message as List<Object?>?)!;\n          final List<AnEnum?>? arg_enumList = (args[0] as List<Object?>?)\n              ?.cast<AnEnum?>();\n          assert(\n            arg_enumList != null,\n            'Argument for dev.flutter.pigeon.pigeon_integration_tests.FlutterIntegrationCoreApi.echoEnumList was null, expected non-null List<AnEnum?>.',\n          );\n          try {\n            final List<AnEnum?> output = api.echoEnumList(arg_enumList!);\n            return wrapResponse(result: output);\n          } on PlatformException catch (e) {\n            return wrapResponse(error: e);\n          } catch (e) {\n            return wrapResponse(\n              error: PlatformException(code: 'error', message: e.toString()),\n            );\n          }\n        });\n      }\n    }\n    {\n      final pigeonVar_channel = BasicMessageChannel<Object?>(\n        'dev.flutter.pigeon.pigeon_integration_tests.FlutterIntegrationCoreApi.echoClassList$messageChannelSuffix',\n        pigeonChannelCodec,\n        binaryMessenger: binaryMessenger,\n      );\n      if (api == null) {\n        pigeonVar_channel.setMessageHandler(null);\n      } else {\n        pigeonVar_channel.setMessageHandler((Object? message) async {\n          assert(\n            message != null,\n            'Argument for dev.flutter.pigeon.pigeon_integration_tests.FlutterIntegrationCoreApi.echoClassList was null.',\n          );\n          final List<Object?> args = (message as List<Object?>?)!;\n          final List<AllNullableTypes?>? arg_classList =\n              (args[0] as List<Object?>?)?.cast<AllNullableTypes?>();\n          assert(\n            arg_classList != null,\n            'Argument for dev.flutter.pigeon.pigeon_integration_tests.FlutterIntegrationCoreApi.echoClassList was null, expected non-null List<AllNullableTypes?>.',\n          );\n          try {\n            final List<AllNullableTypes?> output = api.echoClassList(\n              arg_classList!,\n            );\n            return wrapResponse(result: output);\n          } on PlatformException catch (e) {\n            return wrapResponse(error: e);\n          } catch (e) {\n            return wrapResponse(\n              error: PlatformException(code: 'error', message: e.toString()),\n            );\n          }\n        });\n      }\n    }\n    {\n      final pigeonVar_channel = BasicMessageChannel<Object?>(\n        'dev.flutter.pigeon.pigeon_integration_tests.FlutterIntegrationCoreApi.echoNonNullEnumList$messageChannelSuffix',\n        pigeonChannelCodec,\n        binaryMessenger: binaryMessenger,\n      );\n      if (api == null) {\n        pigeonVar_channel.setMessageHandler(null);\n      } else {\n        pigeonVar_channel.setMessageHandler((Object? message) async {\n          assert(\n            message != null,\n            'Argument for dev.flutter.pigeon.pigeon_integration_tests.FlutterIntegrationCoreApi.echoNonNullEnumList was null.',\n          );\n          final List<Object?> args = (message as List<Object?>?)!;\n          final List<AnEnum>? arg_enumList = (args[0] as List<Object?>?)\n              ?.cast<AnEnum>();\n          assert(\n            arg_enumList != null,\n            'Argument for dev.flutter.pigeon.pigeon_integration_tests.FlutterIntegrationCoreApi.echoNonNullEnumList was null, expected non-null List<AnEnum>.',\n          );\n          try {\n            final List<AnEnum> output = api.echoNonNullEnumList(arg_enumList!);\n            return wrapResponse(result: output);\n          } on PlatformException catch (e) {\n            return wrapResponse(error: e);\n          } catch (e) {\n            return wrapResponse(\n              error: PlatformException(code: 'error', message: e.toString()),\n            );\n          }\n        });\n      }\n    }\n    {\n      final pigeonVar_channel = BasicMessageChannel<Object?>(\n        'dev.flutter.pigeon.pigeon_integration_tests.FlutterIntegrationCoreApi.echoNonNullClassList$messageChannelSuffix',\n        pigeonChannelCodec,\n        binaryMessenger: binaryMessenger,\n      );\n      if (api == null) {\n        pigeonVar_channel.setMessageHandler(null);\n      } else {\n        pigeonVar_channel.setMessageHandler((Object? message) async {\n          assert(\n            message != null,\n            'Argument for dev.flutter.pigeon.pigeon_integration_tests.FlutterIntegrationCoreApi.echoNonNullClassList was null.',\n          );\n          final List<Object?> args = (message as List<Object?>?)!;\n          final List<AllNullableTypes>? arg_classList =\n              (args[0] as List<Object?>?)?.cast<AllNullableTypes>();\n          assert(\n            arg_classList != null,\n            'Argument for dev.flutter.pigeon.pigeon_integration_tests.FlutterIntegrationCoreApi.echoNonNullClassList was null, expected non-null List<AllNullableTypes>.',\n          );\n          try {\n            final List<AllNullableTypes> output = api.echoNonNullClassList(\n              arg_classList!,\n            );\n            return wrapResponse(result: output);\n          } on PlatformException catch (e) {\n            return wrapResponse(error: e);\n          } catch (e) {\n            return wrapResponse(\n              error: PlatformException(code: 'error', message: e.toString()),\n            );\n          }\n        });\n      }\n    }\n    {\n      final pigeonVar_channel = BasicMessageChannel<Object?>(\n        'dev.flutter.pigeon.pigeon_integration_tests.FlutterIntegrationCoreApi.echoMap$messageChannelSuffix',\n        pigeonChannelCodec,\n        binaryMessenger: binaryMessenger,\n      );\n      if (api == null) {\n        pigeonVar_channel.setMessageHandler(null);\n      } else {\n        pigeonVar_channel.setMessageHandler((Object? message) async {\n          assert(\n            message != null,\n            'Argument for dev.flutter.pigeon.pigeon_integration_tests.FlutterIntegrationCoreApi.echoMap was null.',\n          );\n          final List<Object?> args = (message as List<Object?>?)!;\n          final Map<Object?, Object?>? arg_map =\n              (args[0] as Map<Object?, Object?>?)?.cast<Object?, Object?>();\n          assert(\n            arg_map != null,\n            'Argument for dev.flutter.pigeon.pigeon_integration_tests.FlutterIntegrationCoreApi.echoMap was null, expected non-null Map<Object?, Object?>.',\n          );\n          try {\n            final Map<Object?, Object?> output = api.echoMap(arg_map!);\n            return wrapResponse(result: output);\n          } on PlatformException catch (e) {\n            return wrapResponse(error: e);\n          } catch (e) {\n            return wrapResponse(\n              error: PlatformException(code: 'error', message: e.toString()),\n            );\n          }\n        });\n      }\n    }\n    {\n      final pigeonVar_channel = BasicMessageChannel<Object?>(\n        'dev.flutter.pigeon.pigeon_integration_tests.FlutterIntegrationCoreApi.echoStringMap$messageChannelSuffix',\n        pigeonChannelCodec,\n        binaryMessenger: binaryMessenger,\n      );\n      if (api == null) {\n        pigeonVar_channel.setMessageHandler(null);\n      } else {\n        pigeonVar_channel.setMessageHandler((Object? message) async {\n          assert(\n            message != null,\n            'Argument for dev.flutter.pigeon.pigeon_integration_tests.FlutterIntegrationCoreApi.echoStringMap was null.',\n          );\n          final List<Object?> args = (message as List<Object?>?)!;\n          final Map<String?, String?>? arg_stringMap =\n              (args[0] as Map<Object?, Object?>?)?.cast<String?, String?>();\n          assert(\n            arg_stringMap != null,\n            'Argument for dev.flutter.pigeon.pigeon_integration_tests.FlutterIntegrationCoreApi.echoStringMap was null, expected non-null Map<String?, String?>.',\n          );\n          try {\n            final Map<String?, String?> output = api.echoStringMap(\n              arg_stringMap!,\n            );\n            return wrapResponse(result: output);\n          } on PlatformException catch (e) {\n            return wrapResponse(error: e);\n          } catch (e) {\n            return wrapResponse(\n              error: PlatformException(code: 'error', message: e.toString()),\n            );\n          }\n        });\n      }\n    }\n    {\n      final pigeonVar_channel = BasicMessageChannel<Object?>(\n        'dev.flutter.pigeon.pigeon_integration_tests.FlutterIntegrationCoreApi.echoIntMap$messageChannelSuffix',\n        pigeonChannelCodec,\n        binaryMessenger: binaryMessenger,\n      );\n      if (api == null) {\n        pigeonVar_channel.setMessageHandler(null);\n      } else {\n        pigeonVar_channel.setMessageHandler((Object? message) async {\n          assert(\n            message != null,\n            'Argument for dev.flutter.pigeon.pigeon_integration_tests.FlutterIntegrationCoreApi.echoIntMap was null.',\n          );\n          final List<Object?> args = (message as List<Object?>?)!;\n          final Map<int?, int?>? arg_intMap =\n              (args[0] as Map<Object?, Object?>?)?.cast<int?, int?>();\n          assert(\n            arg_intMap != null,\n            'Argument for dev.flutter.pigeon.pigeon_integration_tests.FlutterIntegrationCoreApi.echoIntMap was null, expected non-null Map<int?, int?>.',\n          );\n          try {\n            final Map<int?, int?> output = api.echoIntMap(arg_intMap!);\n            return wrapResponse(result: output);\n          } on PlatformException catch (e) {\n            return wrapResponse(error: e);\n          } catch (e) {\n            return wrapResponse(\n              error: PlatformException(code: 'error', message: e.toString()),\n            );\n          }\n        });\n      }\n    }\n    {\n      final pigeonVar_channel = BasicMessageChannel<Object?>(\n        'dev.flutter.pigeon.pigeon_integration_tests.FlutterIntegrationCoreApi.echoEnumMap$messageChannelSuffix',\n        pigeonChannelCodec,\n        binaryMessenger: binaryMessenger,\n      );\n      if (api == null) {\n        pigeonVar_channel.setMessageHandler(null);\n      } else {\n        pigeonVar_channel.setMessageHandler((Object? message) async {\n          assert(\n            message != null,\n            'Argument for dev.flutter.pigeon.pigeon_integration_tests.FlutterIntegrationCoreApi.echoEnumMap was null.',\n          );\n          final List<Object?> args = (message as List<Object?>?)!;\n          final Map<AnEnum?, AnEnum?>? arg_enumMap =\n              (args[0] as Map<Object?, Object?>?)?.cast<AnEnum?, AnEnum?>();\n          assert(\n            arg_enumMap != null,\n            'Argument for dev.flutter.pigeon.pigeon_integration_tests.FlutterIntegrationCoreApi.echoEnumMap was null, expected non-null Map<AnEnum?, AnEnum?>.',\n          );\n          try {\n            final Map<AnEnum?, AnEnum?> output = api.echoEnumMap(arg_enumMap!);\n            return wrapResponse(result: output);\n          } on PlatformException catch (e) {\n            return wrapResponse(error: e);\n          } catch (e) {\n            return wrapResponse(\n              error: PlatformException(code: 'error', message: e.toString()),\n            );\n          }\n        });\n      }\n    }\n    {\n      final pigeonVar_channel = BasicMessageChannel<Object?>(\n        'dev.flutter.pigeon.pigeon_integration_tests.FlutterIntegrationCoreApi.echoClassMap$messageChannelSuffix',\n        pigeonChannelCodec,\n        binaryMessenger: binaryMessenger,\n      );\n      if (api == null) {\n        pigeonVar_channel.setMessageHandler(null);\n      } else {\n        pigeonVar_channel.setMessageHandler((Object? message) async {\n          assert(\n            message != null,\n            'Argument for dev.flutter.pigeon.pigeon_integration_tests.FlutterIntegrationCoreApi.echoClassMap was null.',\n          );\n          final List<Object?> args = (message as List<Object?>?)!;\n          final Map<int?, AllNullableTypes?>? arg_classMap =\n              (args[0] as Map<Object?, Object?>?)\n                  ?.cast<int?, AllNullableTypes?>();\n          assert(\n            arg_classMap != null,\n            'Argument for dev.flutter.pigeon.pigeon_integration_tests.FlutterIntegrationCoreApi.echoClassMap was null, expected non-null Map<int?, AllNullableTypes?>.',\n          );\n          try {\n            final Map<int?, AllNullableTypes?> output = api.echoClassMap(\n              arg_classMap!,\n            );\n            return wrapResponse(result: output);\n          } on PlatformException catch (e) {\n            return wrapResponse(error: e);\n          } catch (e) {\n            return wrapResponse(\n              error: PlatformException(code: 'error', message: e.toString()),\n            );\n          }\n        });\n      }\n    }\n    {\n      final pigeonVar_channel = BasicMessageChannel<Object?>(\n        'dev.flutter.pigeon.pigeon_integration_tests.FlutterIntegrationCoreApi.echoNonNullStringMap$messageChannelSuffix',\n        pigeonChannelCodec,\n        binaryMessenger: binaryMessenger,\n      );\n      if (api == null) {\n        pigeonVar_channel.setMessageHandler(null);\n      } else {\n        pigeonVar_channel.setMessageHandler((Object? message) async {\n          assert(\n            message != null,\n            'Argument for dev.flutter.pigeon.pigeon_integration_tests.FlutterIntegrationCoreApi.echoNonNullStringMap was null.',\n          );\n          final List<Object?> args = (message as List<Object?>?)!;\n          final Map<String, String>? arg_stringMap =\n              (args[0] as Map<Object?, Object?>?)?.cast<String, String>();\n          assert(\n            arg_stringMap != null,\n            'Argument for dev.flutter.pigeon.pigeon_integration_tests.FlutterIntegrationCoreApi.echoNonNullStringMap was null, expected non-null Map<String, String>.',\n          );\n          try {\n            final Map<String, String> output = api.echoNonNullStringMap(\n              arg_stringMap!,\n            );\n            return wrapResponse(result: output);\n          } on PlatformException catch (e) {\n            return wrapResponse(error: e);\n          } catch (e) {\n            return wrapResponse(\n              error: PlatformException(code: 'error', message: e.toString()),\n            );\n          }\n        });\n      }\n    }\n    {\n      final pigeonVar_channel = BasicMessageChannel<Object?>(\n        'dev.flutter.pigeon.pigeon_integration_tests.FlutterIntegrationCoreApi.echoNonNullIntMap$messageChannelSuffix',\n        pigeonChannelCodec,\n        binaryMessenger: binaryMessenger,\n      );\n      if (api == null) {\n        pigeonVar_channel.setMessageHandler(null);\n      } else {\n        pigeonVar_channel.setMessageHandler((Object? message) async {\n          assert(\n            message != null,\n            'Argument for dev.flutter.pigeon.pigeon_integration_tests.FlutterIntegrationCoreApi.echoNonNullIntMap was null.',\n          );\n          final List<Object?> args = (message as List<Object?>?)!;\n          final Map<int, int>? arg_intMap = (args[0] as Map<Object?, Object?>?)\n              ?.cast<int, int>();\n          assert(\n            arg_intMap != null,\n            'Argument for dev.flutter.pigeon.pigeon_integration_tests.FlutterIntegrationCoreApi.echoNonNullIntMap was null, expected non-null Map<int, int>.',\n          );\n          try {\n            final Map<int, int> output = api.echoNonNullIntMap(arg_intMap!);\n            return wrapResponse(result: output);\n          } on PlatformException catch (e) {\n            return wrapResponse(error: e);\n          } catch (e) {\n            return wrapResponse(\n              error: PlatformException(code: 'error', message: e.toString()),\n            );\n          }\n        });\n      }\n    }\n    {\n      final pigeonVar_channel = BasicMessageChannel<Object?>(\n        'dev.flutter.pigeon.pigeon_integration_tests.FlutterIntegrationCoreApi.echoNonNullEnumMap$messageChannelSuffix',\n        pigeonChannelCodec,\n        binaryMessenger: binaryMessenger,\n      );\n      if (api == null) {\n        pigeonVar_channel.setMessageHandler(null);\n      } else {\n        pigeonVar_channel.setMessageHandler((Object? message) async {\n          assert(\n            message != null,\n            'Argument for dev.flutter.pigeon.pigeon_integration_tests.FlutterIntegrationCoreApi.echoNonNullEnumMap was null.',\n          );\n          final List<Object?> args = (message as List<Object?>?)!;\n          final Map<AnEnum, AnEnum>? arg_enumMap =\n              (args[0] as Map<Object?, Object?>?)?.cast<AnEnum, AnEnum>();\n          assert(\n            arg_enumMap != null,\n            'Argument for dev.flutter.pigeon.pigeon_integration_tests.FlutterIntegrationCoreApi.echoNonNullEnumMap was null, expected non-null Map<AnEnum, AnEnum>.',\n          );\n          try {\n            final Map<AnEnum, AnEnum> output = api.echoNonNullEnumMap(\n              arg_enumMap!,\n            );\n            return wrapResponse(result: output);\n          } on PlatformException catch (e) {\n            return wrapResponse(error: e);\n          } catch (e) {\n            return wrapResponse(\n              error: PlatformException(code: 'error', message: e.toString()),\n            );\n          }\n        });\n      }\n    }\n    {\n      final pigeonVar_channel = BasicMessageChannel<Object?>(\n        'dev.flutter.pigeon.pigeon_integration_tests.FlutterIntegrationCoreApi.echoNonNullClassMap$messageChannelSuffix',\n        pigeonChannelCodec,\n        binaryMessenger: binaryMessenger,\n      );\n      if (api == null) {\n        pigeonVar_channel.setMessageHandler(null);\n      } else {\n        pigeonVar_channel.setMessageHandler((Object? message) async {\n          assert(\n            message != null,\n            'Argument for dev.flutter.pigeon.pigeon_integration_tests.FlutterIntegrationCoreApi.echoNonNullClassMap was null.',\n          );\n          final List<Object?> args = (message as List<Object?>?)!;\n          final Map<int, AllNullableTypes>? arg_classMap =\n              (args[0] as Map<Object?, Object?>?)\n                  ?.cast<int, AllNullableTypes>();\n          assert(\n            arg_classMap != null,\n            'Argument for dev.flutter.pigeon.pigeon_integration_tests.FlutterIntegrationCoreApi.echoNonNullClassMap was null, expected non-null Map<int, AllNullableTypes>.',\n          );\n          try {\n            final Map<int, AllNullableTypes> output = api.echoNonNullClassMap(\n              arg_classMap!,\n            );\n            return wrapResponse(result: output);\n          } on PlatformException catch (e) {\n            return wrapResponse(error: e);\n          } catch (e) {\n            return wrapResponse(\n              error: PlatformException(code: 'error', message: e.toString()),\n            );\n          }\n        });\n      }\n    }\n    {\n      final pigeonVar_channel = BasicMessageChannel<Object?>(\n        'dev.flutter.pigeon.pigeon_integration_tests.FlutterIntegrationCoreApi.echoEnum$messageChannelSuffix',\n        pigeonChannelCodec,\n        binaryMessenger: binaryMessenger,\n      );\n      if (api == null) {\n        pigeonVar_channel.setMessageHandler(null);\n      } else {\n        pigeonVar_channel.setMessageHandler((Object? message) async {\n          assert(\n            message != null,\n            'Argument for dev.flutter.pigeon.pigeon_integration_tests.FlutterIntegrationCoreApi.echoEnum was null.',\n          );\n          final List<Object?> args = (message as List<Object?>?)!;\n          final AnEnum? arg_anEnum = (args[0] as AnEnum?);\n          assert(\n            arg_anEnum != null,\n            'Argument for dev.flutter.pigeon.pigeon_integration_tests.FlutterIntegrationCoreApi.echoEnum was null, expected non-null AnEnum.',\n          );\n          try {\n            final AnEnum output = api.echoEnum(arg_anEnum!);\n            return wrapResponse(result: output);\n          } on PlatformException catch (e) {\n            return wrapResponse(error: e);\n          } catch (e) {\n            return wrapResponse(\n              error: PlatformException(code: 'error', message: e.toString()),\n            );\n          }\n        });\n      }\n    }\n    {\n      final pigeonVar_channel = BasicMessageChannel<Object?>(\n        'dev.flutter.pigeon.pigeon_integration_tests.FlutterIntegrationCoreApi.echoAnotherEnum$messageChannelSuffix',\n        pigeonChannelCodec,\n        binaryMessenger: binaryMessenger,\n      );\n      if (api == null) {\n        pigeonVar_channel.setMessageHandler(null);\n      } else {\n        pigeonVar_channel.setMessageHandler((Object? message) async {\n          assert(\n            message != null,\n            'Argument for dev.flutter.pigeon.pigeon_integration_tests.FlutterIntegrationCoreApi.echoAnotherEnum was null.',\n          );\n          final List<Object?> args = (message as List<Object?>?)!;\n          final AnotherEnum? arg_anotherEnum = (args[0] as AnotherEnum?);\n          assert(\n            arg_anotherEnum != null,\n            'Argument for dev.flutter.pigeon.pigeon_integration_tests.FlutterIntegrationCoreApi.echoAnotherEnum was null, expected non-null AnotherEnum.',\n          );\n          try {\n            final AnotherEnum output = api.echoAnotherEnum(arg_anotherEnum!);\n            return wrapResponse(result: output);\n          } on PlatformException catch (e) {\n            return wrapResponse(error: e);\n          } catch (e) {\n            return wrapResponse(\n              error: PlatformException(code: 'error', message: e.toString()),\n            );\n          }\n        });\n      }\n    }\n    {\n      final pigeonVar_channel = BasicMessageChannel<Object?>(\n        'dev.flutter.pigeon.pigeon_integration_tests.FlutterIntegrationCoreApi.echoNullableBool$messageChannelSuffix',\n        pigeonChannelCodec,\n        binaryMessenger: binaryMessenger,\n      );\n      if (api == null) {\n        pigeonVar_channel.setMessageHandler(null);\n      } else {\n        pigeonVar_channel.setMessageHandler((Object? message) async {\n          assert(\n            message != null,\n            'Argument for dev.flutter.pigeon.pigeon_integration_tests.FlutterIntegrationCoreApi.echoNullableBool was null.',\n          );\n          final List<Object?> args = (message as List<Object?>?)!;\n          final bool? arg_aBool = (args[0] as bool?);\n          try {\n            final bool? output = api.echoNullableBool(arg_aBool);\n            return wrapResponse(result: output);\n          } on PlatformException catch (e) {\n            return wrapResponse(error: e);\n          } catch (e) {\n            return wrapResponse(\n              error: PlatformException(code: 'error', message: e.toString()),\n            );\n          }\n        });\n      }\n    }\n    {\n      final pigeonVar_channel = BasicMessageChannel<Object?>(\n        'dev.flutter.pigeon.pigeon_integration_tests.FlutterIntegrationCoreApi.echoNullableInt$messageChannelSuffix',\n        pigeonChannelCodec,\n        binaryMessenger: binaryMessenger,\n      );\n      if (api == null) {\n        pigeonVar_channel.setMessageHandler(null);\n      } else {\n        pigeonVar_channel.setMessageHandler((Object? message) async {\n          assert(\n            message != null,\n            'Argument for dev.flutter.pigeon.pigeon_integration_tests.FlutterIntegrationCoreApi.echoNullableInt was null.',\n          );\n          final List<Object?> args = (message as List<Object?>?)!;\n          final int? arg_anInt = (args[0] as int?);\n          try {\n            final int? output = api.echoNullableInt(arg_anInt);\n            return wrapResponse(result: output);\n          } on PlatformException catch (e) {\n            return wrapResponse(error: e);\n          } catch (e) {\n            return wrapResponse(\n              error: PlatformException(code: 'error', message: e.toString()),\n            );\n          }\n        });\n      }\n    }\n    {\n      final pigeonVar_channel = BasicMessageChannel<Object?>(\n        'dev.flutter.pigeon.pigeon_integration_tests.FlutterIntegrationCoreApi.echoNullableDouble$messageChannelSuffix',\n        pigeonChannelCodec,\n        binaryMessenger: binaryMessenger,\n      );\n      if (api == null) {\n        pigeonVar_channel.setMessageHandler(null);\n      } else {\n        pigeonVar_channel.setMessageHandler((Object? message) async {\n          assert(\n            message != null,\n            'Argument for dev.flutter.pigeon.pigeon_integration_tests.FlutterIntegrationCoreApi.echoNullableDouble was null.',\n          );\n          final List<Object?> args = (message as List<Object?>?)!;\n          final double? arg_aDouble = (args[0] as double?);\n          try {\n            final double? output = api.echoNullableDouble(arg_aDouble);\n            return wrapResponse(result: output);\n          } on PlatformException catch (e) {\n            return wrapResponse(error: e);\n          } catch (e) {\n            return wrapResponse(\n              error: PlatformException(code: 'error', message: e.toString()),\n            );\n          }\n        });\n      }\n    }\n    {\n      final pigeonVar_channel = BasicMessageChannel<Object?>(\n        'dev.flutter.pigeon.pigeon_integration_tests.FlutterIntegrationCoreApi.echoNullableString$messageChannelSuffix',\n        pigeonChannelCodec,\n        binaryMessenger: binaryMessenger,\n      );\n      if (api == null) {\n        pigeonVar_channel.setMessageHandler(null);\n      } else {\n        pigeonVar_channel.setMessageHandler((Object? message) async {\n          assert(\n            message != null,\n            'Argument for dev.flutter.pigeon.pigeon_integration_tests.FlutterIntegrationCoreApi.echoNullableString was null.',\n          );\n          final List<Object?> args = (message as List<Object?>?)!;\n          final String? arg_aString = (args[0] as String?);\n          try {\n            final String? output = api.echoNullableString(arg_aString);\n            return wrapResponse(result: output);\n          } on PlatformException catch (e) {\n            return wrapResponse(error: e);\n          } catch (e) {\n            return wrapResponse(\n              error: PlatformException(code: 'error', message: e.toString()),\n            );\n          }\n        });\n      }\n    }\n    {\n      final pigeonVar_channel = BasicMessageChannel<Object?>(\n        'dev.flutter.pigeon.pigeon_integration_tests.FlutterIntegrationCoreApi.echoNullableUint8List$messageChannelSuffix',\n        pigeonChannelCodec,\n        binaryMessenger: binaryMessenger,\n      );\n      if (api == null) {\n        pigeonVar_channel.setMessageHandler(null);\n      } else {\n        pigeonVar_channel.setMessageHandler((Object? message) async {\n          assert(\n            message != null,\n            'Argument for dev.flutter.pigeon.pigeon_integration_tests.FlutterIntegrationCoreApi.echoNullableUint8List was null.',\n          );\n          final List<Object?> args = (message as List<Object?>?)!;\n          final Uint8List? arg_list = (args[0] as Uint8List?);\n          try {\n            final Uint8List? output = api.echoNullableUint8List(arg_list);\n            return wrapResponse(result: output);\n          } on PlatformException catch (e) {\n            return wrapResponse(error: e);\n          } catch (e) {\n            return wrapResponse(\n              error: PlatformException(code: 'error', message: e.toString()),\n            );\n          }\n        });\n      }\n    }\n    {\n      final pigeonVar_channel = BasicMessageChannel<Object?>(\n        'dev.flutter.pigeon.pigeon_integration_tests.FlutterIntegrationCoreApi.echoNullableList$messageChannelSuffix',\n        pigeonChannelCodec,\n        binaryMessenger: binaryMessenger,\n      );\n      if (api == null) {\n        pigeonVar_channel.setMessageHandler(null);\n      } else {\n        pigeonVar_channel.setMessageHandler((Object? message) async {\n          assert(\n            message != null,\n            'Argument for dev.flutter.pigeon.pigeon_integration_tests.FlutterIntegrationCoreApi.echoNullableList was null.',\n          );\n          final List<Object?> args = (message as List<Object?>?)!;\n          final List<Object?>? arg_list = (args[0] as List<Object?>?)\n              ?.cast<Object?>();\n          try {\n            final List<Object?>? output = api.echoNullableList(arg_list);\n            return wrapResponse(result: output);\n          } on PlatformException catch (e) {\n            return wrapResponse(error: e);\n          } catch (e) {\n            return wrapResponse(\n              error: PlatformException(code: 'error', message: e.toString()),\n            );\n          }\n        });\n      }\n    }\n    {\n      final pigeonVar_channel = BasicMessageChannel<Object?>(\n        'dev.flutter.pigeon.pigeon_integration_tests.FlutterIntegrationCoreApi.echoNullableEnumList$messageChannelSuffix',\n        pigeonChannelCodec,\n        binaryMessenger: binaryMessenger,\n      );\n      if (api == null) {\n        pigeonVar_channel.setMessageHandler(null);\n      } else {\n        pigeonVar_channel.setMessageHandler((Object? message) async {\n          assert(\n            message != null,\n            'Argument for dev.flutter.pigeon.pigeon_integration_tests.FlutterIntegrationCoreApi.echoNullableEnumList was null.',\n          );\n          final List<Object?> args = (message as List<Object?>?)!;\n          final List<AnEnum?>? arg_enumList = (args[0] as List<Object?>?)\n              ?.cast<AnEnum?>();\n          try {\n            final List<AnEnum?>? output = api.echoNullableEnumList(\n              arg_enumList,\n            );\n            return wrapResponse(result: output);\n          } on PlatformException catch (e) {\n            return wrapResponse(error: e);\n          } catch (e) {\n            return wrapResponse(\n              error: PlatformException(code: 'error', message: e.toString()),\n            );\n          }\n        });\n      }\n    }\n    {\n      final pigeonVar_channel = BasicMessageChannel<Object?>(\n        'dev.flutter.pigeon.pigeon_integration_tests.FlutterIntegrationCoreApi.echoNullableClassList$messageChannelSuffix',\n        pigeonChannelCodec,\n        binaryMessenger: binaryMessenger,\n      );\n      if (api == null) {\n        pigeonVar_channel.setMessageHandler(null);\n      } else {\n        pigeonVar_channel.setMessageHandler((Object? message) async {\n          assert(\n            message != null,\n            'Argument for dev.flutter.pigeon.pigeon_integration_tests.FlutterIntegrationCoreApi.echoNullableClassList was null.',\n          );\n          final List<Object?> args = (message as List<Object?>?)!;\n          final List<AllNullableTypes?>? arg_classList =\n              (args[0] as List<Object?>?)?.cast<AllNullableTypes?>();\n          try {\n            final List<AllNullableTypes?>? output = api.echoNullableClassList(\n              arg_classList,\n            );\n            return wrapResponse(result: output);\n          } on PlatformException catch (e) {\n            return wrapResponse(error: e);\n          } catch (e) {\n            return wrapResponse(\n              error: PlatformException(code: 'error', message: e.toString()),\n            );\n          }\n        });\n      }\n    }\n    {\n      final pigeonVar_channel = BasicMessageChannel<Object?>(\n        'dev.flutter.pigeon.pigeon_integration_tests.FlutterIntegrationCoreApi.echoNullableNonNullEnumList$messageChannelSuffix',\n        pigeonChannelCodec,\n        binaryMessenger: binaryMessenger,\n      );\n      if (api == null) {\n        pigeonVar_channel.setMessageHandler(null);\n      } else {\n        pigeonVar_channel.setMessageHandler((Object? message) async {\n          assert(\n            message != null,\n            'Argument for dev.flutter.pigeon.pigeon_integration_tests.FlutterIntegrationCoreApi.echoNullableNonNullEnumList was null.',\n          );\n          final List<Object?> args = (message as List<Object?>?)!;\n          final List<AnEnum>? arg_enumList = (args[0] as List<Object?>?)\n              ?.cast<AnEnum>();\n          try {\n            final List<AnEnum>? output = api.echoNullableNonNullEnumList(\n              arg_enumList,\n            );\n            return wrapResponse(result: output);\n          } on PlatformException catch (e) {\n            return wrapResponse(error: e);\n          } catch (e) {\n            return wrapResponse(\n              error: PlatformException(code: 'error', message: e.toString()),\n            );\n          }\n        });\n      }\n    }\n    {\n      final pigeonVar_channel = BasicMessageChannel<Object?>(\n        'dev.flutter.pigeon.pigeon_integration_tests.FlutterIntegrationCoreApi.echoNullableNonNullClassList$messageChannelSuffix',\n        pigeonChannelCodec,\n        binaryMessenger: binaryMessenger,\n      );\n      if (api == null) {\n        pigeonVar_channel.setMessageHandler(null);\n      } else {\n        pigeonVar_channel.setMessageHandler((Object? message) async {\n          assert(\n            message != null,\n            'Argument for dev.flutter.pigeon.pigeon_integration_tests.FlutterIntegrationCoreApi.echoNullableNonNullClassList was null.',\n          );\n          final List<Object?> args = (message as List<Object?>?)!;\n          final List<AllNullableTypes>? arg_classList =\n              (args[0] as List<Object?>?)?.cast<AllNullableTypes>();\n          try {\n            final List<AllNullableTypes>? output = api\n                .echoNullableNonNullClassList(arg_classList);\n            return wrapResponse(result: output);\n          } on PlatformException catch (e) {\n            return wrapResponse(error: e);\n          } catch (e) {\n            return wrapResponse(\n              error: PlatformException(code: 'error', message: e.toString()),\n            );\n          }\n        });\n      }\n    }\n    {\n      final pigeonVar_channel = BasicMessageChannel<Object?>(\n        'dev.flutter.pigeon.pigeon_integration_tests.FlutterIntegrationCoreApi.echoNullableMap$messageChannelSuffix',\n        pigeonChannelCodec,\n        binaryMessenger: binaryMessenger,\n      );\n      if (api == null) {\n        pigeonVar_channel.setMessageHandler(null);\n      } else {\n        pigeonVar_channel.setMessageHandler((Object? message) async {\n          assert(\n            message != null,\n            'Argument for dev.flutter.pigeon.pigeon_integration_tests.FlutterIntegrationCoreApi.echoNullableMap was null.',\n          );\n          final List<Object?> args = (message as List<Object?>?)!;\n          final Map<Object?, Object?>? arg_map =\n              (args[0] as Map<Object?, Object?>?)?.cast<Object?, Object?>();\n          try {\n            final Map<Object?, Object?>? output = api.echoNullableMap(arg_map);\n            return wrapResponse(result: output);\n          } on PlatformException catch (e) {\n            return wrapResponse(error: e);\n          } catch (e) {\n            return wrapResponse(\n              error: PlatformException(code: 'error', message: e.toString()),\n            );\n          }\n        });\n      }\n    }\n    {\n      final pigeonVar_channel = BasicMessageChannel<Object?>(\n        'dev.flutter.pigeon.pigeon_integration_tests.FlutterIntegrationCoreApi.echoNullableStringMap$messageChannelSuffix',\n        pigeonChannelCodec,\n        binaryMessenger: binaryMessenger,\n      );\n      if (api == null) {\n        pigeonVar_channel.setMessageHandler(null);\n      } else {\n        pigeonVar_channel.setMessageHandler((Object? message) async {\n          assert(\n            message != null,\n            'Argument for dev.flutter.pigeon.pigeon_integration_tests.FlutterIntegrationCoreApi.echoNullableStringMap was null.',\n          );\n          final List<Object?> args = (message as List<Object?>?)!;\n          final Map<String?, String?>? arg_stringMap =\n              (args[0] as Map<Object?, Object?>?)?.cast<String?, String?>();\n          try {\n            final Map<String?, String?>? output = api.echoNullableStringMap(\n              arg_stringMap,\n            );\n            return wrapResponse(result: output);\n          } on PlatformException catch (e) {\n            return wrapResponse(error: e);\n          } catch (e) {\n            return wrapResponse(\n              error: PlatformException(code: 'error', message: e.toString()),\n            );\n          }\n        });\n      }\n    }\n    {\n      final pigeonVar_channel = BasicMessageChannel<Object?>(\n        'dev.flutter.pigeon.pigeon_integration_tests.FlutterIntegrationCoreApi.echoNullableIntMap$messageChannelSuffix',\n        pigeonChannelCodec,\n        binaryMessenger: binaryMessenger,\n      );\n      if (api == null) {\n        pigeonVar_channel.setMessageHandler(null);\n      } else {\n        pigeonVar_channel.setMessageHandler((Object? message) async {\n          assert(\n            message != null,\n            'Argument for dev.flutter.pigeon.pigeon_integration_tests.FlutterIntegrationCoreApi.echoNullableIntMap was null.',\n          );\n          final List<Object?> args = (message as List<Object?>?)!;\n          final Map<int?, int?>? arg_intMap =\n              (args[0] as Map<Object?, Object?>?)?.cast<int?, int?>();\n          try {\n            final Map<int?, int?>? output = api.echoNullableIntMap(arg_intMap);\n            return wrapResponse(result: output);\n          } on PlatformException catch (e) {\n            return wrapResponse(error: e);\n          } catch (e) {\n            return wrapResponse(\n              error: PlatformException(code: 'error', message: e.toString()),\n            );\n          }\n        });\n      }\n    }\n    {\n      final pigeonVar_channel = BasicMessageChannel<Object?>(\n        'dev.flutter.pigeon.pigeon_integration_tests.FlutterIntegrationCoreApi.echoNullableEnumMap$messageChannelSuffix',\n        pigeonChannelCodec,\n        binaryMessenger: binaryMessenger,\n      );\n      if (api == null) {\n        pigeonVar_channel.setMessageHandler(null);\n      } else {\n        pigeonVar_channel.setMessageHandler((Object? message) async {\n          assert(\n            message != null,\n            'Argument for dev.flutter.pigeon.pigeon_integration_tests.FlutterIntegrationCoreApi.echoNullableEnumMap was null.',\n          );\n          final List<Object?> args = (message as List<Object?>?)!;\n          final Map<AnEnum?, AnEnum?>? arg_enumMap =\n              (args[0] as Map<Object?, Object?>?)?.cast<AnEnum?, AnEnum?>();\n          try {\n            final Map<AnEnum?, AnEnum?>? output = api.echoNullableEnumMap(\n              arg_enumMap,\n            );\n            return wrapResponse(result: output);\n          } on PlatformException catch (e) {\n            return wrapResponse(error: e);\n          } catch (e) {\n            return wrapResponse(\n              error: PlatformException(code: 'error', message: e.toString()),\n            );\n          }\n        });\n      }\n    }\n    {\n      final pigeonVar_channel = BasicMessageChannel<Object?>(\n        'dev.flutter.pigeon.pigeon_integration_tests.FlutterIntegrationCoreApi.echoNullableClassMap$messageChannelSuffix',\n        pigeonChannelCodec,\n        binaryMessenger: binaryMessenger,\n      );\n      if (api == null) {\n        pigeonVar_channel.setMessageHandler(null);\n      } else {\n        pigeonVar_channel.setMessageHandler((Object? message) async {\n          assert(\n            message != null,\n            'Argument for dev.flutter.pigeon.pigeon_integration_tests.FlutterIntegrationCoreApi.echoNullableClassMap was null.',\n          );\n          final List<Object?> args = (message as List<Object?>?)!;\n          final Map<int?, AllNullableTypes?>? arg_classMap =\n              (args[0] as Map<Object?, Object?>?)\n                  ?.cast<int?, AllNullableTypes?>();\n          try {\n            final Map<int?, AllNullableTypes?>? output = api\n                .echoNullableClassMap(arg_classMap);\n            return wrapResponse(result: output);\n          } on PlatformException catch (e) {\n            return wrapResponse(error: e);\n          } catch (e) {\n            return wrapResponse(\n              error: PlatformException(code: 'error', message: e.toString()),\n            );\n          }\n        });\n      }\n    }\n    {\n      final pigeonVar_channel = BasicMessageChannel<Object?>(\n        'dev.flutter.pigeon.pigeon_integration_tests.FlutterIntegrationCoreApi.echoNullableNonNullStringMap$messageChannelSuffix',\n        pigeonChannelCodec,\n        binaryMessenger: binaryMessenger,\n      );\n      if (api == null) {\n        pigeonVar_channel.setMessageHandler(null);\n      } else {\n        pigeonVar_channel.setMessageHandler((Object? message) async {\n          assert(\n            message != null,\n            'Argument for dev.flutter.pigeon.pigeon_integration_tests.FlutterIntegrationCoreApi.echoNullableNonNullStringMap was null.',\n          );\n          final List<Object?> args = (message as List<Object?>?)!;\n          final Map<String, String>? arg_stringMap =\n              (args[0] as Map<Object?, Object?>?)?.cast<String, String>();\n          try {\n            final Map<String, String>? output = api\n                .echoNullableNonNullStringMap(arg_stringMap);\n            return wrapResponse(result: output);\n          } on PlatformException catch (e) {\n            return wrapResponse(error: e);\n          } catch (e) {\n            return wrapResponse(\n              error: PlatformException(code: 'error', message: e.toString()),\n            );\n          }\n        });\n      }\n    }\n    {\n      final pigeonVar_channel = BasicMessageChannel<Object?>(\n        'dev.flutter.pigeon.pigeon_integration_tests.FlutterIntegrationCoreApi.echoNullableNonNullIntMap$messageChannelSuffix',\n        pigeonChannelCodec,\n        binaryMessenger: binaryMessenger,\n      );\n      if (api == null) {\n        pigeonVar_channel.setMessageHandler(null);\n      } else {\n        pigeonVar_channel.setMessageHandler((Object? message) async {\n          assert(\n            message != null,\n            'Argument for dev.flutter.pigeon.pigeon_integration_tests.FlutterIntegrationCoreApi.echoNullableNonNullIntMap was null.',\n          );\n          final List<Object?> args = (message as List<Object?>?)!;\n          final Map<int, int>? arg_intMap = (args[0] as Map<Object?, Object?>?)\n              ?.cast<int, int>();\n          try {\n            final Map<int, int>? output = api.echoNullableNonNullIntMap(\n              arg_intMap,\n            );\n            return wrapResponse(result: output);\n          } on PlatformException catch (e) {\n            return wrapResponse(error: e);\n          } catch (e) {\n            return wrapResponse(\n              error: PlatformException(code: 'error', message: e.toString()),\n            );\n          }\n        });\n      }\n    }\n    {\n      final pigeonVar_channel = BasicMessageChannel<Object?>(\n        'dev.flutter.pigeon.pigeon_integration_tests.FlutterIntegrationCoreApi.echoNullableNonNullEnumMap$messageChannelSuffix',\n        pigeonChannelCodec,\n        binaryMessenger: binaryMessenger,\n      );\n      if (api == null) {\n        pigeonVar_channel.setMessageHandler(null);\n      } else {\n        pigeonVar_channel.setMessageHandler((Object? message) async {\n          assert(\n            message != null,\n            'Argument for dev.flutter.pigeon.pigeon_integration_tests.FlutterIntegrationCoreApi.echoNullableNonNullEnumMap was null.',\n          );\n          final List<Object?> args = (message as List<Object?>?)!;\n          final Map<AnEnum, AnEnum>? arg_enumMap =\n              (args[0] as Map<Object?, Object?>?)?.cast<AnEnum, AnEnum>();\n          try {\n            final Map<AnEnum, AnEnum>? output = api.echoNullableNonNullEnumMap(\n              arg_enumMap,\n            );\n            return wrapResponse(result: output);\n          } on PlatformException catch (e) {\n            return wrapResponse(error: e);\n          } catch (e) {\n            return wrapResponse(\n              error: PlatformException(code: 'error', message: e.toString()),\n            );\n          }\n        });\n      }\n    }\n    {\n      final pigeonVar_channel = BasicMessageChannel<Object?>(\n        'dev.flutter.pigeon.pigeon_integration_tests.FlutterIntegrationCoreApi.echoNullableNonNullClassMap$messageChannelSuffix',\n        pigeonChannelCodec,\n        binaryMessenger: binaryMessenger,\n      );\n      if (api == null) {\n        pigeonVar_channel.setMessageHandler(null);\n      } else {\n        pigeonVar_channel.setMessageHandler((Object? message) async {\n          assert(\n            message != null,\n            'Argument for dev.flutter.pigeon.pigeon_integration_tests.FlutterIntegrationCoreApi.echoNullableNonNullClassMap was null.',\n          );\n          final List<Object?> args = (message as List<Object?>?)!;\n          final Map<int, AllNullableTypes>? arg_classMap =\n              (args[0] as Map<Object?, Object?>?)\n                  ?.cast<int, AllNullableTypes>();\n          try {\n            final Map<int, AllNullableTypes>? output = api\n                .echoNullableNonNullClassMap(arg_classMap);\n            return wrapResponse(result: output);\n          } on PlatformException catch (e) {\n            return wrapResponse(error: e);\n          } catch (e) {\n            return wrapResponse(\n              error: PlatformException(code: 'error', message: e.toString()),\n            );\n          }\n        });\n      }\n    }\n    {\n      final pigeonVar_channel = BasicMessageChannel<Object?>(\n        'dev.flutter.pigeon.pigeon_integration_tests.FlutterIntegrationCoreApi.echoNullableEnum$messageChannelSuffix',\n        pigeonChannelCodec,\n        binaryMessenger: binaryMessenger,\n      );\n      if (api == null) {\n        pigeonVar_channel.setMessageHandler(null);\n      } else {\n        pigeonVar_channel.setMessageHandler((Object? message) async {\n          assert(\n            message != null,\n            'Argument for dev.flutter.pigeon.pigeon_integration_tests.FlutterIntegrationCoreApi.echoNullableEnum was null.',\n          );\n          final List<Object?> args = (message as List<Object?>?)!;\n          final AnEnum? arg_anEnum = (args[0] as AnEnum?);\n          try {\n            final AnEnum? output = api.echoNullableEnum(arg_anEnum);\n            return wrapResponse(result: output);\n          } on PlatformException catch (e) {\n            return wrapResponse(error: e);\n          } catch (e) {\n            return wrapResponse(\n              error: PlatformException(code: 'error', message: e.toString()),\n            );\n          }\n        });\n      }\n    }\n    {\n      final pigeonVar_channel = BasicMessageChannel<Object?>(\n        'dev.flutter.pigeon.pigeon_integration_tests.FlutterIntegrationCoreApi.echoAnotherNullableEnum$messageChannelSuffix',\n        pigeonChannelCodec,\n        binaryMessenger: binaryMessenger,\n      );\n      if (api == null) {\n        pigeonVar_channel.setMessageHandler(null);\n      } else {\n        pigeonVar_channel.setMessageHandler((Object? message) async {\n          assert(\n            message != null,\n            'Argument for dev.flutter.pigeon.pigeon_integration_tests.FlutterIntegrationCoreApi.echoAnotherNullableEnum was null.',\n          );\n          final List<Object?> args = (message as List<Object?>?)!;\n          final AnotherEnum? arg_anotherEnum = (args[0] as AnotherEnum?);\n          try {\n            final AnotherEnum? output = api.echoAnotherNullableEnum(\n              arg_anotherEnum,\n            );\n            return wrapResponse(result: output);\n          } on PlatformException catch (e) {\n            return wrapResponse(error: e);\n          } catch (e) {\n            return wrapResponse(\n              error: PlatformException(code: 'error', message: e.toString()),\n            );\n          }\n        });\n      }\n    }\n    {\n      final pigeonVar_channel = BasicMessageChannel<Object?>(\n        'dev.flutter.pigeon.pigeon_integration_tests.FlutterIntegrationCoreApi.noopAsync$messageChannelSuffix',\n        pigeonChannelCodec,\n        binaryMessenger: binaryMessenger,\n      );\n      if (api == null) {\n        pigeonVar_channel.setMessageHandler(null);\n      } else {\n        pigeonVar_channel.setMessageHandler((Object? message) async {\n          try {\n            await api.noopAsync();\n            return wrapResponse(empty: true);\n          } on PlatformException catch (e) {\n            return wrapResponse(error: e);\n          } catch (e) {\n            return wrapResponse(\n              error: PlatformException(code: 'error', message: e.toString()),\n            );\n          }\n        });\n      }\n    }\n    {\n      final pigeonVar_channel = BasicMessageChannel<Object?>(\n        'dev.flutter.pigeon.pigeon_integration_tests.FlutterIntegrationCoreApi.echoAsyncString$messageChannelSuffix',\n        pigeonChannelCodec,\n        binaryMessenger: binaryMessenger,\n      );\n      if (api == null) {\n        pigeonVar_channel.setMessageHandler(null);\n      } else {\n        pigeonVar_channel.setMessageHandler((Object? message) async {\n          assert(\n            message != null,\n            'Argument for dev.flutter.pigeon.pigeon_integration_tests.FlutterIntegrationCoreApi.echoAsyncString was null.',\n          );\n          final List<Object?> args = (message as List<Object?>?)!;\n          final String? arg_aString = (args[0] as String?);\n          assert(\n            arg_aString != null,\n            'Argument for dev.flutter.pigeon.pigeon_integration_tests.FlutterIntegrationCoreApi.echoAsyncString was null, expected non-null String.',\n          );\n          try {\n            final String output = await api.echoAsyncString(arg_aString!);\n            return wrapResponse(result: output);\n          } on PlatformException catch (e) {\n            return wrapResponse(error: e);\n          } catch (e) {\n            return wrapResponse(\n              error: PlatformException(code: 'error', message: e.toString()),\n            );\n          }\n        });\n      }\n    }\n  }\n}\n\n/// An API that can be implemented for minimal, compile-only tests.\nclass HostTrivialApi {\n  /// Constructor for [HostTrivialApi].  The [binaryMessenger] named argument is\n  /// available for dependency injection.  If it is left null, the default\n  /// BinaryMessenger will be used which routes to the host platform.\n  HostTrivialApi({\n    BinaryMessenger? binaryMessenger,\n    String messageChannelSuffix = '',\n  }) : pigeonVar_binaryMessenger = binaryMessenger,\n       pigeonVar_messageChannelSuffix = messageChannelSuffix.isNotEmpty\n           ? '.$messageChannelSuffix'\n           : '';\n  final BinaryMessenger? pigeonVar_binaryMessenger;\n\n  static const MessageCodec<Object?> pigeonChannelCodec = _PigeonCodec();\n\n  final String pigeonVar_messageChannelSuffix;\n\n  Future<void> noop() async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostTrivialApi.noop$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(null);\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else {\n      return;\n    }\n  }\n}\n\n/// A simple API implemented in some unit tests.\nclass HostSmallApi {\n  /// Constructor for [HostSmallApi].  The [binaryMessenger] named argument is\n  /// available for dependency injection.  If it is left null, the default\n  /// BinaryMessenger will be used which routes to the host platform.\n  HostSmallApi({\n    BinaryMessenger? binaryMessenger,\n    String messageChannelSuffix = '',\n  }) : pigeonVar_binaryMessenger = binaryMessenger,\n       pigeonVar_messageChannelSuffix = messageChannelSuffix.isNotEmpty\n           ? '.$messageChannelSuffix'\n           : '';\n  final BinaryMessenger? pigeonVar_binaryMessenger;\n\n  static const MessageCodec<Object?> pigeonChannelCodec = _PigeonCodec();\n\n  final String pigeonVar_messageChannelSuffix;\n\n  Future<String> echo(String aString) async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostSmallApi.echo$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(\n      <Object?>[aString],\n    );\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else if (pigeonVar_replyList[0] == null) {\n      throw PlatformException(\n        code: 'null-error',\n        message: 'Host platform returned null value for non-null return value.',\n      );\n    } else {\n      return (pigeonVar_replyList[0] as String?)!;\n    }\n  }\n\n  Future<void> voidVoid() async {\n    final pigeonVar_channelName =\n        'dev.flutter.pigeon.pigeon_integration_tests.HostSmallApi.voidVoid$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(null);\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else {\n      return;\n    }\n  }\n}\n\n/// A simple API called in some unit tests.\nabstract class FlutterSmallApi {\n  static const MessageCodec<Object?> pigeonChannelCodec = _PigeonCodec();\n\n  TestMessage echoWrappedList(TestMessage msg);\n\n  String echoString(String aString);\n\n  static void setUp(\n    FlutterSmallApi? api, {\n    BinaryMessenger? binaryMessenger,\n    String messageChannelSuffix = '',\n  }) {\n    messageChannelSuffix = messageChannelSuffix.isNotEmpty\n        ? '.$messageChannelSuffix'\n        : '';\n    {\n      final pigeonVar_channel = BasicMessageChannel<Object?>(\n        'dev.flutter.pigeon.pigeon_integration_tests.FlutterSmallApi.echoWrappedList$messageChannelSuffix',\n        pigeonChannelCodec,\n        binaryMessenger: binaryMessenger,\n      );\n      if (api == null) {\n        pigeonVar_channel.setMessageHandler(null);\n      } else {\n        pigeonVar_channel.setMessageHandler((Object? message) async {\n          assert(\n            message != null,\n            'Argument for dev.flutter.pigeon.pigeon_integration_tests.FlutterSmallApi.echoWrappedList was null.',\n          );\n          final List<Object?> args = (message as List<Object?>?)!;\n          final TestMessage? arg_msg = (args[0] as TestMessage?);\n          assert(\n            arg_msg != null,\n            'Argument for dev.flutter.pigeon.pigeon_integration_tests.FlutterSmallApi.echoWrappedList was null, expected non-null TestMessage.',\n          );\n          try {\n            final TestMessage output = api.echoWrappedList(arg_msg!);\n            return wrapResponse(result: output);\n          } on PlatformException catch (e) {\n            return wrapResponse(error: e);\n          } catch (e) {\n            return wrapResponse(\n              error: PlatformException(code: 'error', message: e.toString()),\n            );\n          }\n        });\n      }\n    }\n    {\n      final pigeonVar_channel = BasicMessageChannel<Object?>(\n        'dev.flutter.pigeon.pigeon_integration_tests.FlutterSmallApi.echoString$messageChannelSuffix',\n        pigeonChannelCodec,\n        binaryMessenger: binaryMessenger,\n      );\n      if (api == null) {\n        pigeonVar_channel.setMessageHandler(null);\n      } else {\n        pigeonVar_channel.setMessageHandler((Object? message) async {\n          assert(\n            message != null,\n            'Argument for dev.flutter.pigeon.pigeon_integration_tests.FlutterSmallApi.echoString was null.',\n          );\n          final List<Object?> args = (message as List<Object?>?)!;\n          final String? arg_aString = (args[0] as String?);\n          assert(\n            arg_aString != null,\n            'Argument for dev.flutter.pigeon.pigeon_integration_tests.FlutterSmallApi.echoString was null, expected non-null String.',\n          );\n          try {\n            final String output = api.echoString(arg_aString!);\n            return wrapResponse(result: output);\n          } on PlatformException catch (e) {\n            return wrapResponse(error: e);\n          } catch (e) {\n            return wrapResponse(\n              error: PlatformException(code: 'error', message: e.toString()),\n            );\n          }\n        });\n      }\n    }\n  }\n}\n"}},"clientRequestTime":1771003781798}}
+{"time":1771003781821,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","id":4,"method":"textDocument/documentColor","params":{"textDocument":{"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"}},"clientRequestTime":1771003781802}}
+{"time":1771003781821,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","id":5,"method":"textDocument/codeAction","params":{"textDocument":{"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"range":{"start":{"line":0,"character":0},"end":{"line":0,"character":0}},"context":{"diagnostics":[],"triggerKind":2}},"clientRequestTime":1771003781803}}
+{"time":1771003781821,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","id":6,"method":"textDocument/documentSymbol","params":{"textDocument":{"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"}},"clientRequestTime":1771003781809}}
+{"time":1771003781821,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","id":7,"method":"textDocument/semanticTokens/full","params":{"textDocument":{"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"}},"clientRequestTime":1771003781810}}
 {"time":1771003781844,"kind":"message","sender":"server","receiver":"ide","message":{"id":6,"jsonrpc":"2.0","method":"window/workDoneProgress/create","params":{"token":"ANALYZING"}}}
-{"time":1771003782098,"kind":"message","sender":"server","receiver":"ide","message":{"jsonrpc":"2.0","method":"dart/textDocument/publishClosingLabels","params":{"labels":[],"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"}}}
-{"time":1771003782130,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","id":8,"method":"textDocument/documentLink","params":{"textDocument":{"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"}},"clientRequestTime":1771003781841}}
+{"time":1771003782098,"kind":"message","sender":"server","receiver":"ide","message":{"jsonrpc":"2.0","method":"dart/textDocument/publishClosingLabels","params":{"labels":[],"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"}}}
+{"time":1771003782130,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","id":8,"method":"textDocument/documentLink","params":{"textDocument":{"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"}},"clientRequestTime":1771003781841}}
 {"time":1771003782130,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","method":"$/cancelRequest","params":{"id":6},"clientRequestTime":1771003782028}}
-{"time":1771003782130,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","id":9,"method":"textDocument/documentSymbol","params":{"textDocument":{"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"}},"clientRequestTime":1771003782028}}
-{"time":1771003782130,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","id":10,"method":"textDocument/foldingRange","params":{"textDocument":{"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"}},"clientRequestTime":1771003782050}}
+{"time":1771003782130,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","id":9,"method":"textDocument/documentSymbol","params":{"textDocument":{"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"}},"clientRequestTime":1771003782028}}
+{"time":1771003782130,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","id":10,"method":"textDocument/foldingRange","params":{"textDocument":{"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"}},"clientRequestTime":1771003782050}}
 {"time":1771003782130,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","method":"$/cancelRequest","params":{"id":5},"clientRequestTime":1771003782056}}
-{"time":1771003782130,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","id":11,"method":"textDocument/documentSymbol","params":{"textDocument":{"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"}},"clientRequestTime":1771003782103}}
+{"time":1771003782130,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","id":11,"method":"textDocument/documentSymbol","params":{"textDocument":{"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"}},"clientRequestTime":1771003782103}}
 {"time":1771003782130,"kind":"message","sender":"server","receiver":"ide","message":{"id":4,"jsonrpc":"2.0","result":[]}}
 {"time":1771003782130,"kind":"message","sender":"server","receiver":"ide","message":{"id":6,"jsonrpc":"2.0","error":{"code":-32800,"message":"Request was cancelled"}}}
 {"time":1771003782130,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","id":6,"result":null,"clientRequestTime":1771003782130}}
@@ -24,15 +24,15 @@
 {"time":1771003782169,"kind":"message","sender":"server","receiver":"ide","message":{"id":8,"jsonrpc":"2.0","result":[]}}
 {"time":1771003782171,"kind":"message","sender":"server","receiver":"ide","message":{"jsonrpc":"2.0","method":"$/progress","params":{"token":"ANALYZING","value":{"kind":"end"}}}}
 {"time":1771003782181,"kind":"message","sender":"server","receiver":"ide","message":{"id":5,"jsonrpc":"2.0","error":{"code":-32800,"message":"Request was cancelled"}}}
-{"time":1771003782341,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","id":12,"method":"textDocument/inlayHint","params":{"textDocument":{"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"range":{"start":{"line":7317,"character":0},"end":{"line":7397,"character":0}}},"clientRequestTime":1771003782341}}
-{"time":1771003782371,"kind":"message","sender":"server","receiver":"ide","message":{"id":12,"jsonrpc":"2.0","result":[{"kind":1,"label":[{"value":"<"},{"value":"dynamic"},{"value":">"}],"position":{"character":15,"line":36}},{"kind":1,"label":[{"value":"<"},{"value":"dynamic"},{"value":">"}],"position":{"character":28,"line":36}},{"kind":2,"label":[{"value":"test:"}],"paddingRight":true,"position":{"character":10,"line":39}},{"kind":2,"label":[{"location":{"range":{"end":{"character":26,"line":35},"start":{"character":25,"line":35}},"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"a:"}],"paddingRight":true,"position":{"character":47,"line":39}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":35},"start":{"character":36,"line":35}},"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"b:"}],"paddingRight":true,"position":{"character":56,"line":39}},{"kind":1,"label":[{"value":"<"},{"value":"dynamic"},{"value":", "},{"value":"dynamic"},{"value":">"}],"position":{"character":14,"line":42}},{"kind":1,"label":[{"value":"<"},{"value":"dynamic"},{"value":", "},{"value":"dynamic"},{"value":">"}],"position":{"character":26,"line":42}},{"kind":2,"label":[{"value":"test:"}],"paddingRight":true,"position":{"character":10,"line":45}},{"kind":2,"label":[{"location":{"range":{"end":{"character":30,"line":260},"start":{"character":27,"line":260}},"uri":"{{context-0:package-root:sky_engine}}lib/core/map.dart"},"value":"key:"}],"paddingRight":true,"position":{"character":55,"line":46}},{"kind":2,"label":[{"location":{"range":{"end":{"character":26,"line":35},"start":{"character":25,"line":35}},"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"a:"}],"paddingRight":true,"position":{"character":26,"line":47}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":35},"start":{"character":36,"line":35}},"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"b:"}],"paddingRight":true,"position":{"character":39,"line":47}},{"kind":2,"label":[{"location":{"range":{"end":{"character":33,"line":66},"start":{"character":32,"line":66}},"uri":"{{context-0:package-root:sky_engine}}lib/core/identical.dart"},"value":"a:"}],"paddingRight":true,"position":{"character":18,"line":81}},{"kind":2,"label":[{"location":{"range":{"end":{"character":44,"line":66},"start":{"character":43,"line":66}},"uri":"{{context-0:package-root:sky_engine}}lib/core/identical.dart"},"value":"b:"}],"paddingRight":true,"position":{"character":24,"line":81}},{"kind":2,"label":[{"location":{"range":{"end":{"character":26,"line":35},"start":{"character":25,"line":35}},"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"a:"}],"paddingRight":true,"position":{"character":23,"line":84}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":35},"start":{"character":36,"line":35}},"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"b:"}],"paddingRight":true,"position":{"character":33,"line":84}},{"kind":2,"label":[{"location":{"range":{"end":{"character":46,"line":545},"start":{"character":39,"line":545}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"objects:"}],"paddingRight":true,"position":{"character":37,"line":89}},{"kind":2,"label":[{"location":{"range":{"end":{"character":33,"line":66},"start":{"character":32,"line":66}},"uri":"{{context-0:package-root:sky_engine}}lib/core/identical.dart"},"value":"a:"}],"paddingRight":true,"position":{"character":18,"line":260}},{"kind":2,"label":[{"location":{"range":{"end":{"character":44,"line":66},"start":{"character":43,"line":66}},"uri":"{{context-0:package-root:sky_engine}}lib/core/identical.dart"},"value":"b:"}],"paddingRight":true,"position":{"character":24,"line":260}},{"kind":2,"label":[{"location":{"range":{"end":{"character":26,"line":35},"start":{"character":25,"line":35}},"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"a:"}],"paddingRight":true,"position":{"character":23,"line":263}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":35},"start":{"character":36,"line":35}},"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"b:"}],"paddingRight":true,"position":{"character":33,"line":263}},{"kind":2,"label":[{"location":{"range":{"end":{"character":46,"line":545},"start":{"character":39,"line":545}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"objects:"}],"paddingRight":true,"position":{"character":37,"line":268}},{"kind":2,"label":[{"location":{"range":{"end":{"character":33,"line":66},"start":{"character":32,"line":66}},"uri":"{{context-0:package-root:sky_engine}}lib/core/identical.dart"},"value":"a:"}],"paddingRight":true,"position":{"character":18,"line":458}},{"kind":2,"label":[{"location":{"range":{"end":{"character":44,"line":66},"start":{"character":43,"line":66}},"uri":"{{context-0:package-root:sky_engine}}lib/core/identical.dart"},"value":"b:"}],"paddingRight":true,"position":{"character":24,"line":458}},{"kind":2,"label":[{"location":{"range":{"end":{"character":26,"line":35},"start":{"character":25,"line":35}},"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"a:"}],"paddingRight":true,"position":{"character":23,"line":461}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":35},"start":{"character":36,"line":35}},"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"b:"}],"paddingRight":true,"position":{"character":33,"line":461}},{"kind":2,"label":[{"location":{"range":{"end":{"character":46,"line":545},"start":{"character":39,"line":545}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"objects:"}],"paddingRight":true,"position":{"character":37,"line":466}},{"kind":2,"label":[{"location":{"range":{"end":{"character":33,"line":66},"start":{"character":32,"line":66}},"uri":"{{context-0:package-root:sky_engine}}lib/core/identical.dart"},"value":"a:"}],"paddingRight":true,"position":{"character":18,"line":642}},{"kind":2,"label":[{"location":{"range":{"end":{"character":44,"line":66},"start":{"character":43,"line":66}},"uri":"{{context-0:package-root:sky_engine}}lib/core/identical.dart"},"value":"b:"}],"paddingRight":true,"position":{"character":24,"line":642}},{"kind":2,"label":[{"location":{"range":{"end":{"character":26,"line":35},"start":{"character":25,"line":35}},"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"a:"}],"paddingRight":true,"position":{"character":23,"line":645}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":35},"start":{"character":36,"line":35}},"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"b:"}],"paddingRight":true,"position":{"character":33,"line":645}},{"kind":2,"label":[{"location":{"range":{"end":{"character":46,"line":545},"start":{"character":39,"line":545}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"objects:"}],"paddingRight":true,"position":{"character":37,"line":650}},{"kind":2,"label":[{"location":{"range":{"end":{"character":33,"line":66},"start":{"character":32,"line":66}},"uri":"{{context-0:package-root:sky_engine}}lib/core/identical.dart"},"value":"a:"}],"paddingRight":true,"position":{"character":18,"line":721}},{"kind":2,"label":[{"location":{"range":{"end":{"character":44,"line":66},"start":{"character":43,"line":66}},"uri":"{{context-0:package-root:sky_engine}}lib/core/identical.dart"},"value":"b:"}],"paddingRight":true,"position":{"character":24,"line":721}},{"kind":2,"label":[{"location":{"range":{"end":{"character":26,"line":35},"start":{"character":25,"line":35}},"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"a:"}],"paddingRight":true,"position":{"character":23,"line":724}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":35},"start":{"character":36,"line":35}},"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"b:"}],"paddingRight":true,"position":{"character":33,"line":724}},{"kind":2,"label":[{"location":{"range":{"end":{"character":46,"line":545},"start":{"character":39,"line":545}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"objects:"}],"paddingRight":true,"position":{"character":37,"line":729}},{"kind":2,"label":[{"location":{"range":{"end":{"character":33,"line":66},"start":{"character":32,"line":66}},"uri":"{{context-0:package-root:sky_engine}}lib/core/identical.dart"},"value":"a:"}],"paddingRight":true,"position":{"character":18,"line":757}},{"kind":2,"label":[{"location":{"range":{"end":{"character":44,"line":66},"start":{"character":43,"line":66}},"uri":"{{context-0:package-root:sky_engine}}lib/core/identical.dart"},"value":"b:"}],"paddingRight":true,"position":{"character":24,"line":757}},{"kind":2,"label":[{"location":{"range":{"end":{"character":26,"line":35},"start":{"character":25,"line":35}},"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"a:"}],"paddingRight":true,"position":{"character":23,"line":760}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":35},"start":{"character":36,"line":35}},"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"b:"}],"paddingRight":true,"position":{"character":33,"line":760}},{"kind":2,"label":[{"location":{"range":{"end":{"character":46,"line":545},"start":{"character":39,"line":545}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"objects:"}],"paddingRight":true,"position":{"character":37,"line":765}},{"kind":2,"label":[{"location":{"range":{"end":{"character":24,"line":73},"start":{"character":20,"line":73}},"uri":"{{context-0:package-root:flutter}}lib/src/foundation/serialization.dart"},"value":"byte:"}],"paddingRight":true,"position":{"character":22,"line":773}},{"kind":2,"label":[{"location":{"range":{"end":{"character":25,"line":100},"start":{"character":20,"line":100}},"uri":"{{context-0:package-root:flutter}}lib/src/foundation/serialization.dart"},"value":"value:"}],"paddingRight":true,"position":{"character":22,"line":774}},{"kind":2,"label":[{"location":{"range":{"end":{"character":24,"line":73},"start":{"character":20,"line":73}},"uri":"{{context-0:package-root:flutter}}lib/src/foundation/serialization.dart"},"value":"byte:"}],"paddingRight":true,"position":{"character":22,"line":776}},{"kind":2,"label":[{"location":{"range":{"end":{"character":36,"line":771},"start":{"character":30,"line":771}},"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"buffer:"}],"paddingRight":true,"position":{"character":17,"line":777}},{"kind":2,"label":[{"location":{"range":{"end":{"character":51,"line":771},"start":{"character":46,"line":771}},"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"value:"}],"paddingRight":true,"position":{"character":25,"line":777}},{"kind":2,"label":[{"location":{"range":{"end":{"character":24,"line":73},"start":{"character":20,"line":73}},"uri":"{{context-0:package-root:flutter}}lib/src/foundation/serialization.dart"},"value":"byte:"}],"paddingRight":true,"position":{"character":22,"line":779}},{"kind":2,"label":[{"location":{"range":{"end":{"character":36,"line":771},"start":{"character":30,"line":771}},"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"buffer:"}],"paddingRight":true,"position":{"character":17,"line":780}},{"kind":2,"label":[{"location":{"range":{"end":{"character":51,"line":771},"start":{"character":46,"line":771}},"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"value:"}],"paddingRight":true,"position":{"character":25,"line":780}},{"kind":2,"label":[{"location":{"range":{"end":{"character":24,"line":73},"start":{"character":20,"line":73}},"uri":"{{context-0:package-root:flutter}}lib/src/foundation/serialization.dart"},"value":"byte:"}],"paddingRight":true,"position":{"character":22,"line":782}},{"kind":2,"label":[{"location":{"range":{"end":{"character":36,"line":771},"start":{"character":30,"line":771}},"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"buffer:"}],"paddingRight":true,"position":{"character":17,"line":783}},{"kind":2,"label":[{"location":{"range":{"end":{"character":51,"line":771},"start":{"character":46,"line":771}},"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"value:"}],"paddingRight":true,"position":{"character":25,"line":783}},{"kind":2,"label":[{"location":{"range":{"end":{"character":24,"line":73},"start":{"character":20,"line":73}},"uri":"{{context-0:package-root:flutter}}lib/src/foundation/serialization.dart"},"value":"byte:"}],"paddingRight":true,"position":{"character":22,"line":785}},{"kind":2,"label":[{"location":{"range":{"end":{"character":36,"line":771},"start":{"character":30,"line":771}},"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"buffer:"}],"paddingRight":true,"position":{"character":17,"line":786}},{"kind":2,"label":[{"location":{"range":{"end":{"character":51,"line":771},"start":{"character":46,"line":771}},"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"value:"}],"paddingRight":true,"position":{"character":25,"line":786}},{"kind":2,"label":[{"location":{"range":{"end":{"character":24,"line":73},"start":{"character":20,"line":73}},"uri":"{{context-0:package-root:flutter}}lib/src/foundation/serialization.dart"},"value":"byte:"}],"paddingRight":true,"position":{"character":22,"line":788}},{"kind":2,"label":[{"location":{"range":{"end":{"character":36,"line":771},"start":{"character":30,"line":771}},"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"buffer:"}],"paddingRight":true,"position":{"character":17,"line":789}},{"kind":2,"label":[{"location":{"range":{"end":{"character":51,"line":771},"start":{"character":46,"line":771}},"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"value:"}],"paddingRight":true,"position":{"character":25,"line":789}},{"kind":2,"label":[{"location":{"range":{"end":{"character":24,"line":73},"start":{"character":20,"line":73}},"uri":"{{context-0:package-root:flutter}}lib/src/foundation/serialization.dart"},"value":"byte:"}],"paddingRight":true,"position":{"character":22,"line":791}},{"kind":2,"label":[{"location":{"range":{"end":{"character":36,"line":771},"start":{"character":30,"line":771}},"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"buffer:"}],"paddingRight":true,"position":{"character":17,"line":792}},{"kind":2,"label":[{"location":{"range":{"end":{"character":51,"line":771},"start":{"character":46,"line":771}},"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"value:"}],"paddingRight":true,"position":{"character":25,"line":792}},{"kind":2,"label":[{"location":{"range":{"end":{"character":24,"line":73},"start":{"character":20,"line":73}},"uri":"{{context-0:package-root:flutter}}lib/src/foundation/serialization.dart"},"value":"byte:"}],"paddingRight":true,"position":{"character":22,"line":794}},{"kind":2,"label":[{"location":{"range":{"end":{"character":36,"line":771},"start":{"character":30,"line":771}},"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"buffer:"}],"paddingRight":true,"position":{"character":17,"line":795}},{"kind":2,"label":[{"location":{"range":{"end":{"character":51,"line":771},"start":{"character":46,"line":771}},"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"value:"}],"paddingRight":true,"position":{"character":25,"line":795}},{"kind":2,"label":[{"location":{"range":{"end":{"character":24,"line":73},"start":{"character":20,"line":73}},"uri":"{{context-0:package-root:flutter}}lib/src/foundation/serialization.dart"},"value":"byte:"}],"paddingRight":true,"position":{"character":22,"line":797}},{"kind":2,"label":[{"location":{"range":{"end":{"character":36,"line":771},"start":{"character":30,"line":771}},"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"buffer:"}],"paddingRight":true,"position":{"character":17,"line":798}},{"kind":2,"label":[{"location":{"range":{"end":{"character":51,"line":771},"start":{"character":46,"line":771}},"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"value:"}],"paddingRight":true,"position":{"character":25,"line":798}},{"kind":2,"label":[{"location":{"range":{"end":{"character":36,"line":382},"start":{"character":30,"line":382}},"uri":"{{context-0:package-root:flutter}}lib/src/services/message_codecs.dart"},"value":"buffer:"}],"paddingRight":true,"position":{"character":23,"line":800}},{"kind":2,"label":[{"location":{"range":{"end":{"character":51,"line":382},"start":{"character":46,"line":382}},"uri":"{{context-0:package-root:flutter}}lib/src/services/message_codecs.dart"},"value":"value:"}],"paddingRight":true,"position":{"character":31,"line":800}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":471},"start":{"character":31,"line":471}},"uri":"{{context-0:package-root:flutter}}lib/src/services/message_codecs.dart"},"value":"buffer:"}],"paddingRight":true,"position":{"character":32,"line":808}},{"kind":1,"label":[{"location":{"range":{"end":{"character":24,"line":27},"start":{"character":21,"line":27}},"uri":"{{context-0:package-root:sky_engine}}lib/core/int.dart"},"value":"int"},{"value":"?"}],"paddingRight":true,"position":{"character":14,"line":808}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":471},"start":{"character":31,"line":471}},"uri":"{{context-0:package-root:flutter}}lib/src/services/message_codecs.dart"},"value":"buffer:"}],"paddingRight":true,"position":{"character":32,"line":811}},{"kind":1,"label":[{"location":{"range":{"end":{"character":24,"line":27},"start":{"character":21,"line":27}},"uri":"{{context-0:package-root:sky_engine}}lib/core/int.dart"},"value":"int"},{"value":"?"}],"paddingRight":true,"position":{"character":14,"line":811}},{"kind":2,"label":[{"location":{"range":{"end":{"character":41,"line":70},"start":{"character":35,"line":70}},"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"result:"}],"paddingRight":true,"position":{"character":34,"line":814}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":471},"start":{"character":31,"line":471}},"uri":"{{context-0:package-root:flutter}}lib/src/services/message_codecs.dart"},"value":"buffer:"}],"paddingRight":true,"position":{"character":44,"line":814}},{"kind":2,"label":[{"location":{"range":{"end":{"character":38,"line":218},"start":{"character":32,"line":218}},"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"result:"}],"paddingRight":true,"position":{"character":31,"line":816}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":471},"start":{"character":31,"line":471}},"uri":"{{context-0:package-root:flutter}}lib/src/services/message_codecs.dart"},"value":"buffer:"}],"paddingRight":true,"position":{"character":41,"line":816}},{"kind":2,"label":[{"location":{"range":{"end":{"character":46,"line":409},"start":{"character":40,"line":409}},"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"result:"}],"paddingRight":true,"position":{"character":39,"line":818}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":471},"start":{"character":31,"line":471}},"uri":"{{context-0:package-root:flutter}}lib/src/services/message_codecs.dart"},"value":"buffer:"}],"paddingRight":true,"position":{"character":49,"line":818}},{"kind":2,"label":[{"location":{"range":{"end":{"character":62,"line":597},"start":{"character":56,"line":597}},"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"result:"}],"paddingRight":true,"position":{"character":55,"line":820}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":471},"start":{"character":31,"line":471}},"uri":"{{context-0:package-root:flutter}}lib/src/services/message_codecs.dart"},"value":"buffer:"}],"paddingRight":true,"position":{"character":65,"line":820}},{"kind":2,"label":[{"location":{"range":{"end":{"character":47,"line":699},"start":{"character":41,"line":699}},"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"result:"}],"paddingRight":true,"position":{"character":40,"line":822}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":471},"start":{"character":31,"line":471}},"uri":"{{context-0:package-root:flutter}}lib/src/services/message_codecs.dart"},"value":"buffer:"}],"paddingRight":true,"position":{"character":50,"line":822}},{"kind":2,"label":[{"location":{"range":{"end":{"character":41,"line":746},"start":{"character":35,"line":746}},"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"result:"}],"paddingRight":true,"position":{"character":34,"line":824}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":471},"start":{"character":31,"line":471}},"uri":"{{context-0:package-root:flutter}}lib/src/services/message_codecs.dart"},"value":"buffer:"}],"paddingRight":true,"position":{"character":44,"line":824}},{"kind":2,"label":[{"location":{"range":{"end":{"character":34,"line":484},"start":{"character":30,"line":484}},"uri":"{{context-0:package-root:flutter}}lib/src/services/message_codecs.dart"},"value":"type:"}],"paddingRight":true,"position":{"character":37,"line":826}},{"kind":2,"label":[{"location":{"range":{"end":{"character":53,"line":484},"start":{"character":47,"line":484}},"uri":"{{context-0:package-root:flutter}}lib/src/services/message_codecs.dart"},"value":"buffer:"}],"paddingRight":true,"position":{"character":43,"line":826}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":853}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":856}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":857}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":855}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":72,"line":860}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":861}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":863}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":877}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":880}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":881}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":879}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":885}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":887}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":889}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":908}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":911}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":912}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":910}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":72,"line":915}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":916}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":918}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":932}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":935}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":936}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":934}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":72,"line":939}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":940}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":942}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":956}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":959}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":960}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":958}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":72,"line":963}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":964}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":966}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":980}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":983}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":984}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":982}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":988}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":990}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":992}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":1011}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":1014}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":1015}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":1013}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":1019}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":1021}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":1023}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":1042}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":1045}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":1046}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":1044}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":1050}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":1052}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":1054}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":1073}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":1076}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":1077}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":1075}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":1081}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":1083}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":1085}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":1104}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":1107}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":1108}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":1106}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":1112}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":1114}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":1116}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":1135}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":1138}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":1139}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":1137}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":1143}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":1145}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":1147}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":1166}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":1169}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":1170}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":1168}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":1174}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":1176}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":1178}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":1197}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":1200}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":1201}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":1199}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":1205}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":1207}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":1209}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":1230}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":1233}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":1234}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":1232}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":1238}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":1240}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":1242}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":1262}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":1265}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":1266}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":1264}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":1270}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":1272}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":1274}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":1295}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":1298}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":1299}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":1297}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":1303}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":1305}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":1307}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":1327}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":1330}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":1331}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":1329}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":1335}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":1337}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":1339}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":1361}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":1364}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":1365}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":1363}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":1369}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":1371}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":1373}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":1393}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":1396}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":1397}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":1395}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":1401}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":1403}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":1405}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":1427}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":1430}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":1431}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":1429}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":1435}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":1437}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":1439}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":1461}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":1464}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":1465}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":1463}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":1469}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":1471}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":1473}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":1495}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":1498}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":1499}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":1497}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":1503}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":1505}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":1507}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":1527}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":1530}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":1531}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":1529}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":1535}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":1537}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":1539}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":1561}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":1564}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":1565}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":1563}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":1569}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":1571}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":1573}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":1595}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":1598}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":1599}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":1597}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":1603}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":1605}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":1607}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":1627}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":1630}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":1631}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":1629}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":1635}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":1637}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":1639}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":1658}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":1661}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":1662}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":1660}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":1666}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":1668}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":1670}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":1689}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":1692}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":1693}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":1691}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":1697}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":1699}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":1701}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":1720}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":1723}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":1724}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":1722}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":1728}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":1730}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":1732}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":1751}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":1754}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":1755}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":1753}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":1759}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":1761}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":1763}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":1782}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":1785}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":1786}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":1784}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":1790}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":1792}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":1794}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":1815}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":1818}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":1819}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":1817}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":1823}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":1825}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":1827}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":1844}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":1847}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":1848}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":1846}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":1852}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":1854}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":1856}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":1871}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":1874}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":1875}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":1873}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":1879}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":1881}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":1883}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":1900}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":1903}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":1904}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":1902}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":1908}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":1910}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":1912}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":1935}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":1938}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":1939}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":1937}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":1943}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":1945}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":1947}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":1971}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":1974}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":1975}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":1973}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":1979}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":1981}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":1983}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":2002}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":2005}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":2006}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":2004}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":2010}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":2012}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":2014}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":2028}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":2031}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":2032}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":2030}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":2036}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":2038}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":2040}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":2054}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":2057}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":2058}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":2056}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":2062}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":2064}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":2066}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":2080}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":2083}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":2084}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":2082}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":2088}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":2090}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":2092}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":2108}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":2111}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":2112}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":2110}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":2116}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":2118}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":2120}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":2134}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":2137}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":2138}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":2136}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":2142}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":2144}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":2146}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":2160}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":2163}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":2164}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":2162}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":2168}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":2170}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":2172}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":2186}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":2189}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":2190}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":2188}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":2194}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":2196}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":2198}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":2214}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":2217}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":2218}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":2216}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":2222}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":2224}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":2226}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":2243}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":2246}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":2247}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":2245}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":2251}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":2253}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":2255}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":2271}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":2274}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":2275}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":2273}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":2279}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":2281}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":2283}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":2300}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":2303}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":2304}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":2302}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":2308}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":2310}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":2312}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":2329}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":2332}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":2333}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":2331}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":2337}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":2339}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":2341}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":2356}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":2359}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":2360}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":2358}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":2364}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":2366}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":2368}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":2385}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":2388}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":2389}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":2387}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":2393}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":2395}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":2397}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":2414}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":2417}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":2418}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":2416}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":2422}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":2424}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":2426}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":2443}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":2446}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":2447}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":2445}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":2451}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":2453}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":2455}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":2472}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":2475}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":2476}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":2474}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":2480}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":2482}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":2484}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":2501}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":2504}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":2505}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":2503}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":2509}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":2511}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":2513}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":2530}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":2533}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":2534}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":2532}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":2538}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":2540}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":2542}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":2556}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":2559}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":2560}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":2558}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":2564}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":2566}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":2568}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":2581}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":2584}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":2585}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":2583}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":2589}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":2591}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":2593}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":2607}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":2610}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":2611}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":2609}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":2615}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":2617}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":2619}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":2633}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":2636}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":2637}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":2635}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":2641}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":2643}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":2645}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":2660}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":2663}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":2664}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":2662}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":72,"line":2667}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":2668}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":2670}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":2684}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":2687}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":2688}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":2686}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":2692}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":2694}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":2696}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":2715}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":2718}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":2719}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":2717}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":2723}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":2725}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":2727}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":2746}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":2749}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":2750}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":2748}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":2754}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":2756}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":2758}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":2777}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":2780}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":2781}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":2779}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":2785}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":2787}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":2789}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":2808}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":2811}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":2812}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":2810}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":2816}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":2818}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":2820}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":2839}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":2842}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":2843}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":2841}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":2847}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":2849}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":2851}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":2870}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":2873}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":2874}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":2872}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":2878}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":2880}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":2882}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":2901}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":2904}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":2905}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":2903}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":2909}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":2911}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":2913}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":2934}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":2937}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":2938}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":2936}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":2942}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":2944}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":2946}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":2966}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":2969}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":2970}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":2968}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":2974}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":2976}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":2978}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":3000}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":3003}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":3004}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":3002}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":3008}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":3010}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":3012}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":3032}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":3035}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":3036}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":3034}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":3040}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":3042}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":3044}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":3066}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":3069}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":3070}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":3068}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":3074}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":3076}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":3078}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":3100}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":3103}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":3104}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":3102}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":3108}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":3110}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":3112}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":3132}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":3135}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":3136}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":3134}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":3140}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":3142}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":3144}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":3163}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":3166}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":3167}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":3165}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":3171}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":3173}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":3175}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":3194}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":3197}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":3198}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":3196}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":72,"line":3201}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":3202}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":3204}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":3218}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":3221}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":3222}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":3220}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":72,"line":3225}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":3226}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":3228}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":3242}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":3245}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":3246}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":3244}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":72,"line":3249}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":3250}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":3252}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":3266}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":3269}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":3270}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":3268}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":3274}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":3276}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":3278}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":3299}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":3302}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":3303}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":3301}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":3307}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":3309}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":3311}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":3328}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":3331}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":3332}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":3330}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":3336}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":3338}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":3340}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":3354}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":3357}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":3358}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":3356}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":3362}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":3364}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":3366}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":3380}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":3383}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":3384}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":3382}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":3388}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":3390}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":3392}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":3406}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":3409}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":3410}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":3408}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":3414}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":3416}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":3418}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":3432}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":3435}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":3436}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":3434}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":3440}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":3442}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":3444}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":3458}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":3461}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":3462}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":3460}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":3466}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":3468}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":3470}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":3484}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":3487}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":3488}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":3486}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":3492}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":3494}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":3496}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":3510}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":3513}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":3514}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":3512}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":3518}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":3520}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":3522}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":3538}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":3541}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":3542}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":3540}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":3546}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":3548}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":3550}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":3566}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":3569}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":3570}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":3568}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":3574}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":3576}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":3578}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":3595}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":3598}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":3599}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":3597}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":3603}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":3605}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":3607}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":3624}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":3627}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":3628}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":3626}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":3632}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":3634}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":3636}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":3653}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":3656}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":3657}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":3655}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":3661}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":3663}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":3665}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":3682}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":3685}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":3686}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":3684}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":3690}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":3692}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":3694}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":3711}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":3714}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":3715}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":3713}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":3719}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":3721}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":3723}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":3738}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":3741}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":3742}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":3740}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":3746}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":3748}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":3750}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":3766}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":3769}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":3770}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":3768}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":3774}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":3776}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":3778}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":3793}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":3796}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":3797}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":3795}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":72,"line":3800}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":3801}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":3803}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":3823}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":3826}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":3827}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":3825}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":72,"line":3830}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":3831}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":3833}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":3851}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":3854}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":3855}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":3853}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":72,"line":3858}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":3859}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":3861}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":3874}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":3877}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":3878}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":3876}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":72,"line":3881}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":3882}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":3884}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":3897}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":3900}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":3901}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":3899}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":72,"line":3904}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":3905}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":3907}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":3920}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":3923}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":3924}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":3922}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":3928}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":3930}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":3932}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":3952}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":3955}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":3956}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":3954}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":3960}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":3962}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":3964}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":3981}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":3984}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":3985}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":3983}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":3989}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":3991}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":3993}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":4014}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":4017}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":4018}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":4016}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":4022}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":4024}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":4026}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":4044}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":4047}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":4048}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":4046}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":4052}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":4054}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":4056}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":4074}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":4077}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":4078}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":4076}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":4082}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":4084}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":4086}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":4104}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":4107}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":4108}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":4106}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":4112}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":4114}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":4116}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":4134}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":4137}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":4138}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":4136}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":4142}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":4144}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":4146}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":4164}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":4167}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":4168}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":4166}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":4172}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":4174}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":4176}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":4194}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":4197}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":4198}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":4196}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":4202}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":4204}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":4206}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":4224}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":4227}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":4228}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":4226}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":4232}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":4234}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":4236}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":4254}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":4257}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":4258}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":4256}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":4262}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":4264}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":4266}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":4286}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":4289}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":4290}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":4288}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":4294}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":4296}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":4298}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":4319}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":4322}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":4323}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":4321}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":4327}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":4329}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":4331}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":4351}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":4354}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":4355}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":4353}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":4359}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":4361}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":4363}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":4384}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":4387}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":4388}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":4386}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":4392}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":4394}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":4396}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":4417}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":4420}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":4421}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":4419}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":4425}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":4427}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":4429}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":4448}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":4451}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":4452}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":4450}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":4456}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":4458}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":4460}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":4481}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":4484}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":4485}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":4483}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":4489}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":4491}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":4493}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":4514}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":4517}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":4518}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":4516}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":4522}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":4524}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":4526}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":4547}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":4550}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":4551}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":4549}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":4555}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":4557}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":4559}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":4580}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":4583}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":4584}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":4582}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":4588}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":4590}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":4592}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":4613}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":4616}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":4617}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":4615}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":4621}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":4623}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":4625}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":4646}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":4649}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":4650}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":4648}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":4654}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":4656}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":4658}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":4677}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":4680}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":4681}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":4679}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":4685}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":4687}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":4689}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":4709}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":4712}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":4713}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":4711}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":4717}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":4719}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":4721}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":4739}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":4742}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":4743}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":4741}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":4747}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":4749}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":4751}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":4764}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":4767}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":4768}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":4766}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":4772}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":4774}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":4776}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":4789}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":4792}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":4793}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":4791}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":4797}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":4799}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":4801}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":4814}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":4817}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":4818}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":4816}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":4822}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":4824}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":4826}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":4839}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":4842}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":4843}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":4841}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":4847}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":4849}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":4851}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":4866}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":4869}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":4870}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":4868}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":4874}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":4876}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":4878}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":4893}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":4896}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":4897}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":4895}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":4901}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":4903}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":4905}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":4920}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":4923}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":4924}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":4922}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":4928}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":4930}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":4932}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":4948}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":4951}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":4952}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":4950}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":4956}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":4958}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":4960}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":4975}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":4978}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":4979}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":4977}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":4983}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":4985}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":4987}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":5003}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":5006}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":5007}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":5005}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":5011}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":5013}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":5015}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":5031}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":5034}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":5035}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":5033}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":5039}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":5041}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":5043}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":5059}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":5062}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":5063}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":5061}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":5067}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":5069}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":5071}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":5087}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":5090}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":5091}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":5089}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":5095}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":5097}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":5099}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":5115}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":5118}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":5119}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":5117}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":5123}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":5125}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":5127}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":5143}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":5146}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":5147}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":5145}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":5151}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":5153}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":5155}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":5171}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":5174}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":5175}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":5173}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":5179}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":5181}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":5183}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":5199}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":5202}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":5203}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":5201}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":5207}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":5209}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":5211}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":5227}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":5230}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":5231}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":5229}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":5235}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":5237}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":5239}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":5253}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":5256}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":5257}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":5255}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":5261}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":5263}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":5265}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":5280}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":5283}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":5284}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":5282}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":5288}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":5290}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":5292}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":5305}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":5308}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":5309}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":5307}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":5313}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":5315}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":5317}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":8,"line":5538}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":8,"line":5539}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":12,"line":5537}},{"kind":2,"label":[{"value":"handler:"}],"paddingRight":true,"position":{"character":44,"line":5543}},{"kind":2,"label":[{"value":"handler:"}],"paddingRight":true,"position":{"character":44,"line":5545}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":8,"line":5561}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":8,"line":5562}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":12,"line":5560}},{"kind":2,"label":[{"value":"handler:"}],"paddingRight":true,"position":{"character":44,"line":5566}},{"kind":2,"label":[{"value":"handler:"}],"paddingRight":true,"position":{"character":44,"line":5568}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":8,"line":5584}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":8,"line":5585}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":12,"line":5583}},{"kind":2,"label":[{"value":"handler:"}],"paddingRight":true,"position":{"character":44,"line":5589}},{"kind":2,"label":[{"value":"handler:"}],"paddingRight":true,"position":{"character":44,"line":5591}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":8,"line":5607}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":8,"line":5608}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":12,"line":5606}},{"kind":2,"label":[{"value":"handler:"}],"paddingRight":true,"position":{"character":44,"line":5612}},{"kind":2,"label":[{"value":"handler:"}],"paddingRight":true,"position":{"character":44,"line":5614}},{"kind":2,"label":[{"location":{"range":{"end":{"character":43,"line":5351},"start":{"character":33,"line":5351}},"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"everything:"}],"paddingRight":true,"position":{"character":53,"line":5626}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":8,"line":5640}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":8,"line":5641}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":12,"line":5639}},{"kind":2,"label":[{"value":"handler:"}],"paddingRight":true,"position":{"character":44,"line":5645}},{"kind":2,"label":[{"value":"handler:"}],"paddingRight":true,"position":{"character":44,"line":5647}},{"kind":2,"label":[{"location":{"range":{"end":{"character":69,"line":5354},"start":{"character":59,"line":5354}},"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"everything:"}],"paddingRight":true,"position":{"character":14,"line":5657}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":8,"line":5672}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":8,"line":5673}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":12,"line":5671}},{"kind":2,"label":[{"value":"handler:"}],"paddingRight":true,"position":{"character":44,"line":5677}},{"kind":2,"label":[{"value":"handler:"}],"paddingRight":true,"position":{"character":44,"line":5679}},{"kind":2,"label":[{"location":{"range":{"end":{"character":23,"line":5360},"start":{"character":10,"line":5360}},"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"aNullableBool:"}],"paddingRight":true,"position":{"character":14,"line":5690}},{"kind":2,"label":[{"location":{"range":{"end":{"character":21,"line":5361},"start":{"character":9,"line":5361}},"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"aNullableInt:"}],"paddingRight":true,"position":{"character":14,"line":5691}},{"kind":2,"label":[{"location":{"range":{"end":{"character":27,"line":5362},"start":{"character":12,"line":5362}},"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"aNullableString:"}],"paddingRight":true,"position":{"character":14,"line":5692}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":8,"line":5707}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":8,"line":5708}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":12,"line":5706}},{"kind":2,"label":[{"value":"handler:"}],"paddingRight":true,"position":{"character":44,"line":5712}},{"kind":2,"label":[{"value":"handler:"}],"paddingRight":true,"position":{"character":44,"line":5714}},{"kind":2,"label":[{"location":{"range":{"end":{"character":48,"line":5367},"start":{"character":38,"line":5367}},"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"everything:"}],"paddingRight":true,"position":{"character":54,"line":5724}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":8,"line":5738}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":8,"line":5739}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":12,"line":5737}},{"kind":2,"label":[{"value":"handler:"}],"paddingRight":true,"position":{"character":44,"line":5743}},{"kind":2,"label":[{"value":"handler:"}],"paddingRight":true,"position":{"character":44,"line":5745}},{"kind":2,"label":[{"location":{"range":{"end":{"character":23,"line":5374},"start":{"character":10,"line":5374}},"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"aNullableBool:"}],"paddingRight":true,"position":{"character":18,"line":5757}},{"kind":2,"label":[{"location":{"range":{"end":{"character":21,"line":5375},"start":{"character":9,"line":5375}},"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"aNullableInt:"}],"paddingRight":true,"position":{"character":18,"line":5758}},{"kind":2,"label":[{"location":{"range":{"end":{"character":27,"line":5376},"start":{"character":12,"line":5376}},"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"aNullableString:"}],"paddingRight":true,"position":{"character":18,"line":5759}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":8,"line":5774}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":8,"line":5775}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":12,"line":5773}},{"kind":2,"label":[{"value":"handler:"}],"paddingRight":true,"position":{"character":44,"line":5779}},{"kind":2,"label":[{"value":"handler:"}],"paddingRight":true,"position":{"character":44,"line":5781}},{"kind":2,"label":[{"location":{"range":{"end":{"character":26,"line":5380},"start":{"character":21,"line":5380}},"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"aBool:"}],"paddingRight":true,"position":{"character":45,"line":5793}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":8,"line":5807}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":8,"line":5808}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":12,"line":5806}},{"kind":2,"label":[{"value":"handler:"}],"paddingRight":true,"position":{"character":44,"line":5812}},{"kind":2,"label":[{"value":"handler:"}],"paddingRight":true,"position":{"character":44,"line":5814}},{"kind":2,"label":[{"location":{"range":{"end":{"character":23,"line":5383},"start":{"character":18,"line":5383}},"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"anInt:"}],"paddingRight":true,"position":{"character":43,"line":5826}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":8,"line":5840}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":8,"line":5841}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":12,"line":5839}},{"kind":2,"label":[{"value":"handler:"}],"paddingRight":true,"position":{"character":44,"line":5845}},{"kind":2,"label":[{"value":"handler:"}],"paddingRight":true,"position":{"character":44,"line":5847}},{"kind":2,"label":[{"location":{"range":{"end":{"character":34,"line":5386},"start":{"character":27,"line":5386}},"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"aDouble:"}],"paddingRight":true,"position":{"character":49,"line":5859}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":8,"line":5873}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":8,"line":5874}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":12,"line":5872}},{"kind":2,"label":[{"value":"handler:"}],"paddingRight":true,"position":{"character":44,"line":5878}},{"kind":2,"label":[{"value":"handler:"}],"paddingRight":true,"position":{"character":44,"line":5880}},{"kind":2,"label":[{"location":{"range":{"end":{"character":34,"line":5389},"start":{"character":27,"line":5389}},"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"aString:"}],"paddingRight":true,"position":{"character":49,"line":5892}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":8,"line":5906}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":8,"line":5907}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":12,"line":5905}},{"kind":2,"label":[{"value":"handler:"}],"paddingRight":true,"position":{"character":44,"line":5911}},{"kind":2,"label":[{"value":"handler:"}],"paddingRight":true,"position":{"character":44,"line":5913}},{"kind":2,"label":[{"location":{"range":{"end":{"character":40,"line":5392},"start":{"character":36,"line":5392}},"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"list:"}],"paddingRight":true,"position":{"character":55,"line":5925}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":8,"line":5939}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":8,"line":5940}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":12,"line":5938}},{"kind":2,"label":[{"value":"handler:"}],"paddingRight":true,"position":{"character":44,"line":5944}},{"kind":2,"label":[{"value":"handler:"}],"paddingRight":true,"position":{"character":44,"line":5946}},{"kind":2,"label":[{"location":{"range":{"end":{"character":43,"line":5395},"start":{"character":39,"line":5395}},"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"list:"}],"paddingRight":true,"position":{"character":54,"line":5959}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":8,"line":5973}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":8,"line":5974}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":12,"line":5972}},{"kind":2,"label":[{"value":"handler:"}],"paddingRight":true,"position":{"character":44,"line":5978}},{"kind":2,"label":[{"value":"handler:"}],"paddingRight":true,"position":{"character":44,"line":5980}},{"kind":2,"label":[{"location":{"range":{"end":{"character":51,"line":5398},"start":{"character":43,"line":5398}},"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"enumList:"}],"paddingRight":true,"position":{"character":58,"line":5993}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":8,"line":6007}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":8,"line":6008}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":12,"line":6006}},{"kind":2,"label":[{"value":"handler:"}],"paddingRight":true,"position":{"character":44,"line":6012}},{"kind":2,"label":[{"value":"handler:"}],"paddingRight":true,"position":{"character":44,"line":6014}},{"kind":2,"label":[{"location":{"range":{"end":{"character":73,"line":5401},"start":{"character":64,"line":5401}},"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"classList:"}],"paddingRight":true,"position":{"character":14,"line":6028}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":8,"line":6043}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":8,"line":6044}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":12,"line":6042}},{"kind":2,"label":[{"value":"handler:"}],"paddingRight":true,"position":{"character":44,"line":6048}},{"kind":2,"label":[{"value":"handler:"}],"paddingRight":true,"position":{"character":44,"line":6050}},{"kind":2,"label":[{"location":{"range":{"end":{"character":56,"line":5404},"start":{"character":48,"line":5404}},"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"enumList:"}],"paddingRight":true,"position":{"character":64,"line":6063}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":8,"line":6077}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":8,"line":6078}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":12,"line":6076}},{"kind":2,"label":[{"value":"handler:"}],"paddingRight":true,"position":{"character":44,"line":6082}},{"kind":2,"label":[{"value":"handler:"}],"paddingRight":true,"position":{"character":44,"line":6084}},{"kind":2,"label":[{"location":{"range":{"end":{"character":78,"line":5407},"start":{"character":69,"line":5407}},"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"classList:"}],"paddingRight":true,"position":{"character":14,"line":6098}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":8,"line":6113}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":8,"line":6114}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":12,"line":6112}},{"kind":2,"label":[{"value":"handler:"}],"paddingRight":true,"position":{"character":44,"line":6118}},{"kind":2,"label":[{"value":"handler:"}],"paddingRight":true,"position":{"character":44,"line":6120}},{"kind":2,"label":[{"location":{"range":{"end":{"character":57,"line":5410},"start":{"character":54,"line":5410}},"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"map:"}],"paddingRight":true,"position":{"character":61,"line":6133}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":8,"line":6147}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":8,"line":6148}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":12,"line":6146}},{"kind":2,"label":[{"value":"handler:"}],"paddingRight":true,"position":{"character":44,"line":6152}},{"kind":2,"label":[{"value":"handler:"}],"paddingRight":true,"position":{"character":44,"line":6154}},{"kind":2,"label":[{"location":{"range":{"end":{"character":69,"line":5413},"start":{"character":60,"line":5413}},"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"stringMap:"}],"paddingRight":true,"position":{"character":14,"line":6168}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":8,"line":6183}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":8,"line":6184}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":12,"line":6182}},{"kind":2,"label":[{"value":"handler:"}],"paddingRight":true,"position":{"character":44,"line":6188}},{"kind":2,"label":[{"value":"handler:"}],"paddingRight":true,"position":{"character":44,"line":6190}},{"kind":2,"label":[{"location":{"range":{"end":{"character":51,"line":5416},"start":{"character":45,"line":5416}},"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"intMap:"}],"paddingRight":true,"position":{"character":58,"line":6203}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":8,"line":6217}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":8,"line":6218}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":12,"line":6216}},{"kind":2,"label":[{"value":"handler:"}],"paddingRight":true,"position":{"character":44,"line":6222}},{"kind":2,"label":[{"value":"handler:"}],"paddingRight":true,"position":{"character":44,"line":6224}},{"kind":2,"label":[{"location":{"range":{"end":{"character":65,"line":5419},"start":{"character":58,"line":5419}},"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"enumMap:"}],"paddingRight":true,"position":{"character":65,"line":6237}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":8,"line":6251}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":8,"line":6252}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":12,"line":6250}},{"kind":2,"label":[{"value":"handler:"}],"paddingRight":true,"position":{"character":44,"line":6256}},{"kind":2,"label":[{"value":"handler:"}],"paddingRight":true,"position":{"character":44,"line":6258}},{"kind":2,"label":[{"location":{"range":{"end":{"character":41,"line":5423},"start":{"character":33,"line":5423}},"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"classMap:"}],"paddingRight":true,"position":{"character":14,"line":6273}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":8,"line":6288}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":8,"line":6289}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":12,"line":6287}},{"kind":2,"label":[{"value":"handler:"}],"paddingRight":true,"position":{"character":44,"line":6293}},{"kind":2,"label":[{"value":"handler:"}],"paddingRight":true,"position":{"character":44,"line":6295}},{"kind":2,"label":[{"location":{"range":{"end":{"character":72,"line":5427},"start":{"character":63,"line":5427}},"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"stringMap:"}],"paddingRight":true,"position":{"character":14,"line":6309}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":8,"line":6324}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":8,"line":6325}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":12,"line":6323}},{"kind":2,"label":[{"value":"handler:"}],"paddingRight":true,"position":{"character":44,"line":6329}},{"kind":2,"label":[{"value":"handler:"}],"paddingRight":true,"position":{"character":44,"line":6331}},{"kind":2,"label":[{"location":{"range":{"end":{"character":54,"line":5430},"start":{"character":48,"line":5430}},"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"intMap:"}],"paddingRight":true,"position":{"character":63,"line":6344}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":8,"line":6358}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":8,"line":6359}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":12,"line":6357}},{"kind":2,"label":[{"value":"handler:"}],"paddingRight":true,"position":{"character":44,"line":6363}},{"kind":2,"label":[{"value":"handler:"}],"paddingRight":true,"position":{"character":44,"line":6365}},{"kind":2,"label":[{"location":{"range":{"end":{"character":68,"line":5433},"start":{"character":61,"line":5433}},"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"enumMap:"}],"paddingRight":true,"position":{"character":14,"line":6379}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":8,"line":6394}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":8,"line":6395}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":12,"line":6393}},{"kind":2,"label":[{"value":"handler:"}],"paddingRight":true,"position":{"character":44,"line":6399}},{"kind":2,"label":[{"value":"handler:"}],"paddingRight":true,"position":{"character":44,"line":6401}},{"kind":2,"label":[{"location":{"range":{"end":{"character":39,"line":5437},"start":{"character":31,"line":5437}},"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"classMap:"}],"paddingRight":true,"position":{"character":14,"line":6416}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":8,"line":6431}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":8,"line":6432}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":12,"line":6430}},{"kind":2,"label":[{"value":"handler:"}],"paddingRight":true,"position":{"character":44,"line":6436}},{"kind":2,"label":[{"value":"handler:"}],"paddingRight":true,"position":{"character":44,"line":6438}},{"kind":2,"label":[{"location":{"range":{"end":{"character":31,"line":5441},"start":{"character":25,"line":5441}},"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"anEnum:"}],"paddingRight":true,"position":{"character":47,"line":6450}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":8,"line":6464}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":8,"line":6465}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":12,"line":6463}},{"kind":2,"label":[{"value":"handler:"}],"paddingRight":true,"position":{"character":44,"line":6469}},{"kind":2,"label":[{"value":"handler:"}],"paddingRight":true,"position":{"character":44,"line":6471}},{"kind":2,"label":[{"location":{"range":{"end":{"character":53,"line":5444},"start":{"character":42,"line":5444}},"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"anotherEnum:"}],"paddingRight":true,"position":{"character":59,"line":6483}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":8,"line":6497}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":8,"line":6498}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":12,"line":6496}},{"kind":2,"label":[{"value":"handler:"}],"paddingRight":true,"position":{"character":44,"line":6502}},{"kind":2,"label":[{"value":"handler:"}],"paddingRight":true,"position":{"character":44,"line":6504}},{"kind":2,"label":[{"location":{"range":{"end":{"character":36,"line":5447},"start":{"character":31,"line":5447}},"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"aBool:"}],"paddingRight":true,"position":{"character":54,"line":6512}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":8,"line":6526}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":8,"line":6527}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":12,"line":6525}},{"kind":2,"label":[{"value":"handler:"}],"paddingRight":true,"position":{"character":44,"line":6531}},{"kind":2,"label":[{"value":"handler:"}],"paddingRight":true,"position":{"character":44,"line":6533}},{"kind":2,"label":[{"location":{"range":{"end":{"character":33,"line":5450},"start":{"character":28,"line":5450}},"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"anInt:"}],"paddingRight":true,"position":{"character":52,"line":6541}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":8,"line":6555}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":8,"line":6556}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":12,"line":6554}},{"kind":2,"label":[{"value":"handler:"}],"paddingRight":true,"position":{"character":44,"line":6560}},{"kind":2,"label":[{"value":"handler:"}],"paddingRight":true,"position":{"character":44,"line":6562}},{"kind":2,"label":[{"location":{"range":{"end":{"character":44,"line":5453},"start":{"character":37,"line":5453}},"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"aDouble:"}],"paddingRight":true,"position":{"character":58,"line":6570}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":8,"line":6584}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":8,"line":6585}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":12,"line":6583}},{"kind":2,"label":[{"value":"handler:"}],"paddingRight":true,"position":{"character":44,"line":6589}},{"kind":2,"label":[{"value":"handler:"}],"paddingRight":true,"position":{"character":44,"line":6591}},{"kind":2,"label":[{"location":{"range":{"end":{"character":44,"line":5456},"start":{"character":37,"line":5456}},"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"aString:"}],"paddingRight":true,"position":{"character":58,"line":6599}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":8,"line":6613}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":8,"line":6614}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":12,"line":6612}},{"kind":2,"label":[{"value":"handler:"}],"paddingRight":true,"position":{"character":44,"line":6618}},{"kind":2,"label":[{"value":"handler:"}],"paddingRight":true,"position":{"character":44,"line":6620}},{"kind":2,"label":[{"location":{"range":{"end":{"character":50,"line":5459},"start":{"character":46,"line":5459}},"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"list:"}],"paddingRight":true,"position":{"character":64,"line":6628}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":8,"line":6642}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":8,"line":6643}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":12,"line":6641}},{"kind":2,"label":[{"value":"handler:"}],"paddingRight":true,"position":{"character":44,"line":6647}},{"kind":2,"label":[{"value":"handler:"}],"paddingRight":true,"position":{"character":44,"line":6649}},{"kind":2,"label":[{"location":{"range":{"end":{"character":53,"line":5462},"start":{"character":49,"line":5462}},"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"list:"}],"paddingRight":true,"position":{"character":63,"line":6658}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":8,"line":6672}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":8,"line":6673}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":12,"line":6671}},{"kind":2,"label":[{"value":"handler:"}],"paddingRight":true,"position":{"character":44,"line":6677}},{"kind":2,"label":[{"value":"handler:"}],"paddingRight":true,"position":{"character":44,"line":6679}},{"kind":2,"label":[{"location":{"range":{"end":{"character":61,"line":5465},"start":{"character":53,"line":5465}},"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"enumList:"}],"paddingRight":true,"position":{"character":14,"line":6689}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":8,"line":6704}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":8,"line":6705}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":12,"line":6703}},{"kind":2,"label":[{"value":"handler:"}],"paddingRight":true,"position":{"character":44,"line":6709}},{"kind":2,"label":[{"value":"handler:"}],"paddingRight":true,"position":{"character":44,"line":6711}},{"kind":2,"label":[{"location":{"range":{"end":{"character":38,"line":5469},"start":{"character":29,"line":5469}},"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"classList:"}],"paddingRight":true,"position":{"character":14,"line":6721}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":8,"line":6736}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":8,"line":6737}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":12,"line":6735}},{"kind":2,"label":[{"value":"handler:"}],"paddingRight":true,"position":{"character":44,"line":6741}},{"kind":2,"label":[{"value":"handler:"}],"paddingRight":true,"position":{"character":44,"line":6743}},{"kind":2,"label":[{"location":{"range":{"end":{"character":66,"line":5473},"start":{"character":58,"line":5473}},"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"enumList:"}],"paddingRight":true,"position":{"character":14,"line":6753}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":8,"line":6768}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":8,"line":6769}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":12,"line":6767}},{"kind":2,"label":[{"value":"handler:"}],"paddingRight":true,"position":{"character":44,"line":6773}},{"kind":2,"label":[{"value":"handler:"}],"paddingRight":true,"position":{"character":44,"line":6775}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":5477},"start":{"character":28,"line":5477}},"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"classList:"}],"paddingRight":true,"position":{"character":46,"line":6785}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":8,"line":6799}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":8,"line":6800}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":12,"line":6798}},{"kind":2,"label":[{"value":"handler:"}],"paddingRight":true,"position":{"character":44,"line":6804}},{"kind":2,"label":[{"value":"handler:"}],"paddingRight":true,"position":{"character":44,"line":6806}},{"kind":2,"label":[{"location":{"range":{"end":{"character":67,"line":5481},"start":{"character":64,"line":5481}},"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"map:"}],"paddingRight":true,"position":{"character":70,"line":6815}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":8,"line":6829}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":8,"line":6830}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":12,"line":6828}},{"kind":2,"label":[{"value":"handler:"}],"paddingRight":true,"position":{"character":44,"line":6834}},{"kind":2,"label":[{"value":"handler:"}],"paddingRight":true,"position":{"character":44,"line":6836}},{"kind":2,"label":[{"location":{"range":{"end":{"character":36,"line":5485},"start":{"character":27,"line":5485}},"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"stringMap:"}],"paddingRight":true,"position":{"character":14,"line":6846}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":8,"line":6861}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":8,"line":6862}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":12,"line":6860}},{"kind":2,"label":[{"value":"handler:"}],"paddingRight":true,"position":{"character":44,"line":6866}},{"kind":2,"label":[{"value":"handler:"}],"paddingRight":true,"position":{"character":44,"line":6868}},{"kind":2,"label":[{"location":{"range":{"end":{"character":61,"line":5489},"start":{"character":55,"line":5489}},"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"intMap:"}],"paddingRight":true,"position":{"character":67,"line":6877}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":8,"line":6891}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":8,"line":6892}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":12,"line":6890}},{"kind":2,"label":[{"value":"handler:"}],"paddingRight":true,"position":{"character":44,"line":6896}},{"kind":2,"label":[{"value":"handler:"}],"paddingRight":true,"position":{"character":44,"line":6898}},{"kind":2,"label":[{"location":{"range":{"end":{"character":75,"line":5492},"start":{"character":68,"line":5492}},"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"enumMap:"}],"paddingRight":true,"position":{"character":14,"line":6908}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":8,"line":6923}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":8,"line":6924}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":12,"line":6922}},{"kind":2,"label":[{"value":"handler:"}],"paddingRight":true,"position":{"character":44,"line":6928}},{"kind":2,"label":[{"value":"handler:"}],"paddingRight":true,"position":{"character":44,"line":6930}},{"kind":2,"label":[{"location":{"range":{"end":{"character":42,"line":5496},"start":{"character":34,"line":5496}},"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"classMap:"}],"paddingRight":true,"position":{"character":38,"line":6941}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":8,"line":6955}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":8,"line":6956}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":12,"line":6954}},{"kind":2,"label":[{"value":"handler:"}],"paddingRight":true,"position":{"character":44,"line":6960}},{"kind":2,"label":[{"value":"handler:"}],"paddingRight":true,"position":{"character":44,"line":6962}},{"kind":2,"label":[{"location":{"range":{"end":{"character":34,"line":5501},"start":{"character":25,"line":5501}},"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"stringMap:"}],"paddingRight":true,"position":{"character":46,"line":6972}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":8,"line":6986}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":8,"line":6987}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":12,"line":6985}},{"kind":2,"label":[{"value":"handler:"}],"paddingRight":true,"position":{"character":44,"line":6991}},{"kind":2,"label":[{"value":"handler:"}],"paddingRight":true,"position":{"character":44,"line":6993}},{"kind":2,"label":[{"location":{"range":{"end":{"character":64,"line":5505},"start":{"character":58,"line":5505}},"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"intMap:"}],"paddingRight":true,"position":{"character":14,"line":7003}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":8,"line":7018}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":8,"line":7019}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":12,"line":7017}},{"kind":2,"label":[{"value":"handler:"}],"paddingRight":true,"position":{"character":44,"line":7023}},{"kind":2,"label":[{"value":"handler:"}],"paddingRight":true,"position":{"character":44,"line":7025}},{"kind":2,"label":[{"location":{"range":{"end":{"character":78,"line":5508},"start":{"character":71,"line":5508}},"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"enumMap:"}],"paddingRight":true,"position":{"character":14,"line":7035}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":8,"line":7050}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":8,"line":7051}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":12,"line":7049}},{"kind":2,"label":[{"value":"handler:"}],"paddingRight":true,"position":{"character":44,"line":7055}},{"kind":2,"label":[{"value":"handler:"}],"paddingRight":true,"position":{"character":44,"line":7057}},{"kind":2,"label":[{"location":{"range":{"end":{"character":40,"line":5512},"start":{"character":32,"line":5512}},"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"classMap:"}],"paddingRight":true,"position":{"character":45,"line":7068}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":8,"line":7082}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":8,"line":7083}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":12,"line":7081}},{"kind":2,"label":[{"value":"handler:"}],"paddingRight":true,"position":{"character":44,"line":7087}},{"kind":2,"label":[{"value":"handler:"}],"paddingRight":true,"position":{"character":44,"line":7089}},{"kind":2,"label":[{"location":{"range":{"end":{"character":41,"line":5516},"start":{"character":35,"line":5516}},"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"anEnum:"}],"paddingRight":true,"position":{"character":56,"line":7097}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":8,"line":7111}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":8,"line":7112}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":12,"line":7110}},{"kind":2,"label":[{"value":"handler:"}],"paddingRight":true,"position":{"character":44,"line":7116}},{"kind":2,"label":[{"value":"handler:"}],"paddingRight":true,"position":{"character":44,"line":7118}},{"kind":2,"label":[{"location":{"range":{"end":{"character":63,"line":5519},"start":{"character":52,"line":5519}},"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"anotherEnum:"}],"paddingRight":true,"position":{"character":14,"line":7127}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":8,"line":7142}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":8,"line":7143}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":12,"line":7141}},{"kind":2,"label":[{"value":"handler:"}],"paddingRight":true,"position":{"character":44,"line":7147}},{"kind":2,"label":[{"value":"handler:"}],"paddingRight":true,"position":{"character":44,"line":7149}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":8,"line":7165}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":8,"line":7166}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":12,"line":7164}},{"kind":2,"label":[{"value":"handler:"}],"paddingRight":true,"position":{"character":44,"line":7170}},{"kind":2,"label":[{"value":"handler:"}],"paddingRight":true,"position":{"character":44,"line":7172}},{"kind":2,"label":[{"location":{"range":{"end":{"character":47,"line":5526},"start":{"character":40,"line":5526}},"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"aString:"}],"paddingRight":true,"position":{"character":60,"line":7184}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":7218}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":7221}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":7222}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":7220}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":72,"line":7225}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":7226}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":7228}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":7260}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":7263}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":7264}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":7262}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":7268}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":7270}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":7272}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":7290}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":7293}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":7294}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":7292}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":72,"line":7297}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":7298}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":7300}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":8,"line":7331}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":8,"line":7332}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":12,"line":7330}},{"kind":2,"label":[{"value":"handler:"}],"paddingRight":true,"position":{"character":44,"line":7336}},{"kind":2,"label":[{"value":"handler:"}],"paddingRight":true,"position":{"character":44,"line":7338}},{"kind":2,"label":[{"location":{"range":{"end":{"character":45,"line":7317},"start":{"character":42,"line":7317}},"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"msg:"}],"paddingRight":true,"position":{"character":59,"line":7350}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":8,"line":7364}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":8,"line":7365}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":12,"line":7363}},{"kind":2,"label":[{"value":"handler:"}],"paddingRight":true,"position":{"character":44,"line":7369}},{"kind":2,"label":[{"value":"handler:"}],"paddingRight":true,"position":{"character":44,"line":7371}},{"kind":2,"label":[{"location":{"range":{"end":{"character":34,"line":7319},"start":{"character":27,"line":7319}},"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"aString:"}],"paddingRight":true,"position":{"character":49,"line":7383}}]}}
-{"time":1771003782423,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","id":13,"method":"textDocument/codeLens","params":{"textDocument":{"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"}},"clientRequestTime":1771003782422}}
+{"time":1771003782341,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","id":12,"method":"textDocument/inlayHint","params":{"textDocument":{"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"range":{"start":{"line":7317,"character":0},"end":{"line":7397,"character":0}}},"clientRequestTime":1771003782341}}
+{"time":1771003782371,"kind":"message","sender":"server","receiver":"ide","message":{"id":12,"jsonrpc":"2.0","result":[{"kind":1,"label":[{"value":"<"},{"value":"dynamic"},{"value":">"}],"position":{"character":15,"line":36}},{"kind":1,"label":[{"value":"<"},{"value":"dynamic"},{"value":">"}],"position":{"character":28,"line":36}},{"kind":2,"label":[{"value":"test:"}],"paddingRight":true,"position":{"character":10,"line":39}},{"kind":2,"label":[{"location":{"range":{"end":{"character":26,"line":35},"start":{"character":25,"line":35}},"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"a:"}],"paddingRight":true,"position":{"character":47,"line":39}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":35},"start":{"character":36,"line":35}},"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"b:"}],"paddingRight":true,"position":{"character":56,"line":39}},{"kind":1,"label":[{"value":"<"},{"value":"dynamic"},{"value":", "},{"value":"dynamic"},{"value":">"}],"position":{"character":14,"line":42}},{"kind":1,"label":[{"value":"<"},{"value":"dynamic"},{"value":", "},{"value":"dynamic"},{"value":">"}],"position":{"character":26,"line":42}},{"kind":2,"label":[{"value":"test:"}],"paddingRight":true,"position":{"character":10,"line":45}},{"kind":2,"label":[{"location":{"range":{"end":{"character":30,"line":260},"start":{"character":27,"line":260}},"uri":"{{context-0:package-root:sky_engine}}lib/core/map.dart"},"value":"key:"}],"paddingRight":true,"position":{"character":55,"line":46}},{"kind":2,"label":[{"location":{"range":{"end":{"character":26,"line":35},"start":{"character":25,"line":35}},"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"a:"}],"paddingRight":true,"position":{"character":26,"line":47}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":35},"start":{"character":36,"line":35}},"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"b:"}],"paddingRight":true,"position":{"character":39,"line":47}},{"kind":2,"label":[{"location":{"range":{"end":{"character":33,"line":66},"start":{"character":32,"line":66}},"uri":"{{context-0:package-root:sky_engine}}lib/core/identical.dart"},"value":"a:"}],"paddingRight":true,"position":{"character":18,"line":81}},{"kind":2,"label":[{"location":{"range":{"end":{"character":44,"line":66},"start":{"character":43,"line":66}},"uri":"{{context-0:package-root:sky_engine}}lib/core/identical.dart"},"value":"b:"}],"paddingRight":true,"position":{"character":24,"line":81}},{"kind":2,"label":[{"location":{"range":{"end":{"character":26,"line":35},"start":{"character":25,"line":35}},"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"a:"}],"paddingRight":true,"position":{"character":23,"line":84}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":35},"start":{"character":36,"line":35}},"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"b:"}],"paddingRight":true,"position":{"character":33,"line":84}},{"kind":2,"label":[{"location":{"range":{"end":{"character":46,"line":545},"start":{"character":39,"line":545}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"objects:"}],"paddingRight":true,"position":{"character":37,"line":89}},{"kind":2,"label":[{"location":{"range":{"end":{"character":33,"line":66},"start":{"character":32,"line":66}},"uri":"{{context-0:package-root:sky_engine}}lib/core/identical.dart"},"value":"a:"}],"paddingRight":true,"position":{"character":18,"line":260}},{"kind":2,"label":[{"location":{"range":{"end":{"character":44,"line":66},"start":{"character":43,"line":66}},"uri":"{{context-0:package-root:sky_engine}}lib/core/identical.dart"},"value":"b:"}],"paddingRight":true,"position":{"character":24,"line":260}},{"kind":2,"label":[{"location":{"range":{"end":{"character":26,"line":35},"start":{"character":25,"line":35}},"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"a:"}],"paddingRight":true,"position":{"character":23,"line":263}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":35},"start":{"character":36,"line":35}},"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"b:"}],"paddingRight":true,"position":{"character":33,"line":263}},{"kind":2,"label":[{"location":{"range":{"end":{"character":46,"line":545},"start":{"character":39,"line":545}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"objects:"}],"paddingRight":true,"position":{"character":37,"line":268}},{"kind":2,"label":[{"location":{"range":{"end":{"character":33,"line":66},"start":{"character":32,"line":66}},"uri":"{{context-0:package-root:sky_engine}}lib/core/identical.dart"},"value":"a:"}],"paddingRight":true,"position":{"character":18,"line":458}},{"kind":2,"label":[{"location":{"range":{"end":{"character":44,"line":66},"start":{"character":43,"line":66}},"uri":"{{context-0:package-root:sky_engine}}lib/core/identical.dart"},"value":"b:"}],"paddingRight":true,"position":{"character":24,"line":458}},{"kind":2,"label":[{"location":{"range":{"end":{"character":26,"line":35},"start":{"character":25,"line":35}},"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"a:"}],"paddingRight":true,"position":{"character":23,"line":461}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":35},"start":{"character":36,"line":35}},"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"b:"}],"paddingRight":true,"position":{"character":33,"line":461}},{"kind":2,"label":[{"location":{"range":{"end":{"character":46,"line":545},"start":{"character":39,"line":545}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"objects:"}],"paddingRight":true,"position":{"character":37,"line":466}},{"kind":2,"label":[{"location":{"range":{"end":{"character":33,"line":66},"start":{"character":32,"line":66}},"uri":"{{context-0:package-root:sky_engine}}lib/core/identical.dart"},"value":"a:"}],"paddingRight":true,"position":{"character":18,"line":642}},{"kind":2,"label":[{"location":{"range":{"end":{"character":44,"line":66},"start":{"character":43,"line":66}},"uri":"{{context-0:package-root:sky_engine}}lib/core/identical.dart"},"value":"b:"}],"paddingRight":true,"position":{"character":24,"line":642}},{"kind":2,"label":[{"location":{"range":{"end":{"character":26,"line":35},"start":{"character":25,"line":35}},"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"a:"}],"paddingRight":true,"position":{"character":23,"line":645}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":35},"start":{"character":36,"line":35}},"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"b:"}],"paddingRight":true,"position":{"character":33,"line":645}},{"kind":2,"label":[{"location":{"range":{"end":{"character":46,"line":545},"start":{"character":39,"line":545}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"objects:"}],"paddingRight":true,"position":{"character":37,"line":650}},{"kind":2,"label":[{"location":{"range":{"end":{"character":33,"line":66},"start":{"character":32,"line":66}},"uri":"{{context-0:package-root:sky_engine}}lib/core/identical.dart"},"value":"a:"}],"paddingRight":true,"position":{"character":18,"line":721}},{"kind":2,"label":[{"location":{"range":{"end":{"character":44,"line":66},"start":{"character":43,"line":66}},"uri":"{{context-0:package-root:sky_engine}}lib/core/identical.dart"},"value":"b:"}],"paddingRight":true,"position":{"character":24,"line":721}},{"kind":2,"label":[{"location":{"range":{"end":{"character":26,"line":35},"start":{"character":25,"line":35}},"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"a:"}],"paddingRight":true,"position":{"character":23,"line":724}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":35},"start":{"character":36,"line":35}},"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"b:"}],"paddingRight":true,"position":{"character":33,"line":724}},{"kind":2,"label":[{"location":{"range":{"end":{"character":46,"line":545},"start":{"character":39,"line":545}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"objects:"}],"paddingRight":true,"position":{"character":37,"line":729}},{"kind":2,"label":[{"location":{"range":{"end":{"character":33,"line":66},"start":{"character":32,"line":66}},"uri":"{{context-0:package-root:sky_engine}}lib/core/identical.dart"},"value":"a:"}],"paddingRight":true,"position":{"character":18,"line":757}},{"kind":2,"label":[{"location":{"range":{"end":{"character":44,"line":66},"start":{"character":43,"line":66}},"uri":"{{context-0:package-root:sky_engine}}lib/core/identical.dart"},"value":"b:"}],"paddingRight":true,"position":{"character":24,"line":757}},{"kind":2,"label":[{"location":{"range":{"end":{"character":26,"line":35},"start":{"character":25,"line":35}},"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"a:"}],"paddingRight":true,"position":{"character":23,"line":760}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":35},"start":{"character":36,"line":35}},"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"b:"}],"paddingRight":true,"position":{"character":33,"line":760}},{"kind":2,"label":[{"location":{"range":{"end":{"character":46,"line":545},"start":{"character":39,"line":545}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"objects:"}],"paddingRight":true,"position":{"character":37,"line":765}},{"kind":2,"label":[{"location":{"range":{"end":{"character":24,"line":73},"start":{"character":20,"line":73}},"uri":"{{context-0:package-root:flutter}}lib/src/foundation/serialization.dart"},"value":"byte:"}],"paddingRight":true,"position":{"character":22,"line":773}},{"kind":2,"label":[{"location":{"range":{"end":{"character":25,"line":100},"start":{"character":20,"line":100}},"uri":"{{context-0:package-root:flutter}}lib/src/foundation/serialization.dart"},"value":"value:"}],"paddingRight":true,"position":{"character":22,"line":774}},{"kind":2,"label":[{"location":{"range":{"end":{"character":24,"line":73},"start":{"character":20,"line":73}},"uri":"{{context-0:package-root:flutter}}lib/src/foundation/serialization.dart"},"value":"byte:"}],"paddingRight":true,"position":{"character":22,"line":776}},{"kind":2,"label":[{"location":{"range":{"end":{"character":36,"line":771},"start":{"character":30,"line":771}},"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"buffer:"}],"paddingRight":true,"position":{"character":17,"line":777}},{"kind":2,"label":[{"location":{"range":{"end":{"character":51,"line":771},"start":{"character":46,"line":771}},"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"value:"}],"paddingRight":true,"position":{"character":25,"line":777}},{"kind":2,"label":[{"location":{"range":{"end":{"character":24,"line":73},"start":{"character":20,"line":73}},"uri":"{{context-0:package-root:flutter}}lib/src/foundation/serialization.dart"},"value":"byte:"}],"paddingRight":true,"position":{"character":22,"line":779}},{"kind":2,"label":[{"location":{"range":{"end":{"character":36,"line":771},"start":{"character":30,"line":771}},"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"buffer:"}],"paddingRight":true,"position":{"character":17,"line":780}},{"kind":2,"label":[{"location":{"range":{"end":{"character":51,"line":771},"start":{"character":46,"line":771}},"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"value:"}],"paddingRight":true,"position":{"character":25,"line":780}},{"kind":2,"label":[{"location":{"range":{"end":{"character":24,"line":73},"start":{"character":20,"line":73}},"uri":"{{context-0:package-root:flutter}}lib/src/foundation/serialization.dart"},"value":"byte:"}],"paddingRight":true,"position":{"character":22,"line":782}},{"kind":2,"label":[{"location":{"range":{"end":{"character":36,"line":771},"start":{"character":30,"line":771}},"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"buffer:"}],"paddingRight":true,"position":{"character":17,"line":783}},{"kind":2,"label":[{"location":{"range":{"end":{"character":51,"line":771},"start":{"character":46,"line":771}},"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"value:"}],"paddingRight":true,"position":{"character":25,"line":783}},{"kind":2,"label":[{"location":{"range":{"end":{"character":24,"line":73},"start":{"character":20,"line":73}},"uri":"{{context-0:package-root:flutter}}lib/src/foundation/serialization.dart"},"value":"byte:"}],"paddingRight":true,"position":{"character":22,"line":785}},{"kind":2,"label":[{"location":{"range":{"end":{"character":36,"line":771},"start":{"character":30,"line":771}},"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"buffer:"}],"paddingRight":true,"position":{"character":17,"line":786}},{"kind":2,"label":[{"location":{"range":{"end":{"character":51,"line":771},"start":{"character":46,"line":771}},"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"value:"}],"paddingRight":true,"position":{"character":25,"line":786}},{"kind":2,"label":[{"location":{"range":{"end":{"character":24,"line":73},"start":{"character":20,"line":73}},"uri":"{{context-0:package-root:flutter}}lib/src/foundation/serialization.dart"},"value":"byte:"}],"paddingRight":true,"position":{"character":22,"line":788}},{"kind":2,"label":[{"location":{"range":{"end":{"character":36,"line":771},"start":{"character":30,"line":771}},"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"buffer:"}],"paddingRight":true,"position":{"character":17,"line":789}},{"kind":2,"label":[{"location":{"range":{"end":{"character":51,"line":771},"start":{"character":46,"line":771}},"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"value:"}],"paddingRight":true,"position":{"character":25,"line":789}},{"kind":2,"label":[{"location":{"range":{"end":{"character":24,"line":73},"start":{"character":20,"line":73}},"uri":"{{context-0:package-root:flutter}}lib/src/foundation/serialization.dart"},"value":"byte:"}],"paddingRight":true,"position":{"character":22,"line":791}},{"kind":2,"label":[{"location":{"range":{"end":{"character":36,"line":771},"start":{"character":30,"line":771}},"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"buffer:"}],"paddingRight":true,"position":{"character":17,"line":792}},{"kind":2,"label":[{"location":{"range":{"end":{"character":51,"line":771},"start":{"character":46,"line":771}},"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"value:"}],"paddingRight":true,"position":{"character":25,"line":792}},{"kind":2,"label":[{"location":{"range":{"end":{"character":24,"line":73},"start":{"character":20,"line":73}},"uri":"{{context-0:package-root:flutter}}lib/src/foundation/serialization.dart"},"value":"byte:"}],"paddingRight":true,"position":{"character":22,"line":794}},{"kind":2,"label":[{"location":{"range":{"end":{"character":36,"line":771},"start":{"character":30,"line":771}},"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"buffer:"}],"paddingRight":true,"position":{"character":17,"line":795}},{"kind":2,"label":[{"location":{"range":{"end":{"character":51,"line":771},"start":{"character":46,"line":771}},"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"value:"}],"paddingRight":true,"position":{"character":25,"line":795}},{"kind":2,"label":[{"location":{"range":{"end":{"character":24,"line":73},"start":{"character":20,"line":73}},"uri":"{{context-0:package-root:flutter}}lib/src/foundation/serialization.dart"},"value":"byte:"}],"paddingRight":true,"position":{"character":22,"line":797}},{"kind":2,"label":[{"location":{"range":{"end":{"character":36,"line":771},"start":{"character":30,"line":771}},"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"buffer:"}],"paddingRight":true,"position":{"character":17,"line":798}},{"kind":2,"label":[{"location":{"range":{"end":{"character":51,"line":771},"start":{"character":46,"line":771}},"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"value:"}],"paddingRight":true,"position":{"character":25,"line":798}},{"kind":2,"label":[{"location":{"range":{"end":{"character":36,"line":382},"start":{"character":30,"line":382}},"uri":"{{context-0:package-root:flutter}}lib/src/services/message_codecs.dart"},"value":"buffer:"}],"paddingRight":true,"position":{"character":23,"line":800}},{"kind":2,"label":[{"location":{"range":{"end":{"character":51,"line":382},"start":{"character":46,"line":382}},"uri":"{{context-0:package-root:flutter}}lib/src/services/message_codecs.dart"},"value":"value:"}],"paddingRight":true,"position":{"character":31,"line":800}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":471},"start":{"character":31,"line":471}},"uri":"{{context-0:package-root:flutter}}lib/src/services/message_codecs.dart"},"value":"buffer:"}],"paddingRight":true,"position":{"character":32,"line":808}},{"kind":1,"label":[{"location":{"range":{"end":{"character":24,"line":27},"start":{"character":21,"line":27}},"uri":"{{context-0:package-root:sky_engine}}lib/core/int.dart"},"value":"int"},{"value":"?"}],"paddingRight":true,"position":{"character":14,"line":808}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":471},"start":{"character":31,"line":471}},"uri":"{{context-0:package-root:flutter}}lib/src/services/message_codecs.dart"},"value":"buffer:"}],"paddingRight":true,"position":{"character":32,"line":811}},{"kind":1,"label":[{"location":{"range":{"end":{"character":24,"line":27},"start":{"character":21,"line":27}},"uri":"{{context-0:package-root:sky_engine}}lib/core/int.dart"},"value":"int"},{"value":"?"}],"paddingRight":true,"position":{"character":14,"line":811}},{"kind":2,"label":[{"location":{"range":{"end":{"character":41,"line":70},"start":{"character":35,"line":70}},"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"result:"}],"paddingRight":true,"position":{"character":34,"line":814}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":471},"start":{"character":31,"line":471}},"uri":"{{context-0:package-root:flutter}}lib/src/services/message_codecs.dart"},"value":"buffer:"}],"paddingRight":true,"position":{"character":44,"line":814}},{"kind":2,"label":[{"location":{"range":{"end":{"character":38,"line":218},"start":{"character":32,"line":218}},"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"result:"}],"paddingRight":true,"position":{"character":31,"line":816}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":471},"start":{"character":31,"line":471}},"uri":"{{context-0:package-root:flutter}}lib/src/services/message_codecs.dart"},"value":"buffer:"}],"paddingRight":true,"position":{"character":41,"line":816}},{"kind":2,"label":[{"location":{"range":{"end":{"character":46,"line":409},"start":{"character":40,"line":409}},"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"result:"}],"paddingRight":true,"position":{"character":39,"line":818}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":471},"start":{"character":31,"line":471}},"uri":"{{context-0:package-root:flutter}}lib/src/services/message_codecs.dart"},"value":"buffer:"}],"paddingRight":true,"position":{"character":49,"line":818}},{"kind":2,"label":[{"location":{"range":{"end":{"character":62,"line":597},"start":{"character":56,"line":597}},"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"result:"}],"paddingRight":true,"position":{"character":55,"line":820}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":471},"start":{"character":31,"line":471}},"uri":"{{context-0:package-root:flutter}}lib/src/services/message_codecs.dart"},"value":"buffer:"}],"paddingRight":true,"position":{"character":65,"line":820}},{"kind":2,"label":[{"location":{"range":{"end":{"character":47,"line":699},"start":{"character":41,"line":699}},"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"result:"}],"paddingRight":true,"position":{"character":40,"line":822}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":471},"start":{"character":31,"line":471}},"uri":"{{context-0:package-root:flutter}}lib/src/services/message_codecs.dart"},"value":"buffer:"}],"paddingRight":true,"position":{"character":50,"line":822}},{"kind":2,"label":[{"location":{"range":{"end":{"character":41,"line":746},"start":{"character":35,"line":746}},"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"result:"}],"paddingRight":true,"position":{"character":34,"line":824}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":471},"start":{"character":31,"line":471}},"uri":"{{context-0:package-root:flutter}}lib/src/services/message_codecs.dart"},"value":"buffer:"}],"paddingRight":true,"position":{"character":44,"line":824}},{"kind":2,"label":[{"location":{"range":{"end":{"character":34,"line":484},"start":{"character":30,"line":484}},"uri":"{{context-0:package-root:flutter}}lib/src/services/message_codecs.dart"},"value":"type:"}],"paddingRight":true,"position":{"character":37,"line":826}},{"kind":2,"label":[{"location":{"range":{"end":{"character":53,"line":484},"start":{"character":47,"line":484}},"uri":"{{context-0:package-root:flutter}}lib/src/services/message_codecs.dart"},"value":"buffer:"}],"paddingRight":true,"position":{"character":43,"line":826}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":853}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":856}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":857}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":855}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":72,"line":860}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":861}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":863}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":877}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":880}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":881}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":879}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":885}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":887}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":889}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":908}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":911}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":912}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":910}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":72,"line":915}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":916}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":918}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":932}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":935}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":936}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":934}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":72,"line":939}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":940}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":942}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":956}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":959}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":960}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":958}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":72,"line":963}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":964}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":966}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":980}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":983}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":984}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":982}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":988}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":990}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":992}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":1011}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":1014}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":1015}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":1013}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":1019}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":1021}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":1023}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":1042}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":1045}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":1046}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":1044}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":1050}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":1052}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":1054}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":1073}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":1076}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":1077}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":1075}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":1081}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":1083}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":1085}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":1104}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":1107}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":1108}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":1106}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":1112}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":1114}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":1116}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":1135}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":1138}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":1139}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":1137}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":1143}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":1145}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":1147}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":1166}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":1169}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":1170}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":1168}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":1174}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":1176}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":1178}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":1197}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":1200}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":1201}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":1199}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":1205}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":1207}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":1209}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":1230}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":1233}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":1234}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":1232}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":1238}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":1240}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":1242}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":1262}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":1265}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":1266}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":1264}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":1270}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":1272}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":1274}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":1295}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":1298}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":1299}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":1297}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":1303}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":1305}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":1307}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":1327}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":1330}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":1331}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":1329}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":1335}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":1337}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":1339}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":1361}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":1364}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":1365}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":1363}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":1369}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":1371}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":1373}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":1393}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":1396}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":1397}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":1395}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":1401}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":1403}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":1405}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":1427}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":1430}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":1431}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":1429}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":1435}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":1437}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":1439}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":1461}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":1464}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":1465}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":1463}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":1469}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":1471}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":1473}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":1495}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":1498}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":1499}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":1497}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":1503}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":1505}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":1507}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":1527}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":1530}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":1531}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":1529}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":1535}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":1537}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":1539}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":1561}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":1564}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":1565}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":1563}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":1569}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":1571}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":1573}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":1595}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":1598}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":1599}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":1597}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":1603}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":1605}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":1607}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":1627}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":1630}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":1631}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":1629}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":1635}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":1637}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":1639}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":1658}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":1661}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":1662}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":1660}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":1666}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":1668}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":1670}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":1689}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":1692}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":1693}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":1691}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":1697}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":1699}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":1701}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":1720}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":1723}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":1724}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":1722}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":1728}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":1730}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":1732}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":1751}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":1754}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":1755}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":1753}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":1759}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":1761}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":1763}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":1782}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":1785}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":1786}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":1784}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":1790}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":1792}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":1794}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":1815}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":1818}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":1819}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":1817}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":1823}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":1825}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":1827}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":1844}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":1847}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":1848}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":1846}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":1852}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":1854}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":1856}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":1871}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":1874}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":1875}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":1873}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":1879}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":1881}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":1883}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":1900}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":1903}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":1904}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":1902}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":1908}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":1910}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":1912}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":1935}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":1938}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":1939}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":1937}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":1943}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":1945}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":1947}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":1971}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":1974}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":1975}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":1973}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":1979}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":1981}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":1983}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":2002}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":2005}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":2006}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":2004}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":2010}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":2012}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":2014}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":2028}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":2031}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":2032}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":2030}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":2036}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":2038}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":2040}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":2054}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":2057}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":2058}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":2056}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":2062}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":2064}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":2066}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":2080}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":2083}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":2084}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":2082}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":2088}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":2090}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":2092}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":2108}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":2111}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":2112}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":2110}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":2116}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":2118}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":2120}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":2134}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":2137}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":2138}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":2136}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":2142}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":2144}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":2146}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":2160}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":2163}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":2164}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":2162}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":2168}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":2170}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":2172}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":2186}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":2189}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":2190}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":2188}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":2194}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":2196}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":2198}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":2214}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":2217}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":2218}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":2216}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":2222}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":2224}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":2226}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":2243}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":2246}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":2247}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":2245}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":2251}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":2253}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":2255}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":2271}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":2274}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":2275}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":2273}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":2279}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":2281}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":2283}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":2300}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":2303}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":2304}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":2302}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":2308}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":2310}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":2312}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":2329}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":2332}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":2333}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":2331}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":2337}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":2339}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":2341}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":2356}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":2359}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":2360}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":2358}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":2364}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":2366}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":2368}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":2385}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":2388}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":2389}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":2387}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":2393}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":2395}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":2397}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":2414}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":2417}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":2418}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":2416}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":2422}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":2424}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":2426}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":2443}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":2446}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":2447}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":2445}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":2451}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":2453}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":2455}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":2472}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":2475}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":2476}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":2474}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":2480}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":2482}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":2484}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":2501}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":2504}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":2505}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":2503}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":2509}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":2511}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":2513}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":2530}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":2533}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":2534}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":2532}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":2538}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":2540}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":2542}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":2556}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":2559}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":2560}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":2558}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":2564}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":2566}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":2568}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":2581}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":2584}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":2585}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":2583}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":2589}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":2591}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":2593}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":2607}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":2610}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":2611}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":2609}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":2615}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":2617}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":2619}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":2633}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":2636}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":2637}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":2635}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":2641}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":2643}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":2645}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":2660}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":2663}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":2664}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":2662}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":72,"line":2667}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":2668}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":2670}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":2684}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":2687}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":2688}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":2686}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":2692}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":2694}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":2696}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":2715}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":2718}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":2719}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":2717}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":2723}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":2725}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":2727}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":2746}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":2749}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":2750}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":2748}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":2754}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":2756}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":2758}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":2777}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":2780}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":2781}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":2779}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":2785}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":2787}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":2789}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":2808}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":2811}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":2812}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":2810}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":2816}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":2818}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":2820}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":2839}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":2842}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":2843}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":2841}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":2847}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":2849}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":2851}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":2870}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":2873}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":2874}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":2872}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":2878}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":2880}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":2882}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":2901}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":2904}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":2905}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":2903}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":2909}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":2911}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":2913}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":2934}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":2937}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":2938}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":2936}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":2942}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":2944}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":2946}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":2966}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":2969}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":2970}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":2968}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":2974}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":2976}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":2978}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":3000}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":3003}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":3004}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":3002}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":3008}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":3010}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":3012}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":3032}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":3035}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":3036}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":3034}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":3040}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":3042}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":3044}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":3066}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":3069}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":3070}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":3068}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":3074}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":3076}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":3078}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":3100}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":3103}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":3104}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":3102}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":3108}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":3110}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":3112}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":3132}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":3135}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":3136}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":3134}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":3140}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":3142}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":3144}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":3163}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":3166}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":3167}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":3165}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":3171}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":3173}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":3175}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":3194}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":3197}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":3198}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":3196}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":72,"line":3201}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":3202}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":3204}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":3218}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":3221}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":3222}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":3220}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":72,"line":3225}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":3226}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":3228}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":3242}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":3245}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":3246}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":3244}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":72,"line":3249}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":3250}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":3252}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":3266}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":3269}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":3270}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":3268}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":3274}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":3276}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":3278}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":3299}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":3302}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":3303}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":3301}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":3307}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":3309}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":3311}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":3328}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":3331}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":3332}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":3330}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":3336}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":3338}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":3340}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":3354}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":3357}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":3358}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":3356}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":3362}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":3364}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":3366}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":3380}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":3383}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":3384}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":3382}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":3388}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":3390}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":3392}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":3406}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":3409}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":3410}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":3408}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":3414}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":3416}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":3418}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":3432}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":3435}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":3436}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":3434}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":3440}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":3442}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":3444}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":3458}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":3461}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":3462}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":3460}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":3466}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":3468}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":3470}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":3484}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":3487}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":3488}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":3486}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":3492}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":3494}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":3496}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":3510}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":3513}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":3514}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":3512}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":3518}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":3520}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":3522}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":3538}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":3541}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":3542}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":3540}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":3546}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":3548}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":3550}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":3566}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":3569}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":3570}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":3568}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":3574}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":3576}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":3578}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":3595}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":3598}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":3599}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":3597}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":3603}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":3605}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":3607}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":3624}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":3627}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":3628}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":3626}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":3632}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":3634}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":3636}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":3653}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":3656}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":3657}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":3655}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":3661}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":3663}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":3665}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":3682}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":3685}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":3686}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":3684}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":3690}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":3692}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":3694}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":3711}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":3714}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":3715}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":3713}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":3719}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":3721}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":3723}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":3738}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":3741}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":3742}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":3740}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":3746}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":3748}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":3750}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":3766}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":3769}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":3770}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":3768}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":3774}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":3776}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":3778}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":3793}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":3796}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":3797}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":3795}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":72,"line":3800}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":3801}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":3803}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":3823}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":3826}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":3827}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":3825}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":72,"line":3830}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":3831}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":3833}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":3851}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":3854}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":3855}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":3853}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":72,"line":3858}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":3859}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":3861}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":3874}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":3877}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":3878}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":3876}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":72,"line":3881}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":3882}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":3884}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":3897}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":3900}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":3901}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":3899}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":72,"line":3904}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":3905}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":3907}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":3920}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":3923}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":3924}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":3922}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":3928}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":3930}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":3932}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":3952}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":3955}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":3956}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":3954}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":3960}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":3962}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":3964}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":3981}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":3984}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":3985}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":3983}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":3989}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":3991}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":3993}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":4014}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":4017}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":4018}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":4016}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":4022}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":4024}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":4026}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":4044}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":4047}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":4048}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":4046}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":4052}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":4054}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":4056}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":4074}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":4077}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":4078}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":4076}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":4082}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":4084}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":4086}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":4104}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":4107}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":4108}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":4106}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":4112}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":4114}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":4116}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":4134}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":4137}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":4138}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":4136}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":4142}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":4144}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":4146}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":4164}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":4167}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":4168}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":4166}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":4172}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":4174}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":4176}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":4194}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":4197}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":4198}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":4196}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":4202}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":4204}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":4206}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":4224}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":4227}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":4228}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":4226}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":4232}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":4234}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":4236}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":4254}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":4257}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":4258}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":4256}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":4262}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":4264}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":4266}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":4286}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":4289}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":4290}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":4288}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":4294}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":4296}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":4298}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":4319}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":4322}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":4323}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":4321}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":4327}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":4329}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":4331}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":4351}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":4354}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":4355}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":4353}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":4359}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":4361}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":4363}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":4384}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":4387}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":4388}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":4386}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":4392}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":4394}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":4396}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":4417}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":4420}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":4421}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":4419}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":4425}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":4427}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":4429}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":4448}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":4451}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":4452}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":4450}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":4456}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":4458}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":4460}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":4481}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":4484}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":4485}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":4483}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":4489}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":4491}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":4493}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":4514}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":4517}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":4518}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":4516}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":4522}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":4524}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":4526}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":4547}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":4550}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":4551}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":4549}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":4555}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":4557}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":4559}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":4580}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":4583}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":4584}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":4582}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":4588}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":4590}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":4592}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":4613}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":4616}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":4617}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":4615}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":4621}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":4623}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":4625}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":4646}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":4649}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":4650}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":4648}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":4654}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":4656}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":4658}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":4677}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":4680}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":4681}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":4679}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":4685}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":4687}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":4689}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":4709}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":4712}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":4713}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":4711}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":4717}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":4719}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":4721}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":4739}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":4742}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":4743}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":4741}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":4747}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":4749}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":4751}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":4764}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":4767}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":4768}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":4766}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":4772}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":4774}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":4776}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":4789}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":4792}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":4793}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":4791}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":4797}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":4799}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":4801}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":4814}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":4817}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":4818}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":4816}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":4822}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":4824}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":4826}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":4839}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":4842}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":4843}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":4841}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":4847}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":4849}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":4851}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":4866}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":4869}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":4870}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":4868}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":4874}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":4876}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":4878}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":4893}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":4896}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":4897}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":4895}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":4901}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":4903}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":4905}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":4920}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":4923}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":4924}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":4922}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":4928}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":4930}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":4932}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":4948}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":4951}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":4952}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":4950}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":4956}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":4958}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":4960}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":4975}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":4978}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":4979}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":4977}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":4983}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":4985}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":4987}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":5003}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":5006}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":5007}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":5005}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":5011}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":5013}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":5015}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":5031}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":5034}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":5035}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":5033}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":5039}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":5041}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":5043}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":5059}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":5062}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":5063}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":5061}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":5067}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":5069}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":5071}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":5087}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":5090}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":5091}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":5089}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":5095}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":5097}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":5099}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":5115}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":5118}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":5119}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":5117}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":5123}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":5125}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":5127}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":5143}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":5146}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":5147}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":5145}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":5151}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":5153}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":5155}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":5171}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":5174}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":5175}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":5173}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":5179}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":5181}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":5183}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":5199}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":5202}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":5203}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":5201}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":5207}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":5209}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":5211}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":5227}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":5230}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":5231}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":5229}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":5235}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":5237}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":5239}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":5253}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":5256}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":5257}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":5255}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":5261}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":5263}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":5265}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":5280}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":5283}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":5284}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":5282}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":5288}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":5290}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":5292}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":5305}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":5308}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":5309}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":5307}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":5313}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":5315}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":5317}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":8,"line":5538}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":8,"line":5539}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":12,"line":5537}},{"kind":2,"label":[{"value":"handler:"}],"paddingRight":true,"position":{"character":44,"line":5543}},{"kind":2,"label":[{"value":"handler:"}],"paddingRight":true,"position":{"character":44,"line":5545}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":8,"line":5561}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":8,"line":5562}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":12,"line":5560}},{"kind":2,"label":[{"value":"handler:"}],"paddingRight":true,"position":{"character":44,"line":5566}},{"kind":2,"label":[{"value":"handler:"}],"paddingRight":true,"position":{"character":44,"line":5568}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":8,"line":5584}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":8,"line":5585}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":12,"line":5583}},{"kind":2,"label":[{"value":"handler:"}],"paddingRight":true,"position":{"character":44,"line":5589}},{"kind":2,"label":[{"value":"handler:"}],"paddingRight":true,"position":{"character":44,"line":5591}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":8,"line":5607}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":8,"line":5608}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":12,"line":5606}},{"kind":2,"label":[{"value":"handler:"}],"paddingRight":true,"position":{"character":44,"line":5612}},{"kind":2,"label":[{"value":"handler:"}],"paddingRight":true,"position":{"character":44,"line":5614}},{"kind":2,"label":[{"location":{"range":{"end":{"character":43,"line":5351},"start":{"character":33,"line":5351}},"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"everything:"}],"paddingRight":true,"position":{"character":53,"line":5626}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":8,"line":5640}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":8,"line":5641}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":12,"line":5639}},{"kind":2,"label":[{"value":"handler:"}],"paddingRight":true,"position":{"character":44,"line":5645}},{"kind":2,"label":[{"value":"handler:"}],"paddingRight":true,"position":{"character":44,"line":5647}},{"kind":2,"label":[{"location":{"range":{"end":{"character":69,"line":5354},"start":{"character":59,"line":5354}},"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"everything:"}],"paddingRight":true,"position":{"character":14,"line":5657}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":8,"line":5672}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":8,"line":5673}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":12,"line":5671}},{"kind":2,"label":[{"value":"handler:"}],"paddingRight":true,"position":{"character":44,"line":5677}},{"kind":2,"label":[{"value":"handler:"}],"paddingRight":true,"position":{"character":44,"line":5679}},{"kind":2,"label":[{"location":{"range":{"end":{"character":23,"line":5360},"start":{"character":10,"line":5360}},"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"aNullableBool:"}],"paddingRight":true,"position":{"character":14,"line":5690}},{"kind":2,"label":[{"location":{"range":{"end":{"character":21,"line":5361},"start":{"character":9,"line":5361}},"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"aNullableInt:"}],"paddingRight":true,"position":{"character":14,"line":5691}},{"kind":2,"label":[{"location":{"range":{"end":{"character":27,"line":5362},"start":{"character":12,"line":5362}},"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"aNullableString:"}],"paddingRight":true,"position":{"character":14,"line":5692}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":8,"line":5707}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":8,"line":5708}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":12,"line":5706}},{"kind":2,"label":[{"value":"handler:"}],"paddingRight":true,"position":{"character":44,"line":5712}},{"kind":2,"label":[{"value":"handler:"}],"paddingRight":true,"position":{"character":44,"line":5714}},{"kind":2,"label":[{"location":{"range":{"end":{"character":48,"line":5367},"start":{"character":38,"line":5367}},"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"everything:"}],"paddingRight":true,"position":{"character":54,"line":5724}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":8,"line":5738}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":8,"line":5739}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":12,"line":5737}},{"kind":2,"label":[{"value":"handler:"}],"paddingRight":true,"position":{"character":44,"line":5743}},{"kind":2,"label":[{"value":"handler:"}],"paddingRight":true,"position":{"character":44,"line":5745}},{"kind":2,"label":[{"location":{"range":{"end":{"character":23,"line":5374},"start":{"character":10,"line":5374}},"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"aNullableBool:"}],"paddingRight":true,"position":{"character":18,"line":5757}},{"kind":2,"label":[{"location":{"range":{"end":{"character":21,"line":5375},"start":{"character":9,"line":5375}},"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"aNullableInt:"}],"paddingRight":true,"position":{"character":18,"line":5758}},{"kind":2,"label":[{"location":{"range":{"end":{"character":27,"line":5376},"start":{"character":12,"line":5376}},"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"aNullableString:"}],"paddingRight":true,"position":{"character":18,"line":5759}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":8,"line":5774}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":8,"line":5775}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":12,"line":5773}},{"kind":2,"label":[{"value":"handler:"}],"paddingRight":true,"position":{"character":44,"line":5779}},{"kind":2,"label":[{"value":"handler:"}],"paddingRight":true,"position":{"character":44,"line":5781}},{"kind":2,"label":[{"location":{"range":{"end":{"character":26,"line":5380},"start":{"character":21,"line":5380}},"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"aBool:"}],"paddingRight":true,"position":{"character":45,"line":5793}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":8,"line":5807}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":8,"line":5808}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":12,"line":5806}},{"kind":2,"label":[{"value":"handler:"}],"paddingRight":true,"position":{"character":44,"line":5812}},{"kind":2,"label":[{"value":"handler:"}],"paddingRight":true,"position":{"character":44,"line":5814}},{"kind":2,"label":[{"location":{"range":{"end":{"character":23,"line":5383},"start":{"character":18,"line":5383}},"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"anInt:"}],"paddingRight":true,"position":{"character":43,"line":5826}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":8,"line":5840}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":8,"line":5841}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":12,"line":5839}},{"kind":2,"label":[{"value":"handler:"}],"paddingRight":true,"position":{"character":44,"line":5845}},{"kind":2,"label":[{"value":"handler:"}],"paddingRight":true,"position":{"character":44,"line":5847}},{"kind":2,"label":[{"location":{"range":{"end":{"character":34,"line":5386},"start":{"character":27,"line":5386}},"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"aDouble:"}],"paddingRight":true,"position":{"character":49,"line":5859}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":8,"line":5873}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":8,"line":5874}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":12,"line":5872}},{"kind":2,"label":[{"value":"handler:"}],"paddingRight":true,"position":{"character":44,"line":5878}},{"kind":2,"label":[{"value":"handler:"}],"paddingRight":true,"position":{"character":44,"line":5880}},{"kind":2,"label":[{"location":{"range":{"end":{"character":34,"line":5389},"start":{"character":27,"line":5389}},"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"aString:"}],"paddingRight":true,"position":{"character":49,"line":5892}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":8,"line":5906}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":8,"line":5907}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":12,"line":5905}},{"kind":2,"label":[{"value":"handler:"}],"paddingRight":true,"position":{"character":44,"line":5911}},{"kind":2,"label":[{"value":"handler:"}],"paddingRight":true,"position":{"character":44,"line":5913}},{"kind":2,"label":[{"location":{"range":{"end":{"character":40,"line":5392},"start":{"character":36,"line":5392}},"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"list:"}],"paddingRight":true,"position":{"character":55,"line":5925}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":8,"line":5939}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":8,"line":5940}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":12,"line":5938}},{"kind":2,"label":[{"value":"handler:"}],"paddingRight":true,"position":{"character":44,"line":5944}},{"kind":2,"label":[{"value":"handler:"}],"paddingRight":true,"position":{"character":44,"line":5946}},{"kind":2,"label":[{"location":{"range":{"end":{"character":43,"line":5395},"start":{"character":39,"line":5395}},"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"list:"}],"paddingRight":true,"position":{"character":54,"line":5959}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":8,"line":5973}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":8,"line":5974}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":12,"line":5972}},{"kind":2,"label":[{"value":"handler:"}],"paddingRight":true,"position":{"character":44,"line":5978}},{"kind":2,"label":[{"value":"handler:"}],"paddingRight":true,"position":{"character":44,"line":5980}},{"kind":2,"label":[{"location":{"range":{"end":{"character":51,"line":5398},"start":{"character":43,"line":5398}},"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"enumList:"}],"paddingRight":true,"position":{"character":58,"line":5993}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":8,"line":6007}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":8,"line":6008}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":12,"line":6006}},{"kind":2,"label":[{"value":"handler:"}],"paddingRight":true,"position":{"character":44,"line":6012}},{"kind":2,"label":[{"value":"handler:"}],"paddingRight":true,"position":{"character":44,"line":6014}},{"kind":2,"label":[{"location":{"range":{"end":{"character":73,"line":5401},"start":{"character":64,"line":5401}},"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"classList:"}],"paddingRight":true,"position":{"character":14,"line":6028}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":8,"line":6043}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":8,"line":6044}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":12,"line":6042}},{"kind":2,"label":[{"value":"handler:"}],"paddingRight":true,"position":{"character":44,"line":6048}},{"kind":2,"label":[{"value":"handler:"}],"paddingRight":true,"position":{"character":44,"line":6050}},{"kind":2,"label":[{"location":{"range":{"end":{"character":56,"line":5404},"start":{"character":48,"line":5404}},"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"enumList:"}],"paddingRight":true,"position":{"character":64,"line":6063}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":8,"line":6077}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":8,"line":6078}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":12,"line":6076}},{"kind":2,"label":[{"value":"handler:"}],"paddingRight":true,"position":{"character":44,"line":6082}},{"kind":2,"label":[{"value":"handler:"}],"paddingRight":true,"position":{"character":44,"line":6084}},{"kind":2,"label":[{"location":{"range":{"end":{"character":78,"line":5407},"start":{"character":69,"line":5407}},"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"classList:"}],"paddingRight":true,"position":{"character":14,"line":6098}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":8,"line":6113}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":8,"line":6114}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":12,"line":6112}},{"kind":2,"label":[{"value":"handler:"}],"paddingRight":true,"position":{"character":44,"line":6118}},{"kind":2,"label":[{"value":"handler:"}],"paddingRight":true,"position":{"character":44,"line":6120}},{"kind":2,"label":[{"location":{"range":{"end":{"character":57,"line":5410},"start":{"character":54,"line":5410}},"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"map:"}],"paddingRight":true,"position":{"character":61,"line":6133}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":8,"line":6147}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":8,"line":6148}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":12,"line":6146}},{"kind":2,"label":[{"value":"handler:"}],"paddingRight":true,"position":{"character":44,"line":6152}},{"kind":2,"label":[{"value":"handler:"}],"paddingRight":true,"position":{"character":44,"line":6154}},{"kind":2,"label":[{"location":{"range":{"end":{"character":69,"line":5413},"start":{"character":60,"line":5413}},"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"stringMap:"}],"paddingRight":true,"position":{"character":14,"line":6168}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":8,"line":6183}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":8,"line":6184}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":12,"line":6182}},{"kind":2,"label":[{"value":"handler:"}],"paddingRight":true,"position":{"character":44,"line":6188}},{"kind":2,"label":[{"value":"handler:"}],"paddingRight":true,"position":{"character":44,"line":6190}},{"kind":2,"label":[{"location":{"range":{"end":{"character":51,"line":5416},"start":{"character":45,"line":5416}},"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"intMap:"}],"paddingRight":true,"position":{"character":58,"line":6203}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":8,"line":6217}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":8,"line":6218}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":12,"line":6216}},{"kind":2,"label":[{"value":"handler:"}],"paddingRight":true,"position":{"character":44,"line":6222}},{"kind":2,"label":[{"value":"handler:"}],"paddingRight":true,"position":{"character":44,"line":6224}},{"kind":2,"label":[{"location":{"range":{"end":{"character":65,"line":5419},"start":{"character":58,"line":5419}},"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"enumMap:"}],"paddingRight":true,"position":{"character":65,"line":6237}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":8,"line":6251}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":8,"line":6252}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":12,"line":6250}},{"kind":2,"label":[{"value":"handler:"}],"paddingRight":true,"position":{"character":44,"line":6256}},{"kind":2,"label":[{"value":"handler:"}],"paddingRight":true,"position":{"character":44,"line":6258}},{"kind":2,"label":[{"location":{"range":{"end":{"character":41,"line":5423},"start":{"character":33,"line":5423}},"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"classMap:"}],"paddingRight":true,"position":{"character":14,"line":6273}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":8,"line":6288}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":8,"line":6289}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":12,"line":6287}},{"kind":2,"label":[{"value":"handler:"}],"paddingRight":true,"position":{"character":44,"line":6293}},{"kind":2,"label":[{"value":"handler:"}],"paddingRight":true,"position":{"character":44,"line":6295}},{"kind":2,"label":[{"location":{"range":{"end":{"character":72,"line":5427},"start":{"character":63,"line":5427}},"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"stringMap:"}],"paddingRight":true,"position":{"character":14,"line":6309}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":8,"line":6324}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":8,"line":6325}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":12,"line":6323}},{"kind":2,"label":[{"value":"handler:"}],"paddingRight":true,"position":{"character":44,"line":6329}},{"kind":2,"label":[{"value":"handler:"}],"paddingRight":true,"position":{"character":44,"line":6331}},{"kind":2,"label":[{"location":{"range":{"end":{"character":54,"line":5430},"start":{"character":48,"line":5430}},"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"intMap:"}],"paddingRight":true,"position":{"character":63,"line":6344}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":8,"line":6358}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":8,"line":6359}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":12,"line":6357}},{"kind":2,"label":[{"value":"handler:"}],"paddingRight":true,"position":{"character":44,"line":6363}},{"kind":2,"label":[{"value":"handler:"}],"paddingRight":true,"position":{"character":44,"line":6365}},{"kind":2,"label":[{"location":{"range":{"end":{"character":68,"line":5433},"start":{"character":61,"line":5433}},"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"enumMap:"}],"paddingRight":true,"position":{"character":14,"line":6379}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":8,"line":6394}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":8,"line":6395}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":12,"line":6393}},{"kind":2,"label":[{"value":"handler:"}],"paddingRight":true,"position":{"character":44,"line":6399}},{"kind":2,"label":[{"value":"handler:"}],"paddingRight":true,"position":{"character":44,"line":6401}},{"kind":2,"label":[{"location":{"range":{"end":{"character":39,"line":5437},"start":{"character":31,"line":5437}},"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"classMap:"}],"paddingRight":true,"position":{"character":14,"line":6416}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":8,"line":6431}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":8,"line":6432}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":12,"line":6430}},{"kind":2,"label":[{"value":"handler:"}],"paddingRight":true,"position":{"character":44,"line":6436}},{"kind":2,"label":[{"value":"handler:"}],"paddingRight":true,"position":{"character":44,"line":6438}},{"kind":2,"label":[{"location":{"range":{"end":{"character":31,"line":5441},"start":{"character":25,"line":5441}},"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"anEnum:"}],"paddingRight":true,"position":{"character":47,"line":6450}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":8,"line":6464}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":8,"line":6465}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":12,"line":6463}},{"kind":2,"label":[{"value":"handler:"}],"paddingRight":true,"position":{"character":44,"line":6469}},{"kind":2,"label":[{"value":"handler:"}],"paddingRight":true,"position":{"character":44,"line":6471}},{"kind":2,"label":[{"location":{"range":{"end":{"character":53,"line":5444},"start":{"character":42,"line":5444}},"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"anotherEnum:"}],"paddingRight":true,"position":{"character":59,"line":6483}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":8,"line":6497}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":8,"line":6498}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":12,"line":6496}},{"kind":2,"label":[{"value":"handler:"}],"paddingRight":true,"position":{"character":44,"line":6502}},{"kind":2,"label":[{"value":"handler:"}],"paddingRight":true,"position":{"character":44,"line":6504}},{"kind":2,"label":[{"location":{"range":{"end":{"character":36,"line":5447},"start":{"character":31,"line":5447}},"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"aBool:"}],"paddingRight":true,"position":{"character":54,"line":6512}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":8,"line":6526}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":8,"line":6527}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":12,"line":6525}},{"kind":2,"label":[{"value":"handler:"}],"paddingRight":true,"position":{"character":44,"line":6531}},{"kind":2,"label":[{"value":"handler:"}],"paddingRight":true,"position":{"character":44,"line":6533}},{"kind":2,"label":[{"location":{"range":{"end":{"character":33,"line":5450},"start":{"character":28,"line":5450}},"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"anInt:"}],"paddingRight":true,"position":{"character":52,"line":6541}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":8,"line":6555}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":8,"line":6556}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":12,"line":6554}},{"kind":2,"label":[{"value":"handler:"}],"paddingRight":true,"position":{"character":44,"line":6560}},{"kind":2,"label":[{"value":"handler:"}],"paddingRight":true,"position":{"character":44,"line":6562}},{"kind":2,"label":[{"location":{"range":{"end":{"character":44,"line":5453},"start":{"character":37,"line":5453}},"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"aDouble:"}],"paddingRight":true,"position":{"character":58,"line":6570}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":8,"line":6584}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":8,"line":6585}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":12,"line":6583}},{"kind":2,"label":[{"value":"handler:"}],"paddingRight":true,"position":{"character":44,"line":6589}},{"kind":2,"label":[{"value":"handler:"}],"paddingRight":true,"position":{"character":44,"line":6591}},{"kind":2,"label":[{"location":{"range":{"end":{"character":44,"line":5456},"start":{"character":37,"line":5456}},"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"aString:"}],"paddingRight":true,"position":{"character":58,"line":6599}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":8,"line":6613}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":8,"line":6614}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":12,"line":6612}},{"kind":2,"label":[{"value":"handler:"}],"paddingRight":true,"position":{"character":44,"line":6618}},{"kind":2,"label":[{"value":"handler:"}],"paddingRight":true,"position":{"character":44,"line":6620}},{"kind":2,"label":[{"location":{"range":{"end":{"character":50,"line":5459},"start":{"character":46,"line":5459}},"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"list:"}],"paddingRight":true,"position":{"character":64,"line":6628}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":8,"line":6642}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":8,"line":6643}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":12,"line":6641}},{"kind":2,"label":[{"value":"handler:"}],"paddingRight":true,"position":{"character":44,"line":6647}},{"kind":2,"label":[{"value":"handler:"}],"paddingRight":true,"position":{"character":44,"line":6649}},{"kind":2,"label":[{"location":{"range":{"end":{"character":53,"line":5462},"start":{"character":49,"line":5462}},"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"list:"}],"paddingRight":true,"position":{"character":63,"line":6658}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":8,"line":6672}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":8,"line":6673}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":12,"line":6671}},{"kind":2,"label":[{"value":"handler:"}],"paddingRight":true,"position":{"character":44,"line":6677}},{"kind":2,"label":[{"value":"handler:"}],"paddingRight":true,"position":{"character":44,"line":6679}},{"kind":2,"label":[{"location":{"range":{"end":{"character":61,"line":5465},"start":{"character":53,"line":5465}},"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"enumList:"}],"paddingRight":true,"position":{"character":14,"line":6689}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":8,"line":6704}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":8,"line":6705}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":12,"line":6703}},{"kind":2,"label":[{"value":"handler:"}],"paddingRight":true,"position":{"character":44,"line":6709}},{"kind":2,"label":[{"value":"handler:"}],"paddingRight":true,"position":{"character":44,"line":6711}},{"kind":2,"label":[{"location":{"range":{"end":{"character":38,"line":5469},"start":{"character":29,"line":5469}},"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"classList:"}],"paddingRight":true,"position":{"character":14,"line":6721}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":8,"line":6736}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":8,"line":6737}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":12,"line":6735}},{"kind":2,"label":[{"value":"handler:"}],"paddingRight":true,"position":{"character":44,"line":6741}},{"kind":2,"label":[{"value":"handler:"}],"paddingRight":true,"position":{"character":44,"line":6743}},{"kind":2,"label":[{"location":{"range":{"end":{"character":66,"line":5473},"start":{"character":58,"line":5473}},"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"enumList:"}],"paddingRight":true,"position":{"character":14,"line":6753}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":8,"line":6768}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":8,"line":6769}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":12,"line":6767}},{"kind":2,"label":[{"value":"handler:"}],"paddingRight":true,"position":{"character":44,"line":6773}},{"kind":2,"label":[{"value":"handler:"}],"paddingRight":true,"position":{"character":44,"line":6775}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":5477},"start":{"character":28,"line":5477}},"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"classList:"}],"paddingRight":true,"position":{"character":46,"line":6785}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":8,"line":6799}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":8,"line":6800}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":12,"line":6798}},{"kind":2,"label":[{"value":"handler:"}],"paddingRight":true,"position":{"character":44,"line":6804}},{"kind":2,"label":[{"value":"handler:"}],"paddingRight":true,"position":{"character":44,"line":6806}},{"kind":2,"label":[{"location":{"range":{"end":{"character":67,"line":5481},"start":{"character":64,"line":5481}},"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"map:"}],"paddingRight":true,"position":{"character":70,"line":6815}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":8,"line":6829}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":8,"line":6830}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":12,"line":6828}},{"kind":2,"label":[{"value":"handler:"}],"paddingRight":true,"position":{"character":44,"line":6834}},{"kind":2,"label":[{"value":"handler:"}],"paddingRight":true,"position":{"character":44,"line":6836}},{"kind":2,"label":[{"location":{"range":{"end":{"character":36,"line":5485},"start":{"character":27,"line":5485}},"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"stringMap:"}],"paddingRight":true,"position":{"character":14,"line":6846}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":8,"line":6861}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":8,"line":6862}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":12,"line":6860}},{"kind":2,"label":[{"value":"handler:"}],"paddingRight":true,"position":{"character":44,"line":6866}},{"kind":2,"label":[{"value":"handler:"}],"paddingRight":true,"position":{"character":44,"line":6868}},{"kind":2,"label":[{"location":{"range":{"end":{"character":61,"line":5489},"start":{"character":55,"line":5489}},"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"intMap:"}],"paddingRight":true,"position":{"character":67,"line":6877}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":8,"line":6891}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":8,"line":6892}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":12,"line":6890}},{"kind":2,"label":[{"value":"handler:"}],"paddingRight":true,"position":{"character":44,"line":6896}},{"kind":2,"label":[{"value":"handler:"}],"paddingRight":true,"position":{"character":44,"line":6898}},{"kind":2,"label":[{"location":{"range":{"end":{"character":75,"line":5492},"start":{"character":68,"line":5492}},"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"enumMap:"}],"paddingRight":true,"position":{"character":14,"line":6908}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":8,"line":6923}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":8,"line":6924}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":12,"line":6922}},{"kind":2,"label":[{"value":"handler:"}],"paddingRight":true,"position":{"character":44,"line":6928}},{"kind":2,"label":[{"value":"handler:"}],"paddingRight":true,"position":{"character":44,"line":6930}},{"kind":2,"label":[{"location":{"range":{"end":{"character":42,"line":5496},"start":{"character":34,"line":5496}},"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"classMap:"}],"paddingRight":true,"position":{"character":38,"line":6941}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":8,"line":6955}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":8,"line":6956}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":12,"line":6954}},{"kind":2,"label":[{"value":"handler:"}],"paddingRight":true,"position":{"character":44,"line":6960}},{"kind":2,"label":[{"value":"handler:"}],"paddingRight":true,"position":{"character":44,"line":6962}},{"kind":2,"label":[{"location":{"range":{"end":{"character":34,"line":5501},"start":{"character":25,"line":5501}},"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"stringMap:"}],"paddingRight":true,"position":{"character":46,"line":6972}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":8,"line":6986}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":8,"line":6987}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":12,"line":6985}},{"kind":2,"label":[{"value":"handler:"}],"paddingRight":true,"position":{"character":44,"line":6991}},{"kind":2,"label":[{"value":"handler:"}],"paddingRight":true,"position":{"character":44,"line":6993}},{"kind":2,"label":[{"location":{"range":{"end":{"character":64,"line":5505},"start":{"character":58,"line":5505}},"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"intMap:"}],"paddingRight":true,"position":{"character":14,"line":7003}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":8,"line":7018}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":8,"line":7019}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":12,"line":7017}},{"kind":2,"label":[{"value":"handler:"}],"paddingRight":true,"position":{"character":44,"line":7023}},{"kind":2,"label":[{"value":"handler:"}],"paddingRight":true,"position":{"character":44,"line":7025}},{"kind":2,"label":[{"location":{"range":{"end":{"character":78,"line":5508},"start":{"character":71,"line":5508}},"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"enumMap:"}],"paddingRight":true,"position":{"character":14,"line":7035}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":8,"line":7050}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":8,"line":7051}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":12,"line":7049}},{"kind":2,"label":[{"value":"handler:"}],"paddingRight":true,"position":{"character":44,"line":7055}},{"kind":2,"label":[{"value":"handler:"}],"paddingRight":true,"position":{"character":44,"line":7057}},{"kind":2,"label":[{"location":{"range":{"end":{"character":40,"line":5512},"start":{"character":32,"line":5512}},"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"classMap:"}],"paddingRight":true,"position":{"character":45,"line":7068}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":8,"line":7082}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":8,"line":7083}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":12,"line":7081}},{"kind":2,"label":[{"value":"handler:"}],"paddingRight":true,"position":{"character":44,"line":7087}},{"kind":2,"label":[{"value":"handler:"}],"paddingRight":true,"position":{"character":44,"line":7089}},{"kind":2,"label":[{"location":{"range":{"end":{"character":41,"line":5516},"start":{"character":35,"line":5516}},"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"anEnum:"}],"paddingRight":true,"position":{"character":56,"line":7097}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":8,"line":7111}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":8,"line":7112}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":12,"line":7110}},{"kind":2,"label":[{"value":"handler:"}],"paddingRight":true,"position":{"character":44,"line":7116}},{"kind":2,"label":[{"value":"handler:"}],"paddingRight":true,"position":{"character":44,"line":7118}},{"kind":2,"label":[{"location":{"range":{"end":{"character":63,"line":5519},"start":{"character":52,"line":5519}},"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"anotherEnum:"}],"paddingRight":true,"position":{"character":14,"line":7127}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":8,"line":7142}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":8,"line":7143}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":12,"line":7141}},{"kind":2,"label":[{"value":"handler:"}],"paddingRight":true,"position":{"character":44,"line":7147}},{"kind":2,"label":[{"value":"handler:"}],"paddingRight":true,"position":{"character":44,"line":7149}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":8,"line":7165}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":8,"line":7166}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":12,"line":7164}},{"kind":2,"label":[{"value":"handler:"}],"paddingRight":true,"position":{"character":44,"line":7170}},{"kind":2,"label":[{"value":"handler:"}],"paddingRight":true,"position":{"character":44,"line":7172}},{"kind":2,"label":[{"location":{"range":{"end":{"character":47,"line":5526},"start":{"character":40,"line":5526}},"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"aString:"}],"paddingRight":true,"position":{"character":60,"line":7184}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":7218}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":7221}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":7222}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":7220}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":72,"line":7225}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":7226}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":7228}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":7260}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":7263}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":7264}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":7262}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":6,"line":7268}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":7270}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":7272}},{"kind":1,"label":[{"location":{"range":{"end":{"character":27,"line":107},"start":{"character":21,"line":107}},"uri":"{{context-0:package-root:sky_engine}}lib/core/string.dart"},"value":"String"}],"paddingRight":true,"position":{"character":10,"line":7290}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":6,"line":7293}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":6,"line":7294}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":10,"line":7292}},{"kind":2,"label":[{"value":"message:"}],"paddingRight":true,"position":{"character":72,"line":7297}},{"kind":1,"label":[{"location":{"range":{"end":{"character":29,"line":119},"start":{"character":25,"line":119}},"uri":"{{context-0:package-root:sky_engine}}lib/core/list.dart"},"value":"List"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"},{"value":"?"}],"paddingRight":true,"position":{"character":10,"line":7298}},{"kind":2,"label":[{"location":{"range":{"end":{"character":59,"line":14},"start":{"character":48,"line":14}},"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"channelName:"}],"paddingRight":true,"position":{"character":35,"line":7300}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":8,"line":7331}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":8,"line":7332}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":12,"line":7330}},{"kind":2,"label":[{"value":"handler:"}],"paddingRight":true,"position":{"character":44,"line":7336}},{"kind":2,"label":[{"value":"handler:"}],"paddingRight":true,"position":{"character":44,"line":7338}},{"kind":2,"label":[{"location":{"range":{"end":{"character":45,"line":7317},"start":{"character":42,"line":7317}},"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"msg:"}],"paddingRight":true,"position":{"character":59,"line":7350}},{"kind":2,"label":[{"location":{"range":{"end":{"character":37,"line":207},"start":{"character":33,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"name:"}],"paddingRight":true,"position":{"character":8,"line":7364}},{"kind":2,"label":[{"location":{"range":{"end":{"character":49,"line":207},"start":{"character":44,"line":207}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"codec:"}],"paddingRight":true,"position":{"character":8,"line":7365}},{"kind":1,"label":[{"location":{"range":{"end":{"character":25,"line":201},"start":{"character":6,"line":201}},"uri":"{{context-0:package-root:flutter}}lib/src/services/platform_channel.dart"},"value":"BasicMessageChannel"},{"value":"<"},{"location":{"range":{"end":{"character":12,"line":18},"start":{"character":6,"line":18}},"uri":"{{context-0:package-root:sky_engine}}lib/core/object.dart"},"value":"Object"},{"value":"?"},{"value":">"}],"paddingRight":true,"position":{"character":12,"line":7363}},{"kind":2,"label":[{"value":"handler:"}],"paddingRight":true,"position":{"character":44,"line":7369}},{"kind":2,"label":[{"value":"handler:"}],"paddingRight":true,"position":{"character":44,"line":7371}},{"kind":2,"label":[{"location":{"range":{"end":{"character":34,"line":7319},"start":{"character":27,"line":7319}},"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"},"value":"aString:"}],"paddingRight":true,"position":{"character":49,"line":7383}}]}}
+{"time":1771003782423,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","id":13,"method":"textDocument/codeLens","params":{"textDocument":{"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"}},"clientRequestTime":1771003782422}}
 {"time":1771003782429,"kind":"message","sender":"server","receiver":"ide","message":{"id":13,"jsonrpc":"2.0","result":[]}}
-{"time":1771003802085,"kind":"message","sender":"watcher","receiver":"server","message":{"path":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart","type":"modify"}}
+{"time":1771003802085,"kind":"message","sender":"watcher","receiver":"server","message":{"path":"{{workspaceFolder-0:filePath}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart","type":"modify"}}
 {"time":1771003802085,"kind":"message","sender":"server","receiver":"ide","message":{"id":7,"jsonrpc":"2.0","method":"window/workDoneProgress/create","params":{"token":"ANALYZING"}}}
 {"time":1771003802085,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","id":7,"result":null,"clientRequestTime":1771003802085}}
 {"time":1771003802085,"kind":"message","sender":"server","receiver":"ide","message":{"jsonrpc":"2.0","method":"$/progress","params":{"token":"ANALYZING","value":{"kind":"begin","title":"Analyzing…"}}}}
 {"time":1771003802085,"kind":"message","sender":"server","receiver":"ide","message":{"jsonrpc":"2.0","method":"$/progress","params":{"token":"ANALYZING","value":{"kind":"end"}}}}
-{"time":1771003802094,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","method":"textDocument/didChange","params":{"textDocument":{"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart","version":2},"contentChanges":[{"range":{"start":{"line":20,"character":0},"end":{"line":7397,"character":0}},"rangeLength":283428,"text":"\nList<Object?> wrapResponse({Object? result, PlatformException? error, bool empty = false}) {\n  if (empty) {\n    return <Object?>[];\n  }\n  if (error == null) {\n    return <Object?>[result];\n  }\n  return <Object?>[error.code, error.message, error.details];\n}\nbool _deepEquals(Object? a, Object? b) {\n  if (a is List && b is List) {\n    return a.length == b.length &&\n        a.indexed\n        .every(((int, dynamic) item) => _deepEquals(item.$2, b[item.$1]));\n  }\n  if (a is Map && b is Map) {\n    return a.length == b.length && a.entries.every((MapEntry<Object?, Object?> entry) =>\n        (b as Map<Object?, Object?>).containsKey(entry.key) &&\n        _deepEquals(entry.value, b[entry.key]));\n  }\n  return a == b;\n}\n\n\nenum AnEnum {\n  one,\n  two,\n  three,\n  fortyTwo,\n  fourHundredTwentyTwo,\n}\n\nenum AnotherEnum {\n  justInCase,\n}\n\nclass UnusedClass {\n  UnusedClass({\n    this.aField,\n  });\n\n  Object? aField;\n\n  List<Object?> _toList() {\n    return <Object?>[\n      aField,\n    ];\n  }\n\n  Object encode() {\n    return _toList();  }\n\n  static UnusedClass decode(Object result) {\n    result as List<Object?>;\n    return UnusedClass(\n      aField: result[0],\n    );\n  }\n\n  @override\n  // ignore: avoid_equals_and_hash_code_on_mutable_classes\n  bool operator ==(Object other) {\n    if (other is! UnusedClass || other.runtimeType != runtimeType) {\n      return false;\n    }\n    if (identical(this, other)) {\n      return true;\n    }\n    return _deepEquals(encode(), other.encode());\n  }\n\n  @override\n  // ignore: avoid_equals_and_hash_code_on_mutable_classes\n  int get hashCode => Object.hashAll(_toList())\n;\n}\n\n/// A class containing all supported types.\nclass AllTypes {\n  AllTypes({\n    this.aBool = false,\n    this.anInt = 0,\n    this.anInt64 = 0,\n    this.aDouble = 0,\n    required this.aByteArray,\n    required this.a4ByteArray,\n    required this.a8ByteArray,\n    required this.aFloatArray,\n    this.anEnum = AnEnum.one,\n    this.anotherEnum = AnotherEnum.justInCase,\n    this.aString = '',\n    this.anObject = 0,\n    required this.list,\n    required this.stringList,\n    required this.intList,\n    required this.doubleList,\n    required this.boolList,\n    required this.enumList,\n    required this.objectList,\n    required this.listList,\n    required this.mapList,\n    required this.map,\n    required this.stringMap,\n    required this.intMap,\n    required this.enumMap,\n    required this.objectMap,\n    required this.listMap,\n    required this.mapMap,\n  });\n\n  bool aBool;\n\n  int anInt;\n\n  int anInt64;\n\n  double aDouble;\n\n  Uint8List aByteArray;\n\n  Int32List a4ByteArray;\n\n  Int64List a8ByteArray;\n\n  Float64List aFloatArray;\n\n  AnEnum anEnum;\n\n  AnotherEnum anotherEnum;\n\n  String aString;\n\n  Object anObject;\n\n  List<Object?> list;\n\n  List<String> stringList;\n\n  List<int> intList;\n\n  List<double> doubleList;\n\n  List<bool> boolList;\n\n  List<AnEnum> enumList;\n\n  List<Object> objectList;\n\n  List<List<Object?>> listList;\n\n  List<Map<Object?, Object?>> mapList;\n\n  Map<Object?, Object?> map;\n\n  Map<String, String> stringMap;\n\n  Map<int, int> intMap;\n\n  Map<AnEnum, AnEnum> enumMap;\n\n  Map<Object, Object> objectMap;\n\n  Map<int, List<Object?>> listMap;\n\n  Map<int, Map<Object?, Object?>> mapMap;\n\n  List<Object?> _toList() {\n    return <Object?>[\n      aBool,\n      anInt,\n      anInt64,\n      aDouble,\n      aByteArray,\n      a4ByteArray,\n      a8ByteArray,\n      aFloatArray,\n      anEnum,\n      anotherEnum,\n      aString,\n      anObject,\n      list,\n      stringList,\n      intList,\n      doubleList,\n      boolList,\n      enumList,\n      objectList,\n      listList,\n      mapList,\n      map,\n      stringMap,\n      intMap,\n      enumMap,\n      objectMap,\n      listMap,\n      mapMap,\n    ];\n  }\n\n  Object encode() {\n    return _toList();  }\n\n  static AllTypes decode(Object result) {\n    result as List<Object?>;\n    return AllTypes(\n      aBool: result[0]! as bool,\n      anInt: result[1]! as int,\n      anInt64: result[2]! as int,\n      aDouble: result[3]! as double,\n      aByteArray: result[4]! as Uint8List,\n      a4ByteArray: result[5]! as Int32List,\n      a8ByteArray: result[6]! as Int64List,\n      aFloatArray: result[7]! as Float64List,\n      anEnum: result[8]! as AnEnum,\n      anotherEnum: result[9]! as AnotherEnum,\n      aString: result[10]! as String,\n      anObject: result[11]!,\n      list: result[12]! as List<Object?>,\n      stringList: (result[13] as List<Object?>?)!.cast<String>(),\n      intList: (result[14] as List<Object?>?)!.cast<int>(),\n      doubleList: (result[15] as List<Object?>?)!.cast<double>(),\n      boolList: (result[16] as List<Object?>?)!.cast<bool>(),\n      enumList: (result[17] as List<Object?>?)!.cast<AnEnum>(),\n      objectList: (result[18] as List<Object?>?)!.cast<Object>(),\n      listList: (result[19] as List<Object?>?)!.cast<List<Object?>>(),\n      mapList: (result[20] as List<Object?>?)!.cast<Map<Object?, Object?>>(),\n      map: result[21]! as Map<Object?, Object?>,\n      stringMap: (result[22] as Map<Object?, Object?>?)!.cast<String, String>(),\n      intMap: (result[23] as Map<Object?, Object?>?)!.cast<int, int>(),\n      enumMap: (result[24] as Map<Object?, Object?>?)!.cast<AnEnum, AnEnum>(),\n      objectMap: (result[25] as Map<Object?, Object?>?)!.cast<Object, Object>(),\n      listMap: (result[26] as Map<Object?, Object?>?)!.cast<int, List<Object?>>(),\n      mapMap: (result[27] as Map<Object?, Object?>?)!.cast<int, Map<Object?, Object?>>(),\n    );\n  }\n\n  @override\n  // ignore: avoid_equals_and_hash_code_on_mutable_classes\n  bool operator ==(Object other) {\n    if (other is! AllTypes || other.runtimeType != runtimeType) {\n      return false;\n    }\n    if (identical(this, other)) {\n      return true;\n    }\n    return _deepEquals(encode(), other.encode());\n  }\n\n  @override\n  // ignore: avoid_equals_and_hash_code_on_mutable_classes\n  int get hashCode => Object.hashAll(_toList())\n;\n}\n\n/// A class containing all supported nullable types.\nclass AllNullableTypes {\n  AllNullableTypes({\n    this.aNullableBool,\n    this.aNullableInt,\n    this.aNullableInt64,\n    this.aNullableDouble,\n    this.aNullableByteArray,\n    this.aNullable4ByteArray,\n    this.aNullable8ByteArray,\n    this.aNullableFloatArray,\n    this.aNullableEnum,\n    this.anotherNullableEnum,\n    this.aNullableString,\n    this.aNullableObject,\n    this.allNullableTypes,\n    this.list,\n    this.stringList,\n    this.intList,\n    this.doubleList,\n    this.boolList,\n    this.enumList,\n    this.objectList,\n    this.listList,\n    this.mapList,\n    this.recursiveClassList,\n    this.map,\n    this.stringMap,\n    this.intMap,\n    this.enumMap,\n    this.objectMap,\n    this.listMap,\n    this.mapMap,\n    this.recursiveClassMap,\n  });\n\n  bool? aNullableBool;\n\n  int? aNullableInt;\n\n  int? aNullableInt64;\n\n  double? aNullableDouble;\n\n  Uint8List? aNullableByteArray;\n\n  Int32List? aNullable4ByteArray;\n\n  Int64List? aNullable8ByteArray;\n\n  Float64List? aNullableFloatArray;\n\n  AnEnum? aNullableEnum;\n\n  AnotherEnum? anotherNullableEnum;\n\n  String? aNullableString;\n\n  Object? aNullableObject;\n\n  AllNullableTypes? allNullableTypes;\n\n  List<Object?>? list;\n\n  List<String?>? stringList;\n\n  List<int?>? intList;\n\n  List<double?>? doubleList;\n\n  List<bool?>? boolList;\n\n  List<AnEnum?>? enumList;\n\n  List<Object?>? objectList;\n\n  List<List<Object?>?>? listList;\n\n  List<Map<Object?, Object?>?>? mapList;\n\n  List<AllNullableTypes?>? recursiveClassList;\n\n  Map<Object?, Object?>? map;\n\n  Map<String?, String?>? stringMap;\n\n  Map<int?, int?>? intMap;\n\n  Map<AnEnum?, AnEnum?>? enumMap;\n\n  Map<Object?, Object?>? objectMap;\n\n  Map<int?, List<Object?>?>? listMap;\n\n  Map<int?, Map<Object?, Object?>?>? mapMap;\n\n  Map<int?, AllNullableTypes?>? recursiveClassMap;\n\n  List<Object?> _toList() {\n    return <Object?>[\n      aNullableBool,\n      aNullableInt,\n      aNullableInt64,\n      aNullableDouble,\n      aNullableByteArray,\n      aNullable4ByteArray,\n      aNullable8ByteArray,\n      aNullableFloatArray,\n      aNullableEnum,\n      anotherNullableEnum,\n      aNullableString,\n      aNullableObject,\n      allNullableTypes,\n      list,\n      stringList,\n      intList,\n      doubleList,\n      boolList,\n      enumList,\n      objectList,\n      listList,\n      mapList,\n      recursiveClassList,\n      map,\n      stringMap,\n      intMap,\n      enumMap,\n      objectMap,\n      listMap,\n      mapMap,\n      recursiveClassMap,\n    ];\n  }\n\n  Object encode() {\n    return _toList();  }\n\n  static AllNullableTypes decode(Object result) {\n    result as List<Object?>;\n    return AllNullableTypes(\n      aNullableBool: result[0] as bool?,\n      aNullableInt: result[1] as int?,\n      aNullableInt64: result[2] as int?,\n      aNullableDouble: result[3] as double?,\n      aNullableByteArray: result[4] as Uint8List?,\n      aNullable4ByteArray: result[5] as Int32List?,\n      aNullable8ByteArray: result[6] as Int64List?,\n      aNullableFloatArray: result[7] as Float64List?,\n      aNullableEnum: result[8] as AnEnum?,\n      anotherNullableEnum: result[9] as AnotherEnum?,\n      aNullableString: result[10] as String?,\n      aNullableObject: result[11],\n      allNullableTypes: result[12] as AllNullableTypes?,\n      list: result[13] as List<Object?>?,\n      stringList: (result[14] as List<Object?>?)?.cast<String?>(),\n      intList: (result[15] as List<Object?>?)?.cast<int?>(),\n      doubleList: (result[16] as List<Object?>?)?.cast<double?>(),\n      boolList: (result[17] as List<Object?>?)?.cast<bool?>(),\n      enumList: (result[18] as List<Object?>?)?.cast<AnEnum?>(),\n      objectList: (result[19] as List<Object?>?)?.cast<Object?>(),\n      listList: (result[20] as List<Object?>?)?.cast<List<Object?>?>(),\n      mapList: (result[21] as List<Object?>?)?.cast<Map<Object?, Object?>?>(),\n      recursiveClassList: (result[22] as List<Object?>?)?.cast<AllNullableTypes?>(),\n      map: result[23] as Map<Object?, Object?>?,\n      stringMap: (result[24] as Map<Object?, Object?>?)?.cast<String?, String?>(),\n      intMap: (result[25] as Map<Object?, Object?>?)?.cast<int?, int?>(),\n      enumMap: (result[26] as Map<Object?, Object?>?)?.cast<AnEnum?, AnEnum?>(),\n      objectMap: (result[27] as Map<Object?, Object?>?)?.cast<Object?, Object?>(),\n      listMap: (result[28] as Map<Object?, Object?>?)?.cast<int?, List<Object?>?>(),\n      mapMap: (result[29] as Map<Object?, Object?>?)?.cast<int?, Map<Object?, Object?>?>(),\n      recursiveClassMap: (result[30] as Map<Object?, Object?>?)?.cast<int?, AllNullableTypes?>(),\n    );\n  }\n\n  @override\n  // ignore: avoid_equals_and_hash_code_on_mutable_classes\n  bool operator ==(Object other) {\n    if (other is! AllNullableTypes || other.runtimeType != runtimeType) {\n      return false;\n    }\n    if (identical(this, other)) {\n      return true;\n    }\n    return _deepEquals(encode(), other.encode());\n  }\n\n  @override\n  // ignore: avoid_equals_and_hash_code_on_mutable_classes\n  int get hashCode => Object.hashAll(_toList())\n;\n}\n\n/// The primary purpose for this class is to ensure coverage of Swift structs\n/// with nullable items, as the primary [AllNullableTypes] class is being used to\n/// test Swift classes.\nclass AllNullableTypesWithoutRecursion {\n  AllNullableTypesWithoutRecursion({\n    this.aNullableBool,\n    this.aNullableInt,\n    this.aNullableInt64,\n    this.aNullableDouble,\n    this.aNullableByteArray,\n    this.aNullable4ByteArray,\n    this.aNullable8ByteArray,\n    this.aNullableFloatArray,\n    this.aNullableEnum,\n    this.anotherNullableEnum,\n    this.aNullableString,\n    this.aNullableObject,\n    this.list,\n    this.stringList,\n    this.intList,\n    this.doubleList,\n    this.boolList,\n    this.enumList,\n    this.objectList,\n    this.listList,\n    this.mapList,\n    this.map,\n    this.stringMap,\n    this.intMap,\n    this.enumMap,\n    this.objectMap,\n    this.listMap,\n    this.mapMap,\n  });\n\n  bool? aNullableBool;\n\n  int? aNullableInt;\n\n  int? aNullableInt64;\n\n  double? aNullableDouble;\n\n  Uint8List? aNullableByteArray;\n\n  Int32List? aNullable4ByteArray;\n\n  Int64List? aNullable8ByteArray;\n\n  Float64List? aNullableFloatArray;\n\n  AnEnum? aNullableEnum;\n\n  AnotherEnum? anotherNullableEnum;\n\n  String? aNullableString;\n\n  Object? aNullableObject;\n\n  List<Object?>? list;\n\n  List<String?>? stringList;\n\n  List<int?>? intList;\n\n  List<double?>? doubleList;\n\n  List<bool?>? boolList;\n\n  List<AnEnum?>? enumList;\n\n  List<Object?>? objectList;\n\n  List<List<Object?>?>? listList;\n\n  List<Map<Object?, Object?>?>? mapList;\n\n  Map<Object?, Object?>? map;\n\n  Map<String?, String?>? stringMap;\n\n  Map<int?, int?>? intMap;\n\n  Map<AnEnum?, AnEnum?>? enumMap;\n\n  Map<Object?, Object?>? objectMap;\n\n  Map<int?, List<Object?>?>? listMap;\n\n  Map<int?, Map<Object?, Object?>?>? mapMap;\n\n  List<Object?> _toList() {\n    return <Object?>[\n      aNullableBool,\n      aNullableInt,\n      aNullableInt64,\n      aNullableDouble,\n      aNullableByteArray,\n      aNullable4ByteArray,\n      aNullable8ByteArray,\n      aNullableFloatArray,\n      aNullableEnum,\n      anotherNullableEnum,\n      aNullableString,\n      aNullableObject,\n      list,\n      stringList,\n      intList,\n      doubleList,\n      boolList,\n      enumList,\n      objectList,\n      listList,\n      mapList,\n      map,\n      stringMap,\n      intMap,\n      enumMap,\n      objectMap,\n      listMap,\n      mapMap,\n    ];\n  }\n\n  Object encode() {\n    return _toList();  }\n\n  static AllNullableTypesWithoutRecursion decode(Object result) {\n    result as List<Object?>;\n    return AllNullableTypesWithoutRecursion(\n      aNullableBool: result[0] as bool?,\n      aNullableInt: result[1] as int?,\n      aNullableInt64: result[2] as int?,\n      aNullableDouble: result[3] as double?,\n      aNullableByteArray: result[4] as Uint8List?,\n      aNullable4ByteArray: result[5] as Int32List?,\n      aNullable8ByteArray: result[6] as Int64List?,\n      aNullableFloatArray: result[7] as Float64List?,\n      aNullableEnum: result[8] as AnEnum?,\n      anotherNullableEnum: result[9] as AnotherEnum?,\n      aNullableString: result[10] as String?,\n      aNullableObject: result[11],\n      list: result[12] as List<Object?>?,\n      stringList: (result[13] as List<Object?>?)?.cast<String?>(),\n      intList: (result[14] as List<Object?>?)?.cast<int?>(),\n      doubleList: (result[15] as List<Object?>?)?.cast<double?>(),\n      boolList: (result[16] as List<Object?>?)?.cast<bool?>(),\n      enumList: (result[17] as List<Object?>?)?.cast<AnEnum?>(),\n      objectList: (result[18] as List<Object?>?)?.cast<Object?>(),\n      listList: (result[19] as List<Object?>?)?.cast<List<Object?>?>(),\n      mapList: (result[20] as List<Object?>?)?.cast<Map<Object?, Object?>?>(),\n      map: result[21] as Map<Object?, Object?>?,\n      stringMap: (result[22] as Map<Object?, Object?>?)?.cast<String?, String?>(),\n      intMap: (result[23] as Map<Object?, Object?>?)?.cast<int?, int?>(),\n      enumMap: (result[24] as Map<Object?, Object?>?)?.cast<AnEnum?, AnEnum?>(),\n      objectMap: (result[25] as Map<Object?, Object?>?)?.cast<Object?, Object?>(),\n      listMap: (result[26] as Map<Object?, Object?>?)?.cast<int?, List<Object?>?>(),\n      mapMap: (result[27] as Map<Object?, Object?>?)?.cast<int?, Map<Object?, Object?>?>(),\n    );\n  }\n\n  @override\n  // ignore: avoid_equals_and_hash_code_on_mutable_classes\n  bool operator ==(Object other) {\n    if (other is! AllNullableTypesWithoutRecursion || other.runtimeType != runtimeType) {\n      return false;\n    }\n    if (identical(this, other)) {\n      return true;\n    }\n    return _deepEquals(encode(), other.encode());\n  }\n\n  @override\n  // ignore: avoid_equals_and_hash_code_on_mutable_classes\n  int get hashCode => Object.hashAll(_toList())\n;\n}\n\n/// A class for testing nested class handling.\n///\n/// This is needed to test nested nullable and non-nullable classes,\n/// `AllNullableTypes` is non-nullable here as it is easier to instantiate\n/// than `AllTypes` when testing doesn't require both (ie. testing null classes).\nclass AllClassesWrapper {\n  AllClassesWrapper({\n    required this.allNullableTypes,\n    this.allNullableTypesWithoutRecursion,\n    this.allTypes,\n    required this.classList,\n    this.nullableClassList,\n    required this.classMap,\n    this.nullableClassMap,\n  });\n\n  AllNullableTypes allNullableTypes;\n\n  AllNullableTypesWithoutRecursion? allNullableTypesWithoutRecursion;\n\n  AllTypes? allTypes;\n\n  List<AllTypes?> classList;\n\n  List<AllNullableTypesWithoutRecursion?>? nullableClassList;\n\n  Map<int?, AllTypes?> classMap;\n\n  Map<int?, AllNullableTypesWithoutRecursion?>? nullableClassMap;\n\n  List<Object?> _toList() {\n    return <Object?>[\n      allNullableTypes,\n      allNullableTypesWithoutRecursion,\n      allTypes,\n      classList,\n      nullableClassList,\n      classMap,\n      nullableClassMap,\n    ];\n  }\n\n  Object encode() {\n    return _toList();  }\n\n  static AllClassesWrapper decode(Object result) {\n    result as List<Object?>;\n    return AllClassesWrapper(\n      allNullableTypes: result[0]! as AllNullableTypes,\n      allNullableTypesWithoutRecursion: result[1] as AllNullableTypesWithoutRecursion?,\n      allTypes: result[2] as AllTypes?,\n      classList: (result[3] as List<Object?>?)!.cast<AllTypes?>(),\n      nullableClassList: (result[4] as List<Object?>?)?.cast<AllNullableTypesWithoutRecursion?>(),\n      classMap: (result[5] as Map<Object?, Object?>?)!.cast<int?, AllTypes?>(),\n      nullableClassMap: (result[6] as Map<Object?, Object?>?)?.cast<int?, AllNullableTypesWithoutRecursion?>(),\n    );\n  }\n\n  @override\n  // ignore: avoid_equals_and_hash_code_on_mutable_classes\n  bool operator ==(Object other) {\n    if (other is! AllClassesWrapper || other.runtimeType != runtimeType) {\n      return false;\n    }\n    if (identical(this, other)) {\n      return true;\n    }\n    return _deepEquals(encode(), other.encode());\n  }\n\n  @override\n  // ignore: avoid_equals_and_hash_code_on_mutable_classes\n  int get hashCode => Object.hashAll(_toList())\n;\n}\n\n/// A data class containing a List, used in unit tests.\nclass TestMessage {\n  TestMessage({\n    this.testList,\n  });\n\n  List<Object?>? testList;\n\n  List<Object?> _toList() {\n    return <Object?>[\n      testList,\n    ];\n  }\n\n  Object encode() {\n    return _toList();  }\n\n  static TestMessage decode(Object result) {\n    result as List<Object?>;\n    return TestMessage(\n      testList: result[0] as List<Object?>?,\n    );\n  }\n\n  @override\n  // ignore: avoid_equals_and_hash_code_on_mutable_classes\n  bool operator ==(Object other) {\n    if (other is! TestMessage || other.runtimeType != runtimeType) {\n      return false;\n    }\n    if (identical(this, other)) {\n      return true;\n    }\n    return _deepEquals(encode(), other.encode());\n  }\n\n  @override\n  // ignore: avoid_equals_and_hash_code_on_mutable_classes\n  int get hashCode => Object.hashAll(_toList())\n;\n}\n\n\nclass _PigeonCodec extends StandardMessageCodec {\n  const _PigeonCodec();\n  @override\n  void writeValue(WriteBuffer buffer, Object? value) {\n    if (value is int) {\n      buffer.putUint8(4);\n      buffer.putInt64(value);\n    }    else if (value is AnEnum) {\n      buffer.putUint8(129);\n      writeValue(buffer, value.index);\n    }    else if (value is AnotherEnum) {\n      buffer.putUint8(130);\n      writeValue(buffer, value.index);\n    }    else if (value is UnusedClass) {\n      buffer.putUint8(131);\n      writeValue(buffer, value.encode());\n    }    else if (value is AllTypes) {\n      buffer.putUint8(132);\n      writeValue(buffer, value.encode());\n    }    else if (value is AllNullableTypes) {\n      buffer.putUint8(133);\n      writeValue(buffer, value.encode());\n    }    else if (value is AllNullableTypesWithoutRecursion) {\n      buffer.putUint8(134);\n      writeValue(buffer, value.encode());\n    }    else if (value is AllClassesWrapper) {\n      buffer.putUint8(135);\n      writeValue(buffer, value.encode());\n    }    else if (value is TestMessage) {\n      buffer.putUint8(136);\n      writeValue(buffer, value.encode());\n    } else {\n      super.writeValue(buffer, value);\n    }\n  }\n\n  @override\n  Object? readValueOfType(int type, ReadBuffer buffer) {\n    switch (type) {\n      case 129: \n        final value = readValue(buffer) as int?;\n        return value == null ? null : AnEnum.values[value];\n      case 130: \n        final value = readValue(buffer) as int?;\n        return value == null ? null : AnotherEnum.values[value];\n      case 131: \n        return UnusedClass.decode(readValue(buffer)!);\n      case 132: \n        return AllTypes.decode(readValue(buffer)!);\n      case 133: \n        return AllNullableTypes.decode(readValue(buffer)!);\n      case 134: \n        return AllNullableTypesWithoutRecursion.decode(readValue(buffer)!);\n      case 135: \n        return AllClassesWrapper.decode(readValue(buffer)!);\n      case 136: \n        return TestMessage.decode(readValue(buffer)!);\n      default:\n        return super.readValueOfType(type, buffer);\n    }\n  }\n}\n\n/// The core interface that each host language plugin must implement in\n/// platform_test integration tests.\nclass HostIntegrationCoreApi {\n  /// Constructor for [HostIntegrationCoreApi].  The [binaryMessenger] named argument is\n  /// available for dependency injection.  If it is left null, the default\n  /// BinaryMessenger will be used which routes to the host platform.\n  HostIntegrationCoreApi({BinaryMessenger? binaryMessenger, String messageChannelSuffix = ''})\n      : pigeonVar_binaryMessenger = binaryMessenger,\n        pigeonVar_messageChannelSuffix = messageChannelSuffix.isNotEmpty ? '.$messageChannelSuffix' : '';\n  final BinaryMessenger? pigeonVar_binaryMessenger;\n\n  static const MessageCodec<Object?> pigeonChannelCodec = _PigeonCodec();\n\n  final String pigeonVar_messageChannelSuffix;\n\n  /// A no-op function taking no arguments and returning no value, to sanity\n  /// test basic calling.\n  Future<void> noop() async {\n    final pigeonVar_channelName = 'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.noop$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(null);\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else {\n      return;\n    }\n  }\n\n  /// Returns the passed object, to test serialization and deserialization.\n  Future<AllTypes> echoAllTypes(AllTypes everything) async {\n    final pigeonVar_channelName = 'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.echoAllTypes$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(<Object?>[everything]);\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else if (pigeonVar_replyList[0] == null) {\n      throw PlatformException(\n        code: 'null-error',\n        message: 'Host platform returned null value for non-null return value.',\n      );\n    } else {\n      return (pigeonVar_replyList[0] as AllTypes?)!;\n    }\n  }\n\n  /// Returns an error, to test error handling.\n  Future<Object?> throwError() async {\n    final pigeonVar_channelName = 'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.throwError$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(null);\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else {\n      return pigeonVar_replyList[0];\n    }\n  }\n\n  /// Returns an error from a void function, to test error handling.\n  Future<void> throwErrorFromVoid() async {\n    final pigeonVar_channelName = 'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.throwErrorFromVoid$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(null);\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else {\n      return;\n    }\n  }\n\n  /// Returns a Flutter error, to test error handling.\n  Future<Object?> throwFlutterError() async {\n    final pigeonVar_channelName = 'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.throwFlutterError$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(null);\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else {\n      return pigeonVar_replyList[0];\n    }\n  }\n\n  /// Returns passed in int.\n  Future<int> echoInt(int anInt) async {\n    final pigeonVar_channelName = 'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.echoInt$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(<Object?>[anInt]);\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else if (pigeonVar_replyList[0] == null) {\n      throw PlatformException(\n        code: 'null-error',\n        message: 'Host platform returned null value for non-null return value.',\n      );\n    } else {\n      return (pigeonVar_replyList[0] as int?)!;\n    }\n  }\n\n  /// Returns passed in double.\n  Future<double> echoDouble(double aDouble) async {\n    final pigeonVar_channelName = 'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.echoDouble$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(<Object?>[aDouble]);\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else if (pigeonVar_replyList[0] == null) {\n      throw PlatformException(\n        code: 'null-error',\n        message: 'Host platform returned null value for non-null return value.',\n      );\n    } else {\n      return (pigeonVar_replyList[0] as double?)!;\n    }\n  }\n\n  /// Returns the passed in boolean.\n  Future<bool> echoBool(bool aBool) async {\n    final pigeonVar_channelName = 'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.echoBool$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(<Object?>[aBool]);\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else if (pigeonVar_replyList[0] == null) {\n      throw PlatformException(\n        code: 'null-error',\n        message: 'Host platform returned null value for non-null return value.',\n      );\n    } else {\n      return (pigeonVar_replyList[0] as bool?)!;\n    }\n  }\n\n  /// Returns the passed in string.\n  Future<String> echoString(String aString) async {\n    final pigeonVar_channelName = 'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.echoString$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(<Object?>[aString]);\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else if (pigeonVar_replyList[0] == null) {\n      throw PlatformException(\n        code: 'null-error',\n        message: 'Host platform returned null value for non-null return value.',\n      );\n    } else {\n      return (pigeonVar_replyList[0] as String?)!;\n    }\n  }\n\n  /// Returns the passed in Uint8List.\n  Future<Uint8List> echoUint8List(Uint8List aUint8List) async {\n    final pigeonVar_channelName = 'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.echoUint8List$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(<Object?>[aUint8List]);\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else if (pigeonVar_replyList[0] == null) {\n      throw PlatformException(\n        code: 'null-error',\n        message: 'Host platform returned null value for non-null return value.',\n      );\n    } else {\n      return (pigeonVar_replyList[0] as Uint8List?)!;\n    }\n  }\n\n  /// Returns the passed in generic Object.\n  Future<Object> echoObject(Object anObject) async {\n    final pigeonVar_channelName = 'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.echoObject$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(<Object?>[anObject]);\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {"}]},"clientRequestTime":1771003802092}}
+{"time":1771003802094,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","method":"textDocument/didChange","params":{"textDocument":{"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart","version":2},"contentChanges":[{"range":{"start":{"line":20,"character":0},"end":{"line":7397,"character":0}},"rangeLength":283428,"text":"\nList<Object?> wrapResponse({Object? result, PlatformException? error, bool empty = false}) {\n  if (empty) {\n    return <Object?>[];\n  }\n  if (error == null) {\n    return <Object?>[result];\n  }\n  return <Object?>[error.code, error.message, error.details];\n}\nbool _deepEquals(Object? a, Object? b) {\n  if (a is List && b is List) {\n    return a.length == b.length &&\n        a.indexed\n        .every(((int, dynamic) item) => _deepEquals(item.$2, b[item.$1]));\n  }\n  if (a is Map && b is Map) {\n    return a.length == b.length && a.entries.every((MapEntry<Object?, Object?> entry) =>\n        (b as Map<Object?, Object?>).containsKey(entry.key) &&\n        _deepEquals(entry.value, b[entry.key]));\n  }\n  return a == b;\n}\n\n\nenum AnEnum {\n  one,\n  two,\n  three,\n  fortyTwo,\n  fourHundredTwentyTwo,\n}\n\nenum AnotherEnum {\n  justInCase,\n}\n\nclass UnusedClass {\n  UnusedClass({\n    this.aField,\n  });\n\n  Object? aField;\n\n  List<Object?> _toList() {\n    return <Object?>[\n      aField,\n    ];\n  }\n\n  Object encode() {\n    return _toList();  }\n\n  static UnusedClass decode(Object result) {\n    result as List<Object?>;\n    return UnusedClass(\n      aField: result[0],\n    );\n  }\n\n  @override\n  // ignore: avoid_equals_and_hash_code_on_mutable_classes\n  bool operator ==(Object other) {\n    if (other is! UnusedClass || other.runtimeType != runtimeType) {\n      return false;\n    }\n    if (identical(this, other)) {\n      return true;\n    }\n    return _deepEquals(encode(), other.encode());\n  }\n\n  @override\n  // ignore: avoid_equals_and_hash_code_on_mutable_classes\n  int get hashCode => Object.hashAll(_toList())\n;\n}\n\n/// A class containing all supported types.\nclass AllTypes {\n  AllTypes({\n    this.aBool = false,\n    this.anInt = 0,\n    this.anInt64 = 0,\n    this.aDouble = 0,\n    required this.aByteArray,\n    required this.a4ByteArray,\n    required this.a8ByteArray,\n    required this.aFloatArray,\n    this.anEnum = AnEnum.one,\n    this.anotherEnum = AnotherEnum.justInCase,\n    this.aString = '',\n    this.anObject = 0,\n    required this.list,\n    required this.stringList,\n    required this.intList,\n    required this.doubleList,\n    required this.boolList,\n    required this.enumList,\n    required this.objectList,\n    required this.listList,\n    required this.mapList,\n    required this.map,\n    required this.stringMap,\n    required this.intMap,\n    required this.enumMap,\n    required this.objectMap,\n    required this.listMap,\n    required this.mapMap,\n  });\n\n  bool aBool;\n\n  int anInt;\n\n  int anInt64;\n\n  double aDouble;\n\n  Uint8List aByteArray;\n\n  Int32List a4ByteArray;\n\n  Int64List a8ByteArray;\n\n  Float64List aFloatArray;\n\n  AnEnum anEnum;\n\n  AnotherEnum anotherEnum;\n\n  String aString;\n\n  Object anObject;\n\n  List<Object?> list;\n\n  List<String> stringList;\n\n  List<int> intList;\n\n  List<double> doubleList;\n\n  List<bool> boolList;\n\n  List<AnEnum> enumList;\n\n  List<Object> objectList;\n\n  List<List<Object?>> listList;\n\n  List<Map<Object?, Object?>> mapList;\n\n  Map<Object?, Object?> map;\n\n  Map<String, String> stringMap;\n\n  Map<int, int> intMap;\n\n  Map<AnEnum, AnEnum> enumMap;\n\n  Map<Object, Object> objectMap;\n\n  Map<int, List<Object?>> listMap;\n\n  Map<int, Map<Object?, Object?>> mapMap;\n\n  List<Object?> _toList() {\n    return <Object?>[\n      aBool,\n      anInt,\n      anInt64,\n      aDouble,\n      aByteArray,\n      a4ByteArray,\n      a8ByteArray,\n      aFloatArray,\n      anEnum,\n      anotherEnum,\n      aString,\n      anObject,\n      list,\n      stringList,\n      intList,\n      doubleList,\n      boolList,\n      enumList,\n      objectList,\n      listList,\n      mapList,\n      map,\n      stringMap,\n      intMap,\n      enumMap,\n      objectMap,\n      listMap,\n      mapMap,\n    ];\n  }\n\n  Object encode() {\n    return _toList();  }\n\n  static AllTypes decode(Object result) {\n    result as List<Object?>;\n    return AllTypes(\n      aBool: result[0]! as bool,\n      anInt: result[1]! as int,\n      anInt64: result[2]! as int,\n      aDouble: result[3]! as double,\n      aByteArray: result[4]! as Uint8List,\n      a4ByteArray: result[5]! as Int32List,\n      a8ByteArray: result[6]! as Int64List,\n      aFloatArray: result[7]! as Float64List,\n      anEnum: result[8]! as AnEnum,\n      anotherEnum: result[9]! as AnotherEnum,\n      aString: result[10]! as String,\n      anObject: result[11]!,\n      list: result[12]! as List<Object?>,\n      stringList: (result[13] as List<Object?>?)!.cast<String>(),\n      intList: (result[14] as List<Object?>?)!.cast<int>(),\n      doubleList: (result[15] as List<Object?>?)!.cast<double>(),\n      boolList: (result[16] as List<Object?>?)!.cast<bool>(),\n      enumList: (result[17] as List<Object?>?)!.cast<AnEnum>(),\n      objectList: (result[18] as List<Object?>?)!.cast<Object>(),\n      listList: (result[19] as List<Object?>?)!.cast<List<Object?>>(),\n      mapList: (result[20] as List<Object?>?)!.cast<Map<Object?, Object?>>(),\n      map: result[21]! as Map<Object?, Object?>,\n      stringMap: (result[22] as Map<Object?, Object?>?)!.cast<String, String>(),\n      intMap: (result[23] as Map<Object?, Object?>?)!.cast<int, int>(),\n      enumMap: (result[24] as Map<Object?, Object?>?)!.cast<AnEnum, AnEnum>(),\n      objectMap: (result[25] as Map<Object?, Object?>?)!.cast<Object, Object>(),\n      listMap: (result[26] as Map<Object?, Object?>?)!.cast<int, List<Object?>>(),\n      mapMap: (result[27] as Map<Object?, Object?>?)!.cast<int, Map<Object?, Object?>>(),\n    );\n  }\n\n  @override\n  // ignore: avoid_equals_and_hash_code_on_mutable_classes\n  bool operator ==(Object other) {\n    if (other is! AllTypes || other.runtimeType != runtimeType) {\n      return false;\n    }\n    if (identical(this, other)) {\n      return true;\n    }\n    return _deepEquals(encode(), other.encode());\n  }\n\n  @override\n  // ignore: avoid_equals_and_hash_code_on_mutable_classes\n  int get hashCode => Object.hashAll(_toList())\n;\n}\n\n/// A class containing all supported nullable types.\nclass AllNullableTypes {\n  AllNullableTypes({\n    this.aNullableBool,\n    this.aNullableInt,\n    this.aNullableInt64,\n    this.aNullableDouble,\n    this.aNullableByteArray,\n    this.aNullable4ByteArray,\n    this.aNullable8ByteArray,\n    this.aNullableFloatArray,\n    this.aNullableEnum,\n    this.anotherNullableEnum,\n    this.aNullableString,\n    this.aNullableObject,\n    this.allNullableTypes,\n    this.list,\n    this.stringList,\n    this.intList,\n    this.doubleList,\n    this.boolList,\n    this.enumList,\n    this.objectList,\n    this.listList,\n    this.mapList,\n    this.recursiveClassList,\n    this.map,\n    this.stringMap,\n    this.intMap,\n    this.enumMap,\n    this.objectMap,\n    this.listMap,\n    this.mapMap,\n    this.recursiveClassMap,\n  });\n\n  bool? aNullableBool;\n\n  int? aNullableInt;\n\n  int? aNullableInt64;\n\n  double? aNullableDouble;\n\n  Uint8List? aNullableByteArray;\n\n  Int32List? aNullable4ByteArray;\n\n  Int64List? aNullable8ByteArray;\n\n  Float64List? aNullableFloatArray;\n\n  AnEnum? aNullableEnum;\n\n  AnotherEnum? anotherNullableEnum;\n\n  String? aNullableString;\n\n  Object? aNullableObject;\n\n  AllNullableTypes? allNullableTypes;\n\n  List<Object?>? list;\n\n  List<String?>? stringList;\n\n  List<int?>? intList;\n\n  List<double?>? doubleList;\n\n  List<bool?>? boolList;\n\n  List<AnEnum?>? enumList;\n\n  List<Object?>? objectList;\n\n  List<List<Object?>?>? listList;\n\n  List<Map<Object?, Object?>?>? mapList;\n\n  List<AllNullableTypes?>? recursiveClassList;\n\n  Map<Object?, Object?>? map;\n\n  Map<String?, String?>? stringMap;\n\n  Map<int?, int?>? intMap;\n\n  Map<AnEnum?, AnEnum?>? enumMap;\n\n  Map<Object?, Object?>? objectMap;\n\n  Map<int?, List<Object?>?>? listMap;\n\n  Map<int?, Map<Object?, Object?>?>? mapMap;\n\n  Map<int?, AllNullableTypes?>? recursiveClassMap;\n\n  List<Object?> _toList() {\n    return <Object?>[\n      aNullableBool,\n      aNullableInt,\n      aNullableInt64,\n      aNullableDouble,\n      aNullableByteArray,\n      aNullable4ByteArray,\n      aNullable8ByteArray,\n      aNullableFloatArray,\n      aNullableEnum,\n      anotherNullableEnum,\n      aNullableString,\n      aNullableObject,\n      allNullableTypes,\n      list,\n      stringList,\n      intList,\n      doubleList,\n      boolList,\n      enumList,\n      objectList,\n      listList,\n      mapList,\n      recursiveClassList,\n      map,\n      stringMap,\n      intMap,\n      enumMap,\n      objectMap,\n      listMap,\n      mapMap,\n      recursiveClassMap,\n    ];\n  }\n\n  Object encode() {\n    return _toList();  }\n\n  static AllNullableTypes decode(Object result) {\n    result as List<Object?>;\n    return AllNullableTypes(\n      aNullableBool: result[0] as bool?,\n      aNullableInt: result[1] as int?,\n      aNullableInt64: result[2] as int?,\n      aNullableDouble: result[3] as double?,\n      aNullableByteArray: result[4] as Uint8List?,\n      aNullable4ByteArray: result[5] as Int32List?,\n      aNullable8ByteArray: result[6] as Int64List?,\n      aNullableFloatArray: result[7] as Float64List?,\n      aNullableEnum: result[8] as AnEnum?,\n      anotherNullableEnum: result[9] as AnotherEnum?,\n      aNullableString: result[10] as String?,\n      aNullableObject: result[11],\n      allNullableTypes: result[12] as AllNullableTypes?,\n      list: result[13] as List<Object?>?,\n      stringList: (result[14] as List<Object?>?)?.cast<String?>(),\n      intList: (result[15] as List<Object?>?)?.cast<int?>(),\n      doubleList: (result[16] as List<Object?>?)?.cast<double?>(),\n      boolList: (result[17] as List<Object?>?)?.cast<bool?>(),\n      enumList: (result[18] as List<Object?>?)?.cast<AnEnum?>(),\n      objectList: (result[19] as List<Object?>?)?.cast<Object?>(),\n      listList: (result[20] as List<Object?>?)?.cast<List<Object?>?>(),\n      mapList: (result[21] as List<Object?>?)?.cast<Map<Object?, Object?>?>(),\n      recursiveClassList: (result[22] as List<Object?>?)?.cast<AllNullableTypes?>(),\n      map: result[23] as Map<Object?, Object?>?,\n      stringMap: (result[24] as Map<Object?, Object?>?)?.cast<String?, String?>(),\n      intMap: (result[25] as Map<Object?, Object?>?)?.cast<int?, int?>(),\n      enumMap: (result[26] as Map<Object?, Object?>?)?.cast<AnEnum?, AnEnum?>(),\n      objectMap: (result[27] as Map<Object?, Object?>?)?.cast<Object?, Object?>(),\n      listMap: (result[28] as Map<Object?, Object?>?)?.cast<int?, List<Object?>?>(),\n      mapMap: (result[29] as Map<Object?, Object?>?)?.cast<int?, Map<Object?, Object?>?>(),\n      recursiveClassMap: (result[30] as Map<Object?, Object?>?)?.cast<int?, AllNullableTypes?>(),\n    );\n  }\n\n  @override\n  // ignore: avoid_equals_and_hash_code_on_mutable_classes\n  bool operator ==(Object other) {\n    if (other is! AllNullableTypes || other.runtimeType != runtimeType) {\n      return false;\n    }\n    if (identical(this, other)) {\n      return true;\n    }\n    return _deepEquals(encode(), other.encode());\n  }\n\n  @override\n  // ignore: avoid_equals_and_hash_code_on_mutable_classes\n  int get hashCode => Object.hashAll(_toList())\n;\n}\n\n/// The primary purpose for this class is to ensure coverage of Swift structs\n/// with nullable items, as the primary [AllNullableTypes] class is being used to\n/// test Swift classes.\nclass AllNullableTypesWithoutRecursion {\n  AllNullableTypesWithoutRecursion({\n    this.aNullableBool,\n    this.aNullableInt,\n    this.aNullableInt64,\n    this.aNullableDouble,\n    this.aNullableByteArray,\n    this.aNullable4ByteArray,\n    this.aNullable8ByteArray,\n    this.aNullableFloatArray,\n    this.aNullableEnum,\n    this.anotherNullableEnum,\n    this.aNullableString,\n    this.aNullableObject,\n    this.list,\n    this.stringList,\n    this.intList,\n    this.doubleList,\n    this.boolList,\n    this.enumList,\n    this.objectList,\n    this.listList,\n    this.mapList,\n    this.map,\n    this.stringMap,\n    this.intMap,\n    this.enumMap,\n    this.objectMap,\n    this.listMap,\n    this.mapMap,\n  });\n\n  bool? aNullableBool;\n\n  int? aNullableInt;\n\n  int? aNullableInt64;\n\n  double? aNullableDouble;\n\n  Uint8List? aNullableByteArray;\n\n  Int32List? aNullable4ByteArray;\n\n  Int64List? aNullable8ByteArray;\n\n  Float64List? aNullableFloatArray;\n\n  AnEnum? aNullableEnum;\n\n  AnotherEnum? anotherNullableEnum;\n\n  String? aNullableString;\n\n  Object? aNullableObject;\n\n  List<Object?>? list;\n\n  List<String?>? stringList;\n\n  List<int?>? intList;\n\n  List<double?>? doubleList;\n\n  List<bool?>? boolList;\n\n  List<AnEnum?>? enumList;\n\n  List<Object?>? objectList;\n\n  List<List<Object?>?>? listList;\n\n  List<Map<Object?, Object?>?>? mapList;\n\n  Map<Object?, Object?>? map;\n\n  Map<String?, String?>? stringMap;\n\n  Map<int?, int?>? intMap;\n\n  Map<AnEnum?, AnEnum?>? enumMap;\n\n  Map<Object?, Object?>? objectMap;\n\n  Map<int?, List<Object?>?>? listMap;\n\n  Map<int?, Map<Object?, Object?>?>? mapMap;\n\n  List<Object?> _toList() {\n    return <Object?>[\n      aNullableBool,\n      aNullableInt,\n      aNullableInt64,\n      aNullableDouble,\n      aNullableByteArray,\n      aNullable4ByteArray,\n      aNullable8ByteArray,\n      aNullableFloatArray,\n      aNullableEnum,\n      anotherNullableEnum,\n      aNullableString,\n      aNullableObject,\n      list,\n      stringList,\n      intList,\n      doubleList,\n      boolList,\n      enumList,\n      objectList,\n      listList,\n      mapList,\n      map,\n      stringMap,\n      intMap,\n      enumMap,\n      objectMap,\n      listMap,\n      mapMap,\n    ];\n  }\n\n  Object encode() {\n    return _toList();  }\n\n  static AllNullableTypesWithoutRecursion decode(Object result) {\n    result as List<Object?>;\n    return AllNullableTypesWithoutRecursion(\n      aNullableBool: result[0] as bool?,\n      aNullableInt: result[1] as int?,\n      aNullableInt64: result[2] as int?,\n      aNullableDouble: result[3] as double?,\n      aNullableByteArray: result[4] as Uint8List?,\n      aNullable4ByteArray: result[5] as Int32List?,\n      aNullable8ByteArray: result[6] as Int64List?,\n      aNullableFloatArray: result[7] as Float64List?,\n      aNullableEnum: result[8] as AnEnum?,\n      anotherNullableEnum: result[9] as AnotherEnum?,\n      aNullableString: result[10] as String?,\n      aNullableObject: result[11],\n      list: result[12] as List<Object?>?,\n      stringList: (result[13] as List<Object?>?)?.cast<String?>(),\n      intList: (result[14] as List<Object?>?)?.cast<int?>(),\n      doubleList: (result[15] as List<Object?>?)?.cast<double?>(),\n      boolList: (result[16] as List<Object?>?)?.cast<bool?>(),\n      enumList: (result[17] as List<Object?>?)?.cast<AnEnum?>(),\n      objectList: (result[18] as List<Object?>?)?.cast<Object?>(),\n      listList: (result[19] as List<Object?>?)?.cast<List<Object?>?>(),\n      mapList: (result[20] as List<Object?>?)?.cast<Map<Object?, Object?>?>(),\n      map: result[21] as Map<Object?, Object?>?,\n      stringMap: (result[22] as Map<Object?, Object?>?)?.cast<String?, String?>(),\n      intMap: (result[23] as Map<Object?, Object?>?)?.cast<int?, int?>(),\n      enumMap: (result[24] as Map<Object?, Object?>?)?.cast<AnEnum?, AnEnum?>(),\n      objectMap: (result[25] as Map<Object?, Object?>?)?.cast<Object?, Object?>(),\n      listMap: (result[26] as Map<Object?, Object?>?)?.cast<int?, List<Object?>?>(),\n      mapMap: (result[27] as Map<Object?, Object?>?)?.cast<int?, Map<Object?, Object?>?>(),\n    );\n  }\n\n  @override\n  // ignore: avoid_equals_and_hash_code_on_mutable_classes\n  bool operator ==(Object other) {\n    if (other is! AllNullableTypesWithoutRecursion || other.runtimeType != runtimeType) {\n      return false;\n    }\n    if (identical(this, other)) {\n      return true;\n    }\n    return _deepEquals(encode(), other.encode());\n  }\n\n  @override\n  // ignore: avoid_equals_and_hash_code_on_mutable_classes\n  int get hashCode => Object.hashAll(_toList())\n;\n}\n\n/// A class for testing nested class handling.\n///\n/// This is needed to test nested nullable and non-nullable classes,\n/// `AllNullableTypes` is non-nullable here as it is easier to instantiate\n/// than `AllTypes` when testing doesn't require both (ie. testing null classes).\nclass AllClassesWrapper {\n  AllClassesWrapper({\n    required this.allNullableTypes,\n    this.allNullableTypesWithoutRecursion,\n    this.allTypes,\n    required this.classList,\n    this.nullableClassList,\n    required this.classMap,\n    this.nullableClassMap,\n  });\n\n  AllNullableTypes allNullableTypes;\n\n  AllNullableTypesWithoutRecursion? allNullableTypesWithoutRecursion;\n\n  AllTypes? allTypes;\n\n  List<AllTypes?> classList;\n\n  List<AllNullableTypesWithoutRecursion?>? nullableClassList;\n\n  Map<int?, AllTypes?> classMap;\n\n  Map<int?, AllNullableTypesWithoutRecursion?>? nullableClassMap;\n\n  List<Object?> _toList() {\n    return <Object?>[\n      allNullableTypes,\n      allNullableTypesWithoutRecursion,\n      allTypes,\n      classList,\n      nullableClassList,\n      classMap,\n      nullableClassMap,\n    ];\n  }\n\n  Object encode() {\n    return _toList();  }\n\n  static AllClassesWrapper decode(Object result) {\n    result as List<Object?>;\n    return AllClassesWrapper(\n      allNullableTypes: result[0]! as AllNullableTypes,\n      allNullableTypesWithoutRecursion: result[1] as AllNullableTypesWithoutRecursion?,\n      allTypes: result[2] as AllTypes?,\n      classList: (result[3] as List<Object?>?)!.cast<AllTypes?>(),\n      nullableClassList: (result[4] as List<Object?>?)?.cast<AllNullableTypesWithoutRecursion?>(),\n      classMap: (result[5] as Map<Object?, Object?>?)!.cast<int?, AllTypes?>(),\n      nullableClassMap: (result[6] as Map<Object?, Object?>?)?.cast<int?, AllNullableTypesWithoutRecursion?>(),\n    );\n  }\n\n  @override\n  // ignore: avoid_equals_and_hash_code_on_mutable_classes\n  bool operator ==(Object other) {\n    if (other is! AllClassesWrapper || other.runtimeType != runtimeType) {\n      return false;\n    }\n    if (identical(this, other)) {\n      return true;\n    }\n    return _deepEquals(encode(), other.encode());\n  }\n\n  @override\n  // ignore: avoid_equals_and_hash_code_on_mutable_classes\n  int get hashCode => Object.hashAll(_toList())\n;\n}\n\n/// A data class containing a List, used in unit tests.\nclass TestMessage {\n  TestMessage({\n    this.testList,\n  });\n\n  List<Object?>? testList;\n\n  List<Object?> _toList() {\n    return <Object?>[\n      testList,\n    ];\n  }\n\n  Object encode() {\n    return _toList();  }\n\n  static TestMessage decode(Object result) {\n    result as List<Object?>;\n    return TestMessage(\n      testList: result[0] as List<Object?>?,\n    );\n  }\n\n  @override\n  // ignore: avoid_equals_and_hash_code_on_mutable_classes\n  bool operator ==(Object other) {\n    if (other is! TestMessage || other.runtimeType != runtimeType) {\n      return false;\n    }\n    if (identical(this, other)) {\n      return true;\n    }\n    return _deepEquals(encode(), other.encode());\n  }\n\n  @override\n  // ignore: avoid_equals_and_hash_code_on_mutable_classes\n  int get hashCode => Object.hashAll(_toList())\n;\n}\n\n\nclass _PigeonCodec extends StandardMessageCodec {\n  const _PigeonCodec();\n  @override\n  void writeValue(WriteBuffer buffer, Object? value) {\n    if (value is int) {\n      buffer.putUint8(4);\n      buffer.putInt64(value);\n    }    else if (value is AnEnum) {\n      buffer.putUint8(129);\n      writeValue(buffer, value.index);\n    }    else if (value is AnotherEnum) {\n      buffer.putUint8(130);\n      writeValue(buffer, value.index);\n    }    else if (value is UnusedClass) {\n      buffer.putUint8(131);\n      writeValue(buffer, value.encode());\n    }    else if (value is AllTypes) {\n      buffer.putUint8(132);\n      writeValue(buffer, value.encode());\n    }    else if (value is AllNullableTypes) {\n      buffer.putUint8(133);\n      writeValue(buffer, value.encode());\n    }    else if (value is AllNullableTypesWithoutRecursion) {\n      buffer.putUint8(134);\n      writeValue(buffer, value.encode());\n    }    else if (value is AllClassesWrapper) {\n      buffer.putUint8(135);\n      writeValue(buffer, value.encode());\n    }    else if (value is TestMessage) {\n      buffer.putUint8(136);\n      writeValue(buffer, value.encode());\n    } else {\n      super.writeValue(buffer, value);\n    }\n  }\n\n  @override\n  Object? readValueOfType(int type, ReadBuffer buffer) {\n    switch (type) {\n      case 129: \n        final value = readValue(buffer) as int?;\n        return value == null ? null : AnEnum.values[value];\n      case 130: \n        final value = readValue(buffer) as int?;\n        return value == null ? null : AnotherEnum.values[value];\n      case 131: \n        return UnusedClass.decode(readValue(buffer)!);\n      case 132: \n        return AllTypes.decode(readValue(buffer)!);\n      case 133: \n        return AllNullableTypes.decode(readValue(buffer)!);\n      case 134: \n        return AllNullableTypesWithoutRecursion.decode(readValue(buffer)!);\n      case 135: \n        return AllClassesWrapper.decode(readValue(buffer)!);\n      case 136: \n        return TestMessage.decode(readValue(buffer)!);\n      default:\n        return super.readValueOfType(type, buffer);\n    }\n  }\n}\n\n/// The core interface that each host language plugin must implement in\n/// platform_test integration tests.\nclass HostIntegrationCoreApi {\n  /// Constructor for [HostIntegrationCoreApi].  The [binaryMessenger] named argument is\n  /// available for dependency injection.  If it is left null, the default\n  /// BinaryMessenger will be used which routes to the host platform.\n  HostIntegrationCoreApi({BinaryMessenger? binaryMessenger, String messageChannelSuffix = ''})\n      : pigeonVar_binaryMessenger = binaryMessenger,\n        pigeonVar_messageChannelSuffix = messageChannelSuffix.isNotEmpty ? '.$messageChannelSuffix' : '';\n  final BinaryMessenger? pigeonVar_binaryMessenger;\n\n  static const MessageCodec<Object?> pigeonChannelCodec = _PigeonCodec();\n\n  final String pigeonVar_messageChannelSuffix;\n\n  /// A no-op function taking no arguments and returning no value, to sanity\n  /// test basic calling.\n  Future<void> noop() async {\n    final pigeonVar_channelName = 'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.noop$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(null);\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else {\n      return;\n    }\n  }\n\n  /// Returns the passed object, to test serialization and deserialization.\n  Future<AllTypes> echoAllTypes(AllTypes everything) async {\n    final pigeonVar_channelName = 'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.echoAllTypes$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(<Object?>[everything]);\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else if (pigeonVar_replyList[0] == null) {\n      throw PlatformException(\n        code: 'null-error',\n        message: 'Host platform returned null value for non-null return value.',\n      );\n    } else {\n      return (pigeonVar_replyList[0] as AllTypes?)!;\n    }\n  }\n\n  /// Returns an error, to test error handling.\n  Future<Object?> throwError() async {\n    final pigeonVar_channelName = 'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.throwError$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(null);\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else {\n      return pigeonVar_replyList[0];\n    }\n  }\n\n  /// Returns an error from a void function, to test error handling.\n  Future<void> throwErrorFromVoid() async {\n    final pigeonVar_channelName = 'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.throwErrorFromVoid$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(null);\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else {\n      return;\n    }\n  }\n\n  /// Returns a Flutter error, to test error handling.\n  Future<Object?> throwFlutterError() async {\n    final pigeonVar_channelName = 'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.throwFlutterError$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(null);\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else {\n      return pigeonVar_replyList[0];\n    }\n  }\n\n  /// Returns passed in int.\n  Future<int> echoInt(int anInt) async {\n    final pigeonVar_channelName = 'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.echoInt$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(<Object?>[anInt]);\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else if (pigeonVar_replyList[0] == null) {\n      throw PlatformException(\n        code: 'null-error',\n        message: 'Host platform returned null value for non-null return value.',\n      );\n    } else {\n      return (pigeonVar_replyList[0] as int?)!;\n    }\n  }\n\n  /// Returns passed in double.\n  Future<double> echoDouble(double aDouble) async {\n    final pigeonVar_channelName = 'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.echoDouble$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(<Object?>[aDouble]);\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else if (pigeonVar_replyList[0] == null) {\n      throw PlatformException(\n        code: 'null-error',\n        message: 'Host platform returned null value for non-null return value.',\n      );\n    } else {\n      return (pigeonVar_replyList[0] as double?)!;\n    }\n  }\n\n  /// Returns the passed in boolean.\n  Future<bool> echoBool(bool aBool) async {\n    final pigeonVar_channelName = 'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.echoBool$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(<Object?>[aBool]);\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else if (pigeonVar_replyList[0] == null) {\n      throw PlatformException(\n        code: 'null-error',\n        message: 'Host platform returned null value for non-null return value.',\n      );\n    } else {\n      return (pigeonVar_replyList[0] as bool?)!;\n    }\n  }\n\n  /// Returns the passed in string.\n  Future<String> echoString(String aString) async {\n    final pigeonVar_channelName = 'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.echoString$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(<Object?>[aString]);\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else if (pigeonVar_replyList[0] == null) {\n      throw PlatformException(\n        code: 'null-error',\n        message: 'Host platform returned null value for non-null return value.',\n      );\n    } else {\n      return (pigeonVar_replyList[0] as String?)!;\n    }\n  }\n\n  /// Returns the passed in Uint8List.\n  Future<Uint8List> echoUint8List(Uint8List aUint8List) async {\n    final pigeonVar_channelName = 'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.echoUint8List$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(<Object?>[aUint8List]);\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {\n      throw _createConnectionError(pigeonVar_channelName);\n    } else if (pigeonVar_replyList.length > 1) {\n      throw PlatformException(\n        code: pigeonVar_replyList[0]! as String,\n        message: pigeonVar_replyList[1] as String?,\n        details: pigeonVar_replyList[2],\n      );\n    } else if (pigeonVar_replyList[0] == null) {\n      throw PlatformException(\n        code: 'null-error',\n        message: 'Host platform returned null value for non-null return value.',\n      );\n    } else {\n      return (pigeonVar_replyList[0] as Uint8List?)!;\n    }\n  }\n\n  /// Returns the passed in generic Object.\n  Future<Object> echoObject(Object anObject) async {\n    final pigeonVar_channelName = 'dev.flutter.pigeon.pigeon_integration_tests.HostIntegrationCoreApi.echoObject$pigeonVar_messageChannelSuffix';\n    final pigeonVar_channel = BasicMessageChannel<Object?>(\n      pigeonVar_channelName,\n      pigeonChannelCodec,\n      binaryMessenger: pigeonVar_binaryMessenger,\n    );\n    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(<Object?>[anObject]);\n    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;\n    if (pigeonVar_replyList == null) {"}]},"clientRequestTime":1771003802092}}
 {"time":1771003802098,"kind":"message","sender":"server","receiver":"ide","message":{"id":8,"jsonrpc":"2.0","method":"window/workDoneProgress/create","params":{"token":"ANALYZING"}}}
-{"time":1771003802171,"kind":"message","sender":"server","receiver":"ide","message":{"jsonrpc":"2.0","method":"textDocument/publishDiagnostics","params":{"diagnostics":[{"code":"expected_token","message":"Expected to find '}'.","range":{"end":{"character":39,"line":1114},"start":{"character":38,"line":1114}},"severity":1,"source":"dart"},{"code":"body_might_complete_normally","codeDescription":{"href":"https://dart.dev/diagnostics/body_might_complete_normally"},"message":"The body might complete normally, causing 'null' to be returned, but the return type, 'FutureOr<Object>', is a potentially non-nullable type.\nTry adding either a return or a throw statement at the end.","range":{"end":{"character":27,"line":1105},"start":{"character":17,"line":1105}},"severity":1,"source":"dart"},{"code":"eol_at_end_of_file","codeDescription":{"href":"https://dart.dev/lints/eol_at_end_of_file"},"message":"Missing a newline at the end of the file.\nTry adding a newline at the end of the file.","range":{"end":{"character":39,"line":1114},"start":{"character":38,"line":1114}},"severity":3,"source":"dart"}],"uri":"file://{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"}}}
+{"time":1771003802171,"kind":"message","sender":"server","receiver":"ide","message":{"jsonrpc":"2.0","method":"textDocument/publishDiagnostics","params":{"diagnostics":[{"code":"expected_token","message":"Expected to find '}'.","range":{"end":{"character":39,"line":1114},"start":{"character":38,"line":1114}},"severity":1,"source":"dart"},{"code":"body_might_complete_normally","codeDescription":{"href":"https://dart.dev/diagnostics/body_might_complete_normally"},"message":"The body might complete normally, causing 'null' to be returned, but the return type, 'FutureOr<Object>', is a potentially non-nullable type.\nTry adding either a return or a throw statement at the end.","range":{"end":{"character":27,"line":1105},"start":{"character":17,"line":1105}},"severity":1,"source":"dart"},{"code":"eol_at_end_of_file","codeDescription":{"href":"https://dart.dev/lints/eol_at_end_of_file"},"message":"Missing a newline at the end of the file.\nTry adding a newline at the end of the file.","range":{"end":{"character":39,"line":1114},"start":{"character":38,"line":1114}},"severity":3,"source":"dart"}],"uri":"{{workspaceFolder-0}}/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart"}}}
diff --git a/pkg/analysis_server/tool/performance/scenarios/logs/sdk_rename_driver_class.json b/pkg/analysis_server/tool/performance/scenarios/logs/sdk_rename_driver_class.json
index b769a73..f47f83a 100644
--- a/pkg/analysis_server/tool/performance/scenarios/logs/sdk_rename_driver_class.json
+++ b/pkg/analysis_server/tool/performance/scenarios/logs/sdk_rename_driver_class.json
@@ -1,108 +1,108 @@
 {"time":1768238804323,"kind":"commandLine","argList":["--protocol=lsp","--client-id=VS-Code-Remote","--client-version=3.126.0"]}
-{"time":1768238804334,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","id":0,"method":"initialize","params":{"processId":1630998,"clientInfo":{"name":"Jetski","version":"1.104.0"},"locale":"en","rootPath":"{{workspaceFolder-0}}","rootUri":"file://{{workspaceFolder-0}}","capabilities":{"workspace":{"applyEdit":true,"workspaceEdit":{"documentChanges":true,"resourceOperations":["create","rename","delete"],"failureHandling":"textOnlyTransactional","normalizesLineEndings":true,"changeAnnotationSupport":{"groupsOnLabel":true}},"configuration":true,"didChangeWatchedFiles":{"dynamicRegistration":true,"relativePatternSupport":true},"symbol":{"dynamicRegistration":true,"symbolKind":{"valueSet":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26]},"tagSupport":{"valueSet":[1]},"resolveSupport":{"properties":["location.range"]}},"codeLens":{"refreshSupport":true},"executeCommand":{"dynamicRegistration":true},"didChangeConfiguration":{"dynamicRegistration":true},"workspaceFolders":true,"foldingRange":{"refreshSupport":true},"semanticTokens":{"refreshSupport":true},"fileOperations":{"dynamicRegistration":true,"didCreate":true,"didRename":true,"didDelete":true,"willCreate":true,"willRename":true,"willDelete":true},"inlineValue":{"refreshSupport":true},"inlayHint":{"refreshSupport":true},"diagnostics":{"refreshSupport":true}},"textDocument":{"publishDiagnostics":{"relatedInformation":true,"versionSupport":false,"tagSupport":{"valueSet":[1,2]},"codeDescriptionSupport":true,"dataSupport":true},"synchronization":{"dynamicRegistration":true,"willSave":true,"willSaveWaitUntil":true,"didSave":true},"completion":{"dynamicRegistration":true,"contextSupport":true,"completionItem":{"snippetSupport":true,"commitCharactersSupport":true,"documentationFormat":["markdown","plaintext"],"deprecatedSupport":true,"preselectSupport":true,"tagSupport":{"valueSet":[1]},"insertReplaceSupport":true,"resolveSupport":{"properties":["documentation","detail","additionalTextEdits"]},"insertTextModeSupport":{"valueSet":[1,2]},"labelDetailsSupport":true},"insertTextMode":2,"completionItemKind":{"valueSet":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25]},"completionList":{"itemDefaults":["commitCharacters","editRange","insertTextFormat","insertTextMode","data"]}},"hover":{"dynamicRegistration":true,"contentFormat":["markdown","plaintext"]},"signatureHelp":{"dynamicRegistration":true,"signatureInformation":{"documentationFormat":["markdown","plaintext"],"parameterInformation":{"labelOffsetSupport":true},"activeParameterSupport":true},"contextSupport":true},"definition":{"dynamicRegistration":true,"linkSupport":true},"references":{"dynamicRegistration":true},"documentHighlight":{"dynamicRegistration":true},"documentSymbol":{"dynamicRegistration":true,"symbolKind":{"valueSet":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26]},"hierarchicalDocumentSymbolSupport":true,"tagSupport":{"valueSet":[1]},"labelSupport":true},"codeAction":{"dynamicRegistration":true,"isPreferredSupport":true,"disabledSupport":true,"dataSupport":true,"resolveSupport":{"properties":["edit"]},"codeActionLiteralSupport":{"codeActionKind":{"valueSet":["","quickfix","refactor","refactor.extract","refactor.inline","refactor.rewrite","source","source.organizeImports"]}},"honorsChangeAnnotations":true},"codeLens":{"dynamicRegistration":true},"formatting":{"dynamicRegistration":true},"rangeFormatting":{"dynamicRegistration":true,"rangesSupport":true},"onTypeFormatting":{"dynamicRegistration":true},"rename":{"dynamicRegistration":true,"prepareSupport":true,"prepareSupportDefaultBehavior":1,"honorsChangeAnnotations":true},"documentLink":{"dynamicRegistration":true,"tooltipSupport":true},"typeDefinition":{"dynamicRegistration":true,"linkSupport":true},"implementation":{"dynamicRegistration":true,"linkSupport":true},"colorProvider":{"dynamicRegistration":true},"foldingRange":{"dynamicRegistration":true,"rangeLimit":5000,"lineFoldingOnly":true,"foldingRangeKind":{"valueSet":["comment","imports","region"]},"foldingRange":{"collapsedText":false}},"declaration":{"dynamicRegistration":true,"linkSupport":true},"selectionRange":{"dynamicRegistration":true},"callHierarchy":{"dynamicRegistration":true},"semanticTokens":{"dynamicRegistration":true,"tokenTypes":["namespace","type","class","enum","interface","struct","typeParameter","parameter","variable","property","enumMember","event","function","method","macro","keyword","modifier","comment","string","number","regexp","operator","decorator"],"tokenModifiers":["declaration","definition","readonly","static","deprecated","abstract","async","modification","documentation","defaultLibrary"],"formats":["relative"],"requests":{"range":true,"full":{"delta":true}},"multilineTokenSupport":false,"overlappingTokenSupport":false,"serverCancelSupport":true,"augmentsSyntaxTokens":true},"linkedEditingRange":{"dynamicRegistration":true},"typeHierarchy":{"dynamicRegistration":true},"inlineValue":{"dynamicRegistration":true},"inlayHint":{"dynamicRegistration":true,"resolveSupport":{"properties":["tooltip","textEdits","label.tooltip","label.location","label.command"]}},"diagnostic":{"dynamicRegistration":true,"relatedDocumentSupport":false}},"window":{"showMessage":{"messageActionItem":{"additionalPropertiesSupport":true}},"showDocument":{"support":true},"workDoneProgress":true},"general":{"staleRequestSupport":{"cancel":true,"retryOnContentModified":["textDocument/semanticTokens/full","textDocument/semanticTokens/range","textDocument/semanticTokens/full/delta"]},"regularExpressions":{"engine":"ECMAScript","version":"ES2020"},"markdown":{"parser":"marked","version":"1.1.0","allowedTags":["ul","li","p","code","blockquote","ol","h1","h2","h3","h4","h5","h6","hr","em","pre","table","thead","tbody","tr","th","td","div","del","a","strong","br","img","span"]},"positionEncodings":["utf-16"]},"notebookDocument":{"synchronization":{"dynamicRegistration":true,"executionSummarySupport":true}},"experimental":{"supportsWindowShowMessageRequest":true,"commands":["dart.goToLocation"],"dartCodeAction":{"commandParameterSupport":{"supportedKinds":["saveUri"]}},"snippetTextEdit":true}},"initializationOptions":{"allowOpenUri":true,"appHost":"desktop","closingLabels":true,"flutterOutline":false,"hostKind":"ssh-remote","onlyAnalyzeProjectsWithOpenFiles":false,"outline":true,"previewSurveys":true,"remoteName":"ssh-remote","suggestFromUnimportedLibraries":true,"useInEditorDartFixPrompt":true},"trace":"off","workspaceFolders":[{"uri":"file://{{workspaceFolder-0}}","name":"analysis_server"}]},"clientRequestTime":1768238804258}}
+{"time":1768238804334,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","id":0,"method":"initialize","params":{"processId":1630998,"clientInfo":{"name":"Jetski","version":"1.104.0"},"locale":"en","rootPath":"{{workspaceFolder-0:filePath}}","rootUri":"{{workspaceFolder-0}}","capabilities":{"workspace":{"applyEdit":true,"workspaceEdit":{"documentChanges":true,"resourceOperations":["create","rename","delete"],"failureHandling":"textOnlyTransactional","normalizesLineEndings":true,"changeAnnotationSupport":{"groupsOnLabel":true}},"configuration":true,"didChangeWatchedFiles":{"dynamicRegistration":true,"relativePatternSupport":true},"symbol":{"dynamicRegistration":true,"symbolKind":{"valueSet":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26]},"tagSupport":{"valueSet":[1]},"resolveSupport":{"properties":["location.range"]}},"codeLens":{"refreshSupport":true},"executeCommand":{"dynamicRegistration":true},"didChangeConfiguration":{"dynamicRegistration":true},"workspaceFolders":true,"foldingRange":{"refreshSupport":true},"semanticTokens":{"refreshSupport":true},"fileOperations":{"dynamicRegistration":true,"didCreate":true,"didRename":true,"didDelete":true,"willCreate":true,"willRename":true,"willDelete":true},"inlineValue":{"refreshSupport":true},"inlayHint":{"refreshSupport":true},"diagnostics":{"refreshSupport":true}},"textDocument":{"publishDiagnostics":{"relatedInformation":true,"versionSupport":false,"tagSupport":{"valueSet":[1,2]},"codeDescriptionSupport":true,"dataSupport":true},"synchronization":{"dynamicRegistration":true,"willSave":true,"willSaveWaitUntil":true,"didSave":true},"completion":{"dynamicRegistration":true,"contextSupport":true,"completionItem":{"snippetSupport":true,"commitCharactersSupport":true,"documentationFormat":["markdown","plaintext"],"deprecatedSupport":true,"preselectSupport":true,"tagSupport":{"valueSet":[1]},"insertReplaceSupport":true,"resolveSupport":{"properties":["documentation","detail","additionalTextEdits"]},"insertTextModeSupport":{"valueSet":[1,2]},"labelDetailsSupport":true},"insertTextMode":2,"completionItemKind":{"valueSet":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25]},"completionList":{"itemDefaults":["commitCharacters","editRange","insertTextFormat","insertTextMode","data"]}},"hover":{"dynamicRegistration":true,"contentFormat":["markdown","plaintext"]},"signatureHelp":{"dynamicRegistration":true,"signatureInformation":{"documentationFormat":["markdown","plaintext"],"parameterInformation":{"labelOffsetSupport":true},"activeParameterSupport":true},"contextSupport":true},"definition":{"dynamicRegistration":true,"linkSupport":true},"references":{"dynamicRegistration":true},"documentHighlight":{"dynamicRegistration":true},"documentSymbol":{"dynamicRegistration":true,"symbolKind":{"valueSet":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26]},"hierarchicalDocumentSymbolSupport":true,"tagSupport":{"valueSet":[1]},"labelSupport":true},"codeAction":{"dynamicRegistration":true,"isPreferredSupport":true,"disabledSupport":true,"dataSupport":true,"resolveSupport":{"properties":["edit"]},"codeActionLiteralSupport":{"codeActionKind":{"valueSet":["","quickfix","refactor","refactor.extract","refactor.inline","refactor.rewrite","source","source.organizeImports"]}},"honorsChangeAnnotations":true},"codeLens":{"dynamicRegistration":true},"formatting":{"dynamicRegistration":true},"rangeFormatting":{"dynamicRegistration":true,"rangesSupport":true},"onTypeFormatting":{"dynamicRegistration":true},"rename":{"dynamicRegistration":true,"prepareSupport":true,"prepareSupportDefaultBehavior":1,"honorsChangeAnnotations":true},"documentLink":{"dynamicRegistration":true,"tooltipSupport":true},"typeDefinition":{"dynamicRegistration":true,"linkSupport":true},"implementation":{"dynamicRegistration":true,"linkSupport":true},"colorProvider":{"dynamicRegistration":true},"foldingRange":{"dynamicRegistration":true,"rangeLimit":5000,"lineFoldingOnly":true,"foldingRangeKind":{"valueSet":["comment","imports","region"]},"foldingRange":{"collapsedText":false}},"declaration":{"dynamicRegistration":true,"linkSupport":true},"selectionRange":{"dynamicRegistration":true},"callHierarchy":{"dynamicRegistration":true},"semanticTokens":{"dynamicRegistration":true,"tokenTypes":["namespace","type","class","enum","interface","struct","typeParameter","parameter","variable","property","enumMember","event","function","method","macro","keyword","modifier","comment","string","number","regexp","operator","decorator"],"tokenModifiers":["declaration","definition","readonly","static","deprecated","abstract","async","modification","documentation","defaultLibrary"],"formats":["relative"],"requests":{"range":true,"full":{"delta":true}},"multilineTokenSupport":false,"overlappingTokenSupport":false,"serverCancelSupport":true,"augmentsSyntaxTokens":true},"linkedEditingRange":{"dynamicRegistration":true},"typeHierarchy":{"dynamicRegistration":true},"inlineValue":{"dynamicRegistration":true},"inlayHint":{"dynamicRegistration":true,"resolveSupport":{"properties":["tooltip","textEdits","label.tooltip","label.location","label.command"]}},"diagnostic":{"dynamicRegistration":true,"relatedDocumentSupport":false}},"window":{"showMessage":{"messageActionItem":{"additionalPropertiesSupport":true}},"showDocument":{"support":true},"workDoneProgress":true},"general":{"staleRequestSupport":{"cancel":true,"retryOnContentModified":["textDocument/semanticTokens/full","textDocument/semanticTokens/range","textDocument/semanticTokens/full/delta"]},"regularExpressions":{"engine":"ECMAScript","version":"ES2020"},"markdown":{"parser":"marked","version":"1.1.0","allowedTags":["ul","li","p","code","blockquote","ol","h1","h2","h3","h4","h5","h6","hr","em","pre","table","thead","tbody","tr","th","td","div","del","a","strong","br","img","span"]},"positionEncodings":["utf-16"]},"notebookDocument":{"synchronization":{"dynamicRegistration":true,"executionSummarySupport":true}},"experimental":{"supportsWindowShowMessageRequest":true,"commands":["dart.goToLocation"],"dartCodeAction":{"commandParameterSupport":{"supportedKinds":["saveUri"]}},"snippetTextEdit":true}},"initializationOptions":{"allowOpenUri":true,"appHost":"desktop","closingLabels":true,"flutterOutline":false,"hostKind":"ssh-remote","onlyAnalyzeProjectsWithOpenFiles":false,"outline":true,"previewSurveys":true,"remoteName":"ssh-remote","suggestFromUnimportedLibraries":true,"useInEditorDartFixPrompt":true},"trace":"off","workspaceFolders":[{"uri":"{{workspaceFolder-0}}","name":"analysis_server"}]},"clientRequestTime":1768238804258}}
 {"time":1768238804336,"kind":"message","sender":"server","receiver":"ide","message":{"id":0,"jsonrpc":"2.0","result":{"capabilities":{"executeCommandProvider":{"commands":["dart.edit.codeAction.apply","dart.edit.sortMembers","dart.edit.organizeImports","dart.edit.fixAll","dart.edit.fixAllInWorkspace.preview","dart.edit.fixAllInWorkspace","dart.edit.sendWorkspaceEdit","refactor.perform","refactor.validate","dart.logAction","dart.refactor.convert_all_formal_parameters_to_named","dart.refactor.convert_selected_formal_parameters_to_named","dart.refactor.move_selected_formal_parameters_left","dart.refactor.move_top_level_to_file"],"workDoneProgress":true},"experimental":{"updateDiagnosticInformation":{},"textDocument":{"super":{},"augmented":{},"augmentation":{}}},"workspace":{"workspaceFolders":{"changeNotifications":true,"supported":true}},"workspaceSymbolProvider":true},"serverInfo":{"name":"Dart SDK LSP Analysis Server","version":"3.12.0-edge"}}}}
 {"time":1768238804372,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","method":"initialized","params":{},"clientRequestTime":1768238804371}}
-{"time":1768238804380,"kind":"message","sender":"server","receiver":"ide","message":{"id":1,"jsonrpc":"2.0","method":"workspace/configuration","params":{"items":[{"scopeUri":"file://{{workspaceFolder-0}}","section":"dart"},{"section":"dart"}]}}}
+{"time":1768238804380,"kind":"message","sender":"server","receiver":"ide","message":{"id":1,"jsonrpc":"2.0","method":"workspace/configuration","params":{"items":[{"scopeUri":"{{workspaceFolder-0}}","section":"dart"},{"section":"dart"}]}}}
 {"time":1768238804390,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","id":1,"result":[{"analysisExcludedFolders":[],"clientRequestTime":1768238804390}]}}
-{"time":1768243499075,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","id":2421,"method":"textDocument/hover","params":{"textDocument":{"uri":"file://{{workspaceFolder-0}}/lib/starter.dart"},"position":{"line":14,"character":21}},"clientRequestTime":1768243499075}}
+{"time":1768243499075,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","id":2421,"method":"textDocument/hover","params":{"textDocument":{"uri":"{{workspaceFolder-0}}/lib/starter.dart"},"position":{"line":14,"character":21}},"clientRequestTime":1768243499075}}
 {"time":1768243499076,"kind":"message","sender":"server","receiver":"ide","message":{"id":2421,"jsonrpc":"2.0","result":{"contents":{"kind":"markdown","value":"```dart\nabstract class ServerStarter\n```\nDeclared in _package:analysis_server/starter.dart_.\n\n---\nAn object that can be used to start an analysis server. This class exists so\nthat clients can configure an analysis server before starting it.\n\nClients may not extend, implement or mix-in this class."},"range":{"end":{"character":28,"line":14},"start":{"character":15,"line":14}}}}}
-{"time":1768243499510,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","id":2422,"method":"textDocument/documentHighlight","params":{"textDocument":{"uri":"file://{{workspaceFolder-0}}/lib/starter.dart"},"position":{"line":14,"character":21}},"clientRequestTime":1768243499510}}
+{"time":1768243499510,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","id":2422,"method":"textDocument/documentHighlight","params":{"textDocument":{"uri":"{{workspaceFolder-0}}/lib/starter.dart"},"position":{"line":14,"character":21}},"clientRequestTime":1768243499510}}
 {"time":1768243499510,"kind":"message","sender":"server","receiver":"ide","message":{"id":2422,"jsonrpc":"2.0","result":[{"range":{"end":{"character":28,"line":14},"start":{"character":15,"line":14}}}]}}
-{"time":1768243499713,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","id":2423,"method":"textDocument/codeLens","params":{"textDocument":{"uri":"file://{{workspaceFolder-0}}/lib/starter.dart"}},"clientRequestTime":1768243499713}}
+{"time":1768243499713,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","id":2423,"method":"textDocument/codeLens","params":{"textDocument":{"uri":"{{workspaceFolder-0}}/lib/starter.dart"}},"clientRequestTime":1768243499713}}
 {"time":1768243499714,"kind":"message","sender":"server","receiver":"ide","message":{"id":2423,"jsonrpc":"2.0","result":[]}}
-{"time":1768243499919,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","id":2424,"method":"textDocument/codeAction","params":{"textDocument":{"uri":"file://{{workspaceFolder-0}}/lib/starter.dart"},"range":{"start":{"line":14,"character":15},"end":{"line":14,"character":28}},"context":{"diagnostics":[],"triggerKind":2}},"clientRequestTime":1768243499919}}
+{"time":1768243499919,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","id":2424,"method":"textDocument/codeAction","params":{"textDocument":{"uri":"{{workspaceFolder-0}}/lib/starter.dart"},"range":{"start":{"line":14,"character":15},"end":{"line":14,"character":28}},"context":{"diagnostics":[],"triggerKind":2}},"clientRequestTime":1768243499919}}
 {"time":1768243499920,"kind":"message","sender":"server","receiver":"ide","message":{"id":944,"jsonrpc":"2.0","method":"window/workDoneProgress/create","params":{"token":"ANALYZING"}}}
-{"time":1768243499927,"kind":"message","sender":"server","receiver":"ide","message":{"id":2424,"jsonrpc":"2.0","result":[{"command":{"arguments":[{"path":"{{workspaceFolder-0}}/lib/starter.dart","autoTriggered":true}],"command":"dart.edit.sortMembers","title":"Sort Members"},"kind":"source.sortMembers","title":"Sort Members"},{"command":{"arguments":[{"path":"{{workspaceFolder-0}}/lib/starter.dart","autoTriggered":true}],"command":"dart.edit.organizeImports","title":"Organize Imports"},"kind":"source.organizeImports","title":"Organize Imports"},{"command":{"arguments":[{"path":"{{workspaceFolder-0}}/lib/starter.dart","autoTriggered":true}],"command":"dart.edit.fixAll","title":"Fix All"},"kind":"source.fixAll","title":"Fix All"},{"command":{"arguments":[{"filePath":"{{workspaceFolder-0}}/lib/starter.dart","selectionOffset":686,"selectionLength":13,"arguments":["file://{{workspaceFolder-0}}/lib/server_starter.dart"]}],"command":"dart.refactor.move_top_level_to_file","title":"Move 'ServerStarter' to file"},"data":{"parameters":[{"actionLabel":"Move","defaultValue":"file://{{workspaceFolder-0}}/lib/server_starter.dart","filters":{"Dart":["dart"]},"kind":"saveUri","parameterLabel":"Move to:","parameterTitle":"Select a file to move to"}]},"kind":"refactor.move","title":"Move 'ServerStarter' to file"}]}}
+{"time":1768243499927,"kind":"message","sender":"server","receiver":"ide","message":{"id":2424,"jsonrpc":"2.0","result":[{"command":{"arguments":[{"path":"{{workspaceFolder-0:filePath}}/lib/starter.dart","autoTriggered":true}],"command":"dart.edit.sortMembers","title":"Sort Members"},"kind":"source.sortMembers","title":"Sort Members"},{"command":{"arguments":[{"path":"{{workspaceFolder-0:filePath}}/lib/starter.dart","autoTriggered":true}],"command":"dart.edit.organizeImports","title":"Organize Imports"},"kind":"source.organizeImports","title":"Organize Imports"},{"command":{"arguments":[{"path":"{{workspaceFolder-0:filePath}}/lib/starter.dart","autoTriggered":true}],"command":"dart.edit.fixAll","title":"Fix All"},"kind":"source.fixAll","title":"Fix All"},{"command":{"arguments":[{"filePath":"{{workspaceFolder-0:filePath}}/lib/starter.dart","selectionOffset":686,"selectionLength":13,"arguments":["{{workspaceFolder-0}}/lib/server_starter.dart"]}],"command":"dart.refactor.move_top_level_to_file","title":"Move 'ServerStarter' to file"},"data":{"parameters":[{"actionLabel":"Move","defaultValue":"{{workspaceFolder-0}}/lib/server_starter.dart","filters":{"Dart":["dart"]},"kind":"saveUri","parameterLabel":"Move to:","parameterTitle":"Select a file to move to"}]},"kind":"refactor.move","title":"Move 'ServerStarter' to file"}]}}
 {"time":1768243499927,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","id":944,"result":null,"clientRequestTime":1768243499927}}
 {"time":1768243499927,"kind":"message","sender":"server","receiver":"ide","message":{"jsonrpc":"2.0","method":"$/progress","params":{"token":"ANALYZING","value":{"kind":"begin","title":"Analyzing…"}}}}
 {"time":1768243499927,"kind":"message","sender":"server","receiver":"ide","message":{"jsonrpc":"2.0","method":"$/progress","params":{"token":"ANALYZING","value":{"kind":"end"}}}}
-{"time":1768243502045,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","id":2425,"method":"textDocument/prepareRename","params":{"textDocument":{"uri":"file://{{workspaceFolder-0}}/lib/starter.dart"},"position":{"line":14,"character":28}},"clientRequestTime":1768243502044}}
+{"time":1768243502045,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","id":2425,"method":"textDocument/prepareRename","params":{"textDocument":{"uri":"{{workspaceFolder-0}}/lib/starter.dart"},"position":{"line":14,"character":28}},"clientRequestTime":1768243502044}}
 {"time":1768243502045,"kind":"message","sender":"server","receiver":"ide","message":{"id":2425,"jsonrpc":"2.0","result":{"placeholder":"ServerStarter","range":{"end":{"character":28,"line":14},"start":{"character":15,"line":14}}}}}
-{"time":1768243502246,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","id":2426,"method":"textDocument/codeLens","params":{"textDocument":{"uri":"file://{{workspaceFolder-0}}/lib/starter.dart"}},"clientRequestTime":1768243502245}}
+{"time":1768243502246,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","id":2426,"method":"textDocument/codeLens","params":{"textDocument":{"uri":"{{workspaceFolder-0}}/lib/starter.dart"}},"clientRequestTime":1768243502245}}
 {"time":1768243502246,"kind":"message","sender":"server","receiver":"ide","message":{"id":2426,"jsonrpc":"2.0","result":[]}}
-{"time":1768243503537,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","id":2427,"method":"textDocument/rename","params":{"textDocument":{"uri":"file://{{workspaceFolder-0}}/lib/starter.dart"},"position":{"line":14,"character":28},"newName":"ServerStarter2"},"clientRequestTime":1768243503537}}
+{"time":1768243503537,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","id":2427,"method":"textDocument/rename","params":{"textDocument":{"uri":"{{workspaceFolder-0}}/lib/starter.dart"},"position":{"line":14,"character":28},"newName":"ServerStarter2"},"clientRequestTime":1768243503537}}
 {"time":1768243503538,"kind":"message","sender":"server","receiver":"ide","message":{"id":945,"jsonrpc":"2.0","method":"window/workDoneProgress/create","params":{"token":"ANALYZING"}}}
 {"time":1768243503545,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","id":945,"result":null,"clientRequestTime":1768243503541}}
 {"time":1768243503545,"kind":"message","sender":"server","receiver":"ide","message":{"jsonrpc":"2.0","method":"$/progress","params":{"token":"ANALYZING","value":{"kind":"begin","title":"Analyzing…"}}}}
 {"time":1768243503546,"kind":"message","sender":"server","receiver":"ide","message":{"jsonrpc":"2.0","method":"$/progress","params":{"token":"ANALYZING","value":{"kind":"end"}}}}
-{"time":1768243503546,"kind":"message","sender":"server","receiver":"ide","message":{"id":2427,"jsonrpc":"2.0","result":{"documentChanges":[{"edits":[{"newText":"ServerStarter2","range":{"end":{"character":28,"line":14},"start":{"character":15,"line":14}}},{"newText":"ServerStarter2","range":{"end":{"character":23,"line":16},"start":{"character":10,"line":16}}}],"textDocument":{"uri":"file://{{workspaceFolder-0}}/lib/starter.dart","version":null}},{"edits":[{"newText":"ServerStarter2","range":{"end":{"character":37,"line":51},"start":{"character":24,"line":51}}}],"textDocument":{"uri":"file://{{workspaceFolder-0}}/lib/src/server/driver.dart","version":null}},{"edits":[{"newText":"ServerStarter2","range":{"end":{"character":29,"line":8},"start":{"character":16,"line":8}}}],"textDocument":{"uri":"file://{{workspaceFolder-0}}/bin/server.dart","version":null}}]}}}
-{"time":1768243503763,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","id":2428,"method":"textDocument/codeLens","params":{"textDocument":{"uri":"file://{{workspaceFolder-0}}/lib/starter.dart"}},"clientRequestTime":1768243503763}}
+{"time":1768243503546,"kind":"message","sender":"server","receiver":"ide","message":{"id":2427,"jsonrpc":"2.0","result":{"documentChanges":[{"edits":[{"newText":"ServerStarter2","range":{"end":{"character":28,"line":14},"start":{"character":15,"line":14}}},{"newText":"ServerStarter2","range":{"end":{"character":23,"line":16},"start":{"character":10,"line":16}}}],"textDocument":{"uri":"{{workspaceFolder-0}}/lib/starter.dart","version":null}},{"edits":[{"newText":"ServerStarter2","range":{"end":{"character":37,"line":51},"start":{"character":24,"line":51}}}],"textDocument":{"uri":"{{workspaceFolder-0}}/lib/src/server/driver.dart","version":null}},{"edits":[{"newText":"ServerStarter2","range":{"end":{"character":29,"line":8},"start":{"character":16,"line":8}}}],"textDocument":{"uri":"{{workspaceFolder-0}}/bin/server.dart","version":null}}]}}}
+{"time":1768243503763,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","id":2428,"method":"textDocument/codeLens","params":{"textDocument":{"uri":"{{workspaceFolder-0}}/lib/starter.dart"}},"clientRequestTime":1768243503763}}
 {"time":1768243503764,"kind":"message","sender":"server","receiver":"ide","message":{"id":2428,"jsonrpc":"2.0","result":[]}}
-{"time":1768243503836,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","method":"textDocument/didOpen","params":{"textDocument":{"uri":"file://{{workspaceFolder-0}}/lib/src/server/driver.dart","languageId":"dart","version":1,"text":"// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file\n// for details. All rights reserved. Use of this source code is governed by a\n// BSD-style license that can be found in the LICENSE file.\n\nimport 'dart:async';\nimport 'dart:io';\nimport 'dart:isolate';\nimport 'dart:math';\n\nimport 'package:analysis_server/protocol/protocol_constants.dart'\n    show PROTOCOL_VERSION;\nimport 'package:analysis_server/src/analytics/analytics_manager.dart';\nimport 'package:analysis_server/src/legacy_analysis_server.dart';\nimport 'package:analysis_server/src/lsp/lsp_socket_server.dart';\nimport 'package:analysis_server/src/server/crash_reporting.dart';\nimport 'package:analysis_server/src/server/crash_reporting_attachments.dart';\nimport 'package:analysis_server/src/server/detachable_filesystem_manager.dart';\nimport 'package:analysis_server/src/server/dev_server.dart';\nimport 'package:analysis_server/src/server/diagnostic_server.dart';\nimport 'package:analysis_server/src/server/error_notifier.dart';\nimport 'package:analysis_server/src/server/features.dart';\nimport 'package:analysis_server/src/server/http_server.dart';\nimport 'package:analysis_server/src/server/isolate_analysis_server.dart';\nimport 'package:analysis_server/src/server/lsp_stdio_server.dart';\nimport 'package:analysis_server/src/server/sdk_configuration.dart';\nimport 'package:analysis_server/src/server/stdio_server.dart';\nimport 'package:analysis_server/src/services/correction/assist_internal.dart';\nimport 'package:analysis_server/src/services/correction/fix_internal.dart';\nimport 'package:analysis_server/src/session_logger/session_logger.dart';\nimport 'package:analysis_server/src/session_logger/session_logger_sink.dart';\nimport 'package:analysis_server/src/socket_server.dart';\nimport 'package:analysis_server/src/status/performance_logger.dart';\nimport 'package:analysis_server/src/utilities/request_statistics.dart';\nimport 'package:analysis_server/starter.dart';\nimport 'package:analyzer/file_system/physical_file_system.dart';\nimport 'package:analyzer/instrumentation/file_instrumentation.dart';\nimport 'package:analyzer/instrumentation/instrumentation.dart';\nimport 'package:analyzer/src/dart/sdk/sdk.dart';\nimport 'package:analyzer/src/generated/engine.dart';\nimport 'package:analyzer/src/generated/sdk.dart';\nimport 'package:analyzer/src/util/sdk.dart';\nimport 'package:args/args.dart';\nimport 'package:linter/src/rules.dart' as linter;\nimport 'package:telemetry/crash_reporting.dart';\nimport 'package:unified_analytics/unified_analytics.dart';\n\nimport '../utilities/usage_tracking/usage_tracking.dart';\n\n/// The [Driver] class represents a single running instance of the analysis\n/// server application.  It is responsible for parsing command line options\n/// and starting the HTTP and/or stdio servers.\nclass Driver implements ServerStarter {\n  /// The name of the application that is used to start a server.\n  static const binaryName = 'analysis_server';\n\n  /// The name of the option used to set the identifier for the client.\n  static const String clientIdOption = 'client-id';\n\n  /// The name of the option used to set the version for the client.\n  static const String clientVersionOption = 'client-version';\n\n  /// The name of the option used to disable exception handling.\n  static const String disableServerExceptionHandlingOption =\n      'disable-server-exception-handling';\n\n  /// The name of the option to disable the completion feature.\n  static const String disableServerFeatureCompletionOption =\n      'disable-server-feature-completion';\n\n  /// The name of the option to disable the search feature.\n  static const String disableServerFeatureSearchOption =\n      'disable-server-feature-search';\n\n  /// The name of the option to disable the debouncing of `server.status`\n  /// notifications.\n  static const String disableStatusNotificationDebouncingOption =\n      'disable-status-notification-debouncing';\n\n  /// The name of the option to prevent exceptions during analysis from being\n  /// silent.\n  static const String disableSilentAnalysisExceptionsOption =\n      'disable-silent-analysis-exceptions';\n\n  /// The name of the multi-option to enable one or more experiments.\n  static const String enableExperimentOption = 'enable-experiment';\n\n  /// The name of the option used to print usage information.\n  static const String helpFlag = 'help';\n\n  /// The name of the flag used to configure reporting legacy analytics.\n  static const String analyticsFlag = 'analytics';\n\n  /// The name of the flag used to suppress legacy analytics for this session.\n  static const String suppressAnalyticsFlag = 'suppress-analytics';\n\n  /// The name of the option used to cause instrumentation to also be written to\n  /// a local file.\n  static const String protocolTrafficLogOption = 'protocol-traffic-log';\n  static const String protocolTrafficLogAliasOption =\n      'instrumentation-log-file';\n\n  /// The name of the option used to cause a log of the session to be written to\n  /// a file.\n  static const String sessionLogOption = 'session-log';\n\n  /// The name of the option used to cause selected data from the analysis\n  /// server to be written to a file.\n  static const String performanceLogOption = 'performance-log';\n\n  /// The name of the option used to specify if [print] should print to the\n  /// console instead of being intercepted.\n  static const String internalPrintToConsoleOption =\n      'internal-print-to-console';\n\n  /// The name of the option used to describe the new analysis driver logger.\n  static const String analysisDriverLogOption = 'analysis-driver-log';\n  static const String analysisDriverLogAliasOption = 'new-analysis-driver-log';\n\n  /// The name of the option for specifying the http diagnostic port.\n  /// If specified, users can review server status and performance information\n  /// by opening a web browser on `http://localhost:<port>`.\n  static const String diagnosticPortOption = 'diagnostic-port';\n  static const String diagnosticPortAliasOption = 'port';\n\n  /// The name of the option used to specify the path to the SDK.\n  static const String dartSdkOption = 'dart-sdk';\n  static const String dartSdkAliasOption = 'sdk';\n\n  /// The name of the option used to specify the path to the data cache.\n  static const String cacheFolderOption = 'cache';\n\n  /// The name of the option used to specify the path to the package config file\n  /// override.\n  static const String packagesFileOption = 'packages';\n\n  /// The name of the option used to specify a forced protocol version that the\n  /// server will report to the client.\n  static const String reportProtocolVersionOption = 'report-protocol-version';\n\n  /// The name of the option specifying the server protocol to use.\n  static const String serverProtocolOption = 'protocol';\n  static const String protocolAnalyzer = 'analyzer';\n  static const String protocolLsp = 'lsp';\n\n  /// The name of the flag to use the Language Server Protocol (LSP).\n  static const String useLspFlag = 'lsp';\n\n  /// The name of the flag used to specify a directory to analyze in order to\n  /// train an analysis server snapshot.\n  static const String trainUsingOption = 'train-using';\n\n  /// Flag to not use a (Evicting)FileByteStore.\n  static const String disableFileByteStoreOption = 'disable-file-byte-store';\n\n  /// The name of the flag to enable fine-grained dependencies.\n  static const String withFineDependenciesOption = 'with-fine-dependencies';\n\n  /// The builder for attachments that should be included into crash reports.\n  CrashReportingAttachmentsBuilder crashReportingAttachmentsBuilder =\n      CrashReportingAttachmentsBuilder.empty;\n\n  /// An optional manager to handle file systems which may not always be\n  /// available.\n  DetachableFileSystemManager? detachableFileSystemManager;\n\n  /// The instrumentation service that is to be used by the analysis server.\n  late final InstrumentationService _instrumentationService;\n\n  /// The session logger.\n  late final SessionLogger _sessionLogger;\n\n  /// Use the given command-line [arguments] to start this server.\n  ///\n  /// If [sendPort] is not null, assumes this is launched in an isolate and will\n  /// connect to the original isolate via an isolate channel.\n  @override\n  void start(\n    List<String> arguments, {\n    SendPort? sendPort,\n    bool defaultToLsp = false,\n  }) {\n    var sessionStartTime = DateTime.now();\n    var parser = createArgParser(defaultToLsp: defaultToLsp);\n    var results = parser.parse(arguments);\n\n    var analysisServerOptions = AnalysisServerOptions();\n    analysisServerOptions.newAnalysisDriverLog =\n        results.option(analysisDriverLogOption) ??\n        results.option(analysisDriverLogAliasOption);\n    if (results.wasParsed(useLspFlag)) {\n      analysisServerOptions.useLanguageServerProtocol = results.flag(\n        useLspFlag,\n      );\n    } else {\n      analysisServerOptions.useLanguageServerProtocol =\n          results.option(serverProtocolOption) == protocolLsp;\n    }\n    // For clients that don't supply their own identifier, use a default based\n    // on whether the server will run in LSP mode or not.\n    var clientId =\n        results.option(clientIdOption) ??\n        (analysisServerOptions.useLanguageServerProtocol\n            ? 'unknown.client.lsp'\n            : 'unknown.client.classic');\n    analysisServerOptions.clientId = clientId;\n    analysisServerOptions.clientVersion = results.option(clientVersionOption);\n    analysisServerOptions.cacheFolder = results.option(cacheFolderOption);\n    analysisServerOptions.packagesFile = results.option(packagesFileOption);\n    analysisServerOptions.reportProtocolVersion = results.option(\n      reportProtocolVersionOption,\n    );\n    analysisServerOptions.withFineDependencies = results.flag(\n      withFineDependenciesOption,\n    );\n\n    analysisServerOptions.enabledExperiments = results.multiOption(\n      enableExperimentOption,\n    );\n\n    // Read in any per-SDK overrides specified in <sdk>/config/settings.json.\n    var sdkConfig = SdkConfiguration.readFromSdk();\n    analysisServerOptions.configurationOverrides = sdkConfig;\n\n    // Analytics (legacy, and unified)\n    var disableAnalyticsForSession = results.flag(suppressAnalyticsFlag);\n\n    if (results.wasParsed(trainUsingOption)) {\n      disableAnalyticsForSession = true;\n    }\n\n    var defaultSdkPath = _getSdkPath(results);\n    var dartSdkManager = DartSdkManager(defaultSdkPath);\n\n    // TODO(brianwilkerson): It would be nice to avoid creating an SDK that\n    // can't be re-used, but the SDK is needed to create a package map provider\n    // in the case where we need to run `pub` in order to get the package map.\n    var defaultSdk = _createDefaultSdk(defaultSdkPath);\n\n    // Create the analytics manager.\n    Analytics analytics;\n    if (disableAnalyticsForSession) {\n      analytics = NoOpAnalytics();\n    } else {\n      var tool = switch (clientId) {\n        'VS-Code' || 'VS-Code-Remote' => DashTool.vscodePlugins,\n        'IntelliJ-IDEA' => DashTool.intellijPlugins,\n        'Android-Studio' => DashTool.androidStudioPlugins,\n        _ => null,\n      };\n      if (tool != null) {\n        analytics = _createAnalytics(defaultSdk, defaultSdkPath, tool);\n      } else {\n        analytics = NoOpAnalytics();\n      }\n    }\n    var analyticsManager = AnalyticsManager(analytics);\n\n    bool shouldSendCallback() {\n      // Check sdkConfig to optionally force reporting on.\n      if (sdkConfig.crashReportingForceEnabled == true) {\n        return true;\n      }\n\n      // Reuse the unified_analytics consent mechanism to determine whether\n      // we can send a crash report.\n      return analyticsManager.analytics.okToSend;\n    }\n\n    // Crash reporting\n\n    // Use sdkConfig to optionally override analytics settings.\n    var crashProductId = sdkConfig.crashReportingId ?? 'Dart_analysis_server';\n    var crashReportSender = CrashReportSender.prod(\n      crashProductId,\n      shouldSendCallback,\n    );\n\n    {\n      var disableCompletion = results.flag(\n        disableServerFeatureCompletionOption,\n      );\n      var disableSearch = results.flag(disableServerFeatureSearchOption);\n      if (disableCompletion || disableSearch) {\n        analysisServerOptions.featureSet = FeatureSet(\n          completion: !disableCompletion,\n          search: !disableSearch,\n        );\n      }\n    }\n\n    if (results.flag(helpFlag)) {\n      _printUsage(parser, fromHelp: true);\n      return;\n    }\n\n    // Record the start of the session.\n    analyticsManager.startUp(\n      time: sessionStartTime,\n      arguments: _getArgumentsForAnalytics(results),\n      clientId: clientId,\n      clientVersion: analysisServerOptions.clientVersion,\n    );\n    //\n    // Initialize the instrumentation service.\n    //\n    var logFilePath =\n        results.option(protocolTrafficLogOption) ??\n        results.option(protocolTrafficLogAliasOption);\n    var allInstrumentationServices = <InstrumentationService>[];\n    if (logFilePath != null) {\n      _rollLogFiles(logFilePath, 5);\n      allInstrumentationServices.add(\n        InstrumentationLogAdapter(\n          FileInstrumentationLogger(logFilePath),\n          watchEventExclusionFiles: {logFilePath},\n        ),\n      );\n    }\n\n    var errorNotifier = ErrorNotifier();\n    allInstrumentationServices.add(errorNotifier);\n    allInstrumentationServices.add(\n      CrashReportingInstrumentation(crashReportSender),\n    );\n    _instrumentationService = MulticastInstrumentationService(\n      allInstrumentationServices,\n    );\n\n    _instrumentationService.logVersion(\n      results.option(trainUsingOption) != null\n          ? 'training-0'\n          : _readUuid(_instrumentationService),\n      analysisServerOptions.clientId ?? '',\n      analysisServerOptions.clientVersion ?? '',\n      PROTOCOL_VERSION,\n      defaultSdk.languageVersion.toString(),\n    );\n    AnalysisEngine.instance.instrumentationService = _instrumentationService;\n\n    // Initialize the session logging service.\n    var sessionLogFilePath = results.option(sessionLogOption);\n    _sessionLogger = SessionLogger();\n    var inMemorySink = SessionLoggerInMemorySink(maxBufferLength: 256);\n    _sessionLogger.sink = inMemorySink;\n    if (sessionLogFilePath != null) {\n      inMemorySink.nextLogger = SessionLoggerFileSink(sessionLogFilePath);\n    }\n    _sessionLogger.logCommandLine(arguments: arguments);\n\n    int? diagnosticServerPort;\n    var portValue =\n        results.option(diagnosticPortOption) ??\n        results.option(diagnosticPortAliasOption);\n    if (portValue != null) {\n      try {\n        diagnosticServerPort = int.parse(portValue);\n      } on FormatException {\n        print('Invalid port number: $portValue');\n        print('');\n        _printUsage(parser);\n        exitCode = 1;\n        return;\n      }\n    }\n\n    PerformanceLogger? performanceLogger;\n    var performanceLogFilePath = results.option(performanceLogOption);\n    if (performanceLogFilePath != null) {\n      _rollLogFiles(performanceLogFilePath, 5);\n      performanceLogger = PerformanceLogger(performanceLogFilePath);\n    }\n\n    // TODO(brianwilkerson): Pass the following value to the server and\n    // implement the debouncing when it hasn't been disabled.\n    // var disableDebouncing = results[DISABLE_STATUS_NOTIFICATION_DEBOUNCING] as bool;\n    if (analysisServerOptions.useLanguageServerProtocol) {\n      if (sendPort != null) {\n        throw UnimplementedError(\n          'Isolate usage not implemented for LspAnalysisServer',\n        );\n      }\n      startLspServer(\n        results,\n        analysisServerOptions,\n        dartSdkManager,\n        analyticsManager,\n        _instrumentationService,\n        _sessionLogger,\n        diagnosticServerPort,\n        errorNotifier,\n        performanceLogger,\n      );\n    } else {\n      startAnalysisServer(\n        results,\n        analysisServerOptions,\n        parser,\n        dartSdkManager,\n        analyticsManager,\n        crashReportingAttachmentsBuilder,\n        _instrumentationService,\n        _sessionLogger,\n        RequestStatisticsHelper(),\n        diagnosticServerPort,\n        errorNotifier,\n        sendPort,\n        performanceLogger,\n      );\n    }\n\n    configureMemoryUsageTracking(\n      arguments,\n      (memoryUsageEvent) => analyticsManager.sendMemoryUsage(memoryUsageEvent),\n    );\n  }\n\n  void startAnalysisServer(\n    ArgResults results,\n    AnalysisServerOptions analysisServerOptions,\n    ArgParser parser,\n    DartSdkManager dartSdkManager,\n    AnalyticsManager analyticsManager,\n    CrashReportingAttachmentsBuilder crashReportingAttachmentsBuilder,\n    InstrumentationService instrumentationService,\n    SessionLogger sessionLogger,\n    RequestStatisticsHelper requestStatistics,\n    int? diagnosticServerPort,\n    ErrorNotifier errorNotifier,\n    SendPort? sendPort,\n    PerformanceLogger? performanceLogger,\n  ) {\n    var capture = results.flag(disableServerExceptionHandlingOption)\n        ? (_, Function f, {void Function(String)? print}) => f()\n        : _captureExceptions;\n    var trainDirectory = results.option(trainUsingOption);\n    if (trainDirectory != null) {\n      if (!FileSystemEntity.isDirectorySync(trainDirectory)) {\n        print(\"Training directory '$trainDirectory' not found.\\n\");\n        exitCode = 1;\n        return;\n      }\n    }\n    linter.registerLintRules();\n    registerBuiltInAssistGenerators();\n    registerBuiltInFixGenerators();\n\n    var diagnosticServer = _DiagnosticServerImpl();\n\n    //\n    // Create the sockets and start listening for requests.\n    //\n    var socketServer = SocketServer(\n      analysisServerOptions,\n      dartSdkManager,\n      crashReportingAttachmentsBuilder,\n      instrumentationService,\n      sessionLogger,\n      requestStatistics,\n      diagnosticServer,\n      analyticsManager,\n      detachableFileSystemManager,\n      performanceLogger,\n    );\n\n    diagnosticServer.httpServer = HttpAnalysisServer(socketServer);\n    if (diagnosticServerPort != null) {\n      diagnosticServer.startOnPort(diagnosticServerPort);\n    }\n\n    if (trainDirectory != null) {\n      if (sendPort != null) {\n        throw UnimplementedError(\n          'isolate usage not supported for DevAnalysisServer',\n        );\n      }\n      var tempDriverDir = Directory.systemTemp.createTempSync(\n        'analysis_server_',\n      );\n      analysisServerOptions.cacheFolder = tempDriverDir.path;\n      analysisServerOptions.disableFileByteStore = results.flag(\n        disableFileByteStoreOption,\n      );\n\n      var devServer = DevAnalysisServer(socketServer);\n      devServer.initServer();\n\n      () async {\n        // We first analyze code with an empty driver cache.\n        print('Analyzing with an empty driver cache:');\n        var exitCode = await devServer.processDirectories([trainDirectory]);\n        if (exitCode != 0) exit(exitCode);\n\n        print('');\n\n        // Then again with a populated cache.\n        print('Analyzing with a populated driver cache:');\n        exitCode = await devServer.processDirectories([trainDirectory]);\n        if (exitCode != 0) exit(exitCode);\n\n        diagnosticServer.httpServer.close();\n        await instrumentationService.shutdown();\n        unawaited(socketServer.analysisServer!.shutdown());\n\n        try {\n          tempDriverDir.deleteSync(recursive: true);\n        } catch (_) {\n          // Ignore any exception.\n        }\n\n        exit(exitCode);\n      }();\n    } else {\n      capture(\n        instrumentationService,\n        () {\n          Future<void> serveResult;\n          if (sendPort == null) {\n            var stdioServer = StdioAnalysisServer(socketServer);\n            serveResult = stdioServer.serveStdio();\n          } else {\n            var isolateAnalysisServer = IsolateAnalysisServer(socketServer);\n            serveResult = isolateAnalysisServer.serveIsolate(sendPort);\n          }\n          errorNotifier.server = socketServer.analysisServer;\n          if (results.flag(disableSilentAnalysisExceptionsOption)) {\n            errorNotifier.sendSilentExceptionsToClient = true;\n          }\n          serveResult.then((_) async {\n            diagnosticServer.httpServer.close();\n            await instrumentationService.shutdown();\n            unawaited(socketServer.analysisServer!.shutdown());\n            if (sendPort == null) exit(0);\n          });\n        },\n        print: results.flag(internalPrintToConsoleOption)\n            ? null\n            : diagnosticServer.httpServer.recordPrint,\n      );\n    }\n  }\n\n  void startLspServer(\n    ArgResults args,\n    AnalysisServerOptions analysisServerOptions,\n    DartSdkManager dartSdkManager,\n    AnalyticsManager analyticsManager,\n    InstrumentationService instrumentationService,\n    SessionLogger sessionLogger,\n    int? diagnosticServerPort,\n    ErrorNotifier errorNotifier,\n    PerformanceLogger? performanceLogger,\n  ) {\n    var capture = args.flag(disableServerExceptionHandlingOption)\n        ? (_, Function f, {void Function(String)? print}) => f()\n        : _captureExceptions;\n\n    linter.registerLintRules();\n    registerBuiltInAssistGenerators();\n    registerBuiltInFixGenerators();\n\n    var diagnosticServer = _DiagnosticServerImpl();\n\n    var socketServer = LspSocketServer(\n      analysisServerOptions,\n      diagnosticServer,\n      analyticsManager,\n      dartSdkManager,\n      instrumentationService,\n      sessionLogger,\n      detachableFileSystemManager,\n      performanceLogger,\n    );\n    errorNotifier.server = socketServer.analysisServer;\n    diagnosticServer.httpServer = HttpAnalysisServer(socketServer);\n\n    if (diagnosticServerPort != null) {\n      diagnosticServer.startOnPort(diagnosticServerPort);\n    }\n\n    capture(instrumentationService, () {\n      var stdioServer = LspStdioAnalysisServer(socketServer);\n      stdioServer.serveStdio().then((_) {\n        // Only shutdown the server and exit if the server is not already\n        // handling the shutdown.\n        if (!socketServer.analysisServer!.willExit) {\n          unawaited(socketServer.analysisServer!.shutdown());\n          exit(0);\n        }\n      });\n    });\n  }\n\n  /// Execute the given [callback] within a zone that will capture any unhandled\n  /// exceptions and both report them to the client and send them to the given\n  /// instrumentation [service]. If a [print] function is provided, then also\n  /// capture any data printed by the callback and redirect it to the function.\n  void _captureExceptions(\n    InstrumentationService service,\n    void Function() callback, {\n    void Function(String line)? print,\n  }) {\n    void errorFunction(\n      Zone self,\n      ZoneDelegate parent,\n      Zone zone,\n      Object exception,\n      StackTrace stackTrace,\n    ) {\n      service.logException(exception, stackTrace);\n      throw exception;\n    }\n\n    var printFunction = print == null\n        ? null\n        : (Zone self, ZoneDelegate parent, Zone zone, String line) {\n            // Note: we don't pass the line on to stdout, because that is\n            // reserved for communication to the client.\n            print(line);\n          };\n    var zoneSpecification = ZoneSpecification(\n      handleUncaughtError: errorFunction,\n      print: printFunction,\n    );\n    return runZoned(callback, zoneSpecification: zoneSpecification);\n  }\n\n  /// Create the `Analytics` instance to be used to report analytics.\n  Analytics _createAnalytics(\n    DartSdk dartSdk,\n    String dartSdkPath,\n    DashTool tool,\n  ) {\n    // TODO(brianwilkerson): Find out whether there's a way to get the channel\n    //  without running `flutter channel`.\n    var pathContext = PhysicalResourceProvider.INSTANCE.pathContext;\n    var flutterSdkRoot = pathContext.dirname(\n      pathContext.dirname(pathContext.dirname(dartSdkPath)),\n    );\n    var flutterVersionFile = PhysicalResourceProvider.INSTANCE.getFile(\n      pathContext.join(flutterSdkRoot, 'version'),\n    );\n    String? flutterVersion;\n    try {\n      flutterVersion = flutterVersionFile.readAsStringSync();\n    } catch (exception) {\n      // If we can't read the file, ignore it.\n    }\n    return Analytics(\n      tool: tool,\n      dartVersion: dartSdk.sdkVersion,\n      // flutterChannel: '',\n      flutterVersion: flutterVersion,\n    );\n  }\n\n  DartSdk _createDefaultSdk(String defaultSdkPath) {\n    var resourceProvider = PhysicalResourceProvider.INSTANCE;\n    return FolderBasedDartSdk(\n      resourceProvider,\n      resourceProvider.getFolder(defaultSdkPath),\n    );\n  }\n\n  /// Constructs a uuid combining the current date and a random integer.\n  String _generateUuidString() {\n    var millisecondsSinceEpoch = DateTime.now().millisecondsSinceEpoch;\n    var random = Random().nextInt(0x3fffffff);\n    return '$millisecondsSinceEpoch$random';\n  }\n\n  /// Return a list of the known command-line arguments that were parsed when\n  /// creating the given [results]. We return only the names of the arguments,\n  /// not the values of the arguments, in order to prevent the collection of any\n  /// PII.\n  List<String> _getArgumentsForAnalytics(ArgResults results) {\n    // The arguments that are literal strings are deprecated and no longer read\n    // from, but we still want to know if clients are using them.\n    var knownArguments = [\n      analyticsFlag,\n      cacheFolderOption,\n      clientIdOption,\n      clientVersionOption,\n      'completion-model',\n      'dartpad',\n      dartSdkOption,\n      dartSdkAliasOption,\n      diagnosticPortOption,\n      diagnosticPortAliasOption,\n      disableServerExceptionHandlingOption,\n      disableServerFeatureCompletionOption,\n      disableServerFeatureSearchOption,\n      disableSilentAnalysisExceptionsOption,\n      disableStatusNotificationDebouncingOption,\n      'enable-completion-model',\n      'enable-experiment',\n      'enable-instrumentation',\n      'file-read-mode',\n      helpFlag,\n      'ignore-unrecognized-flags',\n      internalPrintToConsoleOption,\n      packagesFileOption,\n      'preview-dart-2',\n      protocolTrafficLogOption,\n      protocolTrafficLogAliasOption,\n      reportProtocolVersionOption,\n      serverProtocolOption,\n      sessionLogOption,\n      suppressAnalyticsFlag,\n      trainUsingOption,\n      'useAnalysisHighlight2',\n      useLspFlag,\n      'use-new-relevance',\n      'use-fasta-parser',\n      disableFileByteStoreOption,\n      withFineDependenciesOption,\n    ];\n    return knownArguments\n        .where((argument) => results.wasParsed(argument))\n        .toList();\n  }\n\n  String _getSdkPath(ArgResults args) {\n    String? sdkPath;\n\n    void tryCandidateArgument(String argumentName) {\n      var argumentValue = args[argumentName];\n      if (sdkPath == null && argumentValue is String) {\n        sdkPath = argumentValue;\n      }\n    }\n\n    tryCandidateArgument(dartSdkOption);\n    tryCandidateArgument(dartSdkAliasOption);\n    var sdkPath2 = sdkPath ?? getSdkPath();\n\n    var pathContext = PhysicalResourceProvider.INSTANCE.pathContext;\n    return pathContext.normalize(pathContext.absolute(sdkPath2));\n  }\n\n  /// Print information about how to use the server.\n  void _printUsage(ArgParser parser, {bool fromHelp = false}) {\n    print('Usage: $binaryName [flags]');\n    print('');\n    print('Supported flags are:');\n    print(parser.usage);\n  }\n\n  /// Read the UUID from disk, generating and storing a new one if necessary.\n  String _readUuid(InstrumentationService service) {\n    var instrumentationLocation = PhysicalResourceProvider.INSTANCE\n        .getStateLocation('.instrumentation');\n    if (instrumentationLocation == null) {\n      return _generateUuidString();\n    }\n    var uuidFile = File(instrumentationLocation.getChild('uuid.txt').path);\n    try {\n      if (uuidFile.existsSync()) {\n        var uuid = uuidFile.readAsStringSync();\n        if (uuid.length > 5) {\n          return uuid;\n        }\n      }\n    } catch (exception, stackTrace) {\n      service.logException(exception, stackTrace);\n    }\n    var uuid = _generateUuidString();\n    try {\n      uuidFile.parent.createSync(recursive: true);\n      uuidFile.writeAsStringSync(uuid);\n    } catch (exception, stackTrace) {\n      service.logException(exception, stackTrace);\n      // Slightly alter the uuid to indicate it was not persisted\n      uuid = 'temp-$uuid';\n    }\n    return uuid;\n  }\n\n  /// Create and return the parser used to parse the command-line arguments.\n  static ArgParser createArgParser({\n    int? usageLineLength,\n    bool includeHelpFlag = true,\n    bool defaultToLsp = false,\n  }) {\n    var parser = ArgParser(usageLineLength: usageLineLength);\n    if (includeHelpFlag) {\n      parser.addFlag(\n        helpFlag,\n        abbr: 'h',\n        negatable: false,\n        help: 'Print this usage information.',\n      );\n    }\n    parser.addOption(\n      clientIdOption,\n      valueHelp: 'name',\n      help: 'An identifier for the analysis server client.',\n    );\n    parser.addOption(\n      clientVersionOption,\n      valueHelp: 'version',\n      help: 'The version of the analysis server client.',\n    );\n    parser.addOption(\n      dartSdkOption,\n      valueHelp: 'path',\n      help: 'Override the Dart SDK to use for analysis.',\n    );\n    parser.addOption(dartSdkAliasOption, hide: true);\n    parser.addOption(\n      cacheFolderOption,\n      valueHelp: 'path',\n      help: 'Override the location of the analysis server\\'s cache.',\n    );\n    parser.addOption(\n      packagesFileOption,\n      valueHelp: 'path',\n      help:\n          'The path to the package resolution configuration file, which '\n          'supplies a mapping of package names\\ninto paths.',\n    );\n    parser.addMultiOption(\n      enableExperimentOption,\n      valueHelp: 'experiment',\n      help:\n          'Enable one or more experimental features '\n          '(see dart.dev/go/experiments).',\n      hide: true,\n    );\n\n    parser.addOption(\n      serverProtocolOption,\n      defaultsTo: defaultToLsp ? protocolLsp : protocolAnalyzer,\n      valueHelp: 'protocol',\n      allowed: [protocolLsp, protocolAnalyzer],\n      allowedHelp: {\n        protocolLsp:\n            'The Language Server Protocol '\n            '(https://microsoft.github.io/language-server-protocol)',\n        protocolAnalyzer:\n            'Dart\\'s analysis server protocol '\n            '(https://dart.dev/go/analysis-server-protocol)',\n      },\n      help:\n          'Specify the protocol to use to communicate with the analysis server.',\n    );\n    // This option is hidden but still accepted; it's effectively translated to\n    // the 'protocol' option above.\n    parser.addFlag(\n      useLspFlag,\n      negatable: false,\n      help: 'Whether to use the Language Server Protocol (LSP).',\n      hide: true,\n    );\n\n    parser.addSeparator('Server diagnostics:');\n\n    parser.addOption(\n      protocolTrafficLogOption,\n      valueHelp: 'file path',\n      help: 'Write server protocol traffic to the given file.',\n    );\n    parser.addOption(protocolTrafficLogAliasOption, hide: true);\n\n    parser.addOption(\n      sessionLogOption,\n      valueHelp: 'file path',\n      help: 'Write a server session log to the given file.',\n    );\n\n    parser.addOption(\n      performanceLogOption,\n      valueHelp: 'file path',\n      help: 'Write a server performance log to the given file.',\n    );\n\n    parser.addOption(\n      analysisDriverLogOption,\n      valueHelp: 'file path',\n      help: 'Write analysis driver diagnostic data to the given file.',\n    );\n    parser.addOption(analysisDriverLogAliasOption, hide: true);\n\n    parser.addOption(\n      diagnosticPortOption,\n      valueHelp: 'port',\n      help:\n          'Serve a web UI for status and performance data on the given '\n          'port.',\n    );\n    parser.addOption(diagnosticPortAliasOption, hide: true);\n\n    //\n    // Hidden; these have not yet been made public.\n    //\n    parser.addFlag(\n      analyticsFlag,\n      help:\n          'Allow or disallow sending analytics information to '\n          'Google for this session.',\n      hide: true,\n    );\n    parser.addFlag(\n      suppressAnalyticsFlag,\n      negatable: false,\n      help: 'Suppress analytics for this session.',\n      hide: true,\n    );\n\n    //\n    // Hidden; these are for internal development.\n    //\n    parser.addOption(\n      trainUsingOption,\n      valueHelp: 'path',\n      help:\n          'Pass in a directory to analyze for purposes of training an '\n          'analysis server snapshot.  Disables analytics.',\n      hide: true,\n    );\n    parser.addFlag(\n      disableFileByteStoreOption,\n      help:\n          'Disable use of (Evicting)FileByteStore. Intended for benchmarking.',\n      hide: true,\n    );\n    parser.addFlag(\n      withFineDependenciesOption,\n      help: 'Enable fine-grained dependencies.',\n      defaultsTo: true,\n      hide: true,\n    );\n    parser.addFlag(\n      disableServerExceptionHandlingOption,\n      // TODO(jcollins-g): Pipeline option through and apply to all\n      // exception-nullifying runZoned() calls.\n      help:\n          'disable analyzer exception capture for interactive debugging '\n          'of the server',\n      hide: true,\n    );\n    parser.addFlag(\n      disableServerFeatureCompletionOption,\n      help: 'disable all completion features',\n      hide: true,\n    );\n    parser.addFlag(\n      disableServerFeatureSearchOption,\n      help: 'disable all search features',\n      hide: true,\n    );\n    parser.addFlag(\n      disableSilentAnalysisExceptionsOption,\n      negatable: false,\n      help: 'Prevent exceptions during analysis from being silent',\n      hide: true,\n    );\n    parser.addFlag(\n      disableStatusNotificationDebouncingOption,\n      negatable: false,\n      help: 'Suppress debouncing of status notifications.',\n      hide: true,\n    );\n    parser.addFlag(\n      internalPrintToConsoleOption,\n      help: 'enable sending `print` output to the console',\n      negatable: false,\n      hide: true,\n    );\n    parser.addOption(\n      reportProtocolVersionOption,\n      valueHelp: 'version',\n      help:\n          'The protocol version that the server will report to the client, '\n          'can be used to temporary enabling features that we expect to be '\n          'available in future versions.',\n      hide: true,\n    );\n\n    //\n    // Hidden; these are deprecated and no longer read from.\n    //\n\n    // Removed 11/15/2020.\n    parser.addOption('completion-model', hide: true);\n    // Removed 11/8/2020.\n    parser.addFlag('dartpad', hide: true);\n    // Removed 11/15/2020.\n    parser.addFlag('enable-completion-model', hide: true);\n    // Removed 9/23/2020.\n    parser.addFlag('enable-instrumentation', hide: true);\n    // Removed 11/12/2020.\n    parser.addOption('file-read-mode', hide: true);\n    // Removed 11/12/2020.\n    parser.addFlag('ignore-unrecognized-flags', hide: true);\n    // Removed 11/8/2020.\n    parser.addFlag('preview-dart-2', hide: true);\n    // Removed 11/12/2020.\n    parser.addFlag('useAnalysisHighlight2', hide: true);\n    // Removed 11/13/2020.\n    parser.addFlag('use-new-relevance', hide: true);\n    // Removed 9/23/2020.\n    parser.addFlag('use-fasta-parser', hide: true);\n\n    return parser;\n  }\n\n  /// Perform log files rolling.\n  ///\n  /// Rename existing files with names `[path].(x)` to `[path].(x+1)`.\n  /// Keep at most [numOld] files.\n  /// Rename the file with the given [path] to `[path].1`.\n  static void _rollLogFiles(String path, int numOld) {\n    for (var i = numOld - 1; i >= 0; i--) {\n      try {\n        var oldPath = i == 0 ? path : '$path.$i';\n        File(oldPath).renameSync('$path.${i + 1}');\n      } catch (e) {\n        // If a file can't be renamed, then leave it and attempt to rename the\n        // remaining files.\n      }\n    }\n  }\n}\n\n/// Implements the [DiagnosticServer] class by wrapping an [HttpAnalysisServer].\nclass _DiagnosticServerImpl extends DiagnosticServer {\n  late HttpAnalysisServer httpServer;\n\n  @override\n  Future<int> getServerPort() async => (await httpServer.serveHttp())!;\n\n  Future<void> startOnPort(int port) {\n    return httpServer.serveHttp(port);\n  }\n}\n"}},"clientRequestTime":1768243503831}}
-{"time":1768243503836,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","method":"textDocument/didOpen","params":{"textDocument":{"uri":"file://{{workspaceFolder-0}}/bin/server.dart","languageId":"dart","version":1,"text":"// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file\n// for details. All rights reserved. Use of this source code is governed by a\n// BSD-style license that can be found in the LICENSE file.\n\nimport 'package:analysis_server/starter.dart';\n\n/// Create and run an analysis server.\nvoid main(List<String> args) {\n  var starter = ServerStarter();\n  starter.start(args);\n}\n"}},"clientRequestTime":1768243503832}}
-{"time":1768243503836,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","method":"textDocument/didChange","params":{"textDocument":{"uri":"file://{{workspaceFolder-0}}/lib/starter.dart","version":2},"contentChanges":[{"range":{"start":{"line":16,"character":23},"end":{"line":16,"character":23}},"rangeLength":0,"text":"2"},{"range":{"start":{"line":14,"character":28},"end":{"line":14,"character":28}},"rangeLength":0,"text":"2"}]},"clientRequestTime":1768243503832}}
-{"time":1768243503836,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","method":"textDocument/didChange","params":{"textDocument":{"uri":"file://{{workspaceFolder-0}}/lib/src/server/driver.dart","version":2},"contentChanges":[{"range":{"start":{"line":51,"character":24},"end":{"line":51,"character":37}},"rangeLength":13,"text":"ServerStarter2"}]},"clientRequestTime":1768243503832}}
-{"time":1768243503836,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","method":"textDocument/didChange","params":{"textDocument":{"uri":"file://{{workspaceFolder-0}}/bin/server.dart","version":2},"contentChanges":[{"range":{"start":{"line":8,"character":16},"end":{"line":8,"character":29}},"rangeLength":13,"text":"ServerStarter2"}]},"clientRequestTime":1768243503832}}
+{"time":1768243503836,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","method":"textDocument/didOpen","params":{"textDocument":{"uri":"{{workspaceFolder-0}}/lib/src/server/driver.dart","languageId":"dart","version":1,"text":"// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file\n// for details. All rights reserved. Use of this source code is governed by a\n// BSD-style license that can be found in the LICENSE file.\n\nimport 'dart:async';\nimport 'dart:io';\nimport 'dart:isolate';\nimport 'dart:math';\n\nimport 'package:analysis_server/protocol/protocol_constants.dart'\n    show PROTOCOL_VERSION;\nimport 'package:analysis_server/src/analytics/analytics_manager.dart';\nimport 'package:analysis_server/src/legacy_analysis_server.dart';\nimport 'package:analysis_server/src/lsp/lsp_socket_server.dart';\nimport 'package:analysis_server/src/server/crash_reporting.dart';\nimport 'package:analysis_server/src/server/crash_reporting_attachments.dart';\nimport 'package:analysis_server/src/server/detachable_filesystem_manager.dart';\nimport 'package:analysis_server/src/server/dev_server.dart';\nimport 'package:analysis_server/src/server/diagnostic_server.dart';\nimport 'package:analysis_server/src/server/error_notifier.dart';\nimport 'package:analysis_server/src/server/features.dart';\nimport 'package:analysis_server/src/server/http_server.dart';\nimport 'package:analysis_server/src/server/isolate_analysis_server.dart';\nimport 'package:analysis_server/src/server/lsp_stdio_server.dart';\nimport 'package:analysis_server/src/server/sdk_configuration.dart';\nimport 'package:analysis_server/src/server/stdio_server.dart';\nimport 'package:analysis_server/src/services/correction/assist_internal.dart';\nimport 'package:analysis_server/src/services/correction/fix_internal.dart';\nimport 'package:analysis_server/src/session_logger/session_logger.dart';\nimport 'package:analysis_server/src/session_logger/session_logger_sink.dart';\nimport 'package:analysis_server/src/socket_server.dart';\nimport 'package:analysis_server/src/status/performance_logger.dart';\nimport 'package:analysis_server/src/utilities/request_statistics.dart';\nimport 'package:analysis_server/starter.dart';\nimport 'package:analyzer/file_system/physical_file_system.dart';\nimport 'package:analyzer/instrumentation/file_instrumentation.dart';\nimport 'package:analyzer/instrumentation/instrumentation.dart';\nimport 'package:analyzer/src/dart/sdk/sdk.dart';\nimport 'package:analyzer/src/generated/engine.dart';\nimport 'package:analyzer/src/generated/sdk.dart';\nimport 'package:analyzer/src/util/sdk.dart';\nimport 'package:args/args.dart';\nimport 'package:linter/src/rules.dart' as linter;\nimport 'package:telemetry/crash_reporting.dart';\nimport 'package:unified_analytics/unified_analytics.dart';\n\nimport '../utilities/usage_tracking/usage_tracking.dart';\n\n/// The [Driver] class represents a single running instance of the analysis\n/// server application.  It is responsible for parsing command line options\n/// and starting the HTTP and/or stdio servers.\nclass Driver implements ServerStarter {\n  /// The name of the application that is used to start a server.\n  static const binaryName = 'analysis_server';\n\n  /// The name of the option used to set the identifier for the client.\n  static const String clientIdOption = 'client-id';\n\n  /// The name of the option used to set the version for the client.\n  static const String clientVersionOption = 'client-version';\n\n  /// The name of the option used to disable exception handling.\n  static const String disableServerExceptionHandlingOption =\n      'disable-server-exception-handling';\n\n  /// The name of the option to disable the completion feature.\n  static const String disableServerFeatureCompletionOption =\n      'disable-server-feature-completion';\n\n  /// The name of the option to disable the search feature.\n  static const String disableServerFeatureSearchOption =\n      'disable-server-feature-search';\n\n  /// The name of the option to disable the debouncing of `server.status`\n  /// notifications.\n  static const String disableStatusNotificationDebouncingOption =\n      'disable-status-notification-debouncing';\n\n  /// The name of the option to prevent exceptions during analysis from being\n  /// silent.\n  static const String disableSilentAnalysisExceptionsOption =\n      'disable-silent-analysis-exceptions';\n\n  /// The name of the multi-option to enable one or more experiments.\n  static const String enableExperimentOption = 'enable-experiment';\n\n  /// The name of the option used to print usage information.\n  static const String helpFlag = 'help';\n\n  /// The name of the flag used to configure reporting legacy analytics.\n  static const String analyticsFlag = 'analytics';\n\n  /// The name of the flag used to suppress legacy analytics for this session.\n  static const String suppressAnalyticsFlag = 'suppress-analytics';\n\n  /// The name of the option used to cause instrumentation to also be written to\n  /// a local file.\n  static const String protocolTrafficLogOption = 'protocol-traffic-log';\n  static const String protocolTrafficLogAliasOption =\n      'instrumentation-log-file';\n\n  /// The name of the option used to cause a log of the session to be written to\n  /// a file.\n  static const String sessionLogOption = 'session-log';\n\n  /// The name of the option used to cause selected data from the analysis\n  /// server to be written to a file.\n  static const String performanceLogOption = 'performance-log';\n\n  /// The name of the option used to specify if [print] should print to the\n  /// console instead of being intercepted.\n  static const String internalPrintToConsoleOption =\n      'internal-print-to-console';\n\n  /// The name of the option used to describe the new analysis driver logger.\n  static const String analysisDriverLogOption = 'analysis-driver-log';\n  static const String analysisDriverLogAliasOption = 'new-analysis-driver-log';\n\n  /// The name of the option for specifying the http diagnostic port.\n  /// If specified, users can review server status and performance information\n  /// by opening a web browser on `http://localhost:<port>`.\n  static const String diagnosticPortOption = 'diagnostic-port';\n  static const String diagnosticPortAliasOption = 'port';\n\n  /// The name of the option used to specify the path to the SDK.\n  static const String dartSdkOption = 'dart-sdk';\n  static const String dartSdkAliasOption = 'sdk';\n\n  /// The name of the option used to specify the path to the data cache.\n  static const String cacheFolderOption = 'cache';\n\n  /// The name of the option used to specify the path to the package config file\n  /// override.\n  static const String packagesFileOption = 'packages';\n\n  /// The name of the option used to specify a forced protocol version that the\n  /// server will report to the client.\n  static const String reportProtocolVersionOption = 'report-protocol-version';\n\n  /// The name of the option specifying the server protocol to use.\n  static const String serverProtocolOption = 'protocol';\n  static const String protocolAnalyzer = 'analyzer';\n  static const String protocolLsp = 'lsp';\n\n  /// The name of the flag to use the Language Server Protocol (LSP).\n  static const String useLspFlag = 'lsp';\n\n  /// The name of the flag used to specify a directory to analyze in order to\n  /// train an analysis server snapshot.\n  static const String trainUsingOption = 'train-using';\n\n  /// Flag to not use a (Evicting)FileByteStore.\n  static const String disableFileByteStoreOption = 'disable-file-byte-store';\n\n  /// The name of the flag to enable fine-grained dependencies.\n  static const String withFineDependenciesOption = 'with-fine-dependencies';\n\n  /// The builder for attachments that should be included into crash reports.\n  CrashReportingAttachmentsBuilder crashReportingAttachmentsBuilder =\n      CrashReportingAttachmentsBuilder.empty;\n\n  /// An optional manager to handle file systems which may not always be\n  /// available.\n  DetachableFileSystemManager? detachableFileSystemManager;\n\n  /// The instrumentation service that is to be used by the analysis server.\n  late final InstrumentationService _instrumentationService;\n\n  /// The session logger.\n  late final SessionLogger _sessionLogger;\n\n  /// Use the given command-line [arguments] to start this server.\n  ///\n  /// If [sendPort] is not null, assumes this is launched in an isolate and will\n  /// connect to the original isolate via an isolate channel.\n  @override\n  void start(\n    List<String> arguments, {\n    SendPort? sendPort,\n    bool defaultToLsp = false,\n  }) {\n    var sessionStartTime = DateTime.now();\n    var parser = createArgParser(defaultToLsp: defaultToLsp);\n    var results = parser.parse(arguments);\n\n    var analysisServerOptions = AnalysisServerOptions();\n    analysisServerOptions.newAnalysisDriverLog =\n        results.option(analysisDriverLogOption) ??\n        results.option(analysisDriverLogAliasOption);\n    if (results.wasParsed(useLspFlag)) {\n      analysisServerOptions.useLanguageServerProtocol = results.flag(\n        useLspFlag,\n      );\n    } else {\n      analysisServerOptions.useLanguageServerProtocol =\n          results.option(serverProtocolOption) == protocolLsp;\n    }\n    // For clients that don't supply their own identifier, use a default based\n    // on whether the server will run in LSP mode or not.\n    var clientId =\n        results.option(clientIdOption) ??\n        (analysisServerOptions.useLanguageServerProtocol\n            ? 'unknown.client.lsp'\n            : 'unknown.client.classic');\n    analysisServerOptions.clientId = clientId;\n    analysisServerOptions.clientVersion = results.option(clientVersionOption);\n    analysisServerOptions.cacheFolder = results.option(cacheFolderOption);\n    analysisServerOptions.packagesFile = results.option(packagesFileOption);\n    analysisServerOptions.reportProtocolVersion = results.option(\n      reportProtocolVersionOption,\n    );\n    analysisServerOptions.withFineDependencies = results.flag(\n      withFineDependenciesOption,\n    );\n\n    analysisServerOptions.enabledExperiments = results.multiOption(\n      enableExperimentOption,\n    );\n\n    // Read in any per-SDK overrides specified in <sdk>/config/settings.json.\n    var sdkConfig = SdkConfiguration.readFromSdk();\n    analysisServerOptions.configurationOverrides = sdkConfig;\n\n    // Analytics (legacy, and unified)\n    var disableAnalyticsForSession = results.flag(suppressAnalyticsFlag);\n\n    if (results.wasParsed(trainUsingOption)) {\n      disableAnalyticsForSession = true;\n    }\n\n    var defaultSdkPath = _getSdkPath(results);\n    var dartSdkManager = DartSdkManager(defaultSdkPath);\n\n    // TODO(brianwilkerson): It would be nice to avoid creating an SDK that\n    // can't be re-used, but the SDK is needed to create a package map provider\n    // in the case where we need to run `pub` in order to get the package map.\n    var defaultSdk = _createDefaultSdk(defaultSdkPath);\n\n    // Create the analytics manager.\n    Analytics analytics;\n    if (disableAnalyticsForSession) {\n      analytics = NoOpAnalytics();\n    } else {\n      var tool = switch (clientId) {\n        'VS-Code' || 'VS-Code-Remote' => DashTool.vscodePlugins,\n        'IntelliJ-IDEA' => DashTool.intellijPlugins,\n        'Android-Studio' => DashTool.androidStudioPlugins,\n        _ => null,\n      };\n      if (tool != null) {\n        analytics = _createAnalytics(defaultSdk, defaultSdkPath, tool);\n      } else {\n        analytics = NoOpAnalytics();\n      }\n    }\n    var analyticsManager = AnalyticsManager(analytics);\n\n    bool shouldSendCallback() {\n      // Check sdkConfig to optionally force reporting on.\n      if (sdkConfig.crashReportingForceEnabled == true) {\n        return true;\n      }\n\n      // Reuse the unified_analytics consent mechanism to determine whether\n      // we can send a crash report.\n      return analyticsManager.analytics.okToSend;\n    }\n\n    // Crash reporting\n\n    // Use sdkConfig to optionally override analytics settings.\n    var crashProductId = sdkConfig.crashReportingId ?? 'Dart_analysis_server';\n    var crashReportSender = CrashReportSender.prod(\n      crashProductId,\n      shouldSendCallback,\n    );\n\n    {\n      var disableCompletion = results.flag(\n        disableServerFeatureCompletionOption,\n      );\n      var disableSearch = results.flag(disableServerFeatureSearchOption);\n      if (disableCompletion || disableSearch) {\n        analysisServerOptions.featureSet = FeatureSet(\n          completion: !disableCompletion,\n          search: !disableSearch,\n        );\n      }\n    }\n\n    if (results.flag(helpFlag)) {\n      _printUsage(parser, fromHelp: true);\n      return;\n    }\n\n    // Record the start of the session.\n    analyticsManager.startUp(\n      time: sessionStartTime,\n      arguments: _getArgumentsForAnalytics(results),\n      clientId: clientId,\n      clientVersion: analysisServerOptions.clientVersion,\n    );\n    //\n    // Initialize the instrumentation service.\n    //\n    var logFilePath =\n        results.option(protocolTrafficLogOption) ??\n        results.option(protocolTrafficLogAliasOption);\n    var allInstrumentationServices = <InstrumentationService>[];\n    if (logFilePath != null) {\n      _rollLogFiles(logFilePath, 5);\n      allInstrumentationServices.add(\n        InstrumentationLogAdapter(\n          FileInstrumentationLogger(logFilePath),\n          watchEventExclusionFiles: {logFilePath},\n        ),\n      );\n    }\n\n    var errorNotifier = ErrorNotifier();\n    allInstrumentationServices.add(errorNotifier);\n    allInstrumentationServices.add(\n      CrashReportingInstrumentation(crashReportSender),\n    );\n    _instrumentationService = MulticastInstrumentationService(\n      allInstrumentationServices,\n    );\n\n    _instrumentationService.logVersion(\n      results.option(trainUsingOption) != null\n          ? 'training-0'\n          : _readUuid(_instrumentationService),\n      analysisServerOptions.clientId ?? '',\n      analysisServerOptions.clientVersion ?? '',\n      PROTOCOL_VERSION,\n      defaultSdk.languageVersion.toString(),\n    );\n    AnalysisEngine.instance.instrumentationService = _instrumentationService;\n\n    // Initialize the session logging service.\n    var sessionLogFilePath = results.option(sessionLogOption);\n    _sessionLogger = SessionLogger();\n    var inMemorySink = SessionLoggerInMemorySink(maxBufferLength: 256);\n    _sessionLogger.sink = inMemorySink;\n    if (sessionLogFilePath != null) {\n      inMemorySink.nextLogger = SessionLoggerFileSink(sessionLogFilePath);\n    }\n    _sessionLogger.logCommandLine(arguments: arguments);\n\n    int? diagnosticServerPort;\n    var portValue =\n        results.option(diagnosticPortOption) ??\n        results.option(diagnosticPortAliasOption);\n    if (portValue != null) {\n      try {\n        diagnosticServerPort = int.parse(portValue);\n      } on FormatException {\n        print('Invalid port number: $portValue');\n        print('');\n        _printUsage(parser);\n        exitCode = 1;\n        return;\n      }\n    }\n\n    PerformanceLogger? performanceLogger;\n    var performanceLogFilePath = results.option(performanceLogOption);\n    if (performanceLogFilePath != null) {\n      _rollLogFiles(performanceLogFilePath, 5);\n      performanceLogger = PerformanceLogger(performanceLogFilePath);\n    }\n\n    // TODO(brianwilkerson): Pass the following value to the server and\n    // implement the debouncing when it hasn't been disabled.\n    // var disableDebouncing = results[DISABLE_STATUS_NOTIFICATION_DEBOUNCING] as bool;\n    if (analysisServerOptions.useLanguageServerProtocol) {\n      if (sendPort != null) {\n        throw UnimplementedError(\n          'Isolate usage not implemented for LspAnalysisServer',\n        );\n      }\n      startLspServer(\n        results,\n        analysisServerOptions,\n        dartSdkManager,\n        analyticsManager,\n        _instrumentationService,\n        _sessionLogger,\n        diagnosticServerPort,\n        errorNotifier,\n        performanceLogger,\n      );\n    } else {\n      startAnalysisServer(\n        results,\n        analysisServerOptions,\n        parser,\n        dartSdkManager,\n        analyticsManager,\n        crashReportingAttachmentsBuilder,\n        _instrumentationService,\n        _sessionLogger,\n        RequestStatisticsHelper(),\n        diagnosticServerPort,\n        errorNotifier,\n        sendPort,\n        performanceLogger,\n      );\n    }\n\n    configureMemoryUsageTracking(\n      arguments,\n      (memoryUsageEvent) => analyticsManager.sendMemoryUsage(memoryUsageEvent),\n    );\n  }\n\n  void startAnalysisServer(\n    ArgResults results,\n    AnalysisServerOptions analysisServerOptions,\n    ArgParser parser,\n    DartSdkManager dartSdkManager,\n    AnalyticsManager analyticsManager,\n    CrashReportingAttachmentsBuilder crashReportingAttachmentsBuilder,\n    InstrumentationService instrumentationService,\n    SessionLogger sessionLogger,\n    RequestStatisticsHelper requestStatistics,\n    int? diagnosticServerPort,\n    ErrorNotifier errorNotifier,\n    SendPort? sendPort,\n    PerformanceLogger? performanceLogger,\n  ) {\n    var capture = results.flag(disableServerExceptionHandlingOption)\n        ? (_, Function f, {void Function(String)? print}) => f()\n        : _captureExceptions;\n    var trainDirectory = results.option(trainUsingOption);\n    if (trainDirectory != null) {\n      if (!FileSystemEntity.isDirectorySync(trainDirectory)) {\n        print(\"Training directory '$trainDirectory' not found.\\n\");\n        exitCode = 1;\n        return;\n      }\n    }\n    linter.registerLintRules();\n    registerBuiltInAssistGenerators();\n    registerBuiltInFixGenerators();\n\n    var diagnosticServer = _DiagnosticServerImpl();\n\n    //\n    // Create the sockets and start listening for requests.\n    //\n    var socketServer = SocketServer(\n      analysisServerOptions,\n      dartSdkManager,\n      crashReportingAttachmentsBuilder,\n      instrumentationService,\n      sessionLogger,\n      requestStatistics,\n      diagnosticServer,\n      analyticsManager,\n      detachableFileSystemManager,\n      performanceLogger,\n    );\n\n    diagnosticServer.httpServer = HttpAnalysisServer(socketServer);\n    if (diagnosticServerPort != null) {\n      diagnosticServer.startOnPort(diagnosticServerPort);\n    }\n\n    if (trainDirectory != null) {\n      if (sendPort != null) {\n        throw UnimplementedError(\n          'isolate usage not supported for DevAnalysisServer',\n        );\n      }\n      var tempDriverDir = Directory.systemTemp.createTempSync(\n        'analysis_server_',\n      );\n      analysisServerOptions.cacheFolder = tempDriverDir.path;\n      analysisServerOptions.disableFileByteStore = results.flag(\n        disableFileByteStoreOption,\n      );\n\n      var devServer = DevAnalysisServer(socketServer);\n      devServer.initServer();\n\n      () async {\n        // We first analyze code with an empty driver cache.\n        print('Analyzing with an empty driver cache:');\n        var exitCode = await devServer.processDirectories([trainDirectory]);\n        if (exitCode != 0) exit(exitCode);\n\n        print('');\n\n        // Then again with a populated cache.\n        print('Analyzing with a populated driver cache:');\n        exitCode = await devServer.processDirectories([trainDirectory]);\n        if (exitCode != 0) exit(exitCode);\n\n        diagnosticServer.httpServer.close();\n        await instrumentationService.shutdown();\n        unawaited(socketServer.analysisServer!.shutdown());\n\n        try {\n          tempDriverDir.deleteSync(recursive: true);\n        } catch (_) {\n          // Ignore any exception.\n        }\n\n        exit(exitCode);\n      }();\n    } else {\n      capture(\n        instrumentationService,\n        () {\n          Future<void> serveResult;\n          if (sendPort == null) {\n            var stdioServer = StdioAnalysisServer(socketServer);\n            serveResult = stdioServer.serveStdio();\n          } else {\n            var isolateAnalysisServer = IsolateAnalysisServer(socketServer);\n            serveResult = isolateAnalysisServer.serveIsolate(sendPort);\n          }\n          errorNotifier.server = socketServer.analysisServer;\n          if (results.flag(disableSilentAnalysisExceptionsOption)) {\n            errorNotifier.sendSilentExceptionsToClient = true;\n          }\n          serveResult.then((_) async {\n            diagnosticServer.httpServer.close();\n            await instrumentationService.shutdown();\n            unawaited(socketServer.analysisServer!.shutdown());\n            if (sendPort == null) exit(0);\n          });\n        },\n        print: results.flag(internalPrintToConsoleOption)\n            ? null\n            : diagnosticServer.httpServer.recordPrint,\n      );\n    }\n  }\n\n  void startLspServer(\n    ArgResults args,\n    AnalysisServerOptions analysisServerOptions,\n    DartSdkManager dartSdkManager,\n    AnalyticsManager analyticsManager,\n    InstrumentationService instrumentationService,\n    SessionLogger sessionLogger,\n    int? diagnosticServerPort,\n    ErrorNotifier errorNotifier,\n    PerformanceLogger? performanceLogger,\n  ) {\n    var capture = args.flag(disableServerExceptionHandlingOption)\n        ? (_, Function f, {void Function(String)? print}) => f()\n        : _captureExceptions;\n\n    linter.registerLintRules();\n    registerBuiltInAssistGenerators();\n    registerBuiltInFixGenerators();\n\n    var diagnosticServer = _DiagnosticServerImpl();\n\n    var socketServer = LspSocketServer(\n      analysisServerOptions,\n      diagnosticServer,\n      analyticsManager,\n      dartSdkManager,\n      instrumentationService,\n      sessionLogger,\n      detachableFileSystemManager,\n      performanceLogger,\n    );\n    errorNotifier.server = socketServer.analysisServer;\n    diagnosticServer.httpServer = HttpAnalysisServer(socketServer);\n\n    if (diagnosticServerPort != null) {\n      diagnosticServer.startOnPort(diagnosticServerPort);\n    }\n\n    capture(instrumentationService, () {\n      var stdioServer = LspStdioAnalysisServer(socketServer);\n      stdioServer.serveStdio().then((_) {\n        // Only shutdown the server and exit if the server is not already\n        // handling the shutdown.\n        if (!socketServer.analysisServer!.willExit) {\n          unawaited(socketServer.analysisServer!.shutdown());\n          exit(0);\n        }\n      });\n    });\n  }\n\n  /// Execute the given [callback] within a zone that will capture any unhandled\n  /// exceptions and both report them to the client and send them to the given\n  /// instrumentation [service]. If a [print] function is provided, then also\n  /// capture any data printed by the callback and redirect it to the function.\n  void _captureExceptions(\n    InstrumentationService service,\n    void Function() callback, {\n    void Function(String line)? print,\n  }) {\n    void errorFunction(\n      Zone self,\n      ZoneDelegate parent,\n      Zone zone,\n      Object exception,\n      StackTrace stackTrace,\n    ) {\n      service.logException(exception, stackTrace);\n      throw exception;\n    }\n\n    var printFunction = print == null\n        ? null\n        : (Zone self, ZoneDelegate parent, Zone zone, String line) {\n            // Note: we don't pass the line on to stdout, because that is\n            // reserved for communication to the client.\n            print(line);\n          };\n    var zoneSpecification = ZoneSpecification(\n      handleUncaughtError: errorFunction,\n      print: printFunction,\n    );\n    return runZoned(callback, zoneSpecification: zoneSpecification);\n  }\n\n  /// Create the `Analytics` instance to be used to report analytics.\n  Analytics _createAnalytics(\n    DartSdk dartSdk,\n    String dartSdkPath,\n    DashTool tool,\n  ) {\n    // TODO(brianwilkerson): Find out whether there's a way to get the channel\n    //  without running `flutter channel`.\n    var pathContext = PhysicalResourceProvider.INSTANCE.pathContext;\n    var flutterSdkRoot = pathContext.dirname(\n      pathContext.dirname(pathContext.dirname(dartSdkPath)),\n    );\n    var flutterVersionFile = PhysicalResourceProvider.INSTANCE.getFile(\n      pathContext.join(flutterSdkRoot, 'version'),\n    );\n    String? flutterVersion;\n    try {\n      flutterVersion = flutterVersionFile.readAsStringSync();\n    } catch (exception) {\n      // If we can't read the file, ignore it.\n    }\n    return Analytics(\n      tool: tool,\n      dartVersion: dartSdk.sdkVersion,\n      // flutterChannel: '',\n      flutterVersion: flutterVersion,\n    );\n  }\n\n  DartSdk _createDefaultSdk(String defaultSdkPath) {\n    var resourceProvider = PhysicalResourceProvider.INSTANCE;\n    return FolderBasedDartSdk(\n      resourceProvider,\n      resourceProvider.getFolder(defaultSdkPath),\n    );\n  }\n\n  /// Constructs a uuid combining the current date and a random integer.\n  String _generateUuidString() {\n    var millisecondsSinceEpoch = DateTime.now().millisecondsSinceEpoch;\n    var random = Random().nextInt(0x3fffffff);\n    return '$millisecondsSinceEpoch$random';\n  }\n\n  /// Return a list of the known command-line arguments that were parsed when\n  /// creating the given [results]. We return only the names of the arguments,\n  /// not the values of the arguments, in order to prevent the collection of any\n  /// PII.\n  List<String> _getArgumentsForAnalytics(ArgResults results) {\n    // The arguments that are literal strings are deprecated and no longer read\n    // from, but we still want to know if clients are using them.\n    var knownArguments = [\n      analyticsFlag,\n      cacheFolderOption,\n      clientIdOption,\n      clientVersionOption,\n      'completion-model',\n      'dartpad',\n      dartSdkOption,\n      dartSdkAliasOption,\n      diagnosticPortOption,\n      diagnosticPortAliasOption,\n      disableServerExceptionHandlingOption,\n      disableServerFeatureCompletionOption,\n      disableServerFeatureSearchOption,\n      disableSilentAnalysisExceptionsOption,\n      disableStatusNotificationDebouncingOption,\n      'enable-completion-model',\n      'enable-experiment',\n      'enable-instrumentation',\n      'file-read-mode',\n      helpFlag,\n      'ignore-unrecognized-flags',\n      internalPrintToConsoleOption,\n      packagesFileOption,\n      'preview-dart-2',\n      protocolTrafficLogOption,\n      protocolTrafficLogAliasOption,\n      reportProtocolVersionOption,\n      serverProtocolOption,\n      sessionLogOption,\n      suppressAnalyticsFlag,\n      trainUsingOption,\n      'useAnalysisHighlight2',\n      useLspFlag,\n      'use-new-relevance',\n      'use-fasta-parser',\n      disableFileByteStoreOption,\n      withFineDependenciesOption,\n    ];\n    return knownArguments\n        .where((argument) => results.wasParsed(argument))\n        .toList();\n  }\n\n  String _getSdkPath(ArgResults args) {\n    String? sdkPath;\n\n    void tryCandidateArgument(String argumentName) {\n      var argumentValue = args[argumentName];\n      if (sdkPath == null && argumentValue is String) {\n        sdkPath = argumentValue;\n      }\n    }\n\n    tryCandidateArgument(dartSdkOption);\n    tryCandidateArgument(dartSdkAliasOption);\n    var sdkPath2 = sdkPath ?? getSdkPath();\n\n    var pathContext = PhysicalResourceProvider.INSTANCE.pathContext;\n    return pathContext.normalize(pathContext.absolute(sdkPath2));\n  }\n\n  /// Print information about how to use the server.\n  void _printUsage(ArgParser parser, {bool fromHelp = false}) {\n    print('Usage: $binaryName [flags]');\n    print('');\n    print('Supported flags are:');\n    print(parser.usage);\n  }\n\n  /// Read the UUID from disk, generating and storing a new one if necessary.\n  String _readUuid(InstrumentationService service) {\n    var instrumentationLocation = PhysicalResourceProvider.INSTANCE\n        .getStateLocation('.instrumentation');\n    if (instrumentationLocation == null) {\n      return _generateUuidString();\n    }\n    var uuidFile = File(instrumentationLocation.getChild('uuid.txt').path);\n    try {\n      if (uuidFile.existsSync()) {\n        var uuid = uuidFile.readAsStringSync();\n        if (uuid.length > 5) {\n          return uuid;\n        }\n      }\n    } catch (exception, stackTrace) {\n      service.logException(exception, stackTrace);\n    }\n    var uuid = _generateUuidString();\n    try {\n      uuidFile.parent.createSync(recursive: true);\n      uuidFile.writeAsStringSync(uuid);\n    } catch (exception, stackTrace) {\n      service.logException(exception, stackTrace);\n      // Slightly alter the uuid to indicate it was not persisted\n      uuid = 'temp-$uuid';\n    }\n    return uuid;\n  }\n\n  /// Create and return the parser used to parse the command-line arguments.\n  static ArgParser createArgParser({\n    int? usageLineLength,\n    bool includeHelpFlag = true,\n    bool defaultToLsp = false,\n  }) {\n    var parser = ArgParser(usageLineLength: usageLineLength);\n    if (includeHelpFlag) {\n      parser.addFlag(\n        helpFlag,\n        abbr: 'h',\n        negatable: false,\n        help: 'Print this usage information.',\n      );\n    }\n    parser.addOption(\n      clientIdOption,\n      valueHelp: 'name',\n      help: 'An identifier for the analysis server client.',\n    );\n    parser.addOption(\n      clientVersionOption,\n      valueHelp: 'version',\n      help: 'The version of the analysis server client.',\n    );\n    parser.addOption(\n      dartSdkOption,\n      valueHelp: 'path',\n      help: 'Override the Dart SDK to use for analysis.',\n    );\n    parser.addOption(dartSdkAliasOption, hide: true);\n    parser.addOption(\n      cacheFolderOption,\n      valueHelp: 'path',\n      help: 'Override the location of the analysis server\\'s cache.',\n    );\n    parser.addOption(\n      packagesFileOption,\n      valueHelp: 'path',\n      help:\n          'The path to the package resolution configuration file, which '\n          'supplies a mapping of package names\\ninto paths.',\n    );\n    parser.addMultiOption(\n      enableExperimentOption,\n      valueHelp: 'experiment',\n      help:\n          'Enable one or more experimental features '\n          '(see dart.dev/go/experiments).',\n      hide: true,\n    );\n\n    parser.addOption(\n      serverProtocolOption,\n      defaultsTo: defaultToLsp ? protocolLsp : protocolAnalyzer,\n      valueHelp: 'protocol',\n      allowed: [protocolLsp, protocolAnalyzer],\n      allowedHelp: {\n        protocolLsp:\n            'The Language Server Protocol '\n            '(https://microsoft.github.io/language-server-protocol)',\n        protocolAnalyzer:\n            'Dart\\'s analysis server protocol '\n            '(https://dart.dev/go/analysis-server-protocol)',\n      },\n      help:\n          'Specify the protocol to use to communicate with the analysis server.',\n    );\n    // This option is hidden but still accepted; it's effectively translated to\n    // the 'protocol' option above.\n    parser.addFlag(\n      useLspFlag,\n      negatable: false,\n      help: 'Whether to use the Language Server Protocol (LSP).',\n      hide: true,\n    );\n\n    parser.addSeparator('Server diagnostics:');\n\n    parser.addOption(\n      protocolTrafficLogOption,\n      valueHelp: 'file path',\n      help: 'Write server protocol traffic to the given file.',\n    );\n    parser.addOption(protocolTrafficLogAliasOption, hide: true);\n\n    parser.addOption(\n      sessionLogOption,\n      valueHelp: 'file path',\n      help: 'Write a server session log to the given file.',\n    );\n\n    parser.addOption(\n      performanceLogOption,\n      valueHelp: 'file path',\n      help: 'Write a server performance log to the given file.',\n    );\n\n    parser.addOption(\n      analysisDriverLogOption,\n      valueHelp: 'file path',\n      help: 'Write analysis driver diagnostic data to the given file.',\n    );\n    parser.addOption(analysisDriverLogAliasOption, hide: true);\n\n    parser.addOption(\n      diagnosticPortOption,\n      valueHelp: 'port',\n      help:\n          'Serve a web UI for status and performance data on the given '\n          'port.',\n    );\n    parser.addOption(diagnosticPortAliasOption, hide: true);\n\n    //\n    // Hidden; these have not yet been made public.\n    //\n    parser.addFlag(\n      analyticsFlag,\n      help:\n          'Allow or disallow sending analytics information to '\n          'Google for this session.',\n      hide: true,\n    );\n    parser.addFlag(\n      suppressAnalyticsFlag,\n      negatable: false,\n      help: 'Suppress analytics for this session.',\n      hide: true,\n    );\n\n    //\n    // Hidden; these are for internal development.\n    //\n    parser.addOption(\n      trainUsingOption,\n      valueHelp: 'path',\n      help:\n          'Pass in a directory to analyze for purposes of training an '\n          'analysis server snapshot.  Disables analytics.',\n      hide: true,\n    );\n    parser.addFlag(\n      disableFileByteStoreOption,\n      help:\n          'Disable use of (Evicting)FileByteStore. Intended for benchmarking.',\n      hide: true,\n    );\n    parser.addFlag(\n      withFineDependenciesOption,\n      help: 'Enable fine-grained dependencies.',\n      defaultsTo: true,\n      hide: true,\n    );\n    parser.addFlag(\n      disableServerExceptionHandlingOption,\n      // TODO(jcollins-g): Pipeline option through and apply to all\n      // exception-nullifying runZoned() calls.\n      help:\n          'disable analyzer exception capture for interactive debugging '\n          'of the server',\n      hide: true,\n    );\n    parser.addFlag(\n      disableServerFeatureCompletionOption,\n      help: 'disable all completion features',\n      hide: true,\n    );\n    parser.addFlag(\n      disableServerFeatureSearchOption,\n      help: 'disable all search features',\n      hide: true,\n    );\n    parser.addFlag(\n      disableSilentAnalysisExceptionsOption,\n      negatable: false,\n      help: 'Prevent exceptions during analysis from being silent',\n      hide: true,\n    );\n    parser.addFlag(\n      disableStatusNotificationDebouncingOption,\n      negatable: false,\n      help: 'Suppress debouncing of status notifications.',\n      hide: true,\n    );\n    parser.addFlag(\n      internalPrintToConsoleOption,\n      help: 'enable sending `print` output to the console',\n      negatable: false,\n      hide: true,\n    );\n    parser.addOption(\n      reportProtocolVersionOption,\n      valueHelp: 'version',\n      help:\n          'The protocol version that the server will report to the client, '\n          'can be used to temporary enabling features that we expect to be '\n          'available in future versions.',\n      hide: true,\n    );\n\n    //\n    // Hidden; these are deprecated and no longer read from.\n    //\n\n    // Removed 11/15/2020.\n    parser.addOption('completion-model', hide: true);\n    // Removed 11/8/2020.\n    parser.addFlag('dartpad', hide: true);\n    // Removed 11/15/2020.\n    parser.addFlag('enable-completion-model', hide: true);\n    // Removed 9/23/2020.\n    parser.addFlag('enable-instrumentation', hide: true);\n    // Removed 11/12/2020.\n    parser.addOption('file-read-mode', hide: true);\n    // Removed 11/12/2020.\n    parser.addFlag('ignore-unrecognized-flags', hide: true);\n    // Removed 11/8/2020.\n    parser.addFlag('preview-dart-2', hide: true);\n    // Removed 11/12/2020.\n    parser.addFlag('useAnalysisHighlight2', hide: true);\n    // Removed 11/13/2020.\n    parser.addFlag('use-new-relevance', hide: true);\n    // Removed 9/23/2020.\n    parser.addFlag('use-fasta-parser', hide: true);\n\n    return parser;\n  }\n\n  /// Perform log files rolling.\n  ///\n  /// Rename existing files with names `[path].(x)` to `[path].(x+1)`.\n  /// Keep at most [numOld] files.\n  /// Rename the file with the given [path] to `[path].1`.\n  static void _rollLogFiles(String path, int numOld) {\n    for (var i = numOld - 1; i >= 0; i--) {\n      try {\n        var oldPath = i == 0 ? path : '$path.$i';\n        File(oldPath).renameSync('$path.${i + 1}');\n      } catch (e) {\n        // If a file can't be renamed, then leave it and attempt to rename the\n        // remaining files.\n      }\n    }\n  }\n}\n\n/// Implements the [DiagnosticServer] class by wrapping an [HttpAnalysisServer].\nclass _DiagnosticServerImpl extends DiagnosticServer {\n  late HttpAnalysisServer httpServer;\n\n  @override\n  Future<int> getServerPort() async => (await httpServer.serveHttp())!;\n\n  Future<void> startOnPort(int port) {\n    return httpServer.serveHttp(port);\n  }\n}\n"}},"clientRequestTime":1768243503831}}
+{"time":1768243503836,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","method":"textDocument/didOpen","params":{"textDocument":{"uri":"{{workspaceFolder-0}}/bin/server.dart","languageId":"dart","version":1,"text":"// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file\n// for details. All rights reserved. Use of this source code is governed by a\n// BSD-style license that can be found in the LICENSE file.\n\nimport 'package:analysis_server/starter.dart';\n\n/// Create and run an analysis server.\nvoid main(List<String> args) {\n  var starter = ServerStarter();\n  starter.start(args);\n}\n"}},"clientRequestTime":1768243503832}}
+{"time":1768243503836,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","method":"textDocument/didChange","params":{"textDocument":{"uri":"{{workspaceFolder-0}}/lib/starter.dart","version":2},"contentChanges":[{"range":{"start":{"line":16,"character":23},"end":{"line":16,"character":23}},"rangeLength":0,"text":"2"},{"range":{"start":{"line":14,"character":28},"end":{"line":14,"character":28}},"rangeLength":0,"text":"2"}]},"clientRequestTime":1768243503832}}
+{"time":1768243503836,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","method":"textDocument/didChange","params":{"textDocument":{"uri":"{{workspaceFolder-0}}/lib/src/server/driver.dart","version":2},"contentChanges":[{"range":{"start":{"line":51,"character":24},"end":{"line":51,"character":37}},"rangeLength":13,"text":"ServerStarter2"}]},"clientRequestTime":1768243503832}}
+{"time":1768243503836,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","method":"textDocument/didChange","params":{"textDocument":{"uri":"{{workspaceFolder-0}}/bin/server.dart","version":2},"contentChanges":[{"range":{"start":{"line":8,"character":16},"end":{"line":8,"character":29}},"rangeLength":13,"text":"ServerStarter2"}]},"clientRequestTime":1768243503832}}
 {"time":1768243503836,"kind":"message","sender":"server","receiver":"ide","message":{"id":946,"jsonrpc":"2.0","method":"window/workDoneProgress/create","params":{"token":"ANALYZING"}}}
-{"time":1768243503911,"kind":"message","sender":"server","receiver":"ide","message":{"jsonrpc":"2.0","method":"dart/textDocument/publishClosingLabels","params":{"labels":[{"label":"InstrumentationLogAdapter","range":{"end":{"character":9,"line":315},"start":{"character":8,"line":312}}}],"uri":"file://{{workspaceFolder-0}}/lib/src/server/driver.dart"}}}
-{"time":1768243503911,"kind":"message","sender":"server","receiver":"ide","message":{"jsonrpc":"2.0","method":"dart/textDocument/publishOutline","params":{"outline":{"children":[{"children":[{"codeRange":{"end":{"character":45,"line":53},"start":{"character":15,"line":53}},"element":{"kind":"FIELD","name":"binaryName","range":{"end":{"character":25,"line":53},"start":{"character":15,"line":53}},"returnType":""},"range":{"end":{"character":46,"line":53},"start":{"character":2,"line":52}}},{"codeRange":{"end":{"character":50,"line":56},"start":{"character":22,"line":56}},"element":{"kind":"FIELD","name":"clientIdOption","range":{"end":{"character":36,"line":56},"start":{"character":22,"line":56}},"returnType":"String"},"range":{"end":{"character":51,"line":56},"start":{"character":2,"line":55}}},{"codeRange":{"end":{"character":60,"line":59},"start":{"character":22,"line":59}},"element":{"kind":"FIELD","name":"clientVersionOption","range":{"end":{"character":41,"line":59},"start":{"character":22,"line":59}},"returnType":"String"},"range":{"end":{"character":61,"line":59},"start":{"character":2,"line":58}}},{"codeRange":{"end":{"character":41,"line":63},"start":{"character":22,"line":62}},"element":{"kind":"FIELD","name":"disableServerExceptionHandlingOption","range":{"end":{"character":58,"line":62},"start":{"character":22,"line":62}},"returnType":"String"},"range":{"end":{"character":42,"line":63},"start":{"character":2,"line":61}}},{"codeRange":{"end":{"character":41,"line":67},"start":{"character":22,"line":66}},"element":{"kind":"FIELD","name":"disableServerFeatureCompletionOption","range":{"end":{"character":58,"line":66},"start":{"character":22,"line":66}},"returnType":"String"},"range":{"end":{"character":42,"line":67},"start":{"character":2,"line":65}}},{"codeRange":{"end":{"character":37,"line":71},"start":{"character":22,"line":70}},"element":{"kind":"FIELD","name":"disableServerFeatureSearchOption","range":{"end":{"character":54,"line":70},"start":{"character":22,"line":70}},"returnType":"String"},"range":{"end":{"character":38,"line":71},"start":{"character":2,"line":69}}},{"codeRange":{"end":{"character":46,"line":76},"start":{"character":22,"line":75}},"element":{"kind":"FIELD","name":"disableStatusNotificationDebouncingOption","range":{"end":{"character":63,"line":75},"start":{"character":22,"line":75}},"returnType":"String"},"range":{"end":{"character":47,"line":76},"start":{"character":2,"line":73}}},{"codeRange":{"end":{"character":42,"line":81},"start":{"character":22,"line":80}},"element":{"kind":"FIELD","name":"disableSilentAnalysisExceptionsOption","range":{"end":{"character":59,"line":80},"start":{"character":22,"line":80}},"returnType":"String"},"range":{"end":{"character":43,"line":81},"start":{"character":2,"line":78}}},{"codeRange":{"end":{"character":66,"line":84},"start":{"character":22,"line":84}},"element":{"kind":"FIELD","name":"enableExperimentOption","range":{"end":{"character":44,"line":84},"start":{"character":22,"line":84}},"returnType":"String"},"range":{"end":{"character":67,"line":84},"start":{"character":2,"line":83}}},{"codeRange":{"end":{"character":39,"line":87},"start":{"character":22,"line":87}},"element":{"kind":"FIELD","name":"helpFlag","range":{"end":{"character":30,"line":87},"start":{"character":22,"line":87}},"returnType":"String"},"range":{"end":{"character":40,"line":87},"start":{"character":2,"line":86}}},{"codeRange":{"end":{"character":49,"line":90},"start":{"character":22,"line":90}},"element":{"kind":"FIELD","name":"analyticsFlag","range":{"end":{"character":35,"line":90},"start":{"character":22,"line":90}},"returnType":"String"},"range":{"end":{"character":50,"line":90},"start":{"character":2,"line":89}}},{"codeRange":{"end":{"character":66,"line":93},"start":{"character":22,"line":93}},"element":{"kind":"FIELD","name":"suppressAnalyticsFlag","range":{"end":{"character":43,"line":93},"start":{"character":22,"line":93}},"returnType":"String"},"range":{"end":{"character":67,"line":93},"start":{"character":2,"line":92}}},{"codeRange":{"end":{"character":71,"line":97},"start":{"character":22,"line":97}},"element":{"kind":"FIELD","name":"protocolTrafficLogOption","range":{"end":{"character":46,"line":97},"start":{"character":22,"line":97}},"returnType":"String"},"range":{"end":{"character":72,"line":97},"start":{"character":2,"line":95}}},{"codeRange":{"end":{"character":32,"line":99},"start":{"character":22,"line":98}},"element":{"kind":"FIELD","name":"protocolTrafficLogAliasOption","range":{"end":{"character":51,"line":98},"start":{"character":22,"line":98}},"returnType":"String"},"range":{"end":{"character":33,"line":99},"start":{"character":2,"line":98}}},{"codeRange":{"end":{"character":54,"line":103},"start":{"character":22,"line":103}},"element":{"kind":"FIELD","name":"sessionLogOption","range":{"end":{"character":38,"line":103},"start":{"character":22,"line":103}},"returnType":"String"},"range":{"end":{"character":55,"line":103},"start":{"character":2,"line":101}}},{"codeRange":{"end":{"character":62,"line":107},"start":{"character":22,"line":107}},"element":{"kind":"FIELD","name":"performanceLogOption","range":{"end":{"character":42,"line":107},"start":{"character":22,"line":107}},"returnType":"String"},"range":{"end":{"character":63,"line":107},"start":{"character":2,"line":105}}},{"codeRange":{"end":{"character":33,"line":112},"start":{"character":22,"line":111}},"element":{"kind":"FIELD","name":"internalPrintToConsoleOption","range":{"end":{"character":50,"line":111},"start":{"character":22,"line":111}},"returnType":"String"},"range":{"end":{"character":34,"line":112},"start":{"character":2,"line":109}}},{"codeRange":{"end":{"character":69,"line":115},"start":{"character":22,"line":115}},"element":{"kind":"FIELD","name":"analysisDriverLogOption","range":{"end":{"character":45,"line":115},"start":{"character":22,"line":115}},"returnType":"String"},"range":{"end":{"character":70,"line":115},"start":{"character":2,"line":114}}},{"codeRange":{"end":{"character":78,"line":116},"start":{"character":22,"line":116}},"element":{"kind":"FIELD","name":"analysisDriverLogAliasOption","range":{"end":{"character":50,"line":116},"start":{"character":22,"line":116}},"returnType":"String"},"range":{"end":{"character":79,"line":116},"start":{"character":2,"line":116}}},{"codeRange":{"end":{"character":62,"line":121},"start":{"character":22,"line":121}},"element":{"kind":"FIELD","name":"diagnosticPortOption","range":{"end":{"character":42,"line":121},"start":{"character":22,"line":121}},"returnType":"String"},"range":{"end":{"character":63,"line":121},"start":{"character":2,"line":118}}},{"codeRange":{"end":{"character":56,"line":122},"start":{"character":22,"line":122}},"element":{"kind":"FIELD","name":"diagnosticPortAliasOption","range":{"end":{"character":47,"line":122},"start":{"character":22,"line":122}},"returnType":"String"},"range":{"end":{"character":57,"line":122},"start":{"character":2,"line":122}}},{"codeRange":{"end":{"character":48,"line":125},"start":{"character":22,"line":125}},"element":{"kind":"FIELD","name":"dartSdkOption","range":{"end":{"character":35,"line":125},"start":{"character":22,"line":125}},"returnType":"String"},"range":{"end":{"character":49,"line":125},"start":{"character":2,"line":124}}},{"codeRange":{"end":{"character":48,"line":126},"start":{"character":22,"line":126}},"element":{"kind":"FIELD","name":"dartSdkAliasOption","range":{"end":{"character":40,"line":126},"start":{"character":22,"line":126}},"returnType":"String"},"range":{"end":{"character":49,"line":126},"start":{"character":2,"line":126}}},{"codeRange":{"end":{"character":49,"line":129},"start":{"character":22,"line":129}},"element":{"kind":"FIELD","name":"cacheFolderOption","range":{"end":{"character":39,"line":129},"start":{"character":22,"line":129}},"returnType":"String"},"range":{"end":{"character":50,"line":129},"start":{"character":2,"line":128}}},{"codeRange":{"end":{"character":53,"line":133},"start":{"character":22,"line":133}},"element":{"kind":"FIELD","name":"packagesFileOption","range":{"end":{"character":40,"line":133},"start":{"character":22,"line":133}},"returnType":"String"},"range":{"end":{"character":54,"line":133},"start":{"character":2,"line":131}}},{"codeRange":{"end":{"character":77,"line":137},"start":{"character":22,"line":137}},"element":{"kind":"FIELD","name":"reportProtocolVersionOption","range":{"end":{"character":49,"line":137},"start":{"character":22,"line":137}},"returnType":"String"},"range":{"end":{"character":78,"line":137},"start":{"character":2,"line":135}}},{"codeRange":{"end":{"character":55,"line":140},"start":{"character":22,"line":140}},"element":{"kind":"FIELD","name":"serverProtocolOption","range":{"end":{"character":42,"line":140},"start":{"character":22,"line":140}},"returnType":"String"},"range":{"end":{"character":56,"line":140},"start":{"character":2,"line":139}}},{"codeRange":{"end":{"character":51,"line":141},"start":{"character":22,"line":141}},"element":{"kind":"FIELD","name":"protocolAnalyzer","range":{"end":{"character":38,"line":141},"start":{"character":22,"line":141}},"returnType":"String"},"range":{"end":{"character":52,"line":141},"start":{"character":2,"line":141}}},{"codeRange":{"end":{"character":41,"line":142},"start":{"character":22,"line":142}},"element":{"kind":"FIELD","name":"protocolLsp","range":{"end":{"character":33,"line":142},"start":{"character":22,"line":142}},"returnType":"String"},"range":{"end":{"character":42,"line":142},"start":{"character":2,"line":142}}},{"codeRange":{"end":{"character":40,"line":145},"start":{"character":22,"line":145}},"element":{"kind":"FIELD","name":"useLspFlag","range":{"end":{"character":32,"line":145},"start":{"character":22,"line":145}},"returnType":"String"},"range":{"end":{"character":41,"line":145},"start":{"character":2,"line":144}}},{"codeRange":{"end":{"character":54,"line":149},"start":{"character":22,"line":149}},"element":{"kind":"FIELD","name":"trainUsingOption","range":{"end":{"character":38,"line":149},"start":{"character":22,"line":149}},"returnType":"String"},"range":{"end":{"character":55,"line":149},"start":{"character":2,"line":147}}},{"codeRange":{"end":{"character":76,"line":152},"start":{"character":22,"line":152}},"element":{"kind":"FIELD","name":"disableFileByteStoreOption","range":{"end":{"character":48,"line":152},"start":{"character":22,"line":152}},"returnType":"String"},"range":{"end":{"character":77,"line":152},"start":{"character":2,"line":151}}},{"codeRange":{"end":{"character":75,"line":155},"start":{"character":22,"line":155}},"element":{"kind":"FIELD","name":"withFineDependenciesOption","range":{"end":{"character":48,"line":155},"start":{"character":22,"line":155}},"returnType":"String"},"range":{"end":{"character":76,"line":155},"start":{"character":2,"line":154}}},{"codeRange":{"end":{"character":44,"line":159},"start":{"character":35,"line":158}},"element":{"kind":"FIELD","name":"crashReportingAttachmentsBuilder","range":{"end":{"character":67,"line":158},"start":{"character":35,"line":158}},"returnType":"CrashReportingAttachmentsBuilder"},"range":{"end":{"character":45,"line":159},"start":{"character":2,"line":157}}},{"codeRange":{"end":{"character":58,"line":163},"start":{"character":31,"line":163}},"element":{"kind":"FIELD","name":"detachableFileSystemManager","range":{"end":{"character":58,"line":163},"start":{"character":31,"line":163}},"returnType":"DetachableFileSystemManager?"},"range":{"end":{"character":59,"line":163},"start":{"character":2,"line":161}}},{"codeRange":{"end":{"character":59,"line":166},"start":{"character":36,"line":166}},"element":{"kind":"FIELD","name":"_instrumentationService","range":{"end":{"character":59,"line":166},"start":{"character":36,"line":166}},"returnType":"InstrumentationService"},"range":{"end":{"character":60,"line":166},"start":{"character":2,"line":165}}},{"codeRange":{"end":{"character":41,"line":169},"start":{"character":27,"line":169}},"element":{"kind":"FIELD","name":"_sessionLogger","range":{"end":{"character":41,"line":169},"start":{"character":27,"line":169}},"returnType":"SessionLogger"},"range":{"end":{"character":42,"line":169},"start":{"character":2,"line":168}}},{"children":[{"codeRange":{"end":{"character":5,"line":266},"start":{"character":4,"line":257}},"element":{"kind":"FUNCTION","name":"shouldSendCallback","parameters":"()","range":{"end":{"character":27,"line":257},"start":{"character":9,"line":257}},"returnType":"bool"},"range":{"end":{"character":5,"line":266},"start":{"character":4,"line":257}}}],"codeRange":{"end":{"character":3,"line":414},"start":{"character":2,"line":176}},"element":{"kind":"METHOD","name":"start","parameters":"(List<String> arguments, {SendPort? sendPort, bool defaultToLsp = false})","range":{"end":{"character":12,"line":176},"start":{"character":7,"line":176}},"returnType":"void"},"range":{"end":{"character":3,"line":414},"start":{"character":2,"line":171}}},{"codeRange":{"end":{"character":3,"line":539},"start":{"character":2,"line":416}},"element":{"kind":"METHOD","name":"startAnalysisServer","parameters":"(ArgResults results, AnalysisServerOptions analysisServerOptions, ArgParser parser, DartSdkManager dartSdkManager, AnalyticsManager analyticsManager, CrashReportingAttachmentsBuilder crashReportingAttachmentsBuilder, InstrumentationService instrumentationService, SessionLogger sessionLogger, RequestStatisticsHelper requestStatistics, int? diagnosticServerPort, ErrorNotifier errorNotifier, SendPort? sendPort, PerformanceLogger? performanceLogger)","range":{"end":{"character":26,"line":416},"start":{"character":7,"line":416}},"returnType":"void"},"range":{"end":{"character":3,"line":539},"start":{"character":2,"line":416}}},{"codeRange":{"end":{"character":3,"line":590},"start":{"character":2,"line":541}},"element":{"kind":"METHOD","name":"startLspServer","parameters":"(ArgResults args, AnalysisServerOptions analysisServerOptions, DartSdkManager dartSdkManager, AnalyticsManager analyticsManager, InstrumentationService instrumentationService, SessionLogger sessionLogger, int? diagnosticServerPort, ErrorNotifier errorNotifier, PerformanceLogger? performanceLogger)","range":{"end":{"character":21,"line":541},"start":{"character":7,"line":541}},"returnType":"void"},"range":{"end":{"character":3,"line":590},"start":{"character":2,"line":541}}},{"children":[{"codeRange":{"end":{"character":5,"line":610},"start":{"character":4,"line":601}},"element":{"kind":"FUNCTION","name":"errorFunction","parameters":"(Zone self, ZoneDelegate parent, Zone zone, Object exception, StackTrace stackTrace)","range":{"end":{"character":22,"line":601},"start":{"character":9,"line":601}},"returnType":"void"},"range":{"end":{"character":5,"line":610},"start":{"character":4,"line":601}}}],"codeRange":{"end":{"character":3,"line":624},"start":{"character":2,"line":596}},"element":{"kind":"METHOD","name":"_captureExceptions","parameters":"(InstrumentationService service, void Function() callback, {void Function(String line)? print})","range":{"end":{"character":25,"line":596},"start":{"character":7,"line":596}},"returnType":"void"},"range":{"end":{"character":3,"line":624},"start":{"character":2,"line":592}}},{"codeRange":{"end":{"character":3,"line":653},"start":{"character":2,"line":627}},"element":{"kind":"METHOD","name":"_createAnalytics","parameters":"(DartSdk dartSdk, String dartSdkPath, DashTool tool)","range":{"end":{"character":28,"line":627},"start":{"character":12,"line":627}},"returnType":"Analytics"},"range":{"end":{"character":3,"line":653},"start":{"character":2,"line":626}}},{"codeRange":{"end":{"character":3,"line":661},"start":{"character":2,"line":655}},"element":{"kind":"METHOD","name":"_createDefaultSdk","parameters":"(String defaultSdkPath)","range":{"end":{"character":27,"line":655},"start":{"character":10,"line":655}},"returnType":"DartSdk"},"range":{"end":{"character":3,"line":661},"start":{"character":2,"line":655}}},{"codeRange":{"end":{"character":3,"line":668},"start":{"character":2,"line":664}},"element":{"kind":"METHOD","name":"_generateUuidString","parameters":"()","range":{"end":{"character":28,"line":664},"start":{"character":9,"line":664}},"returnType":"String"},"range":{"end":{"character":3,"line":668},"start":{"character":2,"line":663}}},{"codeRange":{"end":{"character":3,"line":719},"start":{"character":2,"line":674}},"element":{"kind":"METHOD","name":"_getArgumentsForAnalytics","parameters":"(ArgResults results)","range":{"end":{"character":40,"line":674},"start":{"character":15,"line":674}},"returnType":"List<String>"},"range":{"end":{"character":3,"line":719},"start":{"character":2,"line":670}}},{"children":[{"codeRange":{"end":{"character":5,"line":729},"start":{"character":4,"line":724}},"element":{"kind":"FUNCTION","name":"tryCandidateArgument","parameters":"(String argumentName)","range":{"end":{"character":29,"line":724},"start":{"character":9,"line":724}},"returnType":"void"},"range":{"end":{"character":5,"line":729},"start":{"character":4,"line":724}}}],"codeRange":{"end":{"character":3,"line":737},"start":{"character":2,"line":721}},"element":{"kind":"METHOD","name":"_getSdkPath","parameters":"(ArgResults args)","range":{"end":{"character":20,"line":721},"start":{"character":9,"line":721}},"returnType":"String"},"range":{"end":{"character":3,"line":737},"start":{"character":2,"line":721}}},{"codeRange":{"end":{"character":3,"line":745},"start":{"character":2,"line":740}},"element":{"kind":"METHOD","name":"_printUsage","parameters":"(ArgParser parser, {bool fromHelp = false})","range":{"end":{"character":18,"line":740},"start":{"character":7,"line":740}},"returnType":"void"},"range":{"end":{"character":3,"line":745},"start":{"character":2,"line":739}}},{"codeRange":{"end":{"character":3,"line":775},"start":{"character":2,"line":748}},"element":{"kind":"METHOD","name":"_readUuid","parameters":"(InstrumentationService service)","range":{"end":{"character":18,"line":748},"start":{"character":9,"line":748}},"returnType":"String"},"range":{"end":{"character":3,"line":775},"start":{"character":2,"line":747}}},{"codeRange":{"end":{"character":3,"line":1004},"start":{"character":2,"line":778}},"element":{"kind":"METHOD","name":"createArgParser","parameters":"({int? usageLineLength, bool includeHelpFlag = true, bool defaultToLsp = false})","range":{"end":{"character":34,"line":778},"start":{"character":19,"line":778}},"returnType":"ArgParser"},"range":{"end":{"character":3,"line":1004},"start":{"character":2,"line":777}}},{"codeRange":{"end":{"character":3,"line":1021},"start":{"character":2,"line":1011}},"element":{"kind":"METHOD","name":"_rollLogFiles","parameters":"(String path, int numOld)","range":{"end":{"character":27,"line":1011},"start":{"character":14,"line":1011}},"returnType":"void"},"range":{"end":{"character":3,"line":1021},"start":{"character":2,"line":1006}}}],"codeRange":{"end":{"character":1,"line":1022},"start":{"character":0,"line":51}},"element":{"kind":"CLASS","name":"Driver","range":{"end":{"character":12,"line":51},"start":{"character":6,"line":51}}},"range":{"end":{"character":1,"line":1022},"start":{"character":0,"line":48}}},{"children":[{"codeRange":{"end":{"character":36,"line":1026},"start":{"character":26,"line":1026}},"element":{"kind":"FIELD","name":"httpServer","range":{"end":{"character":36,"line":1026},"start":{"character":26,"line":1026}},"returnType":"HttpAnalysisServer"},"range":{"end":{"character":37,"line":1026},"start":{"character":2,"line":1026}}},{"codeRange":{"end":{"character":71,"line":1029},"start":{"character":2,"line":1029}},"element":{"kind":"METHOD","name":"getServerPort","parameters":"()","range":{"end":{"character":27,"line":1029},"start":{"character":14,"line":1029}},"returnType":"Future<int>"},"range":{"end":{"character":71,"line":1029},"start":{"character":2,"line":1028}}},{"codeRange":{"end":{"character":3,"line":1033},"start":{"character":2,"line":1031}},"element":{"kind":"METHOD","name":"startOnPort","parameters":"(int port)","range":{"end":{"character":26,"line":1031},"start":{"character":15,"line":1031}},"returnType":"Future<void>"},"range":{"end":{"character":3,"line":1033},"start":{"character":2,"line":1031}}}],"codeRange":{"end":{"character":1,"line":1034},"start":{"character":0,"line":1025}},"element":{"kind":"CLASS","name":"_DiagnosticServerImpl","range":{"end":{"character":27,"line":1025},"start":{"character":6,"line":1025}}},"range":{"end":{"character":1,"line":1034},"start":{"character":0,"line":1024}}}],"codeRange":{"end":{"character":0,"line":1035},"start":{"character":0,"line":0}},"element":{"kind":"COMPILATION_UNIT","name":"<unit>","range":{"end":{"character":0,"line":1035},"start":{"character":0,"line":0}}},"range":{"end":{"character":0,"line":1035},"start":{"character":0,"line":0}}},"uri":"file://{{workspaceFolder-0}}/lib/src/server/driver.dart"}}}
-{"time":1768243503912,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","id":2429,"method":"textDocument/inlayHint","params":{"textDocument":{"uri":"file://{{workspaceFolder-0}}/lib/starter.dart"},"range":{"start":{"line":0,"character":0},"end":{"line":35,"character":0}}},"clientRequestTime":1768243503910}}
+{"time":1768243503911,"kind":"message","sender":"server","receiver":"ide","message":{"jsonrpc":"2.0","method":"dart/textDocument/publishClosingLabels","params":{"labels":[{"label":"InstrumentationLogAdapter","range":{"end":{"character":9,"line":315},"start":{"character":8,"line":312}}}],"uri":"{{workspaceFolder-0}}/lib/src/server/driver.dart"}}}
+{"time":1768243503911,"kind":"message","sender":"server","receiver":"ide","message":{"jsonrpc":"2.0","method":"dart/textDocument/publishOutline","params":{"outline":{"children":[{"children":[{"codeRange":{"end":{"character":45,"line":53},"start":{"character":15,"line":53}},"element":{"kind":"FIELD","name":"binaryName","range":{"end":{"character":25,"line":53},"start":{"character":15,"line":53}},"returnType":""},"range":{"end":{"character":46,"line":53},"start":{"character":2,"line":52}}},{"codeRange":{"end":{"character":50,"line":56},"start":{"character":22,"line":56}},"element":{"kind":"FIELD","name":"clientIdOption","range":{"end":{"character":36,"line":56},"start":{"character":22,"line":56}},"returnType":"String"},"range":{"end":{"character":51,"line":56},"start":{"character":2,"line":55}}},{"codeRange":{"end":{"character":60,"line":59},"start":{"character":22,"line":59}},"element":{"kind":"FIELD","name":"clientVersionOption","range":{"end":{"character":41,"line":59},"start":{"character":22,"line":59}},"returnType":"String"},"range":{"end":{"character":61,"line":59},"start":{"character":2,"line":58}}},{"codeRange":{"end":{"character":41,"line":63},"start":{"character":22,"line":62}},"element":{"kind":"FIELD","name":"disableServerExceptionHandlingOption","range":{"end":{"character":58,"line":62},"start":{"character":22,"line":62}},"returnType":"String"},"range":{"end":{"character":42,"line":63},"start":{"character":2,"line":61}}},{"codeRange":{"end":{"character":41,"line":67},"start":{"character":22,"line":66}},"element":{"kind":"FIELD","name":"disableServerFeatureCompletionOption","range":{"end":{"character":58,"line":66},"start":{"character":22,"line":66}},"returnType":"String"},"range":{"end":{"character":42,"line":67},"start":{"character":2,"line":65}}},{"codeRange":{"end":{"character":37,"line":71},"start":{"character":22,"line":70}},"element":{"kind":"FIELD","name":"disableServerFeatureSearchOption","range":{"end":{"character":54,"line":70},"start":{"character":22,"line":70}},"returnType":"String"},"range":{"end":{"character":38,"line":71},"start":{"character":2,"line":69}}},{"codeRange":{"end":{"character":46,"line":76},"start":{"character":22,"line":75}},"element":{"kind":"FIELD","name":"disableStatusNotificationDebouncingOption","range":{"end":{"character":63,"line":75},"start":{"character":22,"line":75}},"returnType":"String"},"range":{"end":{"character":47,"line":76},"start":{"character":2,"line":73}}},{"codeRange":{"end":{"character":42,"line":81},"start":{"character":22,"line":80}},"element":{"kind":"FIELD","name":"disableSilentAnalysisExceptionsOption","range":{"end":{"character":59,"line":80},"start":{"character":22,"line":80}},"returnType":"String"},"range":{"end":{"character":43,"line":81},"start":{"character":2,"line":78}}},{"codeRange":{"end":{"character":66,"line":84},"start":{"character":22,"line":84}},"element":{"kind":"FIELD","name":"enableExperimentOption","range":{"end":{"character":44,"line":84},"start":{"character":22,"line":84}},"returnType":"String"},"range":{"end":{"character":67,"line":84},"start":{"character":2,"line":83}}},{"codeRange":{"end":{"character":39,"line":87},"start":{"character":22,"line":87}},"element":{"kind":"FIELD","name":"helpFlag","range":{"end":{"character":30,"line":87},"start":{"character":22,"line":87}},"returnType":"String"},"range":{"end":{"character":40,"line":87},"start":{"character":2,"line":86}}},{"codeRange":{"end":{"character":49,"line":90},"start":{"character":22,"line":90}},"element":{"kind":"FIELD","name":"analyticsFlag","range":{"end":{"character":35,"line":90},"start":{"character":22,"line":90}},"returnType":"String"},"range":{"end":{"character":50,"line":90},"start":{"character":2,"line":89}}},{"codeRange":{"end":{"character":66,"line":93},"start":{"character":22,"line":93}},"element":{"kind":"FIELD","name":"suppressAnalyticsFlag","range":{"end":{"character":43,"line":93},"start":{"character":22,"line":93}},"returnType":"String"},"range":{"end":{"character":67,"line":93},"start":{"character":2,"line":92}}},{"codeRange":{"end":{"character":71,"line":97},"start":{"character":22,"line":97}},"element":{"kind":"FIELD","name":"protocolTrafficLogOption","range":{"end":{"character":46,"line":97},"start":{"character":22,"line":97}},"returnType":"String"},"range":{"end":{"character":72,"line":97},"start":{"character":2,"line":95}}},{"codeRange":{"end":{"character":32,"line":99},"start":{"character":22,"line":98}},"element":{"kind":"FIELD","name":"protocolTrafficLogAliasOption","range":{"end":{"character":51,"line":98},"start":{"character":22,"line":98}},"returnType":"String"},"range":{"end":{"character":33,"line":99},"start":{"character":2,"line":98}}},{"codeRange":{"end":{"character":54,"line":103},"start":{"character":22,"line":103}},"element":{"kind":"FIELD","name":"sessionLogOption","range":{"end":{"character":38,"line":103},"start":{"character":22,"line":103}},"returnType":"String"},"range":{"end":{"character":55,"line":103},"start":{"character":2,"line":101}}},{"codeRange":{"end":{"character":62,"line":107},"start":{"character":22,"line":107}},"element":{"kind":"FIELD","name":"performanceLogOption","range":{"end":{"character":42,"line":107},"start":{"character":22,"line":107}},"returnType":"String"},"range":{"end":{"character":63,"line":107},"start":{"character":2,"line":105}}},{"codeRange":{"end":{"character":33,"line":112},"start":{"character":22,"line":111}},"element":{"kind":"FIELD","name":"internalPrintToConsoleOption","range":{"end":{"character":50,"line":111},"start":{"character":22,"line":111}},"returnType":"String"},"range":{"end":{"character":34,"line":112},"start":{"character":2,"line":109}}},{"codeRange":{"end":{"character":69,"line":115},"start":{"character":22,"line":115}},"element":{"kind":"FIELD","name":"analysisDriverLogOption","range":{"end":{"character":45,"line":115},"start":{"character":22,"line":115}},"returnType":"String"},"range":{"end":{"character":70,"line":115},"start":{"character":2,"line":114}}},{"codeRange":{"end":{"character":78,"line":116},"start":{"character":22,"line":116}},"element":{"kind":"FIELD","name":"analysisDriverLogAliasOption","range":{"end":{"character":50,"line":116},"start":{"character":22,"line":116}},"returnType":"String"},"range":{"end":{"character":79,"line":116},"start":{"character":2,"line":116}}},{"codeRange":{"end":{"character":62,"line":121},"start":{"character":22,"line":121}},"element":{"kind":"FIELD","name":"diagnosticPortOption","range":{"end":{"character":42,"line":121},"start":{"character":22,"line":121}},"returnType":"String"},"range":{"end":{"character":63,"line":121},"start":{"character":2,"line":118}}},{"codeRange":{"end":{"character":56,"line":122},"start":{"character":22,"line":122}},"element":{"kind":"FIELD","name":"diagnosticPortAliasOption","range":{"end":{"character":47,"line":122},"start":{"character":22,"line":122}},"returnType":"String"},"range":{"end":{"character":57,"line":122},"start":{"character":2,"line":122}}},{"codeRange":{"end":{"character":48,"line":125},"start":{"character":22,"line":125}},"element":{"kind":"FIELD","name":"dartSdkOption","range":{"end":{"character":35,"line":125},"start":{"character":22,"line":125}},"returnType":"String"},"range":{"end":{"character":49,"line":125},"start":{"character":2,"line":124}}},{"codeRange":{"end":{"character":48,"line":126},"start":{"character":22,"line":126}},"element":{"kind":"FIELD","name":"dartSdkAliasOption","range":{"end":{"character":40,"line":126},"start":{"character":22,"line":126}},"returnType":"String"},"range":{"end":{"character":49,"line":126},"start":{"character":2,"line":126}}},{"codeRange":{"end":{"character":49,"line":129},"start":{"character":22,"line":129}},"element":{"kind":"FIELD","name":"cacheFolderOption","range":{"end":{"character":39,"line":129},"start":{"character":22,"line":129}},"returnType":"String"},"range":{"end":{"character":50,"line":129},"start":{"character":2,"line":128}}},{"codeRange":{"end":{"character":53,"line":133},"start":{"character":22,"line":133}},"element":{"kind":"FIELD","name":"packagesFileOption","range":{"end":{"character":40,"line":133},"start":{"character":22,"line":133}},"returnType":"String"},"range":{"end":{"character":54,"line":133},"start":{"character":2,"line":131}}},{"codeRange":{"end":{"character":77,"line":137},"start":{"character":22,"line":137}},"element":{"kind":"FIELD","name":"reportProtocolVersionOption","range":{"end":{"character":49,"line":137},"start":{"character":22,"line":137}},"returnType":"String"},"range":{"end":{"character":78,"line":137},"start":{"character":2,"line":135}}},{"codeRange":{"end":{"character":55,"line":140},"start":{"character":22,"line":140}},"element":{"kind":"FIELD","name":"serverProtocolOption","range":{"end":{"character":42,"line":140},"start":{"character":22,"line":140}},"returnType":"String"},"range":{"end":{"character":56,"line":140},"start":{"character":2,"line":139}}},{"codeRange":{"end":{"character":51,"line":141},"start":{"character":22,"line":141}},"element":{"kind":"FIELD","name":"protocolAnalyzer","range":{"end":{"character":38,"line":141},"start":{"character":22,"line":141}},"returnType":"String"},"range":{"end":{"character":52,"line":141},"start":{"character":2,"line":141}}},{"codeRange":{"end":{"character":41,"line":142},"start":{"character":22,"line":142}},"element":{"kind":"FIELD","name":"protocolLsp","range":{"end":{"character":33,"line":142},"start":{"character":22,"line":142}},"returnType":"String"},"range":{"end":{"character":42,"line":142},"start":{"character":2,"line":142}}},{"codeRange":{"end":{"character":40,"line":145},"start":{"character":22,"line":145}},"element":{"kind":"FIELD","name":"useLspFlag","range":{"end":{"character":32,"line":145},"start":{"character":22,"line":145}},"returnType":"String"},"range":{"end":{"character":41,"line":145},"start":{"character":2,"line":144}}},{"codeRange":{"end":{"character":54,"line":149},"start":{"character":22,"line":149}},"element":{"kind":"FIELD","name":"trainUsingOption","range":{"end":{"character":38,"line":149},"start":{"character":22,"line":149}},"returnType":"String"},"range":{"end":{"character":55,"line":149},"start":{"character":2,"line":147}}},{"codeRange":{"end":{"character":76,"line":152},"start":{"character":22,"line":152}},"element":{"kind":"FIELD","name":"disableFileByteStoreOption","range":{"end":{"character":48,"line":152},"start":{"character":22,"line":152}},"returnType":"String"},"range":{"end":{"character":77,"line":152},"start":{"character":2,"line":151}}},{"codeRange":{"end":{"character":75,"line":155},"start":{"character":22,"line":155}},"element":{"kind":"FIELD","name":"withFineDependenciesOption","range":{"end":{"character":48,"line":155},"start":{"character":22,"line":155}},"returnType":"String"},"range":{"end":{"character":76,"line":155},"start":{"character":2,"line":154}}},{"codeRange":{"end":{"character":44,"line":159},"start":{"character":35,"line":158}},"element":{"kind":"FIELD","name":"crashReportingAttachmentsBuilder","range":{"end":{"character":67,"line":158},"start":{"character":35,"line":158}},"returnType":"CrashReportingAttachmentsBuilder"},"range":{"end":{"character":45,"line":159},"start":{"character":2,"line":157}}},{"codeRange":{"end":{"character":58,"line":163},"start":{"character":31,"line":163}},"element":{"kind":"FIELD","name":"detachableFileSystemManager","range":{"end":{"character":58,"line":163},"start":{"character":31,"line":163}},"returnType":"DetachableFileSystemManager?"},"range":{"end":{"character":59,"line":163},"start":{"character":2,"line":161}}},{"codeRange":{"end":{"character":59,"line":166},"start":{"character":36,"line":166}},"element":{"kind":"FIELD","name":"_instrumentationService","range":{"end":{"character":59,"line":166},"start":{"character":36,"line":166}},"returnType":"InstrumentationService"},"range":{"end":{"character":60,"line":166},"start":{"character":2,"line":165}}},{"codeRange":{"end":{"character":41,"line":169},"start":{"character":27,"line":169}},"element":{"kind":"FIELD","name":"_sessionLogger","range":{"end":{"character":41,"line":169},"start":{"character":27,"line":169}},"returnType":"SessionLogger"},"range":{"end":{"character":42,"line":169},"start":{"character":2,"line":168}}},{"children":[{"codeRange":{"end":{"character":5,"line":266},"start":{"character":4,"line":257}},"element":{"kind":"FUNCTION","name":"shouldSendCallback","parameters":"()","range":{"end":{"character":27,"line":257},"start":{"character":9,"line":257}},"returnType":"bool"},"range":{"end":{"character":5,"line":266},"start":{"character":4,"line":257}}}],"codeRange":{"end":{"character":3,"line":414},"start":{"character":2,"line":176}},"element":{"kind":"METHOD","name":"start","parameters":"(List<String> arguments, {SendPort? sendPort, bool defaultToLsp = false})","range":{"end":{"character":12,"line":176},"start":{"character":7,"line":176}},"returnType":"void"},"range":{"end":{"character":3,"line":414},"start":{"character":2,"line":171}}},{"codeRange":{"end":{"character":3,"line":539},"start":{"character":2,"line":416}},"element":{"kind":"METHOD","name":"startAnalysisServer","parameters":"(ArgResults results, AnalysisServerOptions analysisServerOptions, ArgParser parser, DartSdkManager dartSdkManager, AnalyticsManager analyticsManager, CrashReportingAttachmentsBuilder crashReportingAttachmentsBuilder, InstrumentationService instrumentationService, SessionLogger sessionLogger, RequestStatisticsHelper requestStatistics, int? diagnosticServerPort, ErrorNotifier errorNotifier, SendPort? sendPort, PerformanceLogger? performanceLogger)","range":{"end":{"character":26,"line":416},"start":{"character":7,"line":416}},"returnType":"void"},"range":{"end":{"character":3,"line":539},"start":{"character":2,"line":416}}},{"codeRange":{"end":{"character":3,"line":590},"start":{"character":2,"line":541}},"element":{"kind":"METHOD","name":"startLspServer","parameters":"(ArgResults args, AnalysisServerOptions analysisServerOptions, DartSdkManager dartSdkManager, AnalyticsManager analyticsManager, InstrumentationService instrumentationService, SessionLogger sessionLogger, int? diagnosticServerPort, ErrorNotifier errorNotifier, PerformanceLogger? performanceLogger)","range":{"end":{"character":21,"line":541},"start":{"character":7,"line":541}},"returnType":"void"},"range":{"end":{"character":3,"line":590},"start":{"character":2,"line":541}}},{"children":[{"codeRange":{"end":{"character":5,"line":610},"start":{"character":4,"line":601}},"element":{"kind":"FUNCTION","name":"errorFunction","parameters":"(Zone self, ZoneDelegate parent, Zone zone, Object exception, StackTrace stackTrace)","range":{"end":{"character":22,"line":601},"start":{"character":9,"line":601}},"returnType":"void"},"range":{"end":{"character":5,"line":610},"start":{"character":4,"line":601}}}],"codeRange":{"end":{"character":3,"line":624},"start":{"character":2,"line":596}},"element":{"kind":"METHOD","name":"_captureExceptions","parameters":"(InstrumentationService service, void Function() callback, {void Function(String line)? print})","range":{"end":{"character":25,"line":596},"start":{"character":7,"line":596}},"returnType":"void"},"range":{"end":{"character":3,"line":624},"start":{"character":2,"line":592}}},{"codeRange":{"end":{"character":3,"line":653},"start":{"character":2,"line":627}},"element":{"kind":"METHOD","name":"_createAnalytics","parameters":"(DartSdk dartSdk, String dartSdkPath, DashTool tool)","range":{"end":{"character":28,"line":627},"start":{"character":12,"line":627}},"returnType":"Analytics"},"range":{"end":{"character":3,"line":653},"start":{"character":2,"line":626}}},{"codeRange":{"end":{"character":3,"line":661},"start":{"character":2,"line":655}},"element":{"kind":"METHOD","name":"_createDefaultSdk","parameters":"(String defaultSdkPath)","range":{"end":{"character":27,"line":655},"start":{"character":10,"line":655}},"returnType":"DartSdk"},"range":{"end":{"character":3,"line":661},"start":{"character":2,"line":655}}},{"codeRange":{"end":{"character":3,"line":668},"start":{"character":2,"line":664}},"element":{"kind":"METHOD","name":"_generateUuidString","parameters":"()","range":{"end":{"character":28,"line":664},"start":{"character":9,"line":664}},"returnType":"String"},"range":{"end":{"character":3,"line":668},"start":{"character":2,"line":663}}},{"codeRange":{"end":{"character":3,"line":719},"start":{"character":2,"line":674}},"element":{"kind":"METHOD","name":"_getArgumentsForAnalytics","parameters":"(ArgResults results)","range":{"end":{"character":40,"line":674},"start":{"character":15,"line":674}},"returnType":"List<String>"},"range":{"end":{"character":3,"line":719},"start":{"character":2,"line":670}}},{"children":[{"codeRange":{"end":{"character":5,"line":729},"start":{"character":4,"line":724}},"element":{"kind":"FUNCTION","name":"tryCandidateArgument","parameters":"(String argumentName)","range":{"end":{"character":29,"line":724},"start":{"character":9,"line":724}},"returnType":"void"},"range":{"end":{"character":5,"line":729},"start":{"character":4,"line":724}}}],"codeRange":{"end":{"character":3,"line":737},"start":{"character":2,"line":721}},"element":{"kind":"METHOD","name":"_getSdkPath","parameters":"(ArgResults args)","range":{"end":{"character":20,"line":721},"start":{"character":9,"line":721}},"returnType":"String"},"range":{"end":{"character":3,"line":737},"start":{"character":2,"line":721}}},{"codeRange":{"end":{"character":3,"line":745},"start":{"character":2,"line":740}},"element":{"kind":"METHOD","name":"_printUsage","parameters":"(ArgParser parser, {bool fromHelp = false})","range":{"end":{"character":18,"line":740},"start":{"character":7,"line":740}},"returnType":"void"},"range":{"end":{"character":3,"line":745},"start":{"character":2,"line":739}}},{"codeRange":{"end":{"character":3,"line":775},"start":{"character":2,"line":748}},"element":{"kind":"METHOD","name":"_readUuid","parameters":"(InstrumentationService service)","range":{"end":{"character":18,"line":748},"start":{"character":9,"line":748}},"returnType":"String"},"range":{"end":{"character":3,"line":775},"start":{"character":2,"line":747}}},{"codeRange":{"end":{"character":3,"line":1004},"start":{"character":2,"line":778}},"element":{"kind":"METHOD","name":"createArgParser","parameters":"({int? usageLineLength, bool includeHelpFlag = true, bool defaultToLsp = false})","range":{"end":{"character":34,"line":778},"start":{"character":19,"line":778}},"returnType":"ArgParser"},"range":{"end":{"character":3,"line":1004},"start":{"character":2,"line":777}}},{"codeRange":{"end":{"character":3,"line":1021},"start":{"character":2,"line":1011}},"element":{"kind":"METHOD","name":"_rollLogFiles","parameters":"(String path, int numOld)","range":{"end":{"character":27,"line":1011},"start":{"character":14,"line":1011}},"returnType":"void"},"range":{"end":{"character":3,"line":1021},"start":{"character":2,"line":1006}}}],"codeRange":{"end":{"character":1,"line":1022},"start":{"character":0,"line":51}},"element":{"kind":"CLASS","name":"Driver","range":{"end":{"character":12,"line":51},"start":{"character":6,"line":51}}},"range":{"end":{"character":1,"line":1022},"start":{"character":0,"line":48}}},{"children":[{"codeRange":{"end":{"character":36,"line":1026},"start":{"character":26,"line":1026}},"element":{"kind":"FIELD","name":"httpServer","range":{"end":{"character":36,"line":1026},"start":{"character":26,"line":1026}},"returnType":"HttpAnalysisServer"},"range":{"end":{"character":37,"line":1026},"start":{"character":2,"line":1026}}},{"codeRange":{"end":{"character":71,"line":1029},"start":{"character":2,"line":1029}},"element":{"kind":"METHOD","name":"getServerPort","parameters":"()","range":{"end":{"character":27,"line":1029},"start":{"character":14,"line":1029}},"returnType":"Future<int>"},"range":{"end":{"character":71,"line":1029},"start":{"character":2,"line":1028}}},{"codeRange":{"end":{"character":3,"line":1033},"start":{"character":2,"line":1031}},"element":{"kind":"METHOD","name":"startOnPort","parameters":"(int port)","range":{"end":{"character":26,"line":1031},"start":{"character":15,"line":1031}},"returnType":"Future<void>"},"range":{"end":{"character":3,"line":1033},"start":{"character":2,"line":1031}}}],"codeRange":{"end":{"character":1,"line":1034},"start":{"character":0,"line":1025}},"element":{"kind":"CLASS","name":"_DiagnosticServerImpl","range":{"end":{"character":27,"line":1025},"start":{"character":6,"line":1025}}},"range":{"end":{"character":1,"line":1034},"start":{"character":0,"line":1024}}}],"codeRange":{"end":{"character":0,"line":1035},"start":{"character":0,"line":0}},"element":{"kind":"COMPILATION_UNIT","name":"<unit>","range":{"end":{"character":0,"line":1035},"start":{"character":0,"line":0}}},"range":{"end":{"character":0,"line":1035},"start":{"character":0,"line":0}}},"uri":"{{workspaceFolder-0}}/lib/src/server/driver.dart"}}}
+{"time":1768243503912,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","id":2429,"method":"textDocument/inlayHint","params":{"textDocument":{"uri":"{{workspaceFolder-0}}/lib/starter.dart"},"range":{"start":{"line":0,"character":0},"end":{"line":35,"character":0}}},"clientRequestTime":1768243503910}}
 {"time":1768243503912,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","id":946,"result":null,"clientRequestTime":1768243503912}}
 {"time":1768243503912,"kind":"message","sender":"server","receiver":"ide","message":{"jsonrpc":"2.0","method":"$/progress","params":{"token":"ANALYZING","value":{"kind":"begin","title":"Analyzing…"}}}}
-{"time":1768243503915,"kind":"message","sender":"server","receiver":"ide","message":{"jsonrpc":"2.0","method":"dart/textDocument/publishClosingLabels","params":{"labels":[],"uri":"file://{{workspaceFolder-0}}/bin/server.dart"}}}
-{"time":1768243503915,"kind":"message","sender":"server","receiver":"ide","message":{"jsonrpc":"2.0","method":"dart/textDocument/publishOutline","params":{"outline":{"children":[{"codeRange":{"end":{"character":1,"line":10},"start":{"character":0,"line":7}},"element":{"kind":"FUNCTION","name":"main","parameters":"(List<String> args)","range":{"end":{"character":9,"line":7},"start":{"character":5,"line":7}},"returnType":"void"},"range":{"end":{"character":1,"line":10},"start":{"character":0,"line":6}}}],"codeRange":{"end":{"character":0,"line":11},"start":{"character":0,"line":0}},"element":{"kind":"COMPILATION_UNIT","name":"<unit>","range":{"end":{"character":0,"line":11},"start":{"character":0,"line":0}}},"range":{"end":{"character":0,"line":11},"start":{"character":0,"line":0}}},"uri":"file://{{workspaceFolder-0}}/bin/server.dart"}}}
-{"time":1768243503953,"kind":"message","sender":"server","receiver":"ide","message":{"jsonrpc":"2.0","method":"dart/textDocument/publishClosingLabels","params":{"labels":[],"uri":"file://{{workspaceFolder-0}}/lib/starter.dart"}}}
-{"time":1768243503953,"kind":"message","sender":"server","receiver":"ide","message":{"jsonrpc":"2.0","method":"dart/textDocument/publishOutline","params":{"outline":{"children":[{"children":[{"codeRange":{"end":{"character":36,"line":16},"start":{"character":2,"line":16}},"element":{"kind":"CONSTRUCTOR","name":"ServerStarter2","parameters":"()","range":{"end":{"character":24,"line":16},"start":{"character":10,"line":16}}},"range":{"end":{"character":36,"line":16},"start":{"character":2,"line":15}}},{"codeRange":{"end":{"character":4,"line":22},"start":{"character":2,"line":20}},"element":{"kind":"SETTER","name":"crashReportingAttachmentsBuilder","parameters":"(CrashReportingAttachmentsBuilder builder)","range":{"end":{"character":38,"line":20},"start":{"character":6,"line":20}},"returnType":""},"range":{"end":{"character":4,"line":22},"start":{"character":2,"line":18}}},{"codeRange":{"end":{"character":71,"line":26},"start":{"character":2,"line":26}},"element":{"kind":"SETTER","name":"detachableFileSystemManager","parameters":"(DetachableFileSystemManager manager)","range":{"end":{"character":33,"line":26},"start":{"character":6,"line":26}},"returnType":""},"range":{"end":{"character":71,"line":26},"start":{"character":2,"line":24}}},{"codeRange":{"end":{"character":5,"line":33},"start":{"character":2,"line":29}},"element":{"kind":"METHOD","name":"start","parameters":"(List<String> arguments, {SendPort sendPort, bool defaultToLsp = false})","range":{"end":{"character":12,"line":29},"start":{"character":7,"line":29}},"returnType":"void"},"range":{"end":{"character":5,"line":33},"start":{"character":2,"line":28}}}],"codeRange":{"end":{"character":1,"line":34},"start":{"character":0,"line":14}},"element":{"kind":"CLASS","name":"ServerStarter2","range":{"end":{"character":29,"line":14},"start":{"character":15,"line":14}}},"range":{"end":{"character":1,"line":34},"start":{"character":0,"line":10}}}],"codeRange":{"end":{"character":0,"line":35},"start":{"character":0,"line":0}},"element":{"kind":"COMPILATION_UNIT","name":"<unit>","range":{"end":{"character":0,"line":35},"start":{"character":0,"line":0}}},"range":{"end":{"character":0,"line":35},"start":{"character":0,"line":0}}},"uri":"file://{{workspaceFolder-0}}/lib/starter.dart"}}}
+{"time":1768243503915,"kind":"message","sender":"server","receiver":"ide","message":{"jsonrpc":"2.0","method":"dart/textDocument/publishClosingLabels","params":{"labels":[],"uri":"{{workspaceFolder-0}}/bin/server.dart"}}}
+{"time":1768243503915,"kind":"message","sender":"server","receiver":"ide","message":{"jsonrpc":"2.0","method":"dart/textDocument/publishOutline","params":{"outline":{"children":[{"codeRange":{"end":{"character":1,"line":10},"start":{"character":0,"line":7}},"element":{"kind":"FUNCTION","name":"main","parameters":"(List<String> args)","range":{"end":{"character":9,"line":7},"start":{"character":5,"line":7}},"returnType":"void"},"range":{"end":{"character":1,"line":10},"start":{"character":0,"line":6}}}],"codeRange":{"end":{"character":0,"line":11},"start":{"character":0,"line":0}},"element":{"kind":"COMPILATION_UNIT","name":"<unit>","range":{"end":{"character":0,"line":11},"start":{"character":0,"line":0}}},"range":{"end":{"character":0,"line":11},"start":{"character":0,"line":0}}},"uri":"{{workspaceFolder-0}}/bin/server.dart"}}}
+{"time":1768243503953,"kind":"message","sender":"server","receiver":"ide","message":{"jsonrpc":"2.0","method":"dart/textDocument/publishClosingLabels","params":{"labels":[],"uri":"{{workspaceFolder-0}}/lib/starter.dart"}}}
+{"time":1768243503953,"kind":"message","sender":"server","receiver":"ide","message":{"jsonrpc":"2.0","method":"dart/textDocument/publishOutline","params":{"outline":{"children":[{"children":[{"codeRange":{"end":{"character":36,"line":16},"start":{"character":2,"line":16}},"element":{"kind":"CONSTRUCTOR","name":"ServerStarter2","parameters":"()","range":{"end":{"character":24,"line":16},"start":{"character":10,"line":16}}},"range":{"end":{"character":36,"line":16},"start":{"character":2,"line":15}}},{"codeRange":{"end":{"character":4,"line":22},"start":{"character":2,"line":20}},"element":{"kind":"SETTER","name":"crashReportingAttachmentsBuilder","parameters":"(CrashReportingAttachmentsBuilder builder)","range":{"end":{"character":38,"line":20},"start":{"character":6,"line":20}},"returnType":""},"range":{"end":{"character":4,"line":22},"start":{"character":2,"line":18}}},{"codeRange":{"end":{"character":71,"line":26},"start":{"character":2,"line":26}},"element":{"kind":"SETTER","name":"detachableFileSystemManager","parameters":"(DetachableFileSystemManager manager)","range":{"end":{"character":33,"line":26},"start":{"character":6,"line":26}},"returnType":""},"range":{"end":{"character":71,"line":26},"start":{"character":2,"line":24}}},{"codeRange":{"end":{"character":5,"line":33},"start":{"character":2,"line":29}},"element":{"kind":"METHOD","name":"start","parameters":"(List<String> arguments, {SendPort sendPort, bool defaultToLsp = false})","range":{"end":{"character":12,"line":29},"start":{"character":7,"line":29}},"returnType":"void"},"range":{"end":{"character":5,"line":33},"start":{"character":2,"line":28}}}],"codeRange":{"end":{"character":1,"line":34},"start":{"character":0,"line":14}},"element":{"kind":"CLASS","name":"ServerStarter2","range":{"end":{"character":29,"line":14},"start":{"character":15,"line":14}}},"range":{"end":{"character":1,"line":34},"start":{"character":0,"line":10}}}],"codeRange":{"end":{"character":0,"line":35},"start":{"character":0,"line":0}},"element":{"kind":"COMPILATION_UNIT","name":"<unit>","range":{"end":{"character":0,"line":35},"start":{"character":0,"line":0}}},"range":{"end":{"character":0,"line":35},"start":{"character":0,"line":0}}},"uri":"{{workspaceFolder-0}}/lib/starter.dart"}}}
 {"time":1768243503953,"kind":"message","sender":"server","receiver":"ide","message":{"id":2429,"jsonrpc":"2.0","result":[{"kind":1,"label":[{"value":"void"}],"paddingRight":true,"position":{"character":6,"line":20}},{"kind":1,"label":[{"value":"void"}],"paddingRight":true,"position":{"character":6,"line":26}}]}}
-{"time":1768243504013,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","id":2430,"method":"textDocument/foldingRange","params":{"textDocument":{"uri":"file://{{workspaceFolder-0}}/lib/starter.dart"}},"clientRequestTime":1768243504011}}
+{"time":1768243504013,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","id":2430,"method":"textDocument/foldingRange","params":{"textDocument":{"uri":"{{workspaceFolder-0}}/lib/starter.dart"}},"clientRequestTime":1768243504011}}
 {"time":1768243504014,"kind":"message","sender":"server","receiver":"ide","message":{"id":2430,"jsonrpc":"2.0","result":[{"endLine":2,"kind":"comment","startLine":0},{"endLine":8,"kind":"imports","startLine":4},{"endLine":13,"kind":"comment","startLine":10},{"endLine":34,"startLine":14},{"endLine":19,"kind":"comment","startLine":18},{"endLine":22,"startLine":20},{"endLine":22,"startLine":21},{"endLine":25,"kind":"comment","startLine":24},{"endLine":33,"startLine":29},{"endLine":33,"startLine":30}]}}
-{"time":1768243504048,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","id":2431,"method":"textDocument/rangeFormatting","params":{"textDocument":{"uri":"file://{{workspaceFolder-0}}/lib/starter.dart"},"range":{"start":{"line":14,"character":0},"end":{"line":14,"character":31}},"options":{"tabSize":2,"insertSpaces":true}},"clientRequestTime":1768243504047}}
+{"time":1768243504048,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","id":2431,"method":"textDocument/rangeFormatting","params":{"textDocument":{"uri":"{{workspaceFolder-0}}/lib/starter.dart"},"range":{"start":{"line":14,"character":0},"end":{"line":14,"character":31}},"options":{"tabSize":2,"insertSpaces":true}},"clientRequestTime":1768243504047}}
 {"time":1768243504048,"kind":"message","sender":"server","receiver":"ide","message":{"id":2431,"jsonrpc":"2.0","result":null}}
-{"time":1768243504070,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","id":2432,"method":"textDocument/codeAction","params":{"textDocument":{"uri":"file://{{workspaceFolder-0}}/lib/starter.dart"},"range":{"start":{"line":14,"character":29},"end":{"line":14,"character":29}},"context":{"diagnostics":[],"triggerKind":2}},"clientRequestTime":1768243504068}}
-{"time":1768243504073,"kind":"message","sender":"server","receiver":"ide","message":{"id":2432,"jsonrpc":"2.0","result":[{"command":{"arguments":[{"path":"{{workspaceFolder-0}}/lib/starter.dart","autoTriggered":true}],"command":"dart.edit.sortMembers","title":"Sort Members"},"kind":"source.sortMembers","title":"Sort Members"},{"command":{"arguments":[{"path":"{{workspaceFolder-0}}/lib/starter.dart","autoTriggered":true}],"command":"dart.edit.organizeImports","title":"Organize Imports"},"kind":"source.organizeImports","title":"Organize Imports"},{"command":{"arguments":[{"path":"{{workspaceFolder-0}}/lib/starter.dart","autoTriggered":true}],"command":"dart.edit.fixAll","title":"Fix All"},"kind":"source.fixAll","title":"Fix All"},{"command":{"arguments":[{"filePath":"{{workspaceFolder-0}}/lib/starter.dart","selectionOffset":700,"selectionLength":0,"arguments":["file://{{workspaceFolder-0}}/lib/server_starter2.dart"]}],"command":"dart.refactor.move_top_level_to_file","title":"Move 'ServerStarter2' to file"},"data":{"parameters":[{"actionLabel":"Move","defaultValue":"file://{{workspaceFolder-0}}/lib/server_starter2.dart","filters":{"Dart":["dart"]},"kind":"saveUri","parameterLabel":"Move to:","parameterTitle":"Select a file to move to"}]},"kind":"refactor.move","title":"Move 'ServerStarter2' to file"}]}}
-{"time":1768243504110,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","id":2433,"method":"textDocument/semanticTokens/full","params":{"textDocument":{"uri":"file://{{workspaceFolder-0}}/lib/starter.dart"}},"clientRequestTime":1768243504108}}
+{"time":1768243504070,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","id":2432,"method":"textDocument/codeAction","params":{"textDocument":{"uri":"{{workspaceFolder-0}}/lib/starter.dart"},"range":{"start":{"line":14,"character":29},"end":{"line":14,"character":29}},"context":{"diagnostics":[],"triggerKind":2}},"clientRequestTime":1768243504068}}
+{"time":1768243504073,"kind":"message","sender":"server","receiver":"ide","message":{"id":2432,"jsonrpc":"2.0","result":[{"command":{"arguments":[{"path":"{{workspaceFolder-0:filePath}}/lib/starter.dart","autoTriggered":true}],"command":"dart.edit.sortMembers","title":"Sort Members"},"kind":"source.sortMembers","title":"Sort Members"},{"command":{"arguments":[{"path":"{{workspaceFolder-0:filePath}}/lib/starter.dart","autoTriggered":true}],"command":"dart.edit.organizeImports","title":"Organize Imports"},"kind":"source.organizeImports","title":"Organize Imports"},{"command":{"arguments":[{"path":"{{workspaceFolder-0:filePath}}/lib/starter.dart","autoTriggered":true}],"command":"dart.edit.fixAll","title":"Fix All"},"kind":"source.fixAll","title":"Fix All"},{"command":{"arguments":[{"filePath":"{{workspaceFolder-0:filePath}}/lib/starter.dart","selectionOffset":700,"selectionLength":0,"arguments":["{{workspaceFolder-0}}/lib/server_starter2.dart"]}],"command":"dart.refactor.move_top_level_to_file","title":"Move 'ServerStarter2' to file"},"data":{"parameters":[{"actionLabel":"Move","defaultValue":"{{workspaceFolder-0}}/lib/server_starter2.dart","filters":{"Dart":["dart"]},"kind":"saveUri","parameterLabel":"Move to:","parameterTitle":"Select a file to move to"}]},"kind":"refactor.move","title":"Move 'ServerStarter2' to file"}]}}
+{"time":1768243504110,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","id":2433,"method":"textDocument/semanticTokens/full","params":{"textDocument":{"uri":"{{workspaceFolder-0}}/lib/starter.dart"}},"clientRequestTime":1768243504108}}
 {"time":1768243504110,"kind":"message","sender":"server","receiver":"ide","message":{"id":2433,"jsonrpc":"2.0","result":{"data":[0,0,76,3,0,1,0,77,3,0,1,0,59,3,0,2,0,6,1,0,0,7,14,16,0,2,0,6,1,0,0,7,69,16,0,1,0,6,1,0,0,7,71,16,0,1,0,6,1,0,0,7,48,16,0,2,0,80,3,1,1,0,69,3,1,1,0,3,3,1,1,0,59,3,1,1,0,8,1,0,0,9,5,1,0,0,6,14,2,4,1,2,70,3,1,1,2,7,1,0,0,8,14,2,6,0,19,6,2,0,2,2,74,3,1,1,2,12,3,1,1,2,3,1,0,0,4,32,11,20,1,4,32,2,0,0,33,7,6,4,3,2,70,3,1,1,2,14,3,1,1,2,3,1,0,0,4,27,11,20,0,28,27,2,0,0,28,7,6,4,2,2,32,3,1,0,32,9,6,0,0,9,23,3,1,1,2,4,1,2048,0,5,5,4,20,1,4,4,2,0,0,5,6,2,0,0,8,9,6,4,1,4,8,2,0,0,9,8,6,4,1,4,4,2,0,0,5,12,6,4,0,15,5,14,0]}}}
-{"time":1768243504142,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","id":2434,"method":"textDocument/rangeFormatting","params":{"textDocument":{"uri":"file://{{workspaceFolder-0}}/lib/starter.dart"},"range":{"start":{"line":16,"character":0},"end":{"line":16,"character":36}},"options":{"tabSize":2,"insertSpaces":true}},"clientRequestTime":1768243504137}}
-{"time":1768243504142,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","id":2435,"method":"textDocument/rangeFormatting","params":{"textDocument":{"uri":"file://{{workspaceFolder-0}}/lib/src/server/driver.dart"},"range":{"start":{"line":51,"character":0},"end":{"line":51,"character":40}},"options":{"tabSize":2,"insertSpaces":true}},"clientRequestTime":1768243504142}}
+{"time":1768243504142,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","id":2434,"method":"textDocument/rangeFormatting","params":{"textDocument":{"uri":"{{workspaceFolder-0}}/lib/starter.dart"},"range":{"start":{"line":16,"character":0},"end":{"line":16,"character":36}},"options":{"tabSize":2,"insertSpaces":true}},"clientRequestTime":1768243504137}}
+{"time":1768243504142,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","id":2435,"method":"textDocument/rangeFormatting","params":{"textDocument":{"uri":"{{workspaceFolder-0}}/lib/src/server/driver.dart"},"range":{"start":{"line":51,"character":0},"end":{"line":51,"character":40}},"options":{"tabSize":2,"insertSpaces":true}},"clientRequestTime":1768243504142}}
 {"time":1768243504167,"kind":"message","sender":"server","receiver":"ide","message":{"id":2434,"jsonrpc":"2.0","result":null}}
-{"time":1768243504167,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","id":2436,"method":"textDocument/rangeFormatting","params":{"textDocument":{"uri":"file://{{workspaceFolder-0}}/bin/server.dart"},"range":{"start":{"line":8,"character":0},"end":{"line":8,"character":33}},"options":{"tabSize":2,"insertSpaces":true}},"clientRequestTime":1768243504148}}
+{"time":1768243504167,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","id":2436,"method":"textDocument/rangeFormatting","params":{"textDocument":{"uri":"{{workspaceFolder-0}}/bin/server.dart"},"range":{"start":{"line":8,"character":0},"end":{"line":8,"character":33}},"options":{"tabSize":2,"insertSpaces":true}},"clientRequestTime":1768243504148}}
 {"time":1768243504167,"kind":"message","sender":"server","receiver":"ide","message":{"id":2435,"jsonrpc":"2.0","result":null}}
 {"time":1768243504167,"kind":"message","sender":"server","receiver":"ide","message":{"id":2436,"jsonrpc":"2.0","result":null}}
-{"time":1768243504177,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","id":2437,"method":"textDocument/documentSymbol","params":{"textDocument":{"uri":"file://{{workspaceFolder-0}}/lib/starter.dart"}},"clientRequestTime":1768243504174}}
-{"time":1768243504177,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","id":2438,"method":"textDocument/documentSymbol","params":{"textDocument":{"uri":"file://{{workspaceFolder-0}}/lib/starter.dart"}},"clientRequestTime":1768243504174}}
+{"time":1768243504177,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","id":2437,"method":"textDocument/documentSymbol","params":{"textDocument":{"uri":"{{workspaceFolder-0}}/lib/starter.dart"}},"clientRequestTime":1768243504174}}
+{"time":1768243504177,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","id":2438,"method":"textDocument/documentSymbol","params":{"textDocument":{"uri":"{{workspaceFolder-0}}/lib/starter.dart"}},"clientRequestTime":1768243504174}}
 {"time":1768243504178,"kind":"message","sender":"server","receiver":"ide","message":{"id":2437,"jsonrpc":"2.0","result":[{"children":[{"deprecated":false,"detail":"()","kind":9,"name":"ServerStarter2","range":{"end":{"character":36,"line":16},"start":{"character":2,"line":16}},"selectionRange":{"end":{"character":24,"line":16},"start":{"character":10,"line":16}}},{"deprecated":false,"detail":"(CrashReportingAttachmentsBuilder builder)","kind":7,"name":"crashReportingAttachmentsBuilder","range":{"end":{"character":4,"line":22},"start":{"character":2,"line":20}},"selectionRange":{"end":{"character":38,"line":20},"start":{"character":6,"line":20}}},{"deprecated":false,"detail":"(DetachableFileSystemManager manager)","kind":7,"name":"detachableFileSystemManager","range":{"end":{"character":71,"line":26},"start":{"character":2,"line":26}},"selectionRange":{"end":{"character":33,"line":26},"start":{"character":6,"line":26}}},{"deprecated":false,"detail":"(List<String> arguments, {SendPort sendPort, bool defaultToLsp = false})","kind":6,"name":"start","range":{"end":{"character":5,"line":33},"start":{"character":2,"line":29}},"selectionRange":{"end":{"character":12,"line":29},"start":{"character":7,"line":29}}}],"deprecated":false,"kind":5,"name":"ServerStarter2","range":{"end":{"character":1,"line":34},"start":{"character":0,"line":14}},"selectionRange":{"end":{"character":29,"line":14},"start":{"character":15,"line":14}}}]}}
 {"time":1768243504178,"kind":"message","sender":"server","receiver":"ide","message":{"id":2438,"jsonrpc":"2.0","result":[{"children":[{"deprecated":false,"detail":"()","kind":9,"name":"ServerStarter2","range":{"end":{"character":36,"line":16},"start":{"character":2,"line":16}},"selectionRange":{"end":{"character":24,"line":16},"start":{"character":10,"line":16}}},{"deprecated":false,"detail":"(CrashReportingAttachmentsBuilder builder)","kind":7,"name":"crashReportingAttachmentsBuilder","range":{"end":{"character":4,"line":22},"start":{"character":2,"line":20}},"selectionRange":{"end":{"character":38,"line":20},"start":{"character":6,"line":20}}},{"deprecated":false,"detail":"(DetachableFileSystemManager manager)","kind":7,"name":"detachableFileSystemManager","range":{"end":{"character":71,"line":26},"start":{"character":2,"line":26}},"selectionRange":{"end":{"character":33,"line":26},"start":{"character":6,"line":26}}},{"deprecated":false,"detail":"(List<String> arguments, {SendPort sendPort, bool defaultToLsp = false})","kind":6,"name":"start","range":{"end":{"character":5,"line":33},"start":{"character":2,"line":29}},"selectionRange":{"end":{"character":12,"line":29},"start":{"character":7,"line":29}}}],"deprecated":false,"kind":5,"name":"ServerStarter2","range":{"end":{"character":1,"line":34},"start":{"character":0,"line":14}},"selectionRange":{"end":{"character":29,"line":14},"start":{"character":15,"line":14}}}]}}
-{"time":1768243504312,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","id":2439,"method":"textDocument/codeLens","params":{"textDocument":{"uri":"file://{{workspaceFolder-0}}/lib/starter.dart"}},"clientRequestTime":1768243504311}}
+{"time":1768243504312,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","id":2439,"method":"textDocument/codeLens","params":{"textDocument":{"uri":"{{workspaceFolder-0}}/lib/starter.dart"}},"clientRequestTime":1768243504311}}
 {"time":1768243504312,"kind":"message","sender":"server","receiver":"ide","message":{"id":2439,"jsonrpc":"2.0","result":[]}}
 {"time":1768243504359,"kind":"message","sender":"server","receiver":"ide","message":{"jsonrpc":"2.0","method":"$/progress","params":{"token":"ANALYZING","value":{"kind":"end"}}}}
-{"time":1768243504390,"kind":"message","sender":"watcher","receiver":"server","message":{"path":"{{workspaceFolder-0}}/lib/starter.dart","type":"modify"}}
-{"time":1768243504390,"kind":"message","sender":"watcher","receiver":"server","message":{"path":"{{workspaceFolder-0}}/lib/src/server/driver.dart","type":"modify"}}
+{"time":1768243504390,"kind":"message","sender":"watcher","receiver":"server","message":{"path":"{{workspaceFolder-0:filePath}}/lib/starter.dart","type":"modify"}}
+{"time":1768243504390,"kind":"message","sender":"watcher","receiver":"server","message":{"path":"{{workspaceFolder-0:filePath}}/lib/src/server/driver.dart","type":"modify"}}
 {"time":1768243504390,"kind":"message","sender":"server","receiver":"ide","message":{"id":947,"jsonrpc":"2.0","method":"window/workDoneProgress/create","params":{"token":"ANALYZING"}}}
-{"time":1768243504390,"kind":"message","sender":"watcher","receiver":"server","message":{"path":"{{workspaceFolder-0}}/lib/src/server/driver.dart","type":"modify"}}
-{"time":1768243504391,"kind":"message","sender":"watcher","receiver":"server","message":{"path":"{{workspaceFolder-0}}/lib/starter.dart","type":"modify"}}
-{"time":1768243504391,"kind":"message","sender":"watcher","receiver":"server","message":{"path":"{{workspaceFolder-0}}/bin/server.dart","type":"modify"}}
+{"time":1768243504390,"kind":"message","sender":"watcher","receiver":"server","message":{"path":"{{workspaceFolder-0:filePath}}/lib/src/server/driver.dart","type":"modify"}}
+{"time":1768243504391,"kind":"message","sender":"watcher","receiver":"server","message":{"path":"{{workspaceFolder-0:filePath}}/lib/starter.dart","type":"modify"}}
+{"time":1768243504391,"kind":"message","sender":"watcher","receiver":"server","message":{"path":"{{workspaceFolder-0:filePath}}/bin/server.dart","type":"modify"}}
 {"time":1768243504391,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","id":947,"result":null,"clientRequestTime":1768243504391}}
 {"time":1768243504391,"kind":"message","sender":"server","receiver":"ide","message":{"jsonrpc":"2.0","method":"$/progress","params":{"token":"ANALYZING","value":{"kind":"begin","title":"Analyzing…"}}}}
 {"time":1768243504391,"kind":"message","sender":"server","receiver":"ide","message":{"jsonrpc":"2.0","method":"$/progress","params":{"token":"ANALYZING","value":{"kind":"end"}}}}
-{"time":1768243504391,"kind":"message","sender":"watcher","receiver":"server","message":{"path":"{{workspaceFolder-0}}/bin/server.dart","type":"modify"}}
-{"time":1768243504394,"kind":"message","sender":"watcher","receiver":"server","message":{"path":"{{workspaceFolder-0}}/lib/starter.dart","type":"modify"}}
-{"time":1768243504394,"kind":"message","sender":"watcher","receiver":"server","message":{"path":"{{workspaceFolder-0}}/lib/src/server/driver.dart","type":"modify"}}
+{"time":1768243504391,"kind":"message","sender":"watcher","receiver":"server","message":{"path":"{{workspaceFolder-0:filePath}}/bin/server.dart","type":"modify"}}
+{"time":1768243504394,"kind":"message","sender":"watcher","receiver":"server","message":{"path":"{{workspaceFolder-0:filePath}}/lib/starter.dart","type":"modify"}}
+{"time":1768243504394,"kind":"message","sender":"watcher","receiver":"server","message":{"path":"{{workspaceFolder-0:filePath}}/lib/src/server/driver.dart","type":"modify"}}
 {"time":1768243504394,"kind":"message","sender":"server","receiver":"ide","message":{"id":948,"jsonrpc":"2.0","method":"window/workDoneProgress/create","params":{"token":"ANALYZING"}}}
 {"time":1768243504395,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","id":948,"result":null,"clientRequestTime":1768243504395}}
 {"time":1768243504395,"kind":"message","sender":"server","receiver":"ide","message":{"jsonrpc":"2.0","method":"$/progress","params":{"token":"ANALYZING","value":{"kind":"begin","title":"Analyzing…"}}}}
 {"time":1768243504395,"kind":"message","sender":"server","receiver":"ide","message":{"jsonrpc":"2.0","method":"$/progress","params":{"token":"ANALYZING","value":{"kind":"end"}}}}
-{"time":1768243504395,"kind":"message","sender":"watcher","receiver":"server","message":{"path":"{{workspaceFolder-0}}/bin/server.dart","type":"modify"}}
+{"time":1768243504395,"kind":"message","sender":"watcher","receiver":"server","message":{"path":"{{workspaceFolder-0:filePath}}/bin/server.dart","type":"modify"}}
 {"time":1768243504395,"kind":"message","sender":"server","receiver":"ide","message":{"id":949,"jsonrpc":"2.0","method":"window/workDoneProgress/create","params":{"token":"ANALYZING"}}}
 {"time":1768243504396,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","id":949,"result":null,"clientRequestTime":1768243504396}}
 {"time":1768243504396,"kind":"message","sender":"server","receiver":"ide","message":{"jsonrpc":"2.0","method":"$/progress","params":{"token":"ANALYZING","value":{"kind":"begin","title":"Analyzing…"}}}}
 {"time":1768243504396,"kind":"message","sender":"server","receiver":"ide","message":{"jsonrpc":"2.0","method":"$/progress","params":{"token":"ANALYZING","value":{"kind":"end"}}}}
-{"time":1768243504630,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","method":"textDocument/didClose","params":{"textDocument":{"uri":"file://{{workspaceFolder-0}}/lib/src/server/driver.dart"}},"clientRequestTime":1768243504630}}
+{"time":1768243504630,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","method":"textDocument/didClose","params":{"textDocument":{"uri":"{{workspaceFolder-0}}/lib/src/server/driver.dart"}},"clientRequestTime":1768243504630}}
 {"time":1768243504630,"kind":"message","sender":"server","receiver":"ide","message":{"id":950,"jsonrpc":"2.0","method":"window/workDoneProgress/create","params":{"token":"ANALYZING"}}}
 {"time":1768243504634,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","id":950,"result":null,"clientRequestTime":1768243504634}}
 {"time":1768243504634,"kind":"message","sender":"server","receiver":"ide","message":{"jsonrpc":"2.0","method":"$/progress","params":{"token":"ANALYZING","value":{"kind":"begin","title":"Analyzing…"}}}}
 {"time":1768243504634,"kind":"message","sender":"server","receiver":"ide","message":{"jsonrpc":"2.0","method":"$/progress","params":{"token":"ANALYZING","value":{"kind":"end"}}}}
-{"time":1768243504642,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","method":"textDocument/didClose","params":{"textDocument":{"uri":"file://{{workspaceFolder-0}}/bin/server.dart"}},"clientRequestTime":1768243504642}}
-{"time":1768243504642,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","id":2440,"method":"textDocument/inlayHint","params":{"textDocument":{"uri":"file://{{workspaceFolder-0}}/lib/starter.dart"},"range":{"start":{"line":0,"character":0},"end":{"line":35,"character":0}}},"clientRequestTime":1768243504642}}
+{"time":1768243504642,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","method":"textDocument/didClose","params":{"textDocument":{"uri":"{{workspaceFolder-0}}/bin/server.dart"}},"clientRequestTime":1768243504642}}
+{"time":1768243504642,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","id":2440,"method":"textDocument/inlayHint","params":{"textDocument":{"uri":"{{workspaceFolder-0}}/lib/starter.dart"},"range":{"start":{"line":0,"character":0},"end":{"line":35,"character":0}}},"clientRequestTime":1768243504642}}
 {"time":1768243504642,"kind":"message","sender":"server","receiver":"ide","message":{"id":951,"jsonrpc":"2.0","method":"window/workDoneProgress/create","params":{"token":"ANALYZING"}}}
-{"time":1768243504648,"kind":"message","sender":"server","receiver":"ide","message":{"jsonrpc":"2.0","method":"dart/textDocument/publishClosingLabels","params":{"labels":[],"uri":"file://{{workspaceFolder-0}}/lib/starter.dart"}}}
-{"time":1768243504648,"kind":"message","sender":"server","receiver":"ide","message":{"jsonrpc":"2.0","method":"dart/textDocument/publishOutline","params":{"outline":{"children":[{"children":[{"codeRange":{"end":{"character":36,"line":16},"start":{"character":2,"line":16}},"element":{"kind":"CONSTRUCTOR","name":"ServerStarter2","parameters":"()","range":{"end":{"character":24,"line":16},"start":{"character":10,"line":16}}},"range":{"end":{"character":36,"line":16},"start":{"character":2,"line":15}}},{"codeRange":{"end":{"character":4,"line":22},"start":{"character":2,"line":20}},"element":{"kind":"SETTER","name":"crashReportingAttachmentsBuilder","parameters":"(CrashReportingAttachmentsBuilder builder)","range":{"end":{"character":38,"line":20},"start":{"character":6,"line":20}},"returnType":""},"range":{"end":{"character":4,"line":22},"start":{"character":2,"line":18}}},{"codeRange":{"end":{"character":71,"line":26},"start":{"character":2,"line":26}},"element":{"kind":"SETTER","name":"detachableFileSystemManager","parameters":"(DetachableFileSystemManager manager)","range":{"end":{"character":33,"line":26},"start":{"character":6,"line":26}},"returnType":""},"range":{"end":{"character":71,"line":26},"start":{"character":2,"line":24}}},{"codeRange":{"end":{"character":5,"line":33},"start":{"character":2,"line":29}},"element":{"kind":"METHOD","name":"start","parameters":"(List<String> arguments, {SendPort sendPort, bool defaultToLsp = false})","range":{"end":{"character":12,"line":29},"start":{"character":7,"line":29}},"returnType":"void"},"range":{"end":{"character":5,"line":33},"start":{"character":2,"line":28}}}],"codeRange":{"end":{"character":1,"line":34},"start":{"character":0,"line":14}},"element":{"kind":"CLASS","name":"ServerStarter2","range":{"end":{"character":29,"line":14},"start":{"character":15,"line":14}}},"range":{"end":{"character":1,"line":34},"start":{"character":0,"line":10}}}],"codeRange":{"end":{"character":0,"line":35},"start":{"character":0,"line":0}},"element":{"kind":"COMPILATION_UNIT","name":"<unit>","range":{"end":{"character":0,"line":35},"start":{"character":0,"line":0}}},"range":{"end":{"character":0,"line":35},"start":{"character":0,"line":0}}},"uri":"file://{{workspaceFolder-0}}/lib/starter.dart"}}}
+{"time":1768243504648,"kind":"message","sender":"server","receiver":"ide","message":{"jsonrpc":"2.0","method":"dart/textDocument/publishClosingLabels","params":{"labels":[],"uri":"{{workspaceFolder-0}}/lib/starter.dart"}}}
+{"time":1768243504648,"kind":"message","sender":"server","receiver":"ide","message":{"jsonrpc":"2.0","method":"dart/textDocument/publishOutline","params":{"outline":{"children":[{"children":[{"codeRange":{"end":{"character":36,"line":16},"start":{"character":2,"line":16}},"element":{"kind":"CONSTRUCTOR","name":"ServerStarter2","parameters":"()","range":{"end":{"character":24,"line":16},"start":{"character":10,"line":16}}},"range":{"end":{"character":36,"line":16},"start":{"character":2,"line":15}}},{"codeRange":{"end":{"character":4,"line":22},"start":{"character":2,"line":20}},"element":{"kind":"SETTER","name":"crashReportingAttachmentsBuilder","parameters":"(CrashReportingAttachmentsBuilder builder)","range":{"end":{"character":38,"line":20},"start":{"character":6,"line":20}},"returnType":""},"range":{"end":{"character":4,"line":22},"start":{"character":2,"line":18}}},{"codeRange":{"end":{"character":71,"line":26},"start":{"character":2,"line":26}},"element":{"kind":"SETTER","name":"detachableFileSystemManager","parameters":"(DetachableFileSystemManager manager)","range":{"end":{"character":33,"line":26},"start":{"character":6,"line":26}},"returnType":""},"range":{"end":{"character":71,"line":26},"start":{"character":2,"line":24}}},{"codeRange":{"end":{"character":5,"line":33},"start":{"character":2,"line":29}},"element":{"kind":"METHOD","name":"start","parameters":"(List<String> arguments, {SendPort sendPort, bool defaultToLsp = false})","range":{"end":{"character":12,"line":29},"start":{"character":7,"line":29}},"returnType":"void"},"range":{"end":{"character":5,"line":33},"start":{"character":2,"line":28}}}],"codeRange":{"end":{"character":1,"line":34},"start":{"character":0,"line":14}},"element":{"kind":"CLASS","name":"ServerStarter2","range":{"end":{"character":29,"line":14},"start":{"character":15,"line":14}}},"range":{"end":{"character":1,"line":34},"start":{"character":0,"line":10}}}],"codeRange":{"end":{"character":0,"line":35},"start":{"character":0,"line":0}},"element":{"kind":"COMPILATION_UNIT","name":"<unit>","range":{"end":{"character":0,"line":35},"start":{"character":0,"line":0}}},"range":{"end":{"character":0,"line":35},"start":{"character":0,"line":0}}},"uri":"{{workspaceFolder-0}}/lib/starter.dart"}}}
 {"time":1768243504648,"kind":"message","sender":"server","receiver":"ide","message":{"id":2440,"jsonrpc":"2.0","result":[{"kind":1,"label":[{"value":"void"}],"paddingRight":true,"position":{"character":6,"line":20}},{"kind":1,"label":[{"value":"void"}],"paddingRight":true,"position":{"character":6,"line":26}}]}}
 {"time":1768243504649,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","id":951,"result":null,"clientRequestTime":1768243504649}}
 {"time":1768243504649,"kind":"message","sender":"server","receiver":"ide","message":{"jsonrpc":"2.0","method":"$/progress","params":{"token":"ANALYZING","value":{"kind":"begin","title":"Analyzing…"}}}}
 {"time":1768243504649,"kind":"message","sender":"server","receiver":"ide","message":{"jsonrpc":"2.0","method":"$/progress","params":{"token":"ANALYZING","value":{"kind":"end"}}}}
-{"time":1768243504805,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","id":2441,"method":"textDocument/documentLink","params":{"textDocument":{"uri":"file://{{workspaceFolder-0}}/lib/starter.dart"}},"clientRequestTime":1768243504805}}
-{"time":1768243504805,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","id":2442,"method":"textDocument/documentColor","params":{"textDocument":{"uri":"file://{{workspaceFolder-0}}/lib/starter.dart"}},"clientRequestTime":1768243504805}}
+{"time":1768243504805,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","id":2441,"method":"textDocument/documentLink","params":{"textDocument":{"uri":"{{workspaceFolder-0}}/lib/starter.dart"}},"clientRequestTime":1768243504805}}
+{"time":1768243504805,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","id":2442,"method":"textDocument/documentColor","params":{"textDocument":{"uri":"{{workspaceFolder-0}}/lib/starter.dart"}},"clientRequestTime":1768243504805}}
 {"time":1768243504805,"kind":"message","sender":"server","receiver":"ide","message":{"id":2442,"jsonrpc":"2.0","result":[]}}
 {"time":1768243504805,"kind":"message","sender":"server","receiver":"ide","message":{"id":2441,"jsonrpc":"2.0","result":[]}}
-{"time":1768243504973,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","id":2443,"method":"textDocument/codeLens","params":{"textDocument":{"uri":"file://{{workspaceFolder-0}}/lib/starter.dart"}},"clientRequestTime":1768243504973}}
+{"time":1768243504973,"kind":"message","sender":"ide","receiver":"server","message":{"jsonrpc":"2.0","id":2443,"method":"textDocument/codeLens","params":{"textDocument":{"uri":"{{workspaceFolder-0}}/lib/starter.dart"}},"clientRequestTime":1768243504973}}
 {"time":1768243504974,"kind":"message","sender":"server","receiver":"ide","message":{"id":2443,"jsonrpc":"2.0","result":[]}}
diff --git a/pkg/analysis_server/tool/performance/scenarios/run_saved_scenarios.dart b/pkg/analysis_server/tool/performance/scenarios/run_saved_scenarios.dart
index 0842eb5..f28aaa2 100644
--- a/pkg/analysis_server/tool/performance/scenarios/run_saved_scenarios.dart
+++ b/pkg/analysis_server/tool/performance/scenarios/run_saved_scenarios.dart
@@ -19,11 +19,13 @@
     return;
   }
   var scenarioNames = parsed.multiOption('scenario');
+  var timeout = Duration(seconds: int.parse(parsed.option('timeout')!));
+  var verbose = parsed.wasParsed('verbose');
   for (var scenario in scenarios) {
     if (scenarioNames.isNotEmpty && !scenarioNames.contains(scenario.name)) {
       continue;
     }
-    await scenario.run(Duration(seconds: int.parse(parsed.option('timeout')!)));
+    await scenario.run(timeout, verbose: verbose);
   }
 }
 
@@ -44,6 +46,7 @@
     help: 'Number of seconds to wait for analyzer responses',
     defaultsTo: '30',
   )
+  ..addFlag('verbose', abbr: 'v')
   ..addFlag('help');
 
 final logsRoot = analysisServerRoot.resolve(
diff --git a/pkg/analysis_server/tool/performance/scenarios/scenario.dart b/pkg/analysis_server/tool/performance/scenarios/scenario.dart
index a33750e..a6eda37 100644
--- a/pkg/analysis_server/tool/performance/scenarios/scenario.dart
+++ b/pkg/analysis_server/tool/performance/scenarios/scenario.dart
@@ -5,6 +5,7 @@
 import 'dart:async';
 import 'dart:io';
 
+import 'package:analysis_server/src/session_logger/log_normalizer.dart';
 import 'package:analyzer/file_system/file_system.dart';
 import 'package:cli_util/cli_util.dart';
 
@@ -28,10 +29,10 @@
 
   Scenario({required this.name, required this.logFile, required this.project});
 
-  Future<void> run(Duration timeout) async {
+  Future<void> run(Duration timeout, {bool verbose = false}) async {
     var watch = Stopwatch()..start();
     await runZoned(
-      () => _run(timeout),
+      () => _run(timeout, verbose: verbose),
       zoneSpecification: ZoneSpecification(
         print: (_, _, _, message) =>
             stdout.writeln('${watch.elapsed}: $message'),
@@ -39,7 +40,7 @@
     );
   }
 
-  Future<void> _run(Duration timeout) async {
+  Future<void> _run(Duration timeout, {bool verbose = false}) async {
     print('Initializing scenario for project: ${project.description}');
 
     print('Setting up project');
@@ -52,23 +53,29 @@
       exit(1);
     });
 
+    // Set up the normalizer that will be used to reverse the normalization.
+    var normalizer = LogNormalizer();
+    normalizer.addReplacementsForPath(sdkPath, 'dartSdkRoot');
+    // TODO(somebody): replace {{flutterSdkRoot}} with the flutter SDK path
+    for (var i = 0; i < workspace.workspaceDirectories.length; i++) {
+      normalizer.addReplacementsForPath(
+        workspace.workspaceDirectories.elementAt(i).path,
+        'workspaceFolder-$i',
+      );
+    }
+    for (var i = 0; i < workspace.contextRoots.length; i++) {
+      for (var package in workspace.contextRoots[i].packageConfig.packages) {
+        normalizer.addReplacementsForUri(
+          package.root,
+          'context-$i:package-root:${package.name}',
+        );
+      }
+    }
+
     print('Reading logs');
     Log? logs;
     try {
-      logs = Log.fromFile(logFile, {
-        for (var i = 0; i < workspace.workspaceDirectories.length; i++)
-          '{{workspaceFolder-$i}}': workspace.workspaceDirectories
-              .elementAt(i)
-              .path
-              .replaceAll(r'\', r'\\'),
-        '{{dartSdkRoot}}': sdkPath.replaceAll(r'\', r'\\'),
-        // TODO(somebody): replace {{flutterSdkRoot}} with the flutter SDK path
-        for (var i = 0; i < workspace.contextRoots.length; i++)
-          for (var package in workspace.contextRoots[i].packageConfig.packages)
-            '{{context-$i:package-root:${package.name}}}': package.root
-                .toString()
-                .replaceAll(r'\', r'\\'),
-      });
+      logs = Log.fromFile(logFile, normalizer.denormalize);
     } catch (e, s) {
       print('''
 Scenario failed with Error: $e
@@ -79,7 +86,7 @@
       exit(1);
     }
     print('Creating log player');
-    var logPlayer = LogPlayer(log: logs, timeout: timeout);
+    var logPlayer = LogPlayer(log: logs, timeout: timeout, verbose: verbose);
 
     print(
       'Scenario initialized with workpace dirs:\n'
diff --git a/pkg/analysis_server_plugin/api.txt b/pkg/analysis_server_plugin/api.txt
index f5b4f46..d6e86e2 100644
--- a/pkg/analysis_server_plugin/api.txt
+++ b/pkg/analysis_server_plugin/api.txt
@@ -161,7 +161,6 @@
   bool (referenced)
   int (referenced)
 package:_fe_analyzer_shared/src/base/errors.dart:
-  Diagnostic (referenced)
   DiagnosticCode (referenced)
 package:_fe_analyzer_shared/src/base/source_range.dart:
   SourceRange (referenced)
@@ -193,6 +192,8 @@
   TypeProvider (referenced)
 package:analyzer/dart/element/type_system.dart:
   TypeSystem (referenced)
+package:analyzer/diagnostic/diagnostic.dart:
+  Diagnostic (referenced)
 package:analyzer/instrumentation/service.dart:
   InstrumentationService (referenced)
 package:analyzer/src/dart/ast/ast.dart:
diff --git a/pkg/analyzer/api.txt b/pkg/analyzer/api.txt
index 8684514..068b220 100644
--- a/pkg/analyzer/api.txt
+++ b/pkg/analyzer/api.txt
@@ -977,6 +977,7 @@
     body (getter: FunctionBody)
     constKeyword (getter: Token?)
     declaredFragment (getter: ConstructorFragment?)
+    errorRange (getter: SourceRange)
     externalKeyword (getter: Token?)
     factoryKeyword (getter: Token?)
     initializers (getter: NodeList<ConstructorInitializer>)
@@ -1554,6 +1555,7 @@
     constKeyword (getter: Token?)
     constructorName (getter: PrimaryConstructorName?)
     declaredFragment (getter: ConstructorFragment?)
+    errorRange (getter: SourceRange)
     formalParameters (getter: FormalParameterList)
   PrimaryConstructorName (class extends Object implements AstNode, abstract, final):
     name (getter: Token)
diff --git a/pkg/analyzer/lib/diagnostic/diagnostic.dart b/pkg/analyzer/lib/diagnostic/diagnostic.dart
index 4e9fc92..4c1b8b8 100644
--- a/pkg/analyzer/lib/diagnostic/diagnostic.dart
+++ b/pkg/analyzer/lib/diagnostic/diagnostic.dart
@@ -2,6 +2,178 @@
 // 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.
 
-export 'package:_fe_analyzer_shared/src/base/diagnostic_message.dart'
-    show DiagnosticMessage, Severity;
-export 'package:_fe_analyzer_shared/src/base/errors.dart' show Diagnostic;
+import 'package:_fe_analyzer_shared/src/base/errors.dart';
+import 'package:analyzer/source/source.dart';
+import 'package:analyzer/src/diagnostic/diagnostic.dart'
+    show DiagnosticMessage, DiagnosticMessageImpl;
+
+export 'package:analyzer/src/diagnostic/diagnostic.dart' show DiagnosticMessage;
+
+/// A diagnostic, as defined by the [Diagnostic Design Guidelines][guidelines]:
+///
+/// > An indication of a specific problem at a specific location within the
+/// > source code being processed by a development tool.
+///
+/// Clients may not extend, implement or mix-in this class.
+///
+/// [guidelines]: https://github.com/dart-lang/sdk/blob/main/pkg/analyzer/doc/implementation/diagnostics.md
+class Diagnostic {
+  /// The diagnostic code associated with the diagnostic.
+  final DiagnosticCode diagnosticCode;
+
+  /// A list of messages that provide context for understanding the problem
+  /// being reported. The list will be empty if there are no such messages.
+  final List<DiagnosticMessage> contextMessages;
+
+  /// A description of how to fix the problem, or `null` if there is no such
+  /// description.
+  final String? correctionMessage;
+
+  /// A message describing what is wrong and why.
+  final DiagnosticMessage problemMessage;
+
+  /// The source in which the diagnostic occurred, or `null` if unknown.
+  final Source source;
+
+  Diagnostic.forValues({
+    required this.source,
+    required int offset,
+    required int length,
+    required this.diagnosticCode,
+    required String message,
+    this.correctionMessage,
+    this.contextMessages = const [],
+  }) : problemMessage = DiagnosticMessageImpl(
+         filePath: source.fullName,
+         length: length,
+         message: message,
+         offset: offset,
+         url: null,
+       );
+
+  /// Initialize a newly created diagnostic.
+  ///
+  /// The diagnostic is associated with the given [source] and is located at the
+  /// given [offset] with the given [length]. The diagnostic will have the given
+  /// [diagnosticCode] and the list of [arguments] will be used to complete the
+  /// message and correction. If any [contextMessages] are provided, they will
+  /// be recorded with the diagnostic.
+  factory Diagnostic.tmp({
+    required Source source,
+    required int offset,
+    required int length,
+    required DiagnosticCode diagnosticCode,
+    List<Object?> arguments = const [],
+    List<DiagnosticMessage> contextMessages = const [],
+  }) {
+    assert(
+      arguments.length == diagnosticCode.numParameters,
+      'Message $diagnosticCode requires ${diagnosticCode.numParameters} '
+      'argument${diagnosticCode.numParameters == 1 ? '' : 's'}, but '
+      '${arguments.length} '
+      'argument${arguments.length == 1 ? ' was' : 's were'} '
+      'provided',
+    );
+    String message = formatList(diagnosticCode.problemMessage, arguments);
+    String? correctionTemplate = diagnosticCode.correctionMessage;
+    String? correctionMessage;
+    if (correctionTemplate != null) {
+      correctionMessage = formatList(correctionTemplate, arguments);
+    }
+
+    return Diagnostic.forValues(
+      source: source,
+      offset: offset,
+      length: length,
+      diagnosticCode: diagnosticCode,
+      message: message,
+      correctionMessage: correctionMessage,
+      contextMessages: contextMessages,
+    );
+  }
+
+  /// The template used to create the correction to be displayed for this
+  /// diagnostic, or `null` if there is no correction information for this
+  /// error. The correction should indicate how the user can fix the error.
+  @Deprecated("Use 'correctionMessage' instead.")
+  String? get correction => correctionMessage;
+
+  @Deprecated("Use 'diagnosticCode' instead")
+  DiagnosticCode get errorCode => diagnosticCode;
+
+  @override
+  int get hashCode {
+    int hashCode = offset;
+    hashCode ^= message.hashCode;
+    hashCode ^= source.hashCode;
+    return hashCode;
+  }
+
+  /// The number of characters from the offset to the end of the source which
+  /// encompasses the compilation error.
+  int get length => problemMessage.length;
+
+  /// The message to be displayed for this diagnostic.
+  ///
+  /// The message indicates what is wrong and why it is wrong.
+  String get message => problemMessage.messageText(includeUrl: true);
+
+  /// The character offset from the beginning of the source (zero based) where
+  /// the diagnostic occurred.
+  int get offset => problemMessage.offset;
+
+  Severity get severity {
+    switch (diagnosticCode.severity) {
+      case DiagnosticSeverity.ERROR:
+        return Severity.error;
+      case DiagnosticSeverity.WARNING:
+        return Severity.warning;
+      case DiagnosticSeverity.INFO:
+        return Severity.info;
+      default:
+        throw StateError('Invalid severity: ${diagnosticCode.severity}');
+    }
+  }
+
+  @override
+  bool operator ==(Object other) {
+    if (identical(other, this)) {
+      return true;
+    }
+    // prepare the other Diagnostic.
+    if (other is Diagnostic) {
+      // Quick checks.
+      if (!identical(diagnosticCode, other.diagnosticCode)) {
+        return false;
+      }
+      if (offset != other.offset || length != other.length) {
+        return false;
+      }
+      // Deep checks.
+      if (message != other.message) {
+        return false;
+      }
+      if (source != other.source) {
+        return false;
+      }
+      return true;
+    }
+    return false;
+  }
+
+  @override
+  String toString() {
+    StringBuffer buffer = StringBuffer();
+    buffer.write(source.fullName);
+    buffer.write("(");
+    buffer.write(offset);
+    buffer.write("..");
+    buffer.write(offset + length - 1);
+    buffer.write("): ");
+    buffer.write(message);
+    return buffer.toString();
+  }
+}
+
+/// An indication of the severity of a [Diagnostic].
+enum Severity { error, warning, info }
diff --git a/pkg/analyzer/lib/error/error.dart b/pkg/analyzer/lib/error/error.dart
index 9433fb0..6fb2866 100644
--- a/pkg/analyzer/lib/error/error.dart
+++ b/pkg/analyzer/lib/error/error.dart
@@ -8,6 +8,7 @@
 import 'dart:collection';
 
 import 'package:_fe_analyzer_shared/src/base/errors.dart';
+import 'package:analyzer/diagnostic/diagnostic.dart';
 import 'package:analyzer/src/diagnostic/diagnostic_code_values.dart';
 
 export 'package:_fe_analyzer_shared/src/base/errors.dart'
diff --git a/pkg/analyzer/lib/error/listener.dart b/pkg/analyzer/lib/error/listener.dart
index 6473718..586f3a8 100644
--- a/pkg/analyzer/lib/error/listener.dart
+++ b/pkg/analyzer/lib/error/listener.dart
@@ -2,7 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:_fe_analyzer_shared/src/base/errors.dart';
 import 'package:analyzer/diagnostic/diagnostic.dart';
 import 'package:analyzer/src/error/listener.dart';
 
diff --git a/pkg/analyzer/lib/src/dart/analysis/driver.dart b/pkg/analyzer/lib/src/dart/analysis/driver.dart
index 59c337f..bf64b03 100644
--- a/pkg/analyzer/lib/src/dart/analysis/driver.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/driver.dart
@@ -39,7 +39,8 @@
 import 'package:analyzer/src/dart/element/element.dart';
 import 'package:analyzer/src/dart/resolver/flow_analysis_visitor.dart';
 import 'package:analyzer/src/dartdoc/dartdoc_directive_info.dart';
-import 'package:analyzer/src/diagnostic/diagnostic_message.dart';
+import 'package:analyzer/src/diagnostic/diagnostic.dart'
+    show DiagnosticMessageImpl;
 import 'package:analyzer/src/exception/exception.dart';
 import 'package:analyzer/src/fine/manifest_id.dart';
 import 'package:analyzer/src/fine/requirements.dart';
@@ -108,7 +109,7 @@
 // TODO(scheglov): Clean up the list of implicitly analyzed files.
 class AnalysisDriver {
   /// The version of data format, should be incremented on every format change.
-  static const int DATA_VERSION = 631;
+  static const int DATA_VERSION = 632;
 
   /// The number of exception contexts allowed to write. Once this field is
   /// zero, we stop writing any new exception contexts in this process.
@@ -2114,9 +2115,9 @@
     var ownedFiles = this.ownedFiles;
     if (ownedFiles != null) {
       if (addedFiles.contains(file.path)) {
-        ownedFiles.addAdded(file.uri, this);
+        ownedFiles.addAdded(file.resource, this);
       } else {
-        ownedFiles.addKnown(file.uri, this);
+        ownedFiles.addKnown(file.resource, this);
       }
     }
   }
@@ -3003,25 +3004,42 @@
 
 /// Container that keeps track of file owners.
 class OwnedFiles {
-  /// Key: the absolute file URI.
+  /// Key: the file from the collection's resource provider.
   /// Value: the driver to which the file is added.
-  final Map<Uri, AnalysisDriver> addedFiles = {};
+  final Map<File, AnalysisDriver> addedFiles = {};
 
-  /// Key: the absolute file URI.
+  /// Key: the file from the collection's resource provider.
   /// Value: a driver in which this file is available via dependencies.
   /// This map does not contain any files that are in [addedFiles].
-  final Map<Uri, AnalysisDriver> knownFiles = {};
+  final Map<File, AnalysisDriver> knownFiles = {};
 
-  void addAdded(Uri uri, AnalysisDriver analysisDriver) {
-    addedFiles[uri] ??= analysisDriver;
-    knownFiles.remove(uri);
+  void addAdded(File file, AnalysisDriver analysisDriver) {
+    addedFiles[file] ??= analysisDriver;
+    knownFiles.remove(file);
   }
 
-  void addKnown(Uri uri, AnalysisDriver analysisDriver) {
-    if (!addedFiles.containsKey(uri)) {
-      knownFiles[uri] = analysisDriver;
+  void addKnown(File file, AnalysisDriver analysisDriver) {
+    if (!addedFiles.containsKey(file)) {
+      knownFiles[file] ??= analysisDriver;
     }
   }
+
+  /// Return the files owned by [analysisDriver].
+  ///
+  /// The maps are intentionally append-only hints; each yielded result is
+  /// resolved through the current owner driver so stale entries are ignored.
+  List<FileState> filesFor(AnalysisDriver analysisDriver) {
+    return [
+      for (var map in [addedFiles, knownFiles])
+        for (var entry in map.entries)
+          if (identical(entry.value, analysisDriver))
+            ?analysisDriver.fsState.getExisting(entry.key),
+    ];
+  }
+
+  AnalysisDriver? ownerOf(File file) {
+    return addedFiles[file] ?? knownFiles[file];
+  }
 }
 
 /// Worker in [AnalysisDriverScheduler].
diff --git a/pkg/analyzer/lib/src/dart/analysis/index.dart b/pkg/analyzer/lib/src/dart/analysis/index.dart
index 0e59cef..3e5ec31 100644
--- a/pkg/analyzer/lib/src/dart/analysis/index.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/index.dart
@@ -6,6 +6,9 @@
 import 'package:analyzer/dart/ast/token.dart';
 import 'package:analyzer/dart/ast/visitor.dart';
 import 'package:analyzer/dart/element/element.dart';
+import 'package:analyzer/file_system/file_system.dart';
+import 'package:analyzer/source/file_source.dart';
+import 'package:analyzer/source/source.dart';
 import 'package:analyzer/src/dart/ast/ast.dart';
 import 'package:analyzer/src/dart/ast/extensions.dart';
 import 'package:analyzer/src/dart/element/element.dart';
@@ -219,14 +222,14 @@
   /// The fields [unitLibraryUris] and [unitUnitUris] are used together to
   /// describe each unique [LibraryFragmentImpl].
   ///
-  /// This field contains the library URI of a unit.
+  /// This field contains the path of the library file for a unit.
   final List<_StringInfo> unitLibraryUris = [];
 
   /// The fields [unitLibraryUris] and [unitUnitUris] are used together to
   /// describe each unique [LibraryFragmentImpl].
   ///
-  /// This field contains the unit URI of a unit, which might be the same as
-  /// the library URI for the defining unit, or a different one for a part.
+  /// This field contains the path of a unit, which might be the same as the
+  /// library path for the defining unit, or a different one for a part.
   final List<_StringInfo> unitUnitUris = [];
 
   /// Map associating strings with their [_StringInfo]s.
@@ -450,6 +453,13 @@
     });
   }
 
+  /// Return the unique [_StringInfo] corresponding to [source].  The field
+  /// [_StringInfo.id] is filled by [assemble] during final sorting.
+  _StringInfo _getSourceInfo(Source source) {
+    var filePath = source.mustBeFile.path;
+    return _getStringInfo(filePath);
+  }
+
   /// Return the unique [_StringInfo] corresponding the given [string].  The
   /// field [_StringInfo.id] is filled by [assemble] during final sorting.
   _StringInfo _getStringInfo(String? string) {
@@ -469,19 +479,14 @@
     return unitMap.putIfAbsent(libraryFragment, () {
       assert(unitLibraryUris.length == unitUnitUris.length);
       int id = unitUnitUris.length;
-      unitLibraryUris.add(_getUriInfo(libraryFragment.library.uri));
-      unitUnitUris.add(_getUriInfo(libraryFragment.source.uri));
+      unitLibraryUris.add(
+        _getSourceInfo(libraryFragment.element.firstFragment.source),
+      );
+      unitUnitUris.add(_getSourceInfo(libraryFragment.source));
       return id;
     });
   }
 
-  /// Return the unique [_StringInfo] corresponding [uri].  The field
-  /// [_StringInfo.id] is filled by [assemble] during final sorting.
-  _StringInfo _getUriInfo(Uri uri) {
-    String str = uri.toString();
-    return _getStringInfo(str);
-  }
-
   /// Return a new [_ElementInfo] for the given [element] in the given [unitId].
   /// This method is static, so it cannot add any information to the index.
   _ElementInfo _newElementInfo(int unitId, Element element) {
@@ -1234,16 +1239,20 @@
     List<String> members = [];
 
     String getInterfaceElementId(InterfaceElement element) {
-      var libraryUri = element.library.uri;
+      var libraryFile = element.library.firstFragment.source.mustBeFile;
+      var libraryPath = libraryFile.path;
+
       var libraryFragment = element.firstFragment.libraryFragment;
-      var libraryFragmentUri = libraryFragment.source.uri;
-      return '$libraryUri;$libraryFragmentUri;${element.name}';
+      var libraryFragmentFile = libraryFragment.source.mustBeFile;
+      var libraryFragmentPath = libraryFragmentFile.path;
+
+      return '$libraryPath;$libraryFragmentPath;${element.name}';
     }
 
     void addSupertype(NamedType? type) {
       var element = type?.element;
       if (element is InterfaceElement) {
-        String id = getInterfaceElementId(element);
+        var id = getInterfaceElementId(element);
         supertypes.add(id);
       }
     }
@@ -1429,8 +1438,8 @@
 
 extension AnalysisDriverUnitIndexExtension on AnalysisDriverUnitIndex {
   int getLibraryFragmentId(LibraryFragmentImpl fragment) {
-    var libraryUriId = getUriId(fragment.element.uri);
-    var unitUriId = getUriId(fragment.source.uri);
+    var libraryUriId = getSourceId(fragment.element.firstFragment.source);
+    var unitUriId = getSourceId(fragment.source);
     for (var i = 0; i < unitLibraryUris.length; i++) {
       if (unitLibraryUris[i] == libraryUriId && unitUnitUris[i] == unitUriId) {
         return i;
@@ -1439,6 +1448,12 @@
     return -1;
   }
 
+  /// Returns the identifier of [source], or `-1` if not used.
+  int getSourceId(Source source) {
+    var filePath = source.mustBeFile.path;
+    return getStringId(filePath);
+  }
+
   /// Returns the identifier of [str], or `-1` if not used.
   int getStringId(String? str) {
     if (str == null) {
@@ -1447,10 +1462,15 @@
 
     return binarySearch(strings, str);
   }
+}
 
-  /// Returns the identifier of the [uri], or `-1` if not used.
-  int getUriId(Uri uri) {
-    var str = uri.toString();
-    return getStringId(str);
+extension _SourceExtension on Source {
+  /// Returns the [File] for this source.
+  ///
+  /// This assumes that the source is a [FileSource], which is safe because
+  /// index and search are only supported in DAS, where all sources are file
+  /// based.
+  File get mustBeFile {
+    return (this as FileSource).file;
   }
 }
diff --git a/pkg/analyzer/lib/src/dart/analysis/library_analyzer.dart b/pkg/analyzer/lib/src/dart/analysis/library_analyzer.dart
index ed55539..606594f 100644
--- a/pkg/analyzer/lib/src/dart/analysis/library_analyzer.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/library_analyzer.dart
@@ -179,7 +179,6 @@
       parsedUnit.accept(
         ElementBindingVisitor.forAnalysis(
           fragment: libraryFragment,
-          reporter: DiagnosticReporter(diagnosticListener, file.source),
           walker: elementWalker,
         ),
       );
@@ -825,7 +824,6 @@
     unit.accept(
       ElementBindingVisitor.forAnalysis(
         fragment: libraryFragment,
-        reporter: fileAnalysis.diagnosticReporter,
         walker: elementWalker,
       ),
     );
diff --git a/pkg/analyzer/lib/src/dart/analysis/search.dart b/pkg/analyzer/lib/src/dart/analysis/search.dart
index c7910ba..badf308 100644
--- a/pkg/analyzer/lib/src/dart/analysis/search.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/search.dart
@@ -7,7 +7,10 @@
 import 'package:analyzer/dart/ast/token.dart';
 import 'package:analyzer/dart/ast/visitor.dart';
 import 'package:analyzer/dart/element/element.dart';
+import 'package:analyzer/file_system/file_system.dart';
+import 'package:analyzer/source/file_source.dart';
 import 'package:analyzer/source/line_info.dart';
+import 'package:analyzer/source/source.dart';
 import 'package:analyzer/source/source_range.dart';
 import 'package:analyzer/src/dart/analysis/driver.dart';
 import 'package:analyzer/src/dart/analysis/file_state.dart';
@@ -20,6 +23,7 @@
 import 'package:analyzer/src/util/performance/operation_performance.dart';
 import 'package:analyzer/src/utilities/cancellation.dart';
 import 'package:analyzer/src/utilities/extensions/collection.dart';
+import 'package:analyzer/src/utilities/extensions/object.dart';
 import 'package:analyzer/src/utilities/fuzzy_matcher.dart';
 import 'package:collection/collection.dart';
 
@@ -337,10 +341,7 @@
   Search(this._driver);
 
   /// Returns class or mixin members with the given [name].
-  Future<List<Element>> classMembers(
-    String name,
-    SearchedFiles searchedFiles,
-  ) async {
+  Future<List<Element>> classMembers(String name) async {
     var elements = <Element>[];
 
     void addElement(Element element) {
@@ -360,17 +361,24 @@
       element.methods.forEach(addElement);
     }
 
-    var files = await _driver.getFilesDefiningClassMemberName(name);
-    for (var file in files) {
-      if (searchedFiles.add(file.path, this)) {
-        var libraryResult = await _driver.getLibraryByUri(file.uriStr);
-        if (libraryResult is LibraryElementResultImpl) {
-          var element = libraryResult.element;
-          element.classes.forEach(addElements);
-          element.enums.forEach(addElements);
-          element.extensionTypes.forEach(addElements);
-          element.mixins.forEach(addElements);
-        }
+    var checkedLibraries = <FileState>{};
+    for (var file in _filesForSearch()) {
+      if (!file.definedClassMemberNames.contains(name)) {
+        continue;
+      }
+
+      var libraryFile = file.kind.library?.file;
+      if (libraryFile == null || !checkedLibraries.add(libraryFile)) {
+        continue;
+      }
+
+      var libraryResult = await _driver.getLibraryByUri(libraryFile.uriStr);
+      if (libraryResult is LibraryElementResultImpl) {
+        var element = libraryResult.element;
+        element.classes.forEach(addElements);
+        element.enums.forEach(addElements);
+        element.extensionTypes.forEach(addElements);
+        element.mixins.forEach(addElements);
       }
     }
     return elements;
@@ -399,10 +407,7 @@
   }
 
   /// Returns references to the [element].
-  Future<List<SearchResult>> references(
-    Element? element,
-    SearchedFiles searchedFiles,
-  ) async {
+  Future<List<SearchResult>> references(Element? element) async {
     if (element == null) {
       return const <SearchResult>[];
     }
@@ -412,19 +417,19 @@
         element is InterfaceElement ||
         element is SetterElement ||
         element is TypeAliasElement) {
-      return _searchReferences(element, searchedFiles);
+      return _searchReferences(element);
     } else if (element is ConstructorElement) {
-      return await _searchReferences_Constructor(element, searchedFiles);
+      return await _searchReferences_Constructor(element);
     } else if (element is GetterElement) {
-      return _searchReferences_Getter(element, searchedFiles);
+      return _searchReferences_Getter(element);
     } else if (element is PropertyInducingElement) {
-      return _searchReferences_Field(element, searchedFiles);
+      return _searchReferences_Field(element);
     } else if (element is LocalFunctionElement) {
-      return _searchReferences_Local(element, (n) => n is Block, searchedFiles);
+      return _searchReferences_Local(element, (n) => n is Block);
     } else if (element is ExecutableElement) {
-      return _searchReferences_Function(element, searchedFiles);
+      return _searchReferences_Function(element);
     } else if (element is PatternVariableElementImpl) {
-      return _searchReferences_PatternVariable(element, searchedFiles);
+      return _searchReferences_PatternVariable(element);
     } else if (kind == ElementKind.LABEL ||
         kind == ElementKind.LOCAL_VARIABLE) {
       return _searchReferences_Local(
@@ -436,19 +441,17 @@
             n is TopLevelVariableDeclaration ||
             n is SwitchExpression ||
             n.parent is CompilationUnit,
-        searchedFiles,
       );
     } else if (element is LibraryElementImpl) {
-      return _searchReferences_Library(element, searchedFiles);
+      return _searchReferences_Library(element);
     } else if (element is FormalParameterElement) {
-      return _searchReferences_Parameter(element, searchedFiles);
+      return _searchReferences_Parameter(element);
     } else if (element is PrefixElementImpl) {
-      return _searchReferences_Prefix(element, searchedFiles);
+      return _searchReferences_Prefix(element);
     } else if (element is TypeParameterElement) {
       return _searchReferences_Local(
         element,
         (n) => n.parent is CompilationUnit,
-        searchedFiles,
       );
     }
     return const <SearchResult>[];
@@ -470,10 +473,9 @@
 
   Future<List<LibraryFragmentSearchMatch>> referencesLibraryImport(
     LibraryImport import,
-    SearchedFiles searchedFiles,
   ) async {
     import as LibraryImportImpl;
-    var legacyResults = await _searchReferences_Import(import, searchedFiles);
+    var legacyResults = await _searchReferences_Import(import);
 
     return legacyResults.map((match) {
       return LibraryFragmentSearchMatch(
@@ -484,20 +486,12 @@
   }
 
   /// Returns subtypes of the given [type].
-  ///
-  /// The [searchedFiles] are consulted to see if a file is "owned" by this
-  /// [Search] object, so should be only searched by it to avoid duplicate
-  /// results; and updated to take ownership if the file is not owned yet.
-  Future<List<SearchResult>> subTypes(
-    InterfaceElement? type,
-    SearchedFiles searchedFiles, {
-    List<FileState>? filesToCheck,
-  }) async {
+  Future<List<SearchResult>> subTypes(InterfaceElement? type) async {
     if (type == null) {
       return const <SearchResult>[];
     }
     List<SearchResult> results = <SearchResult>[];
-    await _addResults(results, type, searchedFiles, const {
+    await _addResults(results, type, const {
       IndexRelationKind.IS_EXTENDED_BY:
           SearchResultKind.REFERENCE_IN_EXTENDS_CLAUSE,
       IndexRelationKind.IS_MIXED_IN_BY:
@@ -505,13 +499,12 @@
       IndexRelationKind.IS_IMPLEMENTED_BY:
           SearchResultKind.REFERENCE_IN_IMPLEMENTS_CLAUSE,
       IndexRelationKind.CONSTRAINS: SearchResultKind.REFERENCE_IN_ON_CLAUSE,
-    }, filesToCheck: filesToCheck);
+    });
     return results;
   }
 
   /// Return direct [SubtypeResult]s for either the [type] or [subtype].
-  Future<List<SubtypeResult>> subtypes(
-    SearchedFiles searchedFiles, {
+  Future<List<SubtypeResult>> subtypes({
     InterfaceElement? type,
     SubtypeResult? subtype,
   }) async {
@@ -520,9 +513,9 @@
     if (type != null) {
       if (type.name case var elementName?) {
         name = elementName;
-        var librarySource = type.library.firstFragment.source;
-        var source = type.firstFragment.libraryFragment.source;
-        id = '${librarySource.uri};${source.uri};$name';
+        var libraryFile = type.library.firstFragment.source.mustBeFile;
+        var fragmentFile = type.firstFragment.libraryFragment.source.mustBeFile;
+        id = '${libraryFile.path};${fragmentFile.path};$name';
       } else {
         return [];
       }
@@ -531,21 +524,22 @@
       id = subtype.id;
     }
 
-    _driver.discoverAvailableFiles();
-
     List<SubtypeResult> results = [];
 
-    // Note, this is a defensive copy.
-    var files = _driver.fsState.getFilesSubtypingName(name)?.toList();
+    _driver.discoverAvailableFiles();
 
-    if (files != null) {
-      for (FileState file in files) {
-        if (searchedFiles.add(file.path, this)) {
-          var index = await _driver.getIndex(file.path);
-          if (index != null) {
-            var request = _IndexRequest(index);
-            request.addSubtypes(id, results, file);
-          }
+    var subtypingFiles = _driver.fsState.getFilesSubtypingName(name);
+
+    if (subtypingFiles != null) {
+      for (var file in _filesForSearch()) {
+        if (!subtypingFiles.contains(file)) {
+          continue;
+        }
+
+        var index = await _driver.getIndex(file.path);
+        if (index != null) {
+          var request = _IndexRequest(index);
+          request.addSubtypes(id, results, file);
         }
       }
     }
@@ -563,9 +557,14 @@
       }
     }
 
-    List<FileState> knownFiles = _driver.fsState.knownFiles.toList();
-    for (FileState file in knownFiles) {
-      var libraryResult = await _driver.getLibraryByUri(file.uriStr);
+    var checkedLibraries = <FileState>{};
+    for (var file in _filesForSearch()) {
+      var libraryFile = file.kind.library?.file;
+      if (libraryFile == null || !checkedLibraries.add(libraryFile)) {
+        continue;
+      }
+
+      var libraryResult = await _driver.getLibraryByUri(libraryFile.uriStr);
       if (libraryResult is LibraryElementResult) {
         var element = libraryResult.element;
         element.getters.where((e) => e.isOriginDeclaration).forEach(addElement);
@@ -586,36 +585,29 @@
   }
 
   /// Returns unresolved references to the given [name].
-  Future<List<SearchResult>> unresolvedMemberReferences(
-    String? name,
-    SearchedFiles searchedFiles,
-  ) async {
+  Future<List<SearchResult>> unresolvedMemberReferences(String? name) async {
     if (name == null) {
       return const <SearchResult>[];
     }
 
-    // Prepare the list of files that reference the name.
-    var files = await _driver.getFilesReferencingNames({name});
-
     // Check the index of every file that references the element name.
     List<SearchResult> results = [];
-    for (var file in files) {
-      if (searchedFiles.add(file.path, this)) {
-        var index = await _driver.getIndex(file.path);
-        if (index != null) {
-          _IndexRequest request = _IndexRequest(index);
-          var fileResults = await request.getUnresolvedMemberReferences(
-            name,
-            const {
+    for (var file in _filesForSearch()) {
+      if (!file.referencedNames.contains(name)) {
+        continue;
+      }
+
+      var index = await _driver.getIndex(file.path);
+      if (index != null) {
+        _IndexRequest request = _IndexRequest(index);
+        var fileResults = await request
+            .getUnresolvedMemberReferences(name, const {
               IndexRelationKind.IS_READ_BY: SearchResultKind.READ,
               IndexRelationKind.IS_WRITTEN_BY: SearchResultKind.WRITE,
               IndexRelationKind.IS_READ_WRITTEN_BY: SearchResultKind.READ_WRITE,
               IndexRelationKind.IS_INVOKED_BY: SearchResultKind.INVOCATION,
-            },
-            () => _getUnitElement(file.path),
-          );
-          results.addAll(fileResults);
-        }
+            }, () => _getUnitElement(file.path));
+        results.addAll(fileResults);
       }
     }
 
@@ -625,11 +617,8 @@
   Future<void> _addResults(
     List<SearchResult> results,
     Element element,
-    SearchedFiles searchedFiles,
-    Map<IndexRelationKind, SearchResultKind> relationToResultKind, {
-    List<FileState>? filesToCheck,
-  }) async {
-    // Prepare the element name.
+    Map<IndexRelationKind, SearchResultKind> relationToResultKind,
+  ) async {
     var name = element.name;
     if (name == null) {
       return;
@@ -665,47 +654,37 @@
     var files = <FileState>{};
 
     void addLibraryFiles(LibraryElement library) {
-      String libraryPath = library.firstFragment.source.fullName;
-      if (searchedFiles.add(libraryPath, this)) {
-        var libraryFile = _driver.fsState.getFileForPath(libraryPath);
+      var libraryFile = _fileStateForSource(library.firstFragment.source);
+      if (libraryFile != null && _ownsFileState(libraryFile)) {
         if (libraryFile.kind case LibraryFileKind libraryKind) {
           files.addAll(libraryKind.files);
         }
       }
     }
 
+    // Add all files of libraries that declare the elements.
+    for (var library in librariesToSearch) {
+      addLibraryFiles(library);
+    }
+
     // Prepare the list of files that reference one of the names that can
     // syntactically denote the element.
-    if (name.startsWith('_')) {
-      for (var library in librariesToSearch) {
-        addLibraryFiles(library);
-      }
-    } else {
-      if (filesToCheck != null) {
-        for (FileState file in filesToCheck) {
-          if (referenceNames.any(file.referencedNames.contains)) {
-            files.add(file);
-          }
+    if (!name.startsWith('_')) {
+      for (var file in _filesForSearch()) {
+        if (referenceNames.any(file.referencedNames.contains)) {
+          files.add(file);
         }
-      } else {
-        files.addAll(await _driver.getFilesReferencingNames(referenceNames));
-      }
-      // Add all files of libraries that declare the elements.
-      for (var library in librariesToSearch) {
-        addLibraryFiles(library);
       }
     }
 
     // Check the index of every file that references the element name.
     for (var file in files) {
-      if (searchedFiles.add(file.path, this)) {
-        await _addResultsInFile(
-          results,
-          element,
-          relationToResultKind,
-          file.path,
-        );
-      }
+      await _addResultsInFile(
+        results,
+        element,
+        relationToResultKind,
+        file.path,
+      );
     }
   }
 
@@ -718,19 +697,49 @@
   ) async {
     var index = await _driver.getIndex(file);
     if (index != null) {
-      _IndexRequest request = _IndexRequest(index);
-      int elementId = request.findElementId(element);
-      if (elementId != -1) {
-        List<SearchResult> fileResults = await request.getRelations(
-          elementId,
-          relationToResultKind,
-          () => _getUnitElement(file),
-        );
-        results.addAll(fileResults);
-      }
+      await _addResultsInIndex(
+        results,
+        element,
+        relationToResultKind,
+        index,
+        () => _getUnitElement(file),
+      );
     }
   }
 
+  Future<void> _addResultsInIndex(
+    List<SearchResult> results,
+    Element element,
+    Map<IndexRelationKind, SearchResultKind> relationToResultKind,
+    AnalysisDriverUnitIndex index,
+    Future<LibraryFragmentImpl?> Function() getUnitElement,
+  ) async {
+    var request = _IndexRequest(index);
+    var elementId = request.findElementId(element);
+    if (elementId != -1) {
+      var fileResults = await request.getRelations(
+        elementId,
+        relationToResultKind,
+        getUnitElement,
+      );
+      results.addAll(fileResults);
+    }
+  }
+
+  Iterable<FileState> _filesForSearch() {
+    _driver.discoverAvailableFiles();
+
+    return _driver.ownedFiles?.filesFor(_driver) ?? const <FileState>[];
+  }
+
+  FileState? _fileStateForSource(Source? source) {
+    var file = source.tryCast<FileSource>()?.file;
+    if (file == null) {
+      return null;
+    }
+    return _driver.fsState.getExisting(file);
+  }
+
   /// Returns aliases that can denote [interfaceElement] in source.
   Future<List<TypeAliasElement>> _getTypeAliasesOfInterface(
     InterfaceElement interfaceElement,
@@ -745,7 +754,7 @@
 
     while (pending.isNotEmpty) {
       var element = pending.removeLast();
-      var searchResults = await _searchReferences(element, SearchedFiles());
+      var searchResults = await _searchReferences(element);
       for (var searchResult in searchResults) {
         var enclosingFragment = searchResult.enclosingFragment;
         if (enclosingFragment.element case TypeAliasElement alias) {
@@ -765,12 +774,22 @@
     return result is UnitElementResultImpl ? result.fragment : null;
   }
 
-  Future<List<SearchResult>> _searchReferences(
-    Element element,
-    SearchedFiles searchedFiles,
-  ) async {
+  bool _ownsFile(File file) {
+    return identical(_driver.ownedFiles?.ownerOf(file), _driver);
+  }
+
+  bool _ownsFileState(FileState file) {
+    return _ownsFile(file.resource);
+  }
+
+  bool _ownsSource(Source? source) {
+    var file = source.tryCast<FileSource>()?.file;
+    return file != null && _ownsFile(file);
+  }
+
+  Future<List<SearchResult>> _searchReferences(Element element) async {
     List<SearchResult> results = <SearchResult>[];
-    await _addResults(results, element, searchedFiles, const {
+    await _addResults(results, element, const {
       IndexRelationKind.IS_READ_WRITTEN_BY: SearchResultKind.READ_WRITE,
       IndexRelationKind.IS_INVOKED_BY: SearchResultKind.INVOCATION,
       IndexRelationKind.IS_READ_BY: SearchResultKind.READ,
@@ -785,9 +804,14 @@
   Future<List<SearchResult>> _searchReferences_CompilationUnit(
     LibraryFragmentImpl fragment,
   ) async {
-    String path = fragment.source.fullName;
+    _driver.discoverAvailableFiles();
 
-    var file = _driver.resourceProvider.getFile(path);
+    var source = fragment.source;
+    var file = source.tryCast<FileSource>()?.file;
+    if (file == null) {
+      return const <SearchResult>[];
+    }
+
     var fileState = _driver.fsState.getExisting(file);
 
     // If the file is not known, then it is not referenced.
@@ -798,6 +822,9 @@
     // Check files that reference the given file.
     var results = <SearchResult>[];
     for (var reference in fileState.referencingFiles) {
+      if (!_ownsFileState(reference)) {
+        continue;
+      }
       var index = await _driver.getIndex(reference.path);
       if (index != null) {
         var targetId = index.getLibraryFragmentId(fragment);
@@ -823,10 +850,9 @@
 
   Future<List<SearchResult>> _searchReferences_Constructor(
     ConstructorElement element,
-    SearchedFiles searchedFiles,
   ) async {
     List<SearchResult> results = <SearchResult>[];
-    await _addResults(results, element, searchedFiles, const {
+    await _addResults(results, element, const {
       IndexRelationKind.IS_INVOKED_BY: SearchResultKind.INVOCATION,
       IndexRelationKind.IS_INVOKED_BY_DOT_SHORTHANDS_CONSTRUCTOR:
           SearchResultKind.DOT_SHORTHANDS_CONSTRUCTOR_INVOCATION,
@@ -843,13 +869,12 @@
 
   Future<List<SearchResult>> _searchReferences_Field(
     PropertyInducingElement field,
-    SearchedFiles searchedFiles,
   ) async {
     List<SearchResult> results = <SearchResult>[];
     var getter = field.getter;
     var setter = field.setter;
     if (field.isOriginDeclaration) {
-      await _addResults(results, field, searchedFiles, const {
+      await _addResults(results, field, const {
         IndexRelationKind.IS_WRITTEN_BY: SearchResultKind.WRITE,
         IndexRelationKind.IS_REFERENCED_BY: SearchResultKind.REFERENCE,
         IndexRelationKind.IS_REFERENCED_BY_PATTERN_FIELD:
@@ -857,7 +882,7 @@
       });
     }
     if (getter != null) {
-      await _addResults(results, getter, searchedFiles, const {
+      await _addResults(results, getter, const {
         IndexRelationKind.IS_REFERENCED_BY: SearchResultKind.READ,
         IndexRelationKind.IS_REFERENCED_BY_PATTERN_FIELD:
             SearchResultKind.REFERENCE_IN_PATTERN_FIELD,
@@ -865,19 +890,16 @@
       });
     }
     if (setter != null) {
-      await _addResults(results, setter, searchedFiles, const {
+      await _addResults(results, setter, const {
         IndexRelationKind.IS_REFERENCED_BY: SearchResultKind.WRITE,
       });
     }
     return results;
   }
 
-  Future<List<SearchResult>> _searchReferences_Function(
-    Element element,
-    SearchedFiles searchedFiles,
-  ) async {
+  Future<List<SearchResult>> _searchReferences_Function(Element element) async {
     List<SearchResult> results = <SearchResult>[];
-    await _addResults(results, element.baseElement, searchedFiles, const {
+    await _addResults(results, element.baseElement, const {
       IndexRelationKind.IS_REFERENCED_BY_PATTERN_FIELD:
           SearchResultKind.REFERENCE,
       IndexRelationKind.IS_REFERENCED_BY: SearchResultKind.REFERENCE,
@@ -888,10 +910,9 @@
 
   Future<List<SearchResult>> _searchReferences_Getter(
     GetterElement getter,
-    SearchedFiles searchedFiles,
   ) async {
     List<SearchResult> results = <SearchResult>[];
-    await _addResults(results, getter, searchedFiles, const {
+    await _addResults(results, getter, const {
       IndexRelationKind.IS_REFERENCED_BY: SearchResultKind.REFERENCE,
       IndexRelationKind.IS_REFERENCED_BY_PATTERN_FIELD:
           SearchResultKind.REFERENCE_IN_PATTERN_FIELD,
@@ -902,10 +923,8 @@
 
   Future<List<SearchResult>> _searchReferences_Import(
     LibraryImportImpl element,
-    SearchedFiles searchedFiles,
   ) async {
-    String path = element.libraryFragment.source.fullName;
-    if (!searchedFiles.add(path, this)) {
+    if (!_ownsSource(element.libraryFragment.source)) {
       return const <SearchResult>[];
     }
 
@@ -925,10 +944,8 @@
 
   Future<List<SearchResult>> _searchReferences_Library(
     LibraryElementImpl element,
-    SearchedFiles searchedFiles,
   ) async {
-    String path = element.source.fullName;
-    if (!searchedFiles.add(path, this)) {
+    if (!_ownsSource(element.source)) {
       return const <SearchResult>[];
     }
 
@@ -961,12 +978,12 @@
   Future<List<SearchResult>> _searchReferences_Local(
     Element element,
     bool Function(AstNode n) isRootNode,
-    SearchedFiles searchedFiles,
   ) async {
-    String? path = element.firstFragment.libraryFragment?.source.fullName;
-    if (path == null || !searchedFiles.add(path, this)) {
+    var source = element.firstFragment.libraryFragment?.source;
+    if (!_ownsSource(source)) {
       return const <SearchResult>[];
     }
+    var path = source!.fullName;
 
     // Prepare the unit.
     var unitResult = await _driver.getResolvedUnit(path);
@@ -1002,27 +1019,25 @@
 
   Future<List<SearchResult>> _searchReferences_Parameter(
     FormalParameterElement element,
-    SearchedFiles searchedFiles,
   ) async {
     List<SearchResult> results = <SearchResult>[];
     if (element.enclosingElement is LocalFunctionElement) {
       results.addAll(
         await _searchReferences_Local(element, (node) {
           return node is Block || node.parent is CompilationUnit;
-        }, searchedFiles),
+        }),
       );
     } else {
-      results.addAll(await _searchReferences(element, searchedFiles));
+      results.addAll(await _searchReferences(element));
     }
     return results;
   }
 
   Future<List<SearchResult>> _searchReferences_PatternVariable(
     PatternVariableElementImpl element,
-    SearchedFiles searchedFiles,
   ) async {
-    String path = element.firstFragment.libraryFragment.source.fullName;
-    if (!searchedFiles.add(path, this)) {
+    var source = element.firstFragment.libraryFragment.source;
+    if (!_ownsSource(source)) {
       return const <SearchResult>[];
     }
 
@@ -1061,10 +1076,8 @@
 
   Future<List<SearchResult>> _searchReferences_Prefix(
     PrefixElementImpl element,
-    SearchedFiles searchedFiles,
   ) async {
-    String path = element.firstFragment.libraryFragment.source.fullName;
-    if (!searchedFiles.add(path, this)) {
+    if (!_ownsSource(element.firstFragment.libraryFragment.source)) {
       return const <SearchResult>[];
     }
 
@@ -1083,46 +1096,6 @@
   }
 }
 
-/// Container that keeps track of file owners.
-class SearchedFiles {
-  final Map<String, Search> pathOwners = {};
-  final Map<Uri, Search> uriOwners = {};
-
-  bool add(String path, Search search) {
-    var fsState = search._driver.fsState;
-    var fileState = fsState.getExistingFromPath(path);
-    if (fileState == null) {
-      return false;
-    }
-
-    var pathOwner = pathOwners[path];
-    var uriOwner = uriOwners[fileState.uri];
-    if (pathOwner == null && uriOwner == null) {
-      pathOwners[path] = search;
-      uriOwners[fileState.uri] = search;
-      return true;
-    }
-    return identical(pathOwner, search) && identical(uriOwner, search);
-  }
-
-  void ownAnalyzed(Search search) {
-    for (var path in search._driver.addedFiles) {
-      if (path.endsWith('.dart')) {
-        add(path, search);
-      }
-    }
-  }
-
-  void ownKnown(Search search) {
-    for (var file in search._driver.knownFiles) {
-      var path = file.path;
-      if (path.endsWith('.dart')) {
-        add(path, search);
-      }
-    }
-  }
-}
-
 /// A single search result.
 class SearchResult {
   /// The deep most fragment that contains this result.
@@ -1193,8 +1166,8 @@
 
 /// A single subtype of a type.
 class SubtypeResult {
-  /// The URI of the library.
-  final String libraryUri;
+  /// The library containing the subtype.
+  final FileState library;
 
   /// The identifier of the subtype.
   final String id;
@@ -1205,7 +1178,12 @@
   /// The names of instance members declared in the class.
   final List<String> members;
 
-  SubtypeResult(this.libraryUri, this.id, this.name, this.members);
+  SubtypeResult({
+    required this.library,
+    required this.id,
+    required this.name,
+    required this.members,
+  });
 
   @override
   String toString() => id;
@@ -1236,7 +1214,7 @@
 
 /// Searches through [fileEntries] for declarations.
 class _FindDeclarations {
-  final List<MapEntry<Uri, AnalysisDriver>> fileEntries;
+  final List<MapEntry<File, AnalysisDriver>> fileEntries;
   final WorkspaceSymbols result;
   final int? maxResults;
   final String pattern;
@@ -1267,15 +1245,24 @@
     }
 
     var filesProcessed = 0;
+    var processedLibraries = <FileState>{};
     try {
       for (var entry in fileEntries) {
-        var uri = entry.key;
+        var resource = entry.key;
         var analysisDriver = entry.value;
+        var file = analysisDriver.fsState.getExisting(resource);
+        var libraryFile = file?.kind.library?.file;
+        if (libraryFile == null) {
+          continue;
+        }
+        if (!processedLibraries.add(libraryFile)) {
+          continue;
+        }
 
         var libraryElement = await performance.runAsync('getLibraryByUri', (
           performance,
         ) async {
-          var result = await analysisDriver.getLibraryByUri('$uri');
+          var result = await analysisDriver.getLibraryByUri(libraryFile.uriStr);
           if (result is LibraryElementResultImpl) {
             return result.element;
           }
@@ -1562,13 +1549,13 @@
     ) {
       var subtype = index.subtypes[superIndex];
       var name = index.strings[subtype.name];
-      var subId = '${library.file.uriStr};${file.uriStr};$name';
+      var subId = '${library.file.path};${file.path};$name';
       results.add(
         SubtypeResult(
-          library.file.uriStr,
-          subId,
-          name,
-          subtype.members.map((m) => index.strings[m]).toList(),
+          library: library.file,
+          id: subId,
+          name: name,
+          members: subtype.members.map((m) => index.strings[m]).toList(),
         ),
       );
     }
@@ -1875,3 +1862,14 @@
 class _MaxNumberOfDeclarationsError {
   const _MaxNumberOfDeclarationsError();
 }
+
+extension _SourceExtension on Source {
+  /// Returns the [File] for this source.
+  ///
+  /// This assumes that the source is a [FileSource], which is safe because
+  /// index and search are only supported in DAS, where all sources are file
+  /// based.
+  File get mustBeFile {
+    return (this as FileSource).file;
+  }
+}
diff --git a/pkg/analyzer/lib/src/dart/analysis/unlinked_api_signature.dart b/pkg/analyzer/lib/src/dart/analysis/unlinked_api_signature.dart
index bdef633..11428f1 100644
--- a/pkg/analyzer/lib/src/dart/analysis/unlinked_api_signature.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/unlinked_api_signature.dart
@@ -45,13 +45,13 @@
         _addEnum(declaration);
       } else if (declaration is ExtensionDeclarationImpl) {
         _addExtension(declaration);
-      } else if (declaration is FunctionDeclaration) {
+      } else if (declaration is FunctionDeclarationImpl) {
         var functionExpression = declaration.functionExpression;
         _addTokens(
           declaration.beginToken,
           functionExpression.parameters?.endToken ?? declaration.name,
         );
-        signature.addBool(functionExpression.body is EmptyFunctionBody);
+        signature.addBool(declaration.isCompleteDeclaration);
         _addFunctionBodyModifiers(functionExpression.body);
       } else if (declaration is MixinDeclarationImpl) {
         _addMixin(declaration);
@@ -74,11 +74,11 @@
   void _addClassMembers(List<ClassMember> members, bool hasConstConstructor) {
     signature.addInt(members.length);
     for (var member in members) {
-      if (member is ConstructorDeclaration) {
+      if (member is ConstructorDeclarationImpl) {
         _addConstructorDeclaration(member);
       } else if (member is FieldDeclaration) {
         _addFieldDeclaration(member, hasConstConstructor);
-      } else if (member is MethodDeclaration) {
+      } else if (member is MethodDeclarationImpl) {
         _addMethodDeclaration(member);
       } else if (member is PrimaryConstructorBody) {
         _addPrimaryConstructorBody(member);
@@ -88,12 +88,12 @@
     }
   }
 
-  void _addConstructorDeclaration(ConstructorDeclaration node) {
+  void _addConstructorDeclaration(ConstructorDeclarationImpl node) {
     signature.addInt(_kindConstructorDeclaration);
     _addTokens(node.beginToken, node.parameters.endToken);
     _addNodeList(node.initializers);
     _addNode(node.redirectedConstructor);
-    signature.addBool(node.body is EmptyFunctionBody);
+    signature.addBool(node.isCompleteDeclaration);
   }
 
   void _addEnum(EnumDeclarationImpl node) {
@@ -141,10 +141,10 @@
     }
   }
 
-  void _addMethodDeclaration(MethodDeclaration node) {
+  void _addMethodDeclaration(MethodDeclarationImpl node) {
     signature.addInt(_kindMethodDeclaration);
     _addTokens(node.beginToken, node.parameters?.endToken ?? node.name);
-    signature.addBool(node.body is EmptyFunctionBody);
+    signature.addBool(node.isCompleteDeclaration);
     _addFunctionBodyModifiers(node.body);
     signature.addBool(node.invokesSuperSelf);
   }
diff --git a/pkg/analyzer/lib/src/dart/ast/ast.dart b/pkg/analyzer/lib/src/dart/ast/ast.dart
index de4f47a..3268281 100644
--- a/pkg/analyzer/lib/src/dart/ast/ast.dart
+++ b/pkg/analyzer/lib/src/dart/ast/ast.dart
@@ -26,6 +26,7 @@
 import 'package:analyzer/diagnostic/diagnostic.dart';
 import 'package:analyzer/error/listener.dart';
 import 'package:analyzer/source/line_info.dart';
+import 'package:analyzer/source/source_range.dart';
 import 'package:analyzer/src/dart/ast/extensions.dart';
 import 'package:analyzer/src/dart/ast/to_source_visitor.dart';
 import 'package:analyzer/src/dart/ast/token.dart';
@@ -6891,6 +6892,10 @@
   @override
   ConstructorFragment? get declaredFragment;
 
+  /// The offset and length to use as an error range for this constructor
+  /// declaration, accounting for named and unnamed constructors.
+  SourceRange get errorRange;
+
   /// The token for the `external` keyword to this constructor declaration.
   Token? get externalKeyword;
 
@@ -7051,6 +7056,13 @@
     return body.endToken;
   }
 
+  @override
+  SourceRange get errorRange {
+    var startEntity = typeName ?? (newKeyword ?? factoryKeyword)!;
+    var endEntity = name ?? startEntity;
+    return SourceRange(startEntity.offset, endEntity.end - startEntity.offset);
+  }
+
   @generated
   @override
   Token get firstTokenAfterCommentAndMetadata {
@@ -7076,6 +7088,16 @@
     return parameters.beginToken;
   }
 
+  bool get isCompleteDeclaration {
+    if (externalKeyword != null) return true;
+    if (body is! EmptyFunctionBody) return true;
+    if (redirectedConstructor != null || initializers.isNotEmpty) return true;
+    return parameters.parameters.any((parameter) {
+      return parameter is FieldFormalParameterImpl ||
+          parameter is SuperFormalParameterImpl;
+    });
+  }
+
   bool get isGenerative {
     return factoryKeyword == null;
   }
@@ -15278,6 +15300,11 @@
     _functionExpression = _becomeParentOf(functionExpression);
   }
 
+  bool get isCompleteDeclaration {
+    return externalKeyword != null ||
+        functionExpression.body is! EmptyFunctionBody;
+  }
+
   @override
   bool get isGetter => propertyKeyword?.keyword == Keyword.GET;
 
@@ -22029,6 +22056,10 @@
         (body is EmptyFunctionBodyImpl && !body.semicolon.isSynthetic);
   }
 
+  bool get isCompleteDeclaration {
+    return externalKeyword != null || body is! EmptyFunctionBody;
+  }
+
   @override
   bool get isGetter => propertyKeyword?.keyword == Keyword.GET;
 
@@ -26914,6 +26945,10 @@
   /// Returns `null` if the AST structure hasn't been resolved.
   ConstructorFragment? get declaredFragment;
 
+  /// The offset and length to use as an error range for this constructor
+  /// declaration, accounting for named and unnamed constructors.
+  SourceRange get errorRange;
+
   /// The formal parameters of the constructor, including declaring.
   FormalParameterList get formalParameters;
 }
@@ -26997,6 +27032,14 @@
 
   @generated
   @override
+  SourceRange get errorRange {
+    var startEntity = beginToken;
+    var endEntity = constructorName ?? beginToken;
+    return SourceRange(startEntity.offset, endEntity.end - startEntity.offset);
+  }
+
+  @generated
+  @override
   FormalParameterListImpl get formalParameters => _formalParameters;
 
   @generated
diff --git a/pkg/analyzer/lib/src/dart/ast/extensions.dart b/pkg/analyzer/lib/src/dart/ast/extensions.dart
index b805428..2107fd1 100644
--- a/pkg/analyzer/lib/src/dart/ast/extensions.dart
+++ b/pkg/analyzer/lib/src/dart/ast/extensions.dart
@@ -6,7 +6,6 @@
 import 'package:analyzer/dart/ast/token.dart';
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/dart/element/type.dart';
-import 'package:analyzer/source/source_range.dart';
 import 'package:analyzer/src/dart/ast/ast.dart';
 import 'package:analyzer/src/dart/element/type.dart';
 import 'package:collection/collection.dart';
@@ -96,14 +95,6 @@
 }
 
 extension ConstructorDeclarationExtension on ConstructorDeclaration {
-  /// The offset and length to use as an error range for this constructor
-  /// declaration, accounting for named and unnamed constructors.
-  SourceRange get errorRange {
-    var startEntity = typeName ?? (newKeyword ?? factoryKeyword)!;
-    var endEntity = name ?? startEntity;
-    return SourceRange(startEntity.offset, endEntity.end - startEntity.offset);
-  }
-
   bool get isNonRedirectingGenerative {
     // Must be generative.
     if (externalKeyword != null || factoryKeyword != null) {
@@ -300,15 +291,6 @@
   }
 }
 
-extension PrimaryConstructorDeclarationExtension
-    on PrimaryConstructorDeclaration {
-  SourceRange get errorRange {
-    var startEntity = beginToken;
-    var endEntity = constructorName ?? beginToken;
-    return SourceRange(startEntity.offset, endEntity.end - startEntity.offset);
-  }
-}
-
 extension RecordTypeAnnotationExtension on RecordTypeAnnotation {
   List<RecordTypeAnnotationField> get fields {
     return [...positionalFields, ...?namedFields?.fields];
diff --git a/pkg/analyzer/lib/src/dart/constant/evaluation.dart b/pkg/analyzer/lib/src/dart/constant/evaluation.dart
index 9106ac3..6f551e1 100644
--- a/pkg/analyzer/lib/src/dart/constant/evaluation.dart
+++ b/pkg/analyzer/lib/src/dart/constant/evaluation.dart
@@ -28,8 +28,9 @@
 import 'package:analyzer/src/dart/element/type_provider.dart';
 import 'package:analyzer/src/dart/element/type_system.dart' show TypeSystemImpl;
 import 'package:analyzer/src/dart/type_instantiation_target.dart';
+import 'package:analyzer/src/diagnostic/diagnostic.dart'
+    show DiagnosticMessageImpl;
 import 'package:analyzer/src/diagnostic/diagnostic.dart' as diag;
-import 'package:analyzer/src/diagnostic/diagnostic_message.dart';
 import 'package:analyzer/src/error/listener.dart';
 import 'package:analyzer/src/generated/engine.dart';
 import 'package:analyzer/src/generated/java_core.dart';
diff --git a/pkg/analyzer/lib/src/dart/element/element.dart b/pkg/analyzer/lib/src/dart/element/element.dart
index e3deb3e..ca5b9bf 100644
--- a/pkg/analyzer/lib/src/dart/element/element.dart
+++ b/pkg/analyzer/lib/src/dart/element/element.dart
@@ -145,6 +145,7 @@
     reference.element = this;
     _firstFragment.element = this;
 
+    isAbstract = _firstFragment.isAbstract || _firstFragment.isSealed;
     isBase = _firstFragment.isBase;
     isFinal = _firstFragment.isFinal;
     isInterface = _firstFragment.isInterface;
@@ -315,7 +316,12 @@
   @override
   @trackedIncludedInId
   bool get isAbstract {
-    return _firstFragment.isAbstract;
+    return hasFlag(_ElementStorageFlag.classElement_isAbstract);
+  }
+
+  @generated
+  set isAbstract(bool value) {
+    setFlag(_ElementStorageFlag.classElement_isAbstract, value);
   }
 
   @generated
@@ -515,8 +521,11 @@
         .where((constructor) => constructor.isGenerative)
         .toList(growable: false);
 
-    bool typeHasInstanceVariables(InterfaceTypeImpl type) =>
-        type.element.fields.any((e) => e.isOriginDeclaration);
+    bool typeHasInstanceVariables(InterfaceTypeImpl type) {
+      return type.element.fields.any(
+        (field) => field.isInstanceField && field.isOriginDeclaration,
+      );
+    }
 
     _constructors = superConstructors.map((superConstructor) {
       var constructorFragment = ConstructorFragmentImpl(
@@ -731,6 +740,18 @@
   }
 
   @override
+  List<ClassFragmentImpl> get precedingFragments {
+    return [
+      for (
+        var current = previousFragment;
+        current != null;
+        current = current.previousFragment
+      )
+        current,
+    ];
+  }
+
+  @override
   ClassFragmentImpl? get previousFragment {
     return super.previousFragment as ClassFragmentImpl?;
   }
@@ -2681,6 +2702,18 @@
   }
 
   @override
+  List<ExecutableFragmentImpl> get followingFragments {
+    return [
+      for (
+        var current = nextFragment;
+        current != null;
+        current = current.nextFragment
+      )
+        current,
+    ];
+  }
+
+  @override
   List<FormalParameterFragmentImpl> get formalParameters {
     _ensureReadResolution();
     return _formalParameters;
@@ -2801,6 +2834,18 @@
   int get offset => nameOffset ?? firstTokenOffset!;
 
   @override
+  List<ExecutableFragmentImpl> get precedingFragments {
+    return [
+      for (
+        var current = previousFragment;
+        current != null;
+        current = current.previousFragment
+      )
+        current,
+    ];
+  }
+
+  @override
   ExecutableFragmentImpl? get previousFragment;
 
   @override
@@ -4017,6 +4062,18 @@
     };
   }
 
+  @override
+  List<FormalParameterFragmentImpl> get followingFragments {
+    return [
+      for (
+        var current = nextFragment;
+        current != null;
+        current = current.nextFragment
+      )
+        current,
+    ];
+  }
+
   /// The parameters defined by this parameter.
   ///
   /// A parameter will only define other parameters if it is a function typed
@@ -4162,12 +4219,15 @@
   }
 
   @override
-  Iterable<FormalParameterFragmentImpl> get precedingFragments sync* {
-    var current = previousFragment;
-    while (current != null) {
-      yield current;
-      current = current.previousFragment;
-    }
+  List<FormalParameterFragmentImpl> get precedingFragments {
+    return [
+      for (
+        var current = previousFragment;
+        current != null;
+        current = current.previousFragment
+      )
+        current,
+    ];
   }
 
   /// The type parameters defined by this parameter.
@@ -4376,12 +4436,15 @@
 
   /// The fragments in the augmentation chain that follow this fragment,
   /// in order from the immediate next fragment to the last fragment.
-  Iterable<FragmentImpl> get followingFragments sync* {
-    var current = nextFragment;
-    while (current != null) {
-      yield current;
-      current = current.nextFragment;
-    }
+  List<FragmentImpl> get followingFragments {
+    return [
+      for (
+        var current = nextFragment;
+        current != null;
+        current = current.nextFragment
+      )
+        current,
+    ];
   }
 
   @generated
@@ -4445,12 +4508,15 @@
 
   /// The fragments in the augmentation chain that precede this fragment,
   /// in order from the immediate previous fragment to the first fragment.
-  Iterable<FragmentImpl> get precedingFragments sync* {
-    var current = previousFragment;
-    while (current != null) {
-      yield current;
-      current = current.previousFragment;
-    }
+  List<FragmentImpl> get precedingFragments {
+    return [
+      for (
+        var current = previousFragment;
+        current != null;
+        current = current.previousFragment
+      )
+        current,
+    ];
   }
 
   @override
@@ -11761,7 +11827,7 @@
 
 enum _ClassElementFlags {
   hasExtendsClause(fragment: true),
-  isAbstract(fragment: true, element: _ElementFlagSource.firstFragment),
+  isAbstract(fragment: true, element: _ElementFlagSource.stored),
   isBase(fragment: true, element: _ElementFlagSource.stored),
   isFinal(fragment: true, element: _ElementFlagSource.stored),
   isInterface(fragment: true, element: _ElementFlagSource.stored),
@@ -11819,6 +11885,7 @@
 
 @generated
 enum _ElementStorageFlag {
+  classElement_isAbstract,
   classElement_isBase,
   classElement_isFinal,
   classElement_isInterface,
diff --git a/pkg/analyzer/lib/src/dart/element/extensions.dart b/pkg/analyzer/lib/src/dart/element/extensions.dart
index c0203fb..7a13a1e 100644
--- a/pkg/analyzer/lib/src/dart/element/extensions.dart
+++ b/pkg/analyzer/lib/src/dart/element/extensions.dart
@@ -10,7 +10,8 @@
 import 'package:analyzer/source/source_range.dart';
 import 'package:analyzer/src/dart/element/element.dart';
 import 'package:analyzer/src/dart/element/type.dart';
-import 'package:analyzer/src/diagnostic/diagnostic_message.dart';
+import 'package:analyzer/src/diagnostic/diagnostic.dart'
+    show DiagnosticMessageImpl;
 import 'package:analyzer/src/generated/utilities_dart.dart';
 import 'package:meta/meta_meta.dart';
 
diff --git a/pkg/analyzer/lib/src/dart/element/type_system.dart b/pkg/analyzer/lib/src/dart/element/type_system.dart
index 39e5271..5e1c906 100644
--- a/pkg/analyzer/lib/src/dart/element/type_system.dart
+++ b/pkg/analyzer/lib/src/dart/element/type_system.dart
@@ -1770,6 +1770,27 @@
     return null;
   }
 
+  /// Returns the union-free type derived from [type].
+  ///
+  /// If `T` is of the form `S?` or `FutureOr<S>`, then the union-free type
+  /// derived from `T` is the union-free type derived from `S`. Otherwise, it
+  /// is `T`.
+  TypeImpl unionFreeType(TypeImpl type) {
+    if (identical(type, UnknownInferredType.instance)) {
+      return type;
+    }
+
+    if (type.nullabilitySuffix != NullabilitySuffix.none) {
+      return unionFreeType(type.withNullability(NullabilitySuffix.none));
+    }
+
+    if (type is InterfaceTypeImpl && type.isDartAsyncFutureOr) {
+      return unionFreeType(type.typeArguments[0]);
+    }
+
+    return type;
+  }
+
   /// Optimistically estimates, if type arguments of [left] can be equal to
   /// the type arguments of [right]. Both types must be instantiations of the
   /// same element.
diff --git a/pkg/analyzer/lib/src/dart/error/lint_codes.dart b/pkg/analyzer/lib/src/dart/error/lint_codes.dart
index 370f3fe..4e6cc0f 100644
--- a/pkg/analyzer/lib/src/dart/error/lint_codes.dart
+++ b/pkg/analyzer/lib/src/dart/error/lint_codes.dart
@@ -8,8 +8,9 @@
 
 import 'package:_fe_analyzer_shared/src/base/analyzer_public_api.dart';
 import 'package:_fe_analyzer_shared/src/base/errors.dart';
+import 'package:analyzer/src/diagnostic/diagnostic.dart';
 
-export 'package:_fe_analyzer_shared/src/base/errors.dart'
+export 'package:analyzer/src/diagnostic/diagnostic.dart'
     show
         DiagnosticWithArguments,
         DiagnosticWithoutArguments,
diff --git a/pkg/analyzer/lib/src/dart/error/todo_codes.dart b/pkg/analyzer/lib/src/dart/error/todo_codes.dart
index 9e2cf4b..bae0ac5 100644
--- a/pkg/analyzer/lib/src/dart/error/todo_codes.dart
+++ b/pkg/analyzer/lib/src/dart/error/todo_codes.dart
@@ -6,8 +6,8 @@
 import 'package:analyzer/src/diagnostic/diagnostic.dart' as diag;
 
 typedef TodoDiagnosticCode =
-    DiagnosticWithArguments<
-      LocatableDiagnostic Function({required String message})
+    diag.DiagnosticWithArguments<
+      diag.LocatableDiagnostic Function({required String message})
     >;
 
 /// Static helper methods and properties for working with [DiagnosticType.TODO]
diff --git a/pkg/analyzer/lib/src/dart/resolver/body_inference_context.dart b/pkg/analyzer/lib/src/dart/resolver/body_inference_context.dart
index 3455ba7..794543a 100644
--- a/pkg/analyzer/lib/src/dart/resolver/body_inference_context.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/body_inference_context.dart
@@ -226,12 +226,14 @@
       return imposedType;
     }
 
-    // If the function expression is declared `async*` and the imposed return
-    // type is of the form `Stream<S>` for some `S`, then the context type
-    // is `S`.
+    var unionFreeImposedType = typeSystem.unionFreeType(imposedType);
+
+    // If the function expression is declared `async*` and the union-free type
+    // derived from the imposed return type is of the form `Stream<S>` for some
+    // `S`, then the context type is `S`.
     if (node.isGenerator && node.isAsynchronous) {
       var elementType = _argumentOf(
-        imposedType,
+        unionFreeImposedType,
         typeSystem.typeProvider.streamElement,
       );
       if (elementType != null) {
@@ -239,12 +241,12 @@
       }
     }
 
-    // If the function expression is declared `sync*` and the imposed return
-    // type is of the form `Iterable<S>` for some `S`, then the context type
-    // is `S`.
+    // If the function expression is declared `sync*` and the union-free type
+    // derived from the imposed return type is of the form `Iterable<S>` for
+    // some `S`, then the context type is `S`.
     if (node.isGenerator && node.isSynchronous) {
       var elementType = _argumentOf(
-        imposedType,
+        unionFreeImposedType,
         typeSystem.typeProvider.iterableElement,
       );
       if (elementType != null) {
diff --git a/pkg/analyzer/lib/src/dart/resolver/element_binding_visitor.dart b/pkg/analyzer/lib/src/dart/resolver/element_binding_visitor.dart
index 565217d..f42ff84 100644
--- a/pkg/analyzer/lib/src/dart/resolver/element_binding_visitor.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/element_binding_visitor.dart
@@ -5,16 +5,13 @@
 import 'package:analyzer/dart/ast/token.dart';
 import 'package:analyzer/dart/ast/visitor.dart';
 import 'package:analyzer/dart/element/element.dart';
-import 'package:analyzer/error/listener.dart';
 import 'package:analyzer/src/dart/ast/ast.dart';
 import 'package:analyzer/src/dart/element/element.dart';
-import 'package:analyzer/src/diagnostic/diagnostic.dart' as diag;
 import 'package:analyzer/src/generated/element_walker.dart';
 import 'package:analyzer/src/utilities/extensions/collection.dart';
 
 class ElementBindingVisitor extends RecursiveAstVisitor<void> {
   final LibraryFragmentImpl _libraryFragment;
-  final DiagnosticReporter? _errorReporter;
 
   /// This index is incremented every time we visit a [LibraryDirective].
   /// There is just one [LibraryElement], so we can support only one node.
@@ -32,19 +29,15 @@
 
   ElementBindingVisitor.forAnalysis({
     required LibraryFragmentImpl fragment,
-    required DiagnosticReporter reporter,
     required ElementWalker walker,
-  }) : this._(fragment, reporter, walker);
+  }) : this._(fragment, walker);
 
   ElementBindingVisitor.forPartialResolution({
     required LibraryFragmentImpl fragment,
-  }) : this._(fragment, null, null);
+  }) : this._(fragment, null);
 
-  ElementBindingVisitor._(
-    this._libraryFragment,
-    this._errorReporter,
-    this._elementWalker,
-  ) : _elementHolder = ElementHolder(_libraryFragment);
+  ElementBindingVisitor._(this._libraryFragment, this._elementWalker)
+    : _elementHolder = ElementHolder(_libraryFragment);
 
   void bindSubtree(FragmentImpl enclosingFragment, AstNode node) {
     _withElementHolder(ElementHolder(enclosingFragment), () {
@@ -149,12 +142,6 @@
 
     _setOrCreateMetadataElements(fragment, node.metadata);
 
-    _checkAndRewriteTypeParameters(
-      firstTypeParameters: fragment.element.firstFragment.typeParameters,
-      nameOrKeywordToken: node.namePart.typeName,
-      typeParameterList: node.namePart.typeParameters,
-    );
-
     _withElementWalker(ElementWalker.forClass(fragment), () {
       super.visitClassDeclaration(node);
     });
@@ -269,12 +256,6 @@
 
     _setOrCreateMetadataElements(fragment, node.metadata);
 
-    _checkAndRewriteTypeParameters(
-      firstTypeParameters: fragment.element.firstFragment.typeParameters,
-      nameOrKeywordToken: node.namePart.typeName,
-      typeParameterList: node.namePart.typeParameters,
-    );
-
     _withElementWalker(ElementWalker.forEnum(fragment), () {
       super.visitEnumDeclaration(node);
     });
@@ -298,12 +279,6 @@
 
     _setOrCreateMetadataElements(fragment, node.metadata);
 
-    _checkAndRewriteTypeParameters(
-      firstTypeParameters: fragment.element.firstFragment.typeParameters,
-      nameOrKeywordToken: node.name ?? node.extensionKeyword,
-      typeParameterList: node.typeParameters,
-    );
-
     _withElementWalker(ElementWalker.forExtension(fragment), () {
       super.visitExtensionDeclaration(node);
     });
@@ -318,12 +293,6 @@
 
     _setOrCreateMetadataElements(fragment, node.metadata);
 
-    _checkAndRewriteTypeParameters(
-      firstTypeParameters: fragment.element.firstFragment.typeParameters,
-      nameOrKeywordToken: node.primaryConstructor.typeName,
-      typeParameterList: node.primaryConstructor.typeParameters,
-    );
-
     _withElementWalker(ElementWalker.forExtensionType(fragment), () {
       super.visitExtensionTypeDeclaration(node);
     });
@@ -385,12 +354,6 @@
       node.returnType?.accept(this);
 
       if (_elementWalker != null) {
-        _checkAndRewriteTypeParameters(
-          firstTypeParameters: fragment.element.firstFragment.typeParameters,
-          nameOrKeywordToken: node.name,
-          typeParameterList: node.functionExpression.typeParameters,
-        );
-
         _withElementWalker(ElementWalker.forExecutable(fragment), () {
           node.functionExpression.typeParameters?.accept(this);
           node.functionExpression.parameters?.accept(this);
@@ -581,12 +544,6 @@
 
     _setOrCreateMetadataElements(fragment, node.metadata);
 
-    _checkAndRewriteTypeParameters(
-      firstTypeParameters: fragment.element.firstFragment.typeParameters,
-      nameOrKeywordToken: node.name,
-      typeParameterList: node.typeParameters,
-    );
-
     node.returnType?.accept(this);
     _withElementWalker(ElementWalker.forExecutable(fragment), () {
       node.typeParameters?.accept(this);
@@ -607,12 +564,6 @@
 
     _setOrCreateMetadataElements(fragment, node.metadata);
 
-    _checkAndRewriteTypeParameters(
-      firstTypeParameters: fragment.element.firstFragment.typeParameters,
-      nameOrKeywordToken: node.name,
-      typeParameterList: node.typeParameters,
-    );
-
     _withElementWalker(ElementWalker.forMixin(fragment), () {
       super.visitMixinDeclaration(node);
     });
@@ -795,51 +746,6 @@
     }
   }
 
-  /// Checks that the number of type parameters in [typeParameterList] matches
-  /// the number of [firstTypeParameters] for this declaration.
-  ///
-  /// The number of fragments in [firstTypeParameters] is equal to the
-  /// number of type parameters in the introductory declaration.
-  ///
-  /// If they don't match, reports [diag.augmentationTypeParameterCount].
-  ///
-  /// If the augmentation has more type parameters, the extra ones are excised
-  /// from the AST and token stream, and added to the compilation unit's
-  /// `invalidNodes`.
-  void _checkAndRewriteTypeParameters({
-    required List<TypeParameterFragmentImpl> firstTypeParameters,
-    required Token nameOrKeywordToken,
-    required TypeParameterListImpl? typeParameterList,
-  }) {
-    var introductoryCount = firstTypeParameters
-        .takeWhile((p) => !p.isOriginOtherFragmentOfEnclosing)
-        .length;
-
-    // If no type parameter nodes, but introductory has type parameters.
-    if (typeParameterList == null) {
-      if (introductoryCount != 0) {
-        _errorReporter?.atToken(
-          nameOrKeywordToken,
-          diag.augmentationTypeParameterCount,
-        );
-      }
-      return;
-    }
-
-    // If the number of type parameters does not match, it is an error.
-    if (typeParameterList.typeParameters.length > introductoryCount) {
-      _errorReporter?.atToken(
-        typeParameterList.typeParameters[introductoryCount].name,
-        diag.augmentationTypeParameterCount,
-      );
-    } else if (typeParameterList.typeParameters.length < introductoryCount) {
-      _errorReporter?.atToken(
-        typeParameterList.rightBracket,
-        diag.augmentationTypeParameterCount,
-      );
-    }
-  }
-
   /// Associate [annotations] with `element`.
   /// If `element` is generic, we can reuse it.
   /// If `element` is not generic, we create new `ElementAnnotation`s.
diff --git a/pkg/analyzer/lib/src/dart/resolver/function_expression_invocation_resolver.dart b/pkg/analyzer/lib/src/dart/resolver/function_expression_invocation_resolver.dart
index 708e4d7..897f79c 100644
--- a/pkg/analyzer/lib/src/dart/resolver/function_expression_invocation_resolver.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/function_expression_invocation_resolver.dart
@@ -100,6 +100,19 @@
     );
     var callElement = result.getter2;
 
+    if (result.recordField != null) {
+      _diagnosticReporter.report(
+        diag.invocationOfNonFunctionExpression.at(function),
+      );
+      _unresolved(
+        node,
+        InvalidTypeImpl.instance,
+        whyNotPromotedArguments,
+        contextType: contextType,
+      );
+      return;
+    }
+
     if (callElement == null) {
       if (result.needsGetterError) {
         _diagnosticReporter.report(
diff --git a/pkg/analyzer/lib/src/dart/resolver/named_type_resolver.dart b/pkg/analyzer/lib/src/dart/resolver/named_type_resolver.dart
index 4165e47..ee15fd2 100644
--- a/pkg/analyzer/lib/src/dart/resolver/named_type_resolver.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/named_type_resolver.dart
@@ -14,13 +14,13 @@
 import 'package:analyzer/src/dart/element/type.dart';
 import 'package:analyzer/src/dart/element/type_constraint_gatherer.dart';
 import 'package:analyzer/src/dart/element/type_system.dart';
-import 'package:analyzer/src/dart/error/lint_codes.dart';
 import 'package:analyzer/src/dart/resolver/flow_analysis_visitor.dart';
 import 'package:analyzer/src/dart/resolver/scope_context.dart';
 import 'package:analyzer/src/dart/type_instantiation_target.dart';
+import 'package:analyzer/src/diagnostic/diagnostic.dart'
+    show DiagnosticMessageImpl, LocatableDiagnostic;
 import 'package:analyzer/src/diagnostic/diagnostic.dart' as diag;
 import 'package:analyzer/src/diagnostic/diagnostic_factory.dart';
-import 'package:analyzer/src/diagnostic/diagnostic_message.dart';
 import 'package:analyzer/src/error/listener.dart';
 import 'package:analyzer/src/generated/scope_helpers.dart';
 
diff --git a/pkg/analyzer/lib/src/dart/resolver/resolution_visitor.dart b/pkg/analyzer/lib/src/dart/resolver/resolution_visitor.dart
index fa0aefc..23ef5f2 100644
--- a/pkg/analyzer/lib/src/dart/resolver/resolution_visitor.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/resolution_visitor.dart
@@ -958,7 +958,9 @@
     var boundNode = node.bound;
     if (boundNode != null) {
       boundNode.accept(this);
-      fragment.element.bound = boundNode.type;
+      if (fragment.previousFragment == null) {
+        fragment.element.bound = boundNode.type;
+      }
     }
   }
 
diff --git a/pkg/analyzer/lib/src/dart/resolver/yield_statement_resolver.dart b/pkg/analyzer/lib/src/dart/resolver/yield_statement_resolver.dart
index 914def3..3f13e00 100644
--- a/pkg/analyzer/lib/src/dart/resolver/yield_statement_resolver.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/yield_statement_resolver.dart
@@ -81,6 +81,7 @@
 
     var imposedReturnType = bodyContext.imposedType;
     if (imposedReturnType != null) {
+      imposedReturnType = _typeSystem.unionFreeType(imposedReturnType);
       if (isYieldEach) {
         if (!_typeSystem.isAssignableTo(
           impliedReturnType,
diff --git a/pkg/analyzer/lib/src/dart/scanner/scanner.dart b/pkg/analyzer/lib/src/dart/scanner/scanner.dart
index ecfa1a8..ec0c64d 100644
--- a/pkg/analyzer/lib/src/dart/scanner/scanner.dart
+++ b/pkg/analyzer/lib/src/dart/scanner/scanner.dart
@@ -4,7 +4,6 @@
 
 import 'dart:typed_data';
 
-import 'package:_fe_analyzer_shared/src/base/errors.dart';
 import 'package:_fe_analyzer_shared/src/parser/experimental_features.dart';
 import 'package:_fe_analyzer_shared/src/scanner/scanner.dart' as fasta;
 import 'package:_fe_analyzer_shared/src/scanner/token.dart' show Token;
@@ -34,7 +33,7 @@
   final String _inputText;
 
   /// The callback to report diagnostics.
-  final void Function(LocatedDiagnostic) reportError;
+  final void Function(diag.LocatedDiagnostic) reportError;
 
   /// If the file has [fasta.LanguageVersionToken], it is allowed to use the
   /// language version greater than the one specified in the package config.
diff --git a/pkg/analyzer/lib/src/dart/scanner/translate_error_token.dart b/pkg/analyzer/lib/src/dart/scanner/translate_error_token.dart
index c05056a..2f59bd0 100644
--- a/pkg/analyzer/lib/src/dart/scanner/translate_error_token.dart
+++ b/pkg/analyzer/lib/src/dart/scanner/translate_error_token.dart
@@ -2,7 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:_fe_analyzer_shared/src/base/errors.dart';
 import 'package:_fe_analyzer_shared/src/messages/codes.dart';
 import 'package:_fe_analyzer_shared/src/messages/diagnostic.dart' as fe_diag;
 import 'package:_fe_analyzer_shared/src/messages/diagnostic.dart';
@@ -18,7 +17,7 @@
   int charOffset = token.charOffset;
   // TODO(paulberry): why is endOffset sometimes null?
   int endOffset = token.endOffset ?? charOffset;
-  void makeError(LocatableDiagnostic locatableDiagnostic) {
+  void makeError(diag.LocatableDiagnostic locatableDiagnostic) {
     if (_isAtEnd(token, charOffset)) {
       // Analyzer never generates an error message past the end of the input,
       // since such an error would not be visible in an editor.
@@ -129,4 +128,4 @@
 /// Used to report a scan error.
 /// The [locatedDiagnostic] contains the error code, arguments, and the location
 /// of the error.
-typedef ReportError = void Function(LocatedDiagnostic locatedDiagnostic);
+typedef ReportError = void Function(diag.LocatedDiagnostic locatedDiagnostic);
diff --git a/pkg/analyzer/lib/src/dart/type_instantiation_target.dart b/pkg/analyzer/lib/src/dart/type_instantiation_target.dart
index 423fc79..caa4312 100644
--- a/pkg/analyzer/lib/src/dart/type_instantiation_target.dart
+++ b/pkg/analyzer/lib/src/dart/type_instantiation_target.dart
@@ -6,7 +6,6 @@
 // currently contains some classes called `TypeInstantiationTarget...` and some
 // called `InvocationTarget...`.
 
-import 'package:_fe_analyzer_shared/src/base/errors.dart';
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/dart/element/type.dart';
 import 'package:analyzer/src/dart/element/element.dart';
@@ -30,7 +29,7 @@
   InvocationTargetConstructorElement(super.element, this.rawType);
 
   @override
-  LocatableDiagnostic wrongNumberOfTypeArgumentsError({
+  diag.LocatableDiagnostic wrongNumberOfTypeArgumentsError({
     required int typeParameterCount,
     required int typeArgumentCount,
   }) {
@@ -68,7 +67,7 @@
       element.type as FunctionTypeImpl;
 
   @override
-  LocatableDiagnostic wrongNumberOfTypeArgumentsError({
+  diag.LocatableDiagnostic wrongNumberOfTypeArgumentsError({
     required int typeParameterCount,
     required int typeArgumentCount,
   }) {
@@ -102,7 +101,7 @@
   FunctionTypeImpl get rawType => type;
 
   @override
-  LocatableDiagnostic wrongNumberOfTypeArgumentsError({
+  diag.LocatableDiagnostic wrongNumberOfTypeArgumentsError({
     required int typeParameterCount,
     required int typeArgumentCount,
   }) {
@@ -132,7 +131,7 @@
   FunctionTypeImpl get rawType => type;
 
   @override
-  LocatableDiagnostic wrongNumberOfTypeArgumentsError({
+  diag.LocatableDiagnostic wrongNumberOfTypeArgumentsError({
     required int typeParameterCount,
     required int typeArgumentCount,
   }) {
@@ -160,7 +159,7 @@
 
   /// Creates the appropriate diagnostic message when the wrong number of type
   /// arguments is applied.
-  LocatableDiagnostic wrongNumberOfTypeArgumentsError({
+  diag.LocatableDiagnostic wrongNumberOfTypeArgumentsError({
     required int typeParameterCount,
     required int typeArgumentCount,
   });
@@ -215,7 +214,7 @@
   const TypeInstantiationTargetTypeDefiningElement();
 
   @override
-  LocatableDiagnostic wrongNumberOfTypeArgumentsError({
+  diag.LocatableDiagnostic wrongNumberOfTypeArgumentsError({
     required int typeParameterCount,
     required int typeArgumentCount,
   }) {
diff --git a/pkg/analyzer/lib/src/diagnostic/diagnostic.dart b/pkg/analyzer/lib/src/diagnostic/diagnostic.dart
index 92c6475..45ce4dd 100644
--- a/pkg/analyzer/lib/src/diagnostic/diagnostic.dart
+++ b/pkg/analyzer/lib/src/diagnostic/diagnostic.dart
@@ -2,12 +2,320 @@
 // 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.
 
-/// @docImport 'package:analyzer/src/error/inference_error.dart';
+/// @docImport 'package:analyzer/diagnostic/diagnostic.dart';
+/// @docImport 'package:analyzer/error/listener.dart';
 library;
 
+import 'package:_fe_analyzer_shared/src/base/analyzer_public_api.dart';
 import 'package:_fe_analyzer_shared/src/base/errors.dart';
+import 'package:analyzer/dart/ast/syntactic_entity.dart';
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/dart/element/type.dart';
+import 'package:analyzer/source/source_range.dart';
 import 'package:analyzer/src/diagnostic/diagnostic.dart' as diag;
+import 'package:source_span/source_span.dart';
 
 part 'package:analyzer/src/diagnostic/diagnostic.g.dart';
+
+/// Private subtype of [DiagnosticCode] that supports runtime checking of
+/// parameter types.
+class DiagnosticCodeWithExpectedTypes extends DiagnosticCodeImpl {
+  final List<ExpectedType>? expectedTypes;
+
+  const DiagnosticCodeWithExpectedTypes({
+    super.correctionMessage,
+    super.hasPublishedDocs = false,
+    super.isUnresolvedIdentifier = false,
+    required super.name,
+    required super.problemMessage,
+    required super.type,
+    required super.uniqueName,
+    this.expectedTypes,
+  });
+}
+
+/// A single message associated with a [Diagnostic], consisting of the text of
+/// the message and the location associated with it.
+///
+/// Clients may not extend, implement or mix-in this class.
+@AnalyzerPublicApi(
+  message: 'Exported by package:analyzer/diagnostic/diagnostic.dart',
+)
+abstract class DiagnosticMessage {
+  /// The absolute and normalized path of the file associated with this message.
+  String get filePath;
+
+  /// The length of the source range associated with this message.
+  int get length;
+
+  /// The zero-based offset from the start of the file to the beginning of the
+  /// source range associated with this message.
+  int get offset;
+
+  /// The URL containing documentation about this diagnostic message, if any.
+  ///
+  /// Note: this should not be confused with the location in the user's code
+  /// where the error was reported; that information can be obtained from
+  /// [filePath], [length], and [offset].
+  String? get url;
+
+  /// Gets the text of the message.
+  ///
+  /// If [includeUrl] is `true`, and this diagnostic message has an associated
+  /// URL, it is included in the returned value in a human-readable way.
+  /// Clients that wish to present URLs as simple text can do this. If
+  /// [includeUrl] is `false`, no URL is included in the returned value.
+  /// Clients that have a special mechanism for presenting URLs (e.g. as a
+  /// clickable link) should do this and then consult the [url] getter to access
+  /// the URL.
+  String messageText({required bool includeUrl});
+}
+
+/// A concrete implementation of a diagnostic message.
+class DiagnosticMessageImpl implements DiagnosticMessage {
+  @override
+  final String filePath;
+
+  @override
+  final int length;
+
+  final String _message;
+
+  @override
+  final int offset;
+
+  @override
+  final String? url;
+
+  /// Initialize a newly created message to represent a [message] reported in
+  /// the file at the given [filePath] at the given [offset] and with the given
+  /// [length].
+  DiagnosticMessageImpl({
+    required this.filePath,
+    required this.length,
+    required String message,
+    required this.offset,
+    required this.url,
+  }) : _message = message;
+
+  @override
+  String messageText({required bool includeUrl}) {
+    if (includeUrl && url != null) {
+      var result = StringBuffer(_message);
+      if (!_message.endsWith('.')) {
+        result.write('.');
+      }
+      result.write('  See $url');
+      return result.toString();
+    }
+    return _message;
+  }
+}
+
+/// Common functionality for [DiagnosticCode]-derived classes that represent
+/// errors that take arguments.
+///
+/// This class provides a [withArguments] getter, which can be used to supply
+/// arguments and produce a [LocatableDiagnostic].
+///
+/// Note: the type argument `T` should be instantiated with a function type. But
+/// it is typed as `extends Object` in order to reduce the risk of accidental
+/// dynamic invocation of [withArguments].
+class DiagnosticWithArguments<T extends Object>
+    extends DiagnosticCodeWithExpectedTypes {
+  /// Function accepting named arguments and returning [LocatableDiagnostic].
+  ///
+  /// The value returned by this function can
+  /// be associated with a location in the source code using the
+  /// [LocatableDiagnostic.at] method, and then the result can be passed to
+  /// [DiagnosticReporter.reportError].
+  final T withArguments;
+
+  const DiagnosticWithArguments({
+    required super.name,
+    required super.problemMessage,
+    super.correctionMessage,
+    super.hasPublishedDocs = false,
+    super.isUnresolvedIdentifier = false,
+    required super.type,
+    required super.uniqueName,
+    required super.expectedTypes,
+    required this.withArguments,
+  });
+}
+
+/// Common functionality for [DiagnosticCode]-derived classes that represent
+/// errors that do not take arguments.
+///
+/// This class implements [LocatableDiagnostic], which means that instances can
+/// be associated with a location in the source code using the [at] method, and
+/// then the result can be passed to [DiagnosticReporter.reportError].
+base mixin DiagnosticWithoutArguments on DiagnosticCodeImpl
+    implements LocatableDiagnostic {
+  @override
+  List<Object> get arguments => const [];
+
+  @override
+  DiagnosticCode get code => this;
+
+  @override
+  Iterable<DiagnosticMessage> get contextMessages => const [];
+
+  @override
+  LocatedDiagnostic at(SyntacticEntity node) =>
+      atOffset(offset: node.offset, length: node.length);
+
+  @override
+  LocatedDiagnostic atOffset({required int offset, required int length}) =>
+      LocatedDiagnostic(this, offset, length);
+
+  @override
+  LocatedDiagnostic atSourceRange(SourceRange sourceRange) =>
+      atOffset(offset: sourceRange.offset, length: sourceRange.length);
+
+  @override
+  LocatedDiagnostic atSourceSpan(SourceSpan span) =>
+      atOffset(offset: span.start.offset, length: span.length);
+
+  @override
+  LocatableDiagnostic withContextMessages(
+    Iterable<DiagnosticMessage> messages,
+  ) => LocatableDiagnosticImpl(code, arguments, contextMessages: [...messages]);
+}
+
+/// Concrete implementation of [DiagnosticWithoutArguments], used for diagnostic
+/// messages that don't take any arguments.
+///
+/// This needs to be a separate class from [DiagnosticWithoutArguments] because
+/// [DiagnosticWithoutArguments] is a mixin.
+final class DiagnosticWithoutArgumentsImpl
+    extends DiagnosticCodeWithExpectedTypes
+    with DiagnosticWithoutArguments {
+  const DiagnosticWithoutArgumentsImpl({
+    required super.name,
+    required super.problemMessage,
+    super.correctionMessage,
+    super.hasPublishedDocs = false,
+    super.isUnresolvedIdentifier = false,
+    required super.type,
+    required super.uniqueName,
+    super.expectedTypes,
+  });
+}
+
+/// Expected type of a diagnostic code's parameter.
+enum ExpectedType { element, int, name, object, string, token, type, uri }
+
+/// Interface for a diagnostic that does not have any unfilled template
+/// parameters, and hence is ready to be associated with a location in the
+/// source code.
+///
+/// This could either be the result of calling `withArguments` on a diagnostic
+/// code that requires arguments, or it could be a diagnostic code that doesn't
+/// require arguments.
+abstract final class LocatableDiagnostic {
+  /// The arguments that were applied to the diagnostic, or the empty list if
+  /// [code] doesn't accept any arguments.
+  List<Object> get arguments;
+
+  /// The [DiagnosticCode] associated with the diagnostic.
+  DiagnosticCode get code;
+
+  /// The context messages that were applied to the diagnostic.
+  Iterable<DiagnosticMessage> get contextMessages;
+
+  /// Converts this diagnostic to a [LocatedDiagnostic] by applying it to a
+  /// syntactic entity in the source code.
+  ///
+  /// The result may be passed to [DiagnosticReporter.reportError].
+  LocatedDiagnostic at(SyntacticEntity node);
+
+  /// Converts this diagnostic to a [LocatedDiagnostic] by applying it to a
+  /// location in the source code.
+  ///
+  /// The result may be passed to [DiagnosticReporter.reportError].
+  LocatedDiagnostic atOffset({required int offset, required int length});
+
+  /// Converts this diagnostic to a [LocatedDiagnostic] by applying it to a
+  /// location in the source code.
+  ///
+  /// The result may be passed to [DiagnosticReporter.reportError].
+  LocatedDiagnostic atSourceRange(SourceRange sourceRange);
+
+  /// Converts this diagnostic to a [LocatedDiagnostic] by applying it to a
+  /// location in the source code.
+  ///
+  /// The result may be passed to [DiagnosticReporter.reportError].
+  LocatedDiagnostic atSourceSpan(SourceSpan span);
+
+  /// Attaches context messages to this diagnostic.
+  ///
+  /// The return value is a fresh instance of [LocatableDiagnostic]. This allows
+  /// for a literate style of error reporting, e.g.:
+  /// ```dart
+  /// // For an diagnostic code that doesn't take arguments:
+  /// diagnosticReporter.reportError(
+  ///   diagnosticCode.withContextMessages(messages).at(astNode));
+  ///
+  /// // For a diagnostic code that does take arguments:
+  /// diagnosticReporter.reportError(
+  ///   diagnosticCode
+  ///     .withArguments(...)
+  ///     .withContextMessages(messages)
+  ///     .at(astNode));
+  /// ```
+  LocatableDiagnostic withContextMessages(Iterable<DiagnosticMessage> messages);
+}
+
+/// Concrete implementation of [LocatableDiagnostic].
+final class LocatableDiagnosticImpl implements LocatableDiagnostic {
+  @override
+  final DiagnosticCode code;
+
+  @override
+  final List<Object> arguments;
+
+  @override
+  final Iterable<DiagnosticMessage> contextMessages;
+
+  LocatableDiagnosticImpl(
+    this.code,
+    this.arguments, {
+    this.contextMessages = const [],
+  });
+
+  @override
+  LocatedDiagnostic at(SyntacticEntity node) =>
+      atOffset(offset: node.offset, length: node.length);
+
+  @override
+  LocatedDiagnostic atOffset({required int offset, required int length}) =>
+      LocatedDiagnostic(this, offset, length);
+
+  @override
+  LocatedDiagnostic atSourceRange(SourceRange sourceRange) =>
+      atOffset(offset: sourceRange.offset, length: sourceRange.length);
+
+  @override
+  LocatedDiagnostic atSourceSpan(SourceSpan span) =>
+      atOffset(offset: span.start.offset, length: span.length);
+
+  @override
+  LocatableDiagnostic withContextMessages(
+    Iterable<DiagnosticMessage> messages,
+  ) => LocatableDiagnosticImpl(
+    code,
+    arguments,
+    contextMessages: [...contextMessages, ...messages],
+  );
+}
+
+/// A diagnostic that does not have any unfilled template parameters, and has
+/// been associated with a location in the source code.
+final class LocatedDiagnostic {
+  final LocatableDiagnostic locatableDiagnostic;
+  final int offset;
+  final int length;
+
+  LocatedDiagnostic(this.locatableDiagnostic, this.offset, this.length);
+}
diff --git a/pkg/analyzer/lib/src/diagnostic/diagnostic.g.dart b/pkg/analyzer/lib/src/diagnostic/diagnostic.g.dart
index 51b80b7..3206103 100644
--- a/pkg/analyzer/lib/src/diagnostic/diagnostic.g.dart
+++ b/pkg/analyzer/lib/src/diagnostic/diagnostic.g.dart
@@ -956,6 +956,28 @@
       expectedTypes: [],
     );
 
+/// Parameters:
+/// Type expectedType: the return type of the declaration
+/// Type actualType: the return type of the augmentation
+const DiagnosticWithArguments<
+  LocatableDiagnostic Function({
+    required DartType expectedType,
+    required DartType actualType,
+  })
+>
+augmentationReturnTypeMismatch = DiagnosticWithArguments(
+  name: 'augmentation_return_type_mismatch',
+  problemMessage:
+      "The augmentation's return type '{1}' must be the same as the introductory "
+      "declaration's return type '{0}'.",
+  correctionMessage:
+      "Try changing the augmentation's return type to match the declaration.",
+  type: DiagnosticType.COMPILE_TIME_ERROR,
+  uniqueName: 'augmentation_return_type_mismatch',
+  withArguments: _withArgumentsAugmentationReturnTypeMismatch,
+  expectedTypes: [ExpectedType.type, ExpectedType.type],
+);
+
 /// No parameters.
 const DiagnosticWithoutArguments augmentationTypeParameterBound =
     DiagnosticWithoutArgumentsImpl(
@@ -18279,6 +18301,16 @@
   ]);
 }
 
+LocatableDiagnostic _withArgumentsAugmentationReturnTypeMismatch({
+  required DartType expectedType,
+  required DartType actualType,
+}) {
+  return LocatableDiagnosticImpl(diag.augmentationReturnTypeMismatch, [
+    expectedType,
+    actualType,
+  ]);
+}
+
 LocatableDiagnostic _withArgumentsAugmentedExpressionNotOperator({
   required String operator,
 }) {
diff --git a/pkg/analyzer/lib/src/diagnostic/diagnostic_code_values.g.dart b/pkg/analyzer/lib/src/diagnostic/diagnostic_code_values.g.dart
index 18f9d74..30fc439 100644
--- a/pkg/analyzer/lib/src/diagnostic/diagnostic_code_values.g.dart
+++ b/pkg/analyzer/lib/src/diagnostic/diagnostic_code_values.g.dart
@@ -74,6 +74,7 @@
   diag.augmentationModifierMissing,
   diag.augmentationOfDifferentDeclarationKind,
   diag.augmentationOfMixinApplicationClass,
+  diag.augmentationReturnTypeMismatch,
   diag.augmentationTypeParameterBound,
   diag.augmentationTypeParameterCount,
   diag.augmentationTypeParameterName,
diff --git a/pkg/analyzer/lib/src/diagnostic/diagnostic_factory.dart b/pkg/analyzer/lib/src/diagnostic/diagnostic_factory.dart
index 2402c06..92b5304 100644
--- a/pkg/analyzer/lib/src/diagnostic/diagnostic_factory.dart
+++ b/pkg/analyzer/lib/src/diagnostic/diagnostic_factory.dart
@@ -2,7 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:_fe_analyzer_shared/src/base/errors.dart';
 import 'package:analyzer/dart/ast/syntactic_entity.dart';
 import 'package:analyzer/dart/ast/token.dart';
 import 'package:analyzer/dart/element/element.dart';
@@ -10,14 +9,15 @@
 import 'package:analyzer/source/source.dart';
 import 'package:analyzer/src/dart/ast/ast.dart';
 import 'package:analyzer/src/dart/element/element.dart';
+import 'package:analyzer/src/diagnostic/diagnostic.dart'
+    show DiagnosticMessageImpl;
 import 'package:analyzer/src/diagnostic/diagnostic.dart' as diag;
-import 'package:analyzer/src/diagnostic/diagnostic_message.dart';
 import 'package:analyzer/src/utilities/extensions/string.dart';
 import 'package:yaml/yaml.dart';
 
 typedef InvalidOverrideDiagnosticCode =
-    DiagnosticWithArguments<
-      LocatableDiagnostic Function({
+    diag.DiagnosticWithArguments<
+      diag.LocatableDiagnostic Function({
         required String memberName,
         required String declaringInterfaceName,
         required DartType typeInDeclaringInterface,
@@ -33,7 +33,7 @@
 
   /// Return a diagnostic indicating that [duplicate] uses the same [variable]
   /// as a previous [original] node in a pattern assignment.
-  LocatedDiagnostic duplicateAssignmentPatternVariable({
+  diag.LocatedDiagnostic duplicateAssignmentPatternVariable({
     required Source source,
     required PromotableElementImpl variable,
     required AssignedVariablePatternImpl original,
@@ -55,8 +55,8 @@
 
   /// Return a diagnostic indicating that [duplicateFragment] reuses a name
   /// already used by [originalElement].
-  LocatedDiagnostic duplicateDefinition(
-    LocatableDiagnostic locatableDiagnostic,
+  diag.LocatedDiagnostic duplicateDefinition(
+    diag.LocatableDiagnostic locatableDiagnostic,
     FragmentImpl duplicateFragment,
     ElementImpl originalElement,
   ) {
@@ -81,9 +81,9 @@
 
   /// Return a diagnostic indicating that [duplicateNode] reuses a name
   /// already used by [originalNode].
-  LocatedDiagnostic duplicateDefinitionForNodes(
+  diag.LocatedDiagnostic duplicateDefinitionForNodes(
     Source source,
-    LocatableDiagnostic locatableDiagnostic,
+    diag.LocatableDiagnostic locatableDiagnostic,
     SyntacticEntity duplicateNode,
     SyntacticEntity originalNode,
   ) {
@@ -102,7 +102,7 @@
 
   /// Return a diagnostic indicating that [duplicateField] reuses a name
   /// already used by [originalField].
-  LocatedDiagnostic duplicateFieldDefinitionInLiteral(
+  diag.LocatedDiagnostic duplicateFieldDefinitionInLiteral(
     Source source,
     RecordLiteralNamedField duplicateField,
     RecordLiteralNamedField originalField,
@@ -128,7 +128,7 @@
   ///
   /// This method requires that both the [duplicateField] and [originalField]
   /// have a non-null `name`.
-  LocatedDiagnostic duplicateFieldDefinitionInType(
+  diag.LocatedDiagnostic duplicateFieldDefinitionInType(
     Source source,
     RecordTypeAnnotationField duplicateField,
     RecordTypeAnnotationField originalField,
@@ -151,7 +151,7 @@
 
   /// Return a diagnostic indicating that [duplicateField] reuses a name
   /// already used by [originalField].
-  LocatedDiagnostic duplicatePatternField({
+  diag.LocatedDiagnostic duplicatePatternField({
     required Source source,
     required String name,
     required PatternField duplicateField,
@@ -177,7 +177,7 @@
 
   /// Return a diagnostic indicating that [duplicateElement] reuses a name
   /// already used by [originalElement].
-  LocatedDiagnostic duplicateRestElementInPattern({
+  diag.LocatedDiagnostic duplicateRestElementInPattern({
     required Source source,
     required RestPatternElement originalElement,
     required RestPatternElement duplicateElement,
@@ -197,7 +197,7 @@
 
   /// Return a diagnostic indicating that the [duplicateElement] (in a constant
   /// set) is a duplicate of the [originalElement].
-  LocatedDiagnostic equalElementsInConstSet(
+  diag.LocatedDiagnostic equalElementsInConstSet(
     Source source,
     Expression duplicateElement,
     Expression originalElement,
@@ -217,7 +217,7 @@
 
   /// Return a diagnostic indicating that the [duplicateKey] (in a constant map)
   /// is a duplicate of the [originalKey].
-  LocatedDiagnostic equalKeysInConstMap(
+  diag.LocatedDiagnostic equalKeysInConstMap(
     Source source,
     Expression duplicateKey,
     Expression originalKey,
@@ -237,7 +237,7 @@
 
   /// Return a diagnostic indicating that the [duplicateKey] (in a map pattern)
   /// is a duplicate of the [originalKey].
-  LocatedDiagnostic equalKeysInMapPattern(
+  diag.LocatedDiagnostic equalKeysInMapPattern(
     Source source,
     Expression duplicateKey,
     Expression originalKey,
@@ -255,7 +255,7 @@
         .at(duplicateKey);
   }
 
-  LocatedDiagnostic incompatibleLint({
+  diag.LocatedDiagnostic incompatibleLint({
     required Source source,
     required YamlScalar reference,
     required Map<String, YamlScalar> incompatibleRules,
@@ -286,7 +286,7 @@
 
   /// Returns a diagnostic indicating that incompatible rules were found between
   /// the current list and one or more of the included files.
-  LocatedDiagnostic incompatibleLintFiles({
+  diag.LocatedDiagnostic incompatibleLintFiles({
     required Source source,
     required YamlScalar reference,
     required Map<String, YamlScalar> incompatibleRules,
@@ -318,7 +318,7 @@
 
   /// Returns a diagnostic indicating that incompatible rules were found between
   /// the included files.
-  LocatedDiagnostic incompatibleLintIncluded({
+  diag.LocatedDiagnostic incompatibleLintIncluded({
     required Source source,
     required YamlScalar reference,
     required Map<String, YamlScalar> incompatibleRules,
@@ -353,7 +353,7 @@
 
   /// Return a diagnostic indicating that [member] is not a correct override of
   /// [superMember].
-  LocatedDiagnostic invalidOverride(
+  diag.LocatedDiagnostic invalidOverride(
     Source source,
     InvalidOverrideDiagnosticCode code,
     SyntacticEntity errorNode,
@@ -403,7 +403,7 @@
 
   /// Return a diagnostic indicating that the given [nameToken] was referenced
   /// before it was declared.
-  LocatedDiagnostic referencedBeforeDeclaration(
+  diag.LocatedDiagnostic referencedBeforeDeclaration(
     Source source, {
     required Token nameToken,
     required Element element2,
diff --git a/pkg/analyzer/lib/src/diagnostic/diagnostic_message.dart b/pkg/analyzer/lib/src/diagnostic/diagnostic_message.dart
deleted file mode 100644
index d7957cc..0000000
--- a/pkg/analyzer/lib/src/diagnostic/diagnostic_message.dart
+++ /dev/null
@@ -1,6 +0,0 @@
-// 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.
-
-export 'package:_fe_analyzer_shared/src/base/diagnostic_message.dart'
-    show DiagnosticMessageImpl;
diff --git a/pkg/analyzer/lib/src/error/base_or_final_type_verifier.dart b/pkg/analyzer/lib/src/error/base_or_final_type_verifier.dart
index 22475ed..95cbae4 100644
--- a/pkg/analyzer/lib/src/error/base_or_final_type_verifier.dart
+++ b/pkg/analyzer/lib/src/error/base_or_final_type_verifier.dart
@@ -6,12 +6,12 @@
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/dart/element/type.dart';
-import 'package:analyzer/diagnostic/diagnostic.dart';
 import 'package:analyzer/source/source.dart';
 import 'package:analyzer/src/dart/element/element.dart';
 import 'package:analyzer/src/dart/element/extensions.dart';
+import 'package:analyzer/src/diagnostic/diagnostic.dart'
+    show DiagnosticMessage, DiagnosticMessageImpl;
 import 'package:analyzer/src/diagnostic/diagnostic.dart' as diag;
-import 'package:analyzer/src/diagnostic/diagnostic_message.dart';
 import 'package:analyzer/src/error/listener.dart';
 
 /// Helper for verifying that subelements of a base or final element must be
diff --git a/pkg/analyzer/lib/src/error/codes.dart b/pkg/analyzer/lib/src/error/codes.dart
index 5d85c48..b9b85f3 100644
--- a/pkg/analyzer/lib/src/error/codes.dart
+++ b/pkg/analyzer/lib/src/error/codes.dart
@@ -2,7 +2,5 @@
 // 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.
 
-export 'package:_fe_analyzer_shared/src/base/errors.dart'
-    show LocatableDiagnosticImpl;
 export 'package:analyzer/src/dart/error/lint_codes.dart';
 export 'package:analyzer/src/dart/error/todo_codes.dart';
diff --git a/pkg/analyzer/lib/src/error/constructor_fields_verifier.dart b/pkg/analyzer/lib/src/error/constructor_fields_verifier.dart
index c2c23e3..32c57a5 100644
--- a/pkg/analyzer/lib/src/error/constructor_fields_verifier.dart
+++ b/pkg/analyzer/lib/src/error/constructor_fields_verifier.dart
@@ -5,7 +5,6 @@
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/source/source_range.dart';
 import 'package:analyzer/src/dart/ast/ast.dart';
-import 'package:analyzer/src/dart/ast/extensions.dart';
 import 'package:analyzer/src/dart/element/type_system.dart';
 import 'package:analyzer/src/diagnostic/diagnostic.dart' as diag;
 import 'package:analyzer/src/error/listener.dart';
diff --git a/pkg/analyzer/lib/src/error/deprecated_functionality_verifier.dart b/pkg/analyzer/lib/src/error/deprecated_functionality_verifier.dart
index 3f20814..16d55dd 100644
--- a/pkg/analyzer/lib/src/error/deprecated_functionality_verifier.dart
+++ b/pkg/analyzer/lib/src/error/deprecated_functionality_verifier.dart
@@ -6,7 +6,6 @@
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/source/source_range.dart';
 import 'package:analyzer/src/dart/ast/ast.dart';
-import 'package:analyzer/src/dart/ast/extensions.dart';
 import 'package:analyzer/src/diagnostic/diagnostic.dart' as diag;
 import 'package:analyzer/src/error/listener.dart';
 import 'package:analyzer/src/error/super_formal_parameters_verifier.dart';
diff --git a/pkg/analyzer/lib/src/error/inheritance_override.dart b/pkg/analyzer/lib/src/error/inheritance_override.dart
index da85204..97812c1 100644
--- a/pkg/analyzer/lib/src/error/inheritance_override.dart
+++ b/pkg/analyzer/lib/src/error/inheritance_override.dart
@@ -23,7 +23,6 @@
 import 'package:analyzer/src/error/inference_error.dart';
 import 'package:analyzer/src/error/listener.dart';
 import 'package:analyzer/src/summary2/types_builder.dart';
-import 'package:analyzer/src/utilities/extensions/element.dart';
 
 final _missingMustBeOverridden = Expando<List<ExecutableElement>>();
 final _missingOverrides = Expando<List<InternalExecutableElement>>();
@@ -233,7 +232,12 @@
 
     // Report conflicts between direct superinterfaces of the class.
     for (var conflict in interface.conflicts) {
-      _reportInconsistentInheritance(classNameToken, conflict);
+      var errorToken = switch (conflict) {
+        GetterMethodConflict() =>
+          _declaredMemberName(conflict.name) ?? classNameToken,
+        _ => classNameToken,
+      };
+      _reportInconsistentInheritance(errorToken, conflict);
     }
 
     if (element.supertype != null) {
@@ -298,7 +302,7 @@
         _checkDeclaredMember(
           member.name,
           libraryUri,
-          member.declaredFragment!.asElement2,
+          member.declaredFragment!.element,
           methodParameterNodes: member.parameters?.parameters,
         );
         if (!(member.isStatic || member.isAbstract || member.isSetter)) {
@@ -747,6 +751,30 @@
     return true;
   }
 
+  /// Returns the name token for a member declared in this class or mixin that
+  /// matches [name], so getter/method inheritance conflicts can be reported at
+  /// the overriding declaration instead of the class or mixin name.
+  Token? _declaredMemberName(Name name) {
+    for (var member in members) {
+      if (member is FieldDeclarationImpl) {
+        for (var field in member.fields.variables) {
+          var fieldFragment = field.declaredFragment as FieldFragmentImpl;
+          var fieldElement = fieldFragment.element;
+          if (fieldElement.getter?.lookupName == name.name) {
+            return field.name;
+          }
+        }
+      } else if (member is MethodDeclarationImpl) {
+        var methodFragment = member.declaredFragment!;
+        var methodElement = methodFragment.element;
+        if (methodElement.lookupName == name.name) {
+          return member.name;
+        }
+      }
+    }
+    return null;
+  }
+
   /// If [name] is not implemented in the extended concrete class, the
   /// issue should be fixed there, and then [classElement] will not have it too.
   bool _isNotImplementedInConcreteSuperClass(Name name) {
@@ -806,7 +834,7 @@
     return false;
   }
 
-  void _reportInconsistentInheritance(Token token, Conflict conflict) {
+  void _reportInconsistentInheritance(Token errorToken, Conflict conflict) {
     var name = conflict.name;
 
     if (conflict is GetterMethodConflict) {
@@ -821,7 +849,7 @@
               getterInterface: conflict.getter.enclosingElement!.name!,
               methodInterface: conflict.method.enclosingElement!.name!,
             )
-            .at(token),
+            .at(errorToken),
       );
     } else if (conflict is CandidatesConflict) {
       var candidatesStr = conflict.candidates
@@ -835,7 +863,7 @@
       reporter.report(
         diag.inconsistentInheritance
             .withArguments(name: name.name, inheritedSignatures: candidatesStr)
-            .at(token),
+            .at(errorToken),
       );
     } else {
       throw StateError('${conflict.runtimeType}');
diff --git a/pkg/analyzer/lib/src/error/listener.dart b/pkg/analyzer/lib/src/error/listener.dart
index 890de75..8fd9f4c 100644
--- a/pkg/analyzer/lib/src/error/listener.dart
+++ b/pkg/analyzer/lib/src/error/listener.dart
@@ -13,11 +13,16 @@
 import 'package:analyzer/source/source.dart';
 import 'package:analyzer/source/source_range.dart';
 import 'package:analyzer/src/dart/ast/ast.dart';
-import 'package:analyzer/src/dart/ast/extensions.dart';
 import 'package:analyzer/src/dart/element/element.dart';
 import 'package:analyzer/src/dart/element/extensions.dart';
 import 'package:analyzer/src/dart/element/type.dart';
-import 'package:analyzer/src/diagnostic/diagnostic_message.dart';
+import 'package:analyzer/src/diagnostic/diagnostic.dart'
+    show
+        DiagnosticCodeWithExpectedTypes,
+        DiagnosticMessage,
+        DiagnosticMessageImpl,
+        ExpectedType,
+        LocatedDiagnostic;
 import 'package:analyzer/src/utilities/extensions/collection.dart';
 import 'package:meta/meta.dart';
 import 'package:source_span/source_span.dart';
diff --git a/pkg/analyzer/lib/src/error/literal_element_verifier.dart b/pkg/analyzer/lib/src/error/literal_element_verifier.dart
index 3b8916f..40c6cd8 100644
--- a/pkg/analyzer/lib/src/error/literal_element_verifier.dart
+++ b/pkg/analyzer/lib/src/error/literal_element_verifier.dart
@@ -120,12 +120,15 @@
         }
       case NullAwareElementImpl():
         if (forList || forSet) {
-          if (elementType is! VoidType &&
-              _errorVerifier.checkForUseOfVoidResult(element.value)) {
+          var valueType = element.value.typeOrThrow;
+          // A null-aware marker tests this expression for `null`, so a `void`
+          // value is used even when the stored element type is also `void`.
+          if (valueType is VoidType) {
+            _errorVerifier.checkForUseOfVoidResult(element.value);
             return;
           }
           _checkAssignableToElementType(
-            typeSystem.promoteToNonNull(element.value.typeOrThrow),
+            typeSystem.promoteToNonNull(valueType),
             element,
           );
         } else {
@@ -140,18 +143,35 @@
   /// and [mapValueType].
   void _verifyMapLiteralEntry(MapLiteralEntry entry) {
     var mapKeyType = this.mapKeyType!;
+    var keyType = entry.key.typeOrThrow;
+
+    // A null-aware marker tests this expression for `null`, so a `void` value
+    // is used even when the stored key type is also `void`.
+    if (entry.keyQuestion != null && keyType is VoidType) {
+      _errorVerifier.checkForUseOfVoidResult(entry.key);
+      return;
+    }
+
     if (mapKeyType is! VoidType &&
         _errorVerifier.checkForUseOfVoidResult(entry.key)) {
       return;
     }
 
     var mapValueType = this.mapValueType!;
+    var valueType = entry.value.typeOrThrow;
+
+    // A null-aware marker tests this expression for `null`, so a `void` value
+    // is used even when the stored value type is also `void`.
+    if (entry.valueQuestion != null && valueType is VoidType) {
+      _errorVerifier.checkForUseOfVoidResult(entry.value);
+      return;
+    }
+
     if (mapValueType is! VoidType &&
         _errorVerifier.checkForUseOfVoidResult(entry.value)) {
       return;
     }
 
-    var keyType = entry.key.typeOrThrow;
     // If the key is null-aware, the entry is only added when the key is not
     // `null`, so the key type to check should be promoted to non-null.
     if (entry.keyQuestion != null) {
@@ -182,7 +202,6 @@
       }
     }
 
-    var valueType = entry.value.typeOrThrow;
     // If the value is null-aware, the entry is only added when the value is not
     // `null`, so the value type to check should be promoted to non-null.
     if (entry.valueQuestion != null) {
diff --git a/pkg/analyzer/lib/src/error/member_duplicate_definition_verifier.dart b/pkg/analyzer/lib/src/error/member_duplicate_definition_verifier.dart
index c5a8482..63e9ce4 100644
--- a/pkg/analyzer/lib/src/error/member_duplicate_definition_verifier.dart
+++ b/pkg/analyzer/lib/src/error/member_duplicate_definition_verifier.dart
@@ -6,7 +6,6 @@
 import 'package:analyzer/src/dart/analysis/file_analysis.dart';
 import 'package:analyzer/src/dart/analysis/file_state.dart';
 import 'package:analyzer/src/dart/ast/ast.dart';
-import 'package:analyzer/src/dart/ast/extensions.dart';
 import 'package:analyzer/src/dart/element/element.dart';
 import 'package:analyzer/src/dart/element/extensions.dart';
 import 'package:analyzer/src/dart/element/inheritance_manager3.dart';
diff --git a/pkg/analyzer/lib/src/error/type_arguments_verifier.dart b/pkg/analyzer/lib/src/error/type_arguments_verifier.dart
index 887c30f..7f2a409 100644
--- a/pkg/analyzer/lib/src/error/type_arguments_verifier.dart
+++ b/pkg/analyzer/lib/src/error/type_arguments_verifier.dart
@@ -8,15 +8,15 @@
 import 'package:analyzer/dart/analysis/features.dart';
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/dart/element/type.dart';
-import 'package:analyzer/diagnostic/diagnostic.dart';
 import 'package:analyzer/src/dart/ast/ast.dart';
 import 'package:analyzer/src/dart/ast/extensions.dart';
 import 'package:analyzer/src/dart/element/element.dart';
 import 'package:analyzer/src/dart/element/type.dart';
 import 'package:analyzer/src/dart/element/type_algebra.dart';
 import 'package:analyzer/src/dart/element/type_system.dart';
+import 'package:analyzer/src/diagnostic/diagnostic.dart'
+    show DiagnosticMessage, DiagnosticMessageImpl;
 import 'package:analyzer/src/diagnostic/diagnostic.dart' as diag;
-import 'package:analyzer/src/diagnostic/diagnostic_message.dart';
 import 'package:analyzer/src/error/codes.dart';
 import 'package:analyzer/src/error/listener.dart';
 
diff --git a/pkg/analyzer/lib/src/fasta/ast_builder.dart b/pkg/analyzer/lib/src/fasta/ast_builder.dart
index d47b97a..bdf6deb 100644
--- a/pkg/analyzer/lib/src/fasta/ast_builder.dart
+++ b/pkg/analyzer/lib/src/fasta/ast_builder.dart
@@ -392,11 +392,13 @@
   void beginFactory(
     DeclarationKind declarationKind,
     Token lastConsumed,
+    Token? augmentToken,
     Token? externalToken,
     Token? constToken,
   ) {
     push(
       _Modifiers()
+        ..augmentKeyword = augmentToken
         ..externalKeyword = externalToken
         ..finalConstOrVarKeyword = constToken,
     );
diff --git a/pkg/analyzer/lib/src/fasta/error_converter.dart b/pkg/analyzer/lib/src/fasta/error_converter.dart
index f73ea6e..f4b3b20 100644
--- a/pkg/analyzer/lib/src/fasta/error_converter.dart
+++ b/pkg/analyzer/lib/src/fasta/error_converter.dart
@@ -6,6 +6,7 @@
 import 'package:_fe_analyzer_shared/src/messages/codes.dart' show Code, Message;
 import 'package:_fe_analyzer_shared/src/messages/diagnostic.dart';
 import 'package:analyzer/dart/ast/token.dart' show Token;
+import 'package:analyzer/diagnostic/diagnostic.dart';
 import 'package:analyzer/src/diagnostic/diagnostic.dart' as diag;
 import 'package:analyzer/src/diagnostic/diagnostic_code_values.dart';
 import 'package:analyzer/src/error/listener.dart';
@@ -378,7 +379,7 @@
     reportByCode(code.pseudoSharedCode, offset, length, message);
   }
 
-  void reportScannerError(LocatedDiagnostic locatedDiagnostic) {
+  void reportScannerError(diag.LocatedDiagnostic locatedDiagnostic) {
     diagnosticReporter?.report(locatedDiagnostic);
   }
 
diff --git a/pkg/analyzer/lib/src/generated/error_verifier.dart b/pkg/analyzer/lib/src/generated/error_verifier.dart
index b42c9c0..dcff777 100644
--- a/pkg/analyzer/lib/src/generated/error_verifier.dart
+++ b/pkg/analyzer/lib/src/generated/error_verifier.dart
@@ -15,7 +15,6 @@
 import 'package:analyzer/dart/ast/visitor.dart';
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/dart/element/type.dart';
-import 'package:analyzer/diagnostic/diagnostic.dart';
 import 'package:analyzer/source/source_range.dart';
 import 'package:analyzer/src/dart/analysis/analysis_options.dart';
 import 'package:analyzer/src/dart/analysis/file_state.dart';
@@ -32,9 +31,10 @@
 import 'package:analyzer/src/dart/element/well_bounded.dart';
 import 'package:analyzer/src/dart/resolver/flow_analysis_visitor.dart';
 import 'package:analyzer/src/dart/resolver/scope.dart';
+import 'package:analyzer/src/diagnostic/diagnostic.dart'
+    show DiagnosticMessage, DiagnosticMessageImpl;
 import 'package:analyzer/src/diagnostic/diagnostic.dart' as diag;
 import 'package:analyzer/src/diagnostic/diagnostic_factory.dart';
-import 'package:analyzer/src/diagnostic/diagnostic_message.dart';
 import 'package:analyzer/src/error/codes.dart';
 import 'package:analyzer/src/error/const_argument_verifier.dart';
 import 'package:analyzer/src/error/constructor_fields_verifier.dart';
@@ -517,6 +517,14 @@
         node.augmentKeyword,
         declaredFragment,
       );
+      _checkForAugmentationTypeParameters(
+        fragment: declaredFragment,
+        firstTypeParameters: declarationFragment.typeParameters,
+        nameOrKeywordToken: node.namePart.typeName,
+        typeParameterList: node.namePart.typeParameters,
+      );
+      _checkForAugmentationExtendsClauseAlreadyPresent(node, declaredFragment);
+      _checkForClassAugmentationModifierMismatch(node, declaredFragment);
 
       List<ClassMember> members = node.body.members;
       if (!declarationFragment.element.isDartCoreFunction) {
@@ -788,6 +796,13 @@
       var declaredElement = declaredFragment.element;
       var firstFragment = declaredElement.firstFragment;
 
+      _checkForAugmentationTypeParameters(
+        fragment: declaredFragment,
+        firstTypeParameters: firstFragment.typeParameters,
+        nameOrKeywordToken: node.namePart.typeName,
+        typeParameterList: node.namePart.typeParameters,
+      );
+
       var element = declaredFragment.element;
       _enclosingClass = element;
 
@@ -871,6 +886,14 @@
     _checkAugmentationWithoutDeclaration(node.augmentKeyword, declaredFragment);
 
     var declaredElement = declaredFragment.element;
+    var firstFragment = declaredElement.firstFragment;
+
+    _checkForAugmentationTypeParameters(
+      fragment: declaredFragment,
+      firstTypeParameters: firstFragment.typeParameters,
+      nameOrKeywordToken: node.name ?? node.extensionKeyword,
+      typeParameterList: node.typeParameters,
+    );
 
     _enclosingExtension = declaredFragment.asElement2;
     _checkForConflictingExtensionTypeVariableErrorCodes();
@@ -911,6 +934,13 @@
       var declaredElement = declaredFragment.element;
       var firstFragment = declaredElement.firstFragment;
 
+      _checkForAugmentationTypeParameters(
+        fragment: declaredFragment,
+        firstTypeParameters: firstFragment.typeParameters,
+        nameOrKeywordToken: node.primaryConstructor.typeName,
+        typeParameterList: node.primaryConstructor.typeParameters,
+      );
+
       _enclosingClass = firstFragment.asElement2;
 
       _checkForBuiltInIdentifierAsName(
@@ -1100,6 +1130,16 @@
     var element = fragment.element;
 
     _checkAugmentationWithoutDeclaration(node.augmentKeyword, fragment);
+    _checkForAugmentationTypeParameters(
+      fragment: fragment,
+      firstTypeParameters: element.firstFragment.typeParameters,
+      nameOrKeywordToken: node.name,
+      typeParameterList: node.functionExpression.typeParameters,
+    );
+    _checkForAugmentationReturnTypeMismatch(
+      fragment: fragment,
+      returnTypeNode: node.returnType,
+    );
 
     if (element.enclosingElement is! LibraryElement) {
       _hiddenElements!.declare(element);
@@ -1340,6 +1380,16 @@
     var element = fragment.element;
 
     _checkAugmentationWithoutDeclaration(node.augmentKeyword, fragment);
+    _checkForAugmentationTypeParameters(
+      fragment: fragment,
+      firstTypeParameters: element.firstFragment.typeParameters,
+      nameOrKeywordToken: node.name,
+      typeParameterList: node.typeParameters,
+    );
+    _checkForAugmentationReturnTypeMismatch(
+      fragment: fragment,
+      returnTypeNode: node.returnType,
+    );
 
     _withEnclosingExecutable(
       element,
@@ -1436,6 +1486,14 @@
       var declaredElement = declaredFragment.element;
       var firstFragment = declaredElement.firstFragment;
 
+      _checkForAugmentationTypeParameters(
+        fragment: declaredFragment,
+        firstTypeParameters: firstFragment.typeParameters,
+        nameOrKeywordToken: node.name,
+        typeParameterList: node.typeParameters,
+      );
+      _checkForMixinAugmentationModifierMismatch(node, declaredFragment);
+
       _enclosingClass = declaredElement;
 
       _checkForBuiltInIdentifierAsName(
@@ -2201,7 +2259,8 @@
       DartType mixinType = mixinName.typeOrThrow;
       if (mixinType is InterfaceType) {
         mixinTypeIndex++;
-        if (_checkForExtendsOrImplementsDisallowedClass(mixinName)) {
+        if (_checkForExtendsOrImplementsDisallowedClass(mixinName) &&
+            !mixinType.isDartCoreEnum) {
           problemReported = true;
         } else {
           var mixinElement = mixinType.element;
@@ -2476,6 +2535,119 @@
     }
   }
 
+  void _checkForAugmentationExtendsClauseAlreadyPresent(
+    ClassDeclarationImpl node,
+    ClassFragmentImpl declaredFragment,
+  ) {
+    if (node.augmentKeyword == null) {
+      return;
+    }
+
+    var extendsClause = node.extendsClause;
+    if (extendsClause == null) {
+      return;
+    }
+
+    for (var precedingFragment in declaredFragment.precedingFragments) {
+      if (precedingFragment.hasExtendsClause) {
+        diagnosticReporter.report(
+          diag.augmentationExtendsClauseAlreadyPresent
+              .withContextMessages([
+                ?precedingFragment.contextMessageAt(
+                  "The declaration being augmented.",
+                ),
+              ])
+              .at(extendsClause.extendsKeyword),
+        );
+        break;
+      }
+    }
+  }
+
+  void _checkForAugmentationReturnTypeMismatch({
+    required ExecutableFragmentImpl fragment,
+    required TypeAnnotation? returnTypeNode,
+  }) {
+    if (!fragment.isAugmentation) {
+      return;
+    }
+
+    if (returnTypeNode == null) {
+      return;
+    }
+
+    var expectedType = fragment.element.returnType;
+    var actualType = returnTypeNode.typeOrThrow;
+    if (!typeSystem.isEqualTo(actualType, expectedType)) {
+      diagnosticReporter.report(
+        diag.augmentationReturnTypeMismatch
+            .withArguments(expectedType: expectedType, actualType: actualType)
+            .at(returnTypeNode),
+      );
+    }
+  }
+
+  void _checkForAugmentationTypeParameters({
+    required FragmentImpl fragment,
+    required List<TypeParameterFragmentImpl> firstTypeParameters,
+    required Token nameOrKeywordToken,
+    required TypeParameterList? typeParameterList,
+  }) {
+    if (!fragment.isAugmentation) {
+      return;
+    }
+
+    var introductoryCount = firstTypeParameters
+        .takeWhile((p) => !p.isOriginOtherFragmentOfEnclosing)
+        .length;
+
+    // If no type parameter nodes, but introductory has type parameters.
+    if (typeParameterList == null) {
+      if (introductoryCount != 0) {
+        diagnosticReporter.report(
+          diag.augmentationTypeParameterCount.at(nameOrKeywordToken),
+        );
+      }
+      return;
+    }
+
+    // If the number of type parameters does not match, it is an error.
+    if (typeParameterList.typeParameters.length > introductoryCount) {
+      diagnosticReporter.report(
+        diag.augmentationTypeParameterCount.at(
+          typeParameterList.typeParameters[introductoryCount].name,
+        ),
+      );
+      return;
+    } else if (typeParameterList.typeParameters.length < introductoryCount) {
+      diagnosticReporter.report(
+        diag.augmentationTypeParameterCount.at(typeParameterList.rightBracket),
+      );
+      return;
+    }
+
+    for (var i = 0; i < introductoryCount; i++) {
+      var firstTypeParameter = firstTypeParameters[i];
+      var typeParameterNode = typeParameterList.typeParameters[i];
+
+      if (typeParameterNode.name.lexeme != firstTypeParameter.name) {
+        diagnosticReporter.report(
+          diag.augmentationTypeParameterName.at(typeParameterNode.name),
+        );
+      }
+
+      if (typeParameterNode.bound case var boundNode?) {
+        var firstBound = firstTypeParameter.element.bound;
+        if (firstBound == null ||
+            !typeSystem.isEqualTo(boundNode.typeOrThrow, firstBound)) {
+          diagnosticReporter.report(
+            diag.augmentationTypeParameterBound.at(boundNode),
+          );
+        }
+      }
+    }
+  }
+
   void _checkForAwaitInLateLocalVariableInitializer(AwaitExpression node) {
     if (_isInLateLocalVariable.last) {
       diagnosticReporter.report(
@@ -2612,6 +2784,83 @@
     }
   }
 
+  void _checkForClassAugmentationModifierMismatch(
+    ClassDeclarationImpl node,
+    ClassFragmentImpl declaredFragment,
+  ) {
+    var augmentKeyword = node.augmentKeyword;
+    if (augmentKeyword == null) {
+      return;
+    }
+
+    var firstFragment = declaredFragment.element.firstFragment;
+    if (identical(declaredFragment, firstFragment)) {
+      return;
+    }
+
+    void checkModifier({
+      required bool inAugmentation,
+      required bool inIntroductory,
+      required Token? modifierToken,
+      required String modifierName,
+    }) {
+      if (inAugmentation != inIntroductory) {
+        if (inAugmentation) {
+          if (modifierToken != null) {
+            diagnosticReporter.report(
+              diag.augmentationModifierExtra
+                  .withArguments(modifier: modifierName)
+                  .at(modifierToken),
+            );
+          }
+        } else {
+          diagnosticReporter.report(
+            diag.augmentationModifierMissing
+                .withArguments(modifier: modifierName)
+                .at(augmentKeyword),
+          );
+        }
+      }
+    }
+
+    checkModifier(
+      inAugmentation: declaredFragment.isAbstract,
+      inIntroductory: firstFragment.isAbstract,
+      modifierToken: node.abstractKeyword,
+      modifierName: 'abstract',
+    );
+    checkModifier(
+      inAugmentation: declaredFragment.isBase,
+      inIntroductory: firstFragment.isBase,
+      modifierToken: node.baseKeyword,
+      modifierName: 'base',
+    );
+    checkModifier(
+      inAugmentation: declaredFragment.isFinal,
+      inIntroductory: firstFragment.isFinal,
+      modifierToken: node.finalKeyword,
+      modifierName: 'final',
+    );
+    checkModifier(
+      inAugmentation: declaredFragment.isInterface,
+      inIntroductory: firstFragment.isInterface,
+      modifierToken: node.interfaceKeyword,
+      modifierName: 'interface',
+    );
+    checkModifier(
+      inAugmentation: declaredFragment.isSealed,
+      inIntroductory: firstFragment.isSealed,
+      modifierToken: node.sealedKeyword,
+      modifierName: 'sealed',
+    );
+    checkModifier(
+      inAugmentation: declaredFragment.isMixinClass,
+      inIntroductory: firstFragment.isMixinClass,
+      modifierToken: node.mixinKeyword,
+      modifierName: 'mixin',
+    );
+  }
+
   /// Verify that the given class used as a mixin does not declare a generative
   /// constructor. The [mixinName] is the node to report the problem on. The
   /// [mixinElement] is the class being mixed in.
@@ -3590,6 +3839,14 @@
       return true;
     }
 
+    // The element value is implicitly assigned to the loop variable. If the
+    // element type is `void`, the value can only be discarded into a `void`
+    // loop variable.
+    if (sequenceElementType is VoidType && variableType is! VoidType) {
+      diagnosticReporter.report(diag.useOfVoidResult.at(node.iterable));
+      return false;
+    }
+
     if (!typeSystem.isAssignableTo(
       sequenceElementType,
       variableType,
@@ -4802,6 +5059,39 @@
     }
   }
 
+  void _checkForMixinAugmentationModifierMismatch(
+    MixinDeclarationImpl node,
+    MixinFragmentImpl declaredFragment,
+  ) {
+    var augmentKeyword = node.augmentKeyword;
+    if (augmentKeyword == null) {
+      return;
+    }
+
+    var firstFragment = declaredFragment.element.firstFragment;
+    if (identical(declaredFragment, firstFragment)) {
+      return;
+    }
+
+    if (declaredFragment.isBase != firstFragment.isBase) {
+      if (declaredFragment.isBase) {
+        if (node.baseKeyword case var baseKeyword?) {
+          diagnosticReporter.report(
+            diag.augmentationModifierExtra
+                .withArguments(modifier: 'base')
+                .at(baseKeyword),
+          );
+        }
+      } else {
+        diagnosticReporter.report(
+          diag.augmentationModifierMissing
+              .withArguments(modifier: 'base')
+              .at(augmentKeyword),
+        );
+      }
+    }
+  }
+
   /// Verify that mixin classes must have 'Object' as their superclass and that
   /// they do not declare a non-trivial generative constructor.
   ///
@@ -5374,11 +5664,14 @@
 
     if (fieldDeclaration != null) {
       if (!fieldDeclaration.isStatic) {
-        var variableList = fieldDeclaration.fields;
-        if (!variableList.isFinal) {
-          diagnosticReporter.report(
-            diag.nonFinalFieldInEnum.at(variableList.variables.first.name),
-          );
+        // External fields do not add stored state to the enum instance.
+        if (fieldDeclaration.externalKeyword == null) {
+          var variableList = fieldDeclaration.fields;
+          if (!variableList.isFinal) {
+            diagnosticReporter.report(
+              diag.nonFinalFieldInEnum.at(variableList.variables.first.name),
+            );
+          }
         }
       }
     } else if (primaryConstructor != null) {
@@ -5597,7 +5890,7 @@
 
     NodeList<FormalParameter> formalParameters = parameterList.parameters;
     for (FormalParameter formalParameter in formalParameters) {
-      if (formalParameter.isOptional) {
+      if (!formalParameter.isRequiredPositional) {
         diagnosticReporter.report(
           diag.optionalParameterInOperator.at(formalParameter),
         );
diff --git a/pkg/analyzer/lib/src/generated/resolver.dart b/pkg/analyzer/lib/src/generated/resolver.dart
index a922fb0..afc8f2f 100644
--- a/pkg/analyzer/lib/src/generated/resolver.dart
+++ b/pkg/analyzer/lib/src/generated/resolver.dart
@@ -24,7 +24,6 @@
 import 'package:analyzer/dart/element/scope.dart';
 import 'package:analyzer/dart/element/type.dart';
 import 'package:analyzer/dart/element/type_provider.dart';
-import 'package:analyzer/diagnostic/diagnostic.dart';
 import 'package:analyzer/error/listener.dart';
 import 'package:analyzer/source/source.dart';
 import 'package:analyzer/src/dart/ast/ast.dart';
@@ -67,8 +66,9 @@
 import 'package:analyzer/src/dart/resolver/variable_declaration_resolver.dart';
 import 'package:analyzer/src/dart/resolver/yield_statement_resolver.dart';
 import 'package:analyzer/src/dart/type_instantiation_target.dart';
+import 'package:analyzer/src/diagnostic/diagnostic.dart'
+    show DiagnosticMessage, DiagnosticMessageImpl;
 import 'package:analyzer/src/diagnostic/diagnostic.dart' as diag;
-import 'package:analyzer/src/diagnostic/diagnostic_message.dart';
 import 'package:analyzer/src/error/base_or_final_type_verifier.dart';
 import 'package:analyzer/src/error/bool_expression_verifier.dart';
 import 'package:analyzer/src/error/codes.dart';
@@ -1904,6 +1904,7 @@
       node.visitChildren(this);
       var returnType = _finishFunctionBodyInference();
       flowAnalysis.flow?.anonymousBlockBody_end();
+
       return returnType;
     } finally {
       _bodyContext = oldBodyContext;
@@ -1916,11 +1917,13 @@
     TypeImpl? imposedType,
   }) {
     checkUnreachableNode(node);
+
     analyzeExpression(
       node.expression,
       SharedTypeSchemaView(imposedType ?? UnknownInferredType.instance),
     );
     popRewrite();
+
     return node.expression.staticType ?? typeProvider.dynamicType;
   }
 
@@ -1975,11 +1978,33 @@
       for (var parameter in parameters.parameters) {
         var element = parameter.declaredFragment?.element;
         if (element != null) {
-          flow.declare(
-            element,
-            SharedTypeView(element.type),
-            initialized: true,
-          );
+          if (parameter == parameters.parameters.first) {
+            flow.declare(
+              element,
+              SharedTypeView(element.type),
+              initialized: false,
+            );
+            flow.initialize(
+              element,
+              SharedTypeView(element.type),
+              target != null
+                  ? flowAnalysis.flow?.getExpressionInfo(target)
+                  : null,
+              isFinal: false,
+              isLate: false,
+              isImplicitlyTyped: parameter.type == null,
+              inheritPromotableProperties: false,
+            );
+          } else {
+            // An error will occur because there are multiple parameters, but
+            // those extra parameters should still allow for meaningful analysis
+            // in the body of the anonymous method.
+            flow.declare(
+              element,
+              SharedTypeView(element.type),
+              initialized: true,
+            );
+          }
         }
       }
     }
@@ -1988,11 +2013,24 @@
     if (parameters == null) {
       var oldThisType = _thisType;
       _thisType = parameterType;
+      var target = node.target;
+      var targetInfo = target != null
+          ? flowAnalysis.flow?.getExpressionInfo(target)
+          : null;
+      var body = node.body;
+      flowAnalysis.flow?.thisBinding_begin(targetInfo);
       try {
-        returnedType = node.body.resolve(this, contextType);
+        returnedType = body.resolve(this, contextType);
       } finally {
+        flowAnalysis.flow?.thisBinding_end();
         _thisType = oldThisType;
       }
+      if (body is AnonymousExpressionBodyImpl) {
+        flowAnalysis.flow?.storeExpressionInfo(
+          node,
+          flowAnalysis.flow?.getExpressionInfo(body.expression),
+        );
+      }
     } else {
       returnedType = node.body.resolve(this, contextType);
     }
diff --git a/pkg/analyzer/lib/src/summary2/element_builder.dart b/pkg/analyzer/lib/src/summary2/element_builder.dart
index 3b259be..a3107ae 100644
--- a/pkg/analyzer/lib/src/summary2/element_builder.dart
+++ b/pkg/analyzer/lib/src/summary2/element_builder.dart
@@ -949,19 +949,13 @@
       }
     }
 
-    Iterable<ExecutableFragmentImpl> precedingFragmentsOldestFirst() {
-      return currentFragment.precedingFragments
-          .cast<ExecutableFragmentImpl>()
-          .toList()
-          .reversed;
-    }
-
     void growPrecedingFragmentsWithPositional({
       required int index,
       required FormalParameterFragmentImpl template,
     }) {
       FormalParameterFragmentImpl? previousSyntheticParameter;
-      for (var fragmentToGrow in precedingFragmentsOldestFirst()) {
+      var fragmentsToGrow = currentFragment.precedingFragments.reversed;
+      for (var fragmentToGrow in fragmentsToGrow) {
         var syntheticParameter = createSyntheticFragment(template);
 
         var newParameters = fragmentToGrow.formalParameters.toList();
@@ -977,7 +971,8 @@
       FormalParameterFragmentImpl currentParameter,
     ) {
       FormalParameterFragmentImpl? previousSyntheticParameter;
-      for (var fragmentToGrow in precedingFragmentsOldestFirst()) {
+      var fragmentsToGrow = currentFragment.precedingFragments.reversed;
+      for (var fragmentToGrow in fragmentsToGrow) {
         var syntheticParameter = createSyntheticFragment(currentParameter);
 
         fragmentToGrow.formalParameters = [
@@ -1101,9 +1096,7 @@
 
     // Grow all previous fragments if current fragment has more type parameters.
     if (previousTypeParameters.length < currentTypeParameters.length) {
-      var fragmentsToGrow = currentFragment.precedingFragments
-          .toList()
-          .reversed;
+      var fragmentsToGrow = currentFragment.precedingFragments.reversed;
       for (
         var i = previousTypeParameters.length;
         i < currentTypeParameters.length;
@@ -1252,10 +1245,7 @@
     fragment.isFinal = node.finalKeyword != null;
     fragment.isInterface = node.interfaceKeyword != null;
     fragment.isMixinClass = node.mixinKeyword != null;
-    if (node.sealedKeyword != null) {
-      fragment.isAbstract = true;
-      fragment.isSealed = true;
-    }
+    fragment.isSealed = node.sealedKeyword != null;
     fragment.hasExtendsClause = node.extendsClause != null;
     fragment.metadata = _buildMetadata(node.metadata);
 
@@ -1288,10 +1278,7 @@
     fragment.isInterface = node.interfaceKeyword != null;
     fragment.isMixinApplication = true;
     fragment.isMixinClass = node.mixinKeyword != null;
-    if (node.sealedKeyword != null) {
-      fragment.isAbstract = true;
-      fragment.isSealed = true;
-    }
+    fragment.isSealed = node.sealedKeyword != null;
     fragment.metadata = _buildMetadata(node.metadata);
 
     node.declaredFragment = fragment;
@@ -1731,8 +1718,7 @@
     executableFragment.isAsynchronous = body.isAsynchronous;
     executableFragment.isExternal = node.externalKeyword != null;
     executableFragment.isGenerator = body.isGenerator;
-    executableFragment.isCompleteDeclaration =
-        executableFragment.isExternal || body is! EmptyFunctionBody;
+    executableFragment.isCompleteDeclaration = node.isCompleteDeclaration;
     executableFragment.metadata = _buildMetadata(node.metadata);
 
     node.declaredFragment = executableFragment;
@@ -1874,8 +1860,7 @@
     executableFragment.isExternal =
         node.externalKeyword != null || node.body is NativeFunctionBody;
     executableFragment.isGenerator = node.body.isGenerator;
-    executableFragment.isCompleteDeclaration =
-        executableFragment.isExternal || node.body is! EmptyFunctionBody;
+    executableFragment.isCompleteDeclaration = node.isCompleteDeclaration;
     executableFragment.metadata = _buildMetadata(node.metadata);
 
     node.declaredFragment = executableFragment;
@@ -2301,27 +2286,6 @@
   }
 }
 
-extension _ConstructorDeclarationImplExtension on ConstructorDeclarationImpl {
-  bool get isCompleteDeclaration {
-    if (externalKeyword != null) {
-      return true;
-    }
-
-    if (body is! EmptyFunctionBody) {
-      return true;
-    }
-
-    if (redirectedConstructor != null || initializers.isNotEmpty) {
-      return true;
-    }
-
-    return parameters.parameters.any((parameter) {
-      return parameter is FieldFormalParameterImpl ||
-          parameter is SuperFormalParameterImpl;
-    });
-  }
-}
-
 extension _LinkerExtension on Linker {
   DeclaringFormalParameterInfo? getDeclaringFormalInfo(
     FormalParameterImpl node,
diff --git a/pkg/analyzer/lib/src/summary2/types_builder.dart b/pkg/analyzer/lib/src/summary2/types_builder.dart
index 4638099..016cf1c 100644
--- a/pkg/analyzer/lib/src/summary2/types_builder.dart
+++ b/pkg/analyzer/lib/src/summary2/types_builder.dart
@@ -281,21 +281,22 @@
   }
 
   void _functionDeclaration(FunctionDeclarationImpl node) {
-    var returnType = node.returnType?.type;
-    if (returnType == null) {
-      if (node.isSetter) {
-        returnType = _voidType;
-      } else {
-        returnType = _dynamicType;
-      }
-    }
-
     var fragment = node.declaredFragment!;
     var element = fragment.element;
+
     if (fragment.previousFragment == null) {
+      var returnType = node.returnType?.type;
+      if (returnType == null) {
+        if (node.isSetter) {
+          returnType = _voidType;
+        } else {
+          returnType = _dynamicType;
+        }
+      }
+
       element.returnType = returnType;
+      _setSyntheticVariableType(element);
     }
-    _setSyntheticVariableType(element);
   }
 
   void _functionTypeAlias(FunctionTypeAliasImpl node) {
@@ -346,21 +347,24 @@
   }
 
   void _methodDeclaration(MethodDeclarationImpl node) {
-    var returnType = node.returnType?.type;
-    if (returnType == null) {
-      if (node.isSetter) {
-        returnType = _voidType;
-      } else if (node.isOperator && node.name.lexeme == '[]=') {
-        returnType = _voidType;
-      } else {
-        returnType = _dynamicType;
-      }
-    }
-
     var fragment = node.declaredFragment!;
     var element = fragment.element;
-    element.returnType = returnType;
-    _setSyntheticVariableType(element);
+
+    if (fragment.previousFragment == null) {
+      var returnType = node.returnType?.type;
+      if (returnType == null) {
+        if (node.isSetter) {
+          returnType = _voidType;
+        } else if (node.isOperator && node.name.lexeme == '[]=') {
+          returnType = _voidType;
+        } else {
+          returnType = _dynamicType;
+        }
+      }
+
+      element.returnType = returnType;
+      _setSyntheticVariableType(element);
+    }
   }
 
   void _mixinDeclaration(MixinDeclarationImpl node) {
diff --git a/pkg/analyzer/lib/src/test_utilities/find_node.dart b/pkg/analyzer/lib/src/test_utilities/find_node.dart
index 7827931..9924d3d 100644
--- a/pkg/analyzer/lib/src/test_utilities/find_node.dart
+++ b/pkg/analyzer/lib/src/test_utilities/find_node.dart
@@ -215,6 +215,8 @@
 
   WithClause get singleWithClause => _single();
 
+  YieldStatement get singleYieldStatement => _single();
+
   AdjacentStrings adjacentStrings(String search) {
     return _node(search, (n) => n is AdjacentStrings);
   }
diff --git a/pkg/analyzer/lib/src/utilities/extensions/element.dart b/pkg/analyzer/lib/src/utilities/extensions/element.dart
index ef5b0c7..abadc80 100644
--- a/pkg/analyzer/lib/src/utilities/extensions/element.dart
+++ b/pkg/analyzer/lib/src/utilities/extensions/element.dart
@@ -8,7 +8,8 @@
 import 'package:analyzer/src/dart/element/element.dart';
 import 'package:analyzer/src/dart/element/member.dart';
 import 'package:analyzer/src/dart/element/type.dart';
-import 'package:analyzer/src/diagnostic/diagnostic_message.dart';
+import 'package:analyzer/src/diagnostic/diagnostic.dart'
+    show DiagnosticMessageImpl;
 import 'package:meta/meta.dart';
 
 class MockLibraryImportElement implements Element {
diff --git a/pkg/analyzer/messages.yaml b/pkg/analyzer/messages.yaml
index 2fd75ca..a3cbc6b 100644
--- a/pkg/analyzer/messages.yaml
+++ b/pkg/analyzer/messages.yaml
@@ -1876,6 +1876,15 @@
     problemMessage: "Mixin application classes can't be augmented."
     correctionMessage: Try removing the 'augment' keyword, or making the target a normal class.
     hasPublishedDocs: false
+  augmentationReturnTypeMismatch:
+    type: compileTimeError
+    parameters:
+      Type expectedType: the return type of the declaration
+      Type actualType: the return type of the augmentation
+    experiment: augmentations
+    problemMessage: "The augmentation's return type '#actualType' must be the same as the introductory declaration's return type '#expectedType'."
+    correctionMessage: Try changing the augmentation's return type to match the declaration.
+    hasPublishedDocs: false
   augmentedExpressionIsNotSetter:
     type: compileTimeError
     parameters: none
diff --git a/pkg/analyzer/test/generated/parser_fasta_listener.dart b/pkg/analyzer/test/generated/parser_fasta_listener.dart
index 75a44a8..132fa36 100644
--- a/pkg/analyzer/test/generated/parser_fasta_listener.dart
+++ b/pkg/analyzer/test/generated/parser_fasta_listener.dart
@@ -245,12 +245,14 @@
   void beginFactory(
     DeclarationKind declarationKind,
     Token lastConsumed,
+    Token? augmentToken,
     Token? externalToken,
     Token? constToken,
   ) {
     super.beginFactory(
       declarationKind,
       lastConsumed,
+      augmentToken,
       externalToken,
       constToken,
     );
diff --git a/pkg/analyzer/test/generated/recovery_parser_test.dart b/pkg/analyzer/test/generated/recovery_parser_test.dart
index c531073..4b9baf2 100644
--- a/pkg/analyzer/test/generated/recovery_parser_test.dart
+++ b/pkg/analyzer/test/generated/recovery_parser_test.dart
@@ -2,7 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/src/diagnostic/diagnostic.dart' as diag;
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../src/dart/resolution/node_text_expectations.dart';
@@ -23,8 +22,10 @@
   void test_additiveExpression_missing_LHS() {
     var parseResult = parseStringWithErrors(r'''
 var v = + y;
+//      ^
+// [diag.missingIdentifier] Expected an identifier.
 ''');
-    parseResult.assertErrors([error(diag.missingIdentifier, 8, 1)]);
+    parseResult.assertExpectedDiagnostics();
     var node = parseResult.findNode.singleVariableDeclaration.initializer!;
     assertParsedNodeText(node, r'''
 BinaryExpression
@@ -39,11 +40,12 @@
   void test_additiveExpression_missing_LHS_RHS() {
     var parseResult = parseStringWithErrors(r'''
 var v = +;
+//      ^
+// [diag.missingIdentifier] Expected an identifier.
+//       ^
+// [diag.missingIdentifier] Expected an identifier.
 ''');
-    parseResult.assertErrors([
-      error(diag.missingIdentifier, 8, 1),
-      error(diag.missingIdentifier, 9, 1),
-    ]);
+    parseResult.assertExpectedDiagnostics();
     var node = parseResult.findNode.singleVariableDeclaration.initializer!;
     assertParsedNodeText(node, r'''
 BinaryExpression
@@ -58,8 +60,10 @@
   void test_additiveExpression_missing_RHS() {
     var parseResult = parseStringWithErrors(r'''
 var v = x +;
+//         ^
+// [diag.missingIdentifier] Expected an identifier.
 ''');
-    parseResult.assertErrors([error(diag.missingIdentifier, 11, 1)]);
+    parseResult.assertExpectedDiagnostics();
     var node = parseResult.findNode.singleVariableDeclaration.initializer!;
     assertParsedNodeText(node, r'''
 BinaryExpression
@@ -74,8 +78,10 @@
   void test_additiveExpression_missing_RHS_super() {
     var parseResult = parseStringWithErrors(r'''
 var v = super +;
+//             ^
+// [diag.missingIdentifier] Expected an identifier.
 ''');
-    parseResult.assertErrors([error(diag.missingIdentifier, 15, 1)]);
+    parseResult.assertExpectedDiagnostics();
     var node = parseResult.findNode.singleVariableDeclaration.initializer!;
     assertParsedNodeText(node, r'''
 BinaryExpression
@@ -90,12 +96,14 @@
   void test_additiveExpression_precedence_multiplicative_left() {
     var parseResult = parseStringWithErrors(r'''
 var v = * +;
+//      ^
+// [diag.missingIdentifier] Expected an identifier.
+//        ^
+// [diag.missingIdentifier] Expected an identifier.
+//         ^
+// [diag.missingIdentifier] Expected an identifier.
 ''');
-    parseResult.assertErrors([
-      error(diag.missingIdentifier, 8, 1),
-      error(diag.missingIdentifier, 10, 1),
-      error(diag.missingIdentifier, 11, 1),
-    ]);
+    parseResult.assertExpectedDiagnostics();
     var node = parseResult.findNode.singleVariableDeclaration.initializer!;
     assertParsedNodeText(node, r'''
 BinaryExpression
@@ -114,12 +122,14 @@
   void test_additiveExpression_precedence_multiplicative_right() {
     var parseResult = parseStringWithErrors(r'''
 var v = + *;
+//      ^
+// [diag.missingIdentifier] Expected an identifier.
+//        ^
+// [diag.missingIdentifier] Expected an identifier.
+//         ^
+// [diag.missingIdentifier] Expected an identifier.
 ''');
-    parseResult.assertErrors([
-      error(diag.missingIdentifier, 8, 1),
-      error(diag.missingIdentifier, 10, 1),
-      error(diag.missingIdentifier, 11, 1),
-    ]);
+    parseResult.assertExpectedDiagnostics();
     var node = parseResult.findNode.singleVariableDeclaration.initializer!;
     assertParsedNodeText(node, r'''
 BinaryExpression
@@ -138,11 +148,12 @@
   void test_additiveExpression_super() {
     var parseResult = parseStringWithErrors(r'''
 var v = super + +;
+//              ^
+// [diag.missingIdentifier] Expected an identifier.
+//               ^
+// [diag.missingIdentifier] Expected an identifier.
 ''');
-    parseResult.assertErrors([
-      error(diag.missingIdentifier, 16, 1),
-      error(diag.missingIdentifier, 17, 1),
-    ]);
+    parseResult.assertExpectedDiagnostics();
     var node = parseResult.findNode.singleVariableDeclaration.initializer!;
     assertParsedNodeText(node, r'''
 BinaryExpression
@@ -161,8 +172,10 @@
   void test_assignableSelector() {
     var parseResult = parseStringWithErrors(r'''
 var v = a.b[];
+//          ^
+// [diag.missingIdentifier] Expected an identifier.
 ''');
-    parseResult.assertErrors([error(diag.missingIdentifier, 12, 1)]);
+    parseResult.assertExpectedDiagnostics();
     var node = parseResult.findNode.singleVariableDeclaration.initializer!;
     assertParsedNodeText(node, r'''
 IndexExpression
@@ -182,8 +195,10 @@
   void test_assignmentExpression_missing_compound1() {
     var parseResult = parseStringWithErrors(r'''
 var v = = y = 0;
+//      ^
+// [diag.missingIdentifier] Expected an identifier.
 ''');
-    parseResult.assertErrors([error(diag.missingIdentifier, 8, 1)]);
+    parseResult.assertExpectedDiagnostics();
     var node = parseResult.findNode.singleVariableDeclaration.initializer!;
     assertParsedNodeText(node, r'''
 AssignmentExpression
@@ -202,8 +217,10 @@
   void test_assignmentExpression_missing_compound2() {
     var parseResult = parseStringWithErrors(r'''
 var v = x = = 0;
+//          ^
+// [diag.missingIdentifier] Expected an identifier.
 ''');
-    parseResult.assertErrors([error(diag.missingIdentifier, 12, 1)]);
+    parseResult.assertExpectedDiagnostics();
     var node = parseResult.findNode.singleVariableDeclaration.initializer!;
     assertParsedNodeText(node, r'''
 AssignmentExpression
@@ -222,8 +239,10 @@
   void test_assignmentExpression_missing_compound3() {
     var parseResult = parseStringWithErrors(r'''
 var v = x = y =;
+//             ^
+// [diag.missingIdentifier] Expected an identifier.
 ''');
-    parseResult.assertErrors([error(diag.missingIdentifier, 15, 1)]);
+    parseResult.assertExpectedDiagnostics();
     var node = parseResult.findNode.singleVariableDeclaration.initializer!;
     assertParsedNodeText(node, r'''
 AssignmentExpression
@@ -242,8 +261,10 @@
   void test_assignmentExpression_missing_LHS() {
     var parseResult = parseStringWithErrors(r'''
 var v = = 0;
+//      ^
+// [diag.missingIdentifier] Expected an identifier.
 ''');
-    parseResult.assertErrors([error(diag.missingIdentifier, 8, 1)]);
+    parseResult.assertExpectedDiagnostics();
     var node = parseResult.findNode.singleVariableDeclaration.initializer!;
     assertParsedNodeText(node, r'''
 AssignmentExpression
@@ -258,8 +279,10 @@
   void test_assignmentExpression_missing_RHS() {
     var parseResult = parseStringWithErrors(r'''
 var v = x =;
+//         ^
+// [diag.missingIdentifier] Expected an identifier.
 ''');
-    parseResult.assertErrors([error(diag.missingIdentifier, 11, 1)]);
+    parseResult.assertExpectedDiagnostics();
     var node = parseResult.findNode.singleVariableDeclaration.initializer!;
     assertParsedNodeText(node, r'''
 AssignmentExpression
@@ -274,8 +297,10 @@
   void test_bitwiseAndExpression_missing_LHS() {
     var parseResult = parseStringWithErrors(r'''
 var v = & y;
+//      ^
+// [diag.missingIdentifier] Expected an identifier.
 ''');
-    parseResult.assertErrors([error(diag.missingIdentifier, 8, 1)]);
+    parseResult.assertExpectedDiagnostics();
     var node = parseResult.findNode.singleVariableDeclaration.initializer!;
     assertParsedNodeText(node, r'''
 BinaryExpression
@@ -290,11 +315,12 @@
   void test_bitwiseAndExpression_missing_LHS_RHS() {
     var parseResult = parseStringWithErrors(r'''
 var v = &;
+//      ^
+// [diag.missingIdentifier] Expected an identifier.
+//       ^
+// [diag.missingIdentifier] Expected an identifier.
 ''');
-    parseResult.assertErrors([
-      error(diag.missingIdentifier, 8, 1),
-      error(diag.missingIdentifier, 9, 1),
-    ]);
+    parseResult.assertExpectedDiagnostics();
     var node = parseResult.findNode.singleVariableDeclaration.initializer!;
     assertParsedNodeText(node, r'''
 BinaryExpression
@@ -309,8 +335,10 @@
   void test_bitwiseAndExpression_missing_RHS() {
     var parseResult = parseStringWithErrors(r'''
 var v = x &;
+//         ^
+// [diag.missingIdentifier] Expected an identifier.
 ''');
-    parseResult.assertErrors([error(diag.missingIdentifier, 11, 1)]);
+    parseResult.assertExpectedDiagnostics();
     var node = parseResult.findNode.singleVariableDeclaration.initializer!;
     assertParsedNodeText(node, r'''
 BinaryExpression
@@ -325,8 +353,10 @@
   void test_bitwiseAndExpression_missing_RHS_super() {
     var parseResult = parseStringWithErrors(r'''
 var v = super &;
+//             ^
+// [diag.missingIdentifier] Expected an identifier.
 ''');
-    parseResult.assertErrors([error(diag.missingIdentifier, 15, 1)]);
+    parseResult.assertExpectedDiagnostics();
     var node = parseResult.findNode.singleVariableDeclaration.initializer!;
     assertParsedNodeText(node, r'''
 BinaryExpression
@@ -341,12 +371,14 @@
   void test_bitwiseAndExpression_precedence_equality_left() {
     var parseResult = parseStringWithErrors(r'''
 var v = == &&;
+//      ^^
+// [diag.missingIdentifier] Expected an identifier.
+//         ^^
+// [diag.missingIdentifier] Expected an identifier.
+//           ^
+// [diag.missingIdentifier] Expected an identifier.
 ''');
-    parseResult.assertErrors([
-      error(diag.missingIdentifier, 8, 2),
-      error(diag.missingIdentifier, 11, 2),
-      error(diag.missingIdentifier, 13, 1),
-    ]);
+    parseResult.assertExpectedDiagnostics();
     var node = parseResult.findNode.singleVariableDeclaration.initializer!;
     assertParsedNodeText(node, r'''
 BinaryExpression
@@ -365,12 +397,14 @@
   void test_bitwiseAndExpression_precedence_equality_right() {
     var parseResult = parseStringWithErrors(r'''
 var v = && ==;
+//      ^^
+// [diag.missingIdentifier] Expected an identifier.
+//         ^^
+// [diag.missingIdentifier] Expected an identifier.
+//           ^
+// [diag.missingIdentifier] Expected an identifier.
 ''');
-    parseResult.assertErrors([
-      error(diag.missingIdentifier, 8, 2),
-      error(diag.missingIdentifier, 11, 2),
-      error(diag.missingIdentifier, 13, 1),
-    ]);
+    parseResult.assertExpectedDiagnostics();
     var node = parseResult.findNode.singleVariableDeclaration.initializer!;
     assertParsedNodeText(node, r'''
 BinaryExpression
@@ -389,11 +423,12 @@
   void test_bitwiseAndExpression_super() {
     var parseResult = parseStringWithErrors(r'''
 var v = super &  &;
+//               ^
+// [diag.missingIdentifier] Expected an identifier.
+//                ^
+// [diag.missingIdentifier] Expected an identifier.
 ''');
-    parseResult.assertErrors([
-      error(diag.missingIdentifier, 17, 1),
-      error(diag.missingIdentifier, 18, 1),
-    ]);
+    parseResult.assertExpectedDiagnostics();
     var node = parseResult.findNode.singleVariableDeclaration.initializer!;
     assertParsedNodeText(node, r'''
 BinaryExpression
@@ -412,8 +447,10 @@
   void test_bitwiseOrExpression_missing_LHS() {
     var parseResult = parseStringWithErrors(r'''
 var v = | y;
+//      ^
+// [diag.missingIdentifier] Expected an identifier.
 ''');
-    parseResult.assertErrors([error(diag.missingIdentifier, 8, 1)]);
+    parseResult.assertExpectedDiagnostics();
     var node = parseResult.findNode.singleVariableDeclaration.initializer!;
     assertParsedNodeText(node, r'''
 BinaryExpression
@@ -428,11 +465,12 @@
   void test_bitwiseOrExpression_missing_LHS_RHS() {
     var parseResult = parseStringWithErrors(r'''
 var v = |;
+//      ^
+// [diag.missingIdentifier] Expected an identifier.
+//       ^
+// [diag.missingIdentifier] Expected an identifier.
 ''');
-    parseResult.assertErrors([
-      error(diag.missingIdentifier, 8, 1),
-      error(diag.missingIdentifier, 9, 1),
-    ]);
+    parseResult.assertExpectedDiagnostics();
     var node = parseResult.findNode.singleVariableDeclaration.initializer!;
     assertParsedNodeText(node, r'''
 BinaryExpression
@@ -447,8 +485,10 @@
   void test_bitwiseOrExpression_missing_RHS() {
     var parseResult = parseStringWithErrors(r'''
 var v = x |;
+//         ^
+// [diag.missingIdentifier] Expected an identifier.
 ''');
-    parseResult.assertErrors([error(diag.missingIdentifier, 11, 1)]);
+    parseResult.assertExpectedDiagnostics();
     var node = parseResult.findNode.singleVariableDeclaration.initializer!;
     assertParsedNodeText(node, r'''
 BinaryExpression
@@ -463,8 +503,10 @@
   void test_bitwiseOrExpression_missing_RHS_super() {
     var parseResult = parseStringWithErrors(r'''
 var v = super |;
+//             ^
+// [diag.missingIdentifier] Expected an identifier.
 ''');
-    parseResult.assertErrors([error(diag.missingIdentifier, 15, 1)]);
+    parseResult.assertExpectedDiagnostics();
     var node = parseResult.findNode.singleVariableDeclaration.initializer!;
     assertParsedNodeText(node, r'''
 BinaryExpression
@@ -479,12 +521,14 @@
   void test_bitwiseOrExpression_precedence_xor_left() {
     var parseResult = parseStringWithErrors(r'''
 var v = ^ |;
+//      ^
+// [diag.missingIdentifier] Expected an identifier.
+//        ^
+// [diag.missingIdentifier] Expected an identifier.
+//         ^
+// [diag.missingIdentifier] Expected an identifier.
 ''');
-    parseResult.assertErrors([
-      error(diag.missingIdentifier, 8, 1),
-      error(diag.missingIdentifier, 10, 1),
-      error(diag.missingIdentifier, 11, 1),
-    ]);
+    parseResult.assertExpectedDiagnostics();
     var node = parseResult.findNode.singleVariableDeclaration.initializer!;
     assertParsedNodeText(node, r'''
 BinaryExpression
@@ -503,12 +547,14 @@
   void test_bitwiseOrExpression_precedence_xor_right() {
     var parseResult = parseStringWithErrors(r'''
 var v = | ^;
+//      ^
+// [diag.missingIdentifier] Expected an identifier.
+//        ^
+// [diag.missingIdentifier] Expected an identifier.
+//         ^
+// [diag.missingIdentifier] Expected an identifier.
 ''');
-    parseResult.assertErrors([
-      error(diag.missingIdentifier, 8, 1),
-      error(diag.missingIdentifier, 10, 1),
-      error(diag.missingIdentifier, 11, 1),
-    ]);
+    parseResult.assertExpectedDiagnostics();
     var node = parseResult.findNode.singleVariableDeclaration.initializer!;
     assertParsedNodeText(node, r'''
 BinaryExpression
@@ -527,11 +573,12 @@
   void test_bitwiseOrExpression_super() {
     var parseResult = parseStringWithErrors(r'''
 var v = super |  |;
+//               ^
+// [diag.missingIdentifier] Expected an identifier.
+//                ^
+// [diag.missingIdentifier] Expected an identifier.
 ''');
-    parseResult.assertErrors([
-      error(diag.missingIdentifier, 17, 1),
-      error(diag.missingIdentifier, 18, 1),
-    ]);
+    parseResult.assertExpectedDiagnostics();
     var node = parseResult.findNode.singleVariableDeclaration.initializer!;
     assertParsedNodeText(node, r'''
 BinaryExpression
@@ -550,8 +597,10 @@
   void test_bitwiseXorExpression_missing_LHS() {
     var parseResult = parseStringWithErrors(r'''
 var v = ^ y;
+//      ^
+// [diag.missingIdentifier] Expected an identifier.
 ''');
-    parseResult.assertErrors([error(diag.missingIdentifier, 8, 1)]);
+    parseResult.assertExpectedDiagnostics();
     var node = parseResult.findNode.singleVariableDeclaration.initializer!;
     assertParsedNodeText(node, r'''
 BinaryExpression
@@ -566,11 +615,12 @@
   void test_bitwiseXorExpression_missing_LHS_RHS() {
     var parseResult = parseStringWithErrors(r'''
 var v = ^;
+//      ^
+// [diag.missingIdentifier] Expected an identifier.
+//       ^
+// [diag.missingIdentifier] Expected an identifier.
 ''');
-    parseResult.assertErrors([
-      error(diag.missingIdentifier, 8, 1),
-      error(diag.missingIdentifier, 9, 1),
-    ]);
+    parseResult.assertExpectedDiagnostics();
     var node = parseResult.findNode.singleVariableDeclaration.initializer!;
     assertParsedNodeText(node, r'''
 BinaryExpression
@@ -585,8 +635,10 @@
   void test_bitwiseXorExpression_missing_RHS() {
     var parseResult = parseStringWithErrors(r'''
 var v = x ^;
+//         ^
+// [diag.missingIdentifier] Expected an identifier.
 ''');
-    parseResult.assertErrors([error(diag.missingIdentifier, 11, 1)]);
+    parseResult.assertExpectedDiagnostics();
     var node = parseResult.findNode.singleVariableDeclaration.initializer!;
     assertParsedNodeText(node, r'''
 BinaryExpression
@@ -601,8 +653,10 @@
   void test_bitwiseXorExpression_missing_RHS_super() {
     var parseResult = parseStringWithErrors(r'''
 var v = super ^;
+//             ^
+// [diag.missingIdentifier] Expected an identifier.
 ''');
-    parseResult.assertErrors([error(diag.missingIdentifier, 15, 1)]);
+    parseResult.assertExpectedDiagnostics();
     var node = parseResult.findNode.singleVariableDeclaration.initializer!;
     assertParsedNodeText(node, r'''
 BinaryExpression
@@ -617,12 +671,14 @@
   void test_bitwiseXorExpression_precedence_and_left() {
     var parseResult = parseStringWithErrors(r'''
 var v = & ^;
+//      ^
+// [diag.missingIdentifier] Expected an identifier.
+//        ^
+// [diag.missingIdentifier] Expected an identifier.
+//         ^
+// [diag.missingIdentifier] Expected an identifier.
 ''');
-    parseResult.assertErrors([
-      error(diag.missingIdentifier, 8, 1),
-      error(diag.missingIdentifier, 10, 1),
-      error(diag.missingIdentifier, 11, 1),
-    ]);
+    parseResult.assertExpectedDiagnostics();
     var node = parseResult.findNode.singleVariableDeclaration.initializer!;
     assertParsedNodeText(node, r'''
 BinaryExpression
@@ -641,12 +697,14 @@
   void test_bitwiseXorExpression_precedence_and_right() {
     var parseResult = parseStringWithErrors(r'''
 var v = ^ &;
+//      ^
+// [diag.missingIdentifier] Expected an identifier.
+//        ^
+// [diag.missingIdentifier] Expected an identifier.
+//         ^
+// [diag.missingIdentifier] Expected an identifier.
 ''');
-    parseResult.assertErrors([
-      error(diag.missingIdentifier, 8, 1),
-      error(diag.missingIdentifier, 10, 1),
-      error(diag.missingIdentifier, 11, 1),
-    ]);
+    parseResult.assertExpectedDiagnostics();
     var node = parseResult.findNode.singleVariableDeclaration.initializer!;
     assertParsedNodeText(node, r'''
 BinaryExpression
@@ -665,11 +723,12 @@
   void test_bitwiseXorExpression_super() {
     var parseResult = parseStringWithErrors(r'''
 var v = super ^  ^;
+//               ^
+// [diag.missingIdentifier] Expected an identifier.
+//                ^
+// [diag.missingIdentifier] Expected an identifier.
 ''');
-    parseResult.assertErrors([
-      error(diag.missingIdentifier, 17, 1),
-      error(diag.missingIdentifier, 18, 1),
-    ]);
+    parseResult.assertExpectedDiagnostics();
     var node = parseResult.findNode.singleVariableDeclaration.initializer!;
     assertParsedNodeText(node, r'''
 BinaryExpression
@@ -689,11 +748,12 @@
     var parseResult = parseStringWithErrors(r'''
 class A {}
 class B = Object with A {}
+//                    ^
+// [diag.expectedToken] Expected to find ';'.
+//                      ^
+// [diag.expectedExecutable] Expected a method, getter, setter or operator declaration.
 ''');
-    parseResult.assertErrors([
-      error(diag.expectedToken, 33, 1),
-      error(diag.expectedExecutable, 35, 1),
-    ]);
+    parseResult.assertExpectedDiagnostics();
     var node = parseResult.findNode.unit;
     assertParsedNodeText(node, r'''
 CompilationUnit
@@ -723,12 +783,13 @@
   void test_combinator_badIdentifier() {
     var parseResult = parseStringWithErrors(r'''
 import "/testB.dart" show @
+//                        ^
+// [diag.missingIdentifier] Expected an identifier.
+// [diag.expectedToken] Expected to find ';'.
+//                         ^
+// [diag.missingConstFinalVarOrType][column 28][length 0] Variables must be declared using the keywords 'const', 'final', 'var' or a type name.
 ''');
-    parseResult.assertErrors([
-      error(diag.missingIdentifier, 26, 1),
-      error(diag.expectedToken, 26, 1),
-      error(diag.missingConstFinalVarOrType, 28, 0),
-    ]);
+    parseResult.assertExpectedDiagnostics();
     var node = parseResult.findNode.unit;
     assertParsedNodeText(node, r'''
 CompilationUnit
@@ -757,8 +818,10 @@
   void test_combinator_missingIdentifier() {
     var parseResult = parseStringWithErrors(r'''
 import "/testB.dart" show ;
+//                        ^
+// [diag.missingIdentifier] Expected an identifier.
 ''');
-    parseResult.assertErrors([error(diag.missingIdentifier, 26, 1)]);
+    parseResult.assertExpectedDiagnostics();
     var node = parseResult.findNode.unit;
     assertParsedNodeText(node, r'''
 CompilationUnit
@@ -780,8 +843,10 @@
   void test_conditionalExpression_missingElse() {
     var parseResult = parseStringWithErrors(r'''
 var v = x ? y :;
+//             ^
+// [diag.missingIdentifier] Expected an identifier.
 ''');
-    parseResult.assertErrors([error(diag.missingIdentifier, 15, 1)]);
+    parseResult.assertExpectedDiagnostics();
     var node = parseResult.findNode.singleVariableDeclaration.initializer!;
     assertParsedNodeText(node, r'''
 ConditionalExpression
@@ -799,8 +864,10 @@
   void test_conditionalExpression_missingThen() {
     var parseResult = parseStringWithErrors(r'''
 var v = x ? : z;
+//          ^
+// [diag.missingIdentifier] Expected an identifier.
 ''');
-    parseResult.assertErrors([error(diag.missingIdentifier, 12, 1)]);
+    parseResult.assertExpectedDiagnostics();
     var node = parseResult.findNode.singleVariableDeclaration.initializer!;
     assertParsedNodeText(node, r'''
 ConditionalExpression
@@ -818,8 +885,10 @@
   void test_conditionalExpression_super() {
     var parseResult = parseStringWithErrors(r'''
 var v = x ? super : z;
+//          ^^^^^
+// [diag.missingAssignableSelector] Missing selector such as '.identifier' or '[0]'.
 ''');
-    parseResult.assertErrors([error(diag.missingAssignableSelector, 12, 5)]);
+    parseResult.assertExpectedDiagnostics();
     var node = parseResult.findNode.singleVariableDeclaration.initializer!;
     assertParsedNodeText(node, r'''
 ConditionalExpression
@@ -837,8 +906,10 @@
   void test_conditionalExpression_super2() {
     var parseResult = parseStringWithErrors(r'''
 var v = x ? z : super;
+//              ^^^^^
+// [diag.missingAssignableSelector] Missing selector such as '.identifier' or '[0]'.
 ''');
-    parseResult.assertErrors([error(diag.missingAssignableSelector, 16, 5)]);
+    parseResult.assertExpectedDiagnostics();
     var node = parseResult.findNode.singleVariableDeclaration.initializer!;
     assertParsedNodeText(node, r'''
 ConditionalExpression
@@ -856,8 +927,10 @@
   void test_declarationBeforeDirective() {
     var parseResult = parseStringWithErrors(r'''
 class foo { } import 'bar.dart';
+//            ^^^^^^
+// [diag.directiveAfterDeclaration] Directives must appear before any declarations.
 ''');
-    parseResult.assertErrors([error(diag.directiveAfterDeclaration, 14, 6)]);
+    parseResult.assertExpectedDiagnostics();
     var node = parseResult.findNode.unit;
     assertParsedNodeText(node, r'''
 CompilationUnit
@@ -881,8 +954,10 @@
   void test_dotShorthand_missing_identifier() {
     var parseResult = parseStringWithErrors(r'''
 var v = .;
+//       ^
+// [diag.missingIdentifier] Expected an identifier.
 ''');
-    parseResult.assertErrors([error(diag.missingIdentifier, 9, 1)]);
+    parseResult.assertExpectedDiagnostics();
     var node = parseResult.findNode.singleVariableDeclaration.initializer!;
     assertParsedNodeText(node, r'''
 DotShorthandPropertyAccess
@@ -896,8 +971,10 @@
   void test_equalityExpression_missing_LHS() {
     var parseResult = parseStringWithErrors(r'''
 var v = == y;
+//      ^^
+// [diag.missingIdentifier] Expected an identifier.
 ''');
-    parseResult.assertErrors([error(diag.missingIdentifier, 8, 2)]);
+    parseResult.assertExpectedDiagnostics();
     var node = parseResult.findNode.singleVariableDeclaration.initializer!;
     assertParsedNodeText(node, r'''
 BinaryExpression
@@ -912,11 +989,12 @@
   void test_equalityExpression_missing_LHS_RHS() {
     var parseResult = parseStringWithErrors(r'''
 var v = ==;
+//      ^^
+// [diag.missingIdentifier] Expected an identifier.
+//        ^
+// [diag.missingIdentifier] Expected an identifier.
 ''');
-    parseResult.assertErrors([
-      error(diag.missingIdentifier, 8, 2),
-      error(diag.missingIdentifier, 10, 1),
-    ]);
+    parseResult.assertExpectedDiagnostics();
     var node = parseResult.findNode.singleVariableDeclaration.initializer!;
     assertParsedNodeText(node, r'''
 BinaryExpression
@@ -931,8 +1009,10 @@
   void test_equalityExpression_missing_RHS() {
     var parseResult = parseStringWithErrors(r'''
 var v = x ==;
+//          ^
+// [diag.missingIdentifier] Expected an identifier.
 ''');
-    parseResult.assertErrors([error(diag.missingIdentifier, 12, 1)]);
+    parseResult.assertExpectedDiagnostics();
     var node = parseResult.findNode.singleVariableDeclaration.initializer!;
     assertParsedNodeText(node, r'''
 BinaryExpression
@@ -947,8 +1027,10 @@
   void test_equalityExpression_missing_RHS_super() {
     var parseResult = parseStringWithErrors(r'''
 var v = super ==;
+//              ^
+// [diag.missingIdentifier] Expected an identifier.
 ''');
-    parseResult.assertErrors([error(diag.missingIdentifier, 16, 1)]);
+    parseResult.assertExpectedDiagnostics();
     var node = parseResult.findNode.singleVariableDeclaration.initializer!;
     assertParsedNodeText(node, r'''
 BinaryExpression
@@ -963,12 +1045,14 @@
   void test_equalityExpression_precedence_relational_right() {
     var parseResult = parseStringWithErrors(r'''
 var v = == is;
+//      ^^
+// [diag.missingIdentifier] Expected an identifier.
+//         ^^
+// [diag.missingIdentifier] Expected an identifier.
+//           ^
+// [diag.expectedTypeName] Expected a type name.
 ''');
-    parseResult.assertErrors([
-      error(diag.missingIdentifier, 8, 2),
-      error(diag.missingIdentifier, 11, 2),
-      error(diag.expectedTypeName, 13, 1),
-    ]);
+    parseResult.assertExpectedDiagnostics();
     var node = parseResult.findNode.singleVariableDeclaration.initializer!;
     assertParsedNodeText(node, r'''
 BinaryExpression
@@ -987,12 +1071,13 @@
   void test_equalityExpression_super() {
     var parseResult = parseStringWithErrors(r'''
 var v = super ==  ==;
+//                ^^
+// [diag.missingIdentifier] Expected an identifier.
+// [diag.equalityCannotBeEqualityOperand] A comparison expression can't be an operand of another comparison expression.
+//                  ^
+// [diag.missingIdentifier] Expected an identifier.
 ''');
-    parseResult.assertErrors([
-      error(diag.missingIdentifier, 18, 2),
-      error(diag.equalityCannotBeEqualityOperand, 18, 2),
-      error(diag.missingIdentifier, 20, 1),
-    ]);
+    parseResult.assertExpectedDiagnostics();
     var node = parseResult.findNode.singleVariableDeclaration.initializer!;
     assertParsedNodeText(node, r'''
 BinaryExpression
@@ -1011,8 +1096,10 @@
   void test_equalityExpression_superRHS() {
     var parseResult = parseStringWithErrors(r'''
 var v = 1 == super;
+//           ^^^^^
+// [diag.missingAssignableSelector] Missing selector such as '.identifier' or '[0]'.
 ''');
-    parseResult.assertErrors([error(diag.missingAssignableSelector, 13, 5)]);
+    parseResult.assertExpectedDiagnostics();
     var node = parseResult.findNode.singleVariableDeclaration.initializer!;
     assertParsedNodeText(node, r'''
 BinaryExpression
@@ -1027,8 +1114,10 @@
   void test_expressionList_multiple_end() {
     var parseResult = parseStringWithErrors(r'''
 var v = [, 2, 3, 4];
+//       ^
+// [diag.missingIdentifier] Expected an identifier.
 ''');
-    parseResult.assertErrors([error(diag.missingIdentifier, 9, 1)]);
+    parseResult.assertExpectedDiagnostics();
     var node = parseResult.findNode.singleListLiteral;
     assertParsedNodeText(node, r'''
 ListLiteral
@@ -1049,8 +1138,10 @@
   void test_expressionList_multiple_middle() {
     var parseResult = parseStringWithErrors(r'''
 var v = [1, 2, , 4];
+//             ^
+// [diag.missingIdentifier] Expected an identifier.
 ''');
-    parseResult.assertErrors([error(diag.missingIdentifier, 15, 1)]);
+    parseResult.assertExpectedDiagnostics();
     var node = parseResult.findNode.singleListLiteral;
     assertParsedNodeText(node, r'''
 ListLiteral
@@ -1072,7 +1163,7 @@
     var parseResult = parseStringWithErrors(r'''
 var v = [1, 2, 3];
 ''');
-    parseResult.assertNoErrors();
+    parseResult.assertExpectedDiagnostics();
     var node = parseResult.findNode.singleListLiteral;
     assertParsedNodeText(node, r'''
 ListLiteral
@@ -1091,8 +1182,10 @@
   void test_functionExpression_in_ConstructorFieldInitializer() {
     var parseResult = parseStringWithErrors(r'''
 class A { A() : a = (){}; var v; }
+//                      ^
+// [diag.expectedClassMember] Expected a class member.
 ''');
-    parseResult.assertErrors([error(diag.expectedClassMember, 24, 1)]);
+    parseResult.assertExpectedDiagnostics();
     var node = parseResult.findNode.unit;
     assertParsedNodeText(node, r'''
 CompilationUnit
@@ -1137,11 +1230,12 @@
   void test_functionExpression_named() {
     var parseResult = parseStringWithErrors(r'''
 var v = m(f() => 0);;
+//        ^
+// [diag.namedFunctionExpression] Function expressions can't be named.
+//                  ^
+// [diag.unexpectedToken] Unexpected text ';'.
 ''');
-    parseResult.assertErrors([
-      error(diag.namedFunctionExpression, 10, 1),
-      error(diag.unexpectedToken, 20, 1),
-    ]);
+    parseResult.assertExpectedDiagnostics();
     var node = parseResult.findNode.singleVariableDeclaration.initializer!;
     assertParsedNodeText(node, r'''
 MethodInvocation
@@ -1166,9 +1260,11 @@
     var parseResult = parseStringWithErrors(r'''
 void f() {
   if (x v) f(x);
+//      ^
+// [diag.expectedToken] Expected to find ')'.
 }
 ''');
-    parseResult.assertErrors([error(diag.expectedToken, 19, 1)]);
+    parseResult.assertExpectedDiagnostics();
     var node = parseResult.findNode.firstBlock.statements[0];
     assertParsedNodeText(node, r'''
 IfStatement
@@ -1194,8 +1290,10 @@
   void test_importDirectivePartial_as() {
     var parseResult = parseStringWithErrors(r'''
 import 'b.dart' d as b;
+//              ^
+// [diag.unexpectedToken] Unexpected text 'd'.
 ''');
-    parseResult.assertErrors([error(diag.unexpectedToken, 16, 1)]);
+    parseResult.assertExpectedDiagnostics();
     var node = parseResult.findNode.unit;
     assertParsedNodeText(node, r'''
 CompilationUnit
@@ -1214,8 +1312,10 @@
   void test_importDirectivePartial_hide() {
     var parseResult = parseStringWithErrors(r'''
 import 'b.dart' d hide foo;
+//              ^
+// [diag.unexpectedToken] Unexpected text 'd'.
 ''');
-    parseResult.assertErrors([error(diag.unexpectedToken, 16, 1)]);
+    parseResult.assertExpectedDiagnostics();
     var node = parseResult.findNode.unit;
     assertParsedNodeText(node, r'''
 CompilationUnit
@@ -1237,8 +1337,10 @@
   void test_importDirectivePartial_show() {
     var parseResult = parseStringWithErrors(r'''
 import 'b.dart' d show foo;
+//              ^
+// [diag.unexpectedToken] Unexpected text 'd'.
 ''');
-    parseResult.assertErrors([error(diag.unexpectedToken, 16, 1)]);
+    parseResult.assertExpectedDiagnostics();
     var node = parseResult.findNode.unit;
     assertParsedNodeText(node, r'''
 CompilationUnit
@@ -1260,11 +1362,11 @@
   void test_incomplete_conditionalExpression() {
     var parseResult = parseStringWithErrors(r'''
 var v = x ? 0;
+//           ^
+// [diag.expectedToken] Expected to find ':'.
+// [diag.missingIdentifier] Expected an identifier.
 ''');
-    parseResult.assertErrors([
-      error(diag.expectedToken, 13, 1),
-      error(diag.missingIdentifier, 13, 1),
-    ]);
+    parseResult.assertExpectedDiagnostics();
     var node = parseResult.findNode.singleVariableDeclaration.initializer!;
     assertParsedNodeText(node, r'''
 ConditionalExpression
@@ -1282,12 +1384,13 @@
   void test_incomplete_constructorInitializers_empty() {
     var parseResult = parseStringWithErrors(r'''
 C() : {}
+//  ^
+// [diag.missingFunctionBody] A function body must be provided.
+// [diag.expectedExecutable] Expected a method, getter, setter or operator declaration.
+//    ^
+// [diag.expectedExecutable] Expected a method, getter, setter or operator declaration.
 ''');
-    parseResult.assertErrors([
-      error(diag.missingFunctionBody, 4, 1),
-      error(diag.expectedExecutable, 4, 1),
-      error(diag.expectedExecutable, 6, 1),
-    ]);
+    parseResult.assertExpectedDiagnostics();
     var node = parseResult.findNode.unit;
     assertParsedNodeText(node, r'''
 CompilationUnit
@@ -1308,12 +1411,13 @@
   void test_incomplete_constructorInitializers_missingEquals() {
     var parseResult = parseStringWithErrors(r'''
 C() : x(3) {}
+//  ^
+// [diag.missingFunctionBody] A function body must be provided.
+// [diag.expectedExecutable] Expected a method, getter, setter or operator declaration.
+//      ^
+// [diag.missingIdentifier] Expected an identifier.
 ''');
-    parseResult.assertErrors([
-      error(diag.missingFunctionBody, 4, 1),
-      error(diag.expectedExecutable, 4, 1),
-      error(diag.missingIdentifier, 8, 1),
-    ]);
+    parseResult.assertExpectedDiagnostics();
     var node = parseResult.findNode.unit;
     assertParsedNodeText(node, r'''
 CompilationUnit
@@ -1346,13 +1450,14 @@
   void test_incomplete_constructorInitializers_this() {
     var parseResult = parseStringWithErrors(r'''
 C() : this {}
+//  ^
+// [diag.missingFunctionBody] A function body must be provided.
+// [diag.expectedExecutable] Expected a method, getter, setter or operator declaration.
+//    ^^^^
+// [diag.expectedIdentifierButGotKeyword] 'this' can't be used as an identifier because it's a keyword.
+// [diag.missingFunctionParameters] Functions must have an explicit list of parameters.
 ''');
-    parseResult.assertErrors([
-      error(diag.missingFunctionBody, 4, 1),
-      error(diag.expectedExecutable, 4, 1),
-      error(diag.expectedIdentifierButGotKeyword, 6, 4),
-      error(diag.missingFunctionParameters, 6, 4),
-    ]);
+    parseResult.assertExpectedDiagnostics();
     var node = parseResult.findNode.unit;
     assertParsedNodeText(node, r'''
 CompilationUnit
@@ -1383,16 +1488,19 @@
   void test_incomplete_constructorInitializers_thisField() {
     var parseResult = parseStringWithErrors(r'''
 C() : this.g {}
+//  ^
+// [diag.missingFunctionBody] A function body must be provided.
+// [diag.expectedExecutable] Expected a method, getter, setter or operator declaration.
+//    ^^^^
+// [diag.expectedIdentifierButGotKeyword] 'this' can't be used as an identifier because it's a keyword.
+// [diag.missingFunctionParameters] Functions must have an explicit list of parameters.
+//        ^
+// [diag.missingFunctionBody] A function body must be provided.
+// [diag.expectedExecutable] Expected a method, getter, setter or operator declaration.
+//         ^
+// [diag.missingFunctionParameters] Functions must have an explicit list of parameters.
 ''');
-    parseResult.assertErrors([
-      error(diag.missingFunctionBody, 4, 1),
-      error(diag.expectedExecutable, 4, 1),
-      error(diag.expectedIdentifierButGotKeyword, 6, 4),
-      error(diag.missingFunctionParameters, 6, 4),
-      error(diag.missingFunctionBody, 10, 1),
-      error(diag.expectedExecutable, 10, 1),
-      error(diag.missingFunctionParameters, 11, 1),
-    ]);
+    parseResult.assertExpectedDiagnostics();
     var node = parseResult.findNode.unit;
     assertParsedNodeText(node, r'''
 CompilationUnit
@@ -1433,16 +1541,19 @@
   void test_incomplete_constructorInitializers_thisPeriod() {
     var parseResult = parseStringWithErrors(r'''
 C() : this. {}
+//  ^
+// [diag.missingFunctionBody] A function body must be provided.
+// [diag.expectedExecutable] Expected a method, getter, setter or operator declaration.
+//    ^^^^
+// [diag.expectedIdentifierButGotKeyword] 'this' can't be used as an identifier because it's a keyword.
+// [diag.missingFunctionParameters] Functions must have an explicit list of parameters.
+//        ^
+// [diag.missingFunctionBody] A function body must be provided.
+// [diag.expectedExecutable] Expected a method, getter, setter or operator declaration.
+//          ^
+// [diag.expectedExecutable] Expected a method, getter, setter or operator declaration.
 ''');
-    parseResult.assertErrors([
-      error(diag.missingFunctionBody, 4, 1),
-      error(diag.expectedExecutable, 4, 1),
-      error(diag.expectedIdentifierButGotKeyword, 6, 4),
-      error(diag.missingFunctionParameters, 6, 4),
-      error(diag.missingFunctionBody, 10, 1),
-      error(diag.expectedExecutable, 10, 1),
-      error(diag.expectedExecutable, 12, 1),
-    ]);
+    parseResult.assertExpectedDiagnostics();
     var node = parseResult.findNode.unit;
     assertParsedNodeText(node, r'''
 CompilationUnit
@@ -1473,12 +1584,13 @@
   void test_incomplete_constructorInitializers_variable() {
     var parseResult = parseStringWithErrors(r'''
 C() : x {}
+//  ^
+// [diag.missingFunctionBody] A function body must be provided.
+// [diag.expectedExecutable] Expected a method, getter, setter or operator declaration.
+//    ^
+// [diag.missingFunctionParameters] Functions must have an explicit list of parameters.
 ''');
-    parseResult.assertErrors([
-      error(diag.missingFunctionBody, 4, 1),
-      error(diag.expectedExecutable, 4, 1),
-      error(diag.missingFunctionParameters, 6, 1),
-    ]);
+    parseResult.assertExpectedDiagnostics();
     var node = parseResult.findNode.unit;
     assertParsedNodeText(node, r'''
 CompilationUnit
@@ -1509,8 +1621,10 @@
   void test_incomplete_functionExpression() {
     var parseResult = parseStringWithErrors(r'''
 var v = () a => null;
+//         ^
+// [diag.unexpectedToken] Unexpected text 'a'.
 ''');
-    parseResult.assertErrors([error(diag.unexpectedToken, 11, 1)]);
+    parseResult.assertExpectedDiagnostics();
     var node = parseResult.findNode.singleVariableDeclaration.initializer!;
     assertParsedNodeText(node, r'''
 FunctionExpression
@@ -1527,8 +1641,10 @@
   void test_incomplete_functionExpression2() {
     var parseResult = parseStringWithErrors(r'''
 var v = () a {};
+//         ^
+// [diag.unexpectedToken] Unexpected text 'a'.
 ''');
-    parseResult.assertErrors([error(diag.unexpectedToken, 11, 1)]);
+    parseResult.assertExpectedDiagnostics();
     var node = parseResult.findNode.singleVariableDeclaration.initializer!;
     assertParsedNodeText(node, r'''
 FunctionExpression
@@ -1545,6 +1661,9 @@
   void test_incomplete_returnType() {
     var parseResult = parseStringWithErrors(r'''
 Map<Symbol, convertStringToSymbolMap(Map<String, dynamic> map) {
+// [diag.missingFunctionParameters][column 1][length 3] Functions must have an explicit list of parameters.
+//          ^^^^^^^^^^^^^^^^^^^^^^^^
+// [diag.expectedToken] Expected to find '>'.
   if (map == null) return null;
   Map<Symbol, dynamic> result = new Map<Symbol, dynamic>();
   map.forEach((name, value) {
@@ -1553,10 +1672,7 @@
   return result;
 }
 ''');
-    parseResult.assertErrors([
-      error(diag.expectedToken, 12, 24),
-      error(diag.missingFunctionParameters, 0, 3),
-    ]);
+    parseResult.assertExpectedDiagnostics();
     var node = parseResult.findNode.unit;
     assertParsedNodeText(node, r'''
 CompilationUnit
@@ -1687,7 +1803,7 @@
     var parseResult = parseStringWithErrors(r'''
 foo();
 ''');
-    parseResult.assertNoErrors();
+    parseResult.assertExpectedDiagnostics();
     var node = parseResult.findNode.unit;
     assertParsedNodeText(node, r'''
 CompilationUnit
@@ -1707,8 +1823,10 @@
     var parseResult = parseStringWithErrors(r'''
 // @dart = 3.5
 foo();
+//   ^
+// [diag.missingFunctionBody] A function body must be provided.
 ''');
-    parseResult.assertErrors([error(diag.missingFunctionBody, 20, 1)]);
+    parseResult.assertExpectedDiagnostics();
     var node = parseResult.findNode.unit;
     assertParsedNodeText(node, r'''
 CompilationUnit
@@ -1727,11 +1845,10 @@
   void test_incomplete_topLevelVariable() {
     var parseResult = parseStringWithErrors(r'''
 String
+// [diag.missingConstFinalVarOrType][column 1][length 6] Variables must be declared using the keywords 'const', 'final', 'var' or a type name.
+// [diag.expectedToken][column 1][length 6] Expected to find ';'.
 ''');
-    parseResult.assertErrors([
-      error(diag.missingConstFinalVarOrType, 0, 6),
-      error(diag.expectedToken, 0, 6),
-    ]);
+    parseResult.assertExpectedDiagnostics();
     var node = parseResult.findNode.unit;
     assertParsedNodeText(node, r'''
 CompilationUnit
@@ -1748,11 +1865,11 @@
   void test_incomplete_topLevelVariable_const() {
     var parseResult = parseStringWithErrors(r'''
 const
+// [diag.expectedToken][column 1][length 5] Expected to find ';'.
+//   ^
+// [diag.missingIdentifier][column 6][length 0] Expected an identifier.
 ''');
-    parseResult.assertErrors([
-      error(diag.expectedToken, 0, 5),
-      error(diag.missingIdentifier, 6, 0),
-    ]);
+    parseResult.assertExpectedDiagnostics();
     var node = parseResult.findNode.unit;
     assertParsedNodeText(node, r'''
 CompilationUnit
@@ -1770,11 +1887,11 @@
   void test_incomplete_topLevelVariable_final() {
     var parseResult = parseStringWithErrors(r'''
 final
+// [diag.expectedToken][column 1][length 5] Expected to find ';'.
+//   ^
+// [diag.missingIdentifier][column 6][length 0] Expected an identifier.
 ''');
-    parseResult.assertErrors([
-      error(diag.expectedToken, 0, 5),
-      error(diag.missingIdentifier, 6, 0),
-    ]);
+    parseResult.assertExpectedDiagnostics();
     var node = parseResult.findNode.unit;
     assertParsedNodeText(node, r'''
 CompilationUnit
@@ -1792,11 +1909,11 @@
   void test_incomplete_topLevelVariable_var() {
     var parseResult = parseStringWithErrors(r'''
 var
+// [diag.expectedToken][column 1][length 3] Expected to find ';'.
+// ^
+// [diag.missingIdentifier][column 4][length 0] Expected an identifier.
 ''');
-    parseResult.assertErrors([
-      error(diag.expectedToken, 0, 3),
-      error(diag.missingIdentifier, 4, 0),
-    ]);
+    parseResult.assertExpectedDiagnostics();
     var node = parseResult.findNode.unit;
     assertParsedNodeText(node, r'''
 CompilationUnit
@@ -1815,12 +1932,12 @@
     var parseResult = parseStringWithErrors(r'''
 class C {
   const
+//^^^^^
+// [diag.expectedToken] Expected to find ';'.
 }
+// [diag.missingIdentifier][column 1][length 1] Expected an identifier.
 ''');
-    parseResult.assertErrors([
-      error(diag.expectedToken, 12, 5),
-      error(diag.missingIdentifier, 18, 1),
-    ]);
+    parseResult.assertExpectedDiagnostics();
     var node = parseResult.findNode.unit;
     assertParsedNodeText(node, r'''
 CompilationUnit
@@ -1847,12 +1964,12 @@
     var parseResult = parseStringWithErrors(r'''
 class C {
   final
+//^^^^^
+// [diag.expectedToken] Expected to find ';'.
 }
+// [diag.missingIdentifier][column 1][length 1] Expected an identifier.
 ''');
-    parseResult.assertErrors([
-      error(diag.expectedToken, 12, 5),
-      error(diag.missingIdentifier, 18, 1),
-    ]);
+    parseResult.assertExpectedDiagnostics();
     var node = parseResult.findNode.unit;
     assertParsedNodeText(node, r'''
 CompilationUnit
@@ -1879,12 +1996,12 @@
     var parseResult = parseStringWithErrors(r'''
 class C {
   static c
+//       ^
+// [diag.missingConstFinalVarOrType] Variables must be declared using the keywords 'const', 'final', 'var' or a type name.
+// [diag.expectedToken] Expected to find ';'.
 }
 ''');
-    parseResult.assertErrors([
-      error(diag.missingConstFinalVarOrType, 19, 1),
-      error(diag.expectedToken, 19, 1),
-    ]);
+    parseResult.assertExpectedDiagnostics();
     var node = parseResult.findNode.unit;
     assertParsedNodeText(node, r'''
 CompilationUnit
@@ -1911,9 +2028,11 @@
     var parseResult = parseStringWithErrors(r'''
 class C {
   static c x
+//         ^
+// [diag.expectedToken] Expected to find ';'.
 }
 ''');
-    parseResult.assertErrors([error(diag.expectedToken, 21, 1)]);
+    parseResult.assertExpectedDiagnostics();
     var node = parseResult.findNode.unit;
     assertParsedNodeText(node, r'''
 CompilationUnit
@@ -1942,12 +2061,12 @@
     var parseResult = parseStringWithErrors(r'''
 class C {
   A
+//^
+// [diag.missingConstFinalVarOrType] Variables must be declared using the keywords 'const', 'final', 'var' or a type name.
+// [diag.expectedToken] Expected to find ';'.
 }
 ''');
-    parseResult.assertErrors([
-      error(diag.missingConstFinalVarOrType, 12, 1),
-      error(diag.expectedToken, 12, 1),
-    ]);
+    parseResult.assertExpectedDiagnostics();
     var node = parseResult.findNode.unit;
     assertParsedNodeText(node, r'''
 CompilationUnit
@@ -1973,12 +2092,12 @@
     var parseResult = parseStringWithErrors(r'''
 class C {
   var
+//^^^
+// [diag.expectedToken] Expected to find ';'.
 }
+// [diag.missingIdentifier][column 1][length 1] Expected an identifier.
 ''');
-    parseResult.assertErrors([
-      error(diag.expectedToken, 12, 3),
-      error(diag.missingIdentifier, 16, 1),
-    ]);
+    parseResult.assertExpectedDiagnostics();
     var node = parseResult.findNode.unit;
     assertParsedNodeText(node, r'''
 CompilationUnit
@@ -2005,12 +2124,13 @@
     var parseResult = parseStringWithErrors(r'''
 void f() {
   for (String item i) {}
+//            ^^^^
+// [diag.expectedToken] Expected to find ';'.
+//                 ^
+// [diag.expectedToken] Expected to find ';'.
 }
 ''');
-    parseResult.assertErrors([
-      error(diag.expectedToken, 25, 4),
-      error(diag.expectedToken, 30, 1),
-    ]);
+    parseResult.assertExpectedDiagnostics();
     var node = parseResult.findNode.firstBlock.statements[0];
     assertParsedNodeText(node, r'''
 ForStatement
@@ -2038,12 +2158,13 @@
     var parseResult = parseStringWithErrors(r'''
 void f() {
   for (String item i) {}
+//            ^^^^
+// [diag.expectedToken] Expected to find ';'.
+//                 ^
+// [diag.expectedToken] Expected to find ';'.
 }
 ''');
-    parseResult.assertErrors([
-      error(diag.expectedToken, 25, 4),
-      error(diag.expectedToken, 30, 1),
-    ]);
+    parseResult.assertExpectedDiagnostics();
     var node = parseResult.findNode.firstBlock.statements[0];
     assertParsedNodeText(node, r'''
 ForStatement
@@ -2071,12 +2192,12 @@
     var parseResult = parseStringWithErrors(r'''
 void f() {
   String v }
+//       ^
+// [diag.expectedToken] Expected to find ';'.
 }
+// [diag.expectedExecutable][column 1][length 1] Expected a method, getter, setter or operator declaration.
 ''');
-    parseResult.assertErrors([
-      error(diag.expectedToken, 20, 1),
-      error(diag.expectedExecutable, 24, 1),
-    ]);
+    parseResult.assertExpectedDiagnostics();
     var node = parseResult.findNode.firstBlock.statements[0];
     assertParsedNodeText(node, r'''
 VariableDeclarationStatement
@@ -2094,13 +2215,14 @@
     var parseResult = parseStringWithErrors(r'''
 void f() {
   final }
+//^^^^^
+// [diag.expectedToken] Expected to find ';'.
+//      ^
+// [diag.missingIdentifier] Expected an identifier.
 }
+// [diag.expectedExecutable][column 1][length 1] Expected a method, getter, setter or operator declaration.
 ''');
-    parseResult.assertErrors([
-      error(diag.expectedToken, 13, 5),
-      error(diag.missingIdentifier, 19, 1),
-      error(diag.expectedExecutable, 21, 1),
-    ]);
+    parseResult.assertExpectedDiagnostics();
     var node = parseResult.findNode.firstBlock.statements[0];
     assertParsedNodeText(node, r'''
 VariableDeclarationStatement
@@ -2117,9 +2239,11 @@
     var parseResult = parseStringWithErrors(r'''
 void f() {
   String v String v2;
+//       ^
+// [diag.expectedToken] Expected to find ';'.
 }
 ''');
-    parseResult.assertErrors([error(diag.expectedToken, 20, 1)]);
+    parseResult.assertExpectedDiagnostics();
     var node = parseResult.findNode.firstBlock.statements[0];
     assertParsedNodeText(node, r'''
 VariableDeclarationStatement
@@ -2137,9 +2261,11 @@
     var parseResult = parseStringWithErrors(r'''
 void f() {
   String v if (true) {}
+//       ^
+// [diag.expectedToken] Expected to find ';'.
 }
 ''');
-    parseResult.assertErrors([error(diag.expectedToken, 20, 1)]);
+    parseResult.assertExpectedDiagnostics();
     var node = parseResult.findNode.firstBlock.statements[0];
     assertParsedNodeText(node, r'''
 VariableDeclarationStatement
@@ -2157,9 +2283,11 @@
     var parseResult = parseStringWithErrors(r'''
 void f() {
   String v {}
+//       ^
+// [diag.expectedToken] Expected to find ';'.
 }
 ''');
-    parseResult.assertErrors([error(diag.expectedToken, 20, 1)]);
+    parseResult.assertExpectedDiagnostics();
     var node = parseResult.findNode.firstBlock.statements[0];
     assertParsedNodeText(node, r'''
 VariableDeclarationStatement
@@ -2177,9 +2305,11 @@
     var parseResult = parseStringWithErrors(r'''
 void f() {
   List<String> v {}
+//             ^
+// [diag.expectedToken] Expected to find ';'.
 }
 ''');
-    parseResult.assertErrors([error(diag.expectedToken, 26, 1)]);
+    parseResult.assertExpectedDiagnostics();
     var node = parseResult.findNode.firstBlock.statements[0];
     assertParsedNodeText(node, r'''
 VariableDeclarationStatement
@@ -2203,9 +2333,11 @@
     var parseResult = parseStringWithErrors(r'''
 class C {
   final List<int f;
+//           ^^^
+// [diag.expectedToken] Expected to find '>'.
 }
 ''');
-    parseResult.assertErrors([error(diag.expectedToken, 23, 3)]);
+    parseResult.assertExpectedDiagnostics();
     var node = parseResult.findNode.unit;
     assertParsedNodeText(node, r'''
 CompilationUnit
@@ -2239,9 +2371,11 @@
   void test_incompleteTypeParameters() {
     var parseResult = parseStringWithErrors(r'''
 class C<K {
+//      ^
+// [diag.expectedToken] Expected to find '>'.
 }
 ''');
-    parseResult.assertErrors([error(diag.expectedToken, 8, 1)]);
+    parseResult.assertExpectedDiagnostics();
     var node = parseResult.findNode.unit;
     assertParsedNodeText(node, r'''
 CompilationUnit
@@ -2265,9 +2399,11 @@
   void test_incompleteTypeParameters2() {
     var parseResult = parseStringWithErrors(r'''
 class C<K extends L<T> {
+//                   ^
+// [diag.expectedToken] Expected to find '>'.
 }
 ''');
-    parseResult.assertErrors([error(diag.expectedToken, 21, 1)]);
+    parseResult.assertExpectedDiagnostics();
     var node = parseResult.findNode.unit;
     assertParsedNodeText(node, r'''
 CompilationUnit
@@ -2300,9 +2436,11 @@
   void test_incompleteTypeParameters3() {
     var parseResult = parseStringWithErrors(r'''
 class C<K extends L<T {
+//                  ^
+// [diag.expectedToken] Expected to find '>'.
 }
 ''');
-    parseResult.assertErrors([error(diag.expectedToken, 20, 1)]);
+    parseResult.assertExpectedDiagnostics();
     var node = parseResult.findNode.unit;
     assertParsedNodeText(node, r'''
 CompilationUnit
@@ -2335,8 +2473,10 @@
   void test_invalidFunctionBodyModifier() {
     var parseResult = parseStringWithErrors(r'''
 f() sync {}
+//  ^^^^
+// [diag.missingStarAfterSync] The modifier 'sync' must be followed by a star ('*').
 ''');
-    parseResult.assertErrors([error(diag.missingStarAfterSync, 4, 4)]);
+    parseResult.assertExpectedDiagnostics();
     var node = parseResult.findNode.unit;
     assertParsedNodeText(node, r'''
 CompilationUnit
@@ -2358,8 +2498,10 @@
   void test_invalidMapLiteral() {
     var parseResult = parseStringWithErrors(r'''
 class C { var f = Map<A, B> {}; }
+//                ^^^
+// [diag.literalWithClass] A map literal can't be prefixed by 'Map'.
 ''');
-    parseResult.assertErrors([error(diag.literalWithClass, 18, 3)]);
+    parseResult.assertExpectedDiagnostics();
     var node = parseResult.findNode.unit;
     assertParsedNodeText(node, r'''
 CompilationUnit
@@ -2399,9 +2541,11 @@
     var parseResult = parseStringWithErrors(r'''
 class C {
   G<int double> g;
+//      ^^^^^^
+// [diag.expectedToken] Expected to find ','.
 }
 ''');
-    parseResult.assertErrors([error(diag.expectedToken, 18, 6)]);
+    parseResult.assertExpectedDiagnostics();
     var node = parseResult.findNode.unit;
     assertParsedNodeText(node, r'''
 CompilationUnit
@@ -2436,8 +2580,10 @@
   void test_invalidTypeParameters_super() {
     var parseResult = parseStringWithErrors(r'''
 class C<X super Y> {}
+//      ^
+// [diag.expectedToken] Expected to find '>'.
 ''');
-    parseResult.assertErrors([error(diag.expectedToken, 8, 1)]);
+    parseResult.assertExpectedDiagnostics();
     var node = parseResult.findNode.unit;
     assertParsedNodeText(node, r'''
 CompilationUnit
@@ -2461,13 +2607,15 @@
   void test_isExpression_noType() {
     var parseResult = parseStringWithErrors(r'''
 class Bar<T extends Foo> {m(x){if (x is ) return;if (x is !)}}
+//                                      ^
+// [diag.expectedTypeName] Expected a type name.
+//                                                         ^
+// [diag.expectedTypeName] Expected a type name.
+// [diag.expectedToken] Expected to find ';'.
+//                                                          ^
+// [diag.missingIdentifier] Expected an identifier.
 ''');
-    parseResult.assertErrors([
-      error(diag.expectedTypeName, 40, 1),
-      error(diag.expectedTypeName, 59, 1),
-      error(diag.expectedToken, 59, 1),
-      error(diag.missingIdentifier, 60, 1),
-    ]);
+    parseResult.assertExpectedDiagnostics();
     var node = parseResult.findNode.unit;
     assertParsedNodeText(node, r'''
 CompilationUnit
@@ -2535,11 +2683,12 @@
   void test_issue_34610_get() {
     var parseResult = parseStringWithErrors(r'''
 class C { get C.named => null; }
+//        ^^^
+// [diag.getterConstructor] Constructors can't be a getter.
+//            ^
+// [diag.missingMethodParameters] Methods must have an explicit list of parameters.
 ''');
-    parseResult.assertErrors([
-      error(diag.getterConstructor, 10, 3),
-      error(diag.missingMethodParameters, 14, 1),
-    ]);
+    parseResult.assertExpectedDiagnostics();
     var node = parseResult.findNode.unit;
     assertParsedNodeText(node, r'''
 CompilationUnit
@@ -2571,8 +2720,10 @@
   void test_issue_34610_initializers() {
     var parseResult = parseStringWithErrors(r'''
 class C { C.named : super(); }
+//        ^
+// [diag.missingMethodParameters] Methods must have an explicit list of parameters.
 ''');
-    parseResult.assertErrors([error(diag.missingMethodParameters, 10, 1)]);
+    parseResult.assertExpectedDiagnostics();
     var node = parseResult.findNode.unit;
     assertParsedNodeText(node, r'''
 CompilationUnit
@@ -2608,8 +2759,10 @@
   void test_issue_34610_missing_param() {
     var parseResult = parseStringWithErrors(r'''
 class C { C => null; }
+//        ^
+// [diag.missingMethodParameters] Methods must have an explicit list of parameters.
 ''');
-    parseResult.assertErrors([error(diag.missingMethodParameters, 10, 1)]);
+    parseResult.assertExpectedDiagnostics();
     var node = parseResult.findNode.unit;
     assertParsedNodeText(node, r'''
 CompilationUnit
@@ -2639,8 +2792,10 @@
   void test_issue_34610_named_missing_param() {
     var parseResult = parseStringWithErrors(r'''
 class C { C.named => null; }
+//        ^
+// [diag.missingMethodParameters] Methods must have an explicit list of parameters.
 ''');
-    parseResult.assertErrors([error(diag.missingMethodParameters, 10, 1)]);
+    parseResult.assertExpectedDiagnostics();
     var node = parseResult.findNode.unit;
     assertParsedNodeText(node, r'''
 CompilationUnit
@@ -2672,11 +2827,12 @@
   void test_issue_34610_set() {
     var parseResult = parseStringWithErrors(r'''
 class C { set C.named => null; }
+//        ^^^
+// [diag.setterConstructor] Constructors can't be a setter.
+//            ^
+// [diag.missingMethodParameters] Methods must have an explicit list of parameters.
 ''');
-    parseResult.assertErrors([
-      error(diag.setterConstructor, 10, 3),
-      error(diag.missingMethodParameters, 14, 1),
-    ]);
+    parseResult.assertExpectedDiagnostics();
     var node = parseResult.findNode.unit;
     assertParsedNodeText(node, r'''
 CompilationUnit
@@ -2708,10 +2864,9 @@
   void test_keywordInPlaceOfIdentifier() {
     var parseResult = parseStringWithErrors(r'''
 do() {}
+// [diag.expectedIdentifierButGotKeyword][column 1][length 2] 'do' can't be used as an identifier because it's a keyword.
 ''');
-    parseResult.assertErrors([
-      error(diag.expectedIdentifierButGotKeyword, 0, 2),
-    ]);
+    parseResult.assertExpectedDiagnostics();
     var node = parseResult.findNode.unit;
     assertParsedNodeText(node, r'''
 CompilationUnit
@@ -2732,8 +2887,10 @@
   void test_logicalAndExpression_missing_LHS() {
     var parseResult = parseStringWithErrors(r'''
 var v = && y;
+//      ^^
+// [diag.missingIdentifier] Expected an identifier.
 ''');
-    parseResult.assertErrors([error(diag.missingIdentifier, 8, 2)]);
+    parseResult.assertExpectedDiagnostics();
     var node = parseResult.findNode.singleVariableDeclaration.initializer!;
     assertParsedNodeText(node, r'''
 BinaryExpression
@@ -2748,11 +2905,12 @@
   void test_logicalAndExpression_missing_LHS_RHS() {
     var parseResult = parseStringWithErrors(r'''
 var v = &&;
+//      ^^
+// [diag.missingIdentifier] Expected an identifier.
+//        ^
+// [diag.missingIdentifier] Expected an identifier.
 ''');
-    parseResult.assertErrors([
-      error(diag.missingIdentifier, 8, 2),
-      error(diag.missingIdentifier, 10, 1),
-    ]);
+    parseResult.assertExpectedDiagnostics();
     var node = parseResult.findNode.singleVariableDeclaration.initializer!;
     assertParsedNodeText(node, r'''
 BinaryExpression
@@ -2767,8 +2925,10 @@
   void test_logicalAndExpression_missing_RHS() {
     var parseResult = parseStringWithErrors(r'''
 var v = x &&;
+//          ^
+// [diag.missingIdentifier] Expected an identifier.
 ''');
-    parseResult.assertErrors([error(diag.missingIdentifier, 12, 1)]);
+    parseResult.assertExpectedDiagnostics();
     var node = parseResult.findNode.singleVariableDeclaration.initializer!;
     assertParsedNodeText(node, r'''
 BinaryExpression
@@ -2783,12 +2943,14 @@
   void test_logicalAndExpression_precedence_bitwiseOr_left() {
     var parseResult = parseStringWithErrors(r'''
 var v = | &&;
+//      ^
+// [diag.missingIdentifier] Expected an identifier.
+//        ^^
+// [diag.missingIdentifier] Expected an identifier.
+//          ^
+// [diag.missingIdentifier] Expected an identifier.
 ''');
-    parseResult.assertErrors([
-      error(diag.missingIdentifier, 8, 1),
-      error(diag.missingIdentifier, 10, 2),
-      error(diag.missingIdentifier, 12, 1),
-    ]);
+    parseResult.assertExpectedDiagnostics();
     var node = parseResult.findNode.singleVariableDeclaration.initializer!;
     assertParsedNodeText(node, r'''
 BinaryExpression
@@ -2807,12 +2969,14 @@
   void test_logicalAndExpression_precedence_bitwiseOr_right() {
     var parseResult = parseStringWithErrors(r'''
 var v = && |;
+//      ^^
+// [diag.missingIdentifier] Expected an identifier.
+//         ^
+// [diag.missingIdentifier] Expected an identifier.
+//          ^
+// [diag.missingIdentifier] Expected an identifier.
 ''');
-    parseResult.assertErrors([
-      error(diag.missingIdentifier, 8, 2),
-      error(diag.missingIdentifier, 11, 1),
-      error(diag.missingIdentifier, 12, 1),
-    ]);
+    parseResult.assertExpectedDiagnostics();
     var node = parseResult.findNode.singleVariableDeclaration.initializer!;
     assertParsedNodeText(node, r'''
 BinaryExpression
@@ -2831,8 +2995,10 @@
   void test_logicalOrExpression_missing_LHS() {
     var parseResult = parseStringWithErrors(r'''
 var v = || y;
+//      ^^
+// [diag.missingIdentifier] Expected an identifier.
 ''');
-    parseResult.assertErrors([error(diag.missingIdentifier, 8, 2)]);
+    parseResult.assertExpectedDiagnostics();
     var node = parseResult.findNode.singleVariableDeclaration.initializer!;
     assertParsedNodeText(node, r'''
 BinaryExpression
@@ -2847,11 +3013,12 @@
   void test_logicalOrExpression_missing_LHS_RHS() {
     var parseResult = parseStringWithErrors(r'''
 var v = ||;
+//      ^^
+// [diag.missingIdentifier] Expected an identifier.
+//        ^
+// [diag.missingIdentifier] Expected an identifier.
 ''');
-    parseResult.assertErrors([
-      error(diag.missingIdentifier, 8, 2),
-      error(diag.missingIdentifier, 10, 1),
-    ]);
+    parseResult.assertExpectedDiagnostics();
     var node = parseResult.findNode.singleVariableDeclaration.initializer!;
     assertParsedNodeText(node, r'''
 BinaryExpression
@@ -2866,8 +3033,10 @@
   void test_logicalOrExpression_missing_RHS() {
     var parseResult = parseStringWithErrors(r'''
 var v = x ||;
+//          ^
+// [diag.missingIdentifier] Expected an identifier.
 ''');
-    parseResult.assertErrors([error(diag.missingIdentifier, 12, 1)]);
+    parseResult.assertExpectedDiagnostics();
     var node = parseResult.findNode.singleVariableDeclaration.initializer!;
     assertParsedNodeText(node, r'''
 BinaryExpression
@@ -2882,12 +3051,14 @@
   void test_logicalOrExpression_precedence_logicalAnd_left() {
     var parseResult = parseStringWithErrors(r'''
 var v = && ||;
+//      ^^
+// [diag.missingIdentifier] Expected an identifier.
+//         ^^
+// [diag.missingIdentifier] Expected an identifier.
+//           ^
+// [diag.missingIdentifier] Expected an identifier.
 ''');
-    parseResult.assertErrors([
-      error(diag.missingIdentifier, 8, 2),
-      error(diag.missingIdentifier, 11, 2),
-      error(diag.missingIdentifier, 13, 1),
-    ]);
+    parseResult.assertExpectedDiagnostics();
     var node = parseResult.findNode.singleVariableDeclaration.initializer!;
     assertParsedNodeText(node, r'''
 BinaryExpression
@@ -2906,12 +3077,14 @@
   void test_logicalOrExpression_precedence_logicalAnd_right() {
     var parseResult = parseStringWithErrors(r'''
 var v = || &&;
+//      ^^
+// [diag.missingIdentifier] Expected an identifier.
+//         ^^
+// [diag.missingIdentifier] Expected an identifier.
+//           ^
+// [diag.missingIdentifier] Expected an identifier.
 ''');
-    parseResult.assertErrors([
-      error(diag.missingIdentifier, 8, 2),
-      error(diag.missingIdentifier, 11, 2),
-      error(diag.missingIdentifier, 13, 1),
-    ]);
+    parseResult.assertExpectedDiagnostics();
     var node = parseResult.findNode.singleVariableDeclaration.initializer!;
     assertParsedNodeText(node, r'''
 BinaryExpression
@@ -2930,8 +3103,10 @@
   void test_method_missingBody() {
     var parseResult = parseStringWithErrors(r'''
 class C { b() }
+//            ^
+// [diag.missingFunctionBody] A function body must be provided.
 ''');
-    parseResult.assertErrors([error(diag.missingFunctionBody, 14, 1)]);
+    parseResult.assertExpectedDiagnostics();
     var node = parseResult.findNode.unit;
     assertParsedNodeText(node, r'''
 CompilationUnit
@@ -2959,8 +3134,10 @@
   void test_missing_commaInArgumentList() {
     var parseResult = parseStringWithErrors(r'''
 var v = f(x: 1 y: 2);
+//             ^
+// [diag.expectedToken] Expected to find ','.
 ''');
-    parseResult.assertErrors([error(diag.expectedToken, 15, 1)]);
+    parseResult.assertExpectedDiagnostics();
     var node = parseResult.findNode.singleVariableDeclaration.initializer!;
     assertParsedNodeText(node, r'''
 MethodInvocation
@@ -2986,15 +3163,18 @@
   void test_missingComma_beforeNamedArgument() {
     var parseResult = parseStringWithErrors(r'''
 (a b: c)
+// [diag.expectedExecutable][column 1][length 1] Expected a method, getter, setter or operator declaration.
+// ^
+// [diag.expectedToken] Expected to find ';'.
+//  ^
+// [diag.expectedExecutable] Expected a method, getter, setter or operator declaration.
+//    ^
+// [diag.missingConstFinalVarOrType] Variables must be declared using the keywords 'const', 'final', 'var' or a type name.
+// [diag.expectedToken] Expected to find ';'.
+//     ^
+// [diag.expectedExecutable] Expected a method, getter, setter or operator declaration.
 ''');
-    parseResult.assertErrors([
-      error(diag.expectedExecutable, 0, 1),
-      error(diag.expectedToken, 3, 1),
-      error(diag.expectedExecutable, 4, 1),
-      error(diag.missingConstFinalVarOrType, 6, 1),
-      error(diag.expectedToken, 6, 1),
-      error(diag.expectedExecutable, 7, 1),
-    ]);
+    parseResult.assertExpectedDiagnostics();
     var node = parseResult.findNode.unit;
     assertParsedNodeText(node, r'''
 CompilationUnit
@@ -3020,10 +3200,12 @@
     var parseResult = parseStringWithErrors(r'''
 class C {
   int length {}
+//    ^^^^^^
+// [diag.missingMethodParameters] Methods must have an explicit list of parameters.
   void foo() {}
 }
 ''');
-    parseResult.assertErrors([error(diag.missingMethodParameters, 16, 6)]);
+    parseResult.assertExpectedDiagnostics();
     var node = parseResult.findNode.unit;
     assertParsedNodeText(node, r'''
 CompilationUnit
@@ -3064,8 +3246,10 @@
   void test_missingIdentifier_afterAnnotation() {
     var parseResult = parseStringWithErrors(r'''
 @override }
+//        ^
+// [diag.expectedExecutable] Expected a method, getter, setter or operator declaration.
 ''');
-    parseResult.assertErrors([error(diag.expectedExecutable, 10, 1)]);
+    parseResult.assertExpectedDiagnostics();
     var node = parseResult.findNode.unit;
     assertParsedNodeText(node, r'''
 CompilationUnit
@@ -3075,11 +3259,12 @@
   void test_missingSemicolon_variableDeclarationList() {
     var parseResult = parseStringWithErrors(r'''
 String n x = "";
+//     ^
+// [diag.expectedToken] Expected to find ';'.
+//       ^
+// [diag.missingConstFinalVarOrType] Variables must be declared using the keywords 'const', 'final', 'var' or a type name.
 ''');
-    parseResult.assertErrors([
-      error(diag.expectedToken, 7, 1),
-      error(diag.missingConstFinalVarOrType, 9, 1),
-    ]);
+    parseResult.assertExpectedDiagnostics();
     var node = parseResult.findNode.unit;
     assertParsedNodeText(node, r'''
 CompilationUnit
@@ -3107,8 +3292,10 @@
   void test_multiplicativeExpression_missing_LHS() {
     var parseResult = parseStringWithErrors(r'''
 var v = * y;
+//      ^
+// [diag.missingIdentifier] Expected an identifier.
 ''');
-    parseResult.assertErrors([error(diag.missingIdentifier, 8, 1)]);
+    parseResult.assertExpectedDiagnostics();
     var node = parseResult.findNode.singleVariableDeclaration.initializer!;
     assertParsedNodeText(node, r'''
 BinaryExpression
@@ -3123,11 +3310,12 @@
   void test_multiplicativeExpression_missing_LHS_RHS() {
     var parseResult = parseStringWithErrors(r'''
 var v = *;
+//      ^
+// [diag.missingIdentifier] Expected an identifier.
+//       ^
+// [diag.missingIdentifier] Expected an identifier.
 ''');
-    parseResult.assertErrors([
-      error(diag.missingIdentifier, 8, 1),
-      error(diag.missingIdentifier, 9, 1),
-    ]);
+    parseResult.assertExpectedDiagnostics();
     var node = parseResult.findNode.singleVariableDeclaration.initializer!;
     assertParsedNodeText(node, r'''
 BinaryExpression
@@ -3142,8 +3330,10 @@
   void test_multiplicativeExpression_missing_RHS() {
     var parseResult = parseStringWithErrors(r'''
 var v = x *;
+//         ^
+// [diag.missingIdentifier] Expected an identifier.
 ''');
-    parseResult.assertErrors([error(diag.missingIdentifier, 11, 1)]);
+    parseResult.assertExpectedDiagnostics();
     var node = parseResult.findNode.singleVariableDeclaration.initializer!;
     assertParsedNodeText(node, r'''
 BinaryExpression
@@ -3158,8 +3348,10 @@
   void test_multiplicativeExpression_missing_RHS_super() {
     var parseResult = parseStringWithErrors(r'''
 var v = super *;
+//             ^
+// [diag.missingIdentifier] Expected an identifier.
 ''');
-    parseResult.assertErrors([error(diag.missingIdentifier, 15, 1)]);
+    parseResult.assertExpectedDiagnostics();
     var node = parseResult.findNode.singleVariableDeclaration.initializer!;
     assertParsedNodeText(node, r'''
 BinaryExpression
@@ -3174,8 +3366,10 @@
   void test_multiplicativeExpression_precedence_unary_left() {
     var parseResult = parseStringWithErrors(r'''
 var v = -x *;
+//          ^
+// [diag.missingIdentifier] Expected an identifier.
 ''');
-    parseResult.assertErrors([error(diag.missingIdentifier, 12, 1)]);
+    parseResult.assertExpectedDiagnostics();
     var node = parseResult.findNode.singleVariableDeclaration.initializer!;
     assertParsedNodeText(node, r'''
 BinaryExpression
@@ -3192,8 +3386,10 @@
   void test_multiplicativeExpression_precedence_unary_right() {
     var parseResult = parseStringWithErrors(r'''
 var v = * -y;
+//      ^
+// [diag.missingIdentifier] Expected an identifier.
 ''');
-    parseResult.assertErrors([error(diag.missingIdentifier, 8, 1)]);
+    parseResult.assertExpectedDiagnostics();
     var node = parseResult.findNode.singleVariableDeclaration.initializer!;
     assertParsedNodeText(node, r'''
 BinaryExpression
@@ -3210,12 +3406,13 @@
   void test_multiplicativeExpression_super() {
     var parseResult = parseStringWithErrors(r'''
 var v = super ==  ==;
+//                ^^
+// [diag.missingIdentifier] Expected an identifier.
+// [diag.equalityCannotBeEqualityOperand] A comparison expression can't be an operand of another comparison expression.
+//                  ^
+// [diag.missingIdentifier] Expected an identifier.
 ''');
-    parseResult.assertErrors([
-      error(diag.missingIdentifier, 18, 2),
-      error(diag.equalityCannotBeEqualityOperand, 18, 2),
-      error(diag.missingIdentifier, 20, 1),
-    ]);
+    parseResult.assertExpectedDiagnostics();
     var node = parseResult.findNode.singleVariableDeclaration.initializer!;
     assertParsedNodeText(node, r'''
 BinaryExpression
@@ -3234,11 +3431,12 @@
   void test_namedParameterOutsideGroup() {
     var parseResult = parseStringWithErrors(r'''
 class A { b(c: 0, Foo d: 0, e){} }
+//           ^
+// [diag.namedParameterOutsideGroup] Named parameters must be enclosed in curly braces ('{' and '}').
+//                     ^
+// [diag.namedParameterOutsideGroup] Named parameters must be enclosed in curly braces ('{' and '}').
 ''');
-    parseResult.assertErrors([
-      error(diag.namedParameterOutsideGroup, 13, 1),
-      error(diag.namedParameterOutsideGroup, 23, 1),
-    ]);
+    parseResult.assertExpectedDiagnostics();
     var node = parseResult.findNode.unit;
     assertParsedNodeText(node, r'''
 CompilationUnit
@@ -3282,15 +3480,17 @@
   void test_nonStringLiteralUri_import() {
     var parseResult = parseStringWithErrors(r'''
 import dart:io; class C {}
+// [diag.expectedToken][column 1][length 6] Expected to find ';'.
+//     ^^^^
+// [diag.expectedStringLiteral] Expected a string literal.
+// [diag.missingConstFinalVarOrType] Variables must be declared using the keywords 'const', 'final', 'var' or a type name.
+// [diag.expectedToken] Expected to find ';'.
+//         ^
+// [diag.expectedExecutable] Expected a method, getter, setter or operator declaration.
+//          ^^
+// [diag.missingConstFinalVarOrType] Variables must be declared using the keywords 'const', 'final', 'var' or a type name.
 ''');
-    parseResult.assertErrors([
-      error(diag.expectedToken, 0, 6),
-      error(diag.expectedStringLiteral, 7, 4),
-      error(diag.missingConstFinalVarOrType, 7, 4),
-      error(diag.expectedToken, 7, 4),
-      error(diag.expectedExecutable, 11, 1),
-      error(diag.missingConstFinalVarOrType, 12, 2),
-    ]);
+    parseResult.assertExpectedDiagnostics();
     var node = parseResult.findNode.unit;
     assertParsedNodeText(node, r'''
 CompilationUnit
@@ -3326,8 +3526,10 @@
   void test_prefixExpression_missing_operand_minus() {
     var parseResult = parseStringWithErrors(r'''
 var v = -;
+//       ^
+// [diag.missingIdentifier] Expected an identifier.
 ''');
-    parseResult.assertErrors([error(diag.missingIdentifier, 9, 1)]);
+    parseResult.assertExpectedDiagnostics();
     var node = parseResult.findNode.singleVariableDeclaration.initializer!;
     assertParsedNodeText(node, r'''
 PrefixExpression
@@ -3340,12 +3542,13 @@
   void test_primaryExpression_argumentDefinitionTest() {
     var parseResult = parseStringWithErrors(r'''
 var v = ?a;
+//      ^
+// [diag.missingIdentifier] Expected an identifier.
+//        ^
+// [diag.expectedToken] Expected to find ':'.
+// [diag.missingIdentifier] Expected an identifier.
 ''');
-    parseResult.assertErrors([
-      error(diag.missingIdentifier, 8, 1),
-      error(diag.expectedToken, 10, 1),
-      error(diag.missingIdentifier, 10, 1),
-    ]);
+    parseResult.assertExpectedDiagnostics();
     var node = parseResult.findNode.singleVariableDeclaration.initializer!;
     assertParsedNodeText(node, r'''
 ConditionalExpression
@@ -3363,8 +3566,10 @@
   void test_relationalExpression_missing_LHS() {
     var parseResult = parseStringWithErrors(r'''
 var v = is y;
+//      ^^
+// [diag.missingIdentifier] Expected an identifier.
 ''');
-    parseResult.assertErrors([error(diag.missingIdentifier, 8, 2)]);
+    parseResult.assertExpectedDiagnostics();
     var node = parseResult.findNode.singleVariableDeclaration.initializer!;
     assertParsedNodeText(node, r'''
 IsExpression
@@ -3379,11 +3584,12 @@
   void test_relationalExpression_missing_LHS_RHS() {
     var parseResult = parseStringWithErrors(r'''
 var v = is;
+//      ^^
+// [diag.missingIdentifier] Expected an identifier.
+//        ^
+// [diag.expectedTypeName] Expected a type name.
 ''');
-    parseResult.assertErrors([
-      error(diag.missingIdentifier, 8, 2),
-      error(diag.expectedTypeName, 10, 1),
-    ]);
+    parseResult.assertExpectedDiagnostics();
     var node = parseResult.findNode.singleVariableDeclaration.initializer!;
     assertParsedNodeText(node, r'''
 IsExpression
@@ -3398,8 +3604,10 @@
   void test_relationalExpression_missing_RHS() {
     var parseResult = parseStringWithErrors(r'''
 var v = x is;
+//          ^
+// [diag.expectedTypeName] Expected a type name.
 ''');
-    parseResult.assertErrors([error(diag.expectedTypeName, 12, 1)]);
+    parseResult.assertExpectedDiagnostics();
     var node = parseResult.findNode.singleVariableDeclaration.initializer!;
     assertParsedNodeText(node, r'''
 IsExpression
@@ -3414,12 +3622,14 @@
   void test_relationalExpression_precedence_shift_right() {
     var parseResult = parseStringWithErrors(r'''
 var v = << is;
+//      ^^
+// [diag.missingIdentifier] Expected an identifier.
+//         ^^
+// [diag.missingIdentifier] Expected an identifier.
+//           ^
+// [diag.expectedTypeName] Expected a type name.
 ''');
-    parseResult.assertErrors([
-      error(diag.missingIdentifier, 8, 2),
-      error(diag.missingIdentifier, 11, 2),
-      error(diag.expectedTypeName, 13, 1),
-    ]);
+    parseResult.assertExpectedDiagnostics();
     var node = parseResult.findNode.singleVariableDeclaration.initializer!;
     assertParsedNodeText(node, r'''
 IsExpression
@@ -3438,8 +3648,10 @@
   void test_shiftExpression_missing_LHS() {
     var parseResult = parseStringWithErrors(r'''
 var v = << y;
+//      ^^
+// [diag.missingIdentifier] Expected an identifier.
 ''');
-    parseResult.assertErrors([error(diag.missingIdentifier, 8, 2)]);
+    parseResult.assertExpectedDiagnostics();
     var node = parseResult.findNode.singleVariableDeclaration.initializer!;
     assertParsedNodeText(node, r'''
 BinaryExpression
@@ -3454,11 +3666,12 @@
   void test_shiftExpression_missing_LHS_RHS() {
     var parseResult = parseStringWithErrors(r'''
 var v = <<;
+//      ^^
+// [diag.missingIdentifier] Expected an identifier.
+//        ^
+// [diag.missingIdentifier] Expected an identifier.
 ''');
-    parseResult.assertErrors([
-      error(diag.missingIdentifier, 8, 2),
-      error(diag.missingIdentifier, 10, 1),
-    ]);
+    parseResult.assertExpectedDiagnostics();
     var node = parseResult.findNode.singleVariableDeclaration.initializer!;
     assertParsedNodeText(node, r'''
 BinaryExpression
@@ -3473,8 +3686,10 @@
   void test_shiftExpression_missing_RHS() {
     var parseResult = parseStringWithErrors(r'''
 var v = x <<;
+//          ^
+// [diag.missingIdentifier] Expected an identifier.
 ''');
-    parseResult.assertErrors([error(diag.missingIdentifier, 12, 1)]);
+    parseResult.assertExpectedDiagnostics();
     var node = parseResult.findNode.singleVariableDeclaration.initializer!;
     assertParsedNodeText(node, r'''
 BinaryExpression
@@ -3489,8 +3704,10 @@
   void test_shiftExpression_missing_RHS_super() {
     var parseResult = parseStringWithErrors(r'''
 var v = super <<;
+//              ^
+// [diag.missingIdentifier] Expected an identifier.
 ''');
-    parseResult.assertErrors([error(diag.missingIdentifier, 16, 1)]);
+    parseResult.assertExpectedDiagnostics();
     var node = parseResult.findNode.singleVariableDeclaration.initializer!;
     assertParsedNodeText(node, r'''
 BinaryExpression
@@ -3505,12 +3722,14 @@
   void test_shiftExpression_precedence_unary_left() {
     var parseResult = parseStringWithErrors(r'''
 var v = + <<;
+//      ^
+// [diag.missingIdentifier] Expected an identifier.
+//        ^^
+// [diag.missingIdentifier] Expected an identifier.
+//          ^
+// [diag.missingIdentifier] Expected an identifier.
 ''');
-    parseResult.assertErrors([
-      error(diag.missingIdentifier, 8, 1),
-      error(diag.missingIdentifier, 10, 2),
-      error(diag.missingIdentifier, 12, 1),
-    ]);
+    parseResult.assertExpectedDiagnostics();
     var node = parseResult.findNode.singleVariableDeclaration.initializer!;
     assertParsedNodeText(node, r'''
 BinaryExpression
@@ -3529,12 +3748,14 @@
   void test_shiftExpression_precedence_unary_right() {
     var parseResult = parseStringWithErrors(r'''
 var v = << +;
+//      ^^
+// [diag.missingIdentifier] Expected an identifier.
+//         ^
+// [diag.missingIdentifier] Expected an identifier.
+//          ^
+// [diag.missingIdentifier] Expected an identifier.
 ''');
-    parseResult.assertErrors([
-      error(diag.missingIdentifier, 8, 2),
-      error(diag.missingIdentifier, 11, 1),
-      error(diag.missingIdentifier, 12, 1),
-    ]);
+    parseResult.assertExpectedDiagnostics();
     var node = parseResult.findNode.singleVariableDeclaration.initializer!;
     assertParsedNodeText(node, r'''
 BinaryExpression
@@ -3553,11 +3774,12 @@
   void test_shiftExpression_super() {
     var parseResult = parseStringWithErrors(r'''
 var v = super << <<;
+//               ^^
+// [diag.missingIdentifier] Expected an identifier.
+//                 ^
+// [diag.missingIdentifier] Expected an identifier.
 ''');
-    parseResult.assertErrors([
-      error(diag.missingIdentifier, 17, 2),
-      error(diag.missingIdentifier, 19, 1),
-    ]);
+    parseResult.assertExpectedDiagnostics();
     var node = parseResult.findNode.singleVariableDeclaration.initializer!;
     assertParsedNodeText(node, r'''
 BinaryExpression
@@ -3576,11 +3798,12 @@
   void test_typedef_eof() {
     var parseResult = parseStringWithErrors(r'''
 typedef n
+//      ^
+// [diag.expectedToken] Expected to find ';'.
+//       ^
+// [diag.missingTypedefParameters][column 10][length 0] Typedefs must have an explicit list of parameters.
 ''');
-    parseResult.assertErrors([
-      error(diag.expectedToken, 8, 1),
-      error(diag.missingTypedefParameters, 10, 0),
-    ]);
+    parseResult.assertExpectedDiagnostics();
     var node = parseResult.findNode.unit;
     assertParsedNodeText(node, r'''
 CompilationUnit
@@ -3598,8 +3821,10 @@
   void test_unaryPlus() {
     var parseResult = parseStringWithErrors(r'''
 var v = +2;
+//      ^
+// [diag.missingIdentifier] Expected an identifier.
 ''');
-    parseResult.assertErrors([error(diag.missingIdentifier, 8, 1)]);
+    parseResult.assertExpectedDiagnostics();
     var node = parseResult.findNode.singleVariableDeclaration.initializer!;
     assertParsedNodeText(node, r'''
 BinaryExpression
diff --git a/pkg/analyzer/test/src/dart/analysis/driver_test.dart b/pkg/analyzer/test/src/dart/analysis/driver_test.dart
index d4bd964..484a3ed 100644
--- a/pkg/analyzer/test/src/dart/analysis/driver_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/driver_test.dart
@@ -2066,8 +2066,8 @@
 [future] getIndex A1
   strings
     --nullString--
+    /home/test/lib/a.dart
     foo
-    package:test/a.dart
 ''');
   }
 
@@ -99923,8 +99923,8 @@
 [future] getIndex T1
   strings
     --nullString--
+    /home/test/lib/a.dart
     a
-    package:test/a.dart
 ''');
 
     modifyFile2(a, r'''
@@ -99958,8 +99958,8 @@
 [future] getIndex T2
   strings
     --nullString--
+    /home/test/lib/a.dart
     a
-    package:test/a.dart
 ''');
   }
 
@@ -99998,8 +99998,8 @@
 [future] getIndex T1
   strings
     --nullString--
+    /home/test/lib/a.dart
     a
-    package:test/a.dart
 ''');
 
     modifyFile2(a, r'''
@@ -100020,8 +100020,8 @@
 [future] getIndex T2
   strings
     --nullString--
+    /home/test/lib/a.dart
     a
-    package:test/a.dart
 ''');
   }
 
@@ -100148,8 +100148,8 @@
 [future] getIndex T1
   strings
     --nullString--
+    /home/test/lib/a.dart
     a
-    package:test/a.dart
 ''',
       updatedA: r'''
 int get a => 0;
@@ -100180,8 +100180,8 @@
 [future] getIndex T2
   strings
     --nullString--
+    /home/test/lib/a.dart
     a
-    package:test/a.dart
 ''',
     );
   }
diff --git a/pkg/analyzer/test/src/dart/analysis/index_test.dart b/pkg/analyzer/test/src/dart/analysis/index_test.dart
index a9a055c..1de81f4 100644
--- a/pkg/analyzer/test/src/dart/analysis/index_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/index_test.dart
@@ -3,6 +3,9 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:analyzer/dart/element/element.dart';
+import 'package:analyzer/file_system/file_system.dart';
+import 'package:analyzer/source/file_source.dart';
+import 'package:analyzer/source/source.dart';
 import 'package:analyzer/src/dart/analysis/index.dart';
 import 'package:analyzer/src/dart/element/element.dart';
 import 'package:analyzer/src/diagnostic/diagnostic.dart' as diag;
@@ -4091,14 +4094,14 @@
   }
 
   test_subtypes_classDeclaration() async {
-    String libP = 'package:test/lib.dart;package:test/lib.dart';
-    newFile('$testPackageLibPath/lib.dart', '''
+    var libFile = newFile('$testPackageLibPath/lib.dart', '''
 class A {}
 class B {}
 class C {}
 class D {}
 class E {}
 ''');
+    String libP = '${libFile.path};${libFile.path}';
     await _indexTestUnit('''
 import 'lib.dart';
 
@@ -4127,28 +4130,30 @@
     expect(index.supertypes, hasLength(6));
     expect(index.subtypes, hasLength(6));
 
-    _assertSubtype(0, 'dart:core;dart:core;Object', 'Y', ['methodY']);
-    _assertSubtype(1, '$libP;A', 'X', [
+    _assertSubtype(0, '$libP;A', 'X', [
       'field1',
       'field2',
       'getter1',
       'method1',
       'setter1',
     ]);
-    _assertSubtype(2, '$libP;B', 'Y', ['methodY']);
-    _assertSubtype(3, '$libP;C', 'Y', ['methodY']);
-    _assertSubtype(4, '$libP;D', 'Z', ['methodZ']);
-    _assertSubtype(5, '$libP;E', 'Z', ['methodZ']);
+    _assertSubtype(1, '$libP;B', 'Y', ['methodY']);
+    _assertSubtype(2, '$libP;C', 'Y', ['methodY']);
+    _assertSubtype(3, '$libP;D', 'Z', ['methodZ']);
+    _assertSubtype(4, '$libP;E', 'Z', ['methodZ']);
+    _assertSubtype(5, _interfaceId(typeProvider.objectElement)!, 'Y', [
+      'methodY',
+    ]);
   }
 
   test_subtypes_classTypeAlias() async {
-    String libP = 'package:test/lib.dart;package:test/lib.dart';
-    newFile('$testPackageLibPath/lib.dart', '''
+    var libFile = newFile('$testPackageLibPath/lib.dart', '''
 class A {}
 class B {}
 class C {}
 class D {}
 ''');
+    String libP = '${libFile.path};${libFile.path}';
     await _indexTestUnit('''
 import 'lib.dart';
 
@@ -4180,7 +4185,7 @@
   }
 
   test_subtypes_enum_implements() async {
-    String libP = 'package:test/test.dart;package:test/test.dart';
+    String libP = '${testFile.path};${testFile.path}';
     await _indexTestUnit('''
 class A {}
 
@@ -4195,7 +4200,7 @@
   }
 
   test_subtypes_enum_with() async {
-    String libP = 'package:test/test.dart;package:test/test.dart';
+    String libP = '${testFile.path};${testFile.path}';
     await _indexTestUnit('''
 mixin M {}
 
@@ -4210,13 +4215,13 @@
   }
 
   test_subtypes_extensionType_class() async {
-    String libP = 'package:test/lib.dart;package:test/lib.dart';
-    newFile('$testPackageLibPath/lib.dart', '''
+    var libFile = newFile('$testPackageLibPath/lib.dart', '''
 class A {
   void method1() {}
   void method2() {}
 }
 ''');
+    String libP = '${libFile.path};${libFile.path}';
     await _indexTestUnit('''
 import 'lib.dart';
 
@@ -4233,13 +4238,13 @@
   }
 
   test_subtypes_extensionType_extensionType() async {
-    String libP = 'package:test/lib.dart;package:test/lib.dart';
-    newFile('$testPackageLibPath/lib.dart', '''
+    var libFile = newFile('$testPackageLibPath/lib.dart', '''
 extension type A(int it) {
   void method1() {}
   void method2() {}
 }
 ''');
+    String libP = '${libFile.path};${libFile.path}';
     await _indexTestUnit('''
 import 'lib.dart';
 
@@ -4256,14 +4261,14 @@
   }
 
   test_subtypes_mixinDeclaration() async {
-    String libP = 'package:test/lib.dart;package:test/lib.dart';
-    newFile('$testPackageLibPath/lib.dart', '''
+    var libFile = newFile('$testPackageLibPath/lib.dart', '''
 class A {}
 class B {}
 class C {}
 class D {}
 class E {}
 ''');
+    String libP = '${libFile.path};${libFile.path}';
     await _indexTestUnit('''
 import 'lib.dart';
 
@@ -4940,6 +4945,16 @@
     var indexBytes = indexBuilder.toBuffer();
     index = AnalysisDriverUnitIndex.fromBuffer(indexBytes);
   }
+
+  String? _interfaceId(InterfaceElement element) {
+    var libraryFile = element.library.firstFragment.source.mustBeFile;
+    var libraryPath = libraryFile.path;
+
+    var fragmentFile = element.firstFragment.libraryFragment.source.mustBeFile;
+    var fragmentPath = fragmentFile.path;
+
+    return '$libraryPath;$fragmentPath;${element.name}';
+  }
 }
 
 class _NameIndexAssert {
@@ -5004,3 +5019,14 @@
         'isQualified: $isQualified})';
   }
 }
+
+extension _SourceExtension on Source {
+  /// Returns the [File] for this source.
+  ///
+  /// This assumes that the source is a [FileSource], which is safe because
+  /// index and search are only supported in DAS, where all sources are file
+  /// based.
+  File get mustBeFile {
+    return (this as FileSource).file;
+  }
+}
diff --git a/pkg/analyzer/test/src/dart/analysis/result_printer.dart b/pkg/analyzer/test/src/dart/analysis/result_printer.dart
index 7de3325..9b1275c 100644
--- a/pkg/analyzer/test/src/dart/analysis/result_printer.dart
+++ b/pkg/analyzer/test/src/dart/analysis/result_printer.dart
@@ -366,6 +366,14 @@
     }
   }
 
+  /// Converts strings that look like Windows paths to Posix style.
+  String _toPosixIfWindowsPath(String str) {
+    if (str.startsWith(r'C:\')) {
+      return str.substring(2).replaceAll(r'\', '/');
+    }
+    return str;
+  }
+
   void _writeAnalyzeFileEvent(events.AnalyzeFile object) {
     if (!configuration.withAnalyzeFileEvents) {
       return;
@@ -558,7 +566,8 @@
     sink.withIndent(() {
       if (event.result case var result?) {
         sink.writeElements('strings', result.strings, (str) {
-          sink.writelnWithIndent(str);
+          var displayStr = _toPosixIfWindowsPath(str);
+          sink.writelnWithIndent(displayStr);
         });
       }
     });
diff --git a/pkg/analyzer/test/src/dart/analysis/search_test.dart b/pkg/analyzer/test/src/dart/analysis/search_test.dart
index a51b709..2f54b22 100644
--- a/pkg/analyzer/test/src/dart/analysis/search_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/search_test.dart
@@ -94,8 +94,7 @@
     Element element,
     String expected,
   ) async {
-    var searchedFiles = SearchedFiles();
-    var results = await driver.search.references(element, searchedFiles);
+    var results = await driver.search.references(element);
     var actual = _getSearchResultsText(results);
     if (actual != expected) {
       NodeTextExpectationsCollector.add(actual);
@@ -122,11 +121,7 @@
     LibraryImport import,
     String expected,
   ) async {
-    var searchedFiles = SearchedFiles();
-    var results = await driver.search.referencesLibraryImport(
-      import,
-      searchedFiles,
-    );
+    var results = await driver.search.referencesLibraryImport(import);
     var actual = _getSearchResultsText2(results);
     if (actual != expected) {
       print(actual);
@@ -139,8 +134,7 @@
     InterfaceElement element,
     String expected,
   ) async {
-    var searchedFiles = SearchedFiles();
-    var results = await driver.search.subTypes(element, searchedFiles);
+    var results = await driver.search.subTypes(element);
     var actual = _getSearchResultsText(results);
     if (actual != expected) {
       NodeTextExpectationsCollector.add(actual);
@@ -154,11 +148,7 @@
     String name,
     String expected,
   ) async {
-    var searchedFiles = SearchedFiles();
-    var results = await driver.search.unresolvedMemberReferences(
-      name,
-      searchedFiles,
-    );
+    var results = await driver.search.unresolvedMemberReferences(name);
     var actual = _getSearchResultsText(results);
     if (actual != expected) {
       print(actual);
@@ -908,7 +898,6 @@
       PackageConfigFileBuilder()..add(name: 'my', rootFolder: myRoot),
     );
 
-    var myDriver = driverFor(myFile);
     var mySession = contextFor(myFile).currentSession;
     var libraryElementResult = await mySession.getLibraryByUri(
       'package:my/my.dart',
@@ -917,13 +906,10 @@
 
     var A = libraryElementResult.element.getClass('A')!;
 
-    var searchedFiles = SearchedFiles();
-    searchedFiles.ownAnalyzed(myDriver.search);
-
     var testDriver = driverFor(testFile);
 
     // No references, but this is not the most important.
-    var references = await testDriver.search.references(A, searchedFiles);
+    var references = await testDriver.search.references(A);
     expect(references, isEmpty);
 
     // We should not add the file to known files. It is not in the
@@ -6001,7 +5987,7 @@
     var element = findNode
         .namedArgument('p: null); // 1')
         .correspondingParameter!;
-    expect(driver.search.references(element, SearchedFiles()), completes);
+    expect(driver.search.references(element), completes);
   }
 
   test_searchReferences_PrefixElement() async {
@@ -6118,7 +6104,6 @@
   }
 
   test_searchReferences_private_declaredInPart() async {
-    String p = convertPath('$testPackageLibPath/lib.dart');
     String p1 = convertPath('$testPackageLibPath/part1.dart');
     String p2 = convertPath('$testPackageLibPath/part2.dart');
 
@@ -6135,7 +6120,6 @@
 ''';
     String code2 = 'part of lib; _C v2;';
 
-    newFile(p, code);
     newFile(p1, code1);
     newFile(p2, code2);
 
@@ -6957,34 +6941,28 @@
     var a = findElement2.class_('A');
 
     // Search by 'type'.
-    List<SubtypeResult> subtypes = await driver.search.subtypes(
-      SearchedFiles(),
-      type: a,
-    );
+    List<SubtypeResult> subtypes = await driver.search.subtypes(type: a);
     expect(subtypes, hasLength(3));
 
     SubtypeResult b = subtypes.singleWhere((r) => r.name == 'B');
     SubtypeResult c = subtypes.singleWhere((r) => r.name == 'C');
     SubtypeResult d = subtypes.singleWhere((r) => r.name == 'D');
 
-    expect(b.libraryUri, testUriStr);
-    expect(b.id, '$testUriStr;$testUriStr;B');
+    expect(b.library.resource, testFile);
+    expect(b.id, '${testFile.path};${testFile.path};B');
     expect(b.members, ['methodB']);
 
-    expect(c.libraryUri, testUriStr);
-    expect(c.id, '$testUriStr;$testUriStr;C');
+    expect(c.library.resource, testFile);
+    expect(c.id, '${testFile.path};${testFile.path};C');
     expect(c.members, ['methodC']);
 
-    expect(d.libraryUri, testUriStr);
-    expect(d.id, '$testUriStr;$testUriStr;D');
+    expect(d.library.resource, testFile);
+    expect(d.id, '${testFile.path};${testFile.path};D');
     expect(d.members, ['methodD']);
 
     // Search by 'id'.
     {
-      List<SubtypeResult> subtypes = await driver.search.subtypes(
-        SearchedFiles(),
-        subtype: b,
-      );
+      List<SubtypeResult> subtypes = await driver.search.subtypes(subtype: b);
       expect(subtypes, hasLength(1));
       SubtypeResult e = subtypes.singleWhere((r) => r.name == 'E');
       expect(e.members, ['methodE']);
@@ -7004,9 +6982,7 @@
         ..add(name: 'bbb', rootFolder: getFolder(bbbPackageRootPath)),
     );
 
-    var tUri = 'package:test/test.dart';
     var aUri = 'package:aaa/a.dart';
-    var bUri = 'package:bbb/b.dart';
 
     addTestFile(r'''
 import 'package:aaa/a.dart';
@@ -7040,26 +7016,23 @@
     var aClass = aLibraryResult.element.getClass('A')!;
 
     // Search by 'type'.
-    List<SubtypeResult> subtypes = await driver.search.subtypes(
-      SearchedFiles(),
-      type: aClass,
-    );
+    List<SubtypeResult> subtypes = await driver.search.subtypes(type: aClass);
     expect(subtypes, hasLength(3));
 
     SubtypeResult t1 = subtypes.singleWhere((r) => r.name == 'T1');
     SubtypeResult t2 = subtypes.singleWhere((r) => r.name == 'T2');
     SubtypeResult b = subtypes.singleWhere((r) => r.name == 'B');
 
-    expect(t1.libraryUri, tUri);
-    expect(t1.id, '$tUri;$tUri;T1');
+    expect(t1.library.resource, testFile);
+    expect(t1.id, '${testFile.path};${testFile.path};T1');
     expect(t1.members, ['method1']);
 
-    expect(t2.libraryUri, tUri);
-    expect(t2.id, '$tUri;$tUri;T2');
+    expect(t2.library.resource, testFile);
+    expect(t2.id, '${testFile.path};${testFile.path};T2');
     expect(t2.members, ['method2']);
 
-    expect(b.libraryUri, bUri);
-    expect(b.id, '$bUri;$bUri;B');
+    expect(b.library.resource, getFile(bbbFilePath));
+    expect(b.id, '$bbbFilePath;$bbbFilePath;B');
     expect(b.members, ['method1']);
   }
 
@@ -7091,8 +7064,7 @@
         await driver.getLibraryByUri('dart:core') as LibraryElementResult;
     var listElement = coreLibResult.element.getClass('List')!;
 
-    var searchedFiles = SearchedFiles();
-    var results = await driver.search.subTypes(listElement, searchedFiles);
+    var results = await driver.search.subTypes(listElement);
 
     void assertHasResult(String uriStr, String name, {bool not = false}) {
       var matcher = contains(
@@ -7129,10 +7101,7 @@
 ''');
     var a = findElement2.class_('A');
 
-    List<SubtypeResult> subtypes = await driver.search.subtypes(
-      SearchedFiles(),
-      type: a,
-    );
+    List<SubtypeResult> subtypes = await driver.search.subtypes(type: a);
     expect(subtypes, hasLength(2));
 
     SubtypeResult b = subtypes.singleWhere((r) => r.name == 'B');
@@ -7147,7 +7116,7 @@
 class {}
 ''');
     var a = findElement2.libraryElement.classes.single;
-    var subtypes = await driver.search.subtypes(SearchedFiles(), type: a);
+    var subtypes = await driver.search.subtypes(type: a);
     expect(subtypes, isEmpty);
   }
 
@@ -7168,21 +7137,18 @@
 class B {}
 ''');
 
-    var subtypes = await driver.search.subtypes(
-      SearchedFiles(),
-      type: findElement2.class_('A'),
-    );
+    var subtypes = await driver.search.subtypes(type: findElement2.class_('A'));
     expect(subtypes, hasLength(2));
 
     var resultE1 = subtypes.singleWhere((r) => r.name == 'E1');
     var resultE2 = subtypes.singleWhere((r) => r.name == 'E2');
 
-    expect(resultE1.libraryUri, testUriStr);
-    expect(resultE1.id, '$testUriStr;$testUriStr;E1');
+    expect(resultE1.library.resource, testFile);
+    expect(resultE1.id, '${testFile.path};${testFile.path};E1');
     expect(resultE1.members, ['methodE1']);
 
-    expect(resultE2.libraryUri, testUriStr);
-    expect(resultE2.id, '$testUriStr;$testUriStr;E2');
+    expect(resultE2.library.resource, testFile);
+    expect(resultE2.id, '${testFile.path};${testFile.path};E2');
     expect(resultE2.members, ['methodE2']);
   }
 
@@ -7199,21 +7165,18 @@
 }
 ''');
 
-    var subtypes = await driver.search.subtypes(
-      SearchedFiles(),
-      type: findElement2.class_('A'),
-    );
+    var subtypes = await driver.search.subtypes(type: findElement2.class_('A'));
     expect(subtypes, hasLength(2));
 
     var resultE1 = subtypes.singleWhere((r) => r.name == 'E1');
     var resultE2 = subtypes.singleWhere((r) => r.name == 'E2');
 
-    expect(resultE1.libraryUri, testUriStr);
-    expect(resultE1.id, '$testUriStr;$testUriStr;E1');
+    expect(resultE1.library.resource, testFile);
+    expect(resultE1.id, '${testFile.path};${testFile.path};E1');
     expect(resultE1.members, ['methodE1']);
 
-    expect(resultE2.libraryUri, testUriStr);
-    expect(resultE2.id, '$testUriStr;$testUriStr;E2');
+    expect(resultE2.library.resource, testFile);
+    expect(resultE2.id, '${testFile.path};${testFile.path};E2');
     expect(resultE2.members, ['methodE2']);
   }
 
@@ -7227,15 +7190,14 @@
 ''');
 
     var subtypes = await driver.search.subtypes(
-      SearchedFiles(),
       type: findElement2.extensionType('A'),
     );
     expect(subtypes, hasLength(1));
 
     var B = subtypes.singleWhere((r) => r.name == 'B');
 
-    expect(B.libraryUri, testUriStr);
-    expect(B.id, '$testUriStr;$testUriStr;B');
+    expect(B.library.resource, testFile);
+    expect(B.id, '${testFile.path};${testFile.path};B');
     expect(B.members, ['methodB']);
   }
 
@@ -7258,22 +7220,22 @@
     var b = findElement2.class_('B');
 
     {
-      var subtypes = await driver.search.subtypes(SearchedFiles(), type: a);
+      var subtypes = await driver.search.subtypes(type: a);
       expect(subtypes, hasLength(1));
 
       var m = subtypes.singleWhere((r) => r.name == 'M');
-      expect(m.libraryUri, testUriStr);
-      expect(m.id, '$testUriStr;$testUriStr;M');
+      expect(m.library.resource, testFile);
+      expect(m.id, '${testFile.path};${testFile.path};M');
       expect(m.members, ['methodA', 'methodM']);
     }
 
     {
-      var subtypes = await driver.search.subtypes(SearchedFiles(), type: b);
+      var subtypes = await driver.search.subtypes(type: b);
       expect(subtypes, hasLength(1));
 
       var m = subtypes.singleWhere((r) => r.name == 'M');
-      expect(m.libraryUri, testUriStr);
-      expect(m.id, '$testUriStr;$testUriStr;M');
+      expect(m.library.resource, testFile);
+      expect(m.id, '${testFile.path};${testFile.path};M');
       expect(m.members, ['methodA', 'methodM']);
     }
   }
@@ -7302,8 +7264,7 @@
   }
 
   Future<List<Element>> _findClassMembers(String name) {
-    var searchedFiles = SearchedFiles();
-    return driver.search.classMembers(name, searchedFiles);
+    return driver.search.classMembers(name);
   }
 
   String _getDeclarationsText(
diff --git a/pkg/analyzer/test/src/dart/analysis/unlinked_api_signature_test.dart b/pkg/analyzer/test/src/dart/analysis/unlinked_api_signature_test.dart
index 9489fcb..11b4e88 100644
--- a/pkg/analyzer/test/src/dart/analysis/unlinked_api_signature_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/unlinked_api_signature_test.dart
@@ -87,6 +87,21 @@
     );
   }
 
+  test_class_constructor_block_to_external() {
+    _assertNotSameSignature(
+      r'''
+class C {
+  C() {}
+}
+''',
+      r'''
+class C {
+  external C();
+}
+''',
+    );
+  }
+
   test_class_constructor_empty_to_block() {
     _assertNotSameSignature(
       r'''
@@ -117,6 +132,21 @@
     );
   }
 
+  test_class_constructor_external_to_block() {
+    _assertNotSameSignature(
+      r'''
+class C {
+  external C();
+}
+''',
+      r'''
+class C {
+  C() {}
+}
+''',
+    );
+  }
+
   test_class_constructor_initializer_const() {
     _assertNotSameSignature(
       r'''
@@ -918,6 +948,17 @@
     );
   }
 
+  test_classLike_method_external_to_block() {
+    _assertNotSameSignature_classLike(
+      r'''
+external void foo();
+''',
+      r'''
+void foo() {}
+''',
+    );
+  }
+
   test_classLike_method_getter_body_block_to_empty() {
     _assertNotSameSignature_classLike(
       r'''
@@ -1487,6 +1528,17 @@
     );
   }
 
+  test_executable_body_block_to_external() {
+    _assertNotSameSignature_executable(
+      r'''
+void foo() {}
+''',
+      r'''
+external void foo();
+''',
+    );
+  }
+
   test_executable_body_block_to_native() {
     _assertNotSameSignature_executable(
       r'''
@@ -1535,6 +1587,17 @@
     );
   }
 
+  test_executable_body_external_to_block() {
+    _assertNotSameSignature_executable(
+      r'''
+external void foo();
+''',
+      r'''
+void foo() {}
+''',
+    );
+  }
+
   test_executable_body_native_to_block() {
     _assertNotSameSignature_executable(
       r'''
diff --git a/pkg/analyzer/test/src/dart/element/flatten_type_test.dart b/pkg/analyzer/test/src/dart/element/flatten_type_test.dart
index f3cf228..4a15af5 100644
--- a/pkg/analyzer/test/src/dart/element/flatten_type_test.dart
+++ b/pkg/analyzer/test/src/dart/element/flatten_type_test.dart
@@ -14,6 +14,7 @@
   defineReflectiveSuite(() {
     defineReflectiveTests(FlattenTypeTest);
     defineReflectiveTests(FutureTypeTest);
+    defineReflectiveTests(UnionFreeTypeTest);
   });
 }
 
@@ -203,3 +204,36 @@
     }
   }
 }
+
+@reflectiveTest
+class UnionFreeTypeTest extends AbstractTypeSystemTest {
+  test_future_notStripped() {
+    _check(parseType('Future<int>?'), 'Future<int>');
+  }
+
+  test_futureOr() {
+    _check(parseType('FutureOr<int>'), 'int');
+  }
+
+  test_futureOr_nestedNullable() {
+    _check(parseType('FutureOr<FutureOr<int?>?>?'), 'int');
+  }
+
+  test_nullable() {
+    _check(parseType('int?'), 'int');
+  }
+
+  test_plain() {
+    _check(parseType('int'), 'int');
+  }
+
+  test_unknownInferredType() {
+    var type = UnknownInferredType.instance;
+    expect(typeSystem.unionFreeType(type), same(type));
+  }
+
+  void _check(TypeImpl T, String expected) {
+    var result = typeSystem.unionFreeType(T);
+    expect(result.getDisplayString(), expected);
+  }
+}
diff --git a/pkg/analyzer/test/src/dart/parser/class_test.dart b/pkg/analyzer/test/src/dart/parser/class_test.dart
index 4476290..23fa378 100644
--- a/pkg/analyzer/test/src/dart/parser/class_test.dart
+++ b/pkg/analyzer/test/src/dart/parser/class_test.dart
@@ -2,7 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/src/diagnostic/diagnostic.dart' as diag;
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../../diagnostics/parser_diagnostics.dart';
@@ -21,7 +20,7 @@
     var parseResult = parseStringWithErrors(r'''
 augment class A {}
 ''');
-    parseResult.assertNoErrors();
+    parseResult.assertExpectedDiagnostics();
 
     var node = parseResult.findNode.singleClassDeclaration;
     assertParsedNodeText(node, r'''
@@ -40,7 +39,7 @@
     var parseResult = parseStringWithErrors(r'''
 augment abstract class A {}
 ''');
-    parseResult.assertNoErrors();
+    parseResult.assertExpectedDiagnostics();
     assertParsedNodeText(parseResult.findNode.singleClassDeclaration, r'''
 ClassDeclaration
   augmentKeyword: augment
@@ -58,7 +57,7 @@
     var parseResult = parseStringWithErrors(r'''
 augment abstract base class A {}
 ''');
-    parseResult.assertNoErrors();
+    parseResult.assertExpectedDiagnostics();
     assertParsedNodeText(parseResult.findNode.singleClassDeclaration, r'''
 ClassDeclaration
   augmentKeyword: augment
@@ -77,7 +76,7 @@
     var parseResult = parseStringWithErrors(r'''
 augment base class A {}
 ''');
-    parseResult.assertNoErrors();
+    parseResult.assertExpectedDiagnostics();
     assertParsedNodeText(parseResult.findNode.singleClassDeclaration, r'''
 ClassDeclaration
   augmentKeyword: augment
@@ -95,7 +94,7 @@
     var parseResult = parseStringWithErrors(r'''
 augment class A extends B {}
 ''');
-    parseResult.assertNoErrors();
+    parseResult.assertExpectedDiagnostics();
     assertParsedNodeText(parseResult.findNode.singleClassDeclaration, r'''
 ClassDeclaration
   augmentKeyword: augment
@@ -116,7 +115,7 @@
     var parseResult = parseStringWithErrors(r'''
 augment final class A {}
 ''');
-    parseResult.assertNoErrors();
+    parseResult.assertExpectedDiagnostics();
     assertParsedNodeText(parseResult.findNode.singleClassDeclaration, r'''
 ClassDeclaration
   augmentKeyword: augment
@@ -134,7 +133,7 @@
     var parseResult = parseStringWithErrors(r'''
 augment class A implements B {}
 ''');
-    parseResult.assertNoErrors();
+    parseResult.assertExpectedDiagnostics();
     assertParsedNodeText(parseResult.findNode.singleClassDeclaration, r'''
 ClassDeclaration
   augmentKeyword: augment
@@ -156,7 +155,7 @@
     var parseResult = parseStringWithErrors(r'''
 augment interface class A {}
 ''');
-    parseResult.assertNoErrors();
+    parseResult.assertExpectedDiagnostics();
     assertParsedNodeText(parseResult.findNode.singleClassDeclaration, r'''
 ClassDeclaration
   augmentKeyword: augment
@@ -174,7 +173,7 @@
     var parseResult = parseStringWithErrors(r'''
 augment mixin class A {}
 ''');
-    parseResult.assertNoErrors();
+    parseResult.assertExpectedDiagnostics();
     assertParsedNodeText(parseResult.findNode.singleClassDeclaration, r'''
 ClassDeclaration
   augmentKeyword: augment
@@ -191,10 +190,9 @@
   test_augment_namedMixinApplication() {
     var parseResult = parseStringWithErrors(r'''
 augment class A = B with M;
+// [diag.mixinApplicationClassAugmentation][column 1][length 7] A mixin application class can't be augmented.
 ''');
-    parseResult.assertErrors([
-      error(diag.mixinApplicationClassAugmentation, 0, 7),
-    ]);
+    parseResult.assertExpectedDiagnostics();
     assertParsedNodeText(parseResult.findNode.unit, r'''
 CompilationUnit
   declarations
@@ -218,7 +216,7 @@
     var parseResult = parseStringWithErrors(r'''
 augment sealed class A {}
 ''');
-    parseResult.assertNoErrors();
+    parseResult.assertExpectedDiagnostics();
     assertParsedNodeText(parseResult.findNode.singleClassDeclaration, r'''
 ClassDeclaration
   augmentKeyword: augment
@@ -236,7 +234,7 @@
     var parseResult = parseStringWithErrors(r'''
 augment class A<T extends int> {}
 ''');
-    parseResult.assertNoErrors();
+    parseResult.assertExpectedDiagnostics();
     assertParsedNodeText(parseResult.findNode.singleClassDeclaration, r'''
 ClassDeclaration
   augmentKeyword: augment
@@ -262,7 +260,7 @@
     var parseResult = parseStringWithErrors(r'''
 augment class A with M {}
 ''');
-    parseResult.assertNoErrors();
+    parseResult.assertExpectedDiagnostics();
     assertParsedNodeText(parseResult.findNode.singleClassDeclaration, r'''
 ClassDeclaration
   augmentKeyword: augment
@@ -284,7 +282,7 @@
     var parseResult = parseStringWithErrors(r'''
 class A;
 ''');
-    parseResult.assertNoErrors();
+    parseResult.assertExpectedDiagnostics();
 
     var node = parseResult.findNode.singleClassDeclaration;
     assertParsedNodeText(node, r'''
@@ -303,7 +301,7 @@
   factory named() {}
 }
 ''');
-    parseResult.assertNoErrors();
+    parseResult.assertExpectedDiagnostics();
 
     var node = parseResult.findNode.singleConstructorDeclaration;
     assertParsedNodeText(node, r'''
@@ -326,7 +324,7 @@
   const factory named() = B;
 }
 ''');
-    parseResult.assertNoErrors();
+    parseResult.assertExpectedDiagnostics();
 
     var node = parseResult.findNode.singleConstructorDeclaration;
     assertParsedNodeText(node, r'''
@@ -350,9 +348,11 @@
     var parseResult = parseStringWithErrors(r'''
 class A {
   factory new() {}
+//        ^^^
+// [diag.factoryConstructorNewName] Factory constructors can't be named 'new'.
 }
 ''');
-    parseResult.assertErrors([error(diag.factoryConstructorNewName, 20, 3)]);
+    parseResult.assertExpectedDiagnostics();
 
     var node = parseResult.findNode.singleConstructorDeclaration;
     assertParsedNodeText(node, r'''
@@ -375,7 +375,7 @@
   factory () {}
 }
 ''');
-    parseResult.assertNoErrors();
+    parseResult.assertExpectedDiagnostics();
 
     var node = parseResult.findNode.singleConstructorDeclaration;
     assertParsedNodeText(node, r'''
@@ -397,7 +397,7 @@
   const factory () = B;
 }
 ''');
-    parseResult.assertNoErrors();
+    parseResult.assertExpectedDiagnostics();
 
     var node = parseResult.findNode.singleConstructorDeclaration;
     assertParsedNodeText(node, r'''
@@ -422,7 +422,7 @@
   new named();
 }
 ''');
-    parseResult.assertNoErrors();
+    parseResult.assertExpectedDiagnostics();
 
     var node = parseResult.findNode.singleConstructorDeclaration;
     assertParsedNodeText(node, r'''
@@ -443,7 +443,7 @@
   new named() {}
 }
 ''');
-    parseResult.assertNoErrors();
+    parseResult.assertExpectedDiagnostics();
 
     var node = parseResult.findNode.singleConstructorDeclaration;
     assertParsedNodeText(node, r'''
@@ -466,7 +466,7 @@
   const new named();
 }
 ''');
-    parseResult.assertNoErrors();
+    parseResult.assertExpectedDiagnostics();
 
     var node = parseResult.findNode.singleConstructorDeclaration;
     assertParsedNodeText(node, r'''
@@ -488,7 +488,7 @@
   new named() : x = 0;
 }
 ''');
-    parseResult.assertNoErrors();
+    parseResult.assertExpectedDiagnostics();
 
     var node = parseResult.findNode.singleConstructorDeclaration;
     assertParsedNodeText(node, r'''
@@ -515,9 +515,11 @@
     var parseResult = parseStringWithErrors(r'''
 class A {
   new new();
+//    ^^^
+// [diag.newConstructorNewName] Constructors declared with the 'new' keyword can't be named 'new'.
 }
 ''');
-    parseResult.assertErrors([error(diag.newConstructorNewName, 16, 3)]);
+    parseResult.assertExpectedDiagnostics();
 
     var node = parseResult.findNode.singleConstructorDeclaration;
     assertParsedNodeText(node, r'''
@@ -538,7 +540,7 @@
   new ();
 }
 ''');
-    parseResult.assertNoErrors();
+    parseResult.assertExpectedDiagnostics();
 
     var node = parseResult.findNode.singleConstructorDeclaration;
     assertParsedNodeText(node, r'''
@@ -558,7 +560,7 @@
   new () {}
 }
 ''');
-    parseResult.assertNoErrors();
+    parseResult.assertExpectedDiagnostics();
 
     var node = parseResult.findNode.singleConstructorDeclaration;
     assertParsedNodeText(node, r'''
@@ -580,7 +582,7 @@
   const new ();
 }
 ''');
-    parseResult.assertNoErrors();
+    parseResult.assertExpectedDiagnostics();
 
     var node = parseResult.findNode.singleConstructorDeclaration;
     assertParsedNodeText(node, r'''
@@ -601,7 +603,7 @@
   new () : x = 0;
 }
 ''');
-    parseResult.assertNoErrors();
+    parseResult.assertExpectedDiagnostics();
 
     var node = parseResult.findNode.singleConstructorDeclaration;
     assertParsedNodeText(node, r'''
@@ -629,7 +631,7 @@
   new (int x, {required String y});
 }
 ''');
-    parseResult.assertNoErrors();
+    parseResult.assertExpectedDiagnostics();
 
     var node = parseResult.findNode.singleConstructorDeclaration;
     assertParsedNodeText(node, r'''
@@ -654,13 +656,38 @@
 ''');
   }
 
+  test_constructor_typeName_augment_factory_unnamed() {
+    var parseResult = parseStringWithErrors(r'''
+augment class A {
+  augment factory A() {}
+}
+''');
+    parseResult.assertExpectedDiagnostics();
+
+    var node = parseResult.findNode.singleConstructorDeclaration;
+    assertParsedNodeText(node, r'''
+ConstructorDeclaration
+  augmentKeyword: augment
+  factoryKeyword: factory
+  typeName: SimpleIdentifier
+    token: A
+  parameters: FormalParameterList
+    leftParenthesis: (
+    rightParenthesis: )
+  body: BlockFunctionBody
+    block: Block
+      leftBracket: {
+      rightBracket: }
+''');
+  }
+
   test_constructor_typeName_augment_named() {
     var parseResult = parseStringWithErrors(r'''
 augment class A {
   augment A.named();
 }
 ''');
-    parseResult.assertNoErrors();
+    parseResult.assertExpectedDiagnostics();
 
     var node = parseResult.findNode.singleConstructorDeclaration;
     assertParsedNodeText(node, r'''
@@ -683,11 +710,11 @@
 class A {
   final int f;
   external A([this.f = 0]);
+//            ^^^^
+// [diag.externalConstructorWithFieldInitializers] An external constructor can't initialize fields.
 }
 ''');
-    parseResult.assertErrors([
-      error(diag.externalConstructorWithFieldInitializers, 39, 4),
-    ]);
+    parseResult.assertExpectedDiagnostics();
 
     var node = parseResult.findNode.singleConstructorDeclaration;
     assertParsedNodeText(node, r'''
@@ -718,11 +745,11 @@
 class A {
   final int f;
   external A(this.f);
+//           ^^^^
+// [diag.externalConstructorWithFieldInitializers] An external constructor can't initialize fields.
 }
 ''');
-    parseResult.assertErrors([
-      error(diag.externalConstructorWithFieldInitializers, 38, 4),
-    ]);
+    parseResult.assertExpectedDiagnostics();
 
     var node = parseResult.findNode.singleConstructorDeclaration;
     assertParsedNodeText(node, r'''
@@ -747,11 +774,11 @@
 class A {
   final int f;
   external A() : f = 0;
+//             ^
+// [diag.externalConstructorWithInitializer] An external constructor can't have any initializers.
 }
 ''');
-    parseResult.assertErrors([
-      error(diag.externalConstructorWithInitializer, 40, 1),
-    ]);
+    parseResult.assertExpectedDiagnostics();
 
     var node = parseResult.findNode.singleConstructorDeclaration;
     assertParsedNodeText(node, r'''
@@ -781,7 +808,7 @@
   factory A.named() {}
 }
 ''');
-    parseResult.assertNoErrors();
+    parseResult.assertExpectedDiagnostics();
 
     var node = parseResult.findNode.singleConstructorDeclaration;
     assertParsedNodeText(node, r'''
@@ -808,7 +835,7 @@
   factory A.named() {}
 }
 ''');
-    parseResult.assertNoErrors();
+    parseResult.assertExpectedDiagnostics();
 
     var node = parseResult.findNode.singleConstructorDeclaration;
     assertParsedNodeText(node, r'''
@@ -834,7 +861,7 @@
   factory A() {}
 }
 ''');
-    parseResult.assertNoErrors();
+    parseResult.assertExpectedDiagnostics();
 
     var node = parseResult.findNode.singleConstructorDeclaration;
     assertParsedNodeText(node, r'''
@@ -859,7 +886,7 @@
   factory A() {}
 }
 ''');
-    parseResult.assertNoErrors();
+    parseResult.assertExpectedDiagnostics();
 
     var node = parseResult.findNode.singleConstructorDeclaration;
     assertParsedNodeText(node, r'''
@@ -884,7 +911,7 @@
   factory B() {}
 }
 ''');
-    parseResult.assertNoErrors();
+    parseResult.assertExpectedDiagnostics();
 
     var node = parseResult.findNode.singleConstructorDeclaration;
     assertParsedNodeText(node, r'''
@@ -906,12 +933,12 @@
     var parseResult = parseStringWithErrors(r'''
 class A {
   A(const int a(String x));
+//  ^^^^^
+// [diag.extraneousModifier] Can't have modifier 'const' here.
+// [diag.functionTypedParameterVar] Function-typed parameters can't specify 'const', 'final' or 'var' in place of a return type.
 }
 ''');
-    parseResult.assertErrors([
-      error(diag.extraneousModifier, 14, 5),
-      error(diag.functionTypedParameterVar, 14, 5),
-    ]);
+    parseResult.assertExpectedDiagnostics();
 
     var node = parseResult.findNode.singleConstructorDeclaration;
     assertParsedNodeText(node, r'''
@@ -948,7 +975,7 @@
   );
 }
 ''');
-    parseResult.assertNoErrors();
+    parseResult.assertExpectedDiagnostics();
 
     var node = parseResult.findNode.singleConstructorDeclaration;
     assertParsedNodeText(node, r'''
@@ -982,12 +1009,12 @@
     var parseResult = parseStringWithErrors(r'''
 class A {
   A(final int a(String x));
+//  ^^^^^
+// [diag.functionTypedParameterVar] Function-typed parameters can't specify 'const', 'final' or 'var' in place of a return type.
+// [diag.extraneousModifier] Can't have modifier 'final' here.
 }
 ''');
-    parseResult.assertErrors([
-      error(diag.extraneousModifier, 14, 5),
-      error(diag.functionTypedParameterVar, 14, 5),
-    ]);
+    parseResult.assertExpectedDiagnostics();
 
     var node = parseResult.findNode.singleConstructorDeclaration;
     assertParsedNodeText(node, r'''
@@ -1019,9 +1046,11 @@
     var parseResult = parseStringWithErrors(r'''
 class A {
   A(const int a);
+//  ^^^^^
+// [diag.extraneousModifier] Can't have modifier 'const' here.
 }
 ''');
-    parseResult.assertErrors([error(diag.extraneousModifier, 14, 5)]);
+    parseResult.assertExpectedDiagnostics();
 
     var node = parseResult.findNode.singleConstructorDeclaration;
     assertParsedNodeText(node, r'''
@@ -1050,7 +1079,7 @@
   );
 }
 ''');
-    parseResult.assertNoErrors();
+    parseResult.assertExpectedDiagnostics();
 
     var node = parseResult.findNode.singleConstructorDeclaration;
     assertParsedNodeText(node, r'''
@@ -1076,9 +1105,11 @@
     var parseResult = parseStringWithErrors(r'''
 class A {
   A(final int a);
+//  ^^^^^
+// [diag.extraneousModifier] Can't have modifier 'final' here.
 }
 ''');
-    parseResult.assertErrors([error(diag.extraneousModifier, 14, 5)]);
+    parseResult.assertExpectedDiagnostics();
 
     var node = parseResult.findNode.singleConstructorDeclaration;
     assertParsedNodeText(node, r'''
@@ -1104,7 +1135,7 @@
   A.named();
 }
 ''');
-    parseResult.assertNoErrors();
+    parseResult.assertExpectedDiagnostics();
 
     var node = parseResult.findNode.singleConstructorDeclaration;
     assertParsedNodeText(node, r'''
@@ -1125,9 +1156,11 @@
     var parseResult = parseStringWithErrors(r'''
 class A {
   A.();
+//  ^
+// [diag.missingIdentifier] Expected an identifier.
 }
 ''');
-    parseResult.assertErrors([error(diag.missingIdentifier, 14, 1)]);
+    parseResult.assertExpectedDiagnostics();
 
     var node = parseResult.findNode.singleConstructorDeclaration;
     assertParsedNodeText(node, r'''
@@ -1150,7 +1183,7 @@
   A();
 }
 ''');
-    parseResult.assertNoErrors();
+    parseResult.assertExpectedDiagnostics();
 
     var node = parseResult.findNode.singleConstructorDeclaration;
     assertParsedNodeText(node, r'''
@@ -1171,7 +1204,7 @@
   augment int x = 0;
 }
 ''');
-    parseResult.assertNoErrors();
+    parseResult.assertExpectedDiagnostics();
     assertParsedNodeText(parseResult.findNode.singleClassDeclaration, r'''
 ClassDeclaration
   augmentKeyword: augment
@@ -1203,7 +1236,7 @@
   augment covariant int x = 0;
 }
 ''');
-    parseResult.assertNoErrors();
+    parseResult.assertExpectedDiagnostics();
     assertParsedNodeText(parseResult.findNode.singleClassDeclaration, r'''
 ClassDeclaration
   augmentKeyword: augment
@@ -1236,7 +1269,7 @@
   augment late int x;
 }
 ''');
-    parseResult.assertNoErrors();
+    parseResult.assertExpectedDiagnostics();
     assertParsedNodeText(parseResult.findNode.singleClassDeclaration, r'''
 ClassDeclaration
   augmentKeyword: augment
@@ -1266,7 +1299,7 @@
   augment static int x = 0;
 }
 ''');
-    parseResult.assertNoErrors();
+    parseResult.assertExpectedDiagnostics();
     assertParsedNodeText(parseResult.findNode.singleClassDeclaration, r'''
 ClassDeclaration
   augmentKeyword: augment
@@ -1299,7 +1332,7 @@
   augment static final int x = 0;
 }
 ''');
-    parseResult.assertNoErrors();
+    parseResult.assertExpectedDiagnostics();
     assertParsedNodeText(parseResult.findNode.singleClassDeclaration, r'''
 ClassDeclaration
   augmentKeyword: augment
@@ -1333,7 +1366,7 @@
   augment int get foo => 0;
 }
 ''');
-    parseResult.assertNoErrors();
+    parseResult.assertExpectedDiagnostics();
     assertParsedNodeText(parseResult.findNode.singleClassDeclaration, r'''
 ClassDeclaration
   augmentKeyword: augment
@@ -1364,7 +1397,7 @@
   augment static int get foo => 0;
 }
 ''');
-    parseResult.assertNoErrors();
+    parseResult.assertExpectedDiagnostics();
     assertParsedNodeText(parseResult.findNode.singleClassDeclaration, r'''
 ClassDeclaration
   augmentKeyword: augment
@@ -1396,7 +1429,7 @@
   static int get foo;
 }
 ''');
-    parseResult.assertNoErrors();
+    parseResult.assertExpectedDiagnostics();
 
     var node = parseResult.findNode.singleMethodDeclaration;
     assertParsedNodeText(node, r'''
@@ -1412,13 +1445,15 @@
   }
 
   test_getter_static_body_empty_language305() {
-    var parseResult = parseStringWithErrors('''
+    var parseResult = parseStringWithErrors(r'''
 // @dart = 3.5
 class A {
   static int get foo;
+//                  ^
+// [diag.missingFunctionBody] A function body must be provided.
 }
 ''');
-    parseResult.assertErrors([error(diag.missingFunctionBody, 45, 1)]);
+    parseResult.assertExpectedDiagnostics();
 
     var node = parseResult.findNode.singleMethodDeclaration;
     assertParsedNodeText(node, r'''
@@ -1439,7 +1474,7 @@
   augment void foo() {}
 }
 ''');
-    parseResult.assertNoErrors();
+    parseResult.assertExpectedDiagnostics();
 
     var node = parseResult.findNode.singleClassDeclaration;
     assertParsedNodeText(node, r'''
@@ -1471,9 +1506,11 @@
     var parseResult = parseStringWithErrors(r'''
 augment class A {
   augment abstract void foo();
+//        ^^^^^^^^
+// [diag.abstractClassMember] Members of classes can't be declared to be 'abstract'.
 }
 ''');
-    parseResult.assertErrors([error(diag.abstractClassMember, 28, 8)]);
+    parseResult.assertExpectedDiagnostics();
     assertParsedNodeText(parseResult.findNode.singleClassDeclaration, r'''
 ClassDeclaration
   augmentKeyword: augment
@@ -1503,7 +1540,7 @@
   augment static void foo() {}
 }
 ''');
-    parseResult.assertNoErrors();
+    parseResult.assertExpectedDiagnostics();
     assertParsedNodeText(parseResult.findNode.singleClassDeclaration, r'''
 ClassDeclaration
   augmentKeyword: augment
@@ -1536,7 +1573,7 @@
   static int foo();
 }
 ''');
-    parseResult.assertNoErrors();
+    parseResult.assertExpectedDiagnostics();
 
     var node = parseResult.findNode.singleMethodDeclaration;
     assertParsedNodeText(node, r'''
@@ -1554,13 +1591,15 @@
   }
 
   test_method_static_body_empty_language305() {
-    var parseResult = parseStringWithErrors('''
+    var parseResult = parseStringWithErrors(r'''
 // @dart = 3.5
 class A {
   static int foo();
+//                ^
+// [diag.missingFunctionBody] A function body must be provided.
 }
 ''');
-    parseResult.assertErrors([error(diag.missingFunctionBody, 43, 1)]);
+    parseResult.assertExpectedDiagnostics();
 
     var node = parseResult.findNode.singleMethodDeclaration;
     assertParsedNodeText(node, r'''
@@ -1581,7 +1620,7 @@
     var parseResult = parseStringWithErrors(r'''
 augment class A<T> {}
 ''');
-    parseResult.assertNoErrors();
+    parseResult.assertExpectedDiagnostics();
     assertParsedNodeText(parseResult.findNode.singleClassDeclaration, r'''
 ClassDeclaration
   augmentKeyword: augment
@@ -1604,7 +1643,7 @@
     var parseResult = parseStringWithErrors(r'''
 class A<T, U> {}
 ''');
-    parseResult.assertNoErrors();
+    parseResult.assertExpectedDiagnostics();
 
     var node = parseResult.findNode.singleClassDeclaration;
     assertParsedNodeText(node, r'''
@@ -1630,7 +1669,7 @@
     var parseResult = parseStringWithErrors(r'''
 class A {}
 ''');
-    parseResult.assertNoErrors();
+    parseResult.assertExpectedDiagnostics();
 
     var node = parseResult.findNode.singleClassDeclaration;
     assertParsedNodeText(node, r'''
@@ -1650,7 +1689,7 @@
   augment int operator+(int other) => 0;
 }
 ''');
-    parseResult.assertNoErrors();
+    parseResult.assertExpectedDiagnostics();
     assertParsedNodeText(parseResult.findNode.singleClassDeclaration, r'''
 ClassDeclaration
   augmentKeyword: augment
@@ -1686,7 +1725,7 @@
     var parseResult = parseStringWithErrors(r'''
 class const A<T, U>.named() {}
 ''');
-    parseResult.assertNoErrors();
+    parseResult.assertExpectedDiagnostics();
 
     var node = parseResult.findNode.singleClassDeclaration;
     assertParsedNodeText(node, r'''
@@ -1719,7 +1758,7 @@
     var parseResult = parseStringWithErrors(r'''
 class const A<T, U>() {}
 ''');
-    parseResult.assertNoErrors();
+    parseResult.assertExpectedDiagnostics();
 
     var node = parseResult.findNode.singleClassDeclaration;
     assertParsedNodeText(node, r'''
@@ -1749,17 +1788,17 @@
     var parseResult = parseStringWithErrors(r'''
 mixin M {}
 class const C = Object with M;
+//    ^^^^^
+// [diag.constWithoutPrimaryConstructor] 'const' can only be used together with a primary constructor declaration.
 ''');
-    parseResult.assertErrors([
-      error(diag.constWithoutPrimaryConstructor, 17, 5),
-    ]);
+    parseResult.assertExpectedDiagnostics();
   }
 
   test_primaryConstructor_const_noTypeParameters_named() {
     var parseResult = parseStringWithErrors(r'''
 class const A.named() {}
 ''');
-    parseResult.assertNoErrors();
+    parseResult.assertExpectedDiagnostics();
 
     var node = parseResult.findNode.singleClassDeclaration;
     assertParsedNodeText(node, r'''
@@ -1784,7 +1823,7 @@
     var parseResult = parseStringWithErrors(r'''
 class const A() {}
 ''');
-    parseResult.assertNoErrors();
+    parseResult.assertExpectedDiagnostics();
 
     var node = parseResult.findNode.singleClassDeclaration;
     assertParsedNodeText(node, r'''
@@ -1805,10 +1844,10 @@
   test_primaryConstructor_const_typeName_noFormalParameters() {
     var parseResult = parseStringWithErrors(r'''
 class const A {}
+//    ^^^^^
+// [diag.constWithoutPrimaryConstructor] 'const' can only be used together with a primary constructor declaration.
 ''');
-    parseResult.assertErrors([
-      error(diag.constWithoutPrimaryConstructor, 6, 5),
-    ]);
+    parseResult.assertExpectedDiagnostics();
 
     var node = parseResult.findNode.singleClassDeclaration;
     assertParsedNodeText(node, r'''
@@ -1826,8 +1865,10 @@
     var parseResult = parseStringWithErrors(r'''
 // @dart=3.10
 class const A {}
+//    ^^^^^
+// [diag.unexpectedToken] Unexpected text 'const'.
 ''');
-    parseResult.assertErrors([error(diag.unexpectedToken, 20, 5)]);
+    parseResult.assertExpectedDiagnostics();
 
     var node = parseResult.findNode.singleClassDeclaration;
     assertParsedNodeText(node, r'''
@@ -1846,7 +1887,7 @@
 class const A.named {}
 ''');
     // TODO(scheglov): this is wrong.
-    parseResult.assertNoErrors();
+    parseResult.assertExpectedDiagnostics();
 
     var node = parseResult.findNode.singleClassDeclaration;
     assertParsedNodeText(node, r'''
@@ -1871,7 +1912,7 @@
     var parseResult = parseStringWithErrors(r'''
 class A({final int a = 0}) {}
 ''');
-    parseResult.assertNoErrors();
+    parseResult.assertExpectedDiagnostics();
 
     var node = parseResult.findNode.singleClassDeclaration;
     assertParsedNodeText(node, r'''
@@ -1903,7 +1944,7 @@
     var parseResult = parseStringWithErrors(r'''
 class A({var int a = 0}) {}
 ''');
-    parseResult.assertNoErrors();
+    parseResult.assertExpectedDiagnostics();
 
     var node = parseResult.findNode.singleClassDeclaration;
     assertParsedNodeText(node, r'''
@@ -1935,7 +1976,7 @@
     var parseResult = parseStringWithErrors(r'''
 class A({required final int a = 0}) {}
 ''');
-    parseResult.assertNoErrors();
+    parseResult.assertExpectedDiagnostics();
 
     var node = parseResult.findNode.singleClassDeclaration;
     assertParsedNodeText(node, r'''
@@ -1971,7 +2012,7 @@
   required final int a = 0,
 }) {}
 ''');
-    parseResult.assertNoErrors();
+    parseResult.assertExpectedDiagnostics();
 
     var node = parseResult.findNode.singleClassDeclaration;
     assertParsedNodeText(node, r'''
@@ -2007,7 +2048,7 @@
     var parseResult = parseStringWithErrors(r'''
 class A({required var int a = 0}) {}
 ''');
-    parseResult.assertNoErrors();
+    parseResult.assertExpectedDiagnostics();
 
     var node = parseResult.findNode.singleClassDeclaration;
     assertParsedNodeText(node, r'''
@@ -2040,7 +2081,7 @@
     var parseResult = parseStringWithErrors(r'''
 class A([final int a = 0]) {}
 ''');
-    parseResult.assertNoErrors();
+    parseResult.assertExpectedDiagnostics();
 
     var node = parseResult.findNode.singleClassDeclaration;
     assertParsedNodeText(node, r'''
@@ -2072,7 +2113,7 @@
     var parseResult = parseStringWithErrors(r'''
 class A([var int a = 0]) {}
 ''');
-    parseResult.assertNoErrors();
+    parseResult.assertExpectedDiagnostics();
 
     var node = parseResult.findNode.singleClassDeclaration;
     assertParsedNodeText(node, r'''
@@ -2103,8 +2144,10 @@
   test_primaryConstructor_declaringFormalParameter_functionTyped_const() {
     var parseResult = parseStringWithErrors(r'''
 class A(const int a(String x)) {}
+//      ^^^^^
+// [diag.extraneousModifier] Can't have modifier 'const' here.
 ''');
-    parseResult.assertErrors([error(diag.extraneousModifier, 8, 5)]);
+    parseResult.assertExpectedDiagnostics();
 
     var node = parseResult.findNode.singleClassDeclaration;
     assertParsedNodeText(node, r'''
@@ -2138,7 +2181,7 @@
     var parseResult = parseStringWithErrors(r'''
 class A(final int a(String x)) {}
 ''');
-    parseResult.assertNoErrors();
+    parseResult.assertExpectedDiagnostics();
 
     var node = parseResult.findNode.singleClassDeclaration;
     assertParsedNodeText(node, r'''
@@ -2175,7 +2218,7 @@
   final int a(String x)
 ) {}
 ''');
-    parseResult.assertNoErrors();
+    parseResult.assertExpectedDiagnostics();
 
     var node = parseResult.findNode.singleClassDeclaration;
     assertParsedNodeText(node, r'''
@@ -2212,7 +2255,7 @@
     var parseResult = parseStringWithErrors(r'''
 class A(var int a(String x)) {}
 ''');
-    parseResult.assertNoErrors();
+    parseResult.assertExpectedDiagnostics();
 
     var node = parseResult.findNode.singleClassDeclaration;
     assertParsedNodeText(node, r'''
@@ -2245,8 +2288,10 @@
   test_primaryConstructor_declaringFormalParameter_simple_const() {
     var parseResult = parseStringWithErrors(r'''
 class A(const int a) {}
+//      ^^^^^
+// [diag.extraneousModifier] Can't have modifier 'const' here.
 ''');
-    parseResult.assertErrors([error(diag.extraneousModifier, 8, 5)]);
+    parseResult.assertExpectedDiagnostics();
 
     var node = parseResult.findNode.singleClassDeclaration;
     assertParsedNodeText(node, r'''
@@ -2272,7 +2317,7 @@
     var parseResult = parseStringWithErrors(r'''
 class A(final int a) {}
 ''');
-    parseResult.assertNoErrors();
+    parseResult.assertExpectedDiagnostics();
 
     var node = parseResult.findNode.singleClassDeclaration;
     assertParsedNodeText(node, r'''
@@ -2301,7 +2346,7 @@
   final int a
 ) {}
 ''');
-    parseResult.assertNoErrors();
+    parseResult.assertExpectedDiagnostics();
 
     var node = parseResult.findNode.singleClassDeclaration;
     assertParsedNodeText(node, r'''
@@ -2330,7 +2375,7 @@
     var parseResult = parseStringWithErrors(r'''
 class A(var int a) {}
 ''');
-    parseResult.assertNoErrors();
+    parseResult.assertExpectedDiagnostics();
 
     var node = parseResult.findNode.singleClassDeclaration;
     assertParsedNodeText(node, r'''
@@ -2356,7 +2401,7 @@
     var parseResult = parseStringWithErrors(r'''
 class A(final int this.a) {}
 ''');
-    parseResult.assertNoErrors();
+    parseResult.assertExpectedDiagnostics();
 
     var node = parseResult.findNode.singleClassDeclaration;
     assertParsedNodeText(node, r'''
@@ -2384,7 +2429,7 @@
     var parseResult = parseStringWithErrors(r'''
 class A(var int this.a) {}
 ''');
-    parseResult.assertNoErrors();
+    parseResult.assertExpectedDiagnostics();
 
     var node = parseResult.findNode.singleClassDeclaration;
     assertParsedNodeText(node, r'''
@@ -2411,10 +2456,10 @@
   test_primaryConstructor_formalParameters_named_keyword_required_covariant() {
     var parseResult = parseStringWithErrors(r'''
 class A({required covariant int it}) {}
+//                ^^^^^^^^^
+// [diag.invalidCovariantModifierInPrimaryConstructor] The 'covariant' modifier can only be used on non-final declaring parameters.
 ''');
-    parseResult.assertErrors([
-      error(diag.invalidCovariantModifierInPrimaryConstructor, 18, 9),
-    ]);
+    parseResult.assertExpectedDiagnostics();
 
     var node = parseResult.findNode.singleClassDeclaration;
     assertParsedNodeText(node, r'''
@@ -2442,10 +2487,10 @@
   test_primaryConstructor_formalParameters_named_keyword_required_covariant_final() {
     var parseResult = parseStringWithErrors(r'''
 class A({required covariant final int it}) {}
+//                ^^^^^^^^^
+// [diag.invalidCovariantModifierInPrimaryConstructor] The 'covariant' modifier can only be used on non-final declaring parameters.
 ''');
-    parseResult.assertErrors([
-      error(diag.invalidCovariantModifierInPrimaryConstructor, 18, 9),
-    ]);
+    parseResult.assertExpectedDiagnostics();
 
     var node = parseResult.findNode.singleClassDeclaration;
     assertParsedNodeText(node, r'''
@@ -2475,7 +2520,7 @@
     var parseResult = parseStringWithErrors(r'''
 class A({required covariant var int it}) {}
 ''');
-    parseResult.assertNoErrors();
+    parseResult.assertExpectedDiagnostics();
 
     var node = parseResult.findNode.singleClassDeclaration;
     assertParsedNodeText(node, r'''
@@ -2504,8 +2549,10 @@
   test_primaryConstructor_formalParameters_named_keyword_required_required() {
     var parseResult = parseStringWithErrors(r'''
 class A({required required int a}) {}
+//                ^^^^^^^^
+// [diag.duplicatedModifier] The modifier 'required' was already specified.
 ''');
-    parseResult.assertErrors([error(diag.duplicatedModifier, 18, 8)]);
+    parseResult.assertExpectedDiagnostics();
 
     var node = parseResult.findNode.singleClassDeclaration;
     assertParsedNodeText(node, r'''
@@ -2532,8 +2579,10 @@
   test_primaryConstructor_formalParameters_named_keyword_required_required_covariant_var() {
     var parseResult = parseStringWithErrors(r'''
 class A({required required covariant var int a}) {}
+//                ^^^^^^^^
+// [diag.duplicatedModifier] The modifier 'required' was already specified.
 ''');
-    parseResult.assertErrors([error(diag.duplicatedModifier, 18, 8)]);
+    parseResult.assertExpectedDiagnostics();
 
     var node = parseResult.findNode.singleClassDeclaration;
     assertParsedNodeText(node, r'''
@@ -2562,10 +2611,10 @@
   test_primaryConstructor_formalParameters_positional_keyword_covariant() {
     var parseResult = parseStringWithErrors(r'''
 class A(covariant int it) {}
+//      ^^^^^^^^^
+// [diag.invalidCovariantModifierInPrimaryConstructor] The 'covariant' modifier can only be used on non-final declaring parameters.
 ''');
-    parseResult.assertErrors([
-      error(diag.invalidCovariantModifierInPrimaryConstructor, 8, 9),
-    ]);
+    parseResult.assertExpectedDiagnostics();
 
     var node = parseResult.findNode.singleClassDeclaration;
     assertParsedNodeText(node, r'''
@@ -2590,10 +2639,10 @@
   test_primaryConstructor_formalParameters_positional_keyword_covariant_final() {
     var parseResult = parseStringWithErrors(r'''
 class A(covariant final int it) {}
+//      ^^^^^^^^^
+// [diag.invalidCovariantModifierInPrimaryConstructor] The 'covariant' modifier can only be used on non-final declaring parameters.
 ''');
-    parseResult.assertErrors([
-      error(diag.invalidCovariantModifierInPrimaryConstructor, 8, 9),
-    ]);
+    parseResult.assertExpectedDiagnostics();
 
     var node = parseResult.findNode.singleClassDeclaration;
     assertParsedNodeText(node, r'''
@@ -2620,7 +2669,7 @@
     var parseResult = parseStringWithErrors(r'''
 class A(covariant var int it) {}
 ''');
-    parseResult.assertNoErrors();
+    parseResult.assertExpectedDiagnostics();
 
     var node = parseResult.findNode.singleClassDeclaration;
     assertParsedNodeText(node, r'''
@@ -2646,8 +2695,10 @@
   test_primaryConstructor_formalParameters_positional_keyword_required() {
     var parseResult = parseStringWithErrors(r'''
 class A(required int a) {}
+//      ^^^^^^^^
+// [diag.extraneousModifier] Can't have modifier 'required' here.
 ''');
-    parseResult.assertErrors([error(diag.extraneousModifier, 8, 8)]);
+    parseResult.assertExpectedDiagnostics();
 
     var node = parseResult.findNode.singleClassDeclaration;
     assertParsedNodeText(node, r'''
@@ -2673,7 +2724,7 @@
     var parseResult = parseStringWithErrors(r'''
 class A<T, U>.named() {}
 ''');
-    parseResult.assertNoErrors();
+    parseResult.assertExpectedDiagnostics();
 
     var node = parseResult.findNode.singleClassDeclaration;
     assertParsedNodeText(node, r'''
@@ -2705,7 +2756,7 @@
     var parseResult = parseStringWithErrors(r'''
 class A<T, U>() {}
 ''');
-    parseResult.assertNoErrors();
+    parseResult.assertExpectedDiagnostics();
 
     var node = parseResult.findNode.singleClassDeclaration;
     assertParsedNodeText(node, r'''
@@ -2734,7 +2785,7 @@
     var parseResult = parseStringWithErrors(r'''
 class A.named() {}
 ''');
-    parseResult.assertNoErrors();
+    parseResult.assertExpectedDiagnostics();
 
     var node = parseResult.findNode.singleClassDeclaration;
     assertParsedNodeText(node, r'''
@@ -2758,7 +2809,7 @@
     var parseResult = parseStringWithErrors(r'''
 class A() {}
 ''');
-    parseResult.assertNoErrors();
+    parseResult.assertExpectedDiagnostics();
 
     var node = parseResult.findNode.singleClassDeclaration;
     assertParsedNodeText(node, r'''
@@ -2780,7 +2831,7 @@
 class A(final int super.a) {}
 ''');
     // TODO(scheglov): this is wrong.
-    parseResult.assertNoErrors();
+    parseResult.assertExpectedDiagnostics();
 
     var node = parseResult.findNode.singleClassDeclaration;
     assertParsedNodeText(node, r'''
@@ -2807,8 +2858,10 @@
   test_primaryConstructor_superFormalParameter_var_namedType() {
     var parseResult = parseStringWithErrors(r'''
 class A(var int super.a) {}
+//      ^^^
+// [diag.extraneousModifier] Can't have modifier 'var' here.
 ''');
-    parseResult.assertErrors([error(diag.extraneousModifier, 8, 3)]);
+    parseResult.assertExpectedDiagnostics();
 
     var node = parseResult.findNode.singleClassDeclaration;
     assertParsedNodeText(node, r'''
@@ -2838,7 +2891,7 @@
   this : assert(x > 0);
 }
 ''');
-    parseResult.assertNoErrors();
+    parseResult.assertExpectedDiagnostics();
 
     var node = parseResult.findNode.singlePrimaryConstructorBody;
     assertParsedNodeText(node, r'''
@@ -2869,7 +2922,7 @@
   }
 }
 ''');
-    parseResult.assertNoErrors();
+    parseResult.assertExpectedDiagnostics();
 
     var node = parseResult.findNode.singlePrimaryConstructorBody;
     assertParsedNodeText(node, r'''
@@ -2895,7 +2948,7 @@
   this;
 }
 ''');
-    parseResult.assertNoErrors();
+    parseResult.assertExpectedDiagnostics();
 
     var node = parseResult.findNode.singlePrimaryConstructorBody;
     assertParsedNodeText(node, r'''
@@ -2917,7 +2970,7 @@
   this : x = 0;
 }
 ''');
-    parseResult.assertNoErrors();
+    parseResult.assertExpectedDiagnostics();
 
     var node = parseResult.findNode.singlePrimaryConstructorBody;
     assertParsedNodeText(node, r'''
@@ -2943,7 +2996,7 @@
   this;
 }
 ''');
-    parseResult.assertNoErrors();
+    parseResult.assertExpectedDiagnostics();
 
     var node = parseResult.findNode.singlePrimaryConstructorBody;
     assertParsedNodeText(node, r'''
@@ -2963,9 +3016,11 @@
     var parseResult = parseStringWithErrors(r'''
 class A() {
   const this;
+//^^^^^
+// [diag.extraneousModifier] Can't have modifier 'const' here.
 }
 ''');
-    parseResult.assertErrors([error(diag.extraneousModifier, 14, 5)]);
+    parseResult.assertExpectedDiagnostics();
 
     var node = parseResult.findNode.singlePrimaryConstructorBody;
     assertParsedNodeText(node, r'''
@@ -2982,7 +3037,7 @@
   augment set foo(int x) {}
 }
 ''');
-    parseResult.assertNoErrors();
+    parseResult.assertExpectedDiagnostics();
     assertParsedNodeText(parseResult.findNode.singleClassDeclaration, r'''
 ClassDeclaration
   augmentKeyword: augment
@@ -3017,7 +3072,7 @@
   augment static set foo(int x) {}
 }
 ''');
-    parseResult.assertNoErrors();
+    parseResult.assertExpectedDiagnostics();
     assertParsedNodeText(parseResult.findNode.singleClassDeclaration, r'''
 ClassDeclaration
   augmentKeyword: augment
@@ -3051,9 +3106,11 @@
     var parseResult = parseStringWithErrors(r'''
 class A {
   set foo {}
+//    ^^^
+// [diag.missingMethodParameters] Methods must have an explicit list of parameters.
 }
 ''');
-    parseResult.assertErrors([error(diag.missingMethodParameters, 16, 3)]);
+    parseResult.assertExpectedDiagnostics();
 
     var node = parseResult.findNode.singleMethodDeclaration;
     assertParsedNodeText(node, withOffsets: true, r'''
@@ -3076,11 +3133,11 @@
     var parseResult = parseStringWithErrors(r'''
 class A {
   set foo({a}) {}
+//    ^^^
+// [diag.wrongNumberOfParametersForSetter] Setters must declare exactly one required positional parameter.
 }
 ''');
-    parseResult.assertErrors([
-      error(diag.wrongNumberOfParametersForSetter, 16, 3),
-    ]);
+    parseResult.assertExpectedDiagnostics();
 
     var node = parseResult.findNode.singleMethodDeclaration;
     assertParsedNodeText(node, withOffsets: true, r'''
@@ -3103,11 +3160,11 @@
     var parseResult = parseStringWithErrors(r'''
 class A {
   set foo([a]) {}
+//    ^^^
+// [diag.wrongNumberOfParametersForSetter] Setters must declare exactly one required positional parameter.
 }
 ''');
-    parseResult.assertErrors([
-      error(diag.wrongNumberOfParametersForSetter, 16, 3),
-    ]);
+    parseResult.assertExpectedDiagnostics();
 
     var node = parseResult.findNode.singleMethodDeclaration;
     assertParsedNodeText(node, withOffsets: true, r'''
@@ -3130,11 +3187,11 @@
     var parseResult = parseStringWithErrors(r'''
 class A {
   set foo(a, b, c) {}
+//    ^^^
+// [diag.wrongNumberOfParametersForSetter] Setters must declare exactly one required positional parameter.
 }
 ''');
-    parseResult.assertErrors([
-      error(diag.wrongNumberOfParametersForSetter, 16, 3),
-    ]);
+    parseResult.assertExpectedDiagnostics();
 
     var node = parseResult.findNode.singleMethodDeclaration;
     assertParsedNodeText(node, withOffsets: true, r'''
@@ -3157,11 +3214,11 @@
     var parseResult = parseStringWithErrors(r'''
 class A {
   set foo() {}
+//    ^^^
+// [diag.wrongNumberOfParametersForSetter] Setters must declare exactly one required positional parameter.
 }
 ''');
-    parseResult.assertErrors([
-      error(diag.wrongNumberOfParametersForSetter, 16, 3),
-    ]);
+    parseResult.assertExpectedDiagnostics();
 
     var node = parseResult.findNode.singleMethodDeclaration;
     assertParsedNodeText(node, withOffsets: true, r'''
@@ -3186,7 +3243,7 @@
   static set foo(int _);
 }
 ''');
-    parseResult.assertNoErrors();
+    parseResult.assertExpectedDiagnostics();
 
     var node = parseResult.findNode.singleMethodDeclaration;
     assertParsedNodeText(node, r'''
@@ -3207,13 +3264,15 @@
   }
 
   test_setter_static_body_empty_language305() {
-    var parseResult = parseStringWithErrors('''
+    var parseResult = parseStringWithErrors(r'''
 // @dart = 3.5
 class A {
   static set foo(int _);
+//                     ^
+// [diag.missingFunctionBody] A function body must be provided.
 }
 ''');
-    parseResult.assertErrors([error(diag.missingFunctionBody, 48, 1)]);
+    parseResult.assertExpectedDiagnostics();
 
     var node = parseResult.findNode.singleMethodDeclaration;
     assertParsedNodeText(node, r'''
diff --git a/pkg/analyzer/test/src/dart/parser/enum_test.dart b/pkg/analyzer/test/src/dart/parser/enum_test.dart
index 5179d39..b588bd7 100644
--- a/pkg/analyzer/test/src/dart/parser/enum_test.dart
+++ b/pkg/analyzer/test/src/dart/parser/enum_test.dart
@@ -409,6 +409,32 @@
 ''');
   }
 
+  test_constructor_typeName_augment_factory_unnamed() {
+    var parseResult = parseStringWithErrors(r'''
+augment enum E {
+  v;
+  augment factory E() {}
+}
+''');
+    parseResult.assertNoErrors();
+
+    var node = parseResult.findNode.singleConstructorDeclaration;
+    assertParsedNodeText(node, r'''
+ConstructorDeclaration
+  augmentKeyword: augment
+  factoryKeyword: factory
+  typeName: SimpleIdentifier
+    token: E
+  parameters: FormalParameterList
+    leftParenthesis: (
+    rightParenthesis: )
+  body: BlockFunctionBody
+    block: Block
+      leftBracket: {
+      rightBracket: }
+''');
+  }
+
   test_constructor_typeName_factory_named() {
     var parseResult = parseStringWithErrors(r'''
 enum E {
@@ -581,9 +607,7 @@
 // @dart = 3.10
 enum E;
 ''');
-    parseResult.assertErrors([
-      error(diag.experimentNotEnabled, 22, 1),
-    ]);
+    parseResult.assertErrors([error(diag.experimentNotEnabled, 22, 1)]);
 
     var node = parseResult.findNode.singleEnumDeclaration;
     assertParsedNodeText(node, r'''
diff --git a/pkg/analyzer/test/src/dart/parser/extension_type_test.dart b/pkg/analyzer/test/src/dart/parser/extension_type_test.dart
index 69b1b63..164a527 100644
--- a/pkg/analyzer/test/src/dart/parser/extension_type_test.dart
+++ b/pkg/analyzer/test/src/dart/parser/extension_type_test.dart
@@ -678,6 +678,39 @@
     );
   }
 
+  test_members_constructor_augment_factory_unnamed() {
+    var parseResult = parseStringWithErrors(r'''
+augment extension type E(int it) {
+  augment factory E() => E(0);
+}
+''');
+    parseResult.assertNoErrors();
+
+    var node = parseResult.findNode.singleConstructorDeclaration;
+    assertParsedNodeText(node, r'''
+ConstructorDeclaration
+  augmentKeyword: augment
+  factoryKeyword: factory
+  typeName: SimpleIdentifier
+    token: E
+  parameters: FormalParameterList
+    leftParenthesis: (
+    rightParenthesis: )
+  body: ExpressionFunctionBody
+    functionDefinition: =>
+    expression: MethodInvocation
+      methodName: SimpleIdentifier
+        token: E
+      argumentList: ArgumentList
+        leftParenthesis: (
+        arguments
+          IntegerLiteral
+            literal: 0
+        rightParenthesis: )
+    semicolon: ;
+''');
+  }
+
   test_members_field_augment() {
     var parseResult = parseStringWithErrors(r'''
 augment extension type E(int it) {
diff --git a/pkg/analyzer/test/src/dart/resolution/context_collection_resolution.dart b/pkg/analyzer/test/src/dart/resolution/context_collection_resolution.dart
index 950987b..264a399 100644
--- a/pkg/analyzer/test/src/dart/resolution/context_collection_resolution.dart
+++ b/pkg/analyzer/test/src/dart/resolution/context_collection_resolution.dart
@@ -84,6 +84,10 @@
   MemoryByteStore _byteStore = _sharedByteStore;
 
   Map<String, String> _declaredVariables = {};
+
+  /// Whether indexing is enabled.
+  bool enableIndex = true;
+
   AnalysisContextCollectionImpl? _analysisContextCollection;
 
   /// If not `null`, [resolveFile] will use the context that corresponds
@@ -121,7 +125,7 @@
     collection = AnalysisContextCollectionImpl(
       byteStore: _byteStore,
       declaredVariables: _declaredVariables,
-      enableIndex: true,
+      enableIndex: enableIndex,
       includedPaths: collectionIncludedPaths.map(convertPath).toList(),
       resourceProvider: resourceProvider,
       retainDataForTesting: retainDataForTesting,
diff --git a/pkg/analyzer/test/src/dart/resolution/function_expression_invocation_test.dart b/pkg/analyzer/test/src/dart/resolution/function_expression_invocation_test.dart
index f748f26..8dfd93f 100644
--- a/pkg/analyzer/test/src/dart/resolution/function_expression_invocation_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/function_expression_invocation_test.dart
@@ -285,7 +285,7 @@
 ''');
   }
 
-  test_expression_recordType_hasCall() async {
+  test_expression_recordType_hasCall_extensionMethod() async {
     await assertNoErrorsInCode(r'''
 void f((String,) a) {
   a();
@@ -311,6 +311,32 @@
 ''');
   }
 
+  test_expression_recordType_hasCall_namedField() async {
+    await assertErrorsInCode(
+      r'''
+void f() {
+  var r = (call: () => 0);
+  r();
+}
+''',
+      [error(diag.invocationOfNonFunctionExpression, 40, 1)],
+    );
+    var node = findNode.singleFunctionExpressionInvocation;
+    assertResolvedNodeText(node, r'''
+FunctionExpressionInvocation
+  function: SimpleIdentifier
+    token: r
+    element: r@17
+    staticType: ({int Function() call})
+  argumentList: ArgumentList
+    leftParenthesis: (
+    rightParenthesis: )
+  element: <null>
+  staticInvokeType: InvalidType
+  staticType: InvalidType
+''');
+  }
+
   test_expression_recordType_noCall() async {
     await assertErrorsInCode(
       r'''
diff --git a/pkg/analyzer/test/src/dart/resolution/library_export_test.dart b/pkg/analyzer/test/src/dart/resolution/library_export_test.dart
index e4611b1..cfe059f 100644
--- a/pkg/analyzer/test/src/dart/resolution/library_export_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/library_export_test.dart
@@ -348,6 +348,7 @@
   }
 
   test_inLibrary_library_inSummary() async {
+    enableIndex = false;
     librarySummaryFiles = [
       await buildPackageFooSummary(files: {'lib/foo.dart': 'class F {}'}),
     ];
diff --git a/pkg/analyzer/test/src/dart/resolution/library_import_test.dart b/pkg/analyzer/test/src/dart/resolution/library_import_test.dart
index bef837e..a0e2ab4 100644
--- a/pkg/analyzer/test/src/dart/resolution/library_import_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/library_import_test.dart
@@ -545,6 +545,7 @@
   }
 
   test_inLibrary_library_inSummary() async {
+    enableIndex = false;
     librarySummaryFiles = [
       await buildPackageFooSummary(files: {'lib/foo.dart': 'class F {}'}),
     ];
diff --git a/pkg/analyzer/test/src/dart/resolution/node_text_expectations.dart b/pkg/analyzer/test/src/dart/resolution/node_text_expectations.dart
index 71a7ef3..db24cef 100644
--- a/pkg/analyzer/test/src/dart/resolution/node_text_expectations.dart
+++ b/pkg/analyzer/test/src/dart/resolution/node_text_expectations.dart
@@ -187,6 +187,11 @@
       argument: _ArgumentIndex(1),
     ),
     _AssertMethod(
+      className: 'ResolutionTest',
+      methodName: 'resolveTestCodeWithDiagnostics',
+      argument: _ArgumentIndex(0),
+    ),
+    _AssertMethod(
       className: 'SearchTest',
       methodName: 'assertDeclarationsText',
       argument: _ArgumentIndex(2),
diff --git a/pkg/analyzer/test/src/dart/resolution/resolution.dart b/pkg/analyzer/test/src/dart/resolution/resolution.dart
index 34abb10..e123945 100644
--- a/pkg/analyzer/test/src/dart/resolution/resolution.dart
+++ b/pkg/analyzer/test/src/dart/resolution/resolution.dart
@@ -24,6 +24,7 @@
 import 'package:analyzer/src/test_utilities/find_node.dart';
 import 'package:analyzer_testing/resource_provider_mixin.dart';
 import 'package:analyzer_testing/src/analysis_rule/pub_package_resolution.dart';
+import 'package:analyzer_testing/src/expected_diagnostics.dart';
 import 'package:analyzer_utilities/testing/tree_string_sink.dart';
 import 'package:test/test.dart';
 
@@ -462,6 +463,23 @@
     return resolveTestFile();
   }
 
+  /// Resolves [code] and checks that its inline diagnostic markers match the
+  /// diagnostics. Unmarked code is expected to have no diagnostics.
+  Future<void> resolveTestCodeWithDiagnostics(String code) async {
+    addTestFile(code);
+    await resolveTestFile();
+
+    var actual = updateExpectedDiagnostics(
+      content: code,
+      actualDiagnostics: result.diagnostics,
+    );
+    if (actual != code) {
+      NodeTextExpectationsCollector.add(actual);
+      printPrettyDiff(code, actual);
+      fail('See the difference above.');
+    }
+  }
+
   Future<void> resolveTestFile() {
     return resolveFile2(testFile);
   }
diff --git a/pkg/analyzer/test/src/dart/resolution/yield_statement_test.dart b/pkg/analyzer/test/src/dart/resolution/yield_statement_test.dart
index b907bd7..da27f18 100644
--- a/pkg/analyzer/test/src/dart/resolution/yield_statement_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/yield_statement_test.dart
@@ -86,6 +86,40 @@
     );
   }
 
+  test_downInference_function_unionFreeReturnType_asyncStar() async {
+    await assertNoErrorsInCode(r'''
+import 'dart:async';
+
+FutureOr<Stream<List<int>>?> f() async* {
+  yield [];
+}
+''');
+    var node = findNode.singleListLiteral;
+    assertResolvedNodeText(node, r'''
+ListLiteral
+  leftBracket: [
+  rightBracket: ]
+  staticType: List<int>
+''');
+  }
+
+  test_downInference_function_unionFreeReturnType_syncStar() async {
+    await assertNoErrorsInCode(r'''
+import 'dart:async';
+
+FutureOr<Iterable<List<int>>?> f() sync* {
+  yield [];
+}
+''');
+    var node = findNode.singleListLiteral;
+    assertResolvedNodeText(node, r'''
+ListLiteral
+  leftBracket: [
+  rightBracket: ]
+  staticType: List<int>
+''');
+  }
+
   test_downInference_functionExpression_asyncStar() async {
     await assertNoErrorsInCode(r'''
 import 'my_stream.dart';
diff --git a/pkg/analyzer/test/src/diagnostics/abi_specific_integer_mapping_test.dart b/pkg/analyzer/test/src/diagnostics/abi_specific_integer_mapping_test.dart
index e4153db..73b7931 100644
--- a/pkg/analyzer/test/src/diagnostics/abi_specific_integer_mapping_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/abi_specific_integer_mapping_test.dart
@@ -2,66 +2,52 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/src/diagnostic/diagnostic.dart' as diag;
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../dart/resolution/context_collection_resolution.dart';
+import '../dart/resolution/node_text_expectations.dart';
 
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(AbiSpecificIntegerMappingTest);
+    defineReflectiveTests(UpdateNodeTextExpectations);
   });
 }
 
 @reflectiveTest
 class AbiSpecificIntegerMappingTest extends PubPackageResolutionTest {
   test_doubleMapping() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'dart:ffi';
 @AbiSpecificIntegerMapping({})
 @AbiSpecificIntegerMapping({})
+// [diag.abiSpecificIntegerMappingExtra][column 2][length 25] Classes extending 'AbiSpecificInteger' must have exactly one 'AbiSpecificIntegerMapping' annotation specifying the mapping from ABI to a 'NativeType' integer with a fixed size.
 final class UintPtr extends AbiSpecificInteger {
   const UintPtr();
 }
-''',
-      [error(diag.abiSpecificIntegerMappingExtra, 51, 25)],
-    );
+''');
   }
 
   test_invalidMapping() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'dart:ffi';
 @AbiSpecificIntegerMapping({
   Abi.androidArm: Uint32(),
   Abi.androidArm64: IntPtr(),
+//                  ^^^^^^^^
+// [diag.abiSpecificIntegerMappingUnsupported] Invalid mapping to 'IntPtr'; only mappings to 'Int8', 'Int16', 'Int32', 'Int64', 'Uint8', 'Uint16', 'UInt32', and 'Uint64' are supported.
   Abi.androidIA32: UintPtr(),
+//                 ^^^^^^^^^
+// [diag.abiSpecificIntegerMappingUnsupported] Invalid mapping to 'UintPtr'; only mappings to 'Int8', 'Int16', 'Int32', 'Int64', 'Uint8', 'Uint16', 'UInt32', and 'Uint64' are supported.
 })
 final class UintPtr extends AbiSpecificInteger {
   const UintPtr();
 }
-''',
-      [
-        error(
-          diag.abiSpecificIntegerMappingUnsupported,
-          96,
-          8,
-          messageContains: ["Invalid mapping to 'IntPtr'"],
-        ),
-        error(
-          diag.abiSpecificIntegerMappingUnsupported,
-          125,
-          9,
-          messageContains: ["Invalid mapping to 'UintPtr'"],
-        ),
-      ],
-    );
+''');
   }
 
   test_invalidMapping_identifier() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'dart:ffi';
 const c = {
   Abi.androidArm: Uint32(),
@@ -69,41 +55,28 @@
   Abi.androidIA32: UintPtr(),
 };
 @AbiSpecificIntegerMapping(c)
+//                         ^
+// [diag.abiSpecificIntegerMappingUnsupported] Invalid mapping to 'IntPtr'; only mappings to 'Int8', 'Int16', 'Int32', 'Int64', 'Uint8', 'Uint16', 'UInt32', and 'Uint64' are supported.
+// [diag.abiSpecificIntegerMappingUnsupported] Invalid mapping to 'UintPtr'; only mappings to 'Int8', 'Int16', 'Int32', 'Int64', 'Uint8', 'Uint16', 'UInt32', and 'Uint64' are supported.
 final class UintPtr extends AbiSpecificInteger {
   const UintPtr();
 }
-''',
-      [
-        error(
-          diag.abiSpecificIntegerMappingUnsupported,
-          149,
-          1,
-          messageContains: ["Invalid mapping to 'IntPtr'"],
-        ),
-        error(
-          diag.abiSpecificIntegerMappingUnsupported,
-          149,
-          1,
-          messageContains: ["Invalid mapping to 'UintPtr'"],
-        ),
-      ],
-    );
+''');
   }
 
   test_noMapping() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'dart:ffi';
 final class UintPtr extends AbiSpecificInteger {
+//          ^^^^^^^
+// [diag.abiSpecificIntegerMappingMissing] Classes extending 'AbiSpecificInteger' must have exactly one 'AbiSpecificIntegerMapping' annotation specifying the mapping from ABI to a 'NativeType' integer with a fixed size.
   const UintPtr();
 }
-''',
-      [error(diag.abiSpecificIntegerMappingMissing, 31, 7)],
-    );
+''');
   }
 
   test_singleMapping() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'dart:ffi';
 @AbiSpecificIntegerMapping({})
 final class UintPtr extends AbiSpecificInteger {
@@ -113,7 +86,7 @@
   }
 
   test_validMapping() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'dart:ffi';
 @AbiSpecificIntegerMapping({
   Abi.androidArm: Uint32(),
diff --git a/pkg/analyzer/test/src/diagnostics/abstract_class_member_test.dart b/pkg/analyzer/test/src/diagnostics/abstract_class_member_test.dart
index 17c3a99..9a57fae 100644
--- a/pkg/analyzer/test/src/diagnostics/abstract_class_member_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/abstract_class_member_test.dart
@@ -5,17 +5,19 @@
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../dart/resolution/context_collection_resolution.dart';
+import '../dart/resolution/node_text_expectations.dart';
 
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(AbstractClassMemberTest);
+    defineReflectiveTests(UpdateNodeTextExpectations);
   });
 }
 
 @reflectiveTest
 class AbstractClassMemberTest extends PubPackageResolutionTest {
   test_abstract_field_dynamic() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 abstract class A {
   abstract dynamic x;
 }
@@ -23,7 +25,7 @@
   }
 
   test_abstract_field_untyped() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 abstract class A {
   abstract var x;
 }
@@ -31,7 +33,7 @@
   }
 
   test_abstract_field_untyped_covariant() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 abstract class A {
   abstract covariant var x;
 }
diff --git a/pkg/analyzer/test/src/diagnostics/abstract_field_constructor_initializer_test.dart b/pkg/analyzer/test/src/diagnostics/abstract_field_constructor_initializer_test.dart
index 3652752..8859ed7 100644
--- a/pkg/analyzer/test/src/diagnostics/abstract_field_constructor_initializer_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/abstract_field_constructor_initializer_test.dart
@@ -2,57 +2,55 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/src/diagnostic/diagnostic.dart' as diag;
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../dart/resolution/context_collection_resolution.dart';
+import '../dart/resolution/node_text_expectations.dart';
 
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(AbstractFieldConstructorInitializerTest);
+    defineReflectiveTests(UpdateNodeTextExpectations);
   });
 }
 
 @reflectiveTest
 class AbstractFieldConstructorInitializerTest extends PubPackageResolutionTest {
   test_abstract_field_constructor_initializer() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 abstract class A {
   abstract int x;
   A() : x = 0;
+//      ^
+// [diag.abstractFieldConstructorInitializer] Abstract fields can't have initializers.
 }
-''',
-      [error(diag.abstractFieldConstructorInitializer, 45, 1)],
-    );
+''');
   }
 
   test_abstract_field_final_constructor_initializer() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 abstract class A {
   abstract final int x;
   A() : x = 0;
+//      ^
+// [diag.abstractFieldConstructorInitializer] Abstract fields can't have initializers.
 }
-''',
-      [error(diag.abstractFieldConstructorInitializer, 51, 1)],
-    );
+''');
   }
 
   test_abstract_field_final_initializing_formal() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 abstract class A {
   abstract final int x;
   A(this.x);
+//       ^
+// [diag.abstractFieldConstructorInitializer] Abstract fields can't have initializers.
 }
-''',
-      [error(diag.abstractFieldConstructorInitializer, 52, 1)],
-    );
+''');
   }
 
   test_abstract_field_final_no_initialization() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 abstract class A {
   abstract final int x;
   A();
@@ -61,19 +59,18 @@
   }
 
   test_abstract_field_initializing_formal() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 abstract class A {
   abstract int x;
   A(this.x);
+//       ^
+// [diag.abstractFieldConstructorInitializer] Abstract fields can't have initializers.
 }
-''',
-      [error(diag.abstractFieldConstructorInitializer, 46, 1)],
-    );
+''');
   }
 
   test_abstract_field_no_initialization() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 abstract class A {
   abstract int x;
   A();
diff --git a/pkg/analyzer/test/src/diagnostics/abstract_field_initializer_test.dart b/pkg/analyzer/test/src/diagnostics/abstract_field_initializer_test.dart
index 8971a01..a7ecb48 100644
--- a/pkg/analyzer/test/src/diagnostics/abstract_field_initializer_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/abstract_field_initializer_test.dart
@@ -2,32 +2,32 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/src/diagnostic/diagnostic.dart' as diag;
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../dart/resolution/context_collection_resolution.dart';
+import '../dart/resolution/node_text_expectations.dart';
 
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(AbstractFieldInitializerTest);
+    defineReflectiveTests(UpdateNodeTextExpectations);
   });
 }
 
 @reflectiveTest
 class AbstractFieldInitializerTest extends PubPackageResolutionTest {
   test_abstract_field_final_initializer() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 abstract class A {
   abstract final int x = 0;
+//                   ^
+// [diag.abstractFieldInitializer] Abstract fields can't have initializers.
 }
-''',
-      [error(diag.abstractFieldInitializer, 40, 1)],
-    );
+''');
   }
 
   test_abstract_field_final_no_initializer() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 abstract class A {
   abstract final int x;
 }
@@ -35,18 +35,17 @@
   }
 
   test_abstract_field_initializer() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 abstract class A {
   abstract int x = 0;
+//             ^
+// [diag.abstractFieldInitializer] Abstract fields can't have initializers.
 }
-''',
-      [error(diag.abstractFieldInitializer, 34, 1)],
-    );
+''');
   }
 
   test_abstract_field_no_initializer() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 abstract class A {
   abstract int x;
 }
diff --git a/pkg/analyzer/test/src/diagnostics/abstract_super_member_reference_test.dart b/pkg/analyzer/test/src/diagnostics/abstract_super_member_reference_test.dart
index 669d924..84bdcbd 100644
--- a/pkg/analyzer/test/src/diagnostics/abstract_super_member_reference_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/abstract_super_member_reference_test.dart
@@ -2,22 +2,22 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/src/diagnostic/diagnostic.dart' as diag;
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../dart/resolution/context_collection_resolution.dart';
+import '../dart/resolution/node_text_expectations.dart';
 
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(AbstractSuperMemberReferenceTest);
+    defineReflectiveTests(UpdateNodeTextExpectations);
   });
 }
 
 @reflectiveTest
 class AbstractSuperMemberReferenceTest extends PubPackageResolutionTest {
   test_methodInvocation_mixin_implements() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   void foo(int _) {}
 }
@@ -25,11 +25,11 @@
 mixin M implements A {
   void bar() {
     super.foo(0);
+//        ^^^
+// [diag.abstractSuperMemberReference] The method 'foo' is always abstract in the supertype.
   }
 }
-''',
-      [error(diag.abstractSuperMemberReference, 82, 3)],
-    );
+''');
 
     var node = findNode.methodInvocation('super.foo(0)');
     assertResolvedNodeText(node, r'''
@@ -56,7 +56,7 @@
   }
 
   test_methodInvocation_mixinHasConcrete() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {}
 
 mixin M {
@@ -92,8 +92,7 @@
   }
 
   test_methodInvocation_mixinHasNoSuchMethod() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 mixin A {
   void foo();
   noSuchMethod(im) => 42;
@@ -101,11 +100,11 @@
 
 class B extends Object with A {
   void foo() => super.foo(); // ref
+//                    ^^^
+// [diag.abstractSuperMemberReference] The method 'foo' is always abstract in the supertype.
   noSuchMethod(im) => 87;
 }
-''',
-      [error(diag.abstractSuperMemberReference, 107, 3)],
-    );
+''');
 
     var node = findNode.methodInvocation('super.foo()');
     assertResolvedNodeText(node, r'''
@@ -127,8 +126,7 @@
   }
 
   test_methodInvocation_superHasAbstract() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 abstract class A {
   void foo(int _);
 }
@@ -136,13 +134,13 @@
 abstract class B extends A {
   void bar() {
     super.foo(0);
+//        ^^^
+// [diag.abstractSuperMemberReference] The method 'foo' is always abstract in the supertype.
   }
 
   void foo(int _) {} // does not matter
 }
-''',
-      [error(diag.abstractSuperMemberReference, 95, 3)],
-    );
+''');
 
     var node = findNode.methodInvocation('super.foo(0)');
     assertResolvedNodeText(node, r'''
@@ -169,7 +167,7 @@
   }
 
   test_methodInvocation_superHasConcrete_mixinHasAbstract() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   void foo() {}
 }
@@ -205,7 +203,7 @@
   }
 
   test_methodInvocation_superHasNoSuchMethod() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   int foo();
   noSuchMethod(im) => 42;
@@ -237,7 +235,7 @@
   }
 
   test_methodInvocation_superSuperHasConcrete() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 abstract class A {
   void foo() {}
 }
@@ -273,8 +271,7 @@
   }
 
   test_propertyAccess_getter() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 abstract class A {
   int get foo;
 }
@@ -282,11 +279,11 @@
 abstract class B extends A {
   bar() {
     super.foo; // ref
+//        ^^^
+// [diag.abstractSuperMemberReference] The getter 'foo' is always abstract in the supertype.
   }
 }
-''',
-      [error(diag.abstractSuperMemberReference, 86, 3)],
-    );
+''');
 
     var node = findNode.singlePropertyAccess;
     assertResolvedNodeText(node, r'''
@@ -304,8 +301,7 @@
   }
 
   test_propertyAccess_getter_mixin_implements() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   int get foo => 0;
 }
@@ -313,11 +309,11 @@
 mixin M implements A {
   void bar() {
     super.foo;
+//        ^^^
+// [diag.abstractSuperMemberReference] The getter 'foo' is always abstract in the supertype.
   }
 }
-''',
-      [error(diag.abstractSuperMemberReference, 81, 3)],
-    );
+''');
 
     var node = findNode.singlePropertyAccess;
     assertResolvedNodeText(node, r'''
@@ -335,8 +331,7 @@
   }
 
   test_propertyAccess_getter_mixinHasNoSuchMethod() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 mixin A {
   int get foo;
   noSuchMethod(im) => 1;
@@ -344,11 +339,11 @@
 
 class B extends Object with A {
   int get foo => super.foo; // ref
+//                     ^^^
+// [diag.abstractSuperMemberReference] The getter 'foo' is always abstract in the supertype.
   noSuchMethod(im) => 2;
 }
-''',
-      [error(diag.abstractSuperMemberReference, 108, 3)],
-    );
+''');
 
     var node = findNode.singlePropertyAccess;
     assertResolvedNodeText(node, r'''
@@ -366,7 +361,7 @@
   }
 
   test_propertyAccess_getter_superHasNoSuchMethod() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   int get foo;
   noSuchMethod(im) => 1;
@@ -394,8 +389,7 @@
   }
 
   test_propertyAccess_getter_superImplements() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   int get foo => 0;
 }
@@ -405,10 +399,10 @@
 
 class C extends B {
   int get foo => super.foo; // ref
+//                     ^^^
+// [diag.abstractSuperMemberReference] The getter 'foo' is always abstract in the supertype.
 }
-''',
-      [error(diag.abstractSuperMemberReference, 111, 3)],
-    );
+''');
 
     var node = findNode.singlePropertyAccess;
     assertResolvedNodeText(node, r'''
@@ -426,7 +420,7 @@
   }
 
   test_propertyAccess_getter_superSuperHasConcrete() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 abstract class A {
   int get foo => 0;
 }
@@ -456,8 +450,7 @@
   }
 
   test_propertyAccess_method_tearOff_abstract() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 abstract class A {
   void foo();
 }
@@ -465,11 +458,11 @@
 abstract class B extends A {
   void bar() {
     super.foo; // ref
+//        ^^^
+// [diag.abstractSuperMemberReference] The method 'foo' is always abstract in the supertype.
   }
 }
-''',
-      [error(diag.abstractSuperMemberReference, 90, 3)],
-    );
+''');
 
     var node = findNode.singlePropertyAccess;
     assertResolvedNodeText(node, r'''
@@ -487,8 +480,7 @@
   }
 
   test_propertyAccess_setter() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 abstract class A {
   set foo(int _);
 }
@@ -496,11 +488,11 @@
 abstract class B extends A {
   void bar() {
     super.foo = 0;
+//        ^^^
+// [diag.abstractSuperMemberReference] The setter 'foo' is always abstract in the supertype.
   }
 }
-''',
-      [error(diag.abstractSuperMemberReference, 94, 3)],
-    );
+''');
 
     assertResolvedNodeText(findNode.assignment('foo ='), r'''
 AssignmentExpression
@@ -529,8 +521,7 @@
   }
 
   test_propertyAccess_setter_mixin_implements() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   set foo(int _) {}
 }
@@ -538,11 +529,11 @@
 mixin M implements A {
   void bar() {
     super.foo = 0;
+//        ^^^
+// [diag.abstractSuperMemberReference] The setter 'foo' is always abstract in the supertype.
   }
 }
-''',
-      [error(diag.abstractSuperMemberReference, 81, 3)],
-    );
+''');
 
     assertResolvedNodeText(findNode.assignment('foo ='), r'''
 AssignmentExpression
@@ -571,8 +562,7 @@
   }
 
   test_propertyAccess_setter_mixinHasNoSuchMethod() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 mixin A {
   set foo(int a);
   noSuchMethod(im) {}
@@ -580,11 +570,11 @@
 
 class B extends Object with A {
   set foo(int a) => super.foo = a; // ref
+//                        ^^^
+// [diag.abstractSuperMemberReference] The setter 'foo' is always abstract in the supertype.
   noSuchMethod(im) {}
 }
-''',
-      [error(diag.abstractSuperMemberReference, 111, 3)],
-    );
+''');
 
     assertResolvedNodeText(findNode.assignment('foo ='), r'''
 AssignmentExpression
@@ -614,7 +604,7 @@
   }
 
   test_propertyAccess_setter_superHasNoSuchMethod() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   set foo(int a);
   noSuchMethod(im) => 1;
@@ -654,7 +644,7 @@
   }
 
   test_propertyAccess_setter_superSuperHasConcrete() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 abstract class A {
   void set foo(int _) {}
 }
diff --git a/pkg/analyzer/test/src/diagnostics/ambiguous_export_test.dart b/pkg/analyzer/test/src/diagnostics/ambiguous_export_test.dart
index 7acbd37..eb4e7b1 100644
--- a/pkg/analyzer/test/src/diagnostics/ambiguous_export_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/ambiguous_export_test.dart
@@ -6,10 +6,12 @@
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../dart/resolution/context_collection_resolution.dart';
+import '../dart/resolution/node_text_expectations.dart';
 
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(AmbiguousExportTest);
+    defineReflectiveTests(UpdateNodeTextExpectations);
   });
 }
 
@@ -22,13 +24,12 @@
     newFile('$testPackageLibPath/lib2.dart', r'''
 class N {}
 ''');
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 export 'lib1.dart';
 export 'lib2.dart';
-''',
-      [error(diag.ambiguousExport, 27, 11)],
-    );
+//     ^^^^^^^^^^^
+// [diag.ambiguousExport] The name 'N' is defined in the libraries 'package:test/lib1.dart' and 'package:test/lib2.dart'.
+''');
   }
 
   test_library_extensions_bothExported() async {
@@ -38,20 +39,19 @@
     newFile('$testPackageLibPath/lib2.dart', r'''
 extension E on String {}
 ''');
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 export 'lib1.dart';
 export 'lib2.dart';
-''',
-      [error(diag.ambiguousExport, 27, 11)],
-    );
+//     ^^^^^^^^^^^
+// [diag.ambiguousExport] The name 'E' is defined in the libraries 'package:test/lib1.dart' and 'package:test/lib2.dart'.
+''');
   }
 
   test_library_extensions_localAndExported() async {
     newFile('$testPackageLibPath/lib1.dart', r'''
 extension E on String {}
 ''');
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 export 'lib1.dart';
 
 extension E on String {}
diff --git a/pkg/analyzer/test/src/diagnostics/ambiguous_extension_member_access_test.dart b/pkg/analyzer/test/src/diagnostics/ambiguous_extension_member_access_test.dart
index f6cb212..7c00211 100644
--- a/pkg/analyzer/test/src/diagnostics/ambiguous_extension_member_access_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/ambiguous_extension_member_access_test.dart
@@ -6,18 +6,19 @@
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../dart/resolution/context_collection_resolution.dart';
+import '../dart/resolution/node_text_expectations.dart';
 
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(AmbiguousExtensionMemberAccessTest);
+    defineReflectiveTests(UpdateNodeTextExpectations);
   });
 }
 
 @reflectiveTest
 class AmbiguousExtensionMemberAccessTest extends PubPackageResolutionTest {
   test_call() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {}
 
 extension E1 on A {
@@ -29,14 +30,13 @@
 }
 
 int f(A a) => a();
-''',
-      [error(diag.ambiguousExtensionMemberAccessTwo, 110, 1)],
-    );
+//            ^
+// [diag.ambiguousExtensionMemberAccessTwo] A member named 'call' is defined in 'extension E1 on A' and 'extension E2 on A', and neither is more specific.
+''');
   }
 
   test_getter_getter() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 extension E1 on int {
   void get a => 1;
 }
@@ -47,10 +47,10 @@
 
 f() {
   0.a;
+//  ^
+// [diag.ambiguousExtensionMemberAccessTwo] A member named 'a' is defined in 'extension E1 on int' and 'extension E2 on int', and neither is more specific.
 }
-''',
-      [error(diag.ambiguousExtensionMemberAccessTwo, 98, 1)],
-    );
+''');
 
     var node = findNode.propertyAccess('0.a');
     assertResolvedNodeText(node, r'''
@@ -68,7 +68,7 @@
   }
 
   test_getter_getterStatic() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 extension E1 on int {
   void get a => 1;
 }
@@ -98,8 +98,7 @@
   }
 
   test_getter_method() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 extension E on int {
   int get a => 1;
 }
@@ -110,10 +109,10 @@
 
 f() {
   0.a;
+//  ^
+// [diag.ambiguousExtensionMemberAccessTwo] A member named 'a' is defined in 'extension E on int' and 'extension E2 on int', and neither is more specific.
 }
-''',
-      [error(diag.ambiguousExtensionMemberAccessTwo, 91, 1)],
-    );
+''');
 
     var node = findNode.propertyAccess('0.a');
     assertResolvedNodeText(node, r'''
@@ -131,8 +130,7 @@
   }
 
   test_getter_setter() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 extension E on int {
   int get a => 1;
 }
@@ -143,10 +141,10 @@
 
 f() {
   0.a;
+//  ^
+// [diag.ambiguousExtensionMemberAccessTwo] A member named 'a' is defined in 'extension E on int' and 'extension E2 on int', and neither is more specific.
 }
-''',
-      [error(diag.ambiguousExtensionMemberAccessTwo, 96, 1)],
-    );
+''');
 
     var node = findNode.propertyAccess('0.a');
     assertResolvedNodeText(node, r'''
@@ -164,26 +162,16 @@
   }
 
   test_method_conflict_conflict_notSpecific() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 extension E1 on int { void foo() {} }
 extension E2 on int { void foo() {} }
 extension E on int? { void foo() {} }
 void f() {
   0.foo();
+//  ^^^
+// [diag.ambiguousExtensionMemberAccessTwo] A member named 'foo' is defined in 'extension E1 on int' and 'extension E2 on int', and neither is more specific.
 }
-''',
-      [
-        error(
-          diag.ambiguousExtensionMemberAccessTwo,
-          129,
-          3,
-          messageContains: [
-            "in 'extension E1 on int' and 'extension E2 on int',",
-          ],
-        ),
-      ],
-    );
+''');
   }
 
   test_method_conflict_conflict_notSpecific_sameName() async {
@@ -218,39 +206,26 @@
   }
 
   test_method_conflict_conflict_notSpecific_sameName_invalidType() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 // ignore_for_file: unused_element
 void f(Iterable<void> p) {
   p.foo();
+//  ^^^
+// [diag.ambiguousExtensionMemberAccessTwo][context 1][context 2] A member named 'foo' is defined in 'extension on Iterable<InvalidType> (where <unnamed extension> is defined in /home/test/lib/test.dart)' and 'extension on Iterable<InvalidType> (where <unnamed extension> is defined in /home/test/lib/test.dart)', and neither is more specific.
 }
 extension on Iterable<Undef1> { void foo() {} }
+// [context 1][column 1][length 0] <unnamed extension> is defined in /home/test/lib/test.dart
+//                    ^^^^^^
+// [diag.nonTypeAsTypeArgument] The name 'Undef1' isn't a type, so it can't be used as a type argument.
 extension on Iterable<Undef2> { void foo() {} }
-''',
-      [
-        error(
-          diag.ambiguousExtensionMemberAccessTwo,
-          66,
-          3,
-          messageContains: [
-            "'extension on Iterable<InvalidType> "
-                "(where <unnamed extension> is defined in ${testFile.path})' and "
-                "'extension on Iterable<InvalidType> "
-                "(where <unnamed extension> is defined in ${testFile.path})',",
-          ],
-          contextMessages: [
-            message(testFile, 75, 0),
-            message(testFile, 123, 0),
-          ],
-        ),
-        error(diag.nonTypeAsTypeArgument, 97, 6),
-        error(diag.nonTypeAsTypeArgument, 145, 6),
-      ],
-    );
+// [context 2][column 1][length 0] <unnamed extension> is defined in /home/test/lib/test.dart
+//                    ^^^^^^
+// [diag.nonTypeAsTypeArgument] The name 'Undef2' isn't a type, so it can't be used as a type argument.
+''');
   }
 
   test_method_conflict_conflict_specific() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 extension E1 on int? { void foo() {} }
 extension E2 on int? { void foo() {} }
 extension E on int { void foo() {} }
@@ -261,30 +236,20 @@
   }
 
   test_method_conflict_notSpecific_conflict() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 extension E1 on int { void foo() {} }
 extension E on int? { void foo() {} }
 extension E2 on int { void foo() {} }
 void f() {
   0.foo();
+//  ^^^
+// [diag.ambiguousExtensionMemberAccessTwo] A member named 'foo' is defined in 'extension E1 on int' and 'extension E2 on int', and neither is more specific.
 }
-''',
-      [
-        error(
-          diag.ambiguousExtensionMemberAccessTwo,
-          129,
-          3,
-          messageContains: [
-            "in 'extension E1 on int' and 'extension E2 on int',",
-          ],
-        ),
-      ],
-    );
+''');
   }
 
   test_method_conflict_specific_conflict() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 extension E1 on int? { void foo() {} }
 extension E on int { void foo() {} }
 extension E2 on int? { void foo() {} }
@@ -295,8 +260,7 @@
   }
 
   test_method_method() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 extension E1 on int {
   void a() {}
 }
@@ -307,10 +271,10 @@
 
 f() {
   0.a();
+//  ^
+// [diag.ambiguousExtensionMemberAccessTwo] A member named 'a' is defined in 'extension E1 on int' and 'extension E2 on int', and neither is more specific.
 }
-''',
-      [error(diag.ambiguousExtensionMemberAccessTwo, 88, 1)],
-    );
+''');
 
     var node = findNode.methodInvocation('0.a()');
     assertResolvedNodeText(node, r'''
@@ -332,54 +296,34 @@
   }
 
   test_method_notSpecific_conflict_conflict() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 extension E on int? { void foo() {} }
 extension E1 on int { void foo() {} }
 extension E2 on int { void foo() {} }
 void f() {
   0.foo();
+//  ^^^
+// [diag.ambiguousExtensionMemberAccessTwo] A member named 'foo' is defined in 'extension E1 on int' and 'extension E2 on int', and neither is more specific.
 }
-''',
-      [
-        error(
-          diag.ambiguousExtensionMemberAccessTwo,
-          129,
-          3,
-          messageContains: [
-            "in 'extension E1 on int' and 'extension E2 on int',",
-          ],
-        ),
-      ],
-    );
+''');
   }
 
   test_method_notSpecific_conflict_conflict_conflict() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 extension E on int? { void foo() {} }
 extension E1 on int { void foo() {} }
 extension E2 on int { void foo() {} }
 extension E3 on int { void foo() {} }
 void f() {
   0.foo();
+//  ^^^
+// [diag.ambiguousExtensionMemberAccessThreeOrMore] A member named 'foo' is defined in extension 'E1', extension 'E2', and extension 'E3', and none are more specific.
 }
-''',
-      [
-        error(
-          diag.ambiguousExtensionMemberAccessThreeOrMore,
-          167,
-          3,
-          messageContains: [
-            "in extension 'E1', extension 'E2', and extension 'E3',",
-          ],
-        ),
-      ],
-    );
+''');
   }
 
   test_method_specific_conflict_conflict() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 extension E on int { void foo() {} }
 extension E1 on int? { void foo() {} }
 extension E2 on int? { void foo() {} }
@@ -421,8 +365,7 @@
   }
 
   test_noMoreSpecificExtension() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class Target<T> {}
 
 class SubTarget<T> extends Target<T> {}
@@ -440,15 +383,14 @@
   // The instantiated on type of `E2(t)` is `Target<num>`.
   // Neither is a subtype of the other, so the resolution is ambiguous.
   t.foo;
+//  ^^^
+// [diag.ambiguousExtensionMemberAccessTwo] A member named 'foo' is defined in 'extension E1 on SubTarget<Object>' and 'extension E2<T> on Target<T>', and neither is more specific.
 }
-''',
-      [error(diag.ambiguousExtensionMemberAccessTwo, 396, 3)],
-    );
+''');
   }
 
   test_operator_binary() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {}
 
 extension E1 on A {
@@ -460,14 +402,13 @@
 }
 
 A f(A a) => a + a;
-''',
-      [error(diag.ambiguousExtensionMemberAccessTwo, 122, 5)],
-    );
+//          ^^^^^
+// [diag.ambiguousExtensionMemberAccessTwo] A member named '+' is defined in 'extension E1 on A' and 'extension E2 on A', and neither is more specific.
+''');
   }
 
   test_operator_binary_compoundAssignment() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {}
 
 extension E1 on A {
@@ -480,15 +421,14 @@
 
 void f(A a) {
   a += 0;
+//  ^^
+// [diag.ambiguousExtensionMemberAccessTwo] A member named '+' is defined in 'extension E1 on A' and 'extension E2 on A', and neither is more specific.
 }
-''',
-      [error(diag.ambiguousExtensionMemberAccessTwo, 130, 2)],
-    );
+''');
   }
 
   test_operator_index_index() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {}
 
 extension E1 on A {
@@ -500,14 +440,13 @@
 }
 
 int f(A a) => a[0];
-''',
-      [error(diag.ambiguousExtensionMemberAccessTwo, 134, 1)],
-    );
+//            ^
+// [diag.ambiguousExtensionMemberAccessTwo] A member named '[]' is defined in 'extension E1 on A' and 'extension E2 on A', and neither is more specific.
+''');
   }
 
   test_operator_index_indexEq() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 extension E1 on int {
   int operator[](int index) => 0;
 }
@@ -518,15 +457,14 @@
 
 f() {
   0[1] += 2;
+//^
+// [diag.ambiguousExtensionMemberAccessTwo] A member named '[]' is defined in 'extension E1 on int' and 'extension E2 on int', and neither is more specific.
 }
-''',
-      [error(diag.ambiguousExtensionMemberAccessTwo, 136, 1)],
-    );
+''');
   }
 
   test_operator_unary() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {}
 
 extension E1 on A {
@@ -538,14 +476,13 @@
 }
 
 int f(A a) => -a;
-''',
-      [error(diag.ambiguousExtensionMemberAccessTwo, 123, 1)],
-    );
+//             ^
+// [diag.ambiguousExtensionMemberAccessTwo] A member named 'unary-' is defined in 'extension E1 on A' and 'extension E2 on A', and neither is more specific.
+''');
   }
 
   test_setter_setter() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 extension E1 on int {
   set a(x) {}
 }
@@ -556,10 +493,10 @@
 
 f() {
   0.a = 3;
+//  ^
+// [diag.ambiguousExtensionMemberAccessTwo] A member named 'a' is defined in 'extension E1 on int' and 'extension E2 on int', and neither is more specific.
 }
-''',
-      [error(diag.ambiguousExtensionMemberAccessTwo, 88, 1)],
-    );
+''');
 
     assertResolvedNodeText(findNode.assignment('= 3'), r'''
 AssignmentExpression
@@ -588,8 +525,7 @@
   }
 
   test_unnamed_extensions() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {}
 class B {}
 class C extends A implements B {}
@@ -603,21 +539,12 @@
 }
 
 int f(List<C> x) => x();
+//                  ^
+// [diag.ambiguousExtensionMemberAccessTwo] A member named 'call' is defined in 'extension on List<A>' and 'extension on List<B>', and neither is more specific.
 
 // Additional calls to avoid UNUSED_ELEMENT
 int g(List<A> x) => x();
 int h(List<B> x) => x();
-''',
-      [
-        error(
-          diag.ambiguousExtensionMemberAccessTwo,
-          167,
-          1,
-          messageContains: [
-            "'extension on List<A>' and 'extension on List<B>',",
-          ],
-        ),
-      ],
-    );
+''');
   }
 }
diff --git a/pkg/analyzer/test/src/diagnostics/ambiguous_import_test.dart b/pkg/analyzer/test/src/diagnostics/ambiguous_import_test.dart
index c7f1d79..e99e6ff 100644
--- a/pkg/analyzer/test/src/diagnostics/ambiguous_import_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/ambiguous_import_test.dart
@@ -10,10 +10,12 @@
 
 import '../../generated/test_support.dart';
 import '../dart/resolution/context_collection_resolution.dart';
+import '../dart/resolution/node_text_expectations.dart';
 
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(AmbiguousImportTest);
+    defineReflectiveTests(UpdateNodeTextExpectations);
   });
 }
 
@@ -28,19 +30,15 @@
 const foo = 0;
 ''');
 
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'a.dart';
 import 'b.dart';
 
 @foo
+// [diag.invalidAnnotation][column 1][length 4] Annotation must be either a const variable reference or const constructor invocation.
+// [diag.ambiguousImport][column 2][length 3] The name 'foo' is defined in the libraries 'package:test/a.dart' and 'package:test/b.dart'.
 class A {}
-''',
-      [
-        error(diag.invalidAnnotation, 35, 4),
-        error(diag.ambiguousImport, 36, 3),
-      ],
-    );
+''');
   }
 
   test_as() async {
@@ -50,12 +48,13 @@
     newFile("$testPackageLibPath/lib2.dart", '''
 library lib2;
 class N {}''');
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(
+      r'''
 import 'lib1.dart';
 import 'lib2.dart';
-f(p) {p as N;}''',
-      [error(diag.ambiguousImport, 51, 1)],
+f(p) {p as N;}
+//         ^
+// [diag.ambiguousImport] The name 'N' is defined in the libraries 'package:test/lib1.dart' and 'package:test/lib2.dart'.''',
     );
   }
 
@@ -66,12 +65,14 @@
     newFile("$testPackageLibPath/lib2.dart", '''
 library lib2;
 class N {}''');
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(
+      r'''
 import 'lib1.dart';
 import 'lib2.dart';
-class A extends N {}''',
-      [error(diag.ambiguousImport, 56, 1), error(diag.extendsNonClass, 56, 1)],
+class A extends N {}
+//              ^
+// [diag.extendsNonClass] Classes can only extend other classes.
+// [diag.ambiguousImport] The name 'N' is defined in the libraries 'package:test/lib1.dart' and 'package:test/lib2.dart'.''',
     );
   }
 
@@ -82,15 +83,14 @@
     newFile("$testPackageLibPath/lib2.dart", '''
 library lib2;
 class N {}''');
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(
+      r'''
 import 'lib1.dart';
 import 'lib2.dart';
-class A implements N {}''',
-      [
-        error(diag.implementsNonClass, 59, 1),
-        error(diag.ambiguousImport, 59, 1),
-      ],
+class A implements N {}
+//                 ^
+// [diag.implementsNonClass] Classes and mixins can only implement other classes and mixins.
+// [diag.ambiguousImport] The name 'N' is defined in the libraries 'package:test/lib1.dart' and 'package:test/lib2.dart'.''',
     );
   }
 
@@ -128,13 +128,14 @@
     newFile("$testPackageLibPath/lib2.dart", '''
 library lib2;
 class N {}''');
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(
+      r'''
 library L;
 import 'lib1.dart';
 import 'lib2.dart';
-f() {new N();}''',
-      [error(diag.ambiguousImport, 60, 1)],
+f() {new N();}
+//       ^
+// [diag.ambiguousImport] The name 'N' is defined in the libraries 'package:test/lib1.dart' and 'package:test/lib2.dart'.''',
     );
   }
 
@@ -145,20 +146,18 @@
     newFile("$testPackageLibPath/lib2.dart", '''
 library lib2;
 class N {}''');
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 library L;
 import 'lib1.dart';
 import 'lib2.dart';
 f() {
   N n = .new();
+//^
+// [diag.ambiguousImport] The name 'N' is defined in the libraries 'package:test/lib1.dart' and 'package:test/lib2.dart'.
+//       ^^^
+// [diag.dotShorthandUndefinedInvocation] The static method or constructor 'new' isn't defined for the context type 'InvalidType'.
   print(n);
-}''',
-      [
-        error(diag.ambiguousImport, 59, 1),
-        error(diag.dotShorthandUndefinedInvocation, 66, 3),
-      ],
-    );
+}''');
   }
 
   test_is() async {
@@ -168,12 +167,13 @@
     newFile("$testPackageLibPath/lib2.dart", '''
 library lib2;
 class N {}''');
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(
+      r'''
 import 'lib1.dart';
 import 'lib2.dart';
-f(p) {p is N;}''',
-      [error(diag.ambiguousImport, 51, 1)],
+f(p) {p is N;}
+//         ^
+// [diag.ambiguousImport] The name 'N' is defined in the libraries 'package:test/lib1.dart' and 'package:test/lib2.dart'.''',
     );
   }
 
@@ -184,12 +184,13 @@
     newFile("$testPackageLibPath/lib2.dart", '''
 library lib2;
 class N {}''');
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(
+      r'''
 import 'lib1.dart';
 import 'lib2.dart';
-g() { N.FOO; }''',
-      [error(diag.ambiguousImport, 46, 1)],
+g() { N.FOO; }
+//    ^
+// [diag.ambiguousImport] The name 'N' is defined in the libraries 'package:test/lib1.dart' and 'package:test/lib2.dart'.''',
     );
   }
 
@@ -199,7 +200,7 @@
     newFile('$testPackageLibPath/a.dart', '''
 class StreamController {}
 ''');
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'dart:async'; // ignore: unused_import
 import 'a.dart';
 
@@ -208,14 +209,13 @@
   }
 
   test_systemLibrary_systemLibrary() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'dart:html';
 import 'dart:io';
 g(File f) {}
-''',
-      [error(diag.ambiguousImport, 40, 4)],
-    );
+//^^^^
+// [diag.ambiguousImport] The name 'File' is defined in the libraries 'dart:html' and 'dart:io'.
+''');
   }
 
   test_typeAnnotation() async {
@@ -225,29 +225,34 @@
     newFile("$testPackageLibPath/lib2.dart", '''
 library lib2;
 class N {}''');
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(
+      r'''
 import 'lib1.dart';
 import 'lib2.dart';
 typedef N FT(N p);
+//      ^
+// [diag.ambiguousImport] The name 'N' is defined in the libraries 'package:test/lib1.dart' and 'package:test/lib2.dart'.
+//           ^
+// [diag.ambiguousImport] The name 'N' is defined in the libraries 'package:test/lib1.dart' and 'package:test/lib2.dart'.
 N f(N p) {
+// [diag.ambiguousImport][column 1][length 1] The name 'N' is defined in the libraries 'package:test/lib1.dart' and 'package:test/lib2.dart'.
+//  ^
+// [diag.ambiguousImport] The name 'N' is defined in the libraries 'package:test/lib1.dart' and 'package:test/lib2.dart'.
   N v;
+//^
+// [diag.ambiguousImport] The name 'N' is defined in the libraries 'package:test/lib1.dart' and 'package:test/lib2.dart'.
+//  ^
+// [diag.unusedLocalVariable] The value of the local variable 'v' isn't used.
   return null;
 }
 class A {
   N m() { return null; }
+//^
+// [diag.ambiguousImport] The name 'N' is defined in the libraries 'package:test/lib1.dart' and 'package:test/lib2.dart'.
 }
-class B<T extends N> {}''',
-      [
-        error(diag.ambiguousImport, 48, 1),
-        error(diag.ambiguousImport, 53, 1),
-        error(diag.ambiguousImport, 59, 1),
-        error(diag.ambiguousImport, 63, 1),
-        error(diag.ambiguousImport, 72, 1),
-        error(diag.unusedLocalVariable, 74, 1),
-        error(diag.ambiguousImport, 106, 1),
-        error(diag.ambiguousImport, 149, 1),
-      ],
+class B<T extends N> {}
+//                ^
+// [diag.ambiguousImport] The name 'N' is defined in the libraries 'package:test/lib1.dart' and 'package:test/lib2.dart'.''',
     );
   }
 
@@ -258,13 +263,14 @@
     newFile("$testPackageLibPath/lib2.dart", '''
 library lib2;
 class N {}''');
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(
+      r'''
 import 'lib1.dart';
 import 'lib2.dart';
 class A<T> {}
-A<N>? f() { return null; }''',
-      [error(diag.ambiguousImport, 56, 1)],
+A<N>? f() { return null; }
+//^
+// [diag.ambiguousImport] The name 'N' is defined in the libraries 'package:test/lib1.dart' and 'package:test/lib2.dart'.''',
     );
   }
 
@@ -275,13 +281,14 @@
     newFile("$testPackageLibPath/lib2.dart", '''
 library lib2;
 class N {}''');
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(
+      r'''
 import 'lib1.dart';
 import 'lib2.dart';
 class A<T> {}
-f() {new A<N>();}''',
-      [error(diag.ambiguousImport, 65, 1)],
+f() {new A<N>();}
+//         ^
+// [diag.ambiguousImport] The name 'N' is defined in the libraries 'package:test/lib1.dart' and 'package:test/lib2.dart'.''',
     );
   }
 
@@ -294,17 +301,16 @@
 var x;
 ''');
 
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'a.dart';
 import 'b.dart';
 
 void f() {
   x;
+//^
+// [diag.ambiguousImport] The name 'x' is defined in the libraries 'package:test/a.dart' and 'package:test/b.dart'.
 }
-''',
-      [error(diag.ambiguousImport, 48, 1)],
-    );
+''');
   }
 
   test_variable_read_prefixed() async {
@@ -316,17 +322,16 @@
 var x;
 ''');
 
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'a.dart' as p;
 import 'b.dart' as p;
 
 void f() {
   p.x;
+//  ^
+// [diag.ambiguousImport] The name 'x' is defined in the libraries 'package:test/a.dart' and 'package:test/b.dart'.
 }
-''',
-      [error(diag.ambiguousImport, 60, 1)],
-    );
+''');
   }
 
   test_variable_write() async {
@@ -338,25 +343,25 @@
 var x;
 ''');
 
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'a.dart';
 import 'b.dart';
 
 void f() {
   x = 0;
+//^
+// [diag.ambiguousImport] The name 'x' is defined in the libraries 'package:test/a.dart' and 'package:test/b.dart'.
   x += 1;
+//^
+// [diag.ambiguousImport] The name 'x' is defined in the libraries 'package:test/a.dart' and 'package:test/b.dart'.
   ++x;
+//  ^
+// [diag.ambiguousImport] The name 'x' is defined in the libraries 'package:test/a.dart' and 'package:test/b.dart'.
   x++;
+//^
+// [diag.ambiguousImport] The name 'x' is defined in the libraries 'package:test/a.dart' and 'package:test/b.dart'.
 }
-''',
-      [
-        error(diag.ambiguousImport, 48, 1, messageContains: ["'x'"]),
-        error(diag.ambiguousImport, 57, 1),
-        error(diag.ambiguousImport, 69, 1),
-        error(diag.ambiguousImport, 74, 1),
-      ],
-    );
+''');
   }
 
   test_variable_write_prefixed() async {
@@ -368,24 +373,24 @@
 var x;
 ''');
 
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'a.dart' as p;
 import 'b.dart' as p;
 
 void f() {
   p.x = 0;
+//  ^
+// [diag.ambiguousImport] The name 'x' is defined in the libraries 'package:test/a.dart' and 'package:test/b.dart'.
   p.x += 1;
+//  ^
+// [diag.ambiguousImport] The name 'x' is defined in the libraries 'package:test/a.dart' and 'package:test/b.dart'.
   ++p.x;
+//    ^
+// [diag.ambiguousImport] The name 'x' is defined in the libraries 'package:test/a.dart' and 'package:test/b.dart'.
   p.x++;
+//  ^
+// [diag.ambiguousImport] The name 'x' is defined in the libraries 'package:test/a.dart' and 'package:test/b.dart'.
 }
-''',
-      [
-        error(diag.ambiguousImport, 60, 1),
-        error(diag.ambiguousImport, 71, 1),
-        error(diag.ambiguousImport, 85, 1),
-        error(diag.ambiguousImport, 92, 1),
-      ],
-    );
+''');
   }
 }
diff --git a/pkg/analyzer/test/src/diagnostics/ambiguous_set_or_map_literal_test.dart b/pkg/analyzer/test/src/diagnostics/ambiguous_set_or_map_literal_test.dart
index 94da085..9edfdda 100644
--- a/pkg/analyzer/test/src/diagnostics/ambiguous_set_or_map_literal_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/ambiguous_set_or_map_literal_test.dart
@@ -2,22 +2,23 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/src/diagnostic/diagnostic.dart' as diag;
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../dart/resolution/context_collection_resolution.dart';
+import '../dart/resolution/node_text_expectations.dart';
 
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(AmbiguousSetOrMapLiteralBothTest);
     defineReflectiveTests(AmbiguousSetOrMapLiteralEitherTest);
+    defineReflectiveTests(UpdateNodeTextExpectations);
   });
 }
 
 @reflectiveTest
 class AmbiguousSetOrMapLiteralBothTest extends PubPackageResolutionTest {
   test_map() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 f(Map<int, int> map) {
   return {...map};
 }
@@ -25,7 +26,7 @@
   }
 
   test_map_dynamic() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 f(Map map) {
   return {...map};
 }
@@ -33,7 +34,7 @@
   }
 
   test_map_keyNonNullable_valueNullable() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 f(Map<int, int?> map) {
   return {...map};
 }
@@ -41,7 +42,7 @@
   }
 
   test_map_keyNullable_valueNonNullable() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 f(Map<int?, int> map) {
   return {...map};
 }
@@ -49,7 +50,7 @@
   }
 
   test_map_keyNullable_valueNullable() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 f(Map<int?, int?> map) {
   return {...map};
 }
@@ -57,7 +58,7 @@
   }
 
   test_set() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 f(Set<int> set) {
   return {...set};
 }
@@ -65,7 +66,7 @@
   }
 
   test_set_dynamic() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 f(Set set) {
   return {...set};
 }
@@ -73,7 +74,7 @@
   }
 
   test_set_elementNullable() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 f(Set<int?> set) {
   return {...set};
 }
@@ -81,25 +82,23 @@
   }
 
   test_setAndMap() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 f(Map<int, int> map, Set<int> set) {
   return {...set, ...map};
+//       ^^^^^^^^^^^^^^^^
+// [diag.ambiguousSetOrMapLiteralBoth] The literal can't be either a map or a set because it contains at least one literal map entry or a spread operator spreading a 'Map', and at least one element which is neither of these.
 }
-''',
-      [error(diag.ambiguousSetOrMapLiteralBoth, 46, 16)],
-    );
+''');
   }
 
   test_setAndMap_nullable() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 f(Map<int?, int> map, Set<int?> set) {
   return {...set, ...map};
+//       ^^^^^^^^^^^^^^^^
+// [diag.ambiguousSetOrMapLiteralBoth] The literal can't be either a map or a set because it contains at least one literal map entry or a spread operator spreading a 'Map', and at least one element which is neither of these.
 }
-''',
-      [error(diag.ambiguousSetOrMapLiteralBoth, 48, 16)],
-    );
+''');
   }
 }
 
@@ -107,22 +106,20 @@
 class AmbiguousSetOrMapLiteralEitherTest extends PubPackageResolutionTest {
   test_invalidPrefixOperator() async {
     // Guard against an exception being thrown.
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 union(a, b) => !{...a, ...b};
-''',
-      [error(diag.ambiguousSetOrMapLiteralEither, 16, 12)],
-    );
+//              ^^^^^^^^^^^^
+// [diag.ambiguousSetOrMapLiteralEither] This literal must be either a map or a set, but the elements don't have enough information for type inference to work.
+''');
   }
 
   test_setAndMap() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 var map;
 var set;
 var c = {...set, ...map};
-''',
-      [error(diag.ambiguousSetOrMapLiteralEither, 26, 16)],
-    );
+//      ^^^^^^^^^^^^^^^^
+// [diag.ambiguousSetOrMapLiteralEither] This literal must be either a map or a set, but the elements don't have enough information for type inference to work.
+''');
   }
 }
diff --git a/pkg/analyzer/test/src/diagnostics/annotation_on_pointer_field_test.dart b/pkg/analyzer/test/src/diagnostics/annotation_on_pointer_field_test.dart
index ccf9d3d..e6cdd22 100644
--- a/pkg/analyzer/test/src/diagnostics/annotation_on_pointer_field_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/annotation_on_pointer_field_test.dart
@@ -2,42 +2,41 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/src/diagnostic/diagnostic.dart' as diag;
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../dart/resolution/context_collection_resolution.dart';
+import '../dart/resolution/node_text_expectations.dart';
 
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(AnnotationOnPointerFieldTest);
+    defineReflectiveTests(UpdateNodeTextExpectations);
   });
 }
 
 @reflectiveTest
 class AnnotationOnPointerFieldTest extends PubPackageResolutionTest {
   test_double() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'dart:ffi';
 final class C extends Struct {
   @Double()
+//^^^^^^^^^
+// [diag.annotationOnPointerField] Fields in a struct class whose type is 'Pointer' shouldn't have any annotations.
   external Pointer<Int8> x;
 }
-''',
-      [error(diag.annotationOnPointerField, 52, 9)],
-    );
+''');
   }
 
   test_int32() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'dart:ffi';
 final class C extends Struct {
   @Int32()
+//^^^^^^^^
+// [diag.annotationOnPointerField] Fields in a struct class whose type is 'Pointer' shouldn't have any annotations.
   external Pointer<Float> x;
 }
-''',
-      [error(diag.annotationOnPointerField, 52, 8)],
-    );
+''');
   }
 }
diff --git a/pkg/analyzer/test/src/diagnostics/annotation_syntax_test.dart b/pkg/analyzer/test/src/diagnostics/annotation_syntax_test.dart
index 6c025ff..e6925f1 100644
--- a/pkg/analyzer/test/src/diagnostics/annotation_syntax_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/annotation_syntax_test.dart
@@ -2,22 +2,22 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/src/diagnostic/diagnostic.dart' as diag;
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../dart/resolution/context_collection_resolution.dart';
+import '../dart/resolution/node_text_expectations.dart';
 
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(AnnotationSyntaxTest);
+    defineReflectiveTests(UpdateNodeTextExpectations);
   });
 }
 
 @reflectiveTest
 class AnnotationSyntaxTest extends PubPackageResolutionTest {
   test_annotation_on_type_argument() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 const annotation = null;
 
 class Annotation {
@@ -29,12 +29,11 @@
 
 class C {
   m() => new A<@annotation @Annotation("test") C>();
+//             ^^^^^^^^^^^
+// [diag.annotationOnTypeArgument] Type arguments can't have annotations because they aren't declarations.
+//                         ^^^^^^^^^^^^^^^^^^^
+// [diag.annotationOnTypeArgument] Type arguments can't have annotations because they aren't declarations.
 }
-''',
-      [
-        error(diag.annotationOnTypeArgument, 146, 11),
-        error(diag.annotationOnTypeArgument, 158, 19),
-      ],
-    );
+''');
   }
 }
diff --git a/pkg/analyzer/test/src/diagnostics/argument_must_be_a_constant_test.dart b/pkg/analyzer/test/src/diagnostics/argument_must_be_a_constant_test.dart
index 665c0eb..3af9e3f 100644
--- a/pkg/analyzer/test/src/diagnostics/argument_must_be_a_constant_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/argument_must_be_a_constant_test.dart
@@ -2,22 +2,22 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/src/diagnostic/diagnostic.dart' as diag;
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../dart/resolution/context_collection_resolution.dart';
+import '../dart/resolution/node_text_expectations.dart';
 
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(ArgumentMustBeAConstantTest);
+    defineReflectiveTests(UpdateNodeTextExpectations);
   });
 }
 
 @reflectiveTest
 class ArgumentMustBeAConstantTest extends PubPackageResolutionTest {
   test_AsFunctionIsLeafGlobal() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'dart:ffi';
 typedef Int8UnOp = Int8 Function(Int8);
 typedef IntUnOp = int Function(int);
@@ -25,16 +25,15 @@
 doThings() {
   Pointer<NativeFunction<Int8UnOp>> p = Pointer.fromAddress(1337);
   IntUnOp f = p.asFunction(isLeaf:isLeaf);
+//                                ^^^^^^
+// [diag.argumentMustBeAConstant] Argument 'isLeaf' must be a constant.
   f(8);
 }
-''',
-      [error(diag.argumentMustBeAConstant, 231, 6)],
-    );
+''');
   }
 
   test_AsFunctionIsLeafLocal() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'dart:ffi';
 typedef Int8UnOp = Int8 Function(Int8);
 typedef IntUnOp = int Function(int);
@@ -42,56 +41,53 @@
   bool isLeaf = false;
   Pointer<NativeFunction<Int8UnOp>> p = Pointer.fromAddress(1337);
   IntUnOp f = p.asFunction(isLeaf:isLeaf);
+//                                ^^^^^^
+// [diag.argumentMustBeAConstant] Argument 'isLeaf' must be a constant.
   f(8);
 }
-''',
-      [error(diag.argumentMustBeAConstant, 233, 6)],
-    );
+''');
   }
 
   test_AsFunctionIsLeafParam() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'dart:ffi';
 typedef Int8UnOp = Int8 Function(Int8);
 typedef IntUnOp = int Function(int);
 doThings(bool isLeaf) {
   Pointer<NativeFunction<Int8UnOp>> p = Pointer.fromAddress(1337);
   IntUnOp f = p.asFunction(isLeaf:isLeaf);
+//                                ^^^^^^
+// [diag.argumentMustBeAConstant] Argument 'isLeaf' must be a constant.
   f(8);
 }
-''',
-      [error(diag.argumentMustBeAConstant, 221, 6)],
-    );
+''');
   }
 
   test_FromFunctionExceptionReturn() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'dart:ffi';
 typedef NativeDoubleUnOp = Double Function(Double);
 double myTimesThree(double d) => d * 3;
 void testFromFunctionFunctionExceptionValueMustBeConst() {
   final notAConst = 1.1;
   Pointer.fromFunction<NativeDoubleUnOp>(myTimesThree, notAConst);
+//                                                     ^^^^^^^^^
+// [diag.argumentMustBeAConstant] Argument 'exceptionalReturn' must be a constant.
 }
-''',
-      [error(diag.argumentMustBeAConstant, 250, 9)],
-    );
+''');
   }
 
   test_LookupFunctionIsLeaf() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'dart:ffi';
 typedef Int8UnOp = Int8 Function(Int8);
 typedef IntUnOp = int Function(int);
 doThings(bool isLeaf) {
   DynamicLibrary l = DynamicLibrary.open("my_lib");
   l.lookupFunction<Int8UnOp, IntUnOp>("timesFour", isLeaf:isLeaf);
+//                                                        ^^^^^^
+// [diag.argumentMustBeAConstant] Argument 'isLeaf' must be a constant.
 }
-''',
-      [error(diag.argumentMustBeAConstant, 230, 6)],
-    );
+''');
   }
 }
diff --git a/pkg/analyzer/test/src/diagnostics/argument_type_not_assignable_test.dart b/pkg/analyzer/test/src/diagnostics/argument_type_not_assignable_test.dart
index 1a236b7..b14e475 100644
--- a/pkg/analyzer/test/src/diagnostics/argument_type_not_assignable_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/argument_type_not_assignable_test.dart
@@ -7,11 +7,13 @@
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../dart/resolution/context_collection_resolution.dart';
+import '../dart/resolution/node_text_expectations.dart';
 
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(ArgumentTypeNotAssignableTest);
     defineReflectiveTests(ArgumentTypeNotAssignableWithStrictCastsTest);
+    defineReflectiveTests(UpdateNodeTextExpectations);
   });
 }
 
@@ -22,15 +24,14 @@
     newFile('$testPackageLibPath/lib2.dart', '''
 class _A {}
 g(h(_A a)) {}''');
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'lib2.dart';
 class _A {}
 f() {
   g((_A a) {});
-}''',
-      [error(diag.argumentTypeNotAssignable, 42, 9)],
-    );
+//  ^^^^^^^^^
+// [diag.argumentTypeNotAssignable] The argument type 'Null Function(_A)' can't be assigned to the parameter type 'dynamic Function(_A)'. 
+}''');
     // The name _A is private to the library it's defined in, so this is a type
     // mismatch. Furthermore, the error message should mention both _A and the
     // filenames so the user can figure out what's going on.
@@ -39,45 +40,42 @@
   }
 
   test_annotation_extensionType() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 extension type const A(String _) {}
 
 @A(0)
+// ^
+// [diag.argumentTypeNotAssignable] The argument type 'int' can't be assigned to the parameter type 'String'. 
 void f() {}
-''',
-      [error(diag.argumentTypeNotAssignable, 40, 1)],
-    );
+''');
   }
 
   test_annotation_namedConstructor() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   const A.fromInt(int p);
 }
 @A.fromInt('0')
+//         ^^^
+// [diag.argumentTypeNotAssignable] The argument type 'String' can't be assigned to the parameter type 'int'. 
 main() {}
-''',
-      [error(diag.argumentTypeNotAssignable, 49, 3)],
-    );
+''');
   }
 
   test_annotation_namedConstructor_generic() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 class A<T> {
   const A.fromInt(T p);
 }
 @A<int>.fromInt('0')
+//              ^^^
+// [diag.argumentTypeNotAssignable] The argument type 'String' can't be assigned to the parameter type 'int'. 
 main() {
-}''',
-      [error(diag.argumentTypeNotAssignable, 55, 3)],
-    );
+}''');
   }
 
   test_annotation_type_arguments_inferred() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 @C([])
 int i = 0;
 
@@ -88,69 +86,63 @@
   }
 
   test_annotation_unnamedConstructor() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   const A(int p);
 }
 @A('0')
+// ^^^
+// [diag.argumentTypeNotAssignable] The argument type 'String' can't be assigned to the parameter type 'int'. 
 main() {
-}''',
-      [error(diag.argumentTypeNotAssignable, 33, 3)],
-    );
+}''');
   }
 
   test_binary() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   operator +(int p) {}
 }
 f(A a) {
   a + '0';
-}''',
-      [error(diag.argumentTypeNotAssignable, 50, 3)],
-    );
+//    ^^^
+// [diag.argumentTypeNotAssignable] The argument type 'String' can't be assigned to the parameter type 'int'. 
+}''');
   }
 
   test_binary_eqEq_covariantParameterType() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   bool operator==(covariant A other) => false;
 }
 
 void f(A a, A? aq) {
   a == 0;
+//     ^
+// [diag.argumentTypeNotAssignable] The argument type 'int' can't be assigned to the parameter type 'A?'. 
   aq == 1;
+//      ^
+// [diag.argumentTypeNotAssignable] The argument type 'int' can't be assigned to the parameter type 'A?'. 
   aq == aq;
   aq == null;
 }
-''',
-      [
-        error(diag.argumentTypeNotAssignable, 88, 1),
-        error(diag.argumentTypeNotAssignable, 99, 1),
-      ],
-    );
+''');
   }
 
   test_call() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 typedef bool Predicate<T>(T object);
 
 Predicate<String> f() => (String s) => false;
 
 void main() {
   f().call(3);
-}''',
-      [error(diag.argumentTypeNotAssignable, 110, 1)],
-    );
+//         ^
+// [diag.argumentTypeNotAssignable] The argument type 'int' can't be assigned to the parameter type 'String'. 
+}''');
   }
 
   test_cascadeSecond() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 // filler filler filler filler filler filler filler filler filler filler
 class A {
   B ma() { return new B(); }
@@ -162,68 +154,62 @@
 main() {
   A a = new A();
   a..  ma().mb(0);
-}''',
-      [error(diag.argumentTypeNotAssignable, 186, 1)],
-    );
+//             ^
+// [diag.argumentTypeNotAssignable] The argument type 'int' can't be assigned to the parameter type 'String'. 
+}''');
   }
 
   test_const() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   const A(String p);
 }
 main() {
   const A(42);
-}''',
-      [
-        error(diag.argumentTypeNotAssignable, 52, 2),
-        error(diag.constConstructorParamTypeMismatch, 52, 2),
-      ],
-    );
+//        ^^
+// [diag.argumentTypeNotAssignable] The argument type 'int' can't be assigned to the parameter type 'String'. 
+// [diag.constConstructorParamTypeMismatch] A value of type 'int' can't be assigned to a parameter of type 'String' in a const constructor.
+}''');
   }
 
   test_const_super() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   const A(String p);
 }
 class B extends A {
   const B() : super(42);
-}''',
-      [error(diag.argumentTypeNotAssignable, 73, 2)],
-    );
+//                  ^^
+// [diag.argumentTypeNotAssignable] The argument type 'int' can't be assigned to the parameter type 'String'. 
+}''');
   }
 
   test_downcast() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 m() {
   num y = 1;
   n(y);
+//  ^
+// [diag.argumentTypeNotAssignable] The argument type 'num' can't be assigned to the parameter type 'int'. 
 }
 n(int x) {}
-''',
-      [error(diag.argumentTypeNotAssignable, 23, 1)],
-    );
+''');
   }
 
   test_downcast_nullableNonNullable() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 m() {
   int? y;
   n(y);
+//  ^
+// [diag.argumentTypeNotAssignable] The argument type 'int?' can't be assigned to the parameter type 'int'. 
 }
 n(int x) {}
-''',
-      [error(diag.argumentTypeNotAssignable, 20, 1)],
-    );
+''');
   }
 
   test_dynamicCast() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 m() {
   dynamic i;
   n(i);
@@ -233,22 +219,19 @@
   }
 
   test_enumConstant() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 enum E {
   v(0);
+//  ^
+// [diag.argumentTypeNotAssignable] The argument type 'int' can't be assigned to the parameter type 'String'. 
+// [diag.constConstructorParamTypeMismatch] A value of type 'int' can't be assigned to a parameter of type 'String' in a const constructor.
   const E(String a);
 }
-''',
-      [
-        error(diag.argumentTypeNotAssignable, 13, 1),
-        error(diag.constConstructorParamTypeMismatch, 13, 1),
-      ],
-    );
+''');
   }
 
   test_enumConstant_implicitDouble() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 enum E {
   v(0);
   const E(double a);
@@ -257,7 +240,7 @@
   }
 
   test_expressionFromConstructorTearoff_withoutTypeArgs() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 class C<T> {
   C(T a);
 }
@@ -268,7 +251,7 @@
   }
 
   test_expressionFromConstructorTearoff_withTypeArgs_assignable() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 class C<T> {
   C(T a);
 }
@@ -279,21 +262,20 @@
   }
 
   test_expressionFromConstructorTearoff_withTypeArgs_notAssignable() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 class C<T> {
   C(T a);
 }
 
 var g = C<int>.new;
 var x = g('Hello');
-''',
-      [error(diag.argumentTypeNotAssignable, 56, 7)],
-    );
+//        ^^^^^^^
+// [diag.argumentTypeNotAssignable] The argument type 'String' can't be assigned to the parameter type 'int'. 
+''');
   }
 
   test_expressionFromFunctionTearoff_withoutTypeArgs() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 void f<T>(T a) {}
 
 var g = f;
@@ -302,7 +284,7 @@
   }
 
   test_expressionFromFunctionTearoff_withTypeArgs_assignable() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 void f<T>(T a) {}
 
 var g = f<int>;
@@ -311,20 +293,19 @@
   }
 
   test_expressionFromFunctionTearoff_withTypeArgs_notAssignable() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 void f<T>(T a) {}
 
 var g = f<int>;
 var x = g('Hello');
-''',
-      [error(diag.argumentTypeNotAssignable, 45, 7)],
-    );
+//        ^^^^^^^
+// [diag.argumentTypeNotAssignable] The argument type 'String' can't be assigned to the parameter type 'int'. 
+''');
   }
 
   test_for_element_type_inferred_from_rewritten_node() async {
     // See https://github.com/dart-lang/sdk/issues/39171
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 void f<T>(Iterable<T> Function() g, int Function(T) h) {
   [for (var x in g()) if (x is String) h(x)];
 }
@@ -333,7 +314,7 @@
 
   test_for_statement_type_inferred_from_rewritten_node() async {
     // See https://github.com/dart-lang/sdk/issues/39171
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 void f<T>(Iterable<T> Function() g, void Function(T) h) {
   for (var x in g()) {
     if (x is String) {
@@ -345,32 +326,30 @@
   }
 
   test_functionExpressionInvocation_required() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 main() {
   (int x) {} ('');
-}''',
-      [error(diag.argumentTypeNotAssignable, 23, 2)],
-    );
+//            ^^
+// [diag.argumentTypeNotAssignable] The argument type 'String' can't be assigned to the parameter type 'int'. 
+}''');
   }
 
   test_functionType() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 m() {
   var a = new A();
   a.n(() => 0);
+//    ^^^^^^^
+// [diag.argumentTypeNotAssignable] The argument type 'void Function()' can't be assigned to the parameter type 'void Function(int)'. 
 }
 class A {
   n(void f(int i)) {}
 }
-''',
-      [error(diag.argumentTypeNotAssignable, 31, 7)],
-    );
+''');
   }
 
   test_implicitCallReference() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   void call(int p) {}
 }
@@ -382,7 +361,7 @@
   }
 
   test_implicitCallReference_named() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   void call(int p) {}
 }
@@ -395,7 +374,7 @@
   }
 
   test_implicitCallReference_namedAndRequired() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   void call(int p) {}
 }
@@ -407,7 +386,7 @@
   }
 
   test_implicitCallReference_this() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   void call(int p) {}
 
@@ -420,243 +399,225 @@
   }
 
   test_index_invalidRead() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   int operator [](int index) => 0;
 }
 f(A a) {
   a['0'];
-}''',
-      [error(diag.argumentTypeNotAssignable, 60, 3)],
-    );
+//  ^^^
+// [diag.argumentTypeNotAssignable] The argument type 'String' can't be assigned to the parameter type 'int'. 
+}''');
   }
 
   test_index_invalidRead_validWrite() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   int operator [](int index) => 0;
   operator []=(String index, int value) {}
 }
 f(A a) {
   a['0'] += 0;
+//  ^^^
+// [diag.argumentTypeNotAssignable] The argument type 'String' can't be assigned to the parameter type 'int'. 
   ++a['0'];
+//    ^^^
+// [diag.argumentTypeNotAssignable] The argument type 'String' can't be assigned to the parameter type 'int'. 
   a['0']++;
-}''',
-      [
-        error(diag.argumentTypeNotAssignable, 103, 3),
-        error(diag.argumentTypeNotAssignable, 120, 3),
-        error(diag.argumentTypeNotAssignable, 130, 3),
-      ],
-    );
+//  ^^^
+// [diag.argumentTypeNotAssignable] The argument type 'String' can't be assigned to the parameter type 'int'. 
+}''');
   }
 
   test_index_invalidWrite() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   operator []=(int index, int value) {}
 }
 f(A a) {
   a['0'] = 0;
-}''',
-      [error(diag.argumentTypeNotAssignable, 65, 3)],
-    );
+//  ^^^
+// [diag.argumentTypeNotAssignable] The argument type 'String' can't be assigned to the parameter type 'int'. 
+}''');
   }
 
   test_index_validRead_invalidWrite() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   int operator [](String index) => 0;
   operator []=(int index, int value) {}
 }
 f(A a) {
   a['0'] += 0;
+//  ^^^
+// [diag.argumentTypeNotAssignable] The argument type 'String' can't be assigned to the parameter type 'int'. 
   ++a['0'];
+//    ^^^
+// [diag.argumentTypeNotAssignable] The argument type 'String' can't be assigned to the parameter type 'int'. 
   a['0']++;
-}''',
-      [
-        error(diag.argumentTypeNotAssignable, 103, 3),
-        error(diag.argumentTypeNotAssignable, 120, 3),
-        error(diag.argumentTypeNotAssignable, 130, 3),
-      ],
-    );
+//  ^^^
+// [diag.argumentTypeNotAssignable] The argument type 'String' can't be assigned to the parameter type 'int'. 
+}''');
   }
 
   test_interfaceType() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 m() {
   var i = '';
   n(i);
+//  ^
+// [diag.argumentTypeNotAssignable] The argument type 'String' can't be assigned to the parameter type 'int'. 
 }
 n(int i) {}
-''',
-      [error(diag.argumentTypeNotAssignable, 24, 1)],
-    );
+''');
   }
 
   test_invocation_callParameter() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   call(int p) {}
 }
 f(A a) {
   a('0');
-}''',
-      [error(diag.argumentTypeNotAssignable, 42, 3)],
-    );
+//  ^^^
+// [diag.argumentTypeNotAssignable] The argument type 'String' can't be assigned to the parameter type 'int'. 
+}''');
   }
 
   test_invocation_callVariable() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   call(int p) {}
 }
 main() {
   A a = new A();
   a('0');
-}''',
-      [error(diag.argumentTypeNotAssignable, 59, 3)],
-    );
+//  ^^^
+// [diag.argumentTypeNotAssignable] The argument type 'String' can't be assigned to the parameter type 'int'. 
+}''');
   }
 
   test_invocation_functionParameter() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 a(b(int p)) {
   b('0');
-}''',
-      [error(diag.argumentTypeNotAssignable, 18, 3)],
-    );
+//  ^^^
+// [diag.argumentTypeNotAssignable] The argument type 'String' can't be assigned to the parameter type 'int'. 
+}''');
   }
 
   test_invocation_functionParameter_generic() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 class A<K, V> {
   m(f(K k), V v) {
     f(v);
+//    ^
+// [diag.argumentTypeNotAssignable] The argument type 'V' can't be assigned to the parameter type 'K'. 
   }
-}''',
-      [error(diag.argumentTypeNotAssignable, 41, 1)],
-    );
+}''');
   }
 
   test_invocation_functionTypes_optional() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 void acceptFunOptBool(void funNumOptBool([bool b])) {}
 void funBool(bool b) {}
 main() {
   acceptFunOptBool(funBool);
-}''',
-      [error(diag.argumentTypeNotAssignable, 107, 7)],
-    );
+//                 ^^^^^^^
+// [diag.argumentTypeNotAssignable] The argument type 'void Function(bool)' can't be assigned to the parameter type 'void Function([bool])'. 
+}''');
   }
 
   test_invocation_functionTypes_optional_method() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 void acceptFunOptBool(void funOptBool([bool b])) {}
 class C {
   static void funBool(bool b) {}
 }
 main() {
   acceptFunOptBool(C.funBool);
-}''',
-      [error(diag.argumentTypeNotAssignable, 125, 9)],
-    );
+//                 ^^^^^^^^^
+// [diag.argumentTypeNotAssignable] The argument type 'void Function(bool)' can't be assigned to the parameter type 'void Function([bool])'. 
+}''');
   }
 
   test_invocation_generic() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 class A<T> {
   m(T t) {}
 }
 f(A<String> a) {
   a.m(1);
-}''',
-      [error(diag.argumentTypeNotAssignable, 50, 1)],
-    );
+//    ^
+// [diag.argumentTypeNotAssignable] The argument type 'int' can't be assigned to the parameter type 'String'. 
+}''');
   }
 
   test_invocation_named() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 f({String p = ''}) {}
 main() {
   f(p: 42);
-}''',
-      [error(diag.argumentTypeNotAssignable, 38, 2)],
-    );
+//     ^^
+// [diag.argumentTypeNotAssignable] The argument type 'int' can't be assigned to the parameter type 'String'. 
+}''');
   }
 
   test_invocation_optional() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 f([String p = '']) {}
 main() {
   f(42);
-}''',
-      [error(diag.argumentTypeNotAssignable, 35, 2)],
-    );
+//  ^^
+// [diag.argumentTypeNotAssignable] The argument type 'int' can't be assigned to the parameter type 'String'. 
+}''');
   }
 
   test_invocation_required() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 f(String p) {}
 main() {
   f(42);
-}''',
-      [error(diag.argumentTypeNotAssignable, 28, 2)],
-    );
+//  ^^
+// [diag.argumentTypeNotAssignable] The argument type 'int' can't be assigned to the parameter type 'String'. 
+}''');
   }
 
   test_invocation_typedef_generic() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 typedef A<T>(T p);
 f(A<int> a) {
   a('1');
-}''',
-      [error(diag.argumentTypeNotAssignable, 37, 3)],
-    );
+//  ^^^
+// [diag.argumentTypeNotAssignable] The argument type 'String' can't be assigned to the parameter type 'int'. 
+}''');
   }
 
   test_invocation_typedef_local() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 typedef A(int p);
 A getA() => throw '';
 main() {
   A a = getA();
   a('1');
-}''',
-      [error(diag.argumentTypeNotAssignable, 69, 3)],
-    );
+//  ^^^
+// [diag.argumentTypeNotAssignable] The argument type 'String' can't be assigned to the parameter type 'int'. 
+}''');
   }
 
   test_invocation_typedef_parameter() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 typedef A(int p);
 f(A a) {
   a('1');
-}''',
-      [error(diag.argumentTypeNotAssignable, 31, 3)],
-    );
+//  ^^^
+// [diag.argumentTypeNotAssignable] The argument type 'String' can't be assigned to the parameter type 'int'. 
+}''');
   }
 
   test_map_indexGet() async {
     // Any type may be passed to Map.operator[].
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 main() {
   Map<int, int> m = <int, int>{};
   m['x'];
@@ -666,94 +627,78 @@
 
   test_map_indexSet() async {
     // The type passed to Map.operator[]= must match the key type.
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 main() {
   Map<int, int> m = <int, int>{};
   m['x'] = 0;
+//  ^^^
+// [diag.argumentTypeNotAssignable] The argument type 'String' can't be assigned to the parameter type 'int'. 
 }
-''',
-      [error(diag.argumentTypeNotAssignable, 47, 3)],
-    );
+''');
   }
 
   test_map_indexSet_ifNull() async {
     // The type passed to Map.operator[]= must match the key type.
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 main() {
   Map<int, int> m = <int, int>{};
   m['x'] ??= 0;
+//  ^^^
+// [diag.argumentTypeNotAssignable] The argument type 'String' can't be assigned to the parameter type 'int'. 
 }
-''',
-      [error(diag.argumentTypeNotAssignable, 47, 3)],
-    );
+''');
   }
 
   test_new_generic() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 class A<T> {
   A(T p) {}
 }
 main() {
   new A<String>(42);
-}''',
-      [error(diag.argumentTypeNotAssignable, 52, 2)],
-    );
+//              ^^
+// [diag.argumentTypeNotAssignable] The argument type 'int' can't be assigned to the parameter type 'String'. 
+}''');
   }
 
   test_new_optional() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   A([String p = '']) {}
 }
 main() {
   new A(42);
-}''',
-      [error(diag.argumentTypeNotAssignable, 53, 2)],
-    );
+//      ^^
+// [diag.argumentTypeNotAssignable] The argument type 'int' can't be assigned to the parameter type 'String'. 
+}''');
   }
 
   test_new_required() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   A(String p) {}
 }
 main() {
   new A(42);
-}''',
-      [error(diag.argumentTypeNotAssignable, 46, 2)],
-    );
+//      ^^
+// [diag.argumentTypeNotAssignable] The argument type 'int' can't be assigned to the parameter type 'String'. 
+}''');
   }
 
   void test_recordType() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 void f((int a, int b) r) {}
 
 void g() {
   f((a: 1, b: 2));
+//  ^^^^^^^^^^^^
+// [diag.argumentTypeNotAssignable] The argument type '({int a, int b})' can't be assigned to the parameter type '(int, int)'. Expected 2 positional arguments, but got 0 instead.
 }
-''',
-      [
-        error(
-          diag.argumentTypeNotAssignable,
-          44,
-          12,
-          messageContains: [
-            'Expected 2 positional arguments, but got 0 instead.',
-          ],
-        ),
-      ],
-    );
+''');
   }
 
   void test_recordType_namedArguments() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 typedef A = ({
   int b,
   int c,
@@ -763,22 +708,14 @@
 
 main() {
  f((bb:2, c:3));
+// ^^^^^^^^^^^
+// [diag.argumentTypeNotAssignable] The argument type '({int bb, int c})' can't be assigned to the parameter type 'A'. Unexpected named argument `bb` with type `int`.
 }
-''',
-      [
-        error(
-          diag.argumentTypeNotAssignable,
-          74,
-          11,
-          messageContains: ['Unexpected named argument `bb` with type `int`.'],
-        ),
-      ],
-    );
+''');
   }
 
   void test_recordType_namedArguments_missing() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 typedef A = ({
   int b,
   int c,
@@ -788,22 +725,14 @@
 
 main() {
  f((b:2));
+// ^^^^^
+// [diag.argumentTypeNotAssignable] The argument type '({int b})' can't be assigned to the parameter type 'A'. Expected 2 named arguments, but got 1 instead.
 }
-''',
-      [
-        error(
-          diag.argumentTypeNotAssignable,
-          74,
-          5,
-          messageContains: ['Expected 2 named arguments, but got 1 instead.'],
-        ),
-      ],
-    );
+''');
   }
 
   void test_recordType_positionalArguments() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 typedef A = (
   int b,
   int c,
@@ -813,19 +742,10 @@
 
 main() {
  f((3, 2, 1));
+// ^^^^^^^^^
+// [diag.argumentTypeNotAssignable] The argument type '(int, int, int)' can't be assigned to the parameter type 'A'. Expected 2 positional arguments, but got 3 instead.
 }
-''',
-      [
-        error(
-          diag.argumentTypeNotAssignable,
-          72,
-          9,
-          messageContains: [
-            'Expected 2 positional arguments, but got 3 instead.',
-          ],
-        ),
-      ],
-    );
+''');
   }
 
   @failingTest
diff --git a/pkg/analyzer/test/src/diagnostics/argument_type_not_assignable_to_error_handler_test.dart b/pkg/analyzer/test/src/diagnostics/argument_type_not_assignable_to_error_handler_test.dart
index 46c0b23..f9f9bc2 100644
--- a/pkg/analyzer/test/src/diagnostics/argument_type_not_assignable_to_error_handler_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/argument_type_not_assignable_to_error_handler_test.dart
@@ -2,10 +2,10 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/src/diagnostic/diagnostic.dart' as diag;
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../dart/resolution/context_collection_resolution.dart';
+import '../dart/resolution/node_text_expectations.dart';
 
 main() {
   defineReflectiveSuite(() {
@@ -24,6 +24,7 @@
     defineReflectiveTests(
       ArgumentTypeNotAssignableToErrorHandler_StreamSubscriptionOnErrorTest,
     );
+    defineReflectiveTests(UpdateNodeTextExpectations);
   });
 }
 
@@ -31,7 +32,7 @@
 class ArgumentTypeNotAssignableToErrorHandler_FutureCatchErrorTest
     extends PubPackageResolutionTest {
   void test_firstParameterIsDynamic() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 void f(Future<int> future, Future<int> Function(dynamic a) callback) {
   future.catchError(callback);
 }
@@ -39,18 +40,17 @@
   }
 
   void test_firstParameterIsNamed() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 void f(Future<int> future, Future<int> Function({Object a}) callback) {
   future.catchError(callback);
+//                  ^^^^^^^^
+// [diag.argumentTypeNotAssignableToErrorHandler] The argument type 'Future<int> Function({Object a})' can't be assigned to the parameter type 'FutureOr<int> Function(Object)' or 'FutureOr<int> Function(Object, StackTrace)'.
 }
-''',
-      [error(diag.argumentTypeNotAssignableToErrorHandler, 92, 8)],
-    );
+''');
   }
 
   void test_firstParameterIsOptional() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 void f(Future<int> future, Future<int> Function([Object a]) callback) {
   future.catchError(callback);
 }
@@ -58,7 +58,7 @@
   }
 
   void test_functionExpression_firstParameterIsDynamic() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 void f(Future<void> future) {
   future.catchError((dynamic a) {});
 }
@@ -66,7 +66,7 @@
   }
 
   void test_functionExpression_firstParameterIsImplicit() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 void f(Future<void> future) {
   future.catchError((a) {});
 }
@@ -74,18 +74,17 @@
   }
 
   void test_functionExpression_firstParameterIsNamed() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 void f(Future<void> future) {
   future.catchError(({Object a = 1}) {});
+//                  ^^^^^^^^^^^^^^^^^^^
+// [diag.argumentTypeNotAssignableToErrorHandler] The argument type 'Null Function({Object a})' can't be assigned to the parameter type 'FutureOr<void> Function(Object)' or 'FutureOr<void> Function(Object, StackTrace)'.
 }
-''',
-      [error(diag.argumentTypeNotAssignableToErrorHandler, 50, 19)],
-    );
+''');
   }
 
   void test_functionExpression_firstParameterIsNullableObject() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 void f(Future<void> future) {
   future.catchError((Object? a) {});
 }
@@ -93,7 +92,7 @@
   }
 
   void test_functionExpression_firstParameterIsOptional() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 void f(Future<void> future) {
   future.catchError(([Object a = 1]) {});
 }
@@ -101,7 +100,7 @@
   }
 
   void test_functionExpression_firstParameterIsUntyped() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 void f(Future<void> future) {
   future.catchError((a) {});
 }
@@ -109,18 +108,17 @@
   }
 
   void test_functionExpression_noParameters() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 void f(Future<void> future) {
   future.catchError(() {});
+//                  ^^^^^
+// [diag.argumentTypeNotAssignableToErrorHandler] The argument type 'Null Function()' can't be assigned to the parameter type 'FutureOr<void> Function(Object)' or 'FutureOr<void> Function(Object, StackTrace)'.
 }
-''',
-      [error(diag.argumentTypeNotAssignableToErrorHandler, 50, 5)],
-    );
+''');
   }
 
   void test_functionExpression_secondParameterIsDynamic() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 void f(Future<void> future) {
   future.catchError((Object a, dynamic b) {});
 }
@@ -128,7 +126,7 @@
   }
 
   void test_functionExpression_secondParameterIsImplicit() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 void f(Future<void> future) {
   future.catchError((Object a, b) {});
 }
@@ -136,18 +134,17 @@
   }
 
   void test_functionExpression_secondParameterIsNamed() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 void f(Future<void> future) {
   future.catchError((Object a, {required StackTrace b}) {});
+//                  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// [diag.argumentTypeNotAssignableToErrorHandler] The argument type 'Null Function(Object, {required StackTrace b})' can't be assigned to the parameter type 'FutureOr<void> Function(Object)' or 'FutureOr<void> Function(Object, StackTrace)'.
 }
-''',
-      [error(diag.argumentTypeNotAssignableToErrorHandler, 50, 38)],
-    );
+''');
   }
 
   void test_functionExpression_secondParameterIsNullableStackTrace() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 void f(Future<void> future) {
   future.catchError((Object a, StackTrace? b) {});
 }
@@ -155,7 +152,7 @@
   }
 
   void test_functionExpression_secondParameterIsUntyped() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 void f(Future<void> future) {
   future.catchError((Object a, b) {});
 }
@@ -163,51 +160,47 @@
   }
 
   void test_functionExpression_tooManyParameters() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 void f(Future<void> future) {
   future.catchError((a, b, c) {});
+//                  ^^^^^^^^^^^^
+// [diag.argumentTypeNotAssignableToErrorHandler] The argument type 'Null Function(dynamic, dynamic, dynamic)' can't be assigned to the parameter type 'FutureOr<void> Function(Object)' or 'FutureOr<void> Function(Object, StackTrace)'.
 }
-''',
-      [error(diag.argumentTypeNotAssignableToErrorHandler, 50, 12)],
-    );
+''');
   }
 
   void test_functionExpression_wrongFirstParameterType() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 void f(Future<void> future) {
   future.catchError((String a) {});
+//                  ^^^^^^^^^^^^^
+// [diag.argumentTypeNotAssignableToErrorHandler] The argument type 'Null Function(String)' can't be assigned to the parameter type 'FutureOr<void> Function(Object)' or 'FutureOr<void> Function(Object, StackTrace)'.
 }
-''',
-      [error(diag.argumentTypeNotAssignableToErrorHandler, 50, 13)],
-    );
+''');
   }
 
   void test_functionExpression_wrongSecondParameterType() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 void f(Future<void> future) {
   future.catchError((Object a, String b) {});
+//                  ^^^^^^^^^^^^^^^^^^^^^^^
+// [diag.argumentTypeNotAssignableToErrorHandler] The argument type 'Null Function(Object, String)' can't be assigned to the parameter type 'FutureOr<void> Function(Object)' or 'FutureOr<void> Function(Object, StackTrace)'.
 }
-''',
-      [error(diag.argumentTypeNotAssignableToErrorHandler, 50, 23)],
-    );
+''');
   }
 
   void test_noParameters() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 void f(Future<int> future, Future<int> Function() callback) {
   future.catchError(callback);
+//                  ^^^^^^^^
+// [diag.argumentTypeNotAssignableToErrorHandler] The argument type 'Future<int> Function()' can't be assigned to the parameter type 'FutureOr<int> Function(Object)' or 'FutureOr<int> Function(Object, StackTrace)'.
 }
-''',
-      [error(diag.argumentTypeNotAssignableToErrorHandler, 82, 8)],
-    );
+''');
   }
 
   void test_okType() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 void f(Future<int> future, Future<int> Function(Object, StackTrace) callback) {
   future.catchError(callback);
 }
@@ -215,7 +208,7 @@
   }
 
   void test_secondParameterIsDynamic() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 void f(Future<int> future, Future<int> Function(Object a, dynamic b) callback) {
   future.catchError(callback);
 }
@@ -223,47 +216,43 @@
   }
 
   void test_secondParameterIsNamed() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 void f(Future<int> future, Future<int> Function(Object a, {StackTrace b}) callback) {
   future.catchError(callback);
+//                  ^^^^^^^^
+// [diag.argumentTypeNotAssignableToErrorHandler] The argument type 'Future<int> Function(Object, {StackTrace b})' can't be assigned to the parameter type 'FutureOr<int> Function(Object)' or 'FutureOr<int> Function(Object, StackTrace)'.
 }
-''',
-      [error(diag.argumentTypeNotAssignableToErrorHandler, 106, 8)],
-    );
+''');
   }
 
   void test_tooManyParameters() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 void f(Future<int> future, Future<int> Function(int, int, int) callback) {
   future.catchError(callback);
+//                  ^^^^^^^^
+// [diag.argumentTypeNotAssignableToErrorHandler] The argument type 'Future<int> Function(int, int, int)' can't be assigned to the parameter type 'FutureOr<int> Function(Object)' or 'FutureOr<int> Function(Object, StackTrace)'.
 }
-''',
-      [error(diag.argumentTypeNotAssignableToErrorHandler, 95, 8)],
-    );
+''');
   }
 
   void test_wrongFirstParameterType() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 void f(Future<int> future, Future<int> Function(String) callback) {
   future.catchError(callback);
+//                  ^^^^^^^^
+// [diag.argumentTypeNotAssignableToErrorHandler] The argument type 'Future<int> Function(String)' can't be assigned to the parameter type 'FutureOr<int> Function(Object)' or 'FutureOr<int> Function(Object, StackTrace)'.
 }
-''',
-      [error(diag.argumentTypeNotAssignableToErrorHandler, 88, 8)],
-    );
+''');
   }
 
   void test_wrongSecondParameterType() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 void f(Future<int> future, Future<int> Function(Object, String) callback) {
   future.catchError(callback);
+//                  ^^^^^^^^
+// [diag.argumentTypeNotAssignableToErrorHandler] The argument type 'Future<int> Function(Object, String)' can't be assigned to the parameter type 'FutureOr<int> Function(Object)' or 'FutureOr<int> Function(Object, StackTrace)'.
 }
-''',
-      [error(diag.argumentTypeNotAssignableToErrorHandler, 96, 8)],
-    );
+''');
   }
 }
 
@@ -271,7 +260,7 @@
 class ArgumentTypeNotAssignableToErrorHandler_FutureThenTest
     extends PubPackageResolutionTest {
   void test_firstParameterIsDynamic() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 void f(Future<void> future, void Function(dynamic a) callback) {
   future.then((_) {}, onError: callback);
 }
@@ -282,29 +271,27 @@
     // `void` must be specified explicitly on `then()`; the inferred type from
     // `() {}` would otherwise be `Null`, and `void` (or `Future<void>`, or
     // `Future<int>`) would be an illegal return type for the `onError` handler.
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 void f(Future<void> future, Future<void> Function({Object a}) callback) {
   future.then<void>((_) {}, onError: callback);
+//                                   ^^^^^^^^
+// [diag.argumentTypeNotAssignableToErrorHandler] The argument type 'Future<void> Function({Object a})' can't be assigned to the parameter type 'FutureOr<void> Function(Object)' or 'FutureOr<void> Function(Object, StackTrace)'.
 }
-''',
-      [error(diag.argumentTypeNotAssignableToErrorHandler, 111, 8)],
-    );
+''');
   }
 
   void test_functionExpression_firstParameterIsNamed() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 void f(Future<void> future) {
   future.then((_) {}, onError: ({Object a = 1}) {});
+//                             ^^^^^^^^^^^^^^^^^^^
+// [diag.argumentTypeNotAssignableToErrorHandler] The argument type 'Null Function({Object a})' can't be assigned to the parameter type 'FutureOr<Null> Function(Object)' or 'FutureOr<Null> Function(Object, StackTrace)'.
 }
-''',
-      [error(diag.argumentTypeNotAssignableToErrorHandler, 61, 19)],
-    );
+''');
   }
 
   void test_functionExpression_firstParameterIsNullableObject() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 void f(Future<void> future) {
   future.then((_) {}, onError: (Object? a) {});
 }
@@ -312,29 +299,27 @@
   }
 
   void test_functionExpression_noParameters() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 void f(Future<void> future) {
   future.then((_) {}, onError: () {});
+//                             ^^^^^
+// [diag.argumentTypeNotAssignableToErrorHandler] The argument type 'Null Function()' can't be assigned to the parameter type 'FutureOr<Null> Function(Object)' or 'FutureOr<Null> Function(Object, StackTrace)'.
 }
-''',
-      [error(diag.argumentTypeNotAssignableToErrorHandler, 61, 5)],
-    );
+''');
   }
 
   void test_functionExpression_secondParameterIsNamed() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 void f(Future<void> future) {
   future.then((_) {}, onError: (Object a, {StackTrace? b}) {});
+//                             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// [diag.argumentTypeNotAssignableToErrorHandler] The argument type 'Null Function(Object, {StackTrace? b})' can't be assigned to the parameter type 'FutureOr<Null> Function(Object)' or 'FutureOr<Null> Function(Object, StackTrace)'.
 }
-''',
-      [error(diag.argumentTypeNotAssignableToErrorHandler, 61, 30)],
-    );
+''');
   }
 
   void test_functionExpression_secondParameterIsNullableStackTrace() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 void f(Future<void> future) {
   future.then((_) {}, onError: (Object a, StackTrace? b) {});
 }
@@ -342,18 +327,17 @@
   }
 
   void test_functionExpression_wrongFirstParameterType() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 void f(Future<void> future) {
   future.then((_) {}, onError: (String a) {});
+//                             ^^^^^^^^^^^^^
+// [diag.argumentTypeNotAssignableToErrorHandler] The argument type 'Null Function(String)' can't be assigned to the parameter type 'FutureOr<Null> Function(Object)' or 'FutureOr<Null> Function(Object, StackTrace)'.
 }
-''',
-      [error(diag.argumentTypeNotAssignableToErrorHandler, 61, 13)],
-    );
+''');
   }
 
   void test_functionType() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 void f(Future<void> future, Function callback) {
   future.then((_) {}, onError: callback);
 }
@@ -365,7 +349,7 @@
 class ArgumentTypeNotAssignableToErrorHandler_StreamHandleErrorTest
     extends PubPackageResolutionTest {
   void test_firstParameterIsDynamic() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 void f(Stream<void> stream, void Function(dynamic a) callback) {
   stream.handleError(callback);
 }
@@ -373,29 +357,27 @@
   }
 
   void test_firstParameterIsNamed() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 void f(Stream<void> stream, Future<int> Function({Object a}) callback) {
   stream.handleError(callback);
+//                   ^^^^^^^^
+// [diag.argumentTypeNotAssignableToErrorHandler] The argument type 'Future<int> Function({Object a})' can't be assigned to the parameter type 'void Function(Object)' or 'void Function(Object, StackTrace)'.
 }
-''',
-      [error(diag.argumentTypeNotAssignableToErrorHandler, 94, 8)],
-    );
+''');
   }
 
   void test_functionExpression_firstParameterIsNamed() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 void f(Stream<void> stream) {
   stream.handleError(({Object a = 1}) {});
+//                   ^^^^^^^^^^^^^^^^^^^
+// [diag.argumentTypeNotAssignableToErrorHandler] The argument type 'Null Function({Object a})' can't be assigned to the parameter type 'void Function(Object)' or 'void Function(Object, StackTrace)'.
 }
-''',
-      [error(diag.argumentTypeNotAssignableToErrorHandler, 51, 19)],
-    );
+''');
   }
 
   void test_functionExpression_firstParameterIsNullableObject() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 void f(Stream<void> stream) {
   stream.handleError((Object? a) {});
 }
@@ -403,29 +385,27 @@
   }
 
   void test_functionExpression_noParameters() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 void f(Stream<void> stream) {
   stream.handleError(() {});
+//                   ^^^^^
+// [diag.argumentTypeNotAssignableToErrorHandler] The argument type 'Null Function()' can't be assigned to the parameter type 'void Function(Object)' or 'void Function(Object, StackTrace)'.
 }
-''',
-      [error(diag.argumentTypeNotAssignableToErrorHandler, 51, 5)],
-    );
+''');
   }
 
   void test_functionExpression_secondParameterIsNamed() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 void f(Stream<void> stream) {
   stream.handleError((Object a, {StackTrace? b}) {});
+//                   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// [diag.argumentTypeNotAssignableToErrorHandler] The argument type 'Null Function(Object, {StackTrace? b})' can't be assigned to the parameter type 'void Function(Object)' or 'void Function(Object, StackTrace)'.
 }
-''',
-      [error(diag.argumentTypeNotAssignableToErrorHandler, 51, 30)],
-    );
+''');
   }
 
   void test_functionExpression_secondParameterIsNullableStackTrace() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 void f(Stream<void> stream) {
   stream.handleError((Object a, StackTrace? b) {});
 }
@@ -433,14 +413,13 @@
   }
 
   void test_functionExpression_wrongFirstParameterType() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 void f(Stream<void> stream) {
   stream.handleError((String a) {});
+//                   ^^^^^^^^^^^^^
+// [diag.argumentTypeNotAssignableToErrorHandler] The argument type 'Null Function(String)' can't be assigned to the parameter type 'void Function(Object)' or 'void Function(Object, StackTrace)'.
 }
-''',
-      [error(diag.argumentTypeNotAssignableToErrorHandler, 51, 13)],
-    );
+''');
   }
 }
 
@@ -448,7 +427,7 @@
 class ArgumentTypeNotAssignableToErrorHandler_StreamListenTest
     extends PubPackageResolutionTest {
   void test_firstParameterIsDynamic() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 void f(Stream<void> stream, void Function(dynamic a) callback) {
   stream.listen((_) {}, onError: callback);
 }
@@ -456,29 +435,27 @@
   }
 
   void test_firstParameterIsNamed() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 void f(Stream<void> stream, Future<int> Function({Object a}) callback) {
   stream.listen((_) {}, onError: callback);
+//                      ^^^^^^^^^^^^^^^^^
+// [diag.argumentTypeNotAssignableToErrorHandler] The argument type 'Future<int> Function({Object a})' can't be assigned to the parameter type 'void Function(Object)' or 'void Function(Object, StackTrace)'.
 }
-''',
-      [error(diag.argumentTypeNotAssignableToErrorHandler, 97, 17)],
-    );
+''');
   }
 
   void test_functionExpression_firstParameterIsNamed() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 void f(Stream<void> stream) {
   stream.listen((_) {}, onError: ({Object a = 1}) {});
+//                      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// [diag.argumentTypeNotAssignableToErrorHandler] The argument type 'Null Function({Object a})' can't be assigned to the parameter type 'void Function(Object)' or 'void Function(Object, StackTrace)'.
 }
-''',
-      [error(diag.argumentTypeNotAssignableToErrorHandler, 54, 28)],
-    );
+''');
   }
 
   void test_functionExpression_firstParameterIsNullableObject() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 void f(Stream<void> stream) {
   stream.listen((_) {}, onError: (Object? a) {});
 }
@@ -486,29 +463,27 @@
   }
 
   void test_functionExpression_noParameters() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 void f(Stream<void> stream) {
   stream.listen((_) {}, onError: () {});
+//                      ^^^^^^^^^^^^^^
+// [diag.argumentTypeNotAssignableToErrorHandler] The argument type 'Null Function()' can't be assigned to the parameter type 'void Function(Object)' or 'void Function(Object, StackTrace)'.
 }
-''',
-      [error(diag.argumentTypeNotAssignableToErrorHandler, 54, 14)],
-    );
+''');
   }
 
   void test_functionExpression_secondParameterIsNamed() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 void f(Stream<void> stream) {
   stream.listen((_) {}, onError: (Object a, {StackTrace? b}) {});
+//                      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// [diag.argumentTypeNotAssignableToErrorHandler] The argument type 'Null Function(Object, {StackTrace? b})' can't be assigned to the parameter type 'void Function(Object)' or 'void Function(Object, StackTrace)'.
 }
-''',
-      [error(diag.argumentTypeNotAssignableToErrorHandler, 54, 39)],
-    );
+''');
   }
 
   void test_functionExpression_secondParameterIsNullableStackTrace() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 void f(Stream<void> stream) {
   stream.listen((_) {}, onError: (Object a, StackTrace? b) {});
 }
@@ -516,14 +491,13 @@
   }
 
   void test_functionExpression_wrongFirstParameterType() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 void f(Stream<void> stream) {
   stream.listen((_) {}, onError: (String a) {});
+//                      ^^^^^^^^^^^^^^^^^^^^^^
+// [diag.argumentTypeNotAssignableToErrorHandler] The argument type 'Null Function(String)' can't be assigned to the parameter type 'void Function(Object)' or 'void Function(Object, StackTrace)'.
 }
-''',
-      [error(diag.argumentTypeNotAssignableToErrorHandler, 54, 22)],
-    );
+''');
   }
 }
 
@@ -531,7 +505,7 @@
 class ArgumentTypeNotAssignableToErrorHandler_StreamSubscriptionOnErrorTest
     extends PubPackageResolutionTest {
   void test_firstParameterIsDynamic() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'dart:async';
 void f(
     StreamSubscription<void> subscription, void Function(dynamic a) callback) {
@@ -541,33 +515,31 @@
   }
 
   void test_firstParameterIsNamed() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'dart:async';
 void f(
     StreamSubscription<void> subscription,
     Future<int> Function({Object a}) callback) {
   subscription.onError(callback);
+//                     ^^^^^^^^
+// [diag.argumentTypeNotAssignableToErrorHandler] The argument type 'Future<int> Function({Object a})' can't be assigned to the parameter type 'void Function(Object)' or 'void Function(Object, StackTrace)'.
 }
-''',
-      [error(diag.argumentTypeNotAssignableToErrorHandler, 144, 8)],
-    );
+''');
   }
 
   void test_functionExpression_firstParameterIsNamed() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'dart:async';
 void f(StreamSubscription<void> subscription) {
   subscription.onError(({Object a = 1}) {});
+//                     ^^^^^^^^^^^^^^^^^^^
+// [diag.argumentTypeNotAssignableToErrorHandler] The argument type 'Null Function({Object a})' can't be assigned to the parameter type 'void Function(Object)' or 'void Function(Object, StackTrace)'.
 }
-''',
-      [error(diag.argumentTypeNotAssignableToErrorHandler, 92, 19)],
-    );
+''');
   }
 
   void test_functionExpression_firstParameterIsNullableObject() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'dart:async';
 void f(StreamSubscription<void> subscription) {
   subscription.onError((Object? a) {});
@@ -576,31 +548,29 @@
   }
 
   void test_functionExpression_noParameters() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'dart:async';
 void f(StreamSubscription<void> subscription) {
   subscription.onError(() {});
+//                     ^^^^^
+// [diag.argumentTypeNotAssignableToErrorHandler] The argument type 'Null Function()' can't be assigned to the parameter type 'void Function(Object)' or 'void Function(Object, StackTrace)'.
 }
-''',
-      [error(diag.argumentTypeNotAssignableToErrorHandler, 92, 5)],
-    );
+''');
   }
 
   void test_functionExpression_secondParameterIsNamed() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'dart:async';
 void f(StreamSubscription<void> subscription) {
   subscription.onError((Object a, {StackTrace? b}) {});
+//                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// [diag.argumentTypeNotAssignableToErrorHandler] The argument type 'Null Function(Object, {StackTrace? b})' can't be assigned to the parameter type 'void Function(Object)' or 'void Function(Object, StackTrace)'.
 }
-''',
-      [error(diag.argumentTypeNotAssignableToErrorHandler, 92, 30)],
-    );
+''');
   }
 
   void test_functionExpression_secondParameterIsNullableStackTrace() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'dart:async';
 void f(StreamSubscription<void> subscription) {
   subscription.onError((Object a, StackTrace? b) {});
@@ -609,14 +579,13 @@
   }
 
   void test_functionExpression_wrongFirstParameterType() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'dart:async';
 void f(StreamSubscription<void> subscription) {
   subscription.onError((String a) {});
+//                     ^^^^^^^^^^^^^
+// [diag.argumentTypeNotAssignableToErrorHandler] The argument type 'Null Function(String)' can't be assigned to the parameter type 'void Function(Object)' or 'void Function(Object, StackTrace)'.
 }
-''',
-      [error(diag.argumentTypeNotAssignableToErrorHandler, 92, 13)],
-    );
+''');
   }
 }
diff --git a/pkg/analyzer/test/src/diagnostics/assert_in_redirecting_constructor_test.dart b/pkg/analyzer/test/src/diagnostics/assert_in_redirecting_constructor_test.dart
index 77ab9b0..03c39e2 100644
--- a/pkg/analyzer/test/src/diagnostics/assert_in_redirecting_constructor_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/assert_in_redirecting_constructor_test.dart
@@ -2,57 +2,55 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/src/diagnostic/diagnostic.dart' as diag;
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../dart/resolution/context_collection_resolution.dart';
+import '../dart/resolution/node_text_expectations.dart';
 
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(AssertInRedirectingConstructorTest);
+    defineReflectiveTests(UpdateNodeTextExpectations);
   });
 }
 
 @reflectiveTest
 class AssertInRedirectingConstructorTest extends PubPackageResolutionTest {
   test_class_primary_assertBeforeRedirection() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A(int x) {
   A.named() : this(0);
   this : assert(x > 0), this.named();
+//                      ^^^^
+// [diag.primaryConstructorCannotRedirect] A primary constructor can't be a redirecting constructor.
 }
-''',
-      [error(diag.primaryConstructorCannotRedirect, 64, 4)],
-    );
+''');
   }
 
   test_class_primary_redirectionBeforeAssert() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A(int x) {
   A.named() : this(0);
   this : this.named(), assert(x > 0);
+//       ^^^^
+// [diag.primaryConstructorCannotRedirect] A primary constructor can't be a redirecting constructor.
 }
-''',
-      [error(diag.primaryConstructorCannotRedirect, 49, 4)],
-    );
+''');
   }
 
   test_class_typeName_assertBeforeRedirection() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   A(int x) : assert(x > 0), this.name();
+//           ^^^^^^^^^^^^^
+// [diag.assertInRedirectingConstructor] A redirecting constructor can't have an 'assert' initializer.
   A.name() {}
 }
-''',
-      [error(diag.assertInRedirectingConstructor, 23, 13)],
-    );
+''');
   }
 
   test_class_typeName_justAssert() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   A(int x) : assert(x > 0);
   A.name() {}
@@ -61,7 +59,7 @@
   }
 
   test_class_typeName_justRedirection() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   A(int x) : this.name();
   A.name() {}
@@ -70,77 +68,70 @@
   }
 
   test_class_typeName_redirectionBeforeAssert() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   A(int x) : this.name(), assert(x > 0);
+//                        ^^^^^^^^^^^^^
+// [diag.assertInRedirectingConstructor] A redirecting constructor can't have an 'assert' initializer.
   A.name() {}
 }
-''',
-      [error(diag.assertInRedirectingConstructor, 36, 13)],
-    );
+''');
   }
 
   test_enum_primary_assertBeforeRedirection() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 enum E(int x) {
   v(0);
   const E.named() : this(0);
+//      ^^^^^^^
+// [diag.recursiveConstantConstructor] The constant constructor depends on itself.
   this : assert(x > -1), this.named();
+//                       ^^^^
+// [diag.primaryConstructorCannotRedirect] A primary constructor can't be a redirecting constructor.
 }
-''',
-      [
-        error(diag.recursiveConstantConstructor, 32, 7),
-        error(diag.primaryConstructorCannotRedirect, 78, 4),
-      ],
-    );
+''');
   }
 
   test_enum_primary_redirectionBeforeAssert() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 enum E(int x) {
   v(0);
   const E.named() : this(0);
+//      ^^^^^^^
+// [diag.recursiveConstantConstructor] The constant constructor depends on itself.
   this : this.named(), assert(x > -1);
+//       ^^^^
+// [diag.primaryConstructorCannotRedirect] A primary constructor can't be a redirecting constructor.
 }
-''',
-      [
-        error(diag.recursiveConstantConstructor, 32, 7),
-        error(diag.primaryConstructorCannotRedirect, 62, 4),
-      ],
-    );
+''');
   }
 
   test_enum_redirectionBeforeAssert() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 enum E {
   v(42);
   const E(int x) : this.name(), assert(x > 0);
+//                              ^^^^^^^^^^^^^
+// [diag.assertInRedirectingConstructor] A redirecting constructor can't have an 'assert' initializer.
   const E.name();
 }
-''',
-      [error(diag.assertInRedirectingConstructor, 50, 13)],
-    );
+''');
   }
 
   test_enum_typeName_assertBeforeRedirection() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 enum E {
   v(42);
   const E(int x) : assert(x > 0), this.name();
+//                 ^^^^^^^^^^^^^
+// [diag.assertInRedirectingConstructor] A redirecting constructor can't have an 'assert' initializer.
   const E.name();
 }
-''',
-      [error(diag.assertInRedirectingConstructor, 37, 13)],
-    );
+''');
   }
 
   test_enum_typeName_justAssert() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 enum E {
   v(42);
   const E(int x) : assert(x > 0);
@@ -149,7 +140,7 @@
   }
 
   test_enum_typeName_justRedirection() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 enum E {
   v(0);
   const E(int x) : this.name();
diff --git a/pkg/analyzer/test/src/diagnostics/assignment_of_do_not_store_test.dart b/pkg/analyzer/test/src/diagnostics/assignment_of_do_not_store_test.dart
index 5f5c3f2..ef8fdc4 100644
--- a/pkg/analyzer/test/src/diagnostics/assignment_of_do_not_store_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/assignment_of_do_not_store_test.dart
@@ -6,11 +6,13 @@
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../dart/resolution/context_collection_resolution.dart';
+import '../dart/resolution/node_text_expectations.dart';
 
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(AssignmentOfDoNotStoreTest);
     defineReflectiveTests(AssignmentOfDoNotStoreInTestsTest);
+    defineReflectiveTests(UpdateNodeTextExpectations);
   });
 }
 
@@ -26,7 +28,7 @@
     // Code that is in a test dir (the default for PubPackageResolutionTests)
     // should not trigger the hint.
     // (See:https://github.com/dart-lang/sdk/issues/45594)
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'package:meta/meta.dart';
 
 class A {
@@ -54,7 +56,7 @@
   }
 
   test_cascadeExpression_assignment() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'package:meta/meta.dart';
 
 final f = A()..f = v;
@@ -69,8 +71,7 @@
   }
 
   test_class_containingInstanceGetter() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'package:meta/meta.dart';
 @doNotStore
 class A {
@@ -78,14 +79,13 @@
 }
 
 String f = A().v;
-''',
-      [error(diag.assignmentOfDoNotStore, 91, 5)],
-    );
+//         ^^^^^
+// [diag.assignmentOfDoNotStore] 'v' is marked 'doNotStore' and shouldn't be assigned to a field or top-level variable.
+''');
   }
 
   test_class_containingInstanceMethod() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'package:meta/meta.dart';
 @doNotStore
 class A {
@@ -93,14 +93,13 @@
 }
 
 String f = A().v();
-''',
-      [error(diag.assignmentOfDoNotStore, 89, 7)],
-    );
+//         ^^^^^^^
+// [diag.assignmentOfDoNotStore] 'v' is marked 'doNotStore' and shouldn't be assigned to a field or top-level variable.
+''');
   }
 
   test_class_containingStaticGetter() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'package:meta/meta.dart';
 @doNotStore
 class A {
@@ -108,14 +107,13 @@
 }
 
 String f = A.v;
-''',
-      [error(diag.assignmentOfDoNotStore, 98, 3)],
-    );
+//         ^^^
+// [diag.assignmentOfDoNotStore] 'v' is marked 'doNotStore' and shouldn't be assigned to a field or top-level variable.
+''');
   }
 
   test_class_containingStaticMethod() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'package:meta/meta.dart';
 @doNotStore
 class A {
@@ -123,14 +121,13 @@
 }
 
 String f = A.v();
-''',
-      [error(diag.assignmentOfDoNotStore, 96, 5)],
-    );
+//         ^^^^^
+// [diag.assignmentOfDoNotStore] 'v' is marked 'doNotStore' and shouldn't be assigned to a field or top-level variable.
+''');
   }
 
   test_classMemberGetter() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'package:meta/meta.dart';
 
 class A {
@@ -140,17 +137,14 @@
 
 class B {
   String f = A().v;
+//           ^^^^^
+// [diag.assignmentOfDoNotStore] 'v' is marked 'doNotStore' and shouldn't be assigned to a field or top-level variable.
 }
-''',
-      [
-        error(diag.assignmentOfDoNotStore, 106, 5, messageContains: ["'v'"]),
-      ],
-    );
+''');
   }
 
   test_classStaticGetter() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'package:meta/meta.dart';
 
 class A {
@@ -160,14 +154,14 @@
 
 class B {
   String f = A.v;
+//           ^^^
+// [diag.assignmentOfDoNotStore] 'v' is marked 'doNotStore' and shouldn't be assigned to a field or top-level variable.
 }
-''',
-      [error(diag.assignmentOfDoNotStore, 113, 3)],
-    );
+''');
   }
 
   test_functionAssignment() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'package:meta/meta.dart';
 
 @doNotStore
@@ -180,8 +174,7 @@
   }
 
   test_functionReturnValue() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'package:meta/meta.dart';
 
 @doNotStore
@@ -189,14 +182,14 @@
 
 class A {
   final f = getV();
+//          ^^^^^^
+// [diag.assignmentOfDoNotStore] 'getV' is marked 'doNotStore' and shouldn't be assigned to a field or top-level variable.
 }
-''',
-      [error(diag.assignmentOfDoNotStore, 90, 6)],
-    );
+''');
   }
 
   test_localVariable_assignment() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'package:meta/meta.dart';
 
 @doNotStore
@@ -211,7 +204,7 @@
   }
 
   test_localVariable_declaration() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'package:meta/meta.dart';
 
 @doNotStore
@@ -225,8 +218,7 @@
   }
 
   test_methodReturnValue() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'package:meta/meta.dart';
 
 class A {
@@ -236,15 +228,14 @@
 
 class B {
   final f = A().getV();
+//          ^^^^^^^^^^
+// [diag.assignmentOfDoNotStore] 'getV' is marked 'doNotStore' and shouldn't be assigned to a field or top-level variable.
 }
-''',
-      [error(diag.assignmentOfDoNotStore, 106, 10)],
-    );
+''');
   }
 
   test_mixin_containingInstanceMethod() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'package:meta/meta.dart';
 @doNotStore
 mixin M {
@@ -254,14 +245,14 @@
 abstract class A {
   M get m;
   late String f = m.v();
+//                ^^^^^
+// [diag.assignmentOfDoNotStore] 'v' is marked 'doNotStore' and shouldn't be assigned to a field or top-level variable.
 }
-''',
-      [error(diag.assignmentOfDoNotStore, 126, 5)],
-    );
+''');
   }
 
   test_tearOff() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'package:meta/meta.dart';
 
 @doNotStore
@@ -274,8 +265,7 @@
   }
 
   test_topLevelGetter() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'package:meta/meta.dart';
 
 @doNotStore
@@ -283,15 +273,14 @@
 
 class A {
   final f = v;
+//          ^
+// [diag.assignmentOfDoNotStore] 'v' is marked 'doNotStore' and shouldn't be assigned to a field or top-level variable.
 }
-''',
-      [error(diag.assignmentOfDoNotStore, 89, 1)],
-    );
+''');
   }
 
   test_topLevelGetter_binaryExpression() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'package:meta/meta.dart';
 
 @doNotStore
@@ -299,13 +288,12 @@
 
 class A {
   final f = v ?? v;
+//          ^
+// [diag.assignmentOfDoNotStore] 'v' is marked 'doNotStore' and shouldn't be assigned to a field or top-level variable.
+//               ^
+// [diag.assignmentOfDoNotStore] 'v' is marked 'doNotStore' and shouldn't be assigned to a field or top-level variable.
 }
-''',
-      [
-        error(diag.assignmentOfDoNotStore, 90, 1),
-        error(diag.assignmentOfDoNotStore, 95, 1),
-      ],
-    );
+''');
   }
 
   @FailingTest(reason: 'Not yet implemented')
@@ -324,75 +312,65 @@
   }
 
   test_topLevelVariable_assignment_field() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'package:meta/meta.dart';
 
 String top = A().f;
+//           ^^^^^
+// [diag.assignmentOfDoNotStore] 'f' is marked 'doNotStore' and shouldn't be assigned to a field or top-level variable.
 
 class A{
   @doNotStore
   String get f => '';
 }
-''',
-      [
-        error(diag.assignmentOfDoNotStore, 47, 5, messageContains: ["'f'"]),
-      ],
-    );
+''');
   }
 
   test_topLevelVariable_assignment_functionExpression() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'package:meta/meta.dart';
 
 @doNotStore
 String get _v => '';
 
 var c = () => _v;
+//            ^^
+// [diag.assignmentOfDoNotStore] '_v' is marked 'doNotStore' and shouldn't be assigned to a field or top-level variable.
 
 String v = c();
-''',
-      [error(diag.assignmentOfDoNotStore, 82, 2)],
-    );
+''');
   }
 
   test_topLevelVariable_assignment_getter() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'package:meta/meta.dart';
 
 String top = v;
+//           ^
+// [diag.assignmentOfDoNotStore] 'v' is marked 'doNotStore' and shouldn't be assigned to a field or top-level variable.
 
 @doNotStore
 String get v => '';
-''',
-      [
-        error(diag.assignmentOfDoNotStore, 47, 1, messageContains: ["'v'"]),
-      ],
-    );
+''');
   }
 
   test_topLevelVariable_assignment_method() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'package:meta/meta.dart';
 
 String top = A().v();
+//           ^^^^^^^
+// [diag.assignmentOfDoNotStore] 'v' is marked 'doNotStore' and shouldn't be assigned to a field or top-level variable.
 
 class A{
   @doNotStore
   String v() => '';
 }
-''',
-      [
-        error(diag.assignmentOfDoNotStore, 47, 7, messageContains: ["'v'"]),
-      ],
-    );
+''');
   }
 
   test_topLevelVariable_cascadeExpression_propertyAccess() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'package:meta/meta.dart';
 
 final f = A()..v;
@@ -420,22 +398,20 @@
   }
 
   test_topLevelVariable_conditionalExpression() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'package:meta/meta.dart';
 
 class A {
   final f = 1 == 2 ? v : v;
+//                   ^
+// [diag.assignmentOfDoNotStore] 'v' is marked 'doNotStore' and shouldn't be assigned to a field or top-level variable.
+//                       ^
+// [diag.assignmentOfDoNotStore] 'v' is marked 'doNotStore' and shouldn't be assigned to a field or top-level variable.
 }
 
 @doNotStore
 String get v => '';
-''',
-      [
-        error(diag.assignmentOfDoNotStore, 65, 1),
-        error(diag.assignmentOfDoNotStore, 69, 1),
-      ],
-    );
+''');
   }
 
   @FailingTest(reason: 'Not yet implemented')
@@ -456,7 +432,7 @@
   }
 
   test_topLevelVariable_forElement() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'package:meta/meta.dart';
 
 final f = [for (var _ in [1]) v];
@@ -467,7 +443,7 @@
   }
 
   test_topLevelVariable_ifElement() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'package:meta/meta.dart';
 
 final f = [if (true) v];
@@ -478,7 +454,7 @@
   }
 
   test_topLevelVariable_instanceCreationExpression() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'package:meta/meta.dart';
 
 class A {
@@ -493,7 +469,7 @@
   }
 
   test_topLevelVariable_isExpression() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'package:meta/meta.dart';
 
 final f = v is int;
@@ -513,20 +489,19 @@
 final v = '';
 ''');
 
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'library.dart';
 
 class A {
   final f = v;
+//          ^
+// [diag.assignmentOfDoNotStore] 'v' is marked 'doNotStore' and shouldn't be assigned to a field or top-level variable.
 }
-''',
-      [error(diag.assignmentOfDoNotStore, 46, 1)],
-    );
+''');
   }
 
   test_topLevelVariable_listLiteral() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'package:meta/meta.dart';
 
 final f = [v];
@@ -537,7 +512,7 @@
   }
 
   test_topLevelVariable_mapLiteral_key() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'package:meta/meta.dart';
 
 final f = {v: 1};
@@ -548,7 +523,7 @@
   }
 
   test_topLevelVariable_mapLiteral_value() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'package:meta/meta.dart';
 
 final f = {1: v};
@@ -559,7 +534,7 @@
   }
 
   test_topLevelVariable_nonAssignment_argToFunctionCall() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'package:meta/meta.dart';
 
 var top = print(v);
@@ -585,7 +560,7 @@
   }
 
   test_topLevelVariable_nullAwareElement() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'package:meta/meta.dart';
 
 final f = [?v];
@@ -596,7 +571,7 @@
   }
 
   test_topLevelVariable_prefixExpression() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'package:meta/meta.dart';
 
 final f = -v;
@@ -607,7 +582,7 @@
   }
 
   test_topLevelVariable_recordLiteral_namedField() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'package:meta/meta.dart';
 
 final f = (a: v, );
@@ -618,7 +593,7 @@
   }
 
   test_topLevelVariable_recordLiteral_positionalField() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'package:meta/meta.dart';
 
 final f = (v, );
@@ -629,7 +604,7 @@
   }
 
   test_topLevelVariable_setLiteral() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'package:meta/meta.dart';
 
 final f = {v};
@@ -640,7 +615,7 @@
   }
 
   test_topLevelVariable_spreadElement() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'package:meta/meta.dart';
 
 final f = [...v];
@@ -669,7 +644,7 @@
   }
 
   test_topLevelVariable_switchExpression_condition() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'package:meta/meta.dart';
 
 final f = switch (v) {
@@ -683,7 +658,7 @@
   }
 
   test_topLevelVariable_throwExpression() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'package:meta/meta.dart';
 
 final f = throw v;
diff --git a/pkg/analyzer/test/src/diagnostics/assignment_to_const_test.dart b/pkg/analyzer/test/src/diagnostics/assignment_to_const_test.dart
index 8530108..035a3df 100644
--- a/pkg/analyzer/test/src/diagnostics/assignment_to_const_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/assignment_to_const_test.dart
@@ -2,83 +2,77 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/src/diagnostic/diagnostic.dart' as diag;
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../dart/resolution/context_collection_resolution.dart';
+import '../dart/resolution/node_text_expectations.dart';
 
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(AssignmentToConstTest);
+    defineReflectiveTests(UpdateNodeTextExpectations);
   });
 }
 
 @reflectiveTest
 class AssignmentToConstTest extends PubPackageResolutionTest {
   test_instanceVariable() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   static const v = 0;
 }
 f() {
   A.v = 1;
-}''',
-      [error(diag.assignmentToConst, 44, 1)],
-    );
+//  ^
+// [diag.assignmentToConst] Constant variables can't be assigned a value after initialization.
+}''');
   }
 
   test_instanceVariable_plusEq() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   static const v = 0;
 }
 f() {
   A.v += 1;
-}''',
-      [error(diag.assignmentToConst, 44, 1)],
-    );
+//  ^
+// [diag.assignmentToConst] Constant variables can't be assigned a value after initialization.
+}''');
   }
 
   test_localVariable() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 f() {
   const x = 0;
+//      ^
+// [diag.unusedLocalVariable] The value of the local variable 'x' isn't used.
   x = 1;
-}''',
-      [
-        error(diag.unusedLocalVariable, 14, 1),
-        error(diag.assignmentToConst, 23, 1),
-      ],
-    );
+//^
+// [diag.assignmentToConst] Constant variables can't be assigned a value after initialization.
+}''');
   }
 
   test_localVariable_inForEach() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 f() {
   const x = 0;
   for (x in <int>[1, 2]) {
+//     ^
+// [diag.assignmentToConst] Constant variables can't be assigned a value after initialization.
     print(x);
   }
-}''',
-      [error(diag.assignmentToConst, 28, 1)],
-    );
+}''');
   }
 
   test_localVariable_plusEq() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 f() {
   const x = 0;
+//      ^
+// [diag.unusedLocalVariable] The value of the local variable 'x' isn't used.
   x += 1;
-}''',
-      [
-        error(diag.unusedLocalVariable, 14, 1),
-        error(diag.assignmentToConst, 23, 1),
-      ],
-    );
+//^
+// [diag.assignmentToConst] Constant variables can't be assigned a value after initialization.
+}''');
   }
 }
diff --git a/pkg/analyzer/test/src/diagnostics/assignment_to_final_local_test.dart b/pkg/analyzer/test/src/diagnostics/assignment_to_final_local_test.dart
index 6995c79..fe0ff0f 100644
--- a/pkg/analyzer/test/src/diagnostics/assignment_to_final_local_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/assignment_to_final_local_test.dart
@@ -2,83 +2,77 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/src/diagnostic/diagnostic.dart' as diag;
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../dart/resolution/context_collection_resolution.dart';
+import '../dart/resolution/node_text_expectations.dart';
 
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(AssignmentToFinalLocalTest);
+    defineReflectiveTests(UpdateNodeTextExpectations);
   });
 }
 
 @reflectiveTest
 class AssignmentToFinalLocalTest extends PubPackageResolutionTest {
   test_localVariable() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 f() {
   final x = 0;
+//      ^
+// [diag.unusedLocalVariable] The value of the local variable 'x' isn't used.
   x = 1;
-}''',
-      [
-        error(diag.unusedLocalVariable, 14, 1),
-        error(diag.assignmentToFinalLocal, 23, 1),
-      ],
-    );
+//^
+// [diag.assignmentToFinalLocal] The final variable 'x' can only be set once.
+}''');
   }
 
   test_localVariable_forEach() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 f() {
   final i;
   for (i in [1, 2, 3]) {
+//     ^
+// [diag.assignmentToFinalLocal] The final variable 'i' can only be set once.
     print(i);
   }
 }
-''',
-      [error(diag.assignmentToFinalLocal, 24, 1)],
-    );
+''');
   }
 
   test_localVariable_inForEach() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 f() {
   final x = 0;
   for (x in <int>[1, 2]) {
+//     ^
+// [diag.assignmentToFinalLocal] The final variable 'x' can only be set once.
     print(x);
   }
-}''',
-      [error(diag.assignmentToFinalLocal, 28, 1)],
-    );
+}''');
   }
 
   test_localVariable_plusEq() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 f() {
   final x = 0;
+//      ^
+// [diag.unusedLocalVariable] The value of the local variable 'x' isn't used.
   x += 1;
-}''',
-      [
-        error(diag.unusedLocalVariable, 14, 1),
-        error(diag.assignmentToFinalLocal, 23, 1),
-      ],
-    );
+//^
+// [diag.assignmentToFinalLocal] The final variable 'x' can only be set once.
+}''');
   }
 
   test_parameter() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 // @dart = 3.10
 f(final x) {
   x = 1;
-}''',
-      [error(diag.assignmentToFinalLocal, 31, 1)],
-    );
+//^
+// [diag.assignmentToFinalLocal] The final variable 'x' can only be set once.
+}''');
   }
 
   /// See `10.6.1 Generative Constructors`.
@@ -92,129 +86,114 @@
   /// Note that it says 'final local variable', regardless whether the instance
   /// variable is final.
   test_parameter_fieldFormal() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   int x;
   final Object y;
   A(this.x) : y = (() {
     x = 0;
+//  ^
+// [diag.assignmentToFinalLocal] The final variable 'x' can only be set once.
   });
 }
-''',
-      [error(diag.assignmentToFinalLocal, 65, 1)],
-    );
+''');
   }
 
   test_parameter_superFormal() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   A(int a);
 }
 class B extends A {
   var x;
   B(super.a) : x = (() { a = 0; });
+//                       ^
+// [diag.assignmentToFinalLocal] The final variable 'a' can only be set once.
 }
-''',
-      [error(diag.assignmentToFinalLocal, 78, 1)],
-    );
+''');
   }
 
   test_patternVariable_final() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 void f() {
   final (a) = 0;
   a = 1;
+//^
+// [diag.assignmentToFinalLocal] The final variable 'a' can only be set once.
   a;
 }
-''',
-      [error(diag.assignmentToFinalLocal, 30, 1)],
-    );
+''');
   }
 
   test_postfixMinusMinus() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 f() {
   final x = 0;
+//      ^
+// [diag.unusedLocalVariable] The value of the local variable 'x' isn't used.
   x--;
-}''',
-      [
-        error(diag.unusedLocalVariable, 14, 1),
-        error(diag.assignmentToFinalLocal, 23, 1),
-      ],
-    );
+//^
+// [diag.assignmentToFinalLocal] The final variable 'x' can only be set once.
+}''');
   }
 
   test_postfixPlusPlus() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 f() {
   final x = 0;
+//      ^
+// [diag.unusedLocalVariable] The value of the local variable 'x' isn't used.
   x++;
-}''',
-      [
-        error(diag.unusedLocalVariable, 14, 1),
-        error(diag.assignmentToFinalLocal, 23, 1),
-      ],
-    );
+//^
+// [diag.assignmentToFinalLocal] The final variable 'x' can only be set once.
+}''');
   }
 
   test_prefixMinusMinus() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 f() {
   final x = 0;
+//      ^
+// [diag.unusedLocalVariable] The value of the local variable 'x' isn't used.
   --x;
-}''',
-      [
-        error(diag.unusedLocalVariable, 14, 1),
-        error(diag.assignmentToFinalLocal, 25, 1),
-      ],
-    );
+//  ^
+// [diag.assignmentToFinalLocal] The final variable 'x' can only be set once.
+}''');
   }
 
   test_prefixPlusPlus() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 f() {
   final x = 0;
+//      ^
+// [diag.unusedLocalVariable] The value of the local variable 'x' isn't used.
   ++x;
-}''',
-      [
-        error(diag.unusedLocalVariable, 14, 1),
-        error(diag.assignmentToFinalLocal, 25, 1),
-      ],
-    );
+//  ^
+// [diag.assignmentToFinalLocal] The final variable 'x' can only be set once.
+}''');
   }
 
   test_suffixMinusMinus() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 f() {
   final x = 0;
+//      ^
+// [diag.unusedLocalVariable] The value of the local variable 'x' isn't used.
   x--;
-}''',
-      [
-        error(diag.unusedLocalVariable, 14, 1),
-        error(diag.assignmentToFinalLocal, 23, 1),
-      ],
-    );
+//^
+// [diag.assignmentToFinalLocal] The final variable 'x' can only be set once.
+}''');
   }
 
   test_suffixPlusPlus() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 f() {
   final x = 0;
+//      ^
+// [diag.unusedLocalVariable] The value of the local variable 'x' isn't used.
   x++;
-}''',
-      [
-        error(diag.unusedLocalVariable, 14, 1),
-        error(diag.assignmentToFinalLocal, 23, 1),
-      ],
-    );
+//^
+// [diag.assignmentToFinalLocal] The final variable 'x' can only be set once.
+}''');
   }
 }
diff --git a/pkg/analyzer/test/src/diagnostics/assignment_to_final_no_setter_test.dart b/pkg/analyzer/test/src/diagnostics/assignment_to_final_no_setter_test.dart
index e2ea5f6..9f6b129 100644
--- a/pkg/analyzer/test/src/diagnostics/assignment_to_final_no_setter_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/assignment_to_final_no_setter_test.dart
@@ -2,131 +2,132 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/src/diagnostic/diagnostic.dart' as diag;
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../dart/resolution/context_collection_resolution.dart';
+import '../dart/resolution/node_text_expectations.dart';
 
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(AssignmentToFinalNoSetterTest);
+    defineReflectiveTests(UpdateNodeTextExpectations);
   });
 }
 
 @reflectiveTest
 class AssignmentToFinalNoSetterTest extends PubPackageResolutionTest {
   test_prefixedIdentifier_class_instanceGetter() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   int get x => 0;
 }
 
 void f(A a) {
   a.x = 0;
+//  ^
+// [diag.assignmentToFinalNoSetter] There isn't a setter named 'x' in class 'A'.
   a.x += 0;
+//  ^
+// [diag.assignmentToFinalNoSetter] There isn't a setter named 'x' in class 'A'.
   ++a.x;
+//    ^
+// [diag.assignmentToFinalNoSetter] There isn't a setter named 'x' in class 'A'.
   a.x++;
+//  ^
+// [diag.assignmentToFinalNoSetter] There isn't a setter named 'x' in class 'A'.
 }
-''',
-      [
-        error(diag.assignmentToFinalNoSetter, 49, 1),
-        error(diag.assignmentToFinalNoSetter, 60, 1),
-        error(diag.assignmentToFinalNoSetter, 74, 1),
-        error(diag.assignmentToFinalNoSetter, 81, 1),
-      ],
-    );
+''');
   }
 
   test_propertyAccess_class_instanceGetter() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   int get x => 0;
 }
 
 void f(A a) {
   (a).x = 0;
+//    ^
+// [diag.assignmentToFinalNoSetter] There isn't a setter named 'x' in class 'A'.
   (a).x += 0;
+//    ^
+// [diag.assignmentToFinalNoSetter] There isn't a setter named 'x' in class 'A'.
   ++(a).x;
+//      ^
+// [diag.assignmentToFinalNoSetter] There isn't a setter named 'x' in class 'A'.
   (a).x++;
+//    ^
+// [diag.assignmentToFinalNoSetter] There isn't a setter named 'x' in class 'A'.
 }
-''',
-      [
-        error(diag.assignmentToFinalNoSetter, 51, 1),
-        error(diag.assignmentToFinalNoSetter, 64, 1),
-        error(diag.assignmentToFinalNoSetter, 80, 1),
-        error(diag.assignmentToFinalNoSetter, 89, 1),
-      ],
-    );
+''');
   }
 
   test_propertyAccess_extension_instanceGetter() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 extension E on int {
   int get x => 0;
 }
 
 void f() {
   0.x = 0;
+//  ^
+// [diag.assignmentToFinalNoSetter] There isn't a setter named 'x' in class 'E'.
   0.x += 0;
+//  ^
+// [diag.assignmentToFinalNoSetter] There isn't a setter named 'x' in class 'E'.
   ++0.x;
+//    ^
+// [diag.assignmentToFinalNoSetter] There isn't a setter named 'x' in class 'E'.
   0.x++;
+//  ^
+// [diag.assignmentToFinalNoSetter] There isn't a setter named 'x' in class 'E'.
 }
-''',
-      [
-        error(diag.assignmentToFinalNoSetter, 57, 1),
-        error(diag.assignmentToFinalNoSetter, 68, 1),
-        error(diag.assignmentToFinalNoSetter, 82, 1),
-        error(diag.assignmentToFinalNoSetter, 89, 1),
-      ],
-    );
+''');
   }
 
   test_simpleIdentifier_class_instanceGetter() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   int get x => 0;
 
   void f() {
     x = 0;
+//  ^
+// [diag.assignmentToFinalNoSetter] There isn't a setter named 'x' in class 'A'.
     x += 0;
+//  ^
+// [diag.assignmentToFinalNoSetter] There isn't a setter named 'x' in class 'A'.
     ++x;
+//    ^
+// [diag.assignmentToFinalNoSetter] There isn't a setter named 'x' in class 'A'.
     x++;
+//  ^
+// [diag.assignmentToFinalNoSetter] There isn't a setter named 'x' in class 'A'.
   }
 }
-''',
-      [
-        error(diag.assignmentToFinalNoSetter, 46, 1),
-        error(diag.assignmentToFinalNoSetter, 57, 1),
-        error(diag.assignmentToFinalNoSetter, 71, 1),
-        error(diag.assignmentToFinalNoSetter, 78, 1),
-      ],
-    );
+''');
   }
 
   test_simpleIdentifier_class_staticGetter() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   static int get x => 0;
 
   void f() {
     x = 0;
+//  ^
+// [diag.assignmentToFinalNoSetter] There isn't a setter named 'x' in class 'A'.
     x += 0;
+//  ^
+// [diag.assignmentToFinalNoSetter] There isn't a setter named 'x' in class 'A'.
     ++x;
+//    ^
+// [diag.assignmentToFinalNoSetter] There isn't a setter named 'x' in class 'A'.
     x++;
+//  ^
+// [diag.assignmentToFinalNoSetter] There isn't a setter named 'x' in class 'A'.
   }
 }
-''',
-      [
-        error(diag.assignmentToFinalNoSetter, 53, 1),
-        error(diag.assignmentToFinalNoSetter, 64, 1),
-        error(diag.assignmentToFinalNoSetter, 78, 1),
-        error(diag.assignmentToFinalNoSetter, 85, 1),
-      ],
-    );
+''');
   }
 }
diff --git a/pkg/analyzer/test/src/diagnostics/assignment_to_final_test.dart b/pkg/analyzer/test/src/diagnostics/assignment_to_final_test.dart
index 5437997..1cb0c84 100644
--- a/pkg/analyzer/test/src/diagnostics/assignment_to_final_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/assignment_to_final_test.dart
@@ -2,21 +2,22 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/src/diagnostic/diagnostic.dart' as diag;
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../dart/resolution/context_collection_resolution.dart';
+import '../dart/resolution/node_text_expectations.dart';
 
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(AssignmentToFinalTest);
+    defineReflectiveTests(UpdateNodeTextExpectations);
   });
 }
 
 @reflectiveTest
 class AssignmentToFinalTest extends PubPackageResolutionTest {
   test_prefixedIdentifier_instanceField() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   var x = 0;
 }
@@ -31,7 +32,7 @@
   }
 
   test_prefixedIdentifier_instanceField_abstract() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 abstract class A {
   abstract int x;
 }
@@ -46,30 +47,30 @@
   }
 
   test_prefixedIdentifier_instanceField_abstractFinal() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 abstract class A {
   abstract final int x;
 }
 
 void f(A a) {
   a.x = 0;
+//  ^
+// [diag.assignmentToFinal] 'x' can't be used as a setter because it's final.
   a.x += 0;
+//  ^
+// [diag.assignmentToFinal] 'x' can't be used as a setter because it's final.
   ++a.x;
+//    ^
+// [diag.assignmentToFinal] 'x' can't be used as a setter because it's final.
   a.x++;
+//  ^
+// [diag.assignmentToFinal] 'x' can't be used as a setter because it's final.
 }
-''',
-      [
-        error(diag.assignmentToFinal, 64, 1),
-        error(diag.assignmentToFinal, 75, 1),
-        error(diag.assignmentToFinal, 89, 1),
-        error(diag.assignmentToFinal, 96, 1),
-      ],
-    );
+''');
   }
 
   test_prefixedIdentifier_instanceField_external() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 abstract class A {
   external int x;
 }
@@ -84,53 +85,53 @@
   }
 
   test_prefixedIdentifier_instanceField_externalFinal() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 abstract class A {
   external final int x;
 }
 
 void f(A a) {
   a.x = 0;
+//  ^
+// [diag.assignmentToFinal] 'x' can't be used as a setter because it's final.
   a.x += 0;
+//  ^
+// [diag.assignmentToFinal] 'x' can't be used as a setter because it's final.
   ++a.x;
+//    ^
+// [diag.assignmentToFinal] 'x' can't be used as a setter because it's final.
   a.x++;
+//  ^
+// [diag.assignmentToFinal] 'x' can't be used as a setter because it's final.
 }
-''',
-      [
-        error(diag.assignmentToFinal, 64, 1),
-        error(diag.assignmentToFinal, 75, 1),
-        error(diag.assignmentToFinal, 89, 1),
-        error(diag.assignmentToFinal, 96, 1),
-      ],
-    );
+''');
   }
 
   test_prefixedIdentifier_instanceField_final() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   final x = 0;
 }
 
 void f(A a) {
   a.x = 0;
+//  ^
+// [diag.assignmentToFinal] 'x' can't be used as a setter because it's final.
   a.x += 0;
+//  ^
+// [diag.assignmentToFinal] 'x' can't be used as a setter because it's final.
   ++a.x;
+//    ^
+// [diag.assignmentToFinal] 'x' can't be used as a setter because it's final.
   a.x++;
+//  ^
+// [diag.assignmentToFinal] 'x' can't be used as a setter because it's final.
 }
-''',
-      [
-        error(diag.assignmentToFinal, 46, 1),
-        error(diag.assignmentToFinal, 57, 1),
-        error(diag.assignmentToFinal, 71, 1),
-        error(diag.assignmentToFinal, 78, 1),
-      ],
-    );
+''');
   }
 
   test_prefixedIdentifier_instanceField_lateFinal() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 abstract class A {
   late final int x;
 }
@@ -145,53 +146,53 @@
   }
 
   test_prefixedIdentifier_instanceField_lateFinal_hasInitializer() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 abstract class A {
   late final int x = 0;
 }
 
 void f(A a) {
   a.x = 0;
+//  ^
+// [diag.assignmentToFinal] 'x' can't be used as a setter because it's final.
   a.x += 0;
+//  ^
+// [diag.assignmentToFinal] 'x' can't be used as a setter because it's final.
   ++a.x;
+//    ^
+// [diag.assignmentToFinal] 'x' can't be used as a setter because it's final.
   a.x++;
+//  ^
+// [diag.assignmentToFinal] 'x' can't be used as a setter because it's final.
 }
-''',
-      [
-        error(diag.assignmentToFinal, 64, 1),
-        error(diag.assignmentToFinal, 75, 1),
-        error(diag.assignmentToFinal, 89, 1),
-        error(diag.assignmentToFinal, 96, 1),
-      ],
-    );
+''');
   }
 
   test_prefixedIdentifier_staticField_externalFinal() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 abstract class A {
   external static final int x;
 }
 
 void f() {
   A.x = 0;
+//  ^
+// [diag.assignmentToFinal] 'x' can't be used as a setter because it's final.
   A.x += 0;
+//  ^
+// [diag.assignmentToFinal] 'x' can't be used as a setter because it's final.
   ++A.x;
+//    ^
+// [diag.assignmentToFinal] 'x' can't be used as a setter because it's final.
   A.x++;
+//  ^
+// [diag.assignmentToFinal] 'x' can't be used as a setter because it's final.
 }
-''',
-      [
-        error(diag.assignmentToFinal, 68, 1),
-        error(diag.assignmentToFinal, 79, 1),
-        error(diag.assignmentToFinal, 93, 1),
-        error(diag.assignmentToFinal, 100, 1),
-      ],
-    );
+''');
   }
 
   test_prefixedIdentifier_staticField_lateFinal() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 abstract class A {
   static late final int x;
 }
@@ -206,30 +207,30 @@
   }
 
   test_prefixedIdentifier_staticField_lateFinal_hasInitializer() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 abstract class A {
   static late final int x = 0;
 }
 
 void f() {
   A.x = 0;
+//  ^
+// [diag.assignmentToFinal] 'x' can't be used as a setter because it's final.
   A.x += 0;
+//  ^
+// [diag.assignmentToFinal] 'x' can't be used as a setter because it's final.
   ++A.x;
+//    ^
+// [diag.assignmentToFinal] 'x' can't be used as a setter because it's final.
   A.x++;
+//  ^
+// [diag.assignmentToFinal] 'x' can't be used as a setter because it's final.
 }
-''',
-      [
-        error(diag.assignmentToFinal, 68, 1),
-        error(diag.assignmentToFinal, 79, 1),
-        error(diag.assignmentToFinal, 93, 1),
-        error(diag.assignmentToFinal, 100, 1),
-      ],
-    );
+''');
   }
 
   test_propertyAccess_instanceField_lateFinal() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 abstract class A {
   late final int x;
 }
@@ -244,31 +245,30 @@
   }
 
   test_propertyAccess_instanceField_lateFinal_hasInitializer() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 abstract class A {
   late final int x = 0;
 }
 
 void f(A a) {
   (a).x = 0;
+//    ^
+// [diag.assignmentToFinal] 'x' can't be used as a setter because it's final.
   (a).x += 0;
+//    ^
+// [diag.assignmentToFinal] 'x' can't be used as a setter because it's final.
   ++(a).x;
+//      ^
+// [diag.assignmentToFinal] 'x' can't be used as a setter because it's final.
   (a).x++;
+//    ^
+// [diag.assignmentToFinal] 'x' can't be used as a setter because it's final.
 }
-''',
-      [
-        error(diag.assignmentToFinal, 66, 1),
-        error(diag.assignmentToFinal, 79, 1),
-        error(diag.assignmentToFinal, 95, 1),
-        error(diag.assignmentToFinal, 104, 1),
-      ],
-    );
+''');
   }
 
   test_simpleIdentifier_inheritedSetter_shadowedBy_topLevelGetter() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   void set foo(int _) {}
 }
@@ -278,15 +278,15 @@
 class B extends A {
   void bar() {
     foo = 0;
+//  ^^^
+// [diag.assignmentToFinal] 'foo' can't be used as a setter because it's final.
   }
 }
-''',
-      [error(diag.assignmentToFinal, 96, 3)],
-    );
+''');
   }
 
   test_simpleIdentifier_instanceField_lateFinal() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 abstract class A {
   late final int x;
 
@@ -301,30 +301,30 @@
   }
 
   test_simpleIdentifier_instanceField_lateFinal_hasInitializer() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 abstract class A {
   late final int x = 0;
 
   void f() {
     x = 0;
+//  ^
+// [diag.assignmentToFinal] 'x' can't be used as a setter because it's final.
     x += 0;
+//  ^
+// [diag.assignmentToFinal] 'x' can't be used as a setter because it's final.
     ++x;
+//    ^
+// [diag.assignmentToFinal] 'x' can't be used as a setter because it's final.
     x++;
+//  ^
+// [diag.assignmentToFinal] 'x' can't be used as a setter because it's final.
   }
 }
-''',
-      [
-        error(diag.assignmentToFinal, 61, 1),
-        error(diag.assignmentToFinal, 72, 1),
-        error(diag.assignmentToFinal, 86, 1),
-        error(diag.assignmentToFinal, 93, 1),
-      ],
-    );
+''');
   }
 
   test_simpleIdentifier_staticField_lateFinal() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 abstract class A {
   static late final int x;
 
@@ -339,51 +339,51 @@
   }
 
   test_simpleIdentifier_staticField_lateFinal_hasInitializer() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 abstract class A {
   static late final int x = 0;
 
   void f() {
     x = 0;
+//  ^
+// [diag.assignmentToFinal] 'x' can't be used as a setter because it's final.
     x += 0;
+//  ^
+// [diag.assignmentToFinal] 'x' can't be used as a setter because it's final.
     ++x;
+//    ^
+// [diag.assignmentToFinal] 'x' can't be used as a setter because it's final.
     x++;
+//  ^
+// [diag.assignmentToFinal] 'x' can't be used as a setter because it's final.
   }
 }
-''',
-      [
-        error(diag.assignmentToFinal, 68, 1),
-        error(diag.assignmentToFinal, 79, 1),
-        error(diag.assignmentToFinal, 93, 1),
-        error(diag.assignmentToFinal, 100, 1),
-      ],
-    );
+''');
   }
 
   test_simpleIdentifier_topLevelGetter() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 int get x => 0;
 
 void f() {
   x = 0;
+//^
+// [diag.assignmentToFinal] 'x' can't be used as a setter because it's final.
   x += 0;
+//^
+// [diag.assignmentToFinal] 'x' can't be used as a setter because it's final.
   ++x;
+//  ^
+// [diag.assignmentToFinal] 'x' can't be used as a setter because it's final.
   x++;
+//^
+// [diag.assignmentToFinal] 'x' can't be used as a setter because it's final.
 }
-''',
-      [
-        error(diag.assignmentToFinal, 30, 1),
-        error(diag.assignmentToFinal, 39, 1),
-        error(diag.assignmentToFinal, 51, 1),
-        error(diag.assignmentToFinal, 56, 1),
-      ],
-    );
+''');
   }
 
   test_simpleIdentifier_topLevelVariable() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 var x = 0;
 
 void f() {
@@ -396,7 +396,7 @@
   }
 
   test_simpleIdentifier_topLevelVariable_external() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 external int x;
 
 void f() {
@@ -409,49 +409,49 @@
   }
 
   test_simpleIdentifier_topLevelVariable_externalFinal() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 external final x;
 
 void f() {
   x = 0;
+//^
+// [diag.assignmentToFinal] 'x' can't be used as a setter because it's final.
   x += 0;
+//^
+// [diag.assignmentToFinal] 'x' can't be used as a setter because it's final.
   ++x;
+//  ^
+// [diag.assignmentToFinal] 'x' can't be used as a setter because it's final.
   x++;
+//^
+// [diag.assignmentToFinal] 'x' can't be used as a setter because it's final.
 }
-''',
-      [
-        error(diag.assignmentToFinal, 32, 1),
-        error(diag.assignmentToFinal, 41, 1),
-        error(diag.assignmentToFinal, 53, 1),
-        error(diag.assignmentToFinal, 58, 1),
-      ],
-    );
+''');
   }
 
   test_simpleIdentifier_topLevelVariable_final() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 final x = 0;
 
 void f() {
   x = 0;
+//^
+// [diag.assignmentToFinal] 'x' can't be used as a setter because it's final.
   x += 0;
+//^
+// [diag.assignmentToFinal] 'x' can't be used as a setter because it's final.
   ++x;
+//  ^
+// [diag.assignmentToFinal] 'x' can't be used as a setter because it's final.
   x++;
+//^
+// [diag.assignmentToFinal] 'x' can't be used as a setter because it's final.
 }
-''',
-      [
-        error(diag.assignmentToFinal, 27, 1),
-        error(diag.assignmentToFinal, 36, 1),
-        error(diag.assignmentToFinal, 48, 1),
-        error(diag.assignmentToFinal, 53, 1),
-      ],
-    );
+''');
   }
 
   test_simpleIdentifier_topLevelVariable_lateFinal() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 late final int x;
 
 void f() {
@@ -464,23 +464,23 @@
   }
 
   test_simpleIdentifier_topLevelVariable_lateFinal_hasInitializer() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 late final int x = 0;
 
 void f() {
   x = 0;
+//^
+// [diag.assignmentToFinal] 'x' can't be used as a setter because it's final.
   x += 0;
+//^
+// [diag.assignmentToFinal] 'x' can't be used as a setter because it's final.
   ++x;
+//  ^
+// [diag.assignmentToFinal] 'x' can't be used as a setter because it's final.
   x++;
+//^
+// [diag.assignmentToFinal] 'x' can't be used as a setter because it's final.
 }
-''',
-      [
-        error(diag.assignmentToFinal, 36, 1),
-        error(diag.assignmentToFinal, 45, 1),
-        error(diag.assignmentToFinal, 57, 1),
-        error(diag.assignmentToFinal, 62, 1),
-      ],
-    );
+''');
   }
 }
diff --git a/pkg/analyzer/test/src/diagnostics/assignment_to_function_test.dart b/pkg/analyzer/test/src/diagnostics/assignment_to_function_test.dart
index b436bf9..6c254d0 100644
--- a/pkg/analyzer/test/src/diagnostics/assignment_to_function_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/assignment_to_function_test.dart
@@ -2,27 +2,27 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/src/diagnostic/diagnostic.dart' as diag;
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../dart/resolution/context_collection_resolution.dart';
+import '../dart/resolution/node_text_expectations.dart';
 
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(AssignmentToFunctionTest);
+    defineReflectiveTests(UpdateNodeTextExpectations);
   });
 }
 
 @reflectiveTest
 class AssignmentToFunctionTest extends PubPackageResolutionTest {
   test_function() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 f() {}
 main() {
   f = null;
-}''',
-      [error(diag.assignmentToFunction, 18, 1)],
-    );
+//^
+// [diag.assignmentToFunction] Functions can't be assigned a value.
+}''');
   }
 }
diff --git a/pkg/analyzer/test/src/diagnostics/assignment_to_method_test.dart b/pkg/analyzer/test/src/diagnostics/assignment_to_method_test.dart
index 761baf9e..009cc7c 100644
--- a/pkg/analyzer/test/src/diagnostics/assignment_to_method_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/assignment_to_method_test.dart
@@ -2,22 +2,22 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/src/diagnostic/diagnostic.dart' as diag;
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../dart/resolution/context_collection_resolution.dart';
+import '../dart/resolution/node_text_expectations.dart';
 
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(AssignmentToMethodTest);
+    defineReflectiveTests(UpdateNodeTextExpectations);
   });
 }
 
 @reflectiveTest
 class AssignmentToMethodTest extends PubPackageResolutionTest {
   test_instance_extendedHasMethod_extensionHasSetter() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 class C {
   void foo() {}
 }
@@ -28,69 +28,69 @@
 
 void f(C c) {
   c.foo = 0;
+//  ^^^
+// [diag.assignmentToMethod] Methods can't be assigned a value.
   c.foo += 1;
+//  ^^^
+// [diag.assignmentToMethod] Methods can't be assigned a value.
   c.foo++;
+//  ^^^
+// [diag.assignmentToMethod] Methods can't be assigned a value.
   --c.foo;
+//    ^^^
+// [diag.assignmentToMethod] Methods can't be assigned a value.
 }
-''',
-      [
-        error(diag.assignmentToMethod, 94, 3),
-        error(diag.assignmentToMethod, 107, 3),
-        error(diag.assignmentToMethod, 121, 3),
-        error(diag.assignmentToMethod, 134, 3),
-      ],
-    );
+''');
   }
 
   test_prefixedIdentifier_instanceMethod() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   void foo() {}
 }
 
 void f(A a) {
   a.foo = 0;
+//  ^^^
+// [diag.assignmentToMethod] Methods can't be assigned a value.
   a.foo += 1;
+//  ^^^
+// [diag.assignmentToMethod] Methods can't be assigned a value.
   a.foo++;
+//  ^^^
+// [diag.assignmentToMethod] Methods can't be assigned a value.
   ++a.foo;
+//    ^^^
+// [diag.assignmentToMethod] Methods can't be assigned a value.
 }
-''',
-      [
-        error(diag.assignmentToMethod, 47, 3),
-        error(diag.assignmentToMethod, 60, 3),
-        error(diag.assignmentToMethod, 74, 3),
-        error(diag.assignmentToMethod, 87, 3),
-      ],
-    );
+''');
   }
 
   test_propertyAccess_instanceMethod() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   void foo() {}
 }
 
 void f(A a) {
   (a).foo = 0;
+//    ^^^
+// [diag.assignmentToMethod] Methods can't be assigned a value.
   (a).foo += 1;
+//    ^^^
+// [diag.assignmentToMethod] Methods can't be assigned a value.
   (a).foo++;
+//    ^^^
+// [diag.assignmentToMethod] Methods can't be assigned a value.
   ++(a).foo;
+//      ^^^
+// [diag.assignmentToMethod] Methods can't be assigned a value.
 }
-''',
-      [
-        error(diag.assignmentToMethod, 49, 3),
-        error(diag.assignmentToMethod, 64, 3),
-        error(diag.assignmentToMethod, 80, 3),
-        error(diag.assignmentToMethod, 95, 3),
-      ],
-    );
+''');
   }
 
   test_this_extendedHasMethod_extensionHasSetter() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 class C {
   void foo() {}
 }
@@ -100,10 +100,10 @@
 
   f() {
     this.foo = 0;
+//       ^^^
+// [diag.assignmentToMethod] Methods can't be assigned a value.
   }
 }
-''',
-      [error(diag.assignmentToMethod, 91, 3)],
-    );
+''');
   }
 }
diff --git a/pkg/analyzer/test/src/diagnostics/assignment_to_primary_constructor_parameter_test.dart b/pkg/analyzer/test/src/diagnostics/assignment_to_primary_constructor_parameter_test.dart
index 6b1f99a..1e7a1b5 100644
--- a/pkg/analyzer/test/src/diagnostics/assignment_to_primary_constructor_parameter_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/assignment_to_primary_constructor_parameter_test.dart
@@ -2,14 +2,15 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/src/diagnostic/diagnostic.dart' as diag;
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../dart/resolution/context_collection_resolution.dart';
+import '../dart/resolution/node_text_expectations.dart';
 
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(AssignmentToPrimaryConstructorParameterTest);
+    defineReflectiveTests(UpdateNodeTextExpectations);
   });
 }
 
@@ -17,169 +18,153 @@
 class AssignmentToPrimaryConstructorParameterTest
     extends PubPackageResolutionTest {
   test_fieldInitializer_late() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 class A(int x) {
   late int y = x = 0;
+//             ^
+// [diag.undefinedIdentifier] Undefined name 'x'.
 }
-''',
-      [error(diag.undefinedIdentifier, 32, 1)],
-    );
+''');
   }
 
   test_fieldInitializer_notLate() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 class A(int x) {
   int y = x = 0;
+//        ^
+// [diag.assignmentToPrimaryConstructorParameter] A primary constructor parameter can't be assigned to in an initializer.
 }
-''',
-      [error(diag.assignmentToPrimaryConstructorParameter, 27, 1)],
-    );
+''');
   }
 
   test_fieldInitializer_notLate_closure() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 class A(int x) {
   var f = () {
     x = 0;
+//  ^
+// [diag.assignmentToPrimaryConstructorParameter] A primary constructor parameter can't be assigned to in an initializer.
   };
 }
-''',
-      [error(diag.assignmentToPrimaryConstructorParameter, 36, 1)],
-    );
+''');
   }
 
   test_fieldInitializer_notLate_nullAware() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 class A(int? x) {
   int y = x ??= 0;
+//        ^
+// [diag.assignmentToPrimaryConstructorParameter] A primary constructor parameter can't be assigned to in an initializer.
 }
-''',
-      [error(diag.assignmentToPrimaryConstructorParameter, 28, 1)],
-    );
+''');
   }
 
   test_fieldInitializer_notLate_pattern_list() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 class A(int x) {
   List<int> y = [x] = [2];
+//               ^
+// [diag.assignmentToPrimaryConstructorParameter] A primary constructor parameter can't be assigned to in an initializer.
 }
-''',
-      [error(diag.assignmentToPrimaryConstructorParameter, 34, 1)],
-    );
+''');
   }
 
   test_fieldInitializer_notLate_pattern_logicalAnd() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 class A(int x, int z) {
   int y = (x && z) = 2;
+//         ^
+// [diag.assignmentToPrimaryConstructorParameter] A primary constructor parameter can't be assigned to in an initializer.
+//              ^
+// [diag.assignmentToPrimaryConstructorParameter] A primary constructor parameter can't be assigned to in an initializer.
 }
-''',
-      [
-        error(diag.assignmentToPrimaryConstructorParameter, 35, 1),
-        error(diag.assignmentToPrimaryConstructorParameter, 40, 1),
-      ],
-    );
+''');
   }
 
   test_fieldInitializer_notLate_pattern_map() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 class A(int x) {
   Map<int?, int> y = {null: x} = {null: 2};
+//                          ^
+// [diag.assignmentToPrimaryConstructorParameter] A primary constructor parameter can't be assigned to in an initializer.
 }
-''',
-      [error(diag.assignmentToPrimaryConstructorParameter, 45, 1)],
-    );
+''');
   }
 
   test_fieldInitializer_notLate_pattern_nullAssert() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 class A(int? x) {
   int y = (x!) = 2;
+//         ^
+// [diag.assignmentToPrimaryConstructorParameter] A primary constructor parameter can't be assigned to in an initializer.
+//          ^
+// [diag.unnecessaryNullAssertPattern] The null-assert pattern will have no effect because the matched type isn't nullable.
 }
-''',
-      [
-        error(diag.assignmentToPrimaryConstructorParameter, 29, 1),
-        error(diag.unnecessaryNullAssertPattern, 30, 1),
-      ],
-    );
+''');
   }
 
   test_fieldInitializer_notLate_pattern_object() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 class A(int x) {
   Object y = int(sign: x) = 2;
+//                     ^
+// [diag.assignmentToPrimaryConstructorParameter] A primary constructor parameter can't be assigned to in an initializer.
 }
-''',
-      [error(diag.assignmentToPrimaryConstructorParameter, 40, 1)],
-    );
+''');
   }
 
   test_fieldInitializer_notLate_pattern_parenthesized() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 class A(int x) {
   int y = (x) = 0;
+//         ^
+// [diag.assignmentToPrimaryConstructorParameter] A primary constructor parameter can't be assigned to in an initializer.
 }
-''',
-      [error(diag.assignmentToPrimaryConstructorParameter, 28, 1)],
-    );
+''');
   }
 
   test_fieldInitializer_notLate_pattern_record() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 class A(int x) {
   (int, {bool name}) y = (x, name: _) = (2, name: true);
+//                        ^
+// [diag.assignmentToPrimaryConstructorParameter] A primary constructor parameter can't be assigned to in an initializer.
 }
-''',
-      [error(diag.assignmentToPrimaryConstructorParameter, 43, 1)],
-    );
+''');
   }
 
   test_fieldInitializer_notLate_plusEq() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 class A(int x) {
   int y = x += 1;
+//        ^
+// [diag.assignmentToPrimaryConstructorParameter] A primary constructor parameter can't be assigned to in an initializer.
 }
-''',
-      [error(diag.assignmentToPrimaryConstructorParameter, 27, 1)],
-    );
+''');
   }
 
   test_fieldInitializer_notLate_postfix() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 class A(int x) {
   int y = x++;
+//        ^
+// [diag.assignmentToPrimaryConstructorParameter] A primary constructor parameter can't be assigned to in an initializer.
 }
-''',
-      [error(diag.assignmentToPrimaryConstructorParameter, 27, 1)],
-    );
+''');
   }
 
   test_fieldInitializer_notLate_prefix() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 class A(int x) {
   int y = ++x;
+//          ^
+// [diag.assignmentToPrimaryConstructorParameter] A primary constructor parameter can't be assigned to in an initializer.
 }
-''',
-      [error(diag.assignmentToPrimaryConstructorParameter, 29, 1)],
-    );
+''');
   }
 
   test_primaryConstructor_body() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 class A(int x) {
   this {
     x = 0;
@@ -189,76 +174,70 @@
   }
 
   test_primaryConstructor_initializer() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 class A(int x) {
   int y;
   this : y = x = 0;
+//           ^
+// [diag.assignmentToPrimaryConstructorParameter] A primary constructor parameter can't be assigned to in an initializer.
 }
-''',
-      [error(diag.assignmentToPrimaryConstructorParameter, 39, 1)],
-    );
+''');
   }
 
   test_primaryConstructor_initializer_closure() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 class A(int x) {
   var f;
   this : f = (() {
     x = 0;
+//  ^
+// [diag.assignmentToPrimaryConstructorParameter] A primary constructor parameter can't be assigned to in an initializer.
   });
 }
-''',
-      [error(diag.assignmentToPrimaryConstructorParameter, 49, 1)],
-    );
+''');
   }
 
   test_primaryConstructor_initializer_nullAware() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 class A(int? x) {
   int y;
   this : y = x ??= 0;
+//           ^
+// [diag.assignmentToPrimaryConstructorParameter] A primary constructor parameter can't be assigned to in an initializer.
 }
-''',
-      [error(diag.assignmentToPrimaryConstructorParameter, 40, 1)],
-    );
+''');
   }
 
   test_primaryConstructor_initializer_plusEq() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 class A(int x) {
   int y;
   this : y = x += 1;
+//           ^
+// [diag.assignmentToPrimaryConstructorParameter] A primary constructor parameter can't be assigned to in an initializer.
 }
-''',
-      [error(diag.assignmentToPrimaryConstructorParameter, 39, 1)],
-    );
+''');
   }
 
   test_primaryConstructor_initializer_postfix() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 class A(int x) {
   int y;
   this : y = x++;
+//           ^
+// [diag.assignmentToPrimaryConstructorParameter] A primary constructor parameter can't be assigned to in an initializer.
 }
-''',
-      [error(diag.assignmentToPrimaryConstructorParameter, 39, 1)],
-    );
+''');
   }
 
   test_primaryConstructor_initializer_prefix() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 class A(int x) {
   int y;
   this : y = ++x;
+//             ^
+// [diag.assignmentToPrimaryConstructorParameter] A primary constructor parameter can't be assigned to in an initializer.
 }
-''',
-      [error(diag.assignmentToPrimaryConstructorParameter, 41, 1)],
-    );
+''');
   }
 }
diff --git a/pkg/analyzer/test/src/diagnostics/assignment_to_type_test.dart b/pkg/analyzer/test/src/diagnostics/assignment_to_type_test.dart
index 2174103..b28e041 100644
--- a/pkg/analyzer/test/src/diagnostics/assignment_to_type_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/assignment_to_type_test.dart
@@ -2,89 +2,84 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/src/diagnostic/diagnostic.dart' as diag;
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../dart/resolution/context_collection_resolution.dart';
+import '../dart/resolution/node_text_expectations.dart';
 
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(AssignmentToTypeTest);
+    defineReflectiveTests(UpdateNodeTextExpectations);
   });
 }
 
 @reflectiveTest
 class AssignmentToTypeTest extends PubPackageResolutionTest {
   test_class() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 class C {}
 main() {
   C = null;
+//^
+// [diag.assignmentToType] Types can't be assigned a value.
 }
-''',
-      [error(diag.assignmentToType, 22, 1)],
-    );
+''');
   }
 
   test_dynamic() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 void f() {
   dynamic = 1;
+//^^^^^^^
+// [diag.assignmentToType] Types can't be assigned a value.
 }
-''',
-      [error(diag.assignmentToType, 13, 7)],
-    );
+''');
   }
 
   test_enum() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 enum E { e }
 main() {
   E = null;
+//^
+// [diag.assignmentToType] Types can't be assigned a value.
 }
-''',
-      [error(diag.assignmentToType, 24, 1)],
-    );
+''');
   }
 
   test_typedef_functionType() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 typedef void F();
 main() {
   F = null;
+//^
+// [diag.assignmentToType] Types can't be assigned a value.
 }
-''',
-      [error(diag.assignmentToType, 29, 1)],
-    );
+''');
   }
 
   test_typedef_interfaceType() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 typedef F = List<int>;
 
 void f() {
   F = null;
+//^
+// [diag.assignmentToType] Types can't be assigned a value.
 }
-''',
-      [error(diag.assignmentToType, 37, 1)],
-    );
+''');
   }
 
   test_typeParameter() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 class C<T> {
   f() {
     T = null;
+//  ^
+// [diag.assignmentToType] Types can't be assigned a value.
   }
 }
-''',
-      [error(diag.assignmentToType, 25, 1)],
-    );
+''');
   }
 }
diff --git a/pkg/analyzer/test/src/diagnostics/async_for_in_wrong_context_test.dart b/pkg/analyzer/test/src/diagnostics/async_for_in_wrong_context_test.dart
index 8c1195d..697f725 100644
--- a/pkg/analyzer/test/src/diagnostics/async_for_in_wrong_context_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/async_for_in_wrong_context_test.dart
@@ -2,31 +2,30 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/src/diagnostic/diagnostic.dart' as diag;
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../dart/resolution/context_collection_resolution.dart';
+import '../dart/resolution/node_text_expectations.dart';
 
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(AsyncForInWrongContextTest);
+    defineReflectiveTests(UpdateNodeTextExpectations);
   });
 }
 
 @reflectiveTest
 class AsyncForInWrongContextTest extends PubPackageResolutionTest {
   test_syncFunction() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 f(list) {
   await for (var e in list) {
+//^^^^^
+// [diag.asyncForInWrongContext] The async for-in loop can only be used in an async function.
+//               ^
+// [diag.unusedLocalVariable] The value of the local variable 'e' isn't used.
   }
 }
-''',
-      [
-        error(diag.asyncForInWrongContext, 12, 5),
-        error(diag.unusedLocalVariable, 27, 1),
-      ],
-    );
+''');
   }
 }
diff --git a/pkg/analyzer/test/src/diagnostics/async_keyword_used_as_identifier_test.dart b/pkg/analyzer/test/src/diagnostics/async_keyword_used_as_identifier_test.dart
index 77146ed..6194c9a 100644
--- a/pkg/analyzer/test/src/diagnostics/async_keyword_used_as_identifier_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/async_keyword_used_as_identifier_test.dart
@@ -2,113 +2,95 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/src/diagnostic/diagnostic.dart' as diag;
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../dart/resolution/context_collection_resolution.dart';
+import '../dart/resolution/node_text_expectations.dart';
 
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(AsyncKeywordUsedAsIdentifierTest);
+    defineReflectiveTests(UpdateNodeTextExpectations);
   });
 }
 
 @reflectiveTest
 class AsyncKeywordUsedAsIdentifierTest extends PubPackageResolutionTest {
   test_async_async() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   m() async {
     int async;
+//      ^^^^^
+// [diag.unusedLocalVariable] The value of the local variable 'async' isn't used.
   }
 }
-''',
-      [error(diag.unusedLocalVariable, 32, 5)],
-    );
+''');
   }
 
   test_await_async() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 f() async {
   var await = 1;
+//    ^^^^^
+// [diag.asyncKeywordUsedAsIdentifier] The keywords 'await' and 'yield' can't be used as identifiers in an asynchronous or generator function.
+// [diag.unusedLocalVariable] The value of the local variable 'await' isn't used.
 }
-''',
-      [
-        error(diag.asyncKeywordUsedAsIdentifier, 18, 5),
-        error(diag.unusedLocalVariable, 18, 5),
-      ],
-    );
+''');
   }
 
   test_await_asyncStar() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 f() async* {
   var await = 1;
+//    ^^^^^
+// [diag.asyncKeywordUsedAsIdentifier] The keywords 'await' and 'yield' can't be used as identifiers in an asynchronous or generator function.
+// [diag.unusedLocalVariable] The value of the local variable 'await' isn't used.
 }
-''',
-      [
-        error(diag.asyncKeywordUsedAsIdentifier, 19, 5),
-        error(diag.unusedLocalVariable, 19, 5),
-      ],
-    );
+''');
   }
 
   test_await_syncStar() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 f() sync* {
   var await = 1;
+//    ^^^^^
+// [diag.asyncKeywordUsedAsIdentifier] The keywords 'await' and 'yield' can't be used as identifiers in an asynchronous or generator function.
+// [diag.unusedLocalVariable] The value of the local variable 'await' isn't used.
 }
-''',
-      [
-        error(diag.asyncKeywordUsedAsIdentifier, 18, 5),
-        error(diag.unusedLocalVariable, 18, 5),
-      ],
-    );
+''');
   }
 
   test_yield_async() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 f() async {
   var yield = 1;
+//    ^^^^^
+// [diag.asyncKeywordUsedAsIdentifier] The keywords 'await' and 'yield' can't be used as identifiers in an asynchronous or generator function.
+// [diag.unusedLocalVariable] The value of the local variable 'yield' isn't used.
 }
-''',
-      [
-        error(diag.asyncKeywordUsedAsIdentifier, 18, 5),
-        error(diag.unusedLocalVariable, 18, 5),
-      ],
-    );
+''');
   }
 
   test_yield_asyncStar() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 f() async* {
   var yield = 1;
+//    ^^^^^
+// [diag.asyncKeywordUsedAsIdentifier] The keywords 'await' and 'yield' can't be used as identifiers in an asynchronous or generator function.
+// [diag.unusedLocalVariable] The value of the local variable 'yield' isn't used.
 }
-''',
-      [
-        error(diag.asyncKeywordUsedAsIdentifier, 19, 5),
-        error(diag.unusedLocalVariable, 19, 5),
-      ],
-    );
+''');
   }
 
   test_yield_syncStar() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 f() sync* {
   var yield = 1;
+//    ^^^^^
+// [diag.asyncKeywordUsedAsIdentifier] The keywords 'await' and 'yield' can't be used as identifiers in an asynchronous or generator function.
+// [diag.unusedLocalVariable] The value of the local variable 'yield' isn't used.
 }
-''',
-      [
-        error(diag.asyncKeywordUsedAsIdentifier, 18, 5),
-        error(diag.unusedLocalVariable, 18, 5),
-      ],
-    );
+''');
   }
 }
diff --git a/pkg/analyzer/test/src/diagnostics/augmentation_extends_clause_already_present_test.dart b/pkg/analyzer/test/src/diagnostics/augmentation_extends_clause_already_present_test.dart
index 6170239..d646fce 100644
--- a/pkg/analyzer/test/src/diagnostics/augmentation_extends_clause_already_present_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/augmentation_extends_clause_already_present_test.dart
@@ -9,8 +9,7 @@
 
 main() {
   defineReflectiveSuite(() {
-    // TODO(scheglov): implement augmentation
-    // defineReflectiveTests(AugmentationExtendsClauseAlreadyPresentTest);
+    defineReflectiveTests(AugmentationExtendsClauseAlreadyPresentTest);
   });
 }
 
@@ -18,76 +17,49 @@
 class AugmentationExtendsClauseAlreadyPresentTest
     extends PubPackageResolutionTest {
   test_alreadyPresent() async {
-    var a = newFile('$testPackageLibPath/a.dart', r'''
-part 'test.dart';
-
-class A {}
-
-class B extends A {};
-''');
-
     await assertErrorsInCode(
       r'''
-part of 'a.dart';
+class A {}
 
+class B extends A {}
 augment class B extends A {}
 ''',
       [
         error(
           diag.augmentationExtendsClauseAlreadyPresent,
-          35,
+          49,
           7,
-          contextMessages: [message(a, 37, 1)],
+          contextMessages: [message(testFile, 18, 1)],
         ),
       ],
     );
   }
 
   test_alreadyPresent2() async {
-    var a = newFile('$testPackageLibPath/a.dart', r'''
-part 'b.dart';
-part 'test.dart';
-
-class A {}
-
-class B extends A {};
-''');
-
-    newFile('$testPackageLibPath/b.dart', r'''
-part of 'a.dart';
-
-augment class B {}
-''');
-
     await assertErrorsInCode(
       r'''
-part of 'a.dart';
+class A {}
 
+class B extends A {}
+augment class B {}
 augment class B extends A {}
 ''',
       [
         error(
           diag.augmentationExtendsClauseAlreadyPresent,
-          35,
+          68,
           7,
-          contextMessages: [message(a, 52, 1)],
+          contextMessages: [message(testFile, 18, 1)],
         ),
       ],
     );
   }
 
   test_notPresent() async {
-    newFile('$testPackageLibPath/a.dart', r'''
-part 'test.dart';
-
+    await assertNoErrorsInCode(r'''
 class A {}
 
-class B {};
-''');
-
-    await assertNoErrorsInCode(r'''
-part of 'a.dart';
-
+class B {}
 augment class B extends A {}
 ''');
   }
diff --git a/pkg/analyzer/test/src/diagnostics/augmentation_modifier_extra_test.dart b/pkg/analyzer/test/src/diagnostics/augmentation_modifier_extra_test.dart
index 78c4133..7d55557 100644
--- a/pkg/analyzer/test/src/diagnostics/augmentation_modifier_extra_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/augmentation_modifier_extra_test.dart
@@ -9,149 +9,148 @@
 
 main() {
   defineReflectiveSuite(() {
-    // TODO(scheglov): implement augmentation
-    // defineReflectiveTests(AugmentationModifierExtraTest);
+    defineReflectiveTests(AugmentationModifierExtraTest);
   });
 }
 
 @reflectiveTest
 class AugmentationModifierExtraTest extends PubPackageResolutionTest {
-  test_class_abstract() async {
-    newFile('$testPackageLibPath/a.dart', r'''
-part 'test.dart';
-
-class A {}
-''');
-
+  test_class_abstract_abstractBase() async {
     await assertErrorsInCode(
       r'''
-part of 'a.dart';
-
-augment abstract class A {}
+abstract class A {}
+augment abstract base class A {}
 ''',
-      [error(diag.augmentationModifierExtra, 27, 8)],
+      [error(diag.augmentationModifierExtra, 37, 4)],
     );
   }
 
-  test_class_abstract_base() async {
-    newFile('$testPackageLibPath/a.dart', r'''
-part 'test.dart';
-
-class A {}
+  test_class_abstractBase_abstractBase() async {
+    await assertNoErrorsInCode(r'''
+abstract base class A {}
+augment abstract base class A {}
 ''');
+  }
 
+  test_class_base_abstractBase() async {
     await assertErrorsInCode(
       r'''
-part of 'a.dart';
+base class A {}
+augment abstract base class A {}
+''',
+      [error(diag.augmentationModifierExtra, 24, 8)],
+    );
+  }
 
+  test_class_nothing_abstract() async {
+    await assertErrorsInCode(
+      r'''
+class A {}
+augment abstract class A {}
+''',
+      [error(diag.augmentationModifierExtra, 19, 8)],
+    );
+  }
+
+  test_class_nothing_abstractBase() async {
+    await assertErrorsInCode(
+      r'''
+class A {}
 augment abstract base class A {}
 ''',
       [
-        error(diag.augmentationModifierExtra, 27, 8),
-        error(diag.augmentationModifierExtra, 36, 4),
+        error(diag.augmentationModifierExtra, 19, 8),
+        error(diag.augmentationModifierExtra, 28, 4),
       ],
     );
   }
 
-  test_class_base() async {
-    newFile('$testPackageLibPath/a.dart', r'''
-part 'test.dart';
-
-class A {}
-''');
-
+  test_class_nothing_base() async {
     await assertErrorsInCode(
       r'''
-part of 'a.dart';
-
+class A {}
 augment base class A {}
 ''',
-      [error(diag.augmentationModifierExtra, 27, 4)],
+      [error(diag.augmentationModifierExtra, 19, 4)],
     );
   }
 
-  test_class_final() async {
-    newFile('$testPackageLibPath/a.dart', r'''
-part 'test.dart';
-
-class A {}
-''');
-
+  test_class_nothing_final() async {
     await assertErrorsInCode(
       r'''
-part of 'a.dart';
-
+class A {}
 augment final class A {}
 ''',
-      [error(diag.augmentationModifierExtra, 27, 5)],
+      [error(diag.augmentationModifierExtra, 19, 5)],
     );
   }
 
-  test_class_interface() async {
-    newFile('$testPackageLibPath/a.dart', r'''
-part 'test.dart';
-
-class A {}
-''');
-
+  test_class_nothing_interface() async {
     await assertErrorsInCode(
       r'''
-part of 'a.dart';
-
+class A {}
 augment interface class A {}
 ''',
-      [error(diag.augmentationModifierExtra, 27, 9)],
+      [error(diag.augmentationModifierExtra, 19, 9)],
     );
   }
 
-  test_class_mixin() async {
-    newFile('$testPackageLibPath/a.dart', r'''
-part 'test.dart';
-
-class A {}
-''');
-
+  test_class_nothing_mixin() async {
     await assertErrorsInCode(
       r'''
-part of 'a.dart';
-
+class A {}
 augment mixin class A {}
 ''',
-      [error(diag.augmentationModifierExtra, 27, 5)],
+      [error(diag.augmentationModifierExtra, 19, 5)],
     );
   }
 
-  test_class_sealed() async {
-    newFile('$testPackageLibPath/a.dart', r'''
-part 'test.dart';
-
-class A {}
-''');
-
+  test_class_nothing_nothing_abstract() async {
     await assertErrorsInCode(
       r'''
-part of 'a.dart';
+class A {}
+augment class A {}
+augment abstract class A {}
+''',
+      [error(diag.augmentationModifierExtra, 38, 8)],
+    );
+  }
 
+  test_class_nothing_sealed() async {
+    await assertErrorsInCode(
+      r'''
+class A {}
 augment sealed class A {}
 ''',
-      [error(diag.augmentationModifierExtra, 27, 6)],
+      [error(diag.augmentationModifierExtra, 19, 6)],
     );
   }
 
-  test_mixin_base() async {
-    newFile('$testPackageLibPath/a.dart', r'''
-part 'test.dart';
-
-mixin A {}
+  test_mixin_base_base() async {
+    await assertNoErrorsInCode(r'''
+base mixin A {}
+augment base mixin A {}
 ''');
+  }
 
+  test_mixin_nothing_base() async {
     await assertErrorsInCode(
       r'''
-part of 'a.dart';
-
+mixin A {}
 augment base mixin A {}
 ''',
-      [error(diag.augmentationModifierExtra, 27, 4)],
+      [error(diag.augmentationModifierExtra, 19, 4)],
+    );
+  }
+
+  test_mixin_nothing_nothing_base() async {
+    await assertErrorsInCode(
+      r'''
+mixin A {}
+augment mixin A {}
+augment base mixin A {}
+''',
+      [error(diag.augmentationModifierExtra, 38, 4)],
     );
   }
 }
diff --git a/pkg/analyzer/test/src/diagnostics/augmentation_modifier_missing_test.dart b/pkg/analyzer/test/src/diagnostics/augmentation_modifier_missing_test.dart
index 1baacb1..318db2f 100644
--- a/pkg/analyzer/test/src/diagnostics/augmentation_modifier_missing_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/augmentation_modifier_missing_test.dart
@@ -9,149 +9,148 @@
 
 main() {
   defineReflectiveSuite(() {
-    // TODO(scheglov): implement augmentation
-    // defineReflectiveTests(AugmentationModifierMissingTest);
+    defineReflectiveTests(AugmentationModifierMissingTest);
   });
 }
 
 @reflectiveTest
 class AugmentationModifierMissingTest extends PubPackageResolutionTest {
-  test_class_abstract() async {
-    newFile('$testPackageLibPath/a.dart', r'''
-part 'test.dart';
-
-abstract class A {}
-''');
-
+  test_class_abstract_abstract_nothing() async {
     await assertErrorsInCode(
       r'''
-part of 'a.dart';
-
+abstract class A {}
+augment abstract class A {}
 augment class A {}
 ''',
-      [error(diag.augmentationModifierMissing, 19, 7)],
+      [error(diag.augmentationModifierMissing, 48, 7)],
     );
   }
 
-  test_class_abstract_base() async {
-    newFile('$testPackageLibPath/a.dart', r'''
-part 'test.dart';
-
-abstract base class A {}
-''');
-
+  test_class_abstract_nothing() async {
     await assertErrorsInCode(
       r'''
-part of 'a.dart';
+abstract class A {}
+augment class A {}
+''',
+      [error(diag.augmentationModifierMissing, 20, 7)],
+    );
+  }
 
+  test_class_abstractBase_abstract() async {
+    await assertErrorsInCode(
+      r'''
+abstract base class A {}
+augment abstract class A {}
+''',
+      [error(diag.augmentationModifierMissing, 25, 7)],
+    );
+  }
+
+  test_class_abstractBase_abstractBase() async {
+    await assertNoErrorsInCode(r'''
+abstract base class A {}
+augment abstract base class A {}
+''');
+  }
+
+  test_class_abstractBase_base() async {
+    await assertErrorsInCode(
+      r'''
+abstract base class A {}
+augment base class A {}
+''',
+      [error(diag.augmentationModifierMissing, 25, 7)],
+    );
+  }
+
+  test_class_abstractBase_nothing() async {
+    await assertErrorsInCode(
+      r'''
+abstract base class A {}
 augment class A {}
 ''',
       [
-        error(diag.augmentationModifierMissing, 19, 7),
-        error(diag.augmentationModifierMissing, 19, 7),
+        error(diag.augmentationModifierMissing, 25, 7),
+        error(diag.augmentationModifierMissing, 25, 7),
       ],
     );
   }
 
-  test_class_base() async {
-    newFile('$testPackageLibPath/a.dart', r'''
-part 'test.dart';
-
+  test_class_base_nothing() async {
+    await assertErrorsInCode(
+      r'''
 base class A {}
-''');
-
-    await assertErrorsInCode(
-      r'''
-part of 'a.dart';
-
 augment class A {}
 ''',
-      [error(diag.augmentationModifierMissing, 19, 7)],
+      [error(diag.augmentationModifierMissing, 16, 7)],
     );
   }
 
-  test_class_final() async {
-    newFile('$testPackageLibPath/a.dart', r'''
-part 'test.dart';
-
+  test_class_final_nothing() async {
+    await assertErrorsInCode(
+      r'''
 final class A {}
-''');
-
-    await assertErrorsInCode(
-      r'''
-part of 'a.dart';
-
 augment class A {}
 ''',
-      [error(diag.augmentationModifierMissing, 19, 7)],
+      [error(diag.augmentationModifierMissing, 17, 7)],
     );
   }
 
-  test_class_interface() async {
-    newFile('$testPackageLibPath/a.dart', r'''
-part 'test.dart';
-
+  test_class_interface_nothing() async {
+    await assertErrorsInCode(
+      r'''
 interface class A {}
-''');
-
-    await assertErrorsInCode(
-      r'''
-part of 'a.dart';
-
 augment class A {}
 ''',
-      [error(diag.augmentationModifierMissing, 19, 7)],
+      [error(diag.augmentationModifierMissing, 21, 7)],
     );
   }
 
-  test_class_mixin() async {
-    newFile('$testPackageLibPath/a.dart', r'''
-part 'test.dart';
-
+  test_class_mixin_nothing() async {
+    await assertErrorsInCode(
+      r'''
 mixin class A {}
-''');
-
-    await assertErrorsInCode(
-      r'''
-part of 'a.dart';
-
 augment class A {}
 ''',
-      [error(diag.augmentationModifierMissing, 19, 7)],
+      [error(diag.augmentationModifierMissing, 17, 7)],
     );
   }
 
-  test_class_sealed() async {
-    newFile('$testPackageLibPath/a.dart', r'''
-part 'test.dart';
-
+  test_class_sealed_nothing() async {
+    await assertErrorsInCode(
+      r'''
 sealed class A {}
-''');
-
-    await assertErrorsInCode(
-      r'''
-part of 'a.dart';
-
 augment class A {}
 ''',
-      [error(diag.augmentationModifierMissing, 19, 7)],
+      [error(diag.augmentationModifierMissing, 18, 7)],
     );
   }
 
-  test_mixin_base() async {
-    newFile('$testPackageLibPath/a.dart', r'''
-part 'test.dart';
-
+  test_mixin_base_base() async {
+    await assertNoErrorsInCode(r'''
 base mixin A {}
+augment base mixin A {}
 ''');
+  }
 
+  test_mixin_base_base_nothing() async {
     await assertErrorsInCode(
       r'''
-part of 'a.dart';
-
+base mixin A {}
+augment base mixin A {}
 augment mixin A {}
 ''',
-      [error(diag.augmentationModifierMissing, 19, 7)],
+      [error(diag.augmentationModifierMissing, 40, 7)],
+    );
+  }
+
+  test_mixin_base_nothing() async {
+    await assertErrorsInCode(
+      r'''
+base mixin A {}
+augment mixin A {}
+''',
+      [error(diag.augmentationModifierMissing, 16, 7)],
     );
   }
 }
diff --git a/pkg/analyzer/test/src/diagnostics/augmentation_of_different_declaration_kind_test.dart b/pkg/analyzer/test/src/diagnostics/augmentation_of_different_declaration_kind_test.dart
index 121c26a..1acf483 100644
--- a/pkg/analyzer/test/src/diagnostics/augmentation_of_different_declaration_kind_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/augmentation_of_different_declaration_kind_test.dart
@@ -2,14 +2,15 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/src/diagnostic/diagnostic.dart' as diag;
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../dart/resolution/context_collection_resolution.dart';
+import '../dart/resolution/node_text_expectations.dart';
 
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(AugmentationOfDifferentDeclarationKindTest);
+    defineReflectiveTests(UpdateNodeTextExpectations);
   });
 }
 
@@ -17,143 +18,87 @@
 class AugmentationOfDifferentDeclarationKindTest
     extends PubPackageResolutionTest {
   test_class_augments_enum() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 enum A {v}
+//   ^
+// [context 1] The declaration being augmented.
 augment class A {}
-''',
-      [
-        error(
-          diag.augmentationOfDifferentDeclarationKind,
-          11,
-          7,
-          contextMessages: [message(testFile, 5, 1)],
-        ),
-      ],
-    );
+// [diag.augmentationOfDifferentDeclarationKind][column 1][length 7][context 1] Can't augment a enum with a class.
+''');
   }
 
   test_class_augments_extension() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 extension A on int {}
+//        ^
+// [context 1] The declaration being augmented.
 augment class A {}
-''',
-      [
-        error(
-          diag.augmentationOfDifferentDeclarationKind,
-          22,
-          7,
-          contextMessages: [message(testFile, 10, 1)],
-        ),
-      ],
-    );
+// [diag.augmentationOfDifferentDeclarationKind][column 1][length 7][context 1] Can't augment a extension with a class.
+''');
   }
 
   test_class_augments_extensionType() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 extension type A(int it) {}
+//             ^
+// [context 1] The declaration being augmented.
 augment class A {}
-''',
-      [
-        error(
-          diag.augmentationOfDifferentDeclarationKind,
-          28,
-          7,
-          contextMessages: [message(testFile, 15, 1)],
-        ),
-      ],
-    );
+// [diag.augmentationOfDifferentDeclarationKind][column 1][length 7][context 1] Can't augment a extension type with a class.
+''');
   }
 
   test_class_augments_function() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 void foo() {}
+//   ^^^
+// [context 1] The declaration being augmented.
 augment class foo {}
-''',
-      [
-        error(
-          diag.augmentationOfDifferentDeclarationKind,
-          14,
-          7,
-          contextMessages: [message(testFile, 5, 3)],
-        ),
-      ],
-    );
+// [diag.augmentationOfDifferentDeclarationKind][column 1][length 7][context 1] Can't augment a function with a class.
+''');
   }
 
   test_class_augments_getter() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 int get foo => 0;
+//      ^^^
+// [context 1] The declaration being augmented.
 augment class foo {}
-''',
-      [
-        error(
-          diag.augmentationOfDifferentDeclarationKind,
-          18,
-          7,
-          contextMessages: [message(testFile, 8, 3)],
-        ),
-      ],
-    );
+// [diag.augmentationOfDifferentDeclarationKind][column 1][length 7][context 1] Can't augment a getter with a class.
+''');
   }
 
   test_class_augments_mixin() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 mixin A {}
+//    ^
+// [context 1] The declaration being augmented.
 augment class A {}
-''',
-      [
-        error(
-          diag.augmentationOfDifferentDeclarationKind,
-          11,
-          7,
-          contextMessages: [message(testFile, 6, 1)],
-        ),
-      ],
-    );
+// [diag.augmentationOfDifferentDeclarationKind][column 1][length 7][context 1] Can't augment a mixin with a class.
+''');
   }
 
   test_class_augments_setter() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 set foo(int _) {}
+//  ^^^
+// [context 1] The declaration being augmented.
 augment class foo {}
-''',
-      [
-        error(
-          diag.augmentationOfDifferentDeclarationKind,
-          18,
-          7,
-          contextMessages: [message(testFile, 4, 3)],
-        ),
-      ],
-    );
+// [diag.augmentationOfDifferentDeclarationKind][column 1][length 7][context 1] Can't augment a setter with a class.
+''');
   }
 
   test_class_augments_variable() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 int foo = 0;
+//  ^^^
+// [context 1] The declaration being augmented.
 augment class foo {}
-''',
-      [
-        error(
-          diag.augmentationOfDifferentDeclarationKind,
-          13,
-          7,
-          contextMessages: [message(testFile, 4, 3)],
-        ),
-      ],
-    );
+// [diag.augmentationOfDifferentDeclarationKind][column 1][length 7][context 1] Can't augment a top level variable with a class.
+''');
   }
 
   test_class_constructor_augments_constructor() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   A.foo();
 }
@@ -164,49 +109,37 @@
   }
 
   test_class_constructor_augments_staticField() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   static int foo = 0;
+//           ^^^
+// [context 1] The declaration being augmented.
 }
 augment class A {
   augment A.foo();
+//^^^^^^^
+// [diag.augmentationOfDifferentDeclarationKind][context 1] Can't augment a field with a constructor.
 }
-''',
-      [
-        error(
-          diag.augmentationOfDifferentDeclarationKind,
-          54,
-          7,
-          contextMessages: [message(testFile, 23, 3)],
-        ),
-      ],
-    );
+''');
   }
 
   test_class_constructor_augments_staticMethod() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   static void foo() {}
+//            ^^^
+// [context 1] The declaration being augmented.
 }
 augment class A {
   augment A.foo();
+//^^^^^^^
+// [diag.augmentationOfDifferentDeclarationKind][context 1] Can't augment a method with a constructor.
 }
-''',
-      [
-        error(
-          diag.augmentationOfDifferentDeclarationKind,
-          55,
-          7,
-          contextMessages: [message(testFile, 24, 3)],
-        ),
-      ],
-    );
+''');
   }
 
   test_class_instanceField_augments_instanceField() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   int foo = 0;
 }
@@ -217,34 +150,25 @@
   }
 
   test_class_instanceField_augments_instanceMethod() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   void foo() {}
+//     ^^^
+// [context 1] The declaration being augmented.
+// [context 2] The first definition of this name.
 }
 augment class A {
   augment int foo = 0;
+//^^^^^^^
+// [diag.augmentationOfDifferentDeclarationKind][context 1] Can't augment a method with a field.
+//            ^^^
+// [diag.duplicateDefinition][context 2] The name 'foo' is already defined.
 }
-''',
-      [
-        error(
-          diag.augmentationOfDifferentDeclarationKind,
-          48,
-          7,
-          contextMessages: [message(testFile, 17, 3)],
-        ),
-        error(
-          diag.duplicateDefinition,
-          60,
-          3,
-          contextMessages: [message(testFile, 17, 3)],
-        ),
-      ],
-    );
+''');
   }
 
   test_class_instanceGetter_augments_instanceField() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   int foo = 0;
 }
@@ -255,70 +179,52 @@
   }
 
   test_class_instanceGetter_augments_instanceMethod() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   void foo() {}
+//     ^^^
+// [context 1] The declaration being augmented.
 }
 augment class A {
   augment int get foo => 0;
+//^^^^^^^
+// [diag.augmentationOfDifferentDeclarationKind][context 1] Can't augment a method with a getter.
 }
-''',
-      [
-        error(
-          diag.augmentationOfDifferentDeclarationKind,
-          48,
-          7,
-          contextMessages: [message(testFile, 17, 3)],
-        ),
-      ],
-    );
+''');
   }
 
   test_class_instanceMethod_augments_instanceField() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   int foo = 0;
+//    ^^^
+// [context 1] The declaration being augmented.
 }
 augment class A {
   augment void foo() {}
+//^^^^^^^
+// [diag.augmentationOfDifferentDeclarationKind][context 1] Can't augment a field with a method.
 }
-''',
-      [
-        error(
-          diag.augmentationOfDifferentDeclarationKind,
-          47,
-          7,
-          contextMessages: [message(testFile, 16, 3)],
-        ),
-      ],
-    );
+''');
   }
 
   test_class_instanceMethod_augments_instanceGetter() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   int get foo => 0;
+//        ^^^
+// [context 1] The declaration being augmented.
 }
 augment class A {
   augment void foo() {}
+//^^^^^^^
+// [diag.augmentationOfDifferentDeclarationKind][context 1] Can't augment a getter with a method.
 }
-''',
-      [
-        error(
-          diag.augmentationOfDifferentDeclarationKind,
-          52,
-          7,
-          contextMessages: [message(testFile, 20, 3)],
-        ),
-      ],
-    );
+''');
   }
 
   test_class_instanceMethod_augments_instanceMethod() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   void foo() {}
 }
@@ -329,28 +235,22 @@
   }
 
   test_class_instanceMethod_augments_instanceSetter() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   set foo(int _) {}
+//    ^^^
+// [context 1] The declaration being augmented.
 }
 augment class A {
   augment void foo() {}
+//^^^^^^^
+// [diag.augmentationOfDifferentDeclarationKind][context 1] Can't augment a setter with a method.
 }
-''',
-      [
-        error(
-          diag.augmentationOfDifferentDeclarationKind,
-          52,
-          7,
-          contextMessages: [message(testFile, 16, 3)],
-        ),
-      ],
-    );
+''');
   }
 
   test_class_instanceSetter_augments_instanceField() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   int foo = 0;
 }
@@ -361,262 +261,186 @@
   }
 
   test_class_instanceSetter_augments_instanceMethod() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   void foo() {}
+//     ^^^
+// [context 1] The declaration being augmented.
 }
 augment class A {
   augment set foo(int _) {}
+//^^^^^^^
+// [diag.augmentationOfDifferentDeclarationKind][context 1] Can't augment a method with a setter.
 }
-''',
-      [
-        error(
-          diag.augmentationOfDifferentDeclarationKind,
-          48,
-          7,
-          contextMessages: [message(testFile, 17, 3)],
-        ),
-      ],
-    );
+''');
   }
 
   test_class_staticField_augments_constructor() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   A.foo();
+//  ^^^
+// [context 1] The declaration being augmented.
+// [diag.conflictingConstructorAndStaticField] 'foo' can't be used to name both a constructor and a static field in this class.
 }
 augment class A {
   augment static int foo = 0;
+//^^^^^^^
+// [diag.augmentationOfDifferentDeclarationKind][context 1] Can't augment a constructor with a field.
 }
-''',
-      [
-        error(diag.conflictingConstructorAndStaticField, 14, 3),
-        error(
-          diag.augmentationOfDifferentDeclarationKind,
-          43,
-          7,
-          contextMessages: [message(testFile, 14, 3)],
-        ),
-      ],
-    );
+''');
   }
 
   test_class_staticField_augments_staticMethod() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   static void foo() {}
+//            ^^^
+// [context 1] The declaration being augmented.
+// [context 2] The first definition of this name.
 }
 augment class A {
   augment static int foo = 0;
+//^^^^^^^
+// [diag.augmentationOfDifferentDeclarationKind][context 1] Can't augment a method with a field.
+//                   ^^^
+// [diag.duplicateDefinition][context 2] The name 'foo' is already defined.
 }
-''',
-      [
-        error(
-          diag.augmentationOfDifferentDeclarationKind,
-          55,
-          7,
-          contextMessages: [message(testFile, 24, 3)],
-        ),
-        error(
-          diag.duplicateDefinition,
-          74,
-          3,
-          contextMessages: [message(testFile, 24, 3)],
-        ),
-      ],
-    );
+''');
   }
 
   test_class_staticGetter_augments_constructor() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   A.foo();
+//  ^^^
+// [context 1] The declaration being augmented.
 }
 augment class A {
   augment static int get foo => 0;
+//^^^^^^^
+// [diag.augmentationOfDifferentDeclarationKind][context 1] Can't augment a constructor with a getter.
 }
-''',
-      [
-        error(
-          diag.augmentationOfDifferentDeclarationKind,
-          43,
-          7,
-          contextMessages: [message(testFile, 14, 3)],
-        ),
-      ],
-    );
+''');
   }
 
   test_class_staticGetter_augments_staticMethod() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   static void foo() {}
+//            ^^^
+// [context 1] The declaration being augmented.
 }
 augment class A {
   augment static int get foo => 0;
+//^^^^^^^
+// [diag.augmentationOfDifferentDeclarationKind][context 1] Can't augment a method with a getter.
 }
-''',
-      [
-        error(
-          diag.augmentationOfDifferentDeclarationKind,
-          55,
-          7,
-          contextMessages: [message(testFile, 24, 3)],
-        ),
-      ],
-    );
+''');
   }
 
   test_class_staticMethod_augments_constructor() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   A.foo();
+//  ^^^
+// [context 1] The declaration being augmented.
 }
 augment class A {
   augment static void foo() {}
+//^^^^^^^
+// [diag.augmentationOfDifferentDeclarationKind][context 1] Can't augment a constructor with a method.
 }
-''',
-      [
-        error(
-          diag.augmentationOfDifferentDeclarationKind,
-          43,
-          7,
-          contextMessages: [message(testFile, 14, 3)],
-        ),
-      ],
-    );
+''');
   }
 
   test_class_staticMethod_augments_staticField() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   static int foo = 0;
+//           ^^^
+// [context 1] The declaration being augmented.
 }
 augment class A {
   augment static void foo() {}
+//^^^^^^^
+// [diag.augmentationOfDifferentDeclarationKind][context 1] Can't augment a field with a method.
 }
-''',
-      [
-        error(
-          diag.augmentationOfDifferentDeclarationKind,
-          54,
-          7,
-          contextMessages: [message(testFile, 23, 3)],
-        ),
-      ],
-    );
+''');
   }
 
   test_class_staticMethod_augments_staticGetter() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   static int get foo => 0;
+//               ^^^
+// [context 1] The declaration being augmented.
 }
 augment class A {
   augment static void foo() {}
+//^^^^^^^
+// [diag.augmentationOfDifferentDeclarationKind][context 1] Can't augment a getter with a method.
 }
-''',
-      [
-        error(
-          diag.augmentationOfDifferentDeclarationKind,
-          59,
-          7,
-          contextMessages: [message(testFile, 27, 3)],
-        ),
-      ],
-    );
+''');
   }
 
   test_class_staticMethod_augments_staticSetter() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   static set foo(int _) {}
+//           ^^^
+// [context 1] The declaration being augmented.
 }
 augment class A {
   augment static void foo() {}
+//^^^^^^^
+// [diag.augmentationOfDifferentDeclarationKind][context 1] Can't augment a setter with a method.
 }
-''',
-      [
-        error(
-          diag.augmentationOfDifferentDeclarationKind,
-          59,
-          7,
-          contextMessages: [message(testFile, 23, 3)],
-        ),
-      ],
-    );
+''');
   }
 
   test_class_staticSetter_augments_constructor() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   A.foo();
+//  ^^^
+// [context 1] The declaration being augmented.
 }
 augment class A {
   augment static set foo(int _) {}
+//^^^^^^^
+// [diag.augmentationOfDifferentDeclarationKind][context 1] Can't augment a constructor with a setter.
 }
-''',
-      [
-        error(
-          diag.augmentationOfDifferentDeclarationKind,
-          43,
-          7,
-          contextMessages: [message(testFile, 14, 3)],
-        ),
-      ],
-    );
+''');
   }
 
   test_class_staticSetter_augments_staticMethod() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   static void foo() {}
+//            ^^^
+// [context 1] The declaration being augmented.
 }
 augment class A {
   augment static set foo(int _) {}
+//^^^^^^^
+// [diag.augmentationOfDifferentDeclarationKind][context 1] Can't augment a method with a setter.
 }
-''',
-      [
-        error(
-          diag.augmentationOfDifferentDeclarationKind,
-          55,
-          7,
-          contextMessages: [message(testFile, 24, 3)],
-        ),
-      ],
-    );
+''');
   }
 
   test_enum_augments_class() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {}
+//    ^
+// [context 1] The declaration being augmented.
 augment enum A {}
-''',
-      [
-        error(
-          diag.augmentationOfDifferentDeclarationKind,
-          11,
-          7,
-          contextMessages: [message(testFile, 6, 1)],
-        ),
-      ],
-    );
+// [diag.augmentationOfDifferentDeclarationKind][column 1][length 7][context 1] Can't augment a class with a enum.
+''');
   }
 
   test_enum_constant_augments_constant() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 enum A {
   foo
 }
@@ -627,153 +451,101 @@
   }
 
   test_enum_constant_augments_instanceMethod() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 enum A {
   v;
   void foo() {}
 }
 augment enum A {
   augment foo(),
+//^^^^^^^
+// [diag.augmentationWithoutDeclaration] The declaration being augmented doesn't exist.
+//        ^^^
+// [diag.conflictingStaticAndInstance] Class 'A' can't define static member 'foo' and have instance member 'A.foo' with the same name.
 }
-''',
-      [
-        error(diag.augmentationWithoutDeclaration, 51, 7),
-        error(diag.conflictingStaticAndInstance, 59, 3),
-      ],
-    );
+''');
   }
 
   test_enum_staticMethod_augments_constant() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 enum A {
   foo
+//^^^
+// [context 1] The declaration being augmented.
 }
 augment enum A {;
   augment static void foo() {}
+//^^^^^^^
+// [diag.augmentationOfDifferentDeclarationKind][context 1] Can't augment a field with a method.
 }
-''',
-      [
-        error(
-          diag.augmentationOfDifferentDeclarationKind,
-          37,
-          7,
-          contextMessages: [message(testFile, 11, 3)],
-        ),
-      ],
-    );
+''');
   }
 
   test_extension_augments_class() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {}
+//    ^
+// [context 1] The declaration being augmented.
 augment extension A {}
-''',
-      [
-        error(
-          diag.augmentationOfDifferentDeclarationKind,
-          11,
-          7,
-          contextMessages: [message(testFile, 6, 1)],
-        ),
-      ],
-    );
+// [diag.augmentationOfDifferentDeclarationKind][column 1][length 7][context 1] Can't augment a class with a extension.
+''');
   }
 
   test_extensionType_augments_class() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {}
+//    ^
+// [context 1] The declaration being augmented.
 augment extension type A(int it) {}
-''',
-      [
-        error(
-          diag.augmentationOfDifferentDeclarationKind,
-          11,
-          7,
-          contextMessages: [message(testFile, 6, 1)],
-        ),
-      ],
-    );
+// [diag.augmentationOfDifferentDeclarationKind][column 1][length 7][context 1] Can't augment a class with a extension type.
+''');
   }
 
   test_function_augments_class() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {}
+//    ^
+// [context 1] The declaration being augmented.
 augment void A() {}
-''',
-      [
-        error(
-          diag.augmentationOfDifferentDeclarationKind,
-          11,
-          7,
-          contextMessages: [message(testFile, 6, 1)],
-        ),
-      ],
-    );
+// [diag.augmentationOfDifferentDeclarationKind][column 1][length 7][context 1] Can't augment a class with a function.
+''');
   }
 
   test_mixin_augments_class() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {}
+//    ^
+// [context 1] The declaration being augmented.
 augment mixin A {}
-''',
-      [
-        error(
-          diag.augmentationOfDifferentDeclarationKind,
-          11,
-          7,
-          contextMessages: [message(testFile, 6, 1)],
-        ),
-      ],
-    );
+// [diag.augmentationOfDifferentDeclarationKind][column 1][length 7][context 1] Can't augment a class with a mixin.
+''');
   }
 
   test_typedef_augments_class() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {}
 augment typedef A = int;
-''',
-      [error(diag.typedefAugmentation, 11, 7)],
-    );
+// [diag.typedefAugmentation][column 1][length 7] Type aliases can't be augmented.
+''');
   }
 
   test_variable_augments_class() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {}
+//    ^
+// [context 1] The declaration being augmented.
 augment int A = 0;
-''',
-      [
-        error(
-          diag.augmentationOfDifferentDeclarationKind,
-          11,
-          7,
-          contextMessages: [message(testFile, 6, 1)],
-        ),
-      ],
-    );
+// [diag.augmentationOfDifferentDeclarationKind][column 1][length 7][context 1] Can't augment a class with a top level variable.
+''');
   }
 
   test_variable_augments_function() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 void foo() {}
+//   ^^^
+// [context 1] The declaration being augmented.
 augment int foo = 0;
-''',
-      [
-        error(
-          diag.augmentationOfDifferentDeclarationKind,
-          14,
-          7,
-          contextMessages: [message(testFile, 5, 3)],
-        ),
-      ],
-    );
+// [diag.augmentationOfDifferentDeclarationKind][column 1][length 7][context 1] Can't augment a function with a top level variable.
+''');
   }
 }
diff --git a/pkg/analyzer/test/src/diagnostics/augmentation_of_mixin_application_class_test.dart b/pkg/analyzer/test/src/diagnostics/augmentation_of_mixin_application_class_test.dart
index 7136b9d..9dd3323 100644
--- a/pkg/analyzer/test/src/diagnostics/augmentation_of_mixin_application_class_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/augmentation_of_mixin_application_class_test.dart
@@ -2,35 +2,29 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/src/diagnostic/diagnostic.dart' as diag;
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../dart/resolution/context_collection_resolution.dart';
+import '../dart/resolution/node_text_expectations.dart';
 
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(AugmentationOfMixinApplicationClassTest);
+    defineReflectiveTests(UpdateNodeTextExpectations);
   });
 }
 
 @reflectiveTest
 class AugmentationOfMixinApplicationClassTest extends PubPackageResolutionTest {
   test_class() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {}
 mixin M {}
 class C = A with M;
+//    ^
+// [context 1] The declaration being augmented.
 augment class C {}
-''',
-      [
-        error(
-          diag.augmentationOfMixinApplicationClass,
-          42,
-          7,
-          contextMessages: [message(testFile, 28, 1)],
-        ),
-      ],
-    );
+// [diag.augmentationOfMixinApplicationClass][column 1][length 7][context 1] Mixin application classes can't be augmented.
+''');
   }
 }
diff --git a/pkg/analyzer/test/src/diagnostics/augmentation_return_type_mismatch_test.dart b/pkg/analyzer/test/src/diagnostics/augmentation_return_type_mismatch_test.dart
new file mode 100644
index 0000000..0bae814
--- /dev/null
+++ b/pkg/analyzer/test/src/diagnostics/augmentation_return_type_mismatch_test.dart
@@ -0,0 +1,248 @@
+// Copyright (c) 2026, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analyzer/src/diagnostic/diagnostic.dart' as diag;
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../dart/resolution/context_collection_resolution.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(AugmentationReturnTypeMismatchTest);
+  });
+}
+
+@reflectiveTest
+class AugmentationReturnTypeMismatchTest extends PubPackageResolutionTest {
+  test_class_getter_int_String() async {
+    await assertErrorsInCode(
+      r'''
+class A {
+  int get foo => 0;
+}
+
+augment class A {
+  augment String get foo => '';
+}
+''',
+      [
+        error(diag.augmentationReturnTypeMismatch, 61, 6),
+        error(diag.returnOfInvalidTypeFromFunction, 79, 2),
+      ],
+    );
+  }
+
+  test_class_method_void_int() async {
+    await assertErrorsInCode(
+      r'''
+class A {
+  void foo() {}
+}
+
+augment class A {
+  augment int foo() => 0;
+}
+''',
+      [error(diag.augmentationReturnTypeMismatch, 57, 3)],
+    );
+  }
+
+  test_class_method_void_void() async {
+    await assertNoErrorsInCode(r'''
+class A {
+  void foo() {}
+}
+
+augment class A {
+  augment void foo() {}
+}
+''');
+  }
+
+  test_extension_getter_int_String() async {
+    await assertErrorsInCode(
+      r'''
+extension E on int {
+  int get foo => 0;
+}
+
+augment extension E {
+  augment String get foo => '';
+}
+''',
+      [
+        error(diag.augmentationReturnTypeMismatch, 76, 6),
+        error(diag.returnOfInvalidTypeFromFunction, 94, 2),
+      ],
+    );
+  }
+
+  test_extension_method_void_int() async {
+    await assertErrorsInCode(
+      r'''
+extension E on int {
+  void foo() {}
+}
+
+augment extension E {
+  augment int foo() => 0;
+}
+''',
+      [error(diag.augmentationReturnTypeMismatch, 72, 3)],
+    );
+  }
+
+  test_extensionType_getter_int_String() async {
+    await assertErrorsInCode(
+      r'''
+extension type A(int it) {
+  int get foo => 0;
+}
+
+augment extension type A(int it) {
+  augment String get foo => '';
+}
+''',
+      [
+        error(diag.augmentationReturnTypeMismatch, 95, 6),
+        error(diag.returnOfInvalidTypeFromFunction, 113, 2),
+      ],
+    );
+  }
+
+  test_extensionType_method_void_int() async {
+    await assertErrorsInCode(
+      r'''
+extension type A(int it) {
+  void foo() {}
+}
+
+augment extension type A(int it) {
+  augment int foo() => 0;
+}
+''',
+      [error(diag.augmentationReturnTypeMismatch, 91, 3)],
+    );
+  }
+
+  test_mixin_getter_int_String() async {
+    await assertErrorsInCode(
+      r'''
+mixin M {
+  int get foo => 0;
+}
+
+augment mixin M {
+  augment String get foo => '';
+}
+''',
+      [
+        error(diag.augmentationReturnTypeMismatch, 61, 6),
+        error(diag.returnOfInvalidTypeFromFunction, 79, 2),
+      ],
+    );
+  }
+
+  test_mixin_method_void_int() async {
+    await assertErrorsInCode(
+      r'''
+mixin M {
+  void foo() {}
+}
+
+augment mixin M {
+  augment int foo() => 0;
+}
+''',
+      [error(diag.augmentationReturnTypeMismatch, 57, 3)],
+    );
+  }
+
+  test_topLevelFunction_int_int_withImportPrefix() async {
+    await assertNoErrorsInCode(r'''
+import 'dart:core';
+import 'dart:core' as core;
+
+int foo() => 0;
+
+augment core.int foo() => 0;
+''');
+  }
+
+  test_topLevelFunction_void_int() async {
+    await assertErrorsInCode(
+      r'''
+void foo() {}
+
+augment int foo() => 0;
+''',
+      [error(diag.augmentationReturnTypeMismatch, 23, 3)],
+    );
+  }
+
+  test_topLevelFunction_void_int_viaTypeAlias() async {
+    await assertErrorsInCode(
+      r'''
+typedef IntAlias = int;
+
+void foo() {}
+
+augment IntAlias foo() => 0;
+''',
+      [error(diag.augmentationReturnTypeMismatch, 48, 8)],
+    );
+  }
+
+  test_topLevelFunction_void_int_withImportPrefix() async {
+    await assertErrorsInCode(
+      r'''
+import 'dart:core' as core;
+void foo() {}
+
+augment core.int foo() => 0;
+''',
+      [error(diag.augmentationReturnTypeMismatch, 51, 8)],
+    );
+  }
+
+  test_topLevelFunction_void_nothing() async {
+    await assertNoErrorsInCode(r'''
+void foo() {}
+
+augment foo() {}
+''');
+  }
+
+  test_topLevelFunction_void_void() async {
+    await assertNoErrorsInCode(r'''
+void foo() {}
+
+augment void foo() {}
+''');
+  }
+
+  test_topLevelFunction_void_void_viaTypeAlias() async {
+    await assertNoErrorsInCode(r'''
+typedef VoidAlias = void;
+
+void foo() {}
+
+augment VoidAlias foo() {}
+''');
+  }
+
+  test_topLevelGetter_int_String() async {
+    await assertErrorsInCode(
+      r'''
+int get foo => 0;
+
+augment String get foo => '';
+''',
+      [
+        error(diag.augmentationReturnTypeMismatch, 27, 6),
+        error(diag.returnOfInvalidTypeFromFunction, 45, 2),
+      ],
+    );
+  }
+}
diff --git a/pkg/analyzer/test/src/diagnostics/augmentation_type_parameter_bound_test.dart b/pkg/analyzer/test/src/diagnostics/augmentation_type_parameter_bound_test.dart
index 6ec7cf9..b813650 100644
--- a/pkg/analyzer/test/src/diagnostics/augmentation_type_parameter_bound_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/augmentation_type_parameter_bound_test.dart
@@ -2,150 +2,280 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/src/diagnostic/diagnostic.dart' as diag;
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../dart/resolution/context_collection_resolution.dart';
+import '../dart/resolution/node_text_expectations.dart';
 
 main() {
   defineReflectiveSuite(() {
-    // TODO(scheglov): implement augmentation
-    // defineReflectiveTests(AugmentationTypeParameterBoundTest);
+    defineReflectiveTests(AugmentationTypeParameterBoundTest);
+    defineReflectiveTests(UpdateNodeTextExpectations);
   });
 }
 
 @reflectiveTest
 class AugmentationTypeParameterBoundTest extends PubPackageResolutionTest {
-  test_class_nothing_num() async {
-    newFile('$testPackageLibPath/a.dart', r'''
-part 'test.dart';
-
-class A<T> {}
+  test_class_method_nothing_num() async {
+    await resolveTestCodeWithDiagnostics(r'''
+class A {
+  void foo<T>() {}
+  augment void foo<T extends num>();
+//                           ^^^
+// [diag.augmentationTypeParameterBound] The augmentation type parameter must have the same bound as the corresponding type parameter of the declaration.
+}
 ''');
+  }
 
-    await assertErrorsInCode(
-      r'''
-part of 'a.dart';
+  test_class_method_num_int() async {
+    await resolveTestCodeWithDiagnostics(r'''
+class A {
+  void foo<T extends num>() {}
+  augment void foo<T extends int>();
+//                           ^^^
+// [diag.augmentationTypeParameterBound] The augmentation type parameter must have the same bound as the corresponding type parameter of the declaration.
+}
+''');
+  }
 
+  test_class_method_num_nothing() async {
+    await resolveTestCodeWithDiagnostics(r'''
+class A {
+  void foo<T extends num>() {}
+  augment void foo<T>();
+}
+''');
+  }
+
+  test_class_nothing_num() async {
+    await resolveTestCodeWithDiagnostics(r'''
+class A<T> {}
 augment class A<T extends num> {}
-''',
-      [error(diag.augmentationTypeParameterBound, 45, 3)],
-    );
+//                        ^^^
+// [diag.augmentationTypeParameterBound] The augmentation type parameter must have the same bound as the corresponding type parameter of the declaration.
+''');
+  }
+
+  test_class_num_int() async {
+    await resolveTestCodeWithDiagnostics(r'''
+class A<T extends num> {}
+augment class A<T extends int> {}
+//                        ^^^
+// [diag.augmentationTypeParameterBound] The augmentation type parameter must have the same bound as the corresponding type parameter of the declaration.
+''');
   }
 
   test_class_num_nothing() async {
-    newFile('$testPackageLibPath/a.dart', r'''
-part 'test.dart';
-
+    await resolveTestCodeWithDiagnostics(r'''
 class A<T extends num> {}
-''');
-
-    await assertErrorsInCode(
-      r'''
-part of 'a.dart';
-
 augment class A<T> {}
-''',
-      [error(diag.augmentationTypeParameterBound, 35, 1)],
-    );
+''');
   }
 
   test_class_num_num() async {
-    newFile('$testPackageLibPath/a.dart', r'''
-part 'test.dart';
+    await resolveTestCodeWithDiagnostics(r'''
+class A<T extends num> {}
+augment class A<T extends num> {}
+''');
+  }
+
+  test_class_num_num_viaTypeAlias() async {
+    await resolveTestCodeWithDiagnostics(r'''
+typedef N = num;
 
 class A<T extends num> {}
+augment class A<T extends N> {}
 ''');
+  }
 
-    await assertNoErrorsInCode(r'''
-part of 'a.dart';
+  test_class_num_num_withImportPrefix() async {
+    await resolveTestCodeWithDiagnostics(r'''
+import 'dart:core';
+import 'dart:core' as core;
 
-augment class A<T extends num> {}
+class A<T extends num> {}
+augment class A<T extends core.num> {}
 ''');
   }
 
   test_class_num_Object() async {
-    newFile('$testPackageLibPath/a.dart', r'''
-part 'test.dart';
-
+    await resolveTestCodeWithDiagnostics(r'''
 class A<T extends num> {}
-''');
-
-    await assertErrorsInCode(
-      r'''
-part of 'a.dart';
-
 augment class A<T extends Object> {}
-''',
-      [error(diag.augmentationTypeParameterBound, 45, 6)],
-    );
+//                        ^^^^^^
+// [diag.augmentationTypeParameterBound] The augmentation type parameter must have the same bound as the corresponding type parameter of the declaration.
+''');
   }
 
   test_enum_nothing_num() async {
-    newFile('$testPackageLibPath/a.dart', r'''
-part 'test.dart';
-
+    await resolveTestCodeWithDiagnostics(r'''
 enum A<T> {v}
-''');
-
-    await assertErrorsInCode(
-      r'''
-part of 'a.dart';
-
 augment enum A<T extends num> {}
-''',
-      [error(diag.augmentationTypeParameterBound, 44, 3)],
-    );
+//                       ^^^
+// [diag.augmentationTypeParameterBound] The augmentation type parameter must have the same bound as the corresponding type parameter of the declaration.
+''');
+  }
+
+  test_enum_num_int() async {
+    await resolveTestCodeWithDiagnostics(r'''
+enum A<T extends num> {v}
+augment enum A<T extends int> {}
+//                       ^^^
+// [diag.augmentationTypeParameterBound] The augmentation type parameter must have the same bound as the corresponding type parameter of the declaration.
+''');
+  }
+
+  test_enum_num_nothing() async {
+    await resolveTestCodeWithDiagnostics(r'''
+enum A<T extends num> {v}
+augment enum A<T> {}
+''');
+  }
+
+  test_enum_num_num() async {
+    await resolveTestCodeWithDiagnostics(r'''
+enum A<T extends num> {v}
+augment enum A<T extends num> {}
+''');
   }
 
   test_extension_nothing_num() async {
-    newFile('$testPackageLibPath/a.dart', r'''
-part 'test.dart';
-
+    await resolveTestCodeWithDiagnostics(r'''
 extension A<T> on int {}
-''');
-
-    await assertErrorsInCode(
-      r'''
-part of 'a.dart';
-
 augment extension A<T extends num> {}
-''',
-      [error(diag.augmentationTypeParameterBound, 49, 3)],
-    );
+//                            ^^^
+// [diag.augmentationTypeParameterBound] The augmentation type parameter must have the same bound as the corresponding type parameter of the declaration.
+''');
+  }
+
+  test_extension_num_int() async {
+    await resolveTestCodeWithDiagnostics(r'''
+extension A<T extends num> on int {}
+augment extension A<T extends int> {}
+//                            ^^^
+// [diag.augmentationTypeParameterBound] The augmentation type parameter must have the same bound as the corresponding type parameter of the declaration.
+''');
+  }
+
+  test_extension_num_nothing() async {
+    await resolveTestCodeWithDiagnostics(r'''
+extension A<T extends num> on int {}
+augment extension A<T> {}
+''');
+  }
+
+  test_extension_num_num() async {
+    await resolveTestCodeWithDiagnostics(r'''
+extension A<T extends num> on int {}
+augment extension A<T extends num> {}
+''');
   }
 
   test_extensionType_nothing_num() async {
-    newFile('$testPackageLibPath/a.dart', r'''
-part 'test.dart';
-
+    await resolveTestCodeWithDiagnostics(r'''
 extension type A<T>(int it) {}
-''');
-
-    await assertErrorsInCode(
-      r'''
-part of 'a.dart';
-
 augment extension type A<T extends num>(int it) {}
-''',
-      [error(diag.augmentationTypeParameterBound, 54, 3)],
-    );
+//                                 ^^^
+// [diag.augmentationTypeParameterBound] The augmentation type parameter must have the same bound as the corresponding type parameter of the declaration.
+''');
+  }
+
+  test_extensionType_num_int() async {
+    await resolveTestCodeWithDiagnostics(r'''
+extension type A<T extends num>(int it) {}
+augment extension type A<T extends int>(int it) {}
+//                                 ^^^
+// [diag.augmentationTypeParameterBound] The augmentation type parameter must have the same bound as the corresponding type parameter of the declaration.
+''');
+  }
+
+  test_extensionType_num_nothing() async {
+    await resolveTestCodeWithDiagnostics(r'''
+extension type A<T extends num>(int it) {}
+augment extension type A<T>(int it) {}
+''');
+  }
+
+  test_extensionType_num_num() async {
+    await resolveTestCodeWithDiagnostics(r'''
+extension type A<T extends num>(int it) {}
+augment extension type A<T extends num>(int it) {}
+''');
   }
 
   test_mixin_nothing_num() async {
-    newFile('$testPackageLibPath/a.dart', r'''
-part 'test.dart';
-
+    await resolveTestCodeWithDiagnostics(r'''
 mixin A<T> {}
-''');
-
-    await assertErrorsInCode(
-      r'''
-part of 'a.dart';
-
 augment mixin A<T extends num> {}
-''',
-      [error(diag.augmentationTypeParameterBound, 45, 3)],
-    );
+//                        ^^^
+// [diag.augmentationTypeParameterBound] The augmentation type parameter must have the same bound as the corresponding type parameter of the declaration.
+''');
+  }
+
+  test_mixin_num_int() async {
+    await resolveTestCodeWithDiagnostics(r'''
+mixin A<T extends num> {}
+augment mixin A<T extends int> {}
+//                        ^^^
+// [diag.augmentationTypeParameterBound] The augmentation type parameter must have the same bound as the corresponding type parameter of the declaration.
+''');
+  }
+
+  test_mixin_num_nothing() async {
+    await resolveTestCodeWithDiagnostics(r'''
+mixin A<T extends num> {}
+augment mixin A<T> {}
+''');
+  }
+
+  test_mixin_num_num() async {
+    await resolveTestCodeWithDiagnostics(r'''
+mixin A<T extends num> {}
+augment mixin A<T extends num> {}
+''');
+  }
+
+  test_topLevelFunction_nothing_num() async {
+    await resolveTestCodeWithDiagnostics(r'''
+void foo<T>() {}
+augment void foo<T extends num>();
+//                         ^^^
+// [diag.augmentationTypeParameterBound] The augmentation type parameter must have the same bound as the corresponding type parameter of the declaration.
+''');
+  }
+
+  test_topLevelFunction_num_int() async {
+    await resolveTestCodeWithDiagnostics(r'''
+void foo<T extends num>() {}
+augment void foo<T extends int>();
+//                         ^^^
+// [diag.augmentationTypeParameterBound] The augmentation type parameter must have the same bound as the corresponding type parameter of the declaration.
+''');
+  }
+
+  test_topLevelFunction_num_nothing() async {
+    await resolveTestCodeWithDiagnostics(r'''
+void foo<T extends num>() {}
+augment void foo<T>();
+''');
+  }
+
+  test_topLevelFunction_num_num_viaTypeAlias() async {
+    await resolveTestCodeWithDiagnostics(r'''
+typedef N = num;
+
+void foo<T extends num>() {}
+augment void foo<T extends N>();
+''');
+  }
+
+  test_topLevelFunction_num_num_withImportPrefix() async {
+    await resolveTestCodeWithDiagnostics(r'''
+import 'dart:core';
+import 'dart:core' as core;
+
+void foo<T extends num>() {}
+augment void foo<T extends core.num>();
+''');
   }
 }
diff --git a/pkg/analyzer/test/src/diagnostics/augmentation_type_parameter_count_test.dart b/pkg/analyzer/test/src/diagnostics/augmentation_type_parameter_count_test.dart
index bd8ad6e..e686de1 100644
--- a/pkg/analyzer/test/src/diagnostics/augmentation_type_parameter_count_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/augmentation_type_parameter_count_test.dart
@@ -2,7 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/src/diagnostic/diagnostic.dart' as diag;
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../dart/resolution/context_collection_resolution.dart';
@@ -18,13 +17,12 @@
 @reflectiveTest
 class AugmentationTypeParameterCountTest extends PubPackageResolutionTest {
   test_class_0_1() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {}
 augment class A<T> {}
-''',
-      [error(diag.augmentationTypeParameterCount, 27, 1)],
-    );
+//              ^
+// [diag.augmentationTypeParameterCount] The augmentation must have the same number of type parameters as the declaration.
+''');
     var node = findNode.classDeclaration('augment class A');
     assertResolvedNodeText(node, r'''
 ClassDeclaration
@@ -48,13 +46,12 @@
   }
 
   test_class_1_0() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A<T> {}
 augment class A {}
-''',
-      [error(diag.augmentationTypeParameterCount, 28, 1)],
-    );
+//            ^
+// [diag.augmentationTypeParameterCount] The augmentation must have the same number of type parameters as the declaration.
+''');
     var node = findNode.classDeclaration('augment class A');
     assertResolvedNodeText(node, r'''
 ClassDeclaration
@@ -70,7 +67,7 @@
   }
 
   test_class_1_1() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A<T> {}
 augment class A<T> {}
 ''');
@@ -97,13 +94,12 @@
   }
 
   test_class_1_2() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A<T> {}
 augment class A<T, U> {}
-''',
-      [error(diag.augmentationTypeParameterCount, 33, 1)],
-    );
+//                 ^
+// [diag.augmentationTypeParameterCount] The augmentation must have the same number of type parameters as the declaration.
+''');
     var node = findNode.classDeclaration('augment class A');
     assertResolvedNodeText(node, r'''
 ClassDeclaration
@@ -131,13 +127,12 @@
   }
 
   test_class_1_3() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A<T> {}
 augment class A<T, U, V> {}
-''',
-      [error(diag.augmentationTypeParameterCount, 33, 1)],
-    );
+//                 ^
+// [diag.augmentationTypeParameterCount] The augmentation must have the same number of type parameters as the declaration.
+''');
     var node = findNode.classDeclaration('augment class A');
     assertResolvedNodeText(node, r'''
 ClassDeclaration
@@ -169,13 +164,12 @@
   }
 
   test_class_2_1() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A<T, U> {}
 augment class A<T> {}
-''',
-      [error(diag.augmentationTypeParameterCount, 34, 1)],
-    );
+//               ^
+// [diag.augmentationTypeParameterCount] The augmentation must have the same number of type parameters as the declaration.
+''');
     var node = findNode.classDeclaration('augment class A');
     assertResolvedNodeText(node, r'''
 ClassDeclaration
@@ -199,17 +193,16 @@
   }
 
   test_class_method_0_1() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   void foo() {}
 }
 augment class A {
   augment void foo<T>();
+//                 ^
+// [diag.augmentationTypeParameterCount] The augmentation must have the same number of type parameters as the declaration.
 }
-''',
-      [error(diag.augmentationTypeParameterCount, 65, 1)],
-    );
+''');
     var node = findNode.methodDeclaration('augment void foo');
     assertResolvedNodeText(node, r'''
 MethodDeclaration
@@ -239,7 +232,7 @@
   }
 
   test_class_method_1_1() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   void foo<T>() {}
 }
@@ -276,17 +269,16 @@
   }
 
   test_class_method_1_2() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   void foo<T>() {}
 }
 augment class A {
   augment void foo<T, U>();
+//                    ^
+// [diag.augmentationTypeParameterCount] The augmentation must have the same number of type parameters as the declaration.
 }
-''',
-      [error(diag.augmentationTypeParameterCount, 71, 1)],
-    );
+''');
     var node = findNode.methodDeclaration('augment void foo');
     assertResolvedNodeText(node, r'''
 MethodDeclaration
@@ -320,13 +312,12 @@
   }
 
   test_enum_0_1() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 enum A {v}
 augment enum A<T> {}
-''',
-      [error(diag.augmentationTypeParameterCount, 26, 1)],
-    );
+//             ^
+// [diag.augmentationTypeParameterCount] The augmentation must have the same number of type parameters as the declaration.
+''');
     var node = findNode.enumDeclaration('augment enum A');
     assertResolvedNodeText(node, r'''
 EnumDeclaration
@@ -350,13 +341,12 @@
   }
 
   test_enum_1_0() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 enum A<T> {v}
 augment enum A {}
-''',
-      [error(diag.augmentationTypeParameterCount, 27, 1)],
-    );
+//           ^
+// [diag.augmentationTypeParameterCount] The augmentation must have the same number of type parameters as the declaration.
+''');
     var node = findNode.enumDeclaration('augment enum A');
     assertResolvedNodeText(node, r'''
 EnumDeclaration
@@ -372,7 +362,7 @@
   }
 
   test_enum_1_1() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 enum A<T> {v}
 augment enum A <T>{}
 ''');
@@ -399,13 +389,12 @@
   }
 
   test_enum_1_2() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 enum A<T> {v}
 augment enum A<T, U> {}
-''',
-      [error(diag.augmentationTypeParameterCount, 32, 1)],
-    );
+//                ^
+// [diag.augmentationTypeParameterCount] The augmentation must have the same number of type parameters as the declaration.
+''');
     var node = findNode.enumDeclaration('augment enum A');
     assertResolvedNodeText(node, r'''
 EnumDeclaration
@@ -433,13 +422,12 @@
   }
 
   test_enum_2_1() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 enum A<T, U> {v}
 augment enum A<T> {}
-''',
-      [error(diag.augmentationTypeParameterCount, 33, 1)],
-    );
+//              ^
+// [diag.augmentationTypeParameterCount] The augmentation must have the same number of type parameters as the declaration.
+''');
     var node = findNode.enumDeclaration('augment enum A');
     assertResolvedNodeText(node, r'''
 EnumDeclaration
@@ -463,13 +451,12 @@
   }
 
   test_extension_0_1() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 extension A on int {}
 augment extension A<T> {}
-''',
-      [error(diag.augmentationTypeParameterCount, 42, 1)],
-    );
+//                  ^
+// [diag.augmentationTypeParameterCount] The augmentation must have the same number of type parameters as the declaration.
+''');
     var node = findNode.extensionDeclaration('augment extension A');
     assertResolvedNodeText(node, r'''
 ExtensionDeclaration
@@ -492,13 +479,12 @@
   }
 
   test_extension_1_0() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 extension A<T> on int {}
 augment extension A {}
-''',
-      [error(diag.augmentationTypeParameterCount, 43, 1)],
-    );
+//                ^
+// [diag.augmentationTypeParameterCount] The augmentation must have the same number of type parameters as the declaration.
+''');
     var node = findNode.extensionDeclaration('augment extension A');
     assertResolvedNodeText(node, r'''
 ExtensionDeclaration
@@ -513,7 +499,7 @@
   }
 
   test_extension_1_1() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 extension A<T> on int {}
 augment extension A<T> {}
 ''');
@@ -539,13 +525,12 @@
   }
 
   test_extension_1_2() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 extension A<T> on int {}
 augment extension A<T, U> {}
-''',
-      [error(diag.augmentationTypeParameterCount, 48, 1)],
-    );
+//                     ^
+// [diag.augmentationTypeParameterCount] The augmentation must have the same number of type parameters as the declaration.
+''');
     var node = findNode.extensionDeclaration('augment extension A');
     assertResolvedNodeText(node, r'''
 ExtensionDeclaration
@@ -572,13 +557,12 @@
   }
 
   test_extension_2_1() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 extension A<T, U> on int {}
 augment extension A<T> {}
-''',
-      [error(diag.augmentationTypeParameterCount, 49, 1)],
-    );
+//                   ^
+// [diag.augmentationTypeParameterCount] The augmentation must have the same number of type parameters as the declaration.
+''');
     var node = findNode.extensionDeclaration('augment extension A');
     assertResolvedNodeText(node, r'''
 ExtensionDeclaration
@@ -601,13 +585,12 @@
   }
 
   test_extensionType_0_1() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 extension type A(int it) {}
 augment extension type A<T>(int it) {}
-''',
-      [error(diag.augmentationTypeParameterCount, 53, 1)],
-    );
+//                       ^
+// [diag.augmentationTypeParameterCount] The augmentation must have the same number of type parameters as the declaration.
+''');
     var node = findNode.extensionTypeDeclaration('augment extension type A');
     assertResolvedNodeText(node, r'''
 ExtensionTypeDeclaration
@@ -648,13 +631,12 @@
   }
 
   test_extensionType_1_0() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 extension type A<T>(int it) {}
 augment extension type A(int it) {}
-''',
-      [error(diag.augmentationTypeParameterCount, 54, 1)],
-    );
+//                     ^
+// [diag.augmentationTypeParameterCount] The augmentation must have the same number of type parameters as the declaration.
+''');
     var node = findNode.extensionTypeDeclaration('augment extension type A');
     assertResolvedNodeText(node, r'''
 ExtensionTypeDeclaration
@@ -687,7 +669,7 @@
   }
 
   test_extensionType_1_1() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 extension type A<T>(int it) {}
 augment extension type A<T>(int it) {}
 ''');
@@ -731,13 +713,12 @@
   }
 
   test_extensionType_1_2() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 extension type A<T>(int it) {}
 augment extension type A<T, U>(int it) {}
-''',
-      [error(diag.augmentationTypeParameterCount, 59, 1)],
-    );
+//                          ^
+// [diag.augmentationTypeParameterCount] The augmentation must have the same number of type parameters as the declaration.
+''');
     var node = findNode.extensionTypeDeclaration('augment extension type A');
     assertResolvedNodeText(node, r'''
 ExtensionTypeDeclaration
@@ -782,13 +763,12 @@
   }
 
   test_extensionType_2_1() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 extension type A<T, U>(int it) {}
 augment extension type A<T>(int it) {}
-''',
-      [error(diag.augmentationTypeParameterCount, 60, 1)],
-    );
+//                        ^
+// [diag.augmentationTypeParameterCount] The augmentation must have the same number of type parameters as the declaration.
+''');
     var node = findNode.extensionTypeDeclaration('augment extension type A');
     assertResolvedNodeText(node, r'''
 ExtensionTypeDeclaration
@@ -829,13 +809,12 @@
   }
 
   test_mixin_0_1() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 mixin A {}
 augment mixin A<T> {}
-''',
-      [error(diag.augmentationTypeParameterCount, 27, 1)],
-    );
+//              ^
+// [diag.augmentationTypeParameterCount] The augmentation must have the same number of type parameters as the declaration.
+''');
     var node = findNode.mixinDeclaration('augment mixin A');
     assertResolvedNodeText(node, r'''
 MixinDeclaration
@@ -858,13 +837,12 @@
   }
 
   test_mixin_1_0() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 mixin A<T> {}
 augment mixin A {}
-''',
-      [error(diag.augmentationTypeParameterCount, 28, 1)],
-    );
+//            ^
+// [diag.augmentationTypeParameterCount] The augmentation must have the same number of type parameters as the declaration.
+''');
     var node = findNode.mixinDeclaration('augment mixin A');
     assertResolvedNodeText(node, r'''
 MixinDeclaration
@@ -879,7 +857,7 @@
   }
 
   test_mixin_1_1() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 mixin A<T> {}
 augment mixin A<T> {}
 ''');
@@ -905,13 +883,12 @@
   }
 
   test_mixin_1_2() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 mixin A<T> {}
 augment mixin A<T, U> {}
-''',
-      [error(diag.augmentationTypeParameterCount, 33, 1)],
-    );
+//                 ^
+// [diag.augmentationTypeParameterCount] The augmentation must have the same number of type parameters as the declaration.
+''');
     var node = findNode.mixinDeclaration('augment mixin A');
     assertResolvedNodeText(node, r'''
 MixinDeclaration
@@ -938,13 +915,12 @@
   }
 
   test_mixin_2_1() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 mixin A<T, U> {}
 augment mixin A<T> {}
-''',
-      [error(diag.augmentationTypeParameterCount, 34, 1)],
-    );
+//               ^
+// [diag.augmentationTypeParameterCount] The augmentation must have the same number of type parameters as the declaration.
+''');
     var node = findNode.mixinDeclaration('augment mixin A');
     assertResolvedNodeText(node, r'''
 MixinDeclaration
@@ -967,13 +943,12 @@
   }
 
   test_topLevelFunction_0_1() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 void f() {}
-augment void f<T>() {}
-''',
-      [error(diag.augmentationTypeParameterCount, 27, 1)],
-    );
+augment void f<T>();
+//             ^
+// [diag.augmentationTypeParameterCount] The augmentation must have the same number of type parameters as the declaration.
+''');
     var node = findNode.functionDeclaration('augment void f');
     assertResolvedNodeText(node, r'''
 FunctionDeclaration
@@ -995,10 +970,8 @@
     parameters: FormalParameterList
       leftParenthesis: (
       rightParenthesis: )
-    body: BlockFunctionBody
-      block: Block
-        leftBracket: {
-        rightBracket: }
+    body: EmptyFunctionBody
+      semicolon: ;
     declaredFragment: <testLibraryFragment> f@25
       element: <testLibrary>::@function::f
         type: void Function<T>()
@@ -1010,9 +983,9 @@
   }
 
   test_topLevelFunction_1_1() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 void f<T>() {}
-augment void f<T>() {}
+augment void f<T>();
 ''');
     var node = findNode.functionDeclaration('augment void f');
     assertResolvedNodeText(node, r'''
@@ -1035,10 +1008,8 @@
     parameters: FormalParameterList
       leftParenthesis: (
       rightParenthesis: )
-    body: BlockFunctionBody
-      block: Block
-        leftBracket: {
-        rightBracket: }
+    body: EmptyFunctionBody
+      semicolon: ;
     declaredFragment: <testLibraryFragment> f@28
       element: <testLibrary>::@function::f
         type: void Function<T>()
@@ -1050,13 +1021,12 @@
   }
 
   test_topLevelFunction_1_2() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 void f<T>() {}
-augment void f<T, U>() {}
-''',
-      [error(diag.augmentationTypeParameterCount, 33, 1)],
-    );
+augment void f<T, U>();
+//                ^
+// [diag.augmentationTypeParameterCount] The augmentation must have the same number of type parameters as the declaration.
+''');
     var node = findNode.functionDeclaration('augment void f');
     assertResolvedNodeText(node, r'''
 FunctionDeclaration
@@ -1082,10 +1052,8 @@
     parameters: FormalParameterList
       leftParenthesis: (
       rightParenthesis: )
-    body: BlockFunctionBody
-      block: Block
-        leftBracket: {
-        rightBracket: }
+    body: EmptyFunctionBody
+      semicolon: ;
     declaredFragment: <testLibraryFragment> f@28
       element: <testLibrary>::@function::f
         type: void Function<T, U>()
diff --git a/pkg/analyzer/test/src/diagnostics/augmentation_type_parameter_name_test.dart b/pkg/analyzer/test/src/diagnostics/augmentation_type_parameter_name_test.dart
index c9564c4..889ce5a 100644
--- a/pkg/analyzer/test/src/diagnostics/augmentation_type_parameter_name_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/augmentation_type_parameter_name_test.dart
@@ -2,102 +2,93 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/src/diagnostic/diagnostic.dart' as diag;
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../dart/resolution/context_collection_resolution.dart';
+import '../dart/resolution/node_text_expectations.dart';
 
 main() {
   defineReflectiveSuite(() {
-    // TODO(scheglov): implement augmentation
-    // defineReflectiveTests(AugmentationTypeParameterNameTest);
+    defineReflectiveTests(AugmentationTypeParameterNameTest);
+    defineReflectiveTests(UpdateNodeTextExpectations);
   });
 }
 
 @reflectiveTest
 class AugmentationTypeParameterNameTest extends PubPackageResolutionTest {
-  test_class() async {
-    newFile('$testPackageLibPath/a.dart', r'''
-part 'test.dart';
+  test_class_method_T_U() async {
+    await resolveTestCodeWithDiagnostics(r'''
+class A {
+  void foo<T>() {}
+  augment void foo<U>();
+//                 ^
+// [diag.augmentationTypeParameterName] The augmentation type parameter must have the same name as the corresponding type parameter of the declaration.
+}
+''');
+  }
 
+  test_class_T_U() async {
+    await resolveTestCodeWithDiagnostics(r'''
 class A<T> {}
-''');
-
-    await assertErrorsInCode(
-      r'''
-part of 'a.dart';
-
 augment class A<U> {}
-''',
-      [error(diag.augmentationTypeParameterName, 35, 1)],
-    );
+//              ^
+// [diag.augmentationTypeParameterName] The augmentation type parameter must have the same name as the corresponding type parameter of the declaration.
+''');
   }
 
-  test_enum() async {
-    newFile('$testPackageLibPath/a.dart', r'''
-part 'test.dart';
+  test_class_TU_UT() async {
+    await resolveTestCodeWithDiagnostics(r'''
+class A<T, U> {}
+augment class A<U, T> {}
+//              ^
+// [diag.augmentationTypeParameterName] The augmentation type parameter must have the same name as the corresponding type parameter of the declaration.
+//                 ^
+// [diag.augmentationTypeParameterName] The augmentation type parameter must have the same name as the corresponding type parameter of the declaration.
+''');
+  }
 
+  test_enum_T_U() async {
+    await resolveTestCodeWithDiagnostics(r'''
 enum A<T> {v}
-''');
-
-    await assertErrorsInCode(
-      r'''
-part of 'a.dart';
-
 augment enum A<U> {}
-''',
-      [error(diag.augmentationTypeParameterName, 34, 1)],
-    );
+//             ^
+// [diag.augmentationTypeParameterName] The augmentation type parameter must have the same name as the corresponding type parameter of the declaration.
+''');
   }
 
-  test_extension() async {
-    newFile('$testPackageLibPath/a.dart', r'''
-part 'test.dart';
-
+  test_extension_T_U() async {
+    await resolveTestCodeWithDiagnostics(r'''
 extension A<T> on int {}
-''');
-
-    await assertErrorsInCode(
-      r'''
-part of 'a.dart';
-
 augment extension A<U> {}
-''',
-      [error(diag.augmentationTypeParameterName, 39, 1)],
-    );
+//                  ^
+// [diag.augmentationTypeParameterName] The augmentation type parameter must have the same name as the corresponding type parameter of the declaration.
+''');
   }
 
-  test_extensionType() async {
-    newFile('$testPackageLibPath/a.dart', r'''
-part 'test.dart';
-
+  test_extensionType_T_U() async {
+    await resolveTestCodeWithDiagnostics(r'''
 extension type A<T>(int it) {}
-''');
-
-    await assertErrorsInCode(
-      r'''
-part of 'a.dart';
-
 augment extension type A<U>(int it) {}
-''',
-      [error(diag.augmentationTypeParameterName, 44, 1)],
-    );
+//                       ^
+// [diag.augmentationTypeParameterName] The augmentation type parameter must have the same name as the corresponding type parameter of the declaration.
+''');
   }
 
-  test_mixin() async {
-    newFile('$testPackageLibPath/a.dart', r'''
-part 'test.dart';
-
+  test_mixin_T_U() async {
+    await resolveTestCodeWithDiagnostics(r'''
 mixin A<T> {}
-''');
-
-    await assertErrorsInCode(
-      r'''
-part of 'a.dart';
-
 augment mixin A<U> {}
-''',
-      [error(diag.augmentationTypeParameterName, 35, 1)],
-    );
+//              ^
+// [diag.augmentationTypeParameterName] The augmentation type parameter must have the same name as the corresponding type parameter of the declaration.
+''');
+  }
+
+  test_topLevelFunction_T_U() async {
+    await resolveTestCodeWithDiagnostics(r'''
+void foo<T>() {}
+augment void foo<U>();
+//               ^
+// [diag.augmentationTypeParameterName] The augmentation type parameter must have the same name as the corresponding type parameter of the declaration.
+''');
   }
 }
diff --git a/pkg/analyzer/test/src/diagnostics/augmentation_without_declaration_test.dart b/pkg/analyzer/test/src/diagnostics/augmentation_without_declaration_test.dart
index b8837bd..9234506 100644
--- a/pkg/analyzer/test/src/diagnostics/augmentation_without_declaration_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/augmentation_without_declaration_test.dart
@@ -2,30 +2,29 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/src/diagnostic/diagnostic.dart' as diag;
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../dart/resolution/context_collection_resolution.dart';
+import '../dart/resolution/node_text_expectations.dart';
 
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(AugmentationWithoutDeclarationTest);
+    defineReflectiveTests(UpdateNodeTextExpectations);
   });
 }
 
 @reflectiveTest
 class AugmentationWithoutDeclarationTest extends PubPackageResolutionTest {
   test_class() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 augment class A {}
-''',
-      [error(diag.augmentationWithoutDeclaration, 0, 7)],
-    );
+// [diag.augmentationWithoutDeclaration][column 1][length 7] The declaration being augmented doesn't exist.
+''');
   }
 
   test_class_augments_class() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {}
 
 augment class A {}
@@ -33,78 +32,73 @@
   }
 
   test_class_constructor() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {}
 
 augment class A {
   augment A.named();
+//^^^^^^^
+// [diag.augmentationWithoutDeclaration] The declaration being augmented doesn't exist.
 }
-''',
-      [error(diag.augmentationWithoutDeclaration, 32, 7)],
-    );
+''');
   }
 
   test_class_constructor_augments_instanceField() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   int foo = 0;
 }
 
 augment class A {
   augment A.foo();
+//^^^^^^^
+// [diag.augmentationWithoutDeclaration] The declaration being augmented doesn't exist.
 }
-''',
-      [error(diag.augmentationWithoutDeclaration, 48, 7)],
-    );
+''');
   }
 
   test_class_constructor_augments_instanceMethod() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   void foo() {}
 }
 
 augment class A {
   augment A.foo();
+//^^^^^^^
+// [diag.augmentationWithoutDeclaration] The declaration being augmented doesn't exist.
 }
-''',
-      [error(diag.augmentationWithoutDeclaration, 49, 7)],
-    );
+''');
   }
 
   test_class_instanceField() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {}
 
 augment class A {
   augment int foo = 0;
+//^^^^^^^
+// [diag.augmentationWithoutDeclaration] The declaration being augmented doesn't exist.
 }
-''',
-      [error(diag.augmentationWithoutDeclaration, 32, 7)],
-    );
+''');
   }
 
   test_class_instanceField_augments_constructor() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   A.foo();
 }
 
 augment class A {
   augment int foo = 0;
+//^^^^^^^
+// [diag.augmentationWithoutDeclaration] The declaration being augmented doesn't exist.
 }
-''',
-      [error(diag.augmentationWithoutDeclaration, 44, 7)],
-    );
+''');
   }
 
   test_class_instanceField_augments_instanceField() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   int foo = 0;
 }
@@ -116,472 +110,608 @@
   }
 
   test_class_instanceField_augments_staticField() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   static int foo = 0;
+//           ^^^
+// [diag.conflictingStaticAndInstance] Class 'A' can't define static member 'foo' and have instance member 'A.foo' with the same name.
 }
 augment class A {
   augment int foo = 0;
+//^^^^^^^
+// [diag.augmentationWithoutDeclaration] The declaration being augmented doesn't exist.
 }
-''',
-      [
-        error(diag.conflictingStaticAndInstance, 23, 3),
-        error(diag.augmentationWithoutDeclaration, 54, 7),
-      ],
-    );
+''');
   }
 
   test_class_instanceField_augments_staticGetter() async {
-    await _assertClassMemberAugmentationWithoutDeclaration(
-      declaration: 'static int get foo => 0;',
-      augmentation: 'int foo = 0;',
-      conflictAtAugmentation: false,
-    );
+    await resolveTestCodeWithDiagnostics(r'''
+class A {
+  static int get foo => 0;
+//               ^^^
+// [diag.conflictingStaticAndInstance] Class 'A' can't define static member 'foo' and have instance member 'A.foo' with the same name.
+}
+augment class A {
+  augment int foo = 0;
+//^^^^^^^
+// [diag.augmentationWithoutDeclaration] The declaration being augmented doesn't exist.
+}
+''');
   }
 
   test_class_instanceField_augments_staticMethod() async {
-    await _assertClassMemberAugmentationWithoutDeclaration(
-      declaration: 'static void foo() {}',
-      augmentation: 'int foo = 0;',
-      conflictAtAugmentation: false,
-    );
+    await resolveTestCodeWithDiagnostics(r'''
+class A {
+  static void foo() {}
+//            ^^^
+// [diag.conflictingStaticAndInstance] Class 'A' can't define static member 'foo' and have instance member 'A.foo' with the same name.
+}
+augment class A {
+  augment int foo = 0;
+//^^^^^^^
+// [diag.augmentationWithoutDeclaration] The declaration being augmented doesn't exist.
+}
+''');
   }
 
   test_class_instanceField_augments_staticSetter() async {
-    await _assertClassMemberAugmentationWithoutDeclaration(
-      declaration: 'static set foo(int _) {}',
-      augmentation: 'int foo = 0;',
-      conflictAtAugmentation: false,
-    );
+    await resolveTestCodeWithDiagnostics(r'''
+class A {
+  static set foo(int _) {}
+//           ^^^
+// [diag.conflictingStaticAndInstance] Class 'A' can't define static member 'foo' and have instance member 'A.foo' with the same name.
+}
+augment class A {
+  augment int foo = 0;
+//^^^^^^^
+// [diag.augmentationWithoutDeclaration] The declaration being augmented doesn't exist.
+}
+''');
   }
 
   test_class_instanceGetter() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {}
 
 augment class A {
   augment int get foo => 0;
+//^^^^^^^
+// [diag.augmentationWithoutDeclaration] The declaration being augmented doesn't exist.
 }
-''',
-      [error(diag.augmentationWithoutDeclaration, 32, 7)],
-    );
+''');
   }
 
   test_class_instanceGetter_augments_constructor() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   A.foo();
 }
 
 augment class A {
   augment int get foo => 0;
+//^^^^^^^
+// [diag.augmentationWithoutDeclaration] The declaration being augmented doesn't exist.
 }
-''',
-      [error(diag.augmentationWithoutDeclaration, 44, 7)],
-    );
+''');
   }
 
   test_class_instanceGetter_augments_staticField() async {
-    await _assertClassMemberAugmentationWithoutDeclaration(
-      declaration: 'static int foo = 0;',
-      augmentation: 'int get foo => 0;',
-      expectConflict: false,
-    );
+    await resolveTestCodeWithDiagnostics(r'''
+class A {
+  static int foo = 0;
+}
+augment class A {
+  augment int get foo => 0;
+//^^^^^^^
+// [diag.augmentationWithoutDeclaration] The declaration being augmented doesn't exist.
+}
+''');
   }
 
   test_class_instanceGetter_augments_staticGetter() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   static int get foo => 0;
 }
 augment class A {
   augment int get foo => 0;
+//^^^^^^^
+// [diag.augmentationWithoutDeclaration] The declaration being augmented doesn't exist.
 }
-''',
-      [error(diag.augmentationWithoutDeclaration, 59, 7)],
-    );
+''');
   }
 
   test_class_instanceGetter_augments_staticMethod() async {
-    await _assertClassMemberAugmentationWithoutDeclaration(
-      declaration: 'static void foo() {}',
-      augmentation: 'int get foo => 0;',
-      expectConflict: false,
-    );
+    await resolveTestCodeWithDiagnostics(r'''
+class A {
+  static void foo() {}
+}
+augment class A {
+  augment int get foo => 0;
+//^^^^^^^
+// [diag.augmentationWithoutDeclaration] The declaration being augmented doesn't exist.
+}
+''');
   }
 
   test_class_instanceGetter_augments_staticSetter() async {
-    await _assertClassMemberAugmentationWithoutDeclaration(
-      declaration: 'static set foo(int _) {}',
-      augmentation: 'int get foo => 0;',
-      expectConflict: false,
-    );
+    await resolveTestCodeWithDiagnostics(r'''
+class A {
+  static set foo(int _) {}
+}
+augment class A {
+  augment int get foo => 0;
+//^^^^^^^
+// [diag.augmentationWithoutDeclaration] The declaration being augmented doesn't exist.
+}
+''');
   }
 
   test_class_instanceMethod() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {}
 
 augment class A {
   augment void foo() {}
+//^^^^^^^
+// [diag.augmentationWithoutDeclaration] The declaration being augmented doesn't exist.
 }
-''',
-      [error(diag.augmentationWithoutDeclaration, 32, 7)],
-    );
+''');
   }
 
   test_class_instanceMethod_augments_constructor() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   A.foo();
 }
 
 augment class A {
   augment void foo() {}
+//^^^^^^^
+// [diag.augmentationWithoutDeclaration] The declaration being augmented doesn't exist.
 }
-''',
-      [error(diag.augmentationWithoutDeclaration, 44, 7)],
-    );
+''');
   }
 
   test_class_instanceMethod_augments_instanceMethod() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   void foo() {}
 }
 
 augment class A {
-  augment void foo() {}
+  augment void foo();
 }
 ''');
   }
 
   test_class_instanceMethod_augments_staticField() async {
-    await _assertClassMemberAugmentationWithoutDeclaration(
-      declaration: 'static int foo = 0;',
-      augmentation: 'void foo() {}',
-      expectConflict: false,
-    );
+    await resolveTestCodeWithDiagnostics(r'''
+class A {
+  static int foo = 0;
+}
+augment class A {
+  augment void foo() {}
+//^^^^^^^
+// [diag.augmentationWithoutDeclaration] The declaration being augmented doesn't exist.
+}
+''');
   }
 
   test_class_instanceMethod_augments_staticGetter() async {
-    await _assertClassMemberAugmentationWithoutDeclaration(
-      declaration: 'static int get foo => 0;',
-      augmentation: 'void foo() {}',
-      expectConflict: false,
-    );
+    await resolveTestCodeWithDiagnostics(r'''
+class A {
+  static int get foo => 0;
+}
+augment class A {
+  augment void foo() {}
+//^^^^^^^
+// [diag.augmentationWithoutDeclaration] The declaration being augmented doesn't exist.
+}
+''');
   }
 
   test_class_instanceMethod_augments_staticMethod() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   static void foo() {}
 }
 augment class A {
   augment void foo() {}
+//^^^^^^^
+// [diag.augmentationWithoutDeclaration] The declaration being augmented doesn't exist.
 }
-''',
-      [error(diag.augmentationWithoutDeclaration, 55, 7)],
-    );
+''');
   }
 
   test_class_instanceMethod_augments_staticSetter() async {
-    await _assertClassMemberAugmentationWithoutDeclaration(
-      declaration: 'static set foo(int _) {}',
-      augmentation: 'void foo() {}',
-      expectConflict: false,
-    );
+    await resolveTestCodeWithDiagnostics(r'''
+class A {
+  static set foo(int _) {}
+}
+augment class A {
+  augment void foo() {}
+//^^^^^^^
+// [diag.augmentationWithoutDeclaration] The declaration being augmented doesn't exist.
+}
+''');
   }
 
   test_class_instanceSetter() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {}
 
 augment class A {
   augment set foo(int _) {}
+//^^^^^^^
+// [diag.augmentationWithoutDeclaration] The declaration being augmented doesn't exist.
 }
-''',
-      [error(diag.augmentationWithoutDeclaration, 32, 7)],
-    );
+''');
   }
 
   test_class_instanceSetter_augments_constructor() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   A.foo();
 }
 
 augment class A {
   augment set foo(int _) {}
+//^^^^^^^
+// [diag.augmentationWithoutDeclaration] The declaration being augmented doesn't exist.
 }
-''',
-      [error(diag.augmentationWithoutDeclaration, 44, 7)],
-    );
+''');
   }
 
   test_class_instanceSetter_augments_staticField() async {
-    await _assertClassMemberAugmentationWithoutDeclaration(
-      declaration: 'static int foo = 0;',
-      augmentation: 'set foo(int _) {}',
-      expectConflict: false,
-    );
+    await resolveTestCodeWithDiagnostics(r'''
+class A {
+  static int foo = 0;
+}
+augment class A {
+  augment set foo(int _) {}
+//^^^^^^^
+// [diag.augmentationWithoutDeclaration] The declaration being augmented doesn't exist.
+}
+''');
   }
 
   test_class_instanceSetter_augments_staticGetter() async {
-    await _assertClassMemberAugmentationWithoutDeclaration(
-      declaration: 'static int get foo => 0;',
-      augmentation: 'set foo(int _) {}',
-      expectConflict: false,
-    );
+    await resolveTestCodeWithDiagnostics(r'''
+class A {
+  static int get foo => 0;
+}
+augment class A {
+  augment set foo(int _) {}
+//^^^^^^^
+// [diag.augmentationWithoutDeclaration] The declaration being augmented doesn't exist.
+}
+''');
   }
 
   test_class_instanceSetter_augments_staticMethod() async {
-    await _assertClassMemberAugmentationWithoutDeclaration(
-      declaration: 'static void foo() {}',
-      augmentation: 'set foo(int _) {}',
-      expectConflict: false,
-    );
+    await resolveTestCodeWithDiagnostics(r'''
+class A {
+  static void foo() {}
+}
+augment class A {
+  augment set foo(int _) {}
+//^^^^^^^
+// [diag.augmentationWithoutDeclaration] The declaration being augmented doesn't exist.
+}
+''');
   }
 
   test_class_instanceSetter_augments_staticSetter() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   static set foo(int _) {}
 }
 augment class A {
   augment set foo(int _) {}
+//^^^^^^^
+// [diag.augmentationWithoutDeclaration] The declaration being augmented doesn't exist.
 }
-''',
-      [error(diag.augmentationWithoutDeclaration, 59, 7)],
-    );
+''');
   }
 
   test_class_staticField() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {}
 
 augment class A {
   augment static int foo = 0;
+//^^^^^^^
+// [diag.augmentationWithoutDeclaration] The declaration being augmented doesn't exist.
 }
-''',
-      [error(diag.augmentationWithoutDeclaration, 32, 7)],
-    );
+''');
   }
 
   test_class_staticField_augments_instanceField() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   int foo = 0;
 }
 augment class A {
   augment static int foo = 0;
+//^^^^^^^
+// [diag.augmentationWithoutDeclaration] The declaration being augmented doesn't exist.
+//                   ^^^
+// [diag.conflictingStaticAndInstance] Class 'A' can't define static member 'foo' and have instance member 'A.foo' with the same name.
 }
-''',
-      [
-        error(diag.augmentationWithoutDeclaration, 47, 7),
-        error(diag.conflictingStaticAndInstance, 66, 3),
-      ],
-    );
+''');
   }
 
   test_class_staticField_augments_instanceGetter() async {
-    await _assertClassMemberAugmentationWithoutDeclaration(
-      declaration: 'int get foo => 0;',
-      augmentation: 'static int foo = 0;',
-    );
+    await resolveTestCodeWithDiagnostics(r'''
+class A {
+  int get foo => 0;
+}
+augment class A {
+  augment static int foo = 0;
+//^^^^^^^
+// [diag.augmentationWithoutDeclaration] The declaration being augmented doesn't exist.
+//                   ^^^
+// [diag.conflictingStaticAndInstance] Class 'A' can't define static member 'foo' and have instance member 'A.foo' with the same name.
+}
+''');
   }
 
   test_class_staticField_augments_instanceMethod() async {
-    await _assertClassMemberAugmentationWithoutDeclaration(
-      declaration: 'void foo() {}',
-      augmentation: 'static int foo = 0;',
-    );
+    await resolveTestCodeWithDiagnostics(r'''
+class A {
+  void foo() {}
+}
+augment class A {
+  augment static int foo = 0;
+//^^^^^^^
+// [diag.augmentationWithoutDeclaration] The declaration being augmented doesn't exist.
+//                   ^^^
+// [diag.conflictingStaticAndInstance] Class 'A' can't define static member 'foo' and have instance member 'A.foo' with the same name.
+}
+''');
   }
 
   test_class_staticField_augments_instanceSetter() async {
-    await _assertClassMemberAugmentationWithoutDeclaration(
-      declaration: 'set foo(int _) {}',
-      augmentation: 'static int foo = 0;',
-    );
+    await resolveTestCodeWithDiagnostics(r'''
+class A {
+  set foo(int _) {}
+}
+augment class A {
+  augment static int foo = 0;
+//^^^^^^^
+// [diag.augmentationWithoutDeclaration] The declaration being augmented doesn't exist.
+//                   ^^^
+// [diag.conflictingStaticAndInstance] Class 'A' can't define static member 'foo' and have instance member 'A.foo' with the same name.
+}
+''');
   }
 
   test_class_staticGetter() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {}
 
 augment class A {
   augment static int get foo => 0;
+//^^^^^^^
+// [diag.augmentationWithoutDeclaration] The declaration being augmented doesn't exist.
 }
-''',
-      [error(diag.augmentationWithoutDeclaration, 32, 7)],
-    );
+''');
   }
 
   test_class_staticGetter_augments_instanceField() async {
-    await _assertClassMemberAugmentationWithoutDeclaration(
-      declaration: 'int foo = 0;',
-      augmentation: 'static int get foo => 0;',
-    );
+    await resolveTestCodeWithDiagnostics(r'''
+class A {
+  int foo = 0;
+}
+augment class A {
+  augment static int get foo => 0;
+//^^^^^^^
+// [diag.augmentationWithoutDeclaration] The declaration being augmented doesn't exist.
+//                       ^^^
+// [diag.conflictingStaticAndInstance] Class 'A' can't define static member 'foo' and have instance member 'A.foo' with the same name.
+}
+''');
   }
 
   test_class_staticGetter_augments_instanceGetter() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   int get foo => 0;
 }
 augment class A {
   augment static int get foo => 0;
+//^^^^^^^
+// [diag.augmentationWithoutDeclaration] The declaration being augmented doesn't exist.
+//                       ^^^
+// [diag.conflictingStaticAndInstance] Class 'A' can't define static member 'foo' and have instance member 'A.foo' with the same name.
 }
-''',
-      [
-        error(diag.augmentationWithoutDeclaration, 52, 7),
-        error(diag.conflictingStaticAndInstance, 75, 3),
-      ],
-    );
+''');
   }
 
   test_class_staticGetter_augments_instanceMethod() async {
-    await _assertClassMemberAugmentationWithoutDeclaration(
-      declaration: 'void foo() {}',
-      augmentation: 'static int get foo => 0;',
-    );
+    await resolveTestCodeWithDiagnostics(r'''
+class A {
+  void foo() {}
+}
+augment class A {
+  augment static int get foo => 0;
+//^^^^^^^
+// [diag.augmentationWithoutDeclaration] The declaration being augmented doesn't exist.
+//                       ^^^
+// [diag.conflictingStaticAndInstance] Class 'A' can't define static member 'foo' and have instance member 'A.foo' with the same name.
+}
+''');
   }
 
   test_class_staticGetter_augments_instanceSetter() async {
-    await _assertClassMemberAugmentationWithoutDeclaration(
-      declaration: 'set foo(int _) {}',
-      augmentation: 'static int get foo => 0;',
-    );
+    await resolveTestCodeWithDiagnostics(r'''
+class A {
+  set foo(int _) {}
+}
+augment class A {
+  augment static int get foo => 0;
+//^^^^^^^
+// [diag.augmentationWithoutDeclaration] The declaration being augmented doesn't exist.
+//                       ^^^
+// [diag.conflictingStaticAndInstance] Class 'A' can't define static member 'foo' and have instance member 'A.foo' with the same name.
+}
+''');
   }
 
   test_class_staticMethod() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {}
 
 augment class A {
   augment static void foo() {}
+//^^^^^^^
+// [diag.augmentationWithoutDeclaration] The declaration being augmented doesn't exist.
 }
-''',
-      [error(diag.augmentationWithoutDeclaration, 32, 7)],
-    );
+''');
   }
 
   test_class_staticMethod_augments_instanceField() async {
-    await _assertClassMemberAugmentationWithoutDeclaration(
-      declaration: 'int foo = 0;',
-      augmentation: 'static void foo() {}',
-    );
+    await resolveTestCodeWithDiagnostics(r'''
+class A {
+  int foo = 0;
+}
+augment class A {
+  augment static void foo() {}
+//^^^^^^^
+// [diag.augmentationWithoutDeclaration] The declaration being augmented doesn't exist.
+//                    ^^^
+// [diag.conflictingStaticAndInstance] Class 'A' can't define static member 'foo' and have instance member 'A.foo' with the same name.
+}
+''');
   }
 
   test_class_staticMethod_augments_instanceGetter() async {
-    await _assertClassMemberAugmentationWithoutDeclaration(
-      declaration: 'int get foo => 0;',
-      augmentation: 'static void foo() {}',
-    );
+    await resolveTestCodeWithDiagnostics(r'''
+class A {
+  int get foo => 0;
+}
+augment class A {
+  augment static void foo() {}
+//^^^^^^^
+// [diag.augmentationWithoutDeclaration] The declaration being augmented doesn't exist.
+//                    ^^^
+// [diag.conflictingStaticAndInstance] Class 'A' can't define static member 'foo' and have instance member 'A.foo' with the same name.
+}
+''');
   }
 
   test_class_staticMethod_augments_instanceMethod() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   void foo() {}
 }
 augment class A {
   augment static void foo() {}
+//^^^^^^^
+// [diag.augmentationWithoutDeclaration] The declaration being augmented doesn't exist.
+//                    ^^^
+// [diag.conflictingStaticAndInstance] Class 'A' can't define static member 'foo' and have instance member 'A.foo' with the same name.
 }
-''',
-      [
-        error(diag.augmentationWithoutDeclaration, 48, 7),
-        error(diag.conflictingStaticAndInstance, 68, 3),
-      ],
-    );
+''');
   }
 
   test_class_staticMethod_augments_instanceSetter() async {
-    await _assertClassMemberAugmentationWithoutDeclaration(
-      declaration: 'set foo(int _) {}',
-      augmentation: 'static void foo() {}',
-    );
+    await resolveTestCodeWithDiagnostics(r'''
+class A {
+  set foo(int _) {}
+}
+augment class A {
+  augment static void foo() {}
+//^^^^^^^
+// [diag.augmentationWithoutDeclaration] The declaration being augmented doesn't exist.
+//                    ^^^
+// [diag.conflictingStaticAndInstance] Class 'A' can't define static member 'foo' and have instance member 'A.foo' with the same name.
+}
+''');
   }
 
   test_class_staticSetter() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {}
 
 augment class A {
   augment static set foo(int _) {}
+//^^^^^^^
+// [diag.augmentationWithoutDeclaration] The declaration being augmented doesn't exist.
 }
-''',
-      [error(diag.augmentationWithoutDeclaration, 32, 7)],
-    );
+''');
   }
 
   test_class_staticSetter_augments_instanceField() async {
-    await _assertClassMemberAugmentationWithoutDeclaration(
-      declaration: 'int foo = 0;',
-      augmentation: 'static set foo(int _) {}',
-    );
+    await resolveTestCodeWithDiagnostics(r'''
+class A {
+  int foo = 0;
+}
+augment class A {
+  augment static set foo(int _) {}
+//^^^^^^^
+// [diag.augmentationWithoutDeclaration] The declaration being augmented doesn't exist.
+//                   ^^^
+// [diag.conflictingStaticAndInstance] Class 'A' can't define static member 'foo' and have instance member 'A.foo' with the same name.
+}
+''');
   }
 
   test_class_staticSetter_augments_instanceGetter() async {
-    await _assertClassMemberAugmentationWithoutDeclaration(
-      declaration: 'int get foo => 0;',
-      augmentation: 'static set foo(int _) {}',
-    );
+    await resolveTestCodeWithDiagnostics(r'''
+class A {
+  int get foo => 0;
+}
+augment class A {
+  augment static set foo(int _) {}
+//^^^^^^^
+// [diag.augmentationWithoutDeclaration] The declaration being augmented doesn't exist.
+//                   ^^^
+// [diag.conflictingStaticAndInstance] Class 'A' can't define static member 'foo' and have instance member 'A.foo' with the same name.
+}
+''');
   }
 
   test_class_staticSetter_augments_instanceMethod() async {
-    await _assertClassMemberAugmentationWithoutDeclaration(
-      declaration: 'void foo() {}',
-      augmentation: 'static set foo(int _) {}',
-    );
+    await resolveTestCodeWithDiagnostics(r'''
+class A {
+  void foo() {}
+}
+augment class A {
+  augment static set foo(int _) {}
+//^^^^^^^
+// [diag.augmentationWithoutDeclaration] The declaration being augmented doesn't exist.
+//                   ^^^
+// [diag.conflictingStaticAndInstance] Class 'A' can't define static member 'foo' and have instance member 'A.foo' with the same name.
+}
+''');
   }
 
   test_class_staticSetter_augments_instanceSetter() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   set foo(int _) {}
 }
 augment class A {
   augment static set foo(int _) {}
+//^^^^^^^
+// [diag.augmentationWithoutDeclaration] The declaration being augmented doesn't exist.
+//                   ^^^
+// [diag.conflictingStaticAndInstance] Class 'A' can't define static member 'foo' and have instance member 'A.foo' with the same name.
 }
-''',
-      [
-        error(diag.augmentationWithoutDeclaration, 52, 7),
-        error(diag.conflictingStaticAndInstance, 71, 3),
-      ],
-    );
+''');
   }
 
   test_enum() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 augment enum A {}
-''',
-      [error(diag.augmentationWithoutDeclaration, 0, 7)],
-    );
+// [diag.augmentationWithoutDeclaration][column 1][length 7] The declaration being augmented doesn't exist.
+''');
   }
 
   test_enum_constructor() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 enum A {
   v;
   const A();
@@ -589,18 +719,16 @@
 
 augment enum A {;
   augment const A.named();
+//^^^^^^^
+// [diag.augmentationWithoutDeclaration] The declaration being augmented doesn't exist.
+//                ^^^^^
+// [diag.unusedElement] The declaration 'A.named' isn't referenced.
 }
-''',
-      [
-        error(diag.augmentationWithoutDeclaration, 50, 7),
-        error(diag.unusedElement, 66, 5),
-      ],
-    );
+''');
   }
 
   test_enum_instanceField() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 enum A {
   v;
   const A();
@@ -608,15 +736,14 @@
 
 augment enum A {;
   augment final int foo = 0;
+//^^^^^^^
+// [diag.augmentationWithoutDeclaration] The declaration being augmented doesn't exist.
 }
-''',
-      [error(diag.augmentationWithoutDeclaration, 50, 7)],
-    );
+''');
   }
 
   test_enum_instanceGetter() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 enum A {
   v;
   const A();
@@ -624,15 +751,14 @@
 
 augment enum A {;
   augment int get foo => 0;
+//^^^^^^^
+// [diag.augmentationWithoutDeclaration] The declaration being augmented doesn't exist.
 }
-''',
-      [error(diag.augmentationWithoutDeclaration, 50, 7)],
-    );
+''');
   }
 
   test_enum_instanceMethod() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 enum A {
   v;
   const A();
@@ -640,15 +766,14 @@
 
 augment enum A {;
   augment void foo() {}
+//^^^^^^^
+// [diag.augmentationWithoutDeclaration] The declaration being augmented doesn't exist.
 }
-''',
-      [error(diag.augmentationWithoutDeclaration, 50, 7)],
-    );
+''');
   }
 
   test_enum_instanceSetter() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 enum A {
   v;
   const A();
@@ -656,296 +781,234 @@
 
 augment enum A {;
   augment set foo(int _) {}
+//^^^^^^^
+// [diag.augmentationWithoutDeclaration] The declaration being augmented doesn't exist.
 }
-''',
-      [error(diag.augmentationWithoutDeclaration, 50, 7)],
-    );
+''');
   }
 
   test_extension() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 augment extension A {}
-''',
-      [error(diag.augmentationWithoutDeclaration, 0, 7)],
-    );
+// [diag.augmentationWithoutDeclaration][column 1][length 7] The declaration being augmented doesn't exist.
+''');
   }
 
   test_extension_instanceGetter() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 extension A on int {}
 
 augment extension A {
   augment int get foo => 0;
+//^^^^^^^
+// [diag.augmentationWithoutDeclaration] The declaration being augmented doesn't exist.
 }
-''',
-      [error(diag.augmentationWithoutDeclaration, 47, 7)],
-    );
+''');
   }
 
   test_extension_instanceMethod() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 extension A on int {}
 
 augment extension A {
   augment void foo() {}
+//^^^^^^^
+// [diag.augmentationWithoutDeclaration] The declaration being augmented doesn't exist.
 }
-''',
-      [error(diag.augmentationWithoutDeclaration, 47, 7)],
-    );
+''');
   }
 
   test_extension_instanceSetter() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 extension A on int {}
 
 augment extension A {
   augment set foo(int _) {}
+//^^^^^^^
+// [diag.augmentationWithoutDeclaration] The declaration being augmented doesn't exist.
 }
-''',
-      [error(diag.augmentationWithoutDeclaration, 47, 7)],
-    );
+''');
   }
 
   test_extensionType() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 augment extension type A(int it) {}
-''',
-      [error(diag.augmentationWithoutDeclaration, 0, 7)],
-    );
+// [diag.augmentationWithoutDeclaration][column 1][length 7] The declaration being augmented doesn't exist.
+''');
   }
 
   test_extensionType_constructor() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 extension type A(int it) {}
 
 augment extension type A(int it) {
   augment A.named() : this(0);
+//^^^^^^^
+// [diag.augmentationWithoutDeclaration] The declaration being augmented doesn't exist.
 }
-''',
-      [error(diag.augmentationWithoutDeclaration, 66, 7)],
-    );
+''');
   }
 
   test_extensionType_instanceGetter() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 extension type A(int it) {}
 
 augment extension type A(int it) {
   augment int get foo => 0;
+//^^^^^^^
+// [diag.augmentationWithoutDeclaration] The declaration being augmented doesn't exist.
 }
-''',
-      [error(diag.augmentationWithoutDeclaration, 66, 7)],
-    );
+''');
   }
 
   test_extensionType_instanceMethod() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 extension type A(int it) {}
 
 augment extension type A(int it) {
   augment void foo() {}
+//^^^^^^^
+// [diag.augmentationWithoutDeclaration] The declaration being augmented doesn't exist.
 }
-''',
-      [error(diag.augmentationWithoutDeclaration, 66, 7)],
-    );
+''');
   }
 
   test_extensionType_instanceSetter() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 extension type A(int it) {}
 
 augment extension type A(int it) {
   augment set foo(int _) {}
+//^^^^^^^
+// [diag.augmentationWithoutDeclaration] The declaration being augmented doesn't exist.
 }
-''',
-      [error(diag.augmentationWithoutDeclaration, 66, 7)],
-    );
+''');
   }
 
   test_mixin() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 augment mixin A {}
-''',
-      [error(diag.augmentationWithoutDeclaration, 0, 7)],
-    );
+// [diag.augmentationWithoutDeclaration][column 1][length 7] The declaration being augmented doesn't exist.
+''');
   }
 
   test_mixin_instanceField() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 mixin A {}
 
 augment mixin A {
   augment int foo = 0;
+//^^^^^^^
+// [diag.augmentationWithoutDeclaration] The declaration being augmented doesn't exist.
 }
-''',
-      [error(diag.augmentationWithoutDeclaration, 32, 7)],
-    );
+''');
   }
 
   test_mixin_instanceGetter() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 mixin A {}
 
 augment mixin A {
   augment int get foo => 0;
+//^^^^^^^
+// [diag.augmentationWithoutDeclaration] The declaration being augmented doesn't exist.
 }
-''',
-      [error(diag.augmentationWithoutDeclaration, 32, 7)],
-    );
+''');
   }
 
   test_mixin_instanceMethod() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 mixin A {}
 
 augment mixin A {
   augment void foo() {}
+//^^^^^^^
+// [diag.augmentationWithoutDeclaration] The declaration being augmented doesn't exist.
 }
-''',
-      [error(diag.augmentationWithoutDeclaration, 32, 7)],
-    );
+''');
   }
 
   test_mixin_instanceMethod_augments_instanceMethod() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 mixin A {
   void foo() {}
 }
 
 augment mixin A {
-  augment void foo() {}
+  augment void foo();
 }
 ''');
   }
 
   test_mixin_instanceSetter() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 mixin A {}
 
 augment mixin A {
   augment set foo(int _) {}
+//^^^^^^^
+// [diag.augmentationWithoutDeclaration] The declaration being augmented doesn't exist.
 }
-''',
-      [error(diag.augmentationWithoutDeclaration, 32, 7)],
-    );
+''');
   }
 
   test_topLevel_function() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 augment void foo() {}
-''',
-      [error(diag.augmentationWithoutDeclaration, 0, 7)],
-    );
+// [diag.augmentationWithoutDeclaration][column 1][length 7] The declaration being augmented doesn't exist.
+''');
   }
 
   test_topLevel_function_augments_function() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 void foo() {}
 
-augment void foo() {}
+augment void foo();
 ''');
   }
 
   test_topLevel_getter() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 augment int get foo => 0;
-''',
-      [error(diag.augmentationWithoutDeclaration, 0, 7)],
-    );
+// [diag.augmentationWithoutDeclaration][column 1][length 7] The declaration being augmented doesn't exist.
+''');
   }
 
   test_topLevel_setter() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 augment set foo(int _) {}
-''',
-      [error(diag.augmentationWithoutDeclaration, 0, 7)],
-    );
+// [diag.augmentationWithoutDeclaration][column 1][length 7] The declaration being augmented doesn't exist.
+''');
   }
 
   test_topLevel_variable_multiple() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 augment int foo = 0, bar = 0;
-''',
-      [error(diag.augmentationWithoutDeclaration, 0, 7)],
-    );
+// [diag.augmentationWithoutDeclaration][column 1][length 7] The declaration being augmented doesn't exist.
+''');
   }
 
   test_topLevel_variable_multiple_oneMissing() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 int bar = 0;
 
 augment int foo = 1, bar = 2;
-''',
-      [error(diag.augmentationWithoutDeclaration, 14, 7)],
-    );
+// [diag.augmentationWithoutDeclaration][column 1][length 7] The declaration being augmented doesn't exist.
+''');
   }
 
   test_topLevel_variable_single() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 augment int foo = 0;
-''',
-      [error(diag.augmentationWithoutDeclaration, 0, 7)],
-    );
+// [diag.augmentationWithoutDeclaration][column 1][length 7] The declaration being augmented doesn't exist.
+''');
   }
 
   test_topLevel_variable_single_augments_variable() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 int foo = 0;
 
 augment int foo = 1;
 ''');
   }
-
-  Future<void> _assertClassMemberAugmentationWithoutDeclaration({
-    required String declaration,
-    required String augmentation,
-    bool conflictAtAugmentation = true,
-    bool expectConflict = true,
-  }) async {
-    var code =
-        '''
-class A {
-  $declaration
-}
-augment class A {
-  augment $augmentation
-}
-''';
-
-    await assertErrorsInCode(code, [
-      if (expectConflict)
-        error(
-          diag.conflictingStaticAndInstance,
-          conflictAtAugmentation
-              ? code.lastIndexOf('foo')
-              : code.indexOf('foo'),
-          3,
-        ),
-      error(
-        diag.augmentationWithoutDeclaration,
-        code.indexOf('augment $augmentation'),
-        7,
-      ),
-    ]);
-  }
 }
diff --git a/pkg/analyzer/test/src/diagnostics/await_in_late_local_variable_initializer_test.dart b/pkg/analyzer/test/src/diagnostics/await_in_late_local_variable_initializer_test.dart
index 6fa0221..b0e42b7 100644
--- a/pkg/analyzer/test/src/diagnostics/await_in_late_local_variable_initializer_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/await_in_late_local_variable_initializer_test.dart
@@ -2,50 +2,47 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/src/diagnostic/diagnostic.dart' as diag;
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../dart/resolution/context_collection_resolution.dart';
+import '../dart/resolution/node_text_expectations.dart';
 
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(AwaitInLateLocalVariableInitializerTest);
+    defineReflectiveTests(UpdateNodeTextExpectations);
   });
 }
 
 @reflectiveTest
 class AwaitInLateLocalVariableInitializerTest extends PubPackageResolutionTest {
-  static const _errorCode = diag.awaitInLateLocalVariableInitializer;
-
   test_closure_late_await() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 main() {
   var v = () async {
     late var v2 = await 42;
+//                ^^^^^
+// [diag.awaitInLateLocalVariableInitializer] The 'await' expression can't be used in a 'late' local variable's initializer.
     print(v2);
   };
   print(v);
 }
-''',
-      [error(_errorCode, 48, 5)],
-    );
+''');
   }
 
   test_late_await() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 main() async {
   late var v = await 42;
+//             ^^^^^
+// [diag.awaitInLateLocalVariableInitializer] The 'await' expression can't be used in a 'late' local variable's initializer.
   print(v);
 }
-''',
-      [error(_errorCode, 30, 5)],
-    );
+''');
   }
 
   test_late_await_inClosure_blockBody() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 main() async {
   late var v = () async {
     await 42;
@@ -56,7 +53,7 @@
   }
 
   test_late_await_inClosure_expressionBody() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 main() async {
   late var v = () async => await 42;
   print(v);
@@ -65,7 +62,7 @@
   }
 
   test_no_await() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 main() async {
   late var v = 42;
   print(v);
@@ -74,7 +71,7 @@
   }
 
   test_not_late() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 main() async {
   var v = await 42;
   print(v);
diff --git a/pkg/analyzer/test/src/diagnostics/await_in_wrong_context_test.dart b/pkg/analyzer/test/src/diagnostics/await_in_wrong_context_test.dart
index a9d267b..1b93d2b 100644
--- a/pkg/analyzer/test/src/diagnostics/await_in_wrong_context_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/await_in_wrong_context_test.dart
@@ -2,38 +2,37 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/src/diagnostic/diagnostic.dart' as diag;
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../dart/resolution/context_collection_resolution.dart';
+import '../dart/resolution/node_text_expectations.dart';
 
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(AwaitInWrongContextTest);
+    defineReflectiveTests(UpdateNodeTextExpectations);
   });
 }
 
 @reflectiveTest
 class AwaitInWrongContextTest extends PubPackageResolutionTest {
   test_sync() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 f(x) {
   return await x;
+//       ^^^^^
+// [diag.awaitInWrongContext] The await expression can only be used in an async function.
 }
-''',
-      [error(diag.awaitInWrongContext, 16, 5)],
-    );
+''');
   }
 
   test_syncStar() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 f(x) sync* {
   yield await x;
+//      ^^^^^
+// [diag.awaitInWrongContext] The await expression can only be used in an async function.
 }
-''',
-      [error(diag.awaitInWrongContext, 21, 5)],
-    );
+''');
   }
 }
diff --git a/pkg/analyzer/test/src/diagnostics/await_of_incompatible_type_test.dart b/pkg/analyzer/test/src/diagnostics/await_of_incompatible_type_test.dart
index dfe0fe3..7f4fc5a 100644
--- a/pkg/analyzer/test/src/diagnostics/await_of_incompatible_type_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/await_of_incompatible_type_test.dart
@@ -2,21 +2,22 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/src/diagnostic/diagnostic.dart' as diag;
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../dart/resolution/context_collection_resolution.dart';
+import '../dart/resolution/node_text_expectations.dart';
 
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(AwaitOfExtensionTypeNotFutureTest);
+    defineReflectiveTests(UpdateNodeTextExpectations);
   });
 }
 
 @reflectiveTest
 class AwaitOfExtensionTypeNotFutureTest extends PubPackageResolutionTest {
   test_extensionType_implementsFuture() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 extension type A(Future<int> it) implements Future<int> {}
 
 void f(A a) async {
@@ -26,20 +27,19 @@
   }
 
   test_extensionType_notImplementsFuture() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 extension type A(int it) {}
 
 void f(A a) async {
   await a;
+//^^^^^
+// [diag.awaitOfIncompatibleType] The 'await' expression can't be used for an expression with an extension type that is not a subtype of 'Future'.
 }
-''',
-      [error(diag.awaitOfIncompatibleType, 51, 5)],
-    );
+''');
   }
 
   test_typeParameter_bound_extensionType_implementsFuture() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 extension type A(Future<int> it) implements Future<int> {}
 
 void f<T extends A>(T a) async {
@@ -49,20 +49,19 @@
   }
 
   test_typeParameter_bound_extensionType_notImplementsFuture() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 extension type A(Future<int> it) {}
 
 void f<T extends A>(T a) async {
   await a;
+//^^^^^
+// [diag.awaitOfIncompatibleType] The 'await' expression can't be used for an expression with an extension type that is not a subtype of 'Future'.
 }
-''',
-      [error(diag.awaitOfIncompatibleType, 72, 5)],
-    );
+''');
   }
 
   test_typeParameter_promotedBound_extensionType_implementsFuture() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 extension type A(Future<int> it) implements Future<int> {}
 
 void f<T>(T a) async {
@@ -74,17 +73,16 @@
   }
 
   test_typeParameter_promotedBound_extensionType_notImplementsFuture() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 extension type A(Future<int> it) {}
 
 void f<T>(T a) async {
   if (a is A) {
     await a;
+//  ^^^^^
+// [diag.awaitOfIncompatibleType] The 'await' expression can't be used for an expression with an extension type that is not a subtype of 'Future'.
   }
 }
-''',
-      [error(diag.awaitOfIncompatibleType, 80, 5)],
-    );
+''');
   }
 }
diff --git a/pkg/analyzer/test/src/diagnostics/base_class_implemented_outside_of_library_test.dart b/pkg/analyzer/test/src/diagnostics/base_class_implemented_outside_of_library_test.dart
index 65889ea..a897a4b 100644
--- a/pkg/analyzer/test/src/diagnostics/base_class_implemented_outside_of_library_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/base_class_implemented_outside_of_library_test.dart
@@ -7,10 +7,12 @@
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../dart/resolution/context_collection_resolution.dart';
+import '../dart/resolution/node_text_expectations.dart';
 
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(BaseClassImplementedOutsideOfLibraryTest);
+    defineReflectiveTests(UpdateNodeTextExpectations);
   });
 }
 
@@ -18,7 +20,7 @@
 class BaseClassImplementedOutsideOfLibraryTest
     extends PubPackageResolutionTest {
   test_class_inside() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 base class Foo {}
 base class Bar implements Foo {}
 ''');
@@ -29,13 +31,12 @@
 base class Foo {}
 ''');
 
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'foo.dart';
 base class Bar implements Foo {}
-''',
-      [error(diag.baseClassImplementedOutsideOfLibrary, 45, 3)],
-    );
+//                        ^^^
+// [diag.baseClassImplementedOutsideOfLibrary] The class 'Foo' can't be implemented outside of its library because it's a base class.
+''');
   }
 
   test_class_outside_sealed() async {
@@ -111,14 +112,13 @@
 base class A {}
 ''');
 
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'a.dart';
 base class B extends A {}
 base class C implements B {}
-''',
-      [error(diag.baseClassImplementedOutsideOfLibrary, 67, 1)],
-    );
+//                      ^
+// [diag.baseClassImplementedOutsideOfLibrary] The class 'A' can't be implemented outside of its library because it's a base class.
+''');
   }
 
   test_class_outside_viaTypedef_inside() async {
@@ -127,13 +127,12 @@
 typedef FooTypedef = Foo;
 ''');
 
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'foo.dart';
 base class Bar implements FooTypedef {}
-''',
-      [error(diag.baseClassImplementedOutsideOfLibrary, 45, 10)],
-    );
+//                        ^^^^^^^^^^
+// [diag.baseClassImplementedOutsideOfLibrary] The class 'Foo' can't be implemented outside of its library because it's a base class.
+''');
   }
 
   test_class_outside_viaTypedef_outside() async {
@@ -141,18 +140,17 @@
 base class Foo {}
 ''');
 
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'foo.dart';
 typedef FooTypedef = Foo;
 base class Bar implements FooTypedef {}
-''',
-      [error(diag.baseClassImplementedOutsideOfLibrary, 71, 10)],
-    );
+//                        ^^^^^^^^^^
+// [diag.baseClassImplementedOutsideOfLibrary] The class 'Foo' can't be implemented outside of its library because it's a base class.
+''');
   }
 
   test_classTypeAlias_inside() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 base class A {}
 sealed class B extends A {}
 mixin M {}
@@ -195,7 +193,7 @@
   }
 
   test_enum_inside() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 base class Foo {}
 enum Bar implements Foo { bar }
 ''');
@@ -206,13 +204,12 @@
 base class Foo {}
 ''');
 
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'foo.dart';
 enum Bar implements Foo { bar }
-''',
-      [error(diag.baseClassImplementedOutsideOfLibrary, 39, 3)],
-    );
+//                  ^^^
+// [diag.baseClassImplementedOutsideOfLibrary] The class 'Foo' can't be implemented outside of its library because it's a base class.
+''');
   }
 
   test_enum_outside_viaTypedef_inside() async {
@@ -221,13 +218,12 @@
 typedef FooTypedef = Foo;
 ''');
 
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'foo.dart';
 enum Bar implements FooTypedef { bar }
-''',
-      [error(diag.baseClassImplementedOutsideOfLibrary, 39, 10)],
-    );
+//                  ^^^^^^^^^^
+// [diag.baseClassImplementedOutsideOfLibrary] The class 'Foo' can't be implemented outside of its library because it's a base class.
+''');
   }
 
   test_enum_outside_viaTypedef_outside() async {
@@ -235,18 +231,17 @@
 base class Foo {}
 ''');
 
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'foo.dart';
 typedef FooTypedef = Foo;
 enum Bar implements FooTypedef { bar }
-''',
-      [error(diag.baseClassImplementedOutsideOfLibrary, 65, 10)],
-    );
+//                  ^^^^^^^^^^
+// [diag.baseClassImplementedOutsideOfLibrary] The class 'Foo' can't be implemented outside of its library because it's a base class.
+''');
   }
 
   test_mixin_inside() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 base class Foo {}
 base mixin Bar implements Foo {}
 ''');
@@ -257,13 +252,12 @@
 base class Foo {}
 ''');
 
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'foo.dart';
 base mixin Bar implements Foo {}
-''',
-      [error(diag.baseClassImplementedOutsideOfLibrary, 45, 3)],
-    );
+//                        ^^^
+// [diag.baseClassImplementedOutsideOfLibrary] The class 'Foo' can't be implemented outside of its library because it's a base class.
+''');
   }
 
   test_mixin_outside_viaTypedef_inside() async {
@@ -272,13 +266,12 @@
 typedef FooTypedef = Foo;
 ''');
 
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'foo.dart';
 base mixin Bar implements FooTypedef {}
-''',
-      [error(diag.baseClassImplementedOutsideOfLibrary, 45, 10)],
-    );
+//                        ^^^^^^^^^^
+// [diag.baseClassImplementedOutsideOfLibrary] The class 'Foo' can't be implemented outside of its library because it's a base class.
+''');
   }
 
   test_mixin_outside_viaTypedef_outside() async {
@@ -286,13 +279,12 @@
 base class Foo {}
 ''');
 
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'foo.dart';
 typedef FooTypedef = Foo;
 base mixin Bar implements FooTypedef {}
-''',
-      [error(diag.baseClassImplementedOutsideOfLibrary, 71, 10)],
-    );
+//                        ^^^^^^^^^^
+// [diag.baseClassImplementedOutsideOfLibrary] The class 'Foo' can't be implemented outside of its library because it's a base class.
+''');
   }
 }
diff --git a/pkg/analyzer/test/src/diagnostics/base_mixin_implemented_outside_of_library_test.dart b/pkg/analyzer/test/src/diagnostics/base_mixin_implemented_outside_of_library_test.dart
index 580c482..05a8af1 100644
--- a/pkg/analyzer/test/src/diagnostics/base_mixin_implemented_outside_of_library_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/base_mixin_implemented_outside_of_library_test.dart
@@ -6,10 +6,12 @@
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../dart/resolution/context_collection_resolution.dart';
+import '../dart/resolution/node_text_expectations.dart';
 
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(BaseMixinImplementedOutsideOfLibraryTest);
+    defineReflectiveTests(UpdateNodeTextExpectations);
   });
 }
 
@@ -17,7 +19,7 @@
 class BaseMixinImplementedOutsideOfLibraryTest
     extends PubPackageResolutionTest {
   test_class_inside() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 base mixin Foo {}
 base class Bar implements Foo {}
 ''');
@@ -28,13 +30,12 @@
 base mixin Foo {}
 ''');
 
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'foo.dart';
 base class Bar implements Foo {}
-''',
-      [error(diag.baseMixinImplementedOutsideOfLibrary, 45, 3)],
-    );
+//                        ^^^
+// [diag.baseMixinImplementedOutsideOfLibrary] The mixin 'Foo' can't be implemented outside of its library because it's a base mixin.
+''');
   }
 
   test_class_outside_viaExtends() async {
@@ -66,13 +67,12 @@
 typedef FooTypedef = Foo;
 ''');
 
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'foo.dart';
 base class Bar implements FooTypedef {}
-''',
-      [error(diag.baseMixinImplementedOutsideOfLibrary, 45, 10)],
-    );
+//                        ^^^^^^^^^^
+// [diag.baseMixinImplementedOutsideOfLibrary] The mixin 'Foo' can't be implemented outside of its library because it's a base mixin.
+''');
   }
 
   test_class_outside_viaTypedef_outside() async {
@@ -80,18 +80,17 @@
 base mixin Foo {}
 ''');
 
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'foo.dart';
 typedef FooTypedef = Foo;
 base class Bar implements FooTypedef {}
-''',
-      [error(diag.baseMixinImplementedOutsideOfLibrary, 71, 10)],
-    );
+//                        ^^^^^^^^^^
+// [diag.baseMixinImplementedOutsideOfLibrary] The mixin 'Foo' can't be implemented outside of its library because it's a base mixin.
+''');
   }
 
   test_enum_inside() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 base mixin Foo {}
 enum Bar implements Foo { bar }
 ''');
@@ -102,13 +101,12 @@
 base mixin Foo {}
 ''');
 
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'foo.dart';
 enum Bar implements Foo { bar }
-''',
-      [error(diag.baseMixinImplementedOutsideOfLibrary, 39, 3)],
-    );
+//                  ^^^
+// [diag.baseMixinImplementedOutsideOfLibrary] The mixin 'Foo' can't be implemented outside of its library because it's a base mixin.
+''');
   }
 
   test_enum_outside_viaTypedef_inside() async {
@@ -117,13 +115,12 @@
 typedef FooTypedef = Foo;
 ''');
 
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'foo.dart';
 enum Bar implements FooTypedef { bar }
-''',
-      [error(diag.baseMixinImplementedOutsideOfLibrary, 39, 10)],
-    );
+//                  ^^^^^^^^^^
+// [diag.baseMixinImplementedOutsideOfLibrary] The mixin 'Foo' can't be implemented outside of its library because it's a base mixin.
+''');
   }
 
   test_enum_outside_viaTypedef_outside() async {
@@ -131,18 +128,17 @@
 base mixin Foo {}
 ''');
 
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'foo.dart';
 typedef FooTypedef = Foo;
 enum Bar implements FooTypedef { bar }
-''',
-      [error(diag.baseMixinImplementedOutsideOfLibrary, 65, 10)],
-    );
+//                  ^^^^^^^^^^
+// [diag.baseMixinImplementedOutsideOfLibrary] The mixin 'Foo' can't be implemented outside of its library because it's a base mixin.
+''');
   }
 
   test_mixin_inside() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 base mixin Foo {}
 base mixin Bar implements Foo {}
 ''');
@@ -153,13 +149,12 @@
 base mixin Foo {}
 ''');
 
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'foo.dart';
 base mixin Bar implements Foo {}
-''',
-      [error(diag.baseMixinImplementedOutsideOfLibrary, 45, 3)],
-    );
+//                        ^^^
+// [diag.baseMixinImplementedOutsideOfLibrary] The mixin 'Foo' can't be implemented outside of its library because it's a base mixin.
+''');
   }
 
   test_mixin_outside_viaTypedef_inside() async {
@@ -168,13 +163,12 @@
 typedef FooTypedef = Foo;
 ''');
 
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'foo.dart';
 base mixin Bar implements FooTypedef {}
-''',
-      [error(diag.baseMixinImplementedOutsideOfLibrary, 45, 10)],
-    );
+//                        ^^^^^^^^^^
+// [diag.baseMixinImplementedOutsideOfLibrary] The mixin 'Foo' can't be implemented outside of its library because it's a base mixin.
+''');
   }
 
   test_mixin_outside_viaTypedef_outside() async {
@@ -182,13 +176,12 @@
 base mixin Foo {}
 ''');
 
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'foo.dart';
 typedef FooTypedef = Foo;
 base mixin Bar implements FooTypedef {}
-''',
-      [error(diag.baseMixinImplementedOutsideOfLibrary, 71, 10)],
-    );
+//                        ^^^^^^^^^^
+// [diag.baseMixinImplementedOutsideOfLibrary] The mixin 'Foo' can't be implemented outside of its library because it's a base mixin.
+''');
   }
 }
diff --git a/pkg/analyzer/test/src/diagnostics/binary_operator_written_out_test.dart b/pkg/analyzer/test/src/diagnostics/binary_operator_written_out_test.dart
index 360f62d..08a0af0 100644
--- a/pkg/analyzer/test/src/diagnostics/binary_operator_written_out_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/binary_operator_written_out_test.dart
@@ -2,32 +2,32 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/src/diagnostic/diagnostic.dart' as diag;
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../dart/resolution/context_collection_resolution.dart';
+import '../dart/resolution/node_text_expectations.dart';
 
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(BinaryOperatorWrittenOutTest);
+    defineReflectiveTests(UpdateNodeTextExpectations);
   });
 }
 
 @reflectiveTest
 class BinaryOperatorWrittenOutTest extends PubPackageResolutionTest {
   test_using_and() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 f(x, y) {
   return x and y;
+//         ^^^
+// [diag.binaryOperatorWrittenOut] Binary operator 'and' is written as '&' instead of the written out word.
 }
-''',
-      [error(diag.binaryOperatorWrittenOut, 21, 3)],
-    );
+''');
   }
 
   test_using_and_no_error() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 f(x, y) {
   return x & y;
 }
@@ -35,18 +35,17 @@
   }
 
   test_using_or() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 f(x, y) {
   return x or y;
+//         ^^
+// [diag.binaryOperatorWrittenOut] Binary operator 'or' is written as '|' instead of the written out word.
 }
-''',
-      [error(diag.binaryOperatorWrittenOut, 21, 2)],
-    );
+''');
   }
 
   test_using_or_no_error() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 f(x, y) {
   return x | y;
 }
@@ -54,18 +53,17 @@
   }
 
   test_using_shl() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 f(x) {
   return x shl 2;
+//         ^^^
+// [diag.binaryOperatorWrittenOut] Binary operator 'shl' is written as '<<' instead of the written out word.
 }
-''',
-      [error(diag.binaryOperatorWrittenOut, 18, 3)],
-    );
+''');
   }
 
   test_using_shl_no_error() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 f(x) {
   return x << 2;
 }
@@ -73,18 +71,17 @@
   }
 
   test_using_shr() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 f(x) {
   return x shr 2;
+//         ^^^
+// [diag.binaryOperatorWrittenOut] Binary operator 'shr' is written as '>>' instead of the written out word.
 }
-''',
-      [error(diag.binaryOperatorWrittenOut, 18, 3)],
-    );
+''');
   }
 
   test_using_shr_no_error() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 f(x) {
   return x >> 2;
 }
@@ -92,18 +89,17 @@
   }
 
   test_using_xor() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 f(x, y) {
   return x xor y;
+//         ^^^
+// [diag.binaryOperatorWrittenOut] Binary operator 'xor' is written as '^' instead of the written out word.
 }
-''',
-      [error(diag.binaryOperatorWrittenOut, 21, 3)],
-    );
+''');
   }
 
   test_using_xor_no_error() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 f(x, y) {
   return x ^ y;
 }
diff --git a/pkg/analyzer/test/src/diagnostics/body_might_complete_normally_catch_error_test.dart b/pkg/analyzer/test/src/diagnostics/body_might_complete_normally_catch_error_test.dart
index fc7f7c3..6c7cb6a 100644
--- a/pkg/analyzer/test/src/diagnostics/body_might_complete_normally_catch_error_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/body_might_complete_normally_catch_error_test.dart
@@ -2,21 +2,22 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/src/diagnostic/diagnostic.dart' as diag;
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../dart/resolution/context_collection_resolution.dart';
+import '../dart/resolution/node_text_expectations.dart';
 
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(BodyMayCompleteNormallyCatchErrorTest);
+    defineReflectiveTests(UpdateNodeTextExpectations);
   });
 }
 
 @reflectiveTest
 class BodyMayCompleteNormallyCatchErrorTest extends PubPackageResolutionTest {
   test_alwaysReturn() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 void f(Future<int> future) {
   future.catchError((e, st) {
     return 7;
@@ -26,7 +27,7 @@
   }
 
   test_noReturn_futureOrVoidReturnType() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'dart:async';
 void f(Future<FutureOr<void>> future) {
   future.catchError((e, st) {});
@@ -35,40 +36,37 @@
   }
 
   test_noReturn_namedBeforePositional() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 void f(Future<int> future) {
   future.catchError(test: (_) => false, (e, st) {});
+//                                              ^
+// [diag.bodyMightCompleteNormallyCatchError] This 'onError' handler must return a value assignable to 'int', but ends without returning a value.
 }
-''',
-      [error(diag.bodyMightCompleteNormallyCatchError, 77, 1)],
-    );
+''');
   }
 
   test_noReturn_nonNullableReturnType() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 void f(Future<int> future) {
   future.catchError((e, st) {});
+//                          ^
+// [diag.bodyMightCompleteNormallyCatchError] This 'onError' handler must return a value assignable to 'int', but ends without returning a value.
 }
-''',
-      [error(diag.bodyMightCompleteNormallyCatchError, 57, 1)],
-    );
+''');
   }
 
   test_noReturn_nullableReturnType() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 void f(Future<int?> future) {
   future.catchError((e, st) {});
+//                          ^
+// [diag.bodyMightCompleteNormallyCatchError] This 'onError' handler must return a value assignable to 'int?', but ends without returning a value.
 }
-''',
-      [error(diag.bodyMightCompleteNormallyCatchError, 58, 1)],
-    );
+''');
   }
 
   test_noReturn_nullReturnType() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 void f(Future<Null> future) {
   future.catchError((e, st) {});
 }
@@ -76,7 +74,7 @@
   }
 
   test_noReturn_voidReturnType() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 void f(Future<void> future) {
   future.catchError((e, st) {});
 }
diff --git a/pkg/analyzer/test/src/diagnostics/body_might_complete_normally_nullable_test.dart b/pkg/analyzer/test/src/diagnostics/body_might_complete_normally_nullable_test.dart
index eb1cf01..561ea1f 100644
--- a/pkg/analyzer/test/src/diagnostics/body_might_complete_normally_nullable_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/body_might_complete_normally_nullable_test.dart
@@ -2,45 +2,45 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/src/diagnostic/diagnostic.dart' as diag;
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../dart/resolution/context_collection_resolution.dart';
+import '../dart/resolution/node_text_expectations.dart';
 
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(BodyMightCompleteNormallyNullableTest);
+    defineReflectiveTests(UpdateNodeTextExpectations);
   });
 }
 
 @reflectiveTest
 class BodyMightCompleteNormallyNullableTest extends PubPackageResolutionTest {
   test_function_async_block_futureOrIntQuestion() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'dart:async';
 FutureOr<int?> f(Future f) async {}
-''',
-      [error(diag.bodyMightCompleteNormallyNullable, 36, 1)],
-    );
+//             ^
+// [diag.bodyMightCompleteNormallyNullable] This function has a nullable return type of 'FutureOr<int?>', but ends without returning a value.
+''');
   }
 
   test_function_async_block_futureOrVoid() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'dart:async';
 FutureOr<void> f(Future f) async {}
 ''');
   }
 
   test_function_async_block_void() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'dart:async';
 void f(Future f) async {}
 ''');
   }
 
   test_function_switchStatement_exhaustive_extensionType() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 enum E { a, b }
 
 extension type EE(E it) {}
@@ -57,22 +57,21 @@
   }
 
   test_function_sync_block_dynamic() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 dynamic f() {}
 ''');
   }
 
   test_function_sync_block_intQuestion() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 int? f() {}
-''',
-      [error(diag.bodyMightCompleteNormallyNullable, 5, 1)],
-    );
+//   ^
+// [diag.bodyMightCompleteNormallyNullable] This function has a nullable return type of 'int?', but ends without returning a value.
+''');
   }
 
   test_function_sync_block_intQuestion_definiteReturn() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 int? f() {
   return null;
 }
@@ -80,13 +79,13 @@
   }
 
   test_function_sync_block_Null() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 Null f() {}
 ''');
   }
 
   test_function_sync_block_void() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 void f() {}
 ''');
   }
diff --git a/pkg/analyzer/test/src/diagnostics/body_might_complete_normally_test.dart b/pkg/analyzer/test/src/diagnostics/body_might_complete_normally_test.dart
index 15ed41a..82c5977 100644
--- a/pkg/analyzer/test/src/diagnostics/body_might_complete_normally_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/body_might_complete_normally_test.dart
@@ -6,11 +6,13 @@
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../dart/resolution/context_collection_resolution.dart';
+import '../dart/resolution/node_text_expectations.dart';
 
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(BodyMayCompleteNormallyTest);
     defineReflectiveTests(BodyMayCompleteNormallyTest_Language219);
+    defineReflectiveTests(UpdateNodeTextExpectations);
   });
 }
 
@@ -32,7 +34,7 @@
   bool get _arePatternsEnabled;
 
   test_enum_method_nonNullable_blockBody_switchStatement_notNullable_exhaustive() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 enum E {
   a;
 
@@ -74,74 +76,69 @@
   }
 
   test_factoryConstructor_named_blockBody() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   factory A.named() {}
+//        ^^^^^^^
+// [diag.bodyMightCompleteNormally] The body might complete normally, causing 'null' to be returned, but the return type, 'A', is a potentially non-nullable type.
 }
-''',
-      [error(diag.bodyMightCompleteNormally, 20, 7)],
-    );
+''');
   }
 
   test_factoryConstructor_unnamed_blockBody() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   factory A() {}
+//        ^
+// [diag.bodyMightCompleteNormally] The body might complete normally, causing 'null' to be returned, but the return type, 'A', is a potentially non-nullable type.
 }
-''',
-      [error(diag.bodyMightCompleteNormally, 20, 1)],
-    );
+''');
   }
 
   test_function_future_int_blockBody_async() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 Future<int> foo() async {}
-''',
-      [error(diag.bodyMightCompleteNormally, 12, 3)],
-    );
+//          ^^^
+// [diag.bodyMightCompleteNormally] The body might complete normally, causing 'null' to be returned, but the return type, 'FutureOr<int>', is a potentially non-nullable type.
+''');
   }
 
   test_function_future_void_blockBody() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 Future<void> foo() {}
-''',
-      [error(diag.bodyMightCompleteNormally, 13, 3)],
-    );
+//           ^^^
+// [diag.bodyMightCompleteNormally] The body might complete normally, causing 'null' to be returned, but the return type, 'Future<void>', is a potentially non-nullable type.
+''');
   }
 
   test_function_future_void_blockBody_async() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 Future<void> foo() async {}
 ''');
   }
 
   test_function_nonNullable_blockBody() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 int foo() {}
-''',
-      [error(diag.bodyMightCompleteNormally, 4, 3)],
-    );
+//  ^^^
+// [diag.bodyMightCompleteNormally] The body might complete normally, causing 'null' to be returned, but the return type, 'int', is a potentially non-nullable type.
+''');
   }
 
   test_function_nonNullable_blockBody_generator_async() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 Stream<int> foo() async* {}
 ''');
   }
 
   test_function_nonNullable_blockBody_generator_sync() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 Iterable<int> foo() sync* {}
 ''');
   }
 
   test_function_nonNullable_blockBody_switchStatement_notNullable_exhaustive() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 enum Foo { a, b }
 
 int f(Foo foo) {
@@ -156,7 +153,7 @@
   }
 
   test_function_nonNullable_blockBody_switchStatement_notNullable_exhaustive_enhanced() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 enum E {
   a;
 
@@ -176,7 +173,7 @@
   test_function_nonNullable_blockBody_switchStatement_notNullable_exhaustive_parenthesis() async {
     // TODO(johnniwinther): Re-enable this test for the patterns feature.
     if (_arePatternsEnabled) return;
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 enum Foo { a, b }
 
 int f(Foo foo) {
@@ -239,7 +236,7 @@
   }
 
   test_function_nonNullable_blockBody_switchStatement_nullable_exhaustive_default() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 enum Foo { a, b }
 
 int f(Foo? foo) {
@@ -256,7 +253,7 @@
   }
 
   test_function_nonNullable_blockBody_switchStatement_nullable_exhaustive_null() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 enum Foo { a, b }
 
 int f(Foo? foo) {
@@ -297,7 +294,7 @@
   }
 
   test_function_nullable_blockBody() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 int foo() {
   return 0;
 }
@@ -305,31 +302,29 @@
   }
 
   test_functionExpression_future_int_blockBody_async() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 void f() {
   Future<int> Function() foo = () async {};
+//                                      ^
+// [diag.bodyMightCompleteNormally] The body might complete normally, causing 'null' to be returned, but the return type, 'FutureOr<int>', is a potentially non-nullable type.
   foo;
 }
-''',
-      [error(diag.bodyMightCompleteNormally, 51, 1)],
-    );
+''');
   }
 
   test_functionExpression_future_void_blockBody() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 void f() {
   Future<void> Function() foo = () {};
+//                                 ^
+// [diag.bodyMightCompleteNormally] The body might complete normally, causing 'null' to be returned, but the return type, 'Future<void>', is a potentially non-nullable type.
   foo;
 }
-''',
-      [error(diag.bodyMightCompleteNormally, 46, 1)],
-    );
+''');
   }
 
   test_functionExpression_future_void_blockBody_async() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 main() {
   Future<void> Function() foo = () async {};
   foo;
@@ -338,20 +333,19 @@
   }
 
   test_functionExpression_notNullable_blockBody() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 void f() {
   int Function() foo = () {
+//                        ^
+// [diag.bodyMightCompleteNormally] The body might complete normally, causing 'null' to be returned, but the return type, 'int', is a potentially non-nullable type.
   };
   foo;
 }
-''',
-      [error(diag.bodyMightCompleteNormally, 37, 1)],
-    );
+''');
   }
 
   test_functionExpression_notNullable_blockBody_return() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 main() {
   int Function() foo = () {
     return 0;
@@ -362,7 +356,7 @@
   }
 
   test_generativeConstructor_blockBody() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   A() {}
 }
@@ -370,7 +364,7 @@
   }
 
   test_generativeConstructor_emptyBody() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   A();
 }
@@ -378,29 +372,27 @@
   }
 
   test_method_future_int_blockBody_async() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   Future<int> foo() async {}
+//            ^^^
+// [diag.bodyMightCompleteNormally] The body might complete normally, causing 'null' to be returned, but the return type, 'FutureOr<int>', is a potentially non-nullable type.
 }
-''',
-      [error(diag.bodyMightCompleteNormally, 24, 3)],
-    );
+''');
   }
 
   test_method_future_void_blockBody() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   Future<void> foo() {}
+//             ^^^
+// [diag.bodyMightCompleteNormally] The body might complete normally, causing 'null' to be returned, but the return type, 'Future<void>', is a potentially non-nullable type.
 }
-''',
-      [error(diag.bodyMightCompleteNormally, 25, 3)],
-    );
+''');
   }
 
   test_method_future_void_blockBody_async() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   Future<void> foo() async {}
 }
@@ -408,18 +400,17 @@
   }
 
   test_method_nonNullable_blockBody() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   int foo() {}
+//    ^^^
+// [diag.bodyMightCompleteNormally] The body might complete normally, causing 'null' to be returned, but the return type, 'int', is a potentially non-nullable type.
 }
-''',
-      [error(diag.bodyMightCompleteNormally, 16, 3)],
-    );
+''');
   }
 
   test_method_nonNullable_blockBody_generator_async() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   Stream<int> foo() async* {
     yield 0;
@@ -429,7 +420,7 @@
   }
 
   test_method_nonNullable_blockBody_generator_sync() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   Iterable<int> foo() sync* {
     yield 0;
@@ -439,7 +430,7 @@
   }
 
   test_method_nonNullable_blockBody_return() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   int foo() {
     return 0;
@@ -449,7 +440,7 @@
   }
 
   test_method_nonNullable_blockBody_throw() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   int foo() {
     throw 0;
@@ -459,7 +450,7 @@
   }
 
   test_method_nonNullable_emptyBody() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 abstract class A {
   int foo();
 }
@@ -467,7 +458,7 @@
   }
 
   test_method_nonNullable_expressionBody() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   int foo() => 0;
 }
@@ -475,7 +466,7 @@
   }
 
   test_method_nonNullable_expressionBody_throw() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   int foo() => throw 0;
 }
@@ -483,7 +474,7 @@
   }
 
   test_method_nullable_blockBody_return() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   int? foo() {
     return 0;
@@ -496,11 +487,9 @@
     // Even though this code has an illegal return type for a setter, do not
     // use the invalid return type to report BODY_MIGHT_COMPLETE_NORMALLY for
     // setters.
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 bool set s(int value) {}
-''',
-      [error(diag.nonVoidReturnForSetter, 0, 4)],
-    );
+// [diag.nonVoidReturnForSetter][column 1][length 4] The return type of the setter must be 'void' or absent.
+''');
   }
 }
diff --git a/pkg/analyzer/test/src/diagnostics/break_label_on_switch_member_test.dart b/pkg/analyzer/test/src/diagnostics/break_label_on_switch_member_test.dart
index fbefbe5..b516252 100644
--- a/pkg/analyzer/test/src/diagnostics/break_label_on_switch_member_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/break_label_on_switch_member_test.dart
@@ -2,38 +2,37 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/src/diagnostic/diagnostic.dart' as diag;
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../dart/resolution/context_collection_resolution.dart';
+import '../dart/resolution/node_text_expectations.dart';
 
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(BreakLabelOnSwitchMemberTest);
+    defineReflectiveTests(UpdateNodeTextExpectations);
   });
 }
 
 @reflectiveTest
 class BreakLabelOnSwitchMemberTest extends PubPackageResolutionTest {
   test_it() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 void f(int x) {
   switch (x) {
     L: case 0:
       break;
     case 1:
       break L;
+//          ^
+// [diag.breakLabelOnSwitchMember] A break label resolves to the 'case' or 'default' statement.
   }
 }
-''',
-      [error(diag.breakLabelOnSwitchMember, 83, 1)],
-    );
+''');
   }
 
   test_it_language219() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 // @dart = 2.19
 void f(int x) {
   switch (x) {
@@ -41,10 +40,10 @@
       break;
     case 1:
       break L;
+//          ^
+// [diag.breakLabelOnSwitchMember] A break label resolves to the 'case' or 'default' statement.
   }
 }
-''',
-      [error(diag.breakLabelOnSwitchMember, 99, 1)],
-    );
+''');
   }
 }
diff --git a/pkg/analyzer/test/src/diagnostics/built_in_identifier_as_extension_name_test.dart b/pkg/analyzer/test/src/diagnostics/built_in_identifier_as_extension_name_test.dart
index 0ec9ef4..bb7d278 100644
--- a/pkg/analyzer/test/src/diagnostics/built_in_identifier_as_extension_name_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/built_in_identifier_as_extension_name_test.dart
@@ -2,64 +2,61 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/src/diagnostic/diagnostic.dart' as diag;
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../dart/resolution/context_collection_resolution.dart';
+import '../dart/resolution/node_text_expectations.dart';
 
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(BuiltInIdentifierAsExtensionNameTest);
+    defineReflectiveTests(UpdateNodeTextExpectations);
   });
 }
 
 @reflectiveTest
 class BuiltInIdentifierAsExtensionNameTest extends PubPackageResolutionTest {
   test_as() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 extension as on Object {}
-''',
-      [error(diag.builtInIdentifierAsExtensionName, 10, 2)],
-    );
+//        ^^
+// [diag.builtInIdentifierAsExtensionName] The built-in identifier 'as' can't be used as an extension name.
+''');
   }
 
   test_Function() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 extension Function on Object {}
-''',
-      [error(diag.builtInIdentifierAsExtensionName, 10, 8)],
-    );
+//        ^^^^^^^^
+// [diag.builtInIdentifierAsExtensionName] The built-in identifier 'Function' can't be used as an extension name.
+''');
   }
 
   test_inout() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 extension inout on Object {}
-''',
-      [error(diag.builtInIdentifierAsExtensionName, 10, 5)],
-    );
+//        ^^^^^
+// [diag.builtInIdentifierAsExtensionName] The built-in identifier 'inout' can't be used as an extension name.
+''');
   }
 
   test_inout_language310() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 // @dart = 3.10
 extension inout on Object {}
 ''');
   }
 
   test_out() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 extension out on Object {}
-''',
-      [error(diag.builtInIdentifierAsExtensionName, 10, 3)],
-    );
+//        ^^^
+// [diag.builtInIdentifierAsExtensionName] The built-in identifier 'out' can't be used as an extension name.
+''');
   }
 
   test_out_language310() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 // @dart = 3.10
 extension out on Object {}
 ''');
diff --git a/pkg/analyzer/test/src/diagnostics/built_in_identifier_as_extension_type_name_test.dart b/pkg/analyzer/test/src/diagnostics/built_in_identifier_as_extension_type_name_test.dart
index 9ad2d52..0f3a184 100644
--- a/pkg/analyzer/test/src/diagnostics/built_in_identifier_as_extension_type_name_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/built_in_identifier_as_extension_type_name_test.dart
@@ -2,14 +2,15 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/src/diagnostic/diagnostic.dart' as diag;
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../dart/resolution/context_collection_resolution.dart';
+import '../dart/resolution/node_text_expectations.dart';
 
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(BuiltInIdentifierAsExtensionTypeNameTest);
+    defineReflectiveTests(UpdateNodeTextExpectations);
   });
 }
 
@@ -17,50 +18,46 @@
 class BuiltInIdentifierAsExtensionTypeNameTest
     extends PubPackageResolutionTest {
   test_as() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 extension type as(int it) {}
-''',
-      [error(diag.builtInIdentifierAsExtensionTypeName, 15, 2)],
-    );
+//             ^^
+// [diag.builtInIdentifierAsExtensionTypeName] The built-in identifier 'as' can't be used as an extension type name.
+''');
   }
 
   test_Function() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 extension type Function(int it) {}
-''',
-      [error(diag.builtInIdentifierAsExtensionTypeName, 15, 8)],
-    );
+//             ^^^^^^^^
+// [diag.builtInIdentifierAsExtensionTypeName] The built-in identifier 'Function' can't be used as an extension type name.
+''');
   }
 
   test_inout() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 extension type inout(int it) {}
-''',
-      [error(diag.builtInIdentifierAsExtensionTypeName, 15, 5)],
-    );
+//             ^^^^^
+// [diag.builtInIdentifierAsExtensionTypeName] The built-in identifier 'inout' can't be used as an extension type name.
+''');
   }
 
   test_inout_language310() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 // @dart = 3.10
 extension type inout(int it) {}
 ''');
   }
 
   test_out() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 extension type out(int it) {}
-''',
-      [error(diag.builtInIdentifierAsExtensionTypeName, 15, 3)],
-    );
+//             ^^^
+// [diag.builtInIdentifierAsExtensionTypeName] The built-in identifier 'out' can't be used as an extension type name.
+''');
   }
 
   test_out_language310() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 // @dart = 3.10
 extension type out(int it) {}
 ''');
diff --git a/pkg/analyzer/test/src/diagnostics/built_in_identifier_as_prefix_name_test.dart b/pkg/analyzer/test/src/diagnostics/built_in_identifier_as_prefix_name_test.dart
index 577cdb2..ab07d1b 100644
--- a/pkg/analyzer/test/src/diagnostics/built_in_identifier_as_prefix_name_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/built_in_identifier_as_prefix_name_test.dart
@@ -2,84 +2,75 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/src/diagnostic/diagnostic.dart' as diag;
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../dart/resolution/context_collection_resolution.dart';
+import '../dart/resolution/node_text_expectations.dart';
 
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(BuiltInIdentifierAsPrefixNameTest);
+    defineReflectiveTests(UpdateNodeTextExpectations);
   });
 }
 
 @reflectiveTest
 class BuiltInIdentifierAsPrefixNameTest extends PubPackageResolutionTest {
   test_abstract() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'dart:async' as abstract;
-''',
-      [
-        error(diag.unusedImport, 7, 12),
-        error(diag.builtInIdentifierAsPrefixName, 23, 8),
-      ],
-    );
+//     ^^^^^^^^^^^^
+// [diag.unusedImport] Unused import: 'dart:async'.
+//                     ^^^^^^^^
+// [diag.builtInIdentifierAsPrefixName] The built-in identifier 'abstract' can't be used as a prefix name.
+''');
   }
 
   test_Function() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'dart:async' as Function;
-''',
-      [
-        error(diag.unusedImport, 7, 12),
-        error(diag.builtInIdentifierAsPrefixName, 23, 8),
-      ],
-    );
+//     ^^^^^^^^^^^^
+// [diag.unusedImport] Unused import: 'dart:async'.
+//                     ^^^^^^^^
+// [diag.builtInIdentifierAsPrefixName] The built-in identifier 'Function' can't be used as a prefix name.
+''');
   }
 
   test_inout() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'dart:async' as inout;
-''',
-      [
-        error(diag.unusedImport, 7, 12),
-        error(diag.builtInIdentifierAsPrefixName, 23, 5),
-      ],
-    );
+//     ^^^^^^^^^^^^
+// [diag.unusedImport] Unused import: 'dart:async'.
+//                     ^^^^^
+// [diag.builtInIdentifierAsPrefixName] The built-in identifier 'inout' can't be used as a prefix name.
+''');
   }
 
   test_inout_language310() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 // @dart = 3.10
 import 'dart:async' as inout;
-''',
-      [error(diag.unusedImport, 23, 12)],
-    );
+//     ^^^^^^^^^^^^
+// [diag.unusedImport] Unused import: 'dart:async'.
+''');
   }
 
   test_out() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'dart:async' as out;
-''',
-      [
-        error(diag.unusedImport, 7, 12),
-        error(diag.builtInIdentifierAsPrefixName, 23, 3),
-      ],
-    );
+//     ^^^^^^^^^^^^
+// [diag.unusedImport] Unused import: 'dart:async'.
+//                     ^^^
+// [diag.builtInIdentifierAsPrefixName] The built-in identifier 'out' can't be used as a prefix name.
+''');
   }
 
   test_out_language310() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 // @dart = 3.10
 import 'dart:async' as out;
-''',
-      [error(diag.unusedImport, 23, 12)],
-    );
+//     ^^^^^^^^^^^^
+// [diag.unusedImport] Unused import: 'dart:async'.
+''');
   }
 }
diff --git a/pkg/analyzer/test/src/diagnostics/built_in_identifier_as_type_name_test.dart b/pkg/analyzer/test/src/diagnostics/built_in_identifier_as_type_name_test.dart
index 836d94b..17ddf8c 100644
--- a/pkg/analyzer/test/src/diagnostics/built_in_identifier_as_type_name_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/built_in_identifier_as_type_name_test.dart
@@ -2,148 +2,139 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/src/diagnostic/diagnostic.dart' as diag;
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../dart/resolution/context_collection_resolution.dart';
+import '../dart/resolution/node_text_expectations.dart';
 
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(BuiltInIdentifierAsTypeNameTest);
+    defineReflectiveTests(UpdateNodeTextExpectations);
   });
 }
 
 @reflectiveTest
 class BuiltInIdentifierAsTypeNameTest extends PubPackageResolutionTest {
   test_class_as() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 class as {}
-''',
-      [error(diag.builtInIdentifierAsTypeName, 6, 2)],
-    );
+//    ^^
+// [diag.builtInIdentifierAsTypeName] The built-in identifier 'as' can't be used as a type name.
+''');
   }
 
   test_class_Function() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 class Function {}
-''',
-      [error(diag.builtInIdentifierAsTypeName, 6, 8)],
-    );
+//    ^^^^^^^^
+// [diag.builtInIdentifierAsTypeName] The built-in identifier 'Function' can't be used as a type name.
+''');
   }
 
   test_class_inout() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 class inout {}
-''',
-      [error(diag.builtInIdentifierAsTypeName, 6, 5)],
-    );
+//    ^^^^^
+// [diag.builtInIdentifierAsTypeName] The built-in identifier 'inout' can't be used as a type name.
+''');
   }
 
   test_class_inout_language310() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 // @dart = 3.10
 class inout {}
 ''');
   }
 
   test_class_out() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 class out {}
-''',
-      [error(diag.builtInIdentifierAsTypeName, 6, 3)],
-    );
+//    ^^^
+// [diag.builtInIdentifierAsTypeName] The built-in identifier 'out' can't be used as a type name.
+''');
   }
 
   test_class_out_language310() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 // @dart = 3.10
 class out {}
 ''');
   }
 
   test_enum_as() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 enum as {
+//   ^^
+// [diag.builtInIdentifierAsTypeName] The built-in identifier 'as' can't be used as a type name.
   v
 }
-''',
-      [error(diag.builtInIdentifierAsTypeName, 5, 2)],
-    );
+''');
   }
 
   test_enum_inout() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 enum inout {v}
-''',
-      [error(diag.builtInIdentifierAsTypeName, 5, 5)],
-    );
+//   ^^^^^
+// [diag.builtInIdentifierAsTypeName] The built-in identifier 'inout' can't be used as a type name.
+''');
   }
 
   test_enum_inout_language310() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 // @dart = 3.10
 enum inout {v}
 ''');
   }
 
   test_enum_out() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 enum out {v}
-''',
-      [error(diag.builtInIdentifierAsTypeName, 5, 3)],
-    );
+//   ^^^
+// [diag.builtInIdentifierAsTypeName] The built-in identifier 'out' can't be used as a type name.
+''');
   }
 
   test_enum_out_language310() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 // @dart = 3.10
 enum out {v}
 ''');
   }
 
   test_mixin_as() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 mixin as {}
-''',
-      [error(diag.builtInIdentifierAsTypeName, 6, 2)],
-    );
+//    ^^
+// [diag.builtInIdentifierAsTypeName] The built-in identifier 'as' can't be used as a type name.
+''');
   }
 
   test_mixin_Function() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 mixin Function {}
-''',
-      [error(diag.builtInIdentifierAsTypeName, 6, 8)],
-    );
+//    ^^^^^^^^
+// [diag.builtInIdentifierAsTypeName] The built-in identifier 'Function' can't be used as a type name.
+''');
   }
 
   test_mixin_inout() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 mixin inout {}
-''',
-      [error(diag.builtInIdentifierAsTypeName, 6, 5)],
-    );
+//    ^^^^^
+// [diag.builtInIdentifierAsTypeName] The built-in identifier 'inout' can't be used as a type name.
+''');
   }
 
   test_mixin_inout_language310() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 // @dart = 3.10
 mixin inout {}
 ''');
   }
 
   test_mixin_OK_on() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {}
 
 mixin on on A {}
@@ -159,16 +150,15 @@
   }
 
   test_mixin_out() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 mixin out {}
-''',
-      [error(diag.builtInIdentifierAsTypeName, 6, 3)],
-    );
+//    ^^^
+// [diag.builtInIdentifierAsTypeName] The built-in identifier 'out' can't be used as a type name.
+''');
   }
 
   test_mixin_out_language310() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 // @dart = 3.10
 mixin out {}
 ''');
diff --git a/pkg/analyzer/test/src/diagnostics/built_in_identifier_as_type_parameter_name_test.dart b/pkg/analyzer/test/src/diagnostics/built_in_identifier_as_type_parameter_name_test.dart
index 5ba5035..c2d3d7e 100644
--- a/pkg/analyzer/test/src/diagnostics/built_in_identifier_as_type_parameter_name_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/built_in_identifier_as_type_parameter_name_test.dart
@@ -2,14 +2,15 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/src/diagnostic/diagnostic.dart' as diag;
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../dart/resolution/context_collection_resolution.dart';
+import '../dart/resolution/node_text_expectations.dart';
 
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(BuiltInIdentifierAsTypeParameterNameTest);
+    defineReflectiveTests(UpdateNodeTextExpectations);
   });
 }
 
@@ -17,106 +18,96 @@
 class BuiltInIdentifierAsTypeParameterNameTest
     extends PubPackageResolutionTest {
   test_class_as() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 class A<as> {}
-''',
-      [error(diag.builtInIdentifierAsTypeParameterName, 8, 2)],
-    );
+//      ^^
+// [diag.builtInIdentifierAsTypeParameterName] The built-in identifier 'as' can't be used as a type parameter name.
+''');
   }
 
   test_class_Function() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 class A<Function> {}
-''',
-      [error(diag.builtInIdentifierAsTypeParameterName, 8, 8)],
-    );
+//      ^^^^^^^^
+// [diag.builtInIdentifierAsTypeParameterName] The built-in identifier 'Function' can't be used as a type parameter name.
+''');
   }
 
   test_class_inout() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 class A<inout> {}
-''',
-      [error(diag.builtInIdentifierAsTypeParameterName, 8, 5)],
-    );
+//      ^^^^^
+// [diag.builtInIdentifierAsTypeParameterName] The built-in identifier 'inout' can't be used as a type parameter name.
+''');
   }
 
   test_class_inout_language310() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 // @dart = 3.10
 class A<inout> {}
 ''');
   }
 
   test_class_out() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 class A<out> {}
-''',
-      [error(diag.builtInIdentifierAsTypeParameterName, 8, 3)],
-    );
+//      ^^^
+// [diag.builtInIdentifierAsTypeParameterName] The built-in identifier 'out' can't be used as a type parameter name.
+''');
   }
 
   test_class_out_language310() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 // @dart = 3.10
 class A<out> {}
 ''');
   }
 
   test_extension_as() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 extension <as> on List {}
-''',
-      [error(diag.builtInIdentifierAsTypeParameterName, 11, 2)],
-    );
+//         ^^
+// [diag.builtInIdentifierAsTypeParameterName] The built-in identifier 'as' can't be used as a type parameter name.
+''');
   }
 
   test_extension_inout() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 extension <inout> on List {}
-''',
-      [error(diag.builtInIdentifierAsTypeParameterName, 11, 5)],
-    );
+//         ^^^^^
+// [diag.builtInIdentifierAsTypeParameterName] The built-in identifier 'inout' can't be used as a type parameter name.
+''');
   }
 
   test_extension_out() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 extension <out> on List {}
-''',
-      [error(diag.builtInIdentifierAsTypeParameterName, 11, 3)],
-    );
+//         ^^^
+// [diag.builtInIdentifierAsTypeParameterName] The built-in identifier 'out' can't be used as a type parameter name.
+''');
   }
 
   test_function_as() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 void f<as>() {}
-''',
-      [error(diag.builtInIdentifierAsTypeParameterName, 7, 2)],
-    );
+//     ^^
+// [diag.builtInIdentifierAsTypeParameterName] The built-in identifier 'as' can't be used as a type parameter name.
+''');
   }
 
   test_function_inout() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 void f<inout>() {}
-''',
-      [error(diag.builtInIdentifierAsTypeParameterName, 7, 5)],
-    );
+//     ^^^^^
+// [diag.builtInIdentifierAsTypeParameterName] The built-in identifier 'inout' can't be used as a type parameter name.
+''');
   }
 
   test_function_out() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 void f<out>() {}
-''',
-      [error(diag.builtInIdentifierAsTypeParameterName, 7, 3)],
-    );
+//     ^^^
+// [diag.builtInIdentifierAsTypeParameterName] The built-in identifier 'out' can't be used as a type parameter name.
+''');
   }
 }
diff --git a/pkg/analyzer/test/src/diagnostics/built_in_identifier_as_typedef_name_test.dart b/pkg/analyzer/test/src/diagnostics/built_in_identifier_as_typedef_name_test.dart
index c617d1c..a6a98aa 100644
--- a/pkg/analyzer/test/src/diagnostics/built_in_identifier_as_typedef_name_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/built_in_identifier_as_typedef_name_test.dart
@@ -2,43 +2,42 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/src/diagnostic/diagnostic.dart' as diag;
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../dart/resolution/context_collection_resolution.dart';
+import '../dart/resolution/node_text_expectations.dart';
 
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(BuiltInIdentifierAsTypedefNameTest);
+    defineReflectiveTests(UpdateNodeTextExpectations);
   });
 }
 
 @reflectiveTest
 class BuiltInIdentifierAsTypedefNameTest extends PubPackageResolutionTest {
   test_classTypeAlias() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {}
 mixin B {}
 class as = A with B;
-''',
-      [error(diag.builtInIdentifierAsTypedefName, 28, 2)],
-    );
+//    ^^
+// [diag.builtInIdentifierAsTypedefName] The built-in identifier 'as' can't be used as a typedef name.
+''');
   }
 
   test_classTypeAlias_inout() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {}
 mixin B {}
 class inout = A with B;
-''',
-      [error(diag.builtInIdentifierAsTypedefName, 28, 5)],
-    );
+//    ^^^^^
+// [diag.builtInIdentifierAsTypedefName] The built-in identifier 'inout' can't be used as a typedef name.
+''');
   }
 
   test_classTypeAlias_inout_language310() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 // @dart = 3.10
 class A {}
 mixin B {}
@@ -47,18 +46,17 @@
   }
 
   test_classTypeAlias_out() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {}
 mixin B {}
 class out = A with B;
-''',
-      [error(diag.builtInIdentifierAsTypedefName, 28, 3)],
-    );
+//    ^^^
+// [diag.builtInIdentifierAsTypedefName] The built-in identifier 'out' can't be used as a typedef name.
+''');
   }
 
   test_classTypeAlias_out_language310() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 // @dart = 3.10
 class A {}
 mixin B {}
@@ -67,126 +65,107 @@
   }
 
   test_typedef_classic() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 typedef void as();
-''',
-      [
-        error(diag.expectedIdentifierButGotKeyword, 13, 2),
-        error(diag.builtInIdentifierAsTypedefName, 13, 2),
-      ],
-    );
+//           ^^
+// [diag.expectedIdentifierButGotKeyword] 'as' can't be used as an identifier because it's a keyword.
+// [diag.builtInIdentifierAsTypedefName] The built-in identifier 'as' can't be used as a typedef name.
+''');
   }
 
   test_typedef_classic_as() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 typedef void as();
-''',
-      [
-        error(diag.expectedIdentifierButGotKeyword, 13, 2),
-        error(diag.builtInIdentifierAsTypedefName, 13, 2),
-      ],
-    );
+//           ^^
+// [diag.expectedIdentifierButGotKeyword] 'as' can't be used as an identifier because it's a keyword.
+// [diag.builtInIdentifierAsTypedefName] The built-in identifier 'as' can't be used as a typedef name.
+''');
   }
 
   test_typedef_classic_inout() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 typedef void inout();
-''',
-      [error(diag.builtInIdentifierAsTypedefName, 13, 5)],
-    );
+//           ^^^^^
+// [diag.builtInIdentifierAsTypedefName] The built-in identifier 'inout' can't be used as a typedef name.
+''');
   }
 
   test_typedef_classic_inout_language310() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 // @dart = 3.10
 typedef void inout();
 ''');
   }
 
   test_typedef_classic_out() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 typedef void out();
-''',
-      [error(diag.builtInIdentifierAsTypedefName, 13, 3)],
-    );
+//           ^^^
+// [diag.builtInIdentifierAsTypedefName] The built-in identifier 'out' can't be used as a typedef name.
+''');
   }
 
   test_typedef_classic_out_language310() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 // @dart = 3.10
 typedef void out();
 ''');
   }
 
   test_typedef_generic_as() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 typedef as = void Function();
-''',
-      [
-        error(diag.builtInIdentifierAsTypedefName, 8, 2),
-        error(diag.expectedIdentifierButGotKeyword, 8, 2),
-      ],
-    );
+//      ^^
+// [diag.expectedIdentifierButGotKeyword] 'as' can't be used as an identifier because it's a keyword.
+// [diag.builtInIdentifierAsTypedefName] The built-in identifier 'as' can't be used as a typedef name.
+''');
   }
 
   test_typedef_generic_inout() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 typedef inout = void Function();
-''',
-      [error(diag.builtInIdentifierAsTypedefName, 8, 5)],
-    );
+//      ^^^^^
+// [diag.builtInIdentifierAsTypedefName] The built-in identifier 'inout' can't be used as a typedef name.
+''');
   }
 
   test_typedef_generic_inout_language310() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 // @dart = 3.10
 typedef inout = void Function();
 ''');
   }
 
   test_typedef_generic_out() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 typedef out = void Function();
-''',
-      [error(diag.builtInIdentifierAsTypedefName, 8, 3)],
-    );
+//      ^^^
+// [diag.builtInIdentifierAsTypedefName] The built-in identifier 'out' can't be used as a typedef name.
+''');
   }
 
   test_typedef_generic_out_language310() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 // @dart = 3.10
 typedef out = void Function();
 ''');
   }
 
   test_typedef_interfaceType_as() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 typedef as = List<int>;
-''',
-      [
-        error(diag.builtInIdentifierAsTypedefName, 8, 2),
-        error(diag.expectedIdentifierButGotKeyword, 8, 2),
-      ],
-    );
+//      ^^
+// [diag.expectedIdentifierButGotKeyword] 'as' can't be used as an identifier because it's a keyword.
+// [diag.builtInIdentifierAsTypedefName] The built-in identifier 'as' can't be used as a typedef name.
+''');
   }
 
   test_typedef_interfaceType_Function() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 typedef Function = List<int>;
-''',
-      [
-        error(diag.builtInIdentifierAsTypedefName, 8, 8),
-        error(diag.expectedIdentifierButGotKeyword, 8, 8),
-      ],
-    );
+//      ^^^^^^^^
+// [diag.expectedIdentifierButGotKeyword] 'Function' can't be used as an identifier because it's a keyword.
+// [diag.builtInIdentifierAsTypedefName] The built-in identifier 'Function' can't be used as a typedef name.
+''');
   }
 }
diff --git a/pkg/analyzer/test/src/diagnostics/case_block_not_terminated_test.dart b/pkg/analyzer/test/src/diagnostics/case_block_not_terminated_test.dart
index 0636984..38dd5ef 100644
--- a/pkg/analyzer/test/src/diagnostics/case_block_not_terminated_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/case_block_not_terminated_test.dart
@@ -23,7 +23,7 @@
 
 mixin CaseBlockNotTerminatedTestCases on PubPackageResolutionTest {
   test_lastCase() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 f(int a) {
   switch (a) {
     case 0:
@@ -34,7 +34,7 @@
   }
 
   test_terminated_break() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 void f(int a) {
   switch (a) {
     case 0:
@@ -47,7 +47,7 @@
   }
 
   test_terminated_continue_loop() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 void f(int a) {
   while (true) {
     switch (a) {
@@ -62,7 +62,7 @@
   }
 
   test_terminated_return() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 void f(int a) {
   switch (a) {
     case 0:
@@ -75,7 +75,7 @@
   }
 
   test_terminated_return2() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 void f(int a) {
   switch (a) {
     case 0:
@@ -89,7 +89,7 @@
   }
 
   test_terminated_throw() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 void f(int a) {
   switch (a) {
     case 0:
diff --git a/pkg/analyzer/test/src/diagnostics/case_expression_type_implements_equals_test.dart b/pkg/analyzer/test/src/diagnostics/case_expression_type_implements_equals_test.dart
index b71517c..2c45e87 100644
--- a/pkg/analyzer/test/src/diagnostics/case_expression_type_implements_equals_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/case_expression_type_implements_equals_test.dart
@@ -2,7 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/src/diagnostic/diagnostic.dart' as diag;
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../dart/resolution/context_collection_resolution.dart';
@@ -33,7 +32,7 @@
   _Variants get _variant;
 
   test_classInstance_declares() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   final int value;
 
@@ -54,7 +53,7 @@
   }
 
   test_classInstance_fromObject() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   final int value;
   const A(this.value);
@@ -70,17 +69,29 @@
   }
 
   test_classInstance_implements() async {
-    List<ExpectedDiagnostic> expectedDiagnostics;
-    switch (_variant) {
-      case _Variants.nullSafe:
-        expectedDiagnostics = [
-          error(diag.caseExpressionTypeImplementsEquals, 150, 10),
-        ];
-      case _Variants.patterns:
-        expectedDiagnostics = [];
-    }
+    if (_variant == _Variants.nullSafe) {
+      await resolveTestCodeWithDiagnostics(r'''
+class A {
+  final int value;
 
-    await assertErrorsInCode(r'''
+  const A(this.value);
+
+  bool operator ==(Object other) {
+    return false;
+  }
+}
+
+void f(e) {
+  switch (e) {
+    case const A(0):
+//       ^^^^^^^^^^
+// [diag.caseExpressionTypeImplementsEquals] The switch case expression type 'A' can't override the '==' operator.
+      break;
+  }
+}
+''');
+    } else {
+      await resolveTestCodeWithDiagnostics(r'''
 class A {
   final int value;
 
@@ -97,11 +108,12 @@
       break;
   }
 }
-''', expectedDiagnostics);
+''');
+    }
   }
 
   test_int() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 void f(e) {
   switch (e) {
     case 0:
@@ -112,7 +124,7 @@
   }
 
   test_String() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 void f(e) {
   switch (e) {
     case '0':
diff --git a/pkg/analyzer/test/src/diagnostics/case_expression_type_is_not_switch_expression_subtype_test.dart b/pkg/analyzer/test/src/diagnostics/case_expression_type_is_not_switch_expression_subtype_test.dart
index e31782d..836e96d 100644
--- a/pkg/analyzer/test/src/diagnostics/case_expression_type_is_not_switch_expression_subtype_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/case_expression_type_is_not_switch_expression_subtype_test.dart
@@ -2,7 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/src/diagnostic/diagnostic.dart' as diag;
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../dart/resolution/context_collection_resolution.dart';
@@ -39,20 +38,37 @@
   _Variant get _variant;
 
   test_notSubtype_hasEqEq() async {
-    List<ExpectedDiagnostic> expectedDiagnosticss;
-    switch (_variant) {
-      case _Variant.nullSafe:
-        expectedDiagnosticss = [
-          error(diag.caseExpressionTypeIsNotSwitchExpressionSubtype, 180, 2),
-          error(diag.caseExpressionTypeImplementsEquals, 180, 2),
-          error(diag.caseExpressionTypeIsNotSwitchExpressionSubtype, 206, 10),
-          error(diag.caseExpressionTypeImplementsEquals, 206, 10),
-        ];
-      case _Variant.patterns:
-        expectedDiagnosticss = [];
-    }
+    if (_variant == _Variant.nullSafe) {
+      await resolveTestCodeWithDiagnostics('''
+class A {
+  const A();
+}
 
-    await assertErrorsInCode('''
+class B {
+  final int value;
+  const B(this.value);
+  bool operator ==(other) => true;
+}
+
+const dynamic B0 = B(0);
+
+void f(A e) {
+  switch (e) {
+    case B0:
+//       ^^
+// [diag.caseExpressionTypeIsNotSwitchExpressionSubtype] The switch case expression type 'dynamic' must be a subtype of the switch expression type 'A'.
+// [diag.caseExpressionTypeImplementsEquals] The switch case expression type 'B' can't override the '==' operator.
+      break;
+    case const B(1):
+//       ^^^^^^^^^^
+// [diag.caseExpressionTypeIsNotSwitchExpressionSubtype] The switch case expression type 'B' must be a subtype of the switch expression type 'A'.
+// [diag.caseExpressionTypeImplementsEquals] The switch case expression type 'B' can't override the '==' operator.
+      break;
+  }
+}
+''');
+    } else {
+      await resolveTestCodeWithDiagnostics('''
 class A {
   const A();
 }
@@ -73,25 +89,13 @@
       break;
   }
 }
-''', expectedDiagnosticss);
+''');
+    }
   }
 
   test_notSubtype_primitiveEquality() async {
-    List<ExpectedDiagnostic> expectedDiagnostics;
-    switch (_variant) {
-      case _Variant.nullSafe:
-        expectedDiagnostics = [
-          error(diag.caseExpressionTypeIsNotSwitchExpressionSubtype, 145, 2),
-          error(diag.caseExpressionTypeIsNotSwitchExpressionSubtype, 171, 10),
-        ];
-      case _Variant.patterns:
-        expectedDiagnostics = [
-          error(diag.constantPatternNeverMatchesValueType, 145, 2),
-          error(diag.constantPatternNeverMatchesValueType, 171, 10),
-        ];
-    }
-
-    await assertErrorsInCode('''
+    if (_variant == _Variant.nullSafe) {
+      await resolveTestCodeWithDiagnostics('''
 class A {
   const A();
 }
@@ -106,16 +110,47 @@
 void f(A e) {
   switch (e) {
     case B0:
+//       ^^
+// [diag.caseExpressionTypeIsNotSwitchExpressionSubtype] The switch case expression type 'dynamic' must be a subtype of the switch expression type 'A'.
       break;
     case const B(1):
+//       ^^^^^^^^^^
+// [diag.caseExpressionTypeIsNotSwitchExpressionSubtype] The switch case expression type 'B' must be a subtype of the switch expression type 'A'.
       break;
   }
 }
-''', expectedDiagnostics);
+''');
+    } else {
+      await resolveTestCodeWithDiagnostics('''
+class A {
+  const A();
+}
+
+class B {
+  final int value;
+  const B(this.value);
+}
+
+const dynamic B0 = B(0);
+
+void f(A e) {
+  switch (e) {
+    case B0:
+//       ^^
+// [diag.constantPatternNeverMatchesValueType] The matched value type 'A' can never be equal to this constant of type 'B'.
+      break;
+    case const B(1):
+//       ^^^^^^^^^^
+// [diag.constantPatternNeverMatchesValueType] The matched value type 'A' can never be equal to this constant of type 'B'.
+      break;
+  }
+}
+''');
+    }
   }
 
   test_subtype() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics('''
 class A {
   final int value;
   const A(this.value);
diff --git a/pkg/analyzer/test/src/diagnostics/cast_from_null_always_fails_test.dart b/pkg/analyzer/test/src/diagnostics/cast_from_null_always_fails_test.dart
index 957bd1d..5d4973f 100644
--- a/pkg/analyzer/test/src/diagnostics/cast_from_null_always_fails_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/cast_from_null_always_fails_test.dart
@@ -2,7 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/src/diagnostic/diagnostic.dart' as diag;
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../dart/resolution/context_collection_resolution.dart';
@@ -16,29 +15,27 @@
 @reflectiveTest
 class CastFromNullAlwaysFailsTest extends PubPackageResolutionTest {
   test_castPattern_Null_nonNullable() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics('''
 void f(Null n, num m) {
   (m as int) = n;
+// ^^^^^^^^
+// [diag.castFromNullAlwaysFails] This cast always throws an exception because the expression always evaluates to 'null'.
 }
-''',
-      [error(diag.castFromNullAlwaysFails, 27, 8)],
-    );
+''');
   }
 
   test_castPattern_Null_nullable() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics('''
 void f(Null n, num? m) {
   (m as int?) = n;
+//   ^^
+// [diag.unnecessaryCastPattern] Unnecessary cast pattern.
 }
-''',
-      [error(diag.unnecessaryCastPattern, 30, 2)],
-    );
+''');
   }
 
   test_castPattern_nullable_nullable() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics('''
 void f(num? n, num? m) {
   (m as int?) = n;
 }
@@ -46,7 +43,7 @@
   }
 
   test_Null_dynamic() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics('''
 void f(Null n) {
   n as dynamic;
 }
@@ -54,40 +51,37 @@
   }
 
   test_Null_Never() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics('''
 void f(Null n) {
   n as Never;
+//^^^^^^^^^^
+// [diag.castFromNullAlwaysFails] This cast always throws an exception because the expression always evaluates to 'null'.
 }
-''',
-      [error(diag.castFromNullAlwaysFails, 19, 10)],
-    );
+''');
   }
 
   test_Null_nonNullable() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics('''
 void f(Null n) {
   n as int;
+//^^^^^^^^
+// [diag.castFromNullAlwaysFails] This cast always throws an exception because the expression always evaluates to 'null'.
 }
-''',
-      [error(diag.castFromNullAlwaysFails, 19, 8)],
-    );
+''');
   }
 
   test_Null_nonNullableTypeVariable() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics('''
 void f<T extends Object>(Null n) {
   n as T;
+//^^^^^^
+// [diag.castFromNullAlwaysFails] This cast always throws an exception because the expression always evaluates to 'null'.
 }
-''',
-      [error(diag.castFromNullAlwaysFails, 37, 6)],
-    );
+''');
   }
 
   test_Null_nullable() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics('''
 void f(Null n) {
   n as int?;
 }
@@ -95,7 +89,7 @@
   }
 
   test_Null_nullableTypeVariable() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics('''
 void f<T>(Null n) {
   n as T;
 }
@@ -103,7 +97,7 @@
   }
 
   test_nullable_nonNullable() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics('''
 void f(int? n) {
   n as int;
 }
diff --git a/pkg/analyzer/test/src/diagnostics/cast_to_non_type_test.dart b/pkg/analyzer/test/src/diagnostics/cast_to_non_type_test.dart
index f8107f0..09557c7 100644
--- a/pkg/analyzer/test/src/diagnostics/cast_to_non_type_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/cast_to_non_type_test.dart
@@ -2,7 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/src/diagnostic/diagnostic.dart' as diag;
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../dart/resolution/context_collection_resolution.dart';
@@ -16,14 +15,13 @@
 @reflectiveTest
 class CastToNonTypeTest extends PubPackageResolutionTest {
   test_variable() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics('''
 var A = 0;
-f(String s) { var x = s as A; }''',
-      [
-        error(diag.unusedLocalVariable, 29, 1),
-        error(diag.castToNonType, 38, 1),
-      ],
-    );
+f(String s) { var x = s as A; }
+//                ^
+// [diag.unusedLocalVariable] The value of the local variable 'x' isn't used.
+//                         ^
+// [diag.castToNonType] The name 'A' isn't a type, so it can't be used in an 'as' expression.
+''');
   }
 }
diff --git a/pkg/analyzer/test/src/diagnostics/class_instantiation_access_to_member_test.dart b/pkg/analyzer/test/src/diagnostics/class_instantiation_access_to_member_test.dart
index 442c0c9..2f19b1b 100644
--- a/pkg/analyzer/test/src/diagnostics/class_instantiation_access_to_member_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/class_instantiation_access_to_member_test.dart
@@ -2,7 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/src/diagnostic/diagnostic.dart' as diag;
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../dart/resolution/context_collection_resolution.dart';
@@ -16,8 +15,7 @@
 @reflectiveTest
 class ClassInstantiationAccessToMemberTest extends PubPackageResolutionTest {
   test_alias() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics('''
 class A<T> {
   int i = 1;
 }
@@ -25,14 +23,13 @@
 typedef TA<T> = A<T>;
 
 var x = TA<int>.i;
-''',
-      [error(diag.classInstantiationAccessToInstanceMember, 60, 9)],
-    );
+//      ^^^^^^^^^
+// [diag.classInstantiationAccessToInstanceMember] The instance member 'i' can't be accessed on a class instantiation.
+''');
   }
 
   test_extensionMember() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics('''
 class A<T> {}
 
 extension E on A {
@@ -40,77 +37,72 @@
 }
 
 var x = A<int>.i;
-''',
-      [error(diag.classInstantiationAccessToUnknownMember, 63, 8)],
-    );
+//      ^^^^^^^^
+// [diag.classInstantiationAccessToUnknownMember] The class 'A' doesn't have a constructor named 'i'.
+''');
   }
 
   test_instanceMember() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics('''
 class A<T> {
   int i = 1;
 }
 
 var x = A<int>.i;
-''',
-      [error(diag.classInstantiationAccessToInstanceMember, 37, 8)],
-    );
+//      ^^^^^^^^
+// [diag.classInstantiationAccessToInstanceMember] The instance member 'i' can't be accessed on a class instantiation.
+''');
   }
 
   test_instanceSetter() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics('''
 class A<T> {
   set i(int value) {}
 }
 
 void foo() {
   A<int>.i = 7;
+//^^^^^^^^
+// [diag.classInstantiationAccessToInstanceMember] The instance member 'i' can't be accessed on a class instantiation.
 }
-''',
-      [error(diag.classInstantiationAccessToInstanceMember, 53, 8)],
-    );
+''');
   }
 
   test_staticMember() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics('''
 class A<T> {
   static int i = 1;
 }
 
 var x = A<int>.i;
-''',
-      [error(diag.classInstantiationAccessToStaticMember, 44, 8)],
-    );
+//      ^^^^^^^^
+// [diag.classInstantiationAccessToStaticMember] The static member 'i' can't be accessed on a class instantiation.
+''');
   }
 
   test_staticSetter() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics('''
 class A<T> {
   static set i(int value) {}
 }
 
 void bar() {
   A<int>.i = 7;
+//^^^^^^^^
+// [diag.classInstantiationAccessToStaticMember] The static member 'i' can't be accessed on a class instantiation.
 }
-''',
-      [error(diag.classInstantiationAccessToStaticMember, 60, 8)],
-    );
+''');
   }
 
   test_syntheticIdentifier() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics('''
 class A<T> {
   A.foo();
 }
 
 var x = A<int>.;
-''',
-      [error(diag.missingIdentifier, 42, 1)],
-    );
+//             ^
+// [diag.missingIdentifier] Expected an identifier.
+''');
   }
 }
diff --git a/pkg/analyzer/test/src/diagnostics/class_used_as_mixin_declares_generative_constructor_test.dart b/pkg/analyzer/test/src/diagnostics/class_used_as_mixin_declares_generative_constructor_test.dart
index 396af4e..506b759 100644
--- a/pkg/analyzer/test/src/diagnostics/class_used_as_mixin_declares_generative_constructor_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/class_used_as_mixin_declares_generative_constructor_test.dart
@@ -2,7 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/src/diagnostic/diagnostic.dart' as diag;
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../dart/resolution/context_collection_resolution.dart';
@@ -17,7 +16,7 @@
 class ClassUsedAsMixinDeclaresGenerativeConstructorTest
     extends PubPackageResolutionTest {
   test_withClause_class_language219_factory() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 // @dart = 2.19
 class A {
   factory A() => throw 0;
@@ -27,57 +26,53 @@
   }
 
   test_withClause_class_language219_generative_named() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 // @dart = 2.19
 class A {
   A.named();
 }
 class B extends Object with A {}
-''',
-      [error(diag.classUsedAsMixinDeclaresGenerativeConstructor, 69, 1)],
-    );
+//                          ^
+// [diag.classUsedAsMixinDeclaresGenerativeConstructor] The class 'A' can't be used as a mixin because it declares a generative constructor.
+''');
   }
 
   test_withClause_class_language219_generative_unnamed() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 // @dart = 2.19
 class A {
   A();
 }
 class B extends Object with A {}
-''',
-      [error(diag.classUsedAsMixinDeclaresGenerativeConstructor, 63, 1)],
-    );
+//                          ^
+// [diag.classUsedAsMixinDeclaresGenerativeConstructor] The class 'A' can't be used as a mixin because it declares a generative constructor.
+''');
   }
 
   test_withClause_classTypeAlias_language219_generative_unnamed() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 // @dart = 2.19
 class A {
   A();
 }
 class B = Object with A;
-''',
-      [error(diag.classUsedAsMixinDeclaresGenerativeConstructor, 57, 1)],
-    );
+//                    ^
+// [diag.classUsedAsMixinDeclaresGenerativeConstructor] The class 'A' can't be used as a mixin because it declares a generative constructor.
+''');
   }
 
   test_withClause_enum_language219_generative_unnamed() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 // @dart = 2.19
 class A {
   A();
 }
 
 enum E with A {
+//          ^
+// [diag.classUsedAsMixinDeclaresGenerativeConstructor] The class 'A' can't be used as a mixin because it declares a generative constructor.
   v
 }
-''',
-      [error(diag.classUsedAsMixinDeclaresGenerativeConstructor, 48, 1)],
-    );
+''');
   }
 }
diff --git a/pkg/analyzer/test/src/diagnostics/class_used_as_mixin_test.dart b/pkg/analyzer/test/src/diagnostics/class_used_as_mixin_test.dart
index 3a22eef..17ca270 100644
--- a/pkg/analyzer/test/src/diagnostics/class_used_as_mixin_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/class_used_as_mixin_test.dart
@@ -16,19 +16,39 @@
 @reflectiveTest
 class ClassUsedAsMixinTest extends PubPackageResolutionTest {
   test_coreLib() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class Bar with Comparable<int> {
+//             ^^^^^^^^^^^^^^^
+// [diag.classUsedAsMixin] The class 'Comparable' can't be used as a mixin because it's neither a mixin class nor a mixin.
   int compareTo(int x) => 0;
 }
+''');
+  }
+
+  test_coreLib_dartCoreEnum() async {
+    await assertErrorsInCode(
+      r'''
+abstract class A with Enum {}
+abstract class B = Object with Enum;
 ''',
-      [error(diag.classUsedAsMixin, 15, 15)],
+      [
+        error(diag.classUsedAsMixin, 22, 4),
+        error(diag.classUsedAsMixin, 61, 4),
+      ],
     );
   }
 
-  test_coreLib_language219() async {
+  test_coreLib_dartCoreEnum_language219() async {
     await assertNoErrorsInCode(r'''
 // @dart = 2.19
+abstract class A with Enum {}
+abstract class B = Object with Enum;
+''');
+  }
+
+  test_coreLib_language219() async {
+    await resolveTestCodeWithDiagnostics(r'''
+// @dart = 2.19
 class Bar with Comparable<int> {
   int compareTo(int x) => 0;
 }
@@ -36,56 +56,52 @@
   }
 
   test_inside() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class Foo {}
 class Bar with Foo {}
-''',
-      [error(diag.classUsedAsMixin, 28, 3)],
-    );
+//             ^^^
+// [diag.classUsedAsMixin] The class 'Foo' can't be used as a mixin because it's neither a mixin class nor a mixin.
+''');
   }
 
   test_inside_class_hasGenerativeConstructor() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   A() {}
 }
 class B extends Object with A {}
-''',
-      [error(diag.classUsedAsMixin, 49, 1)],
-    );
+//                          ^
+// [diag.classUsedAsMixin] The class 'A' can't be used as a mixin because it's neither a mixin class nor a mixin.
+''');
   }
 
   test_inside_classTypeAlias_hasGenerativeConstructor() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   A() {}
 }
 class B = Object with A;
-''',
-      [error(diag.classUsedAsMixin, 43, 1)],
-    );
+//                    ^
+// [diag.classUsedAsMixin] The class 'A' can't be used as a mixin because it's neither a mixin class nor a mixin.
+''');
   }
 
   test_inside_enum_hasGenerativeConstructor() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   A() {}
 }
 
 enum E with A {
+//          ^
+// [diag.classUsedAsMixin] The class 'A' can't be used as a mixin because it's neither a mixin class nor a mixin.
   v
 }
-''',
-      [error(diag.classUsedAsMixin, 34, 1)],
-    );
+''');
   }
 
   test_inside_language219() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 // @dart = 2.19
 class Foo {}
 class Bar with Foo {}
@@ -93,7 +109,7 @@
   }
 
   test_inside_mixinClass() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 mixin class Foo {}
 class Bar with Foo {}
 ''');
@@ -104,13 +120,12 @@
 class Foo {}
 ''');
 
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'foo.dart';
 class Bar with Foo {}
-''',
-      [error(diag.classUsedAsMixin, 34, 3)],
-    );
+//             ^^^
+// [diag.classUsedAsMixin] The class 'Foo' can't be used as a mixin because it's neither a mixin class nor a mixin.
+''');
   }
 
   test_outside_language219() async {
@@ -119,7 +134,7 @@
 class Foo {}
 ''');
 
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'foo.dart';
 class Bar with Foo {}
 ''');
@@ -130,14 +145,13 @@
 class Foo {}
 ''');
 
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 // @dart = 2.19
 import 'foo.dart';
 class Bar with Foo {}
-''',
-      [error(diag.classUsedAsMixin, 50, 3)],
-    );
+//             ^^^
+// [diag.classUsedAsMixin] The class 'Foo' can't be used as a mixin because it's neither a mixin class nor a mixin.
+''');
   }
 
   test_outside_mixinClass() async {
@@ -145,7 +159,7 @@
 mixin class Foo {}
 ''');
 
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'foo.dart';
 class Bar with Foo {}
 ''');
@@ -157,13 +171,12 @@
 typedef FooTypedef = Foo;
 ''');
 
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'foo.dart';
 class Bar with FooTypedef {}
-''',
-      [error(diag.classUsedAsMixin, 34, 10)],
-    );
+//             ^^^^^^^^^^
+// [diag.classUsedAsMixin] The class 'Foo' can't be used as a mixin because it's neither a mixin class nor a mixin.
+''');
   }
 
   test_outside_viaTypedef_inside_language219() async {
@@ -173,7 +186,7 @@
 typedef FooTypedef = Foo;
 ''');
 
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'foo.dart';
 class Bar with FooTypedef {}
 ''');
@@ -185,7 +198,7 @@
 typedef FooTypedef = Foo;
 ''');
 
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'foo.dart';
 class Bar with FooTypedef {}
 ''');
@@ -196,14 +209,13 @@
 class Foo {}
 ''');
 
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'foo.dart';
 typedef FooTypedef = Foo;
 class Bar with FooTypedef {}
-''',
-      [error(diag.classUsedAsMixin, 60, 10)],
-    );
+//             ^^^^^^^^^^
+// [diag.classUsedAsMixin] The class 'Foo' can't be used as a mixin because it's neither a mixin class nor a mixin.
+''');
   }
 
   test_outside_viaTypedef_outside_language219() async {
@@ -212,7 +224,7 @@
 class Foo {}
 ''');
 
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'foo.dart';
 typedef FooTypedef = Foo;
 class Bar with FooTypedef {}
@@ -224,7 +236,7 @@
 mixin class Foo {}
 ''');
 
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'foo.dart';
 typedef FooTypedef = Foo;
 class Bar with FooTypedef {}
diff --git a/pkg/analyzer/test/src/diagnostics/concrete_class_has_enum_superinterface_test.dart b/pkg/analyzer/test/src/diagnostics/concrete_class_has_enum_superinterface_test.dart
index a695a46..0a3bd1f 100644
--- a/pkg/analyzer/test/src/diagnostics/concrete_class_has_enum_superinterface_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/concrete_class_has_enum_superinterface_test.dart
@@ -2,7 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/src/diagnostic/diagnostic.dart' as diag;
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../dart/resolution/context_collection_resolution.dart';
@@ -17,53 +16,49 @@
 class NonAbstractClassHasEnumSuperinterfaceTest
     extends PubPackageResolutionTest {
   test_class_abstract() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics('''
 abstract class A implements Enum {}
 ''');
   }
 
   test_class_concrete() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics('''
 class A implements Enum {}
-''',
-      [error(diag.concreteClassHasEnumSuperinterface, 19, 4)],
-    );
+//                 ^^^^
+// [diag.concreteClassHasEnumSuperinterface] Concrete classes can't have 'Enum' as a superinterface.
+''');
   }
 
   test_class_concrete_indirect() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics('''
 abstract class A implements Enum {}
 class B implements A {}
-''',
-      [error(diag.concreteClassHasEnumSuperinterface, 42, 1)],
-    );
+//    ^
+// [diag.concreteClassHasEnumSuperinterface] Concrete classes can't have 'Enum' as a superinterface.
+''');
   }
 
   test_classTypeAlias_concrete() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics('''
 class M {}
 class A = Object with M implements Enum;
-''',
-      [error(diag.concreteClassHasEnumSuperinterface, 46, 4)],
-    );
+//                                 ^^^^
+// [diag.concreteClassHasEnumSuperinterface] Concrete classes can't have 'Enum' as a superinterface.
+''');
   }
 
   test_classTypeAlias_concrete_indirect() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics('''
 mixin M {}
 abstract class A implements Enum {}
 class B = Object with M implements A;
-''',
-      [error(diag.concreteClassHasEnumSuperinterface, 53, 1)],
-    );
+//    ^
+// [diag.concreteClassHasEnumSuperinterface] Concrete classes can't have 'Enum' as a superinterface.
+''');
   }
 
   test_enum() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics('''
 enum E implements Enum {
   v
 }
diff --git a/pkg/analyzer/test/src/diagnostics/concrete_class_with_abstract_member_test.dart b/pkg/analyzer/test/src/diagnostics/concrete_class_with_abstract_member_test.dart
index b57840b..8adb637 100644
--- a/pkg/analyzer/test/src/diagnostics/concrete_class_with_abstract_member_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/concrete_class_with_abstract_member_test.dart
@@ -2,7 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/src/diagnostic/diagnostic.dart' as diag;
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../dart/resolution/context_collection_resolution.dart';
@@ -16,53 +15,37 @@
 @reflectiveTest
 class ConcreteClassWithAbstractMemberTest extends PubPackageResolutionTest {
   test_abstract_field() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics('''
 class A {
   abstract int? x;
+//^^^^^^^^^^^^^^^^
+// [diag.concreteClassWithAbstractMember] 'x' must have a method body because 'A' isn't abstract.
 }
-''',
-      [
-        error(
-          diag.concreteClassWithAbstractMember,
-          12,
-          16,
-          text: "'x' must have a method body because 'A' isn't abstract.",
-        ),
-      ],
-    );
+''');
   }
 
   test_abstract_field_final() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics('''
 class A {
   abstract final int? x;
+//^^^^^^^^^^^^^^^^^^^^^^
+// [diag.concreteClassWithAbstractMember] 'x' must have a method body because 'A' isn't abstract.
 }
-''',
-      [
-        error(
-          diag.concreteClassWithAbstractMember,
-          12,
-          22,
-          text: "'x' must have a method body because 'A' isn't abstract.",
-        ),
-      ],
-    );
+''');
   }
 
   test_direct() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics('''
 class A {
   m();
-}''',
-      [error(diag.concreteClassWithAbstractMember, 12, 4)],
-    );
+//^^^^
+// [diag.concreteClassWithAbstractMember] 'm' must have a method body because 'A' isn't abstract.
+}
+''');
   }
 
   test_external_field() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics('''
 class A {
   external int? x;
 }
@@ -70,7 +53,7 @@
   }
 
   test_external_field_final() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics('''
 class A {
   external final int? x;
 }
@@ -78,33 +61,25 @@
   }
 
   test_noSuchMethod_interface() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics('''
 class I {
   noSuchMethod(v) => '';
 }
 class A implements I {
   m();
-}''',
-      [error(diag.concreteClassWithAbstractMember, 62, 4)],
-    );
+//^^^^
+// [diag.concreteClassWithAbstractMember] 'm' must have a method body because 'A' isn't abstract.
+}
+''');
   }
 
   test_setter() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics('''
 class A {
   set s(int i);
+//^^^^^^^^^^^^^
+// [diag.concreteClassWithAbstractMember] 's' must have a method body because 'A' isn't abstract.
 }
-''',
-      [
-        error(
-          diag.concreteClassWithAbstractMember,
-          12,
-          13,
-          text: "'s' must have a method body because 'A' isn't abstract.",
-        ),
-      ],
-    );
+''');
   }
 }
diff --git a/pkg/analyzer/test/src/diagnostics/conflicting_constructor_and_static_field_test.dart b/pkg/analyzer/test/src/diagnostics/conflicting_constructor_and_static_field_test.dart
index 985f499..07e5f72 100644
--- a/pkg/analyzer/test/src/diagnostics/conflicting_constructor_and_static_field_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/conflicting_constructor_and_static_field_test.dart
@@ -2,7 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/src/diagnostic/diagnostic.dart' as diag;
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../dart/resolution/context_collection_resolution.dart';
@@ -17,42 +16,39 @@
 class ConflictingConstructorAndStaticFieldTest
     extends PubPackageResolutionTest {
   test_class_factoryHead_static_field() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class C {
   factory foo() => throw 0;
+//        ^^^
+// [diag.conflictingConstructorAndStaticField] 'foo' can't be used to name both a constructor and a static field in this class.
   static int foo = 0;
 }
-''',
-      [error(diag.conflictingConstructorAndStaticField, 20, 3)],
-    );
+''');
   }
 
   test_class_newHead_static_field() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class C {
   new foo();
+//    ^^^
+// [diag.conflictingConstructorAndStaticField] 'foo' can't be used to name both a constructor and a static field in this class.
   static int foo = 0;
 }
-''',
-      [error(diag.conflictingConstructorAndStaticField, 16, 3)],
-    );
+''');
   }
 
   test_class_primaryConstructor_static_field() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class C.foo() {
+//      ^^^
+// [diag.conflictingConstructorAndStaticField] 'foo' can't be used to name both a constructor and a static field in this class.
   static int foo = 0;
 }
-''',
-      [error(diag.conflictingConstructorAndStaticField, 8, 3)],
-    );
+''');
   }
 
   test_class_typeName_instance_field() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class C {
   C.foo();
   int foo = 0;
@@ -61,44 +57,41 @@
   }
 
   test_class_typeName_static_field() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class C {
   C.foo();
+//  ^^^
+// [diag.conflictingConstructorAndStaticField] 'foo' can't be used to name both a constructor and a static field in this class.
   static int foo = 0;
 }
-''',
-      [error(diag.conflictingConstructorAndStaticField, 14, 3)],
-    );
+''');
   }
 
   test_class_typeName_static_getter() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class C {
   C.foo();
+//  ^^^
+// [diag.conflictingConstructorAndStaticGetter] 'foo' can't be used to name both a constructor and a static getter in this class.
   static int get foo => 0;
 }
-''',
-      [error(diag.conflictingConstructorAndStaticGetter, 14, 3)],
-    );
+''');
   }
 
   test_class_typeName_static_getter_setter_pair() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class C {
   C.foo();
+//  ^^^
+// [diag.conflictingConstructorAndStaticGetter] 'foo' can't be used to name both a constructor and a static getter in this class.
   static int get foo => 0;
   static set foo(_) {}
 }
-''',
-      [error(diag.conflictingConstructorAndStaticGetter, 14, 3)],
-    );
+''');
   }
 
   test_class_typeName_static_notSameClass() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   static int foo = 0;
 }
@@ -109,70 +102,65 @@
   }
 
   test_class_typeName_static_setter() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class C {
   C.foo();
+//  ^^^
+// [diag.conflictingConstructorAndStaticSetter] 'foo' can't be used to name both a constructor and a static setter in this class.
   static void set foo(_) {}
 }
-''',
-      [error(diag.conflictingConstructorAndStaticSetter, 14, 3)],
-    );
+''');
   }
 
   test_enum_factoryHead_static_field() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 enum E {
   v;
   const E();
   factory foo() => throw 0;
+//        ^^^
+// [diag.conflictingConstructorAndStaticField] 'foo' can't be used to name both a constructor and a static field in this class.
   static int foo = 0;
 }
-''',
-      [error(diag.conflictingConstructorAndStaticField, 37, 3)],
-    );
+''');
   }
 
   test_enum_newHead_static_field() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 enum E {
   v.foo();
   const new foo();
+//          ^^^
+// [diag.conflictingConstructorAndStaticField] 'foo' can't be used to name both a constructor and a static field in this class.
   static int foo = 0;
 }
-''',
-      [error(diag.conflictingConstructorAndStaticField, 32, 3)],
-    );
+''');
   }
 
   test_enum_primaryConstructor_static_field() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 enum E.foo() {
+//     ^^^
+// [diag.conflictingConstructorAndStaticField] 'foo' can't be used to name both a constructor and a static field in this class.
   v.foo();
   static int foo = 0;
 }
-''',
-      [error(diag.conflictingConstructorAndStaticField, 7, 3)],
-    );
+''');
   }
 
   test_enum_typeName_constant() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 enum E {
   foo.foo();
   const E.foo();
+//        ^^^
+// [diag.conflictingConstructorAndStaticField] 'foo' can't be used to name both a constructor and a static field in this class.
 }
-''',
-      [error(diag.conflictingConstructorAndStaticField, 32, 3)],
-    );
+''');
   }
 
   test_enum_typeName_instance_field() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 enum E {
   v.foo();
   const E.foo();
@@ -182,70 +170,65 @@
   }
 
   test_enum_typeName_static_field() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 enum E {
   v.foo();
   const E.foo();
+//        ^^^
+// [diag.conflictingConstructorAndStaticField] 'foo' can't be used to name both a constructor and a static field in this class.
   static int foo = 0;
 }
-''',
-      [error(diag.conflictingConstructorAndStaticField, 30, 3)],
-    );
+''');
   }
 
   test_enum_typeName_static_getter() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 enum E {
   v.foo();
   const E.foo();
+//        ^^^
+// [diag.conflictingConstructorAndStaticGetter] 'foo' can't be used to name both a constructor and a static getter in this class.
   static int get foo => 0;
 }
-''',
-      [error(diag.conflictingConstructorAndStaticGetter, 30, 3)],
-    );
+''');
   }
 
   test_enum_typeName_static_setter() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 enum E {
   v.foo();
   const E.foo();
+//        ^^^
+// [diag.conflictingConstructorAndStaticSetter] 'foo' can't be used to name both a constructor and a static setter in this class.
   static void set foo(_) {}
 }
-''',
-      [error(diag.conflictingConstructorAndStaticSetter, 30, 3)],
-    );
+''');
   }
 
   test_extensionType_factoryHead_static_field() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 extension type A.bar(int it) {
   factory A.foo() => throw 0;
+//          ^^^
+// [diag.conflictingConstructorAndStaticField] 'foo' can't be used to name both a constructor and a static field in this class.
   static int foo = 0;
 }
-''',
-      [error(diag.conflictingConstructorAndStaticField, 43, 3)],
-    );
+''');
   }
 
   test_extensionType_newHead_static_field() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 extension type A.bar(int it) {
   new foo() : this.bar(0);
+//    ^^^
+// [diag.conflictingConstructorAndStaticField] 'foo' can't be used to name both a constructor and a static field in this class.
   static int foo = 0;
 }
-''',
-      [error(diag.conflictingConstructorAndStaticField, 37, 3)],
-    );
+''');
   }
 
   test_extensionType_primaryConstructor_instance_getter() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 extension type A.foo(int it) {
   int get foo => 0;
 }
@@ -253,47 +236,43 @@
   }
 
   test_extensionType_primaryConstructor_static_field() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 extension type A.foo(int it) {
+//               ^^^
+// [diag.conflictingConstructorAndStaticField] 'foo' can't be used to name both a constructor and a static field in this class.
   static int foo = 0;
 }
-''',
-      [error(diag.conflictingConstructorAndStaticField, 17, 3)],
-    );
+''');
   }
 
   test_extensionType_primaryConstructor_static_getter() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 extension type A.foo(int it) {
+//               ^^^
+// [diag.conflictingConstructorAndStaticGetter] 'foo' can't be used to name both a constructor and a static getter in this class.
   static int get foo => 0;
 }
-''',
-      [error(diag.conflictingConstructorAndStaticGetter, 17, 3)],
-    );
+''');
   }
 
   test_extensionType_primaryConstructor_static_setter() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 extension type A.foo(int it) {
+//               ^^^
+// [diag.conflictingConstructorAndStaticSetter] 'foo' can't be used to name both a constructor and a static setter in this class.
   static void set foo(_) {}
 }
-''',
-      [error(diag.conflictingConstructorAndStaticSetter, 17, 3)],
-    );
+''');
   }
 
   test_extensionType_typeName_static_field() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 extension type A(int it) {
   A.foo(this.it);
+//  ^^^
+// [diag.conflictingConstructorAndStaticField] 'foo' can't be used to name both a constructor and a static field in this class.
   static int foo = 0;
 }
-''',
-      [error(diag.conflictingConstructorAndStaticField, 31, 3)],
-    );
+''');
   }
 }
diff --git a/pkg/analyzer/test/src/diagnostics/conflicting_constructor_and_static_method_test.dart b/pkg/analyzer/test/src/diagnostics/conflicting_constructor_and_static_method_test.dart
index dbf19af..0df4f2e 100644
--- a/pkg/analyzer/test/src/diagnostics/conflicting_constructor_and_static_method_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/conflicting_constructor_and_static_method_test.dart
@@ -2,7 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/src/diagnostic/diagnostic.dart' as diag;
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../dart/resolution/context_collection_resolution.dart';
@@ -17,42 +16,39 @@
 class ConflictingConstructorAndStaticMethodTest
     extends PubPackageResolutionTest {
   test_class_factoryHead_static() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class C {
   factory foo() => throw 0;
+//        ^^^
+// [diag.conflictingConstructorAndStaticMethod] 'foo' can't be used to name both a constructor and a static method in this class.
   static void foo() {}
 }
-''',
-      [error(diag.conflictingConstructorAndStaticMethod, 20, 3)],
-    );
+''');
   }
 
   test_class_newHead_static() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class C {
   new foo();
+//    ^^^
+// [diag.conflictingConstructorAndStaticMethod] 'foo' can't be used to name both a constructor and a static method in this class.
   static void foo() {}
 }
-''',
-      [error(diag.conflictingConstructorAndStaticMethod, 16, 3)],
-    );
+''');
   }
 
   test_class_primaryConstructor_static() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class C.foo() {
+//      ^^^
+// [diag.conflictingConstructorAndStaticMethod] 'foo' can't be used to name both a constructor and a static method in this class.
   static void foo() {}
 }
-''',
-      [error(diag.conflictingConstructorAndStaticMethod, 8, 3)],
-    );
+''');
   }
 
   test_class_typeName_instance() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class C {
   C.foo();
   void foo() {}
@@ -61,7 +57,7 @@
   }
 
   test_class_typeName_notSameClass() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   static void foo() {}
 }
@@ -72,58 +68,54 @@
   }
 
   test_class_typeName_static() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class C {
   C.foo();
+//  ^^^
+// [diag.conflictingConstructorAndStaticMethod] 'foo' can't be used to name both a constructor and a static method in this class.
   static void foo() {}
 }
-''',
-      [error(diag.conflictingConstructorAndStaticMethod, 14, 3)],
-    );
+''');
   }
 
   test_enum_factoryHead_static() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 enum E {
   v;
   const E();
   factory foo() => throw 0;
+//        ^^^
+// [diag.conflictingConstructorAndStaticMethod] 'foo' can't be used to name both a constructor and a static method in this class.
   static void foo() {}
 }
-''',
-      [error(diag.conflictingConstructorAndStaticMethod, 37, 3)],
-    );
+''');
   }
 
   test_enum_newHead_static() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 enum E {
   v.foo();
   const new foo();
+//          ^^^
+// [diag.conflictingConstructorAndStaticMethod] 'foo' can't be used to name both a constructor and a static method in this class.
   static void foo() {}
 }
-''',
-      [error(diag.conflictingConstructorAndStaticMethod, 32, 3)],
-    );
+''');
   }
 
   test_enum_primaryConstructor_static() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 enum E.foo() {
+//     ^^^
+// [diag.conflictingConstructorAndStaticMethod] 'foo' can't be used to name both a constructor and a static method in this class.
   v.foo();
   static void foo() {}
 }
-''',
-      [error(diag.conflictingConstructorAndStaticMethod, 7, 3)],
-    );
+''');
   }
 
   test_enum_typeName_instance() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 enum E {
   v.foo();
   const E.foo();
@@ -133,44 +125,41 @@
   }
 
   test_enum_typeName_static() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 enum E {
   v.foo();
   const E.foo();
+//        ^^^
+// [diag.conflictingConstructorAndStaticMethod] 'foo' can't be used to name both a constructor and a static method in this class.
   static void foo() {}
 }
-''',
-      [error(diag.conflictingConstructorAndStaticMethod, 30, 3)],
-    );
+''');
   }
 
   test_extensionType_factoryHead_static() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 extension type A.bar(int it) {
   factory A.foo() => throw 0;
+//          ^^^
+// [diag.conflictingConstructorAndStaticMethod] 'foo' can't be used to name both a constructor and a static method in this class.
   static void foo() {}
 }
-''',
-      [error(diag.conflictingConstructorAndStaticMethod, 43, 3)],
-    );
+''');
   }
 
   test_extensionType_newHead_static() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 extension type A.bar(int it) {
   new foo() : this.bar(0);
+//    ^^^
+// [diag.conflictingConstructorAndStaticMethod] 'foo' can't be used to name both a constructor and a static method in this class.
   static void foo() {}
 }
-''',
-      [error(diag.conflictingConstructorAndStaticMethod, 37, 3)],
-    );
+''');
   }
 
   test_extensionType_primaryConstructor_instance() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 extension type A.foo(int it) {
   void foo() {}
 }
@@ -178,25 +167,23 @@
   }
 
   test_extensionType_primaryConstructor_static() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 extension type A.foo(int it) {
+//               ^^^
+// [diag.conflictingConstructorAndStaticMethod] 'foo' can't be used to name both a constructor and a static method in this class.
   static void foo() {}
 }
-''',
-      [error(diag.conflictingConstructorAndStaticMethod, 17, 3)],
-    );
+''');
   }
 
   test_extensionType_typeName_static() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 extension type A(int it) {
   A.foo(this.it);
+//  ^^^
+// [diag.conflictingConstructorAndStaticMethod] 'foo' can't be used to name both a constructor and a static method in this class.
   static void foo() {}
 }
-''',
-      [error(diag.conflictingConstructorAndStaticMethod, 31, 3)],
-    );
+''');
   }
 }
diff --git a/pkg/analyzer/test/src/diagnostics/conflicting_field_and_method_test.dart b/pkg/analyzer/test/src/diagnostics/conflicting_field_and_method_test.dart
index 50b16c2..9749759 100644
--- a/pkg/analyzer/test/src/diagnostics/conflicting_field_and_method_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/conflicting_field_and_method_test.dart
@@ -16,31 +16,29 @@
 @reflectiveTest
 class ConflictingFieldAndMethodTest extends PubPackageResolutionTest {
   test_class_inSuper_field() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   foo() {}
 }
 class B extends A {
   int foo = 0;
+//    ^^^
+// [diag.conflictingFieldAndMethod] Class 'B' can't define field 'foo' and have method 'A.foo' with the same name.
 }
-''',
-      [error(diag.conflictingFieldAndMethod, 49, 3)],
-    );
+''');
   }
 
   test_class_inSuper_getter() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   foo() {}
 }
 class B extends A {
   get foo => 0;
+//    ^^^
+// [diag.conflictingFieldAndMethod] Class 'B' can't define field 'foo' and have method 'A.foo' with the same name.
 }
-''',
-      [error(diag.conflictingFieldAndMethod, 49, 3)],
-    );
+''');
   }
 
   @SkippedTest() // TODO(scheglov): implement augmentation
@@ -98,22 +96,20 @@
   }
 
   test_class_inSuper_setter() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   foo() {}
 }
 class B extends A {
   set foo(_) {}
+//    ^^^
+// [diag.conflictingFieldAndMethod] Class 'B' can't define field 'foo' and have method 'A.foo' with the same name.
 }
-''',
-      [error(diag.conflictingFieldAndMethod, 49, 3)],
-    );
+''');
   }
 
   test_enum_inMixin_field() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 mixin M {
   void foo() {}
 }
@@ -121,15 +117,14 @@
 enum E with M {
   v;
   final int foo = 0;
+//          ^^^
+// [diag.conflictingFieldAndMethod] Class 'E' can't define field 'foo' and have method 'M.foo' with the same name.
 }
-''',
-      [error(diag.conflictingFieldAndMethod, 62, 3)],
-    );
+''');
   }
 
   test_enum_inMixin_getter() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 mixin M {
   void foo() {}
 }
@@ -137,10 +132,10 @@
 enum E with M {
   v;
   int get foo => 0;
+//        ^^^
+// [diag.conflictingFieldAndMethod] Class 'E' can't define field 'foo' and have method 'M.foo' with the same name.
 }
-''',
-      [error(diag.conflictingFieldAndMethod, 60, 3)],
-    );
+''');
   }
 
   @SkippedTest() // TODO(scheglov): implement augmentation
@@ -199,8 +194,7 @@
   }
 
   test_enum_inMixin_setter() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 mixin M {
   void foo() {}
 }
@@ -208,14 +202,14 @@
 enum E with M {
   v;
   set foo(int _) {}
+//    ^^^
+// [diag.conflictingFieldAndMethod] Class 'E' can't define field 'foo' and have method 'M.foo' with the same name.
 }
-''',
-      [error(diag.conflictingFieldAndMethod, 56, 3)],
-    );
+''');
   }
 
   test_extensionType_getter() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 extension type A(int it) {
   void foo() {}
 }
@@ -227,7 +221,7 @@
   }
 
   test_extensionType_setter() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 extension type A(int it) {
   void foo() {}
 }
diff --git a/pkg/analyzer/test/src/diagnostics/conflicting_generic_interfaces_test.dart b/pkg/analyzer/test/src/diagnostics/conflicting_generic_interfaces_test.dart
index e8b1f7d..fac9459 100644
--- a/pkg/analyzer/test/src/diagnostics/conflicting_generic_interfaces_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/conflicting_generic_interfaces_test.dart
@@ -39,19 +39,18 @@
   }
 
   test_class_extends_implements() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics('''
 class I<T> {}
 class A implements I<int> {}
 class B implements I<String> {}
 class C extends A implements B {}
-''',
-      [error(diag.conflictingGenericInterfaces, 81, 1)],
-    );
+//    ^
+// [diag.conflictingGenericInterfaces] The class 'C' can't implement both 'I<int>' and 'I<String>' because the type arguments are different.
+''');
   }
 
   test_class_extends_implements_never() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics('''
 class I<T> {}
 class A implements I<Never> {}
 class B implements I<Never> {}
@@ -60,43 +59,40 @@
   }
 
   test_class_extends_implements_nullability() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics('''
 class I<T> {}
 class A implements I<int> {}
 class B implements I<int?> {}
 class C extends A implements B {}
-''',
-      [error(diag.conflictingGenericInterfaces, 79, 1)],
-    );
+//    ^
+// [diag.conflictingGenericInterfaces] The class 'C' can't implement both 'I<int>' and 'I<int?>' because the type arguments are different.
+''');
   }
 
   test_class_extends_implements_object_objectQuestion() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics('''
 class A<T> {}
 class B implements A<Object> {}
 class C implements A<Object?> {}
 class D extends B implements C {}
-''',
-      [error(diag.conflictingGenericInterfaces, 85, 1)],
-    );
+//    ^
+// [diag.conflictingGenericInterfaces] The class 'D' can't implement both 'A<Object>' and 'A<Object?>' because the type arguments are different.
+''');
   }
 
   test_class_extends_with() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics('''
 class I<T> {}
 class A implements I<int> {}
 mixin B implements I<String> {}
 class C extends A with B {}
-''',
-      [error(diag.conflictingGenericInterfaces, 81, 1)],
-    );
+//    ^
+// [diag.conflictingGenericInterfaces] The class 'C' can't implement both 'I<int>' and 'I<String>' because the type arguments are different.
+''');
   }
 
   test_class_topMerge() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics('''
 import 'dart:async';
 
 class A<T> {}
@@ -108,19 +104,18 @@
   }
 
   test_classTypeAlias_extends_nonFunctionTypedef_with() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics('''
 class I<T> {}
 typedef A = I<int>;
 mixin M implements I<String> {}
 class C = A with M;
-''',
-      [error(diag.conflictingGenericInterfaces, 72, 1)],
-    );
+//    ^
+// [diag.conflictingGenericInterfaces] The class 'C' can't implement both 'I<int>' and 'I<String>' because the type arguments are different.
+''');
   }
 
   test_classTypeAlias_extends_nonFunctionTypedef_with_ok() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics('''
 class I<T> {}
 typedef A = I<String>;
 mixin M implements I<String> {}
@@ -129,74 +124,68 @@
   }
 
   test_classTypeAlias_extends_with() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics('''
 class I<T> {}
 class A implements I<int> {}
 mixin M implements I<String> {}
 class C = A with M;
-''',
-      [error(diag.conflictingGenericInterfaces, 81, 1)],
-    );
+//    ^
+// [diag.conflictingGenericInterfaces] The class 'C' can't implement both 'I<int>' and 'I<String>' because the type arguments are different.
+''');
   }
 
   test_enum_implements() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics('''
 class I<T> {}
 class A implements I<int> {}
 class B implements I<String> {}
 enum E implements A, B {
+//   ^
+// [diag.conflictingGenericInterfaces] The enum 'E' can't implement both 'I<int>' and 'I<String>' because the type arguments are different.
   v
 }
-''',
-      [error(diag.conflictingGenericInterfaces, 80, 1)],
-    );
+''');
   }
 
   test_enum_with() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics('''
 class I<T> {}
 mixin M1 implements I<int> {}
 mixin M2 implements I<String> {}
 enum E with M1, M2 {
+//   ^
+// [diag.conflictingGenericInterfaces] The enum 'E' can't implement both 'I<int>' and 'I<String>' because the type arguments are different.
   v
 }
-''',
-      [error(diag.conflictingGenericInterfaces, 82, 1)],
-    );
+''');
   }
 
   test_extensionType() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics('''
 class I<T> {}
 class A implements I<int> {}
 class B implements I<num> {}
 extension type C(Never it) implements A, B {}
-''',
-      [
-        error(diag.conflictingGenericInterfaces, 87, 1),
-        error(diag.extensionTypeRepresentationTypeBottom, 89, 5),
-      ],
-    );
+//             ^
+// [diag.conflictingGenericInterfaces] The extension type 'C' can't implement both 'I<int>' and 'I<num>' because the type arguments are different.
+//               ^^^^^
+// [diag.extensionTypeRepresentationTypeBottom] The representation type can't be a bottom type.
+''');
   }
 
   test_mixin_on_implements() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics('''
 class I<T> {}
 class A implements I<int> {}
 class B implements I<String> {}
 mixin M on A implements B {}
-''',
-      [error(diag.conflictingGenericInterfaces, 81, 1)],
-    );
+//    ^
+// [diag.conflictingGenericInterfaces] The mixin 'M' can't implement both 'I<int>' and 'I<String>' because the type arguments are different.
+''');
   }
 
   test_noConflict() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics('''
 class I<T> {}
 class A implements I<int> {}
 class B implements I<int> {}
diff --git a/pkg/analyzer/test/src/diagnostics/conflicting_inherited_method_and_setter_test.dart b/pkg/analyzer/test/src/diagnostics/conflicting_inherited_method_and_setter_test.dart
index 3d1774d..3025a54 100644
--- a/pkg/analyzer/test/src/diagnostics/conflicting_inherited_method_and_setter_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/conflicting_inherited_method_and_setter_test.dart
@@ -2,7 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/src/diagnostic/diagnostic.dart' as diag;
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../dart/resolution/context_collection_resolution.dart';
@@ -16,8 +15,7 @@
 @reflectiveTest
 class ConflictingInheritedMethodAndSetterTest extends PubPackageResolutionTest {
   test_class_declaresSetter() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   void foo() {}
 }
@@ -28,110 +26,94 @@
 
 abstract class C implements A, B {
   set foo(int _) {}
+//    ^^^
+// [diag.conflictingFieldAndMethod] Class 'C' can't define field 'foo' and have method 'A.foo' with the same name.
 }
-''',
-      [error(diag.conflictingFieldAndMethod, 103, 3)],
-    );
+''');
   }
 
   test_class_interface2() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   void foo() {}
+//     ^^^
+// [context 1] The method is inherited from the class 'A'.
 }
 
 class B {
   set foo(int _) {}
+//    ^^^
+// [context 2] The setter is inherited from the class 'B'.
 }
 
 abstract class C implements A, B {}
-''',
-      [
-        error(
-          diag.conflictingInheritedMethodAndSetter,
-          77,
-          1,
-          contextMessages: [message(testFile, 17, 3), message(testFile, 45, 3)],
-        ),
-      ],
-    );
+//             ^
+// [diag.conflictingInheritedMethodAndSetter][context 1][context 2] The class 'C' can't inherit both a method and a setter named 'foo'.
+''');
   }
 
   test_class_mixin_interface() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 mixin A {
   void foo() {}
+//     ^^^
+// [context 1] The method is inherited from the mixin 'A'.
 }
 
 class B {
   set foo(int _) {}
+//    ^^^
+// [context 2] The setter is inherited from the class 'B'.
 }
 
 abstract class C with A implements B {}
-''',
-      [
-        error(
-          diag.conflictingInheritedMethodAndSetter,
-          77,
-          1,
-          contextMessages: [message(testFile, 17, 3), message(testFile, 45, 3)],
-        ),
-      ],
-    );
+//             ^
+// [diag.conflictingInheritedMethodAndSetter][context 1][context 2] The class 'C' can't inherit both a method and a setter named 'foo'.
+''');
   }
 
   test_class_superclass_interface() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   void foo() {}
+//     ^^^
+// [context 1] The method is inherited from the class 'A'.
 }
 
 class B {
   set foo(int _) {}
+//    ^^^
+// [context 2] The setter is inherited from the class 'B'.
 }
 
 abstract class C extends A implements B {}
-''',
-      [
-        error(
-          diag.conflictingInheritedMethodAndSetter,
-          77,
-          1,
-          contextMessages: [message(testFile, 17, 3), message(testFile, 45, 3)],
-        ),
-      ],
-    );
+//             ^
+// [diag.conflictingInheritedMethodAndSetter][context 1][context 2] The class 'C' can't inherit both a method and a setter named 'foo'.
+''');
   }
 
   test_class_superclass_mixin() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   void foo() {}
+//     ^^^
+// [context 1] The method is inherited from the class 'A'.
 }
 
 mixin B {
   set foo(int _) {}
+//    ^^^
+// [context 2] The setter is inherited from the mixin 'B'.
 }
 
 abstract class C extends A with B {}
-''',
-      [
-        error(
-          diag.conflictingInheritedMethodAndSetter,
-          77,
-          1,
-          contextMessages: [message(testFile, 17, 3), message(testFile, 45, 3)],
-        ),
-      ],
-    );
+//             ^
+// [diag.conflictingInheritedMethodAndSetter][context 1][context 2] The class 'C' can't inherit both a method and a setter named 'foo'.
+''');
   }
 
   test_extensionType_inheritedGetterSetter_noConflict() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 extension type A(Object? it) {
   int get foo => 0;
 }
@@ -145,7 +127,7 @@
   }
 
   test_extensionType_inheritedMethod_diamond_noConflict() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 extension type Base(Object? it) {
   void foo() {}
 }
@@ -159,31 +141,27 @@
   }
 
   test_extensionType_inheritedMethodSetter_conflict() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 extension type A(Object? it) {
   void foo() {}
+//     ^^^
+// [context 1] The method is inherited from the extension type 'A'.
 }
 
 extension type B(Object? it) {
   set foo(int _) {}
+//    ^^^
+// [context 2] The setter is inherited from the extension type 'B'.
 }
 
 extension type C(Object? it) implements A, B {}
-''',
-      [
-        error(
-          diag.conflictingInheritedMethodAndSetter,
-          119,
-          1,
-          contextMessages: [message(testFile, 38, 3), message(testFile, 87, 3)],
-        ),
-      ],
-    );
+//             ^
+// [diag.conflictingInheritedMethodAndSetter][context 1][context 2] The extension type 'C' can't inherit both a method and a setter named 'foo'.
+''');
   }
 
   test_extensionType_inheritedMethodSetter_declaredGetter_noConflict() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {}
 
 extension type A1(A it) {
@@ -201,7 +179,7 @@
   }
 
   test_extensionType_inheritedMethodSetter_declaredMethod_noConflict() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {}
 
 extension type A1(A it) {
@@ -219,7 +197,7 @@
   }
 
   test_extensionType_inheritedMethodSetter_declaredSetter_noConflict() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {}
 
 extension type A1(A it) {
@@ -237,60 +215,53 @@
   }
 
   test_extensionType_inheritedMethodSetter_declaredStaticMethod_conflict() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 extension type A(Object? it) {
   void foo() {}
+//     ^^^
+// [context 1] The method is inherited from the extension type 'A'.
 }
 
 extension type B(Object? it) {
   set foo(int _) {}
+//    ^^^
+// [context 2] The setter is inherited from the extension type 'B'.
 }
 
 extension type C(Object? it) implements A, B {
+//             ^
+// [diag.conflictingInheritedMethodAndSetter][context 1][context 2] The extension type 'C' can't inherit both a method and a setter named 'foo'.
   static void foo() {}
+//            ^^^
+// [diag.conflictingStaticAndInstance] Class 'C' can't define static member 'foo' and have instance member 'A.foo' with the same name.
 }
-''',
-      [
-        error(
-          diag.conflictingInheritedMethodAndSetter,
-          119,
-          1,
-          contextMessages: [message(testFile, 38, 3), message(testFile, 87, 3)],
-        ),
-        error(diag.conflictingStaticAndInstance, 165, 3),
-      ],
-    );
+''');
   }
 
   test_extensionType_inheritedMethodSetter_declaredUnrelated_conflict() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 extension type A(Object? it) {
   void foo() {}
+//     ^^^
+// [context 1] The method is inherited from the extension type 'A'.
 }
 
 extension type B(Object? it) {
   set foo(int _) {}
+//    ^^^
+// [context 2] The setter is inherited from the extension type 'B'.
 }
 
 extension type C(Object? it) implements A, B {
+//             ^
+// [diag.conflictingInheritedMethodAndSetter][context 1][context 2] The extension type 'C' can't inherit both a method and a setter named 'foo'.
   void bar() {}
 }
-''',
-      [
-        error(
-          diag.conflictingInheritedMethodAndSetter,
-          119,
-          1,
-          contextMessages: [message(testFile, 38, 3), message(testFile, 87, 3)],
-        ),
-      ],
-    );
+''');
   }
 
   test_extensionType_inheritedMethodSetter_fromClass_declaredGetter_noConflict() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   void foo() {}
 }
@@ -306,7 +277,7 @@
   }
 
   test_extensionType_inheritedMethodSetter_fromClass_declaredMethod_noConflict() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   void foo() {}
 }
@@ -322,7 +293,7 @@
   }
 
   test_extensionType_inheritedMethodSetter_fromClass_declaredSetter_noConflict() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   void foo() {}
 }
@@ -338,40 +309,41 @@
   }
 
   test_extensionType_inheritedMethodSetter_implicitSetter_conflict() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   int foo = 0;
+//    ^^^
+// [context 2] The setter is inherited from the class 'A'.
 }
 
 abstract class I {
   void foo();
+//     ^^^
+// [context 1] The method is inherited from the class 'I'.
 }
 
 extension type E(Object it) implements A, I {}
-''',
-      [
-        error(
-          diag.conflictingInheritedMethodAndSetter,
-          79,
-          1,
-          contextMessages: [message(testFile, 54, 3), message(testFile, 16, 3)],
-        ),
-        error(diag.extensionTypeImplementsNotSupertype, 103, 1),
-        error(diag.extensionTypeImplementsNotSupertype, 106, 1),
-      ],
-    );
+//             ^
+// [diag.conflictingInheritedMethodAndSetter][context 1][context 2] The extension type 'E' can't inherit both a method and a setter named 'foo'.
+//                                     ^
+// [diag.extensionTypeImplementsNotSupertype] 'A' is not a supertype of 'Object', the representation type.
+//                                        ^
+// [diag.extensionTypeImplementsNotSupertype] 'I' is not a supertype of 'Object', the representation type.
+''');
   }
 
   test_extensionType_inheritedMethodSetter_indirect_conflict() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 extension type BaseMethod(Object? it) {
   void foo() {}
+//     ^^^
+// [context 1] The method is inherited from the extension type 'BaseMethod'.
 }
 
 extension type BaseSetter(Object? it) {
   set foo(int _) {}
+//    ^^^
+// [context 2] The setter is inherited from the extension type 'BaseSetter'.
 }
 
 extension type Left(Object? it) implements BaseMethod {}
@@ -379,30 +351,23 @@
 extension type Right(Object? it) implements BaseSetter {}
 
 extension type C(Object? it) implements Left, Right {}
-''',
-      [
-        error(
-          diag.conflictingInheritedMethodAndSetter,
-          254,
-          1,
-          contextMessages: [
-            message(testFile, 47, 3),
-            message(testFile, 105, 3),
-          ],
-        ),
-      ],
-    );
+//             ^
+// [diag.conflictingInheritedMethodAndSetter][context 1][context 2] The extension type 'C' can't inherit both a method and a setter named 'foo'.
+''');
   }
 
   test_extensionType_inheritedMethodSetter_multiple_conflict() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 extension type A(Object? it) {
   void foo() {}
+//     ^^^
+// [context 1] The method is inherited from the extension type 'A'.
 }
 
 extension type B(Object? it) {
   set foo(int _) {}
+//    ^^^
+// [context 2] The setter is inherited from the extension type 'B'.
 }
 
 extension type C(Object? it) {
@@ -410,15 +375,8 @@
 }
 
 extension type D(Object? it) implements A, B, C {}
-''',
-      [
-        error(
-          diag.conflictingInheritedMethodAndSetter,
-          169,
-          1,
-          contextMessages: [message(testFile, 38, 3), message(testFile, 87, 3)],
-        ),
-      ],
-    );
+//             ^
+// [diag.conflictingInheritedMethodAndSetter][context 1][context 2] The extension type 'D' can't inherit both a method and a setter named 'foo'.
+''');
   }
 }
diff --git a/pkg/analyzer/test/src/diagnostics/conflicting_method_and_field_test.dart b/pkg/analyzer/test/src/diagnostics/conflicting_method_and_field_test.dart
index 49f1183..db43989 100644
--- a/pkg/analyzer/test/src/diagnostics/conflicting_method_and_field_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/conflicting_method_and_field_test.dart
@@ -16,31 +16,29 @@
 @reflectiveTest
 class ConflictingMethodAndFieldTest extends PubPackageResolutionTest {
   test_class_inSuper_field() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   int foo = 0;
 }
 class B extends A {
   foo() {}
+//^^^
+// [diag.conflictingMethodAndField] Class 'B' can't define method 'foo' and have field 'A.foo' with the same name.
 }
-''',
-      [error(diag.conflictingMethodAndField, 49, 3)],
-    );
+''');
   }
 
   test_class_inSuper_getter() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   get foo => 0;
 }
 class B extends A {
   foo() {}
+//^^^
+// [diag.conflictingMethodAndField] Class 'B' can't define method 'foo' and have field 'A.foo' with the same name.
 }
-''',
-      [error(diag.conflictingMethodAndField, 50, 3)],
-    );
+''');
   }
 
   @SkippedTest() // TODO(scheglov): implement augmentation
@@ -98,22 +96,35 @@
   }
 
   test_class_inSuper_setter() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   set foo(_) {}
 }
 class B extends A {
   foo() {}
+//^^^
+// [diag.conflictingMethodAndField] Class 'B' can't define method 'foo' and have field 'A.foo' with the same name.
 }
-''',
-      [error(diag.conflictingMethodAndField, 50, 3)],
-    );
+''');
+  }
+
+  test_enum_inMixin_field() async {
+    await resolveTestCodeWithDiagnostics(r'''
+mixin M {
+  void foo() {}
+}
+
+enum E with M {
+  v;
+  final int foo = 0;
+//          ^^^
+// [diag.conflictingFieldAndMethod] Class 'E' can't define field 'foo' and have method 'M.foo' with the same name.
+}
+''');
   }
 
   test_enum_inMixin_getter() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 mixin M {
   int get foo => 0;
 }
@@ -121,10 +132,10 @@
 enum E with M {
   v;
   void foo() {}
+//     ^^^
+// [diag.conflictingMethodAndField] Class 'E' can't define method 'foo' and have field 'M.foo' with the same name.
 }
-''',
-      [error(diag.conflictingMethodAndField, 61, 3)],
-    );
+''');
   }
 
   @SkippedTest() // TODO(scheglov): implement augmentation
@@ -183,8 +194,7 @@
   }
 
   test_enum_inMixin_setter() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 mixin M {
   set foo(int _) {}
 }
@@ -192,14 +202,14 @@
 enum E with M {
   v;
   void foo() {}
+//     ^^^
+// [diag.conflictingMethodAndField] Class 'E' can't define method 'foo' and have field 'M.foo' with the same name.
 }
-''',
-      [error(diag.conflictingMethodAndField, 61, 3)],
-    );
+''');
   }
 
   test_extensionType_field_external() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 extension type A(int it) {
   external int foo;
 }
@@ -211,7 +221,7 @@
   }
 
   test_extensionType_getter() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 extension type A(int it) {
   int get foo => 0;
 }
@@ -223,7 +233,7 @@
   }
 
   test_extensionType_setter() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 extension type A(int it) {
   set foo(int _) {}
 }
diff --git a/pkg/analyzer/test/src/diagnostics/conflicting_static_and_instance_test.dart b/pkg/analyzer/test/src/diagnostics/conflicting_static_and_instance_test.dart
index 8cdcb1b..f000b08 100644
--- a/pkg/analyzer/test/src/diagnostics/conflicting_static_and_instance_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/conflicting_static_and_instance_test.dart
@@ -19,15 +19,14 @@
 @reflectiveTest
 class ConflictingStaticAndInstanceClassTest extends PubPackageResolutionTest {
   test_inClass_instanceMethod_staticMethod() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class C {
   void foo() {}
   static void foo() {}
+//            ^^^
+// [diag.conflictingStaticAndInstance] Class 'C' can't define static member 'foo' and have instance member 'C.foo' with the same name.
 }
-''',
-      [error(diag.conflictingStaticAndInstance, 40, 3)],
-    );
+''');
   }
 
   @SkippedTest() // TODO(scheglov): implement augmentation
@@ -47,63 +46,58 @@
   }
 
   test_inClass_staticGetter_instanceGetter() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class C {
   static int get foo => 0;
+//               ^^^
+// [diag.conflictingStaticAndInstance] Class 'C' can't define static member 'foo' and have instance member 'C.foo' with the same name.
   int get foo => 0;
 }
-''',
-      [error(diag.conflictingStaticAndInstance, 27, 3)],
-    );
+''');
   }
 
   test_inClass_staticGetter_instanceMethod() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class C {
   static int get foo => 0;
+//               ^^^
+// [diag.conflictingStaticAndInstance] Class 'C' can't define static member 'foo' and have instance member 'C.foo' with the same name.
   void foo() {}
 }
-''',
-      [error(diag.conflictingStaticAndInstance, 27, 3)],
-    );
+''');
   }
 
   test_inClass_staticGetter_instanceSetter() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class C {
   static int get foo => 0;
+//               ^^^
+// [diag.conflictingStaticAndInstance] Class 'C' can't define static member 'foo' and have instance member 'C.foo' with the same name.
   set foo(_) {}
 }
-''',
-      [error(diag.conflictingStaticAndInstance, 27, 3)],
-    );
+''');
   }
 
   test_inClass_staticMethod_instanceGetter() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class C {
   static void foo() {}
+//            ^^^
+// [diag.conflictingStaticAndInstance] Class 'C' can't define static member 'foo' and have instance member 'C.foo' with the same name.
   int get foo => 0;
 }
-''',
-      [error(diag.conflictingStaticAndInstance, 24, 3)],
-    );
+''');
   }
 
   test_inClass_staticMethod_instanceMethod() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class C {
   static void foo() {}
+//            ^^^
+// [diag.conflictingStaticAndInstance] Class 'C' can't define static member 'foo' and have instance member 'C.foo' with the same name.
   void foo() {}
 }
-''',
-      [error(diag.conflictingStaticAndInstance, 24, 3)],
-    );
+''');
   }
 
   @SkippedTest() // TODO(scheglov): implement augmentation
@@ -123,191 +117,177 @@
   }
 
   test_inClass_staticMethod_instanceSetter() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class C {
   static void foo() {}
+//            ^^^
+// [diag.conflictingStaticAndInstance] Class 'C' can't define static member 'foo' and have instance member 'C.foo' with the same name.
   set foo(_) {}
 }
-''',
-      [error(diag.conflictingStaticAndInstance, 24, 3)],
-    );
+''');
   }
 
   test_inClass_staticSetter_instanceGetter() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class C {
   static set foo(_) {}
+//           ^^^
+// [diag.conflictingStaticAndInstance] Class 'C' can't define static member 'foo' and have instance member 'C.foo' with the same name.
   int get foo => 0;
 }
-''',
-      [error(diag.conflictingStaticAndInstance, 23, 3)],
-    );
+''');
   }
 
   test_inClass_staticSetter_instanceMethod() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class C {
   static set foo(_) {}
+//           ^^^
+// [diag.conflictingStaticAndInstance] Class 'C' can't define static member 'foo' and have instance member 'C.foo' with the same name.
   void foo() {}
 }
-''',
-      [error(diag.conflictingStaticAndInstance, 23, 3)],
-    );
+''');
   }
 
   test_inClass_staticSetter_instanceSetter() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class C {
   static set foo(_) {}
+//           ^^^
+// [diag.conflictingStaticAndInstance] Class 'C' can't define static member 'foo' and have instance member 'C.foo' with the same name.
   set foo(_) {}
 }
-''',
-      [error(diag.conflictingStaticAndInstance, 23, 3)],
-    );
+''');
   }
 
   test_inInterface_instanceGetter_staticGetter() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics('''
 class A {
   int get foo => 0;
 }
 abstract class B implements A {
   static int get foo => 0;
+//               ^^^
+// [diag.conflictingStaticAndInstance] Class 'B' can't define static member 'foo' and have instance member 'A.foo' with the same name.
 }
-''',
-      [error(diag.conflictingStaticAndInstance, 81, 3)],
-    );
+''');
   }
 
   test_inInterface_instanceGetter_staticMethod() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics('''
 class A {
   int get foo => 0;
 }
 abstract class B implements A {
   static void foo() {}
+//            ^^^
+// [diag.conflictingStaticAndInstance] Class 'B' can't define static member 'foo' and have instance member 'A.foo' with the same name.
 }
-''',
-      [error(diag.conflictingStaticAndInstance, 78, 3)],
-    );
+''');
   }
 
   test_inInterface_instanceMethod_staticMethod() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics('''
 class A {
   void foo() {}
 }
 abstract class B implements A {
   static void foo() {}
+//            ^^^
+// [diag.conflictingStaticAndInstance] Class 'B' can't define static member 'foo' and have instance member 'A.foo' with the same name.
 }
-''',
-      [error(diag.conflictingStaticAndInstance, 74, 3)],
-    );
+''');
   }
 
   test_inInterface_instanceMethod_staticSetter() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics('''
 class A {
   void foo() {}
 }
 abstract class B implements A {
   static set foo(_) {}
+//           ^^^
+// [diag.conflictingStaticAndInstance] Class 'B' can't define static member 'foo' and have instance member 'A.foo' with the same name.
 }
-''',
-      [error(diag.conflictingStaticAndInstance, 73, 3)],
-    );
+''');
   }
 
   test_inInterface_instanceSetter_staticGetter() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics('''
 class A {
   set foo(_) {}
 }
 abstract class B implements A {
   static int get foo => 0;
+//               ^^^
+// [diag.conflictingStaticAndInstance] Class 'B' can't define static member 'foo' and have instance member 'A.foo' with the same name.
 }
-''',
-      [error(diag.conflictingStaticAndInstance, 77, 3)],
-    );
+''');
   }
 
   test_inInterface_instanceSetter_staticMethod() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics('''
 class A {
   set foo(_) {}
 }
 abstract class B implements A {
   static void foo() {}
+//            ^^^
+// [diag.conflictingStaticAndInstance] Class 'B' can't define static member 'foo' and have instance member 'A.foo' with the same name.
 }
-''',
-      [error(diag.conflictingStaticAndInstance, 74, 3)],
-    );
+''');
   }
 
   test_inInterface_instanceSetter_staticSetter() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics('''
 class A {
   set foo(_) {}
 }
 abstract class B implements A {
   static set foo(_) {}
+//           ^^^
+// [diag.conflictingStaticAndInstance] Class 'B' can't define static member 'foo' and have instance member 'A.foo' with the same name.
 }
-''',
-      [error(diag.conflictingStaticAndInstance, 73, 3)],
-    );
+''');
   }
 
   test_inMixin_instanceGetter_staticGetter() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics('''
 mixin A {
   int get foo => 0;
 }
 class B extends Object with A {
   static int get foo => 0;
+//               ^^^
+// [diag.conflictingStaticAndInstance] Class 'B' can't define static member 'foo' and have instance member 'A.foo' with the same name.
 }
-''',
-      [error(diag.conflictingStaticAndInstance, 81, 3)],
-    );
+''');
   }
 
   test_inMixin_instanceGetter_staticMethod() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics('''
 mixin A {
   int get foo => 0;
 }
 class B extends Object with A {
   static void foo() {}
+//            ^^^
+// [diag.conflictingStaticAndInstance] Class 'B' can't define static member 'foo' and have instance member 'A.foo' with the same name.
 }
-''',
-      [error(diag.conflictingStaticAndInstance, 78, 3)],
-    );
+''');
   }
 
   test_inMixin_instanceMethod_staticMethod() async {
-    await assertErrorsInCode(
-      r'''
-mixin A {
+    await resolveTestCodeWithDiagnostics('''
+mixin M {
   void foo() {}
 }
-class B extends Object with A {
+class B extends Object with M {
   static void foo() {}
+//            ^^^
+// [diag.conflictingStaticAndInstance] Class 'B' can't define static member 'foo' and have instance member 'M.foo' with the same name.
 }
-''',
-      [error(diag.conflictingStaticAndInstance, 74, 3)],
-    );
+''');
   }
 
   @SkippedTest() // TODO(scheglov): implement augmentation
@@ -327,59 +307,55 @@
   }
 
   test_inMixin_instanceMethod_staticSetter() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 mixin A {
   void foo() {}
 }
 class B extends Object with A {
   static set foo(_) {}
+//           ^^^
+// [diag.conflictingStaticAndInstance] Class 'B' can't define static member 'foo' and have instance member 'A.foo' with the same name.
 }
-''',
-      [error(diag.conflictingStaticAndInstance, 73, 3)],
-    );
+''');
   }
 
   test_inMixin_instanceSetter_staticGetter() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 mixin A {
   set foo(_) {}
 }
 class B extends Object with A {
   static int get foo => 0;
+//               ^^^
+// [diag.conflictingStaticAndInstance] Class 'B' can't define static member 'foo' and have instance member 'A.foo' with the same name.
 }
-''',
-      [error(diag.conflictingStaticAndInstance, 77, 3)],
-    );
+''');
   }
 
   test_inMixin_instanceSetter_staticMethod() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 mixin A {
   set foo(_) {}
 }
 class B extends Object with A {
   static void foo() {}
+//            ^^^
+// [diag.conflictingStaticAndInstance] Class 'B' can't define static member 'foo' and have instance member 'A.foo' with the same name.
 }
-''',
-      [error(diag.conflictingStaticAndInstance, 74, 3)],
-    );
+''');
   }
 
   test_inMixin_instanceSetter_staticSetter() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 mixin A {
   set foo(_) {}
 }
 class B extends Object with A {
   static set foo(_) {}
+//           ^^^
+// [diag.conflictingStaticAndInstance] Class 'B' can't define static member 'foo' and have instance member 'A.foo' with the same name.
 }
-''',
-      [error(diag.conflictingStaticAndInstance, 73, 3)],
-    );
+''');
   }
 
   @SkippedTest() // TODO(scheglov): implement augmentation
@@ -399,236 +375,217 @@
   }
 
   test_inSuper_implicitObject_staticMethod_instanceGetter() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   static String runtimeType() => 'x';
+//              ^^^^^^^^^^^
+// [diag.conflictingStaticAndInstance] Class 'A' can't define static member 'runtimeType' and have instance member 'Object.runtimeType' with the same name.
 }
-''',
-      [error(diag.conflictingStaticAndInstance, 26, 11)],
-    );
+''');
   }
 
   test_inSuper_implicitObject_staticMethod_instanceMethod() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   static String toString() => 'x';
+//              ^^^^^^^^
+// [diag.conflictingStaticAndInstance] Class 'A' can't define static member 'toString' and have instance member 'Object.toString' with the same name.
 }
-''',
-      [error(diag.conflictingStaticAndInstance, 26, 8)],
-    );
+''');
   }
 
   test_inSuper_instanceGetter_staticGetter() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   int get foo => 0;
 }
 class B extends A {
   static int get foo => 0;
+//               ^^^
+// [diag.conflictingStaticAndInstance] Class 'B' can't define static member 'foo' and have instance member 'A.foo' with the same name.
 }
-''',
-      [error(diag.conflictingStaticAndInstance, 69, 3)],
-    );
+''');
   }
 
   test_inSuper_instanceGetter_staticMethod() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   int get foo => 0;
 }
 class B extends A {
   static void foo() {}
+//            ^^^
+// [diag.conflictingStaticAndInstance] Class 'B' can't define static member 'foo' and have instance member 'A.foo' with the same name.
 }
-''',
-      [error(diag.conflictingStaticAndInstance, 66, 3)],
-    );
+''');
   }
 
   test_inSuper_instanceMethod_staticGetter() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
-  int get foo => 0;
+  void foo() {}
 }
 class B extends A {
-  static void foo() {}
+  static int get foo => 0;
+//               ^^^
+// [diag.conflictingStaticAndInstance] Class 'B' can't define static member 'foo' and have instance member 'A.foo' with the same name.
 }
-''',
-      [error(diag.conflictingStaticAndInstance, 66, 3)],
-    );
+''');
   }
 
   test_inSuper_instanceMethod_staticMethod() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   void foo() {}
 }
 class B extends A {
   static void foo() {}
+//            ^^^
+// [diag.conflictingStaticAndInstance] Class 'B' can't define static member 'foo' and have instance member 'A.foo' with the same name.
 }
-''',
-      [error(diag.conflictingStaticAndInstance, 62, 3)],
-    );
+''');
   }
 
   test_inSuper_instanceMethod_staticSetter() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   void foo() {}
 }
 class B extends A {
   static set foo(_) {}
+//           ^^^
+// [diag.conflictingStaticAndInstance] Class 'B' can't define static member 'foo' and have instance member 'A.foo' with the same name.
 }
-''',
-      [error(diag.conflictingStaticAndInstance, 61, 3)],
-    );
+''');
   }
 
   test_inSuper_instanceSetter_staticGetter() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   set foo(_) {}
 }
 class B extends A {
   static int get foo => 0;
+//               ^^^
+// [diag.conflictingStaticAndInstance] Class 'B' can't define static member 'foo' and have instance member 'A.foo' with the same name.
 }
-''',
-      [error(diag.conflictingStaticAndInstance, 65, 3)],
-    );
+''');
   }
 
   test_inSuper_instanceSetter_staticMethod() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   set foo(_) {}
 }
 class B extends A {
   static void foo() {}
+//            ^^^
+// [diag.conflictingStaticAndInstance] Class 'B' can't define static member 'foo' and have instance member 'A.foo' with the same name.
 }
-''',
-      [error(diag.conflictingStaticAndInstance, 62, 3)],
-    );
+''');
   }
 
   test_inSuper_instanceSetter_staticSetter() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   set foo(_) {}
 }
 class B extends A {
   static set foo(_) {}
+//           ^^^
+// [diag.conflictingStaticAndInstance] Class 'B' can't define static member 'foo' and have instance member 'A.foo' with the same name.
 }
-''',
-      [error(diag.conflictingStaticAndInstance, 61, 3)],
-    );
+''');
   }
 }
 
 @reflectiveTest
 class ConflictingStaticAndInstanceEnumTest extends PubPackageResolutionTest {
   test_constant_hashCode() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 enum E {
   a, hashCode, b
+//   ^^^^^^^^
+// [diag.conflictingStaticAndInstance] Class 'E' can't define static member 'hashCode' and have instance member 'E.hashCode' with the same name.
 }
-''',
-      [error(diag.conflictingStaticAndInstance, 14, 8)],
-    );
+''');
   }
 
   test_constant_index() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 enum E {
   a, index, b
+//   ^^^^^
+// [diag.conflictingStaticAndInstance] Class 'E' can't define static member 'index' and have instance member 'E.index' with the same name.
 }
-''',
-      [error(diag.conflictingStaticAndInstance, 14, 5)],
-    );
+''');
   }
 
   test_constant_instanceSetter() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 enum E {
   foo;
+//^^^
+// [diag.conflictingStaticAndInstance] Class 'E' can't define static member 'foo' and have instance member 'E.foo' with the same name.
   set foo(_) {}
 }
-''',
-      [error(diag.conflictingStaticAndInstance, 11, 3)],
-    );
+''');
   }
 
   test_constant_noSuchMethod() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 enum E {
   a, noSuchMethod, b
+//   ^^^^^^^^^^^^
+// [diag.conflictingStaticAndInstance] Class 'E' can't define static member 'noSuchMethod' and have instance member 'E.noSuchMethod' with the same name.
 }
-''',
-      [error(diag.conflictingStaticAndInstance, 14, 12)],
-    );
+''');
   }
 
   test_constant_runtimeType() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 enum E {
   a, runtimeType, b
+//   ^^^^^^^^^^^
+// [diag.conflictingStaticAndInstance] Class 'E' can't define static member 'runtimeType' and have instance member 'E.runtimeType' with the same name.
 }
-''',
-      [error(diag.conflictingStaticAndInstance, 14, 11)],
-    );
+''');
   }
 
   test_constant_staticMethod() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 enum E {
   foo;
+//^^^
+// [diag.conflictingStaticAndInstance] Class 'E' can't define static member 'foo' and have instance member 'E.foo' with the same name.
   void foo() {}
 }
-''',
-      [error(diag.conflictingStaticAndInstance, 11, 3)],
-    );
+''');
   }
 
   test_constant_toString() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 enum E {
   a, toString, b
+//   ^^^^^^^^
+// [diag.conflictingStaticAndInstance] Class 'E' can't define static member 'toString' and have instance member 'E.toString' with the same name.
 }
-''',
-      [error(diag.conflictingStaticAndInstance, 14, 8)],
-    );
+''');
   }
 
   test_field_dartCoreEnum() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 enum E {
   v;
   static final int hashCode = 0;
+//                 ^^^^^^^^
+// [diag.conflictingStaticAndInstance] Class 'E' can't define static member 'hashCode' and have instance member 'E.hashCode' with the same name.
 }
-''',
-      [error(diag.conflictingStaticAndInstance, 33, 8)],
-    );
+''');
   }
 
   test_field_mixin_getter() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 mixin M {
   int get foo => 0;
 }
@@ -636,15 +593,14 @@
 enum E with M {
   v;
   static final int foo = 0;
+//                 ^^^
+// [diag.conflictingStaticAndInstance] Class 'E' can't define static member 'foo' and have instance member 'E.foo' with the same name.
 }
-''',
-      [error(diag.conflictingStaticAndInstance, 73, 3)],
-    );
+''');
   }
 
   test_field_mixin_method() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 mixin M {
   void foo() {}
 }
@@ -652,15 +608,14 @@
 enum E with M {
   v;
   static final int foo = 0;
+//                 ^^^
+// [diag.conflictingStaticAndInstance] Class 'E' can't define static member 'foo' and have instance member 'E.foo' with the same name.
 }
-''',
-      [error(diag.conflictingStaticAndInstance, 69, 3)],
-    );
+''');
   }
 
   test_field_mixin_setter() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 mixin M {
   set foo(int _) {}
 }
@@ -668,78 +623,72 @@
 enum E with M {
   v;
   static final int foo = 0;
+//                 ^^^
+// [diag.conflictingStaticAndInstance] Class 'E' can't define static member 'foo' and have instance member 'E.foo' with the same name.
 }
-''',
-      [error(diag.conflictingStaticAndInstance, 73, 3)],
-    );
+''');
   }
 
   test_field_this_constant() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 enum E {
   foo;
+//^^^
+// [diag.conflictingStaticAndInstance] Class 'E' can't define static member 'foo' and have instance member 'E.foo' with the same name.
   int get foo => 0;
 }
-''',
-      [error(diag.conflictingStaticAndInstance, 11, 3)],
-    );
+''');
   }
 
   test_field_this_getter() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 enum E {
   v;
   static final int foo = 0;
+//                 ^^^
+// [diag.conflictingStaticAndInstance] Class 'E' can't define static member 'foo' and have instance member 'E.foo' with the same name.
   int get foo => 0;
 }
-''',
-      [error(diag.conflictingStaticAndInstance, 33, 3)],
-    );
+''');
   }
 
   test_field_this_method() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 enum E {
   v;
   static final int foo = 0;
+//                 ^^^
+// [diag.conflictingStaticAndInstance] Class 'E' can't define static member 'foo' and have instance member 'E.foo' with the same name.
   void foo() {}
 }
-''',
-      [error(diag.conflictingStaticAndInstance, 33, 3)],
-    );
+''');
   }
 
   test_field_this_setter() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 enum E {
   v;
   static final int foo = 0;
+//                 ^^^
+// [diag.conflictingStaticAndInstance] Class 'E' can't define static member 'foo' and have instance member 'E.foo' with the same name.
   set foo(int _) {}
 }
-''',
-      [error(diag.conflictingStaticAndInstance, 33, 3)],
-    );
+''');
   }
 
   test_method_dartCoreEnum() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 enum E {
   v;
   static int hashCode() => 0;
+//           ^^^^^^^^
+// [diag.conflictingStaticAndInstance] Class 'E' can't define static member 'hashCode' and have instance member 'E.hashCode' with the same name.
 }
-''',
-      [error(diag.conflictingStaticAndInstance, 27, 8)],
-    );
+''');
   }
 
   test_method_mixin_getter() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 mixin M {
   int get foo => 0;
 }
@@ -747,15 +696,14 @@
 enum E with M {
   v;
   static void foo() {}
+//            ^^^
+// [diag.conflictingStaticAndInstance] Class 'E' can't define static member 'foo' and have instance member 'E.foo' with the same name.
 }
-''',
-      [error(diag.conflictingStaticAndInstance, 68, 3)],
-    );
+''');
   }
 
   test_method_mixin_method() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 mixin M {
   void foo() {}
 }
@@ -763,15 +711,14 @@
 enum E with M {
   v;
   static void foo() {}
+//            ^^^
+// [diag.conflictingStaticAndInstance] Class 'E' can't define static member 'foo' and have instance member 'E.foo' with the same name.
 }
-''',
-      [error(diag.conflictingStaticAndInstance, 64, 3)],
-    );
+''');
   }
 
   test_method_mixin_setter() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 mixin M {
   set foo(int _) {}
 }
@@ -779,75 +726,70 @@
 enum E with M {
   v;
   static void foo() {}
+//            ^^^
+// [diag.conflictingStaticAndInstance] Class 'E' can't define static member 'foo' and have instance member 'E.foo' with the same name.
 }
-''',
-      [error(diag.conflictingStaticAndInstance, 68, 3)],
-    );
+''');
   }
 
   test_staticGetter_instanceSetter() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 enum E {
   v;
   static int get foo => 0;
+//               ^^^
+// [diag.conflictingStaticAndInstance] Class 'E' can't define static member 'foo' and have instance member 'E.foo' with the same name.
   set foo(_) {}
 }
-''',
-      [error(diag.conflictingStaticAndInstance, 31, 3)],
-    );
+''');
   }
 
   test_staticMethod_instanceGetter() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 enum E {
   v;
   static void foo() {}
+//            ^^^
+// [diag.conflictingStaticAndInstance] Class 'E' can't define static member 'foo' and have instance member 'E.foo' with the same name.
   int get foo => 0;
 }
-''',
-      [error(diag.conflictingStaticAndInstance, 28, 3)],
-    );
+''');
   }
 
   test_staticMethod_instanceMethod() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 enum E {
   v;
   static void foo() {}
+//            ^^^
+// [diag.conflictingStaticAndInstance] Class 'E' can't define static member 'foo' and have instance member 'E.foo' with the same name.
   void foo() {}
 }
-''',
-      [error(diag.conflictingStaticAndInstance, 28, 3)],
-    );
+''');
   }
 
   test_staticMethod_instanceSetter() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 enum E {
   v;
   static void foo() {}
+//            ^^^
+// [diag.conflictingStaticAndInstance] Class 'E' can't define static member 'foo' and have instance member 'E.foo' with the same name.
   set foo(int _) {}
 }
-''',
-      [error(diag.conflictingStaticAndInstance, 28, 3)],
-    );
+''');
   }
 
   test_staticSetter_instanceGetter() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 enum E {
   v;
   static set foo(_) {}
+//           ^^^
+// [diag.conflictingStaticAndInstance] Class 'E' can't define static member 'foo' and have instance member 'E.foo' with the same name.
   int get foo => 0;
 }
-''',
-      [error(diag.conflictingStaticAndInstance, 27, 3)],
-    );
+''');
   }
 }
 
@@ -855,617 +797,570 @@
 class ConflictingStaticAndInstanceExtensionTypeTest
     extends PubPackageResolutionTest {
   test_inExtensionType_staticGetter_instanceGetter() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 extension type A(int it) {
   static int get foo => 0;
+//               ^^^
+// [diag.conflictingStaticAndInstance] Class 'A' can't define static member 'foo' and have instance member 'A.foo' with the same name.
   int get foo => 0;
 }
-''',
-      [error(diag.conflictingStaticAndInstance, 44, 3)],
-    );
+''');
   }
 
   test_inExtensionType_staticGetter_instanceMethod() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 extension type A(int t) {
   static int get foo => 0;
+//               ^^^
+// [diag.conflictingStaticAndInstance] Class 'A' can't define static member 'foo' and have instance member 'A.foo' with the same name.
   void foo() {}
 }
-''',
-      [error(diag.conflictingStaticAndInstance, 43, 3)],
-    );
+''');
   }
 
   test_inExtensionType_staticGetter_instanceSetter() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 extension type A(int it) {
   static int get foo => 0;
+//               ^^^
+// [diag.conflictingStaticAndInstance] Class 'A' can't define static member 'foo' and have instance member 'A.foo' with the same name.
   set foo(_) {}
 }
-''',
-      [error(diag.conflictingStaticAndInstance, 44, 3)],
-    );
+''');
   }
 
   test_inExtensionType_staticMethod_instanceGetter() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 extension type A(int it) {
   static void foo() {}
+//            ^^^
+// [diag.conflictingStaticAndInstance] Class 'A' can't define static member 'foo' and have instance member 'A.foo' with the same name.
   int get foo => 0;
 }
-''',
-      [error(diag.conflictingStaticAndInstance, 41, 3)],
-    );
+''');
   }
 
   test_inExtensionType_staticMethod_instanceMethod() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 extension type A(int it) {
   static void foo() {}
+//            ^^^
+// [diag.conflictingStaticAndInstance] Class 'A' can't define static member 'foo' and have instance member 'A.foo' with the same name.
   void foo() {}
 }
-''',
-      [error(diag.conflictingStaticAndInstance, 41, 3)],
-    );
+''');
   }
 
   test_inExtensionType_staticMethod_instanceSetter() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 extension type A(int it) {
   static void foo() {}
+//            ^^^
+// [diag.conflictingStaticAndInstance] Class 'A' can't define static member 'foo' and have instance member 'A.foo' with the same name.
   set foo(_) {}
 }
-''',
-      [error(diag.conflictingStaticAndInstance, 41, 3)],
-    );
+''');
   }
 
   test_inExtensionType_staticSetter_instanceGetter() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 extension type A(int it) {
   static set foo(_) {}
+//           ^^^
+// [diag.conflictingStaticAndInstance] Class 'A' can't define static member 'foo' and have instance member 'A.foo' with the same name.
   int get foo => 0;
 }
-''',
-      [error(diag.conflictingStaticAndInstance, 40, 3)],
-    );
+''');
   }
 
   test_inExtensionType_staticSetter_instanceMethod() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 extension type A(int it) {
   static set foo(_) {}
+//           ^^^
+// [diag.conflictingStaticAndInstance] Class 'A' can't define static member 'foo' and have instance member 'A.foo' with the same name.
   void foo() {}
 }
-''',
-      [error(diag.conflictingStaticAndInstance, 40, 3)],
-    );
+''');
   }
 
   test_inExtensionType_staticSetter_instanceSetter() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 extension type A(int it) {
   static set foo(_) {}
+//           ^^^
+// [diag.conflictingStaticAndInstance] Class 'A' can't define static member 'foo' and have instance member 'A.foo' with the same name.
   set foo(_) {}
 }
-''',
-      [error(diag.conflictingStaticAndInstance, 40, 3)],
-    );
+''');
   }
 
   test_inInterface_instanceGetter_staticGetter() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 extension type A(int it) {
   int get foo => 0;
 }
 
 extension type B(int it) implements A {
   static int get foo => 0;
+//               ^^^
+// [diag.conflictingStaticAndInstance] Class 'B' can't define static member 'foo' and have instance member 'A.foo' with the same name.
 }
-''',
-      [error(diag.conflictingStaticAndInstance, 107, 3)],
-    );
+''');
   }
 
   test_inInterface_instanceGetter_staticMethod() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 extension type A(int it) {
   int get foo => 0;
 }
 
 extension type B(int it) implements A {
   static void foo() {}
+//            ^^^
+// [diag.conflictingStaticAndInstance] Class 'B' can't define static member 'foo' and have instance member 'A.foo' with the same name.
 }
-''',
-      [error(diag.conflictingStaticAndInstance, 104, 3)],
-    );
+''');
   }
 
   test_inInterface_instanceMethod_staticGetter() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 extension type A(int it) {
   int get foo => 0;
 }
 
 extension type B(int it) implements A {
   static void foo() {}
+//            ^^^
+// [diag.conflictingStaticAndInstance] Class 'B' can't define static member 'foo' and have instance member 'A.foo' with the same name.
 }
-''',
-      [error(diag.conflictingStaticAndInstance, 104, 3)],
-    );
+''');
   }
 
   test_inInterface_instanceMethod_staticMethod() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 extension type A(int it) {
   void foo() {}
 }
 
 extension type B(int it) implements A {
   static void foo() {}
+//            ^^^
+// [diag.conflictingStaticAndInstance] Class 'B' can't define static member 'foo' and have instance member 'A.foo' with the same name.
 }
-''',
-      [error(diag.conflictingStaticAndInstance, 100, 3)],
-    );
+''');
   }
 
   test_inInterface_instanceMethod_staticSetter() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 extension type A(int it) {
   void foo() {}
 }
 
 extension type B(int it) implements A {
   static set foo(_) {}
+//           ^^^
+// [diag.conflictingStaticAndInstance] Class 'B' can't define static member 'foo' and have instance member 'A.foo' with the same name.
 }
-''',
-      [error(diag.conflictingStaticAndInstance, 99, 3)],
-    );
+''');
   }
 
   test_inInterface_instanceSetter_staticGetter() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 extension type A(int it) {
   set foo(_) {}
 }
 
 extension type B(int it) implements A {
   static int get foo => 0;
+//               ^^^
+// [diag.conflictingStaticAndInstance] Class 'B' can't define static member 'foo' and have instance member 'A.foo' with the same name.
 }
-''',
-      [error(diag.conflictingStaticAndInstance, 103, 3)],
-    );
+''');
   }
 
   test_inInterface_instanceSetter_staticMethod() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 extension type A(int it) {
   set foo(_) {}
 }
 
 extension type B(int it) implements A {
   static void foo() {}
+//            ^^^
+// [diag.conflictingStaticAndInstance] Class 'B' can't define static member 'foo' and have instance member 'A.foo' with the same name.
 }
-''',
-      [error(diag.conflictingStaticAndInstance, 100, 3)],
-    );
+''');
   }
 
   test_inInterface_instanceSetter_staticSetter() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 extension type A(int it) {
   set foo(_) {}
 }
 
 extension type B(int it) implements A {
   static set foo(_) {}
+//           ^^^
+// [diag.conflictingStaticAndInstance] Class 'B' can't define static member 'foo' and have instance member 'A.foo' with the same name.
 }
-''',
-      [error(diag.conflictingStaticAndInstance, 99, 3)],
-    );
+''');
   }
 }
 
 @reflectiveTest
 class ConflictingStaticAndInstanceMixinTest extends PubPackageResolutionTest {
   test_dartCoreEnum_index_field() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 mixin M on Enum {
   static int index = 0;
+//           ^^^^^
+// [diag.conflictingStaticAndInstance] Class 'M' can't define static member 'index' and have instance member 'Enum.index' with the same name.
 }
-''',
-      [error(diag.conflictingStaticAndInstance, 31, 5)],
-    );
+''');
   }
 
   test_dartCoreEnum_index_getter() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 mixin M on Enum {
   static int get index => 0;
+//               ^^^^^
+// [diag.conflictingStaticAndInstance] Class 'M' can't define static member 'index' and have instance member 'Enum.index' with the same name.
 }
-''',
-      [error(diag.conflictingStaticAndInstance, 35, 5)],
-    );
+''');
   }
 
   test_dartCoreEnum_index_method() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 mixin M on Enum {
   static int index() => 0;
+//           ^^^^^
+// [diag.conflictingStaticAndInstance] Class 'M' can't define static member 'index' and have instance member 'Enum.index' with the same name.
 }
-''',
-      [error(diag.conflictingStaticAndInstance, 31, 5)],
-    );
+''');
   }
 
   test_dartCoreEnum_index_setter() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 mixin M on Enum {
   static set index(int _) {}
+//           ^^^^^
+// [diag.conflictingStaticAndInstance] Class 'M' can't define static member 'index' and have instance member 'Enum.index' with the same name.
 }
-''',
-      [error(diag.conflictingStaticAndInstance, 31, 5)],
-    );
+''');
   }
 
   test_inConstraint_implicitObject_staticMethod_instanceGetter() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 mixin M {
   static String runtimeType() => 'x';
+//              ^^^^^^^^^^^
+// [diag.conflictingStaticAndInstance] Class 'M' can't define static member 'runtimeType' and have instance member 'Object.runtimeType' with the same name.
 }
-''',
-      [error(diag.conflictingStaticAndInstance, 26, 11)],
-    );
+''');
   }
 
   test_inConstraint_implicitObject_staticMethod_instanceMethod() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 mixin M {
   static String toString() => 'x';
+//              ^^^^^^^^
+// [diag.conflictingStaticAndInstance] Class 'M' can't define static member 'toString' and have instance member 'Object.toString' with the same name.
 }
-''',
-      [error(diag.conflictingStaticAndInstance, 26, 8)],
-    );
+''');
   }
 
   test_inConstraint_instanceGetter_staticGetter() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   int get foo => 0;
 }
 mixin M on A {
   static int get foo => 0;
+//               ^^^
+// [diag.conflictingStaticAndInstance] Class 'M' can't define static member 'foo' and have instance member 'A.foo' with the same name.
 }
-''',
-      [error(diag.conflictingStaticAndInstance, 64, 3)],
-    );
+''');
   }
 
   test_inConstraint_instanceGetter_staticMethod() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   int get foo => 0;
 }
 mixin M on A {
   static void foo() {}
+//            ^^^
+// [diag.conflictingStaticAndInstance] Class 'M' can't define static member 'foo' and have instance member 'A.foo' with the same name.
 }
-''',
-      [error(diag.conflictingStaticAndInstance, 61, 3)],
-    );
+''');
   }
 
   test_inConstraint_instanceMethod_staticMethod() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   void foo() {}
 }
 mixin M on A {
   static void foo() {}
+//            ^^^
+// [diag.conflictingStaticAndInstance] Class 'M' can't define static member 'foo' and have instance member 'A.foo' with the same name.
 }
-''',
-      [error(diag.conflictingStaticAndInstance, 57, 3)],
-    );
+''');
   }
 
   test_inConstraint_instanceMethod_staticSetter() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   void foo() {}
 }
 mixin M on A {
   static set foo(_) {}
+//           ^^^
+// [diag.conflictingStaticAndInstance] Class 'M' can't define static member 'foo' and have instance member 'A.foo' with the same name.
 }
-''',
-      [error(diag.conflictingStaticAndInstance, 56, 3)],
-    );
+''');
   }
 
   test_inConstraint_instanceSetter_staticGetter() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   set foo(_) {}
 }
 mixin M on A {
   static int get foo => 0;
+//               ^^^
+// [diag.conflictingStaticAndInstance] Class 'M' can't define static member 'foo' and have instance member 'A.foo' with the same name.
 }
-''',
-      [error(diag.conflictingStaticAndInstance, 60, 3)],
-    );
+''');
   }
 
   test_inConstraint_instanceSetter_staticMethod() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   set foo(_) {}
 }
 mixin M on A {
   static void foo() {}
+//            ^^^
+// [diag.conflictingStaticAndInstance] Class 'M' can't define static member 'foo' and have instance member 'A.foo' with the same name.
 }
-''',
-      [error(diag.conflictingStaticAndInstance, 57, 3)],
-    );
+''');
   }
 
   test_inConstraint_instanceSetter_staticSetter() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   set foo(_) {}
 }
 mixin M on A {
   static set foo(_) {}
+//           ^^^
+// [diag.conflictingStaticAndInstance] Class 'M' can't define static member 'foo' and have instance member 'A.foo' with the same name.
 }
-''',
-      [error(diag.conflictingStaticAndInstance, 56, 3)],
-    );
+''');
   }
 
   test_inInterface_instanceGetter_staticGetter() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   int get foo => 0;
 }
 mixin M implements A {
   static int get foo => 0;
+//               ^^^
+// [diag.conflictingStaticAndInstance] Class 'M' can't define static member 'foo' and have instance member 'A.foo' with the same name.
 }
-''',
-      [error(diag.conflictingStaticAndInstance, 72, 3)],
-    );
+''');
   }
 
   test_inInterface_instanceGetter_staticMethod() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   int get foo => 0;
 }
 mixin M implements A {
   static void foo() {}
+//            ^^^
+// [diag.conflictingStaticAndInstance] Class 'M' can't define static member 'foo' and have instance member 'A.foo' with the same name.
 }
-''',
-      [error(diag.conflictingStaticAndInstance, 69, 3)],
-    );
+''');
   }
 
   test_inInterface_instanceMethod_staticGetter() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   int get foo => 0;
 }
 mixin M implements A {
   static void foo() {}
+//            ^^^
+// [diag.conflictingStaticAndInstance] Class 'M' can't define static member 'foo' and have instance member 'A.foo' with the same name.
 }
-''',
-      [error(diag.conflictingStaticAndInstance, 69, 3)],
-    );
+''');
   }
 
   test_inInterface_instanceMethod_staticMethod() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   void foo() {}
 }
 mixin M implements A {
   static void foo() {}
+//            ^^^
+// [diag.conflictingStaticAndInstance] Class 'M' can't define static member 'foo' and have instance member 'A.foo' with the same name.
 }
-''',
-      [error(diag.conflictingStaticAndInstance, 65, 3)],
-    );
+''');
   }
 
   test_inInterface_instanceMethod_staticSetter() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   void foo() {}
 }
 mixin M implements A {
   static set foo(_) {}
+//           ^^^
+// [diag.conflictingStaticAndInstance] Class 'M' can't define static member 'foo' and have instance member 'A.foo' with the same name.
 }
-''',
-      [error(diag.conflictingStaticAndInstance, 64, 3)],
-    );
+''');
   }
 
   test_inInterface_instanceSetter_staticGetter() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   set foo(_) {}
 }
 mixin M implements A {
   static int get foo => 0;
+//               ^^^
+// [diag.conflictingStaticAndInstance] Class 'M' can't define static member 'foo' and have instance member 'A.foo' with the same name.
 }
-''',
-      [error(diag.conflictingStaticAndInstance, 68, 3)],
-    );
+''');
   }
 
   test_inInterface_instanceSetter_staticMethod() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   set foo(_) {}
 }
 mixin M implements A {
   static void foo() {}
+//            ^^^
+// [diag.conflictingStaticAndInstance] Class 'M' can't define static member 'foo' and have instance member 'A.foo' with the same name.
 }
-''',
-      [error(diag.conflictingStaticAndInstance, 65, 3)],
-    );
+''');
   }
 
   test_inInterface_instanceSetter_staticSetter() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   set foo(_) {}
 }
 mixin M implements A {
   static set foo(_) {}
+//           ^^^
+// [diag.conflictingStaticAndInstance] Class 'M' can't define static member 'foo' and have instance member 'A.foo' with the same name.
 }
-''',
-      [error(diag.conflictingStaticAndInstance, 64, 3)],
-    );
+''');
   }
 
   test_inMixin_staticGetter_instanceGetter() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 mixin M {
   static int get foo => 0;
+//               ^^^
+// [diag.conflictingStaticAndInstance] Class 'M' can't define static member 'foo' and have instance member 'M.foo' with the same name.
   int get foo => 0;
 }
-''',
-      [error(diag.conflictingStaticAndInstance, 27, 3)],
-    );
+''');
   }
 
   test_inMixin_staticGetter_instanceMethod() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 mixin M {
   static int get foo => 0;
+//               ^^^
+// [diag.conflictingStaticAndInstance] Class 'M' can't define static member 'foo' and have instance member 'M.foo' with the same name.
   void foo() {}
 }
-''',
-      [error(diag.conflictingStaticAndInstance, 27, 3)],
-    );
+''');
   }
 
   test_inMixin_staticGetter_instanceSetter() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 mixin M {
   static int get foo => 0;
+//               ^^^
+// [diag.conflictingStaticAndInstance] Class 'M' can't define static member 'foo' and have instance member 'M.foo' with the same name.
   set foo(_) {}
 }
-''',
-      [error(diag.conflictingStaticAndInstance, 27, 3)],
-    );
+''');
   }
 
   test_inMixin_staticMethod_instanceGetter() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 mixin M {
   static void foo() {}
+//            ^^^
+// [diag.conflictingStaticAndInstance] Class 'M' can't define static member 'foo' and have instance member 'M.foo' with the same name.
   int get foo => 0;
 }
-''',
-      [error(diag.conflictingStaticAndInstance, 24, 3)],
-    );
+''');
   }
 
   test_inMixin_staticMethod_instanceMethod() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 mixin M {
   static void foo() {}
+//            ^^^
+// [diag.conflictingStaticAndInstance] Class 'M' can't define static member 'foo' and have instance member 'M.foo' with the same name.
   void foo() {}
 }
-''',
-      [error(diag.conflictingStaticAndInstance, 24, 3)],
-    );
+''');
   }
 
   test_inMixin_staticMethod_instanceSetter() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 mixin M {
   static void foo() {}
+//            ^^^
+// [diag.conflictingStaticAndInstance] Class 'M' can't define static member 'foo' and have instance member 'M.foo' with the same name.
   set foo(_) {}
 }
-''',
-      [error(diag.conflictingStaticAndInstance, 24, 3)],
-    );
+''');
   }
 
   test_inMixin_staticSetter_instanceGetter() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 mixin M {
   static set foo(_) {}
+//           ^^^
+// [diag.conflictingStaticAndInstance] Class 'M' can't define static member 'foo' and have instance member 'M.foo' with the same name.
   int get foo => 0;
 }
-''',
-      [error(diag.conflictingStaticAndInstance, 23, 3)],
-    );
+''');
   }
 
   test_inMixin_staticSetter_instanceMethod() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 mixin M {
   static set foo(_) {}
+//           ^^^
+// [diag.conflictingStaticAndInstance] Class 'M' can't define static member 'foo' and have instance member 'M.foo' with the same name.
   void foo() {}
 }
-''',
-      [error(diag.conflictingStaticAndInstance, 23, 3)],
-    );
+''');
   }
 
   test_inMixin_staticSetter_instanceSetter() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 mixin M {
   static set foo(_) {}
+//           ^^^
+// [diag.conflictingStaticAndInstance] Class 'M' can't define static member 'foo' and have instance member 'M.foo' with the same name.
   set foo(_) {}
 }
-''',
-      [error(diag.conflictingStaticAndInstance, 23, 3)],
-    );
+''');
   }
 }
diff --git a/pkg/analyzer/test/src/diagnostics/conflicting_type_variable_and_container_test.dart b/pkg/analyzer/test/src/diagnostics/conflicting_type_variable_and_container_test.dart
index f989b27..2d99cba 100644
--- a/pkg/analyzer/test/src/diagnostics/conflicting_type_variable_and_container_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/conflicting_type_variable_and_container_test.dart
@@ -2,7 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/src/diagnostic/diagnostic.dart' as diag;
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../dart/resolution/context_collection_resolution.dart';
@@ -20,38 +19,35 @@
 @reflectiveTest
 class ConflictingTypeVariableAndClassTest extends PubPackageResolutionTest {
   test_conflict_on_class() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class T<T> {}
-''',
-      [error(diag.conflictingTypeVariableAndClass, 8, 1)],
-    );
+//      ^
+// [diag.conflictingTypeVariableAndClass] 'T' can't be used to name both a type parameter and the class in which the type parameter is defined.
+''');
   }
 }
 
 @reflectiveTest
 class ConflictingTypeVariableAndEnumTest extends PubPackageResolutionTest {
   test_conflict() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 enum E<E> {
+//     ^
+// [diag.conflictingTypeVariableAndEnum] 'E' can't be used to name both a type parameter and the enum in which the type parameter is defined.
   v
 }
-''',
-      [error(diag.conflictingTypeVariableAndEnum, 7, 1)],
-    );
+''');
   }
 }
 
 @reflectiveTest
 class ConflictingTypeVariableAndExtensionTest extends PubPackageResolutionTest {
   test_conflict() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 extension T<T> on String {}
-''',
-      [error(diag.conflictingTypeVariableAndExtension, 12, 1)],
-    );
+//          ^
+// [diag.conflictingTypeVariableAndExtension] 'T' can't be used to name both a type parameter and the extension in which the type parameter is defined.
+''');
   }
 }
 
@@ -59,23 +55,21 @@
 class ConflictingTypeVariableAndExtensionTypeTest
     extends PubPackageResolutionTest {
   test_conflict() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 extension type T<T>(int it) {}
-''',
-      [error(diag.conflictingTypeVariableAndExtensionType, 17, 1)],
-    );
+//               ^
+// [diag.conflictingTypeVariableAndExtensionType] 'T' can't be used to name both a type parameter and the extension type in which the type parameter is defined.
+''');
   }
 }
 
 @reflectiveTest
 class ConflictingTypeVariableAndMixinTest extends PubPackageResolutionTest {
   test_conflict_on_mixin() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 mixin T<T> {}
-''',
-      [error(diag.conflictingTypeVariableAndMixin, 8, 1)],
-    );
+//      ^
+// [diag.conflictingTypeVariableAndMixin] 'T' can't be used to name both a type parameter and the mixin in which the type parameter is defined.
+''');
   }
 }
diff --git a/pkg/analyzer/test/src/diagnostics/conflicting_type_variable_and_member_test.dart b/pkg/analyzer/test/src/diagnostics/conflicting_type_variable_and_member_test.dart
index 30b58f6..6bf0788 100644
--- a/pkg/analyzer/test/src/diagnostics/conflicting_type_variable_and_member_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/conflicting_type_variable_and_member_test.dart
@@ -2,7 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/src/diagnostic/diagnostic.dart' as diag;
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../dart/resolution/context_collection_resolution.dart';
@@ -21,97 +20,88 @@
 class ConflictingTypeVariableAndMemberClassTest
     extends PubPackageResolutionTest {
   test_constructor() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A<T> {
+//      ^
+// [diag.conflictingTypeVariableAndMemberClass] 'T' can't be used to name both a type parameter and a member in this class.
   A.T();
 }
-''',
-      [error(diag.conflictingTypeVariableAndMemberClass, 8, 1)],
-    );
+''');
   }
 
   test_field() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A<T> {
+//      ^
+// [diag.conflictingTypeVariableAndMemberClass] 'T' can't be used to name both a type parameter and a member in this class.
   var T;
 }
-''',
-      [error(diag.conflictingTypeVariableAndMemberClass, 8, 1)],
-    );
+''');
   }
 
   test_getter() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A<T> {
+//      ^
+// [diag.conflictingTypeVariableAndMemberClass] 'T' can't be used to name both a type parameter and a member in this class.
   get T => null;
 }
-''',
-      [error(diag.conflictingTypeVariableAndMemberClass, 8, 1)],
-    );
+''');
   }
 
   test_method() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A<T> {
+//      ^
+// [diag.conflictingTypeVariableAndMemberClass] 'T' can't be used to name both a type parameter and a member in this class.
   T() {}
 }
-''',
-      [error(diag.conflictingTypeVariableAndMemberClass, 8, 1)],
-    );
+''');
   }
 
   test_method_static() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A<T> {
+//      ^
+// [diag.conflictingTypeVariableAndMemberClass] 'T' can't be used to name both a type parameter and a member in this class.
   static T() {}
 }
-''',
-      [error(diag.conflictingTypeVariableAndMemberClass, 8, 1)],
-    );
+''');
   }
 
   test_method_wildcard() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A<_> {
   _() {}
+//^
+// [diag.unusedElement] The declaration '_' isn't referenced.
 }
-''',
-      [error(diag.unusedElement, 15, 1)],
-    );
+''');
   }
 
   test_method_wildcard_preWildcards() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 // @dart = 3.4
 // (pre wildcard-variables)
 
 class A<_> {
+//      ^
+// [diag.conflictingTypeVariableAndMemberClass] '_' can't be used to name both a type parameter and a member in this class.
   _() {}
+//^
+// [diag.unusedElement] The declaration '_' isn't referenced.
 }
-''',
-      [
-        error(diag.conflictingTypeVariableAndMemberClass, 52, 1),
-        error(diag.unusedElement, 59, 1),
-      ],
-    );
+''');
   }
 
   test_setter() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A<T> {
+//      ^
+// [diag.conflictingTypeVariableAndMemberClass] 'T' can't be used to name both a type parameter and a member in this class.
   set T(x) {}
 }
-''',
-      [error(diag.conflictingTypeVariableAndMemberClass, 8, 1)],
-    );
+''');
   }
 }
 
@@ -119,39 +109,36 @@
 class ConflictingTypeVariableAndMemberEnumTest
     extends PubPackageResolutionTest {
   test_getter() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 enum A<T> {
+//     ^
+// [diag.conflictingTypeVariableAndMemberEnum] 'T' can't be used to name both a type parameter and a member in this enum.
   v;
   get T => null;
 }
-''',
-      [error(diag.conflictingTypeVariableAndMemberEnum, 7, 1)],
-    );
+''');
   }
 
   test_method() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 enum A<T> {
+//     ^
+// [diag.conflictingTypeVariableAndMemberEnum] 'T' can't be used to name both a type parameter and a member in this enum.
   v;
   void T() {}
 }
-''',
-      [error(diag.conflictingTypeVariableAndMemberEnum, 7, 1)],
-    );
+''');
   }
 
   test_setter() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 enum A<T> {
+//     ^
+// [diag.conflictingTypeVariableAndMemberEnum] 'T' can't be used to name both a type parameter and a member in this enum.
   v;
   set T(x) {}
 }
-''',
-      [error(diag.conflictingTypeVariableAndMemberEnum, 7, 1)],
-    );
+''');
   }
 }
 
@@ -159,36 +146,33 @@
 class ConflictingTypeVariableAndMemberExtensionTest
     extends PubPackageResolutionTest {
   test_getter() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 extension A<T> on String {
+//          ^
+// [diag.conflictingTypeVariableAndMemberExtension] 'T' can't be used to name both a type parameter and a member in this extension.
   get T => null;
 }
-''',
-      [error(diag.conflictingTypeVariableAndMemberExtension, 12, 1)],
-    );
+''');
   }
 
   test_method() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 extension A<T> on String {
+//          ^
+// [diag.conflictingTypeVariableAndMemberExtension] 'T' can't be used to name both a type parameter and a member in this extension.
   T() {}
 }
-''',
-      [error(diag.conflictingTypeVariableAndMemberExtension, 12, 1)],
-    );
+''');
   }
 
   test_setter() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 extension A<T> on String {
+//          ^
+// [diag.conflictingTypeVariableAndMemberExtension] 'T' can't be used to name both a type parameter and a member in this extension.
   set T(x) {}
 }
-''',
-      [error(diag.conflictingTypeVariableAndMemberExtension, 12, 1)],
-    );
+''');
   }
 }
 
@@ -196,56 +180,51 @@
 class ConflictingTypeVariableAndMemberExtensionTypeTest
     extends PubPackageResolutionTest {
   test_constructor_explicit() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 extension type A<T>(int it) {
+//               ^
+// [diag.conflictingTypeVariableAndMemberExtensionType] 'T' can't be used to name both a type parameter and a member in this extension type.
   A.T(int it) : this(it);
 }
-''',
-      [error(diag.conflictingTypeVariableAndMemberExtensionType, 17, 1)],
-    );
+''');
   }
 
   test_constructor_primary() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 extension type A<T>.T(int it) {}
-''',
-      [error(diag.conflictingTypeVariableAndMemberExtensionType, 17, 1)],
-    );
+//               ^
+// [diag.conflictingTypeVariableAndMemberExtensionType] 'T' can't be used to name both a type parameter and a member in this extension type.
+''');
   }
 
   test_getter() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 extension type A<T>(int it) {
+//               ^
+// [diag.conflictingTypeVariableAndMemberExtensionType] 'T' can't be used to name both a type parameter and a member in this extension type.
   get T => null;
 }
-''',
-      [error(diag.conflictingTypeVariableAndMemberExtensionType, 17, 1)],
-    );
+''');
   }
 
   test_method() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 extension type A<T>(int it) {
+//               ^
+// [diag.conflictingTypeVariableAndMemberExtensionType] 'T' can't be used to name both a type parameter and a member in this extension type.
   T() {}
 }
-''',
-      [error(diag.conflictingTypeVariableAndMemberExtensionType, 17, 1)],
-    );
+''');
   }
 
   test_setter() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 extension type A<T>(int it) {
+//               ^
+// [diag.conflictingTypeVariableAndMemberExtensionType] 'T' can't be used to name both a type parameter and a member in this extension type.
   set T(x) {}
 }
-''',
-      [error(diag.conflictingTypeVariableAndMemberExtensionType, 17, 1)],
-    );
+''');
   }
 }
 
@@ -253,57 +232,52 @@
 class ConflictingTypeVariableAndMemberMixinTest
     extends PubPackageResolutionTest {
   test_field() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 mixin M<T> {
+//      ^
+// [diag.conflictingTypeVariableAndMemberMixin] 'T' can't be used to name both a type parameter and a member in this mixin.
   var T;
 }
-''',
-      [error(diag.conflictingTypeVariableAndMemberMixin, 8, 1)],
-    );
+''');
   }
 
   test_getter() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 mixin M<T> {
+//      ^
+// [diag.conflictingTypeVariableAndMemberMixin] 'T' can't be used to name both a type parameter and a member in this mixin.
   get T => null;
 }
-''',
-      [error(diag.conflictingTypeVariableAndMemberMixin, 8, 1)],
-    );
+''');
   }
 
   test_method() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 mixin M<T> {
+//      ^
+// [diag.conflictingTypeVariableAndMemberMixin] 'T' can't be used to name both a type parameter and a member in this mixin.
   T() {}
 }
-''',
-      [error(diag.conflictingTypeVariableAndMemberMixin, 8, 1)],
-    );
+''');
   }
 
   test_method_static() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 mixin M<T> {
+//      ^
+// [diag.conflictingTypeVariableAndMemberMixin] 'T' can't be used to name both a type parameter and a member in this mixin.
   static T() {}
 }
-''',
-      [error(diag.conflictingTypeVariableAndMemberMixin, 8, 1)],
-    );
+''');
   }
 
   test_setter() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 mixin M<T> {
+//      ^
+// [diag.conflictingTypeVariableAndMemberMixin] 'T' can't be used to name both a type parameter and a member in this mixin.
   set T(x) {}
 }
-''',
-      [error(diag.conflictingTypeVariableAndMemberMixin, 8, 1)],
-    );
+''');
   }
 }
diff --git a/pkg/analyzer/test/src/diagnostics/const_constructor_field_type_mismatch_test.dart b/pkg/analyzer/test/src/diagnostics/const_constructor_field_type_mismatch_test.dart
index 2ead520..e664871 100644
--- a/pkg/analyzer/test/src/diagnostics/const_constructor_field_type_mismatch_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/const_constructor_field_type_mismatch_test.dart
@@ -2,7 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/src/diagnostic/diagnostic.dart' as diag;
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../dart/resolution/context_collection_resolution.dart';
@@ -16,42 +15,39 @@
 @reflectiveTest
 class ConstConstructorFieldTypeMismatchTest extends PubPackageResolutionTest {
   test_generic_int_int() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class C<T> {
   final T x = y;
+//            ^
+// [diag.invalidAssignment] A value of type 'int' can't be assigned to a variable of type 'T'.
   const C();
 }
 const int y = 1;
 var v = const C<int>();
-''',
-      [error(diag.invalidAssignment, 27, 1)],
-    );
+''');
   }
 
   test_notGeneric_unresolved_int() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   const A(x) : y = x;
   final Unresolved y;
+//      ^^^^^^^^^^
+// [diag.undefinedClass] Undefined class 'Unresolved'.
 }
 var v = const A(0);
-''',
-      [error(diag.undefinedClass, 40, 10)],
-    );
+''');
   }
 
   test_notGeneric_unresolved_null() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   const A(x) : y = x;
   final Unresolved y;
+//      ^^^^^^^^^^
+// [diag.undefinedClass] Undefined class 'Unresolved'.
 }
 var v = const A(null);
-''',
-      [error(diag.undefinedClass, 40, 10)],
-    );
+''');
   }
 }
diff --git a/pkg/analyzer/test/src/diagnostics/const_constructor_param_type_mismatch_test.dart b/pkg/analyzer/test/src/diagnostics/const_constructor_param_type_mismatch_test.dart
index 136515f..1f8cad2 100644
--- a/pkg/analyzer/test/src/diagnostics/const_constructor_param_type_mismatch_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/const_constructor_param_type_mismatch_test.dart
@@ -2,7 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/src/diagnostic/diagnostic.dart' as diag;
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
@@ -19,7 +18,7 @@
   test_assignable_fieldFormal_omittedType() async {
     // If a field is declared without a type, and no initializer, it's type is
     // dynamic.
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   final x;
   const A(this.x);
@@ -29,7 +28,7 @@
   }
 
   test_assignable_fieldFormal_subtype() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   const A();
 }
@@ -46,8 +45,7 @@
 
   test_assignable_fieldFormal_typedef() async {
     // foo has the type dynamic -> dynamic, so it is not assignable to A.f.
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 typedef String Int2String(int x);
 class A {
   final Int2String f;
@@ -55,16 +53,14 @@
 }
 foo(x) => 1;
 var v = const A(foo);
-''',
-      [
-        error(diag.argumentTypeNotAssignable, 116, 3),
-        error(diag.constConstructorParamTypeMismatch, 116, 3),
-      ],
-    );
+//              ^^^
+// [diag.argumentTypeNotAssignable] The argument type 'dynamic Function(dynamic)' can't be assigned to the parameter type 'Int2String'. 
+// [diag.constConstructorParamTypeMismatch] A value of type 'dynamic Function(dynamic)' can't be assigned to a parameter of type 'String Function(int)' in a const constructor.
+''');
   }
 
   test_assignable_fieldFormal_typeSubstitution() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A<T> {
   final T x;
   const A(this.x);
@@ -74,37 +70,36 @@
   }
 
   test_assignable_typeSubstitution() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A<T> {
   const A(T x);
 }
-var v = const A<int>(3);''');
+var v = const A<int>(3);
+''');
   }
 
   test_assignable_undefined() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   const A(Unresolved x);
+//        ^^^^^^^^^^
+// [diag.undefinedClass] Undefined class 'Unresolved'.
 }
 var v = const A('foo');
-''',
-      [error(diag.undefinedClass, 20, 10)],
-    );
+''');
   }
 
   test_assignable_undefined_null() async {
     // Null always passes runtime type checks, even when the type is
     // unresolved.
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   const A(Unresolved x);
+//        ^^^^^^^^^^
+// [diag.undefinedClass] Undefined class 'Unresolved'.
 }
 var v = const A(null);
-''',
-      [error(diag.undefinedClass, 20, 10)],
-    );
+''');
   }
 
   test_int_to_double_reference_from_other_library_other_file_after() async {
@@ -116,7 +111,7 @@
 }
 const D constant2 = const D(constant);
 ''');
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 class C {
   final double d;
   const C(this.d);
@@ -189,24 +184,21 @@
   }
 
   test_notAssignable_fieldFormal_optional() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   final int x;
   const A([this.x = 'foo']);
+//                  ^^^^^
+// [diag.invalidAssignment] A value of type 'String' can't be assigned to a variable of type 'int'.
 }
 var v = const A();
-''',
-      [
-        error(diag.invalidAssignment, 45, 5),
-        error(diag.constConstructorParamTypeMismatch, 64, 9),
-      ],
-    );
+//      ^^^^^^^^^
+// [diag.constConstructorParamTypeMismatch] A value of type 'String' can't be assigned to a parameter of type 'int' in a const constructor.
+''');
   }
 
   test_notAssignable_fieldFormal_supertype() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   const A();
 }
@@ -219,19 +211,16 @@
 }
 const A u = const A();
 var v = const C(u);
-''',
-      [
-        error(diag.argumentTypeNotAssignable, 143, 1),
-        error(diag.constConstructorParamTypeMismatch, 143, 1),
-      ],
-    );
+//              ^
+// [diag.argumentTypeNotAssignable] The argument type 'A' can't be assigned to the parameter type 'B'. 
+// [diag.constConstructorParamTypeMismatch] A value of type 'A' can't be assigned to a parameter of type 'B' in a const constructor.
+''');
   }
 
   test_notAssignable_fieldFormal_typedef() async {
     // foo has type String -> int, so it is not assignable to A.f
     // (A.f requires it to be int -> String).
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 typedef String Int2String(int x);
 class A {
   final Int2String f;
@@ -239,71 +228,59 @@
 }
 int foo(String x) => 1;
 var v = const A(foo);
-''',
-      [
-        error(diag.argumentTypeNotAssignable, 127, 3),
-        error(diag.constConstructorParamTypeMismatch, 127, 3),
-      ],
-    );
+//              ^^^
+// [diag.argumentTypeNotAssignable] The argument type 'int Function(String)' can't be assigned to the parameter type 'Int2String'. 
+// [diag.constConstructorParamTypeMismatch] A value of type 'int Function(String)' can't be assigned to a parameter of type 'String Function(int)' in a const constructor.
+''');
   }
 
   test_notAssignable_fieldFormal_unrelated() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   final int x;
   const A(this.x);
 }
 var v = const A('foo');
-''',
-      [
-        error(diag.argumentTypeNotAssignable, 62, 5),
-        error(diag.constConstructorParamTypeMismatch, 62, 5),
-      ],
-    );
+//              ^^^^^
+// [diag.argumentTypeNotAssignable] The argument type 'String' can't be assigned to the parameter type 'int'. 
+// [diag.constConstructorParamTypeMismatch] A value of type 'String' can't be assigned to a parameter of type 'int' in a const constructor.
+''');
   }
 
   test_notAssignable_fieldFormal_unresolved() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   final Unresolved x;
+//      ^^^^^^^^^^
+// [diag.undefinedClass] Undefined class 'Unresolved'.
   const A(String this.x);
 }
 var v = const A('foo');
-''',
-      [error(diag.undefinedClass, 18, 10)],
-    );
+''');
   }
 
   test_notAssignable_typeSubstitution() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A<T> {
   const A(T x);
 }
 var v = const A<int>('foo');
-''',
-      [
-        error(diag.argumentTypeNotAssignable, 52, 5),
-        error(diag.constConstructorParamTypeMismatch, 52, 5),
-      ],
-    );
+//                   ^^^^^
+// [diag.argumentTypeNotAssignable] The argument type 'String' can't be assigned to the parameter type 'int'. 
+// [diag.constConstructorParamTypeMismatch] A value of type 'String' can't be assigned to a parameter of type 'int' in a const constructor.
+''');
   }
 
   test_notAssignable_unrelated() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   const A(int x);
 }
 var v = const A('foo');
-''',
-      [
-        error(diag.argumentTypeNotAssignable, 46, 5),
-        error(diag.constConstructorParamTypeMismatch, 46, 5),
-      ],
-    );
+//              ^^^^^
+// [diag.argumentTypeNotAssignable] The argument type 'String' can't be assigned to the parameter type 'int'. 
+// [diag.constConstructorParamTypeMismatch] A value of type 'String' can't be assigned to a parameter of type 'int' in a const constructor.
+''');
   }
 
   test_superFormalParameter_explicit() async {
diff --git a/pkg/analyzer/test/src/diagnostics/const_constructor_with_field_initialized_by_non_const_test.dart b/pkg/analyzer/test/src/diagnostics/const_constructor_with_field_initialized_by_non_const_test.dart
index a04007e..681d0e7 100644
--- a/pkg/analyzer/test/src/diagnostics/const_constructor_with_field_initialized_by_non_const_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/const_constructor_with_field_initialized_by_non_const_test.dart
@@ -2,7 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/src/diagnostic/diagnostic.dart' as diag;
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../dart/resolution/context_collection_resolution.dart';
@@ -17,7 +16,7 @@
 class ConstConstructorWithFieldInitializedByNonConstTest
     extends PubPackageResolutionTest {
   test_class_factoryConstructor() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   final List<int> list = f();
   const factory A() = B;
@@ -33,38 +32,35 @@
   }
 
   test_class_instanceField() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   final int i = f();
+//              ^^^
+// [diag.constEvalMethodInvocation] Methods can't be invoked in constant expressions.
   const A();
+//^^^^^
+// [diag.constConstructorWithFieldInitializedByNonConst] Can't define the 'const' constructor because the field 'i' is initialized with a non-constant value.
 }
 int f() {
   return 3;
 }
-''',
-      [
-        error(diag.constEvalMethodInvocation, 26, 3),
-        error(diag.constConstructorWithFieldInitializedByNonConst, 33, 5),
-      ],
-    );
+''');
   }
 
   test_class_instanceField_asExpression() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 dynamic y = 2;
 class A {
   const A();
+//^^^^^
+// [diag.constConstructorWithFieldInitializedByNonConst] Can't define the 'const' constructor because the field 'x' is initialized with a non-constant value.
   final x = y as num;
 }
-''',
-      [error(diag.constConstructorWithFieldInitializedByNonConst, 27, 5)],
-    );
+''');
   }
 
   test_class_staticField() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   static final int i = f();
   const A();
@@ -94,24 +90,22 @@
   //   }
 
   test_enum_instanceField() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 enum E {
   v;
   final int i = f();
+//              ^^^
+// [diag.constEvalMethodInvocation] Methods can't be invoked in constant expressions.
   const E();
+//^^^^^
+// [diag.constConstructorWithFieldInitializedByNonConst] Can't define the 'const' constructor because the field 'i' is initialized with a non-constant value.
 }
 int f() => 0;
-''',
-      [
-        error(diag.constEvalMethodInvocation, 30, 3),
-        error(diag.constConstructorWithFieldInitializedByNonConst, 37, 5),
-      ],
-    );
+''');
   }
 
   test_enum_staticField() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 enum E {
   v;
   static final int i = f();
@@ -122,7 +116,7 @@
   }
 
   test_mixinClass_factory() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 int e = 3;
 mixin class MixinClassFactory {
   final int foo = e;
diff --git a/pkg/analyzer/test/src/diagnostics/const_constructor_with_mixin_with_field_test.dart b/pkg/analyzer/test/src/diagnostics/const_constructor_with_mixin_with_field_test.dart
index d537421..56b723d 100644
--- a/pkg/analyzer/test/src/diagnostics/const_constructor_with_mixin_with_field_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/const_constructor_with_mixin_with_field_test.dart
@@ -2,7 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/src/diagnostic/diagnostic.dart' as diag;
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../dart/resolution/context_collection_resolution.dart';
@@ -16,8 +15,7 @@
 @reflectiveTest
 class ConstConstructorWithMixinWithFieldTest extends PubPackageResolutionTest {
   test_constructor_newHead_instance_abstract() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 mixin A {
   abstract int a;
 }
@@ -26,14 +24,14 @@
   @override
   int a;
   const new(this.a);
+//      ^^^
+// [diag.constConstructorWithMixinWithField] This constructor can't be declared 'const' because a mixin adds the instance field: 'A.a'.
 }
-''',
-      [error(diag.constConstructorWithMixinWithField, 77, 3)],
-    );
+''');
   }
 
   test_constructor_newHead_instance_abstract_final() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 mixin A {
   abstract final int a;
 }
@@ -47,22 +45,21 @@
   }
 
   test_constructor_newHead_instance_final() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 mixin A {
   final a = 0;
 }
 
 class B extends Object with A {
   const new();
+//      ^^^
+// [diag.constConstructorWithMixinWithField] This constructor can't be declared 'const' because a mixin adds the instance field: 'A.a'.
 }
-''',
-      [error(diag.constConstructorWithMixinWithField, 68, 3)],
-    );
+''');
   }
 
   test_constructor_newHead_instance_getter() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 mixin A {
   int get a => 7;
 }
@@ -74,7 +71,7 @@
   }
 
   test_constructor_newHead_instance_setter() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 mixin A {
   set a(int x) {}
 }
@@ -86,23 +83,21 @@
   }
 
   test_constructor_newHead_instanceField() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 mixin A {
   var a;
 }
 
 class B extends Object with A {
   const new();
+//      ^^^
+// [diag.constConstructorWithMixinWithField] This constructor can't be declared 'const' because a mixin adds the instance field: 'A.a'.
 }
-''',
-      [error(diag.constConstructorWithMixinWithField, 62, 3)],
-    );
+''');
   }
 
   test_constructor_newHead_multipleInstanceFields() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 mixin A {
   var a;
   var b;
@@ -110,14 +105,14 @@
 
 class B extends Object with A {
   const new();
+//      ^^^
+// [diag.constConstructorWithMixinWithFields] This constructor can't be declared 'const' because the mixins add the instance fields: 'A.a', 'A.b'.
 }
-''',
-      [error(diag.constConstructorWithMixinWithFields, 71, 3)],
-    );
+''');
   }
 
   test_constructor_newHead_noFields() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 mixin M {}
 
 class X extends Object with M {
@@ -127,7 +122,7 @@
   }
 
   test_constructor_newHead_static() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 mixin M {
   static final a = 0;
 }
@@ -139,8 +134,7 @@
   }
 
   test_constructor_typeName_instance_abstract() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 mixin A {
   abstract int a;
 }
@@ -149,14 +143,14 @@
   @override
   int a;
   const B(this.a);
+//      ^
+// [diag.constConstructorWithMixinWithField] This constructor can't be declared 'const' because a mixin adds the instance field: 'A.a'.
 }
-''',
-      [error(diag.constConstructorWithMixinWithField, 77, 1)],
-    );
+''');
   }
 
   test_constructor_typeName_instance_abstract_final() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 mixin A {
   abstract final int a;
 }
@@ -170,22 +164,21 @@
   }
 
   test_constructor_typeName_instance_final() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 mixin A {
   final a = 0;
 }
 
 class B extends Object with A {
   const B();
+//      ^
+// [diag.constConstructorWithMixinWithField] This constructor can't be declared 'const' because a mixin adds the instance field: 'A.a'.
 }
-''',
-      [error(diag.constConstructorWithMixinWithField, 68, 1)],
-    );
+''');
   }
 
   test_constructor_typeName_instance_getter() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 mixin A {
   int get a => 7;
 }
@@ -197,7 +190,7 @@
   }
 
   test_constructor_typeName_instance_setter() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 mixin A {
   set a(int x) {}
 }
@@ -209,23 +202,21 @@
   }
 
   test_constructor_typeName_instanceField() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 mixin A {
   var a;
 }
 
 class B extends Object with A {
   const B();
+//      ^
+// [diag.constConstructorWithMixinWithField] This constructor can't be declared 'const' because a mixin adds the instance field: 'A.a'.
 }
-''',
-      [error(diag.constConstructorWithMixinWithField, 62, 1)],
-    );
+''');
   }
 
   test_constructor_typeName_multipleInstanceFields() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 mixin A {
   var a;
   var b;
@@ -233,14 +224,14 @@
 
 class B extends Object with A {
   const B();
+//      ^
+// [diag.constConstructorWithMixinWithFields] This constructor can't be declared 'const' because the mixins add the instance fields: 'A.a', 'A.b'.
 }
-''',
-      [error(diag.constConstructorWithMixinWithFields, 71, 1)],
-    );
+''');
   }
 
   test_constructor_typeName_noFields() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 mixin M {}
 
 class X extends Object with M {
@@ -250,7 +241,7 @@
   }
 
   test_constructor_typeName_static() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 mixin M {
   static final a = 0;
 }
@@ -262,24 +253,23 @@
   }
 
   test_primaryConstructor_instance_abstract() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 mixin A {
   abstract int a;
 }
 
 class const B(this.a) with A {
+//    ^^^^^
+// [diag.constConstructorWithMixinWithField] This constructor can't be declared 'const' because a mixin adds the instance field: 'A.a'.
   @override
   final int a;
   set a(int x) {}
 }
-''',
-      [error(diag.constConstructorWithMixinWithField, 37, 5)],
-    );
+''');
   }
 
   test_primaryConstructor_instance_abstract_final() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 mixin A {
   abstract final int a;
 }
@@ -292,20 +282,19 @@
   }
 
   test_primaryConstructor_instance_final() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 mixin A {
   final a = 0;
 }
 
 class const B() extends Object with A {}
-''',
-      [error(diag.constConstructorWithMixinWithField, 34, 5)],
-    );
+//    ^^^^^
+// [diag.constConstructorWithMixinWithField] This constructor can't be declared 'const' because a mixin adds the instance field: 'A.a'.
+''');
   }
 
   test_primaryConstructor_instance_getter() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 mixin A {
   int get a => 7;
 }
@@ -315,7 +304,7 @@
   }
 
   test_primaryConstructor_instance_setter() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 mixin A {
   set a(int x) {}
 }
@@ -325,34 +314,32 @@
   }
 
   test_primaryConstructor_instanceField() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 mixin A {
   var a;
 }
 
 class const B() extends Object with A {}
-''',
-      [error(diag.constConstructorWithMixinWithField, 28, 5)],
-    );
+//    ^^^^^
+// [diag.constConstructorWithMixinWithField] This constructor can't be declared 'const' because a mixin adds the instance field: 'A.a'.
+''');
   }
 
   test_primaryConstructor_multipleInstanceFields() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 mixin A {
   var a;
   var b;
 }
 
 class const B() extends Object with A {}
-''',
-      [error(diag.constConstructorWithMixinWithFields, 37, 5)],
-    );
+//    ^^^^^
+// [diag.constConstructorWithMixinWithFields] This constructor can't be declared 'const' because the mixins add the instance fields: 'A.a', 'A.b'.
+''');
   }
 
   test_primaryConstructor_noFields() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 mixin M {}
 
 class const X() extends Object with M {}
@@ -360,7 +347,7 @@
   }
 
   test_primaryConstructor_static() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 mixin M {
   static final a = 0;
 }
diff --git a/pkg/analyzer/test/src/diagnostics/const_constructor_with_non_const_super_test.dart b/pkg/analyzer/test/src/diagnostics/const_constructor_with_non_const_super_test.dart
index 6e30585..e5d7673 100644
--- a/pkg/analyzer/test/src/diagnostics/const_constructor_with_non_const_super_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/const_constructor_with_non_const_super_test.dart
@@ -2,7 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/src/diagnostic/diagnostic.dart' as diag;
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../dart/resolution/context_collection_resolution.dart';
@@ -16,89 +15,82 @@
 @reflectiveTest
 class ConstConstructorWithNonConstSuperTest extends PubPackageResolutionTest {
   test_class_explicit_constructor_newHead() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {}
 class B extends A {
   const new(): super();
+//             ^^^^^^^
+// [diag.constConstructorWithNonConstSuper] A constant constructor can't call a non-constant super constructor of 'B'.
 }
-''',
-      [error(diag.constConstructorWithNonConstSuper, 46, 7)],
-    );
+''');
   }
 
   test_class_explicit_constructor_typeName() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {}
 class B extends A {
   const B(): super();
+//           ^^^^^^^
+// [diag.constConstructorWithNonConstSuper] A constant constructor can't call a non-constant super constructor of 'B'.
 }
-''',
-      [error(diag.constConstructorWithNonConstSuper, 44, 7)],
-    );
+''');
   }
 
   test_class_explicit_primaryConstructor_hasBody() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {}
 class const B() extends A {
   this : super();
+//       ^^^^^^^
+// [diag.constConstructorWithNonConstSuper] A constant constructor can't call a non-constant super constructor of 'B'.
 }
-''',
-      [error(diag.constConstructorWithNonConstSuper, 48, 7)],
-    );
+''');
   }
 
   test_class_implicit_constructor_newHead() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {}
 class B extends A {
   const new();
+//      ^^^
+// [diag.constConstructorWithNonConstSuper] A constant constructor can't call a non-constant super constructor of 'B'.
 }
-''',
-      [error(diag.constConstructorWithNonConstSuper, 39, 3)],
-    );
+''');
   }
 
   test_class_implicit_constructor_typeName() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {}
 class B extends A {
   const B();
+//      ^
+// [diag.constConstructorWithNonConstSuper] A constant constructor can't call a non-constant super constructor of 'B'.
 }
-''',
-      [error(diag.constConstructorWithNonConstSuper, 39, 1)],
-    );
+''');
   }
 
   test_class_implicit_primaryConstructor_hasBody() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {}
 class const B() extends A {
+//    ^^^^^
+// [diag.constConstructorWithNonConstSuper] A constant constructor can't call a non-constant super constructor of 'B'.
   this;
 }
-''',
-      [error(diag.constConstructorWithNonConstSuper, 17, 5)],
-    );
+''');
   }
 
   test_class_implicit_primaryConstructor_noBody() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {}
 class const B() extends A;
-''',
-      [error(diag.constConstructorWithNonConstSuper, 17, 5)],
-    );
+//    ^^^^^
+// [diag.constConstructorWithNonConstSuper] A constant constructor can't call a non-constant super constructor of 'B'.
+''');
   }
 
   test_class_redirectConst_superConst() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   factory A() = A._;
   const A._();
@@ -112,8 +104,7 @@
   }
 
   test_class_redirectConst_superNotConst() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   factory A() = A._;
   A._();
@@ -122,14 +113,14 @@
 class B extends A {
   const B.foo() : this.bar();
   const B.bar() : super._();
+//                ^^^^^^^^^
+// [diag.constConstructorWithNonConstSuper] A constant constructor can't call a non-constant super constructor of 'B'.
 }
-''',
-      [error(diag.constConstructorWithNonConstSuper, 111, 9)],
-    );
+''');
   }
 
   test_enum() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 enum E {
   v
 }
@@ -137,7 +128,7 @@
   }
 
   test_enum_hasConstructor() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 enum E {
   v(0);
   const E(int a);
diff --git a/pkg/analyzer/test/src/diagnostics/const_constructor_with_non_final_field_test.dart b/pkg/analyzer/test/src/diagnostics/const_constructor_with_non_final_field_test.dart
index f3e6b0325..5364061 100644
--- a/pkg/analyzer/test/src/diagnostics/const_constructor_with_non_final_field_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/const_constructor_with_non_final_field_test.dart
@@ -2,7 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/src/diagnostic/diagnostic.dart' as diag;
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../dart/resolution/context_collection_resolution.dart';
@@ -16,7 +15,7 @@
 @reflectiveTest
 class ConstConstructorWithNonFinalFieldTest extends PubPackageResolutionTest {
   test_constFactory_named_hasNonFinal_redirect() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   int x = 0;
   const factory A.named() = B;
@@ -31,7 +30,7 @@
   }
 
   test_constFactory_unnamed_hasNonFinal_redirect() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   int x = 0;
   const factory A() = B;
@@ -46,7 +45,7 @@
   }
 
   test_constructor_newHead_unnamed_hasAbstract() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 abstract class A {
   abstract int x;
   const new();
@@ -55,7 +54,7 @@
   }
 
   test_constructor_newHead_unnamed_hasFinal() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   final int x = 0;
   const new();
@@ -64,19 +63,18 @@
   }
 
   test_constructor_newHead_unnamed_hasNonFinal() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   int x = 0;
   const new();
+//      ^^^
+// [diag.constConstructorWithNonFinalField] Can't define a const constructor for a class with non-final fields.
 }
-''',
-      [error(diag.constConstructorWithNonFinalField, 31, 3)],
-    );
+''');
   }
 
   test_constructor_typeName_named_hasAbstract() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 abstract class A {
   abstract int x;
   const A.named();
@@ -85,7 +83,7 @@
   }
 
   test_constructor_typeName_named_hasFinal() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   final int x = 0;
   const A.named();
@@ -94,19 +92,18 @@
   }
 
   test_constructor_typeName_named_hasNonFinal() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   int x = 0;
   const A.named();
+//      ^^^^^^^
+// [diag.constConstructorWithNonFinalField] Can't define a const constructor for a class with non-final fields.
 }
-''',
-      [error(diag.constConstructorWithNonFinalField, 31, 7)],
-    );
+''');
   }
 
   test_constructor_typeName_unnamed_hasAbstract() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 abstract class A {
   abstract int x;
   const A();
@@ -115,7 +112,7 @@
   }
 
   test_constructor_typeName_unnamed_hasFinal() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   final int x = 0;
   const A();
@@ -124,30 +121,28 @@
   }
 
   test_constructor_typeName_unnamed_hasNonFinal() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   int x = 0;
   const A();
+//      ^
+// [diag.constConstructorWithNonFinalField] Can't define a const constructor for a class with non-final fields.
 }
-''',
-      [error(diag.constConstructorWithNonFinalField, 31, 1)],
-    );
+''');
   }
 
   test_primaryConstructor_named_hasNonFinal() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class const A.named() {
+//    ^^^^^^^^^^^^^
+// [diag.constConstructorWithNonFinalField] Can't define a const constructor for a class with non-final fields.
   int x = 0;
 }
-''',
-      [error(diag.constConstructorWithNonFinalField, 6, 13)],
-    );
+''');
   }
 
   test_primaryConstructor_unnamed_hasAbstract() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 abstract class const A() {
   abstract int x;
 }
@@ -155,7 +150,7 @@
   }
 
   test_primaryConstructor_unnamed_hasFinal() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 class const A() {
   final int x = 0;
 }
@@ -163,13 +158,12 @@
   }
 
   test_primaryConstructor_unnamed_hasNonFinal() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class const A() {
+//    ^^^^^
+// [diag.constConstructorWithNonFinalField] Can't define a const constructor for a class with non-final fields.
   int x = 0;
 }
-''',
-      [error(diag.constConstructorWithNonFinalField, 6, 5)],
-    );
+''');
   }
 }
diff --git a/pkg/analyzer/test/src/diagnostics/const_deferred_class_test.dart b/pkg/analyzer/test/src/diagnostics/const_deferred_class_test.dart
index 44a22b6..9f607c7 100644
--- a/pkg/analyzer/test/src/diagnostics/const_deferred_class_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/const_deferred_class_test.dart
@@ -2,7 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/src/diagnostic/diagnostic.dart' as diag;
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../dart/resolution/context_collection_resolution.dart';
@@ -21,15 +20,14 @@
 class A {
   const A.b();
 }''');
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 library root;
 import 'lib1.dart' deferred as a;
 main() {
   const a.A.b();
-}''',
-      [error(diag.constDeferredClass, 65, 5)],
-    );
+//      ^^^^^
+// [diag.constDeferredClass] Deferred classes can't be created with 'const'.
+}''');
   }
 
   test_nonFunctionTypedef() async {
@@ -40,16 +38,15 @@
 }
 typedef B = A;
 ''');
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 library root;
 import 'lib1.dart' deferred as a;
 main() {
   const a.B();
+//      ^^^
+// [diag.constDeferredClass] Deferred classes can't be created with 'const'.
 }
-''',
-      [error(diag.constDeferredClass, 65, 3)],
-    );
+''');
   }
 
   test_unnamed() async {
@@ -59,15 +56,14 @@
   const A();
 }
 ''');
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 library root;
 import 'lib1.dart' deferred as a;
 main() {
   const a.A();
+//      ^^^
+// [diag.constDeferredClass] Deferred classes can't be created with 'const'.
 }
-''',
-      [error(diag.constDeferredClass, 65, 3)],
-    );
+''');
   }
 }
diff --git a/pkg/analyzer/test/src/diagnostics/const_eval_extension_method_test.dart b/pkg/analyzer/test/src/diagnostics/const_eval_extension_method_test.dart
index 41e6d98..6e9592e 100644
--- a/pkg/analyzer/test/src/diagnostics/const_eval_extension_method_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/const_eval_extension_method_test.dart
@@ -2,7 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/src/diagnostic/diagnostic.dart' as diag;
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../dart/resolution/context_collection_resolution.dart';
@@ -16,30 +15,28 @@
 @reflectiveTest
 class ConstEvalExtensionMethodTest extends PubPackageResolutionTest {
   test_binaryExpression() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 extension on Object {
   int operator +(Object other) => 0;
 }
 
 const Object v1 = 0;
 const v2 = v1 + v1;
-''',
-      [error(diag.constEvalExtensionMethod, 94, 7)],
-    );
+//         ^^^^^^^
+// [diag.constEvalExtensionMethod] Extension methods can't be used in constant expressions.
+''');
   }
 
   test_prefixExpression() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 extension on Object {
   int operator -() => 0;
 }
 
 const Object v1 = 1;
 const v2 = -v1;
-''',
-      [error(diag.constEvalExtensionMethod, 82, 3)],
-    );
+//         ^^^
+// [diag.constEvalExtensionMethod] Extension methods can't be used in constant expressions.
+''');
   }
 }
diff --git a/pkg/analyzer/test/src/diagnostics/const_eval_for_element_test.dart b/pkg/analyzer/test/src/diagnostics/const_eval_for_element_test.dart
index e2be6df..b08ba1d 100644
--- a/pkg/analyzer/test/src/diagnostics/const_eval_for_element_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/const_eval_for_element_test.dart
@@ -2,7 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/src/diagnostic/diagnostic.dart' as diag;
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../dart/resolution/context_collection_resolution.dart';
@@ -16,64 +15,54 @@
 @reflectiveTest
 class ConstEvalForElementTest extends PubPackageResolutionTest {
   test_listLiteral() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 const x = [for (int i = 0; i < 3; i++) i];
-''',
-      [
-        error(diag.constInitializedWithNonConstantValue, 10, 31),
-        error(diag.constEvalForElement, 11, 29),
-      ],
-    );
+//        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// [diag.constInitializedWithNonConstantValue] Const variables must be initialized with a constant value.
+//         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// [diag.constEvalForElement] Constant expressions don't support 'for' elements.
+''');
   }
 
   test_listLiteral_forIn() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 const Set set = {};
 const x = [for(final i in set) i];
-''',
-      [
-        error(diag.constInitializedWithNonConstantValue, 30, 23),
-        error(diag.constEvalForElement, 31, 21),
-      ],
-    );
+//        ^^^^^^^^^^^^^^^^^^^^^^^
+// [diag.constInitializedWithNonConstantValue] Const variables must be initialized with a constant value.
+//         ^^^^^^^^^^^^^^^^^^^^^
+// [diag.constEvalForElement] Constant expressions don't support 'for' elements.
+''');
   }
 
   test_mapLiteral_forIn() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 const x = {for (final i in const []) i: null};
-''',
-      [
-        error(diag.constInitializedWithNonConstantValue, 10, 35),
-        error(diag.constEvalForElement, 11, 33),
-      ],
-    );
+//        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// [diag.constInitializedWithNonConstantValue] Const variables must be initialized with a constant value.
+//         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// [diag.constEvalForElement] Constant expressions don't support 'for' elements.
+''');
   }
 
   test_mapLiteral_forIn_nested() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 const x = {if (true) for (final i in const []) i: null};
-''',
-      [
-        error(diag.constInitializedWithNonConstantValue, 10, 45),
-        error(diag.constEvalForElement, 21, 33),
-      ],
-    );
+//        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// [diag.constInitializedWithNonConstantValue] Const variables must be initialized with a constant value.
+//                   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// [diag.constEvalForElement] Constant expressions don't support 'for' elements.
+''');
   }
 
   test_setLiteral_forIn() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 const Set set = {};
 const x = {for (final i in set) i};
-''',
-      [
-        error(diag.constInitializedWithNonConstantValue, 30, 24),
-        error(diag.constEvalForElement, 31, 22),
-      ],
-    );
+//        ^^^^^^^^^^^^^^^^^^^^^^^^
+// [diag.constInitializedWithNonConstantValue] Const variables must be initialized with a constant value.
+//         ^^^^^^^^^^^^^^^^^^^^^^
+// [diag.constEvalForElement] Constant expressions don't support 'for' elements.
+''');
   }
 }
diff --git a/pkg/analyzer/test/src/diagnostics/const_eval_method_invocation_test.dart b/pkg/analyzer/test/src/diagnostics/const_eval_method_invocation_test.dart
index 4be1c2f..3eea3e4 100644
--- a/pkg/analyzer/test/src/diagnostics/const_eval_method_invocation_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/const_eval_method_invocation_test.dart
@@ -2,7 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/src/diagnostic/diagnostic.dart' as diag;
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../dart/resolution/context_collection_resolution.dart';
@@ -16,19 +15,18 @@
 @reflectiveTest
 class ConstEvalMethodInvocationTest extends PubPackageResolutionTest {
   test_function() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 int f() {
   return 3;
 }
 const a = f();
-''',
-      [error(diag.constEvalMethodInvocation, 34, 3)],
-    );
+//        ^^^
+// [diag.constEvalMethodInvocation] Methods can't be invoked in constant expressions.
+''');
   }
 
   test_identical() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 const a = identical(1, 1);
 ''');
   }
diff --git a/pkg/analyzer/test/src/diagnostics/const_eval_primitive_equality_test.dart b/pkg/analyzer/test/src/diagnostics/const_eval_primitive_equality_test.dart
index 18fffa6..887fb56 100644
--- a/pkg/analyzer/test/src/diagnostics/const_eval_primitive_equality_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/const_eval_primitive_equality_test.dart
@@ -2,7 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/src/diagnostic/diagnostic.dart' as diag;
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../dart/resolution/context_collection_resolution.dart';
@@ -16,21 +15,21 @@
 @reflectiveTest
 class ConstEvalPrimitiveEqualityTest extends PubPackageResolutionTest {
   test_equal_double_object() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 const a = 0.1;
 const b = a == Object();
 ''');
   }
 
   test_equal_int_object() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 const a = 0;
 const b = a == Object();
 ''');
   }
 
   test_equal_int_userClass() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   const A();
 }
@@ -41,43 +40,42 @@
   }
 
   test_equal_list_object() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 const a = [1, 2];
 const b = a == Object();
 ''');
   }
 
   test_equal_map_object() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 const a = {'x': 1, 'y': 2};
 const b = a == Object();
 ''');
   }
 
   test_equal_null_object() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 const a = null;
 const b = a == Object();
 ''');
   }
 
   test_equal_set_object() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 const a = {1, 2};
 const b = a == Object();
 ''');
   }
 
   test_equal_string_object() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 const a = 'foo';
 const b = a == Object();
 ''');
   }
 
   test_equal_userClass_int_hasEqEq() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   const A();
   bool operator ==(other) => false;
@@ -85,14 +83,13 @@
 
 const a = A();
 const b = a == 0;
-''',
-      [error(diag.constEvalPrimitiveEquality, 87, 6)],
-    );
+//        ^^^^^^
+// [diag.constEvalPrimitiveEquality] In constant expressions, operands of the equality operator must have primitive equality.
+''');
   }
 
   test_equal_userClass_int_hasHashCode() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   const A();
   int get hashCode => 0;
@@ -100,13 +97,13 @@
 
 const a = A();
 const b = a == 0;
-''',
-      [error(diag.constEvalPrimitiveEquality, 76, 6)],
-    );
+//        ^^^^^^
+// [diag.constEvalPrimitiveEquality] In constant expressions, operands of the equality operator must have primitive equality.
+''');
   }
 
   test_equal_userClass_int_hasPrimitiveEquality() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   const A();
 }
@@ -117,21 +114,21 @@
   }
 
   test_notEqual_double_object() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 const a = 0.1;
 const b = a != Object();
 ''');
   }
 
   test_notEqual_int_object() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 const a = 0;
 const b = a != Object();
 ''');
   }
 
   test_notEqual_int_userClass() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   const A();
 }
@@ -142,22 +139,21 @@
   }
 
   test_notEqual_null_object() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 const a = null;
 const b = a != Object();
 ''');
   }
 
   test_notEqual_string_object() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 const a = 'foo';
 const b = a != Object();
 ''');
   }
 
   test_notEqual_userClass_int_hasEqEq() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   const A();
   bool operator ==(other) => false;
@@ -165,14 +161,13 @@
 
 const a = A();
 const b = a != 0;
-''',
-      [error(diag.constEvalPrimitiveEquality, 87, 6)],
-    );
+//        ^^^^^^
+// [diag.constEvalPrimitiveEquality] In constant expressions, operands of the equality operator must have primitive equality.
+''');
   }
 
   test_notEqual_userClass_int_hasHashCode() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   const A();
   int get hashCode => 0;
@@ -180,13 +175,13 @@
 
 const a = A();
 const b = a != 0;
-''',
-      [error(diag.constEvalPrimitiveEquality, 76, 6)],
-    );
+//        ^^^^^^
+// [diag.constEvalPrimitiveEquality] In constant expressions, operands of the equality operator must have primitive equality.
+''');
   }
 
   test_notEqual_userClass_int_hasPrimitiveEquality() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   const A();
 }
diff --git a/pkg/analyzer/test/src/diagnostics/const_eval_property_access_test.dart b/pkg/analyzer/test/src/diagnostics/const_eval_property_access_test.dart
index eca75c6..d72ea17 100644
--- a/pkg/analyzer/test/src/diagnostics/const_eval_property_access_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/const_eval_property_access_test.dart
@@ -19,21 +19,18 @@
   test_constructorArgument_rhsOfLogicalOperation() async {
     // Note: prior to the fix for https://github.com/dart-lang/sdk/issues/61761,
     // this caused an exception to be thrown during constant evaluation.
-    await assertErrorsInCode(
-      r'''
+    // TODO(paulberry): this error range covers the whole subexpression
+    // `false || a.x`. Probably it's better to just cover `a.x`.
+    await resolveTestCodeWithDiagnostics(r'''
 class C {
   final bool x;
   const C(this.x);
 }
 const C a = C(true);
 const C b = C(false || a.x);
-''',
-      [
-        // TODO(paulberry): this error range covers the whole subexpression
-        // `false || a.x`. Probably it's better to just cover `a.x`.
-        error(diag.constEvalPropertyAccess, 82, 12),
-      ],
-    );
+//            ^^^^^^^^^^^^
+// [diag.constEvalPropertyAccess] The property 'x' can't be accessed on the type 'C' in a constant expression.
+''');
   }
 
   test_constructorFieldInitializer_fromSeparateLibrary() async {
@@ -69,92 +66,79 @@
   }
 
   test_length_dynamic_notNull() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 const dynamic d = 'foo';
-const int? c = d.length;''');
+const int? c = d.length;
+''');
   }
 
   test_length_dynamic_null() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 const dynamic d = null;
-const int? c = d.length;''',
-      [error(diag.constEvalPropertyAccess, 39, 8)],
-    );
+const int? c = d.length;
+//             ^^^^^^^^
+// [diag.constEvalPropertyAccess] The property 'length' can't be accessed on the type 'Null' in a constant expression.
+''');
   }
 
   test_length_invalidTarget() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 void main() {
   const RequiresNonEmptyList([1]);
+//^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// [diag.constEvalPropertyAccess][context 1] The property 'length' can't be accessed on the type 'List<int>' in a constant expression.
 }
 
 class RequiresNonEmptyList {
   const RequiresNonEmptyList(List<int> numbers) : assert(numbers.length > 0);
+//                                                       ^^^^^^^^^^^^^^
+// [context 1] The error is in the assert initializer of 'RequiresNonEmptyList', and occurs here.
 }
-''',
-      [
-        error(
-          diag.constEvalPropertyAccess,
-          16,
-          31,
-          contextMessages: [
-            contextMessage(
-              testFile,
-              138,
-              14,
-              textContains: [
-                "The error is in the assert initializer of 'RequiresNonEmptyList', and occurs here.",
-              ],
-            ),
-          ],
-        ),
-      ],
-    );
+''');
   }
 
   test_nonStaticField_inGenericClass() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 class C<T> {
   const C();
   T? get t => null;
 }
 
 const x = const C().t;
-''',
-      [error(diag.constEvalPropertyAccess, 59, 11)],
-    );
+//        ^^^^^^^^^^^
+// [diag.constEvalPropertyAccess] The property 't' can't be accessed on the type 'C<dynamic>' in a constant expression.
+''');
   }
 
   test_nullAware_isEven_null() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 const int? s = null;
-const bool? c = s?.isEven;''',
-      [error(diag.constEvalPropertyAccess, 37, 9)],
-    );
+const bool? c = s?.isEven;
+//              ^^^^^^^^^
+// [diag.constEvalPropertyAccess] The property 'isEven' can't be accessed on the type 'Null' in a constant expression.
+''');
   }
 
   test_nullAware_length_dynamic_null() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 const dynamic d = 'foo';
-const int? c = d?.length;''');
+const int? c = d?.length;
+''');
   }
 
   test_nullAware_length_list_notNull() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 const List? l = [];
-const int? c = l?.length;''',
-      [error(diag.constEvalPropertyAccess, 35, 9)],
-    );
+const int? c = l?.length;
+//             ^^^^^^^^^
+// [diag.constEvalPropertyAccess] The property 'length' can't be accessed on the type 'List<dynamic>' in a constant expression.
+''');
   }
 
   test_nullAware_length_string_notNull() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 const String? s = '';
-const int? c = s?.length;''');
+const int? c = s?.length;
+''');
   }
 }
diff --git a/pkg/analyzer/test/src/diagnostics/const_eval_throws_exception_test.dart b/pkg/analyzer/test/src/diagnostics/const_eval_throws_exception_test.dart
index 50a37d1..158464f 100644
--- a/pkg/analyzer/test/src/diagnostics/const_eval_throws_exception_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/const_eval_throws_exception_test.dart
@@ -20,386 +20,206 @@
 class ConstConstructorFieldTypeMismatchContextTest
     extends PubPackageResolutionTest {
   test_generic_string_int() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class C<T> {
   final T x = y;
+//            ^
+// [context 1] The exception is 'In a const constructor, a value of type 'int' can't be assigned to the field 'x', which has type 'String'.' and occurs here.
+// [diag.invalidAssignment] A value of type 'int' can't be assigned to a variable of type 'T'.
   const C();
 }
 const int y = 1;
 var v = const C<String>();
-''',
-      [
-        error(diag.invalidAssignment, 27, 1),
-        error(
-          diag.constEvalThrowsException,
-          70,
-          17,
-          contextMessages: [
-            contextMessage(
-              testFile,
-              27,
-              1,
-              textContains: [
-                "The exception is 'In a const constructor, a value of type 'int' can't be assigned to the field 'x', which has type 'String'.' and occurs here.",
-              ],
-            ),
-          ],
-        ),
-      ],
-    );
+//      ^^^^^^^^^^^^^^^^^
+// [diag.constEvalThrowsException][context 1] Evaluation of this constant expression throws an exception.
+''');
   }
 
   test_notGeneric_int_int() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   const A(x) : y = x;
+//                 ^
+// [context 1] The exception is 'In a const constructor, a value of type 'String' can't be assigned to the field 'y', which has type 'int'.' and occurs here.
   final int y;
 }
 var v = const A('foo');
-''',
-      [
-        error(
-          diag.constEvalThrowsException,
-          57,
-          14,
-          contextMessages: [
-            contextMessage(
-              testFile,
-              29,
-              1,
-              textContains: [
-                "The exception is 'In a const constructor, a value of type 'String' can't be assigned to the field 'y', which has type 'int'.' and occurs here.",
-              ],
-            ),
-          ],
-        ),
-      ],
-    );
+//      ^^^^^^^^^^^^^^
+// [diag.constEvalThrowsException][context 1] Evaluation of this constant expression throws an exception.
+''');
   }
 
   test_notGeneric_int_null() async {
-    var errors = [
-      error(
-        diag.constEvalThrowsException,
-        57,
-        13,
-        contextMessages: [
-          contextMessage(
-            testFile,
-            29,
-            1,
-            textContains: [
-              "The exception is 'In a const constructor, a value of type 'Null' can't be assigned to the field 'y', which has type 'int'.' and occurs here.",
-            ],
-          ),
-        ],
-      ),
-    ];
-    await assertErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   const A(x) : y = x;
+//                 ^
+// [context 1] The exception is 'In a const constructor, a value of type 'Null' can't be assigned to the field 'y', which has type 'int'.' and occurs here.
   final int y;
 }
 var v = const A(null);
-''', errors);
+//      ^^^^^^^^^^^^^
+// [diag.constEvalThrowsException][context 1] Evaluation of this constant expression throws an exception.
+''');
   }
 
   test_notGeneric_null_forNonNullable_fromNullSafe() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 class C {
   final int f;
   const C(a) : f = a;
+//                 ^
+// [context 1] The exception is 'In a const constructor, a value of type 'Null' can't be assigned to the field 'f', which has type 'int'.' and occurs here.
 }
 
 const a = const C(null);
-''',
-      [
-        error(
-          diag.constEvalThrowsException,
-          60,
-          13,
-          contextMessages: [
-            contextMessage(
-              testFile,
-              44,
-              1,
-              textContains: [
-                "The exception is 'In a const constructor, a value of type 'Null' can't be assigned to the field 'f', which has type 'int'.' and occurs here.",
-              ],
-            ),
-          ],
-        ),
-      ],
-    );
+//        ^^^^^^^^^^^^^
+// [diag.constEvalThrowsException][context 1] Evaluation of this constant expression throws an exception.
+''');
   }
 }
 
 @reflectiveTest
 class ConstEvalThrowsExceptionTest extends PubPackageResolutionTest {
   test_asExpression_typeParameter() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 class C<T> {
   final t;
   const C(dynamic x) : t = x as T;
+//                         ^^^^^^
+// [context 1] The error is in the field initializer of 'C', and occurs here.
+// [context 2] The error is in the field initializer of 'C', and occurs here.
 }
 
 main() {
   const C<int>(0);
   const C<int>('foo');
+//^^^^^^^^^^^^^^^^^^^
+// [diag.constEvalThrowsException][context 1] Evaluation of this constant expression throws an exception.
   const C<int>(null);
+//^^^^^^^^^^^^^^^^^^
+// [diag.constEvalThrowsException][context 2] Evaluation of this constant expression throws an exception.
 }
-''',
-      [
-        error(
-          diag.constEvalThrowsException,
-          92,
-          19,
-          contextMessages: [
-            contextMessage(
-              testFile,
-              51,
-              6,
-              textContains: [
-                "The error is in the field initializer of 'C', and occurs here.",
-              ],
-            ),
-          ],
-        ),
-        error(
-          diag.constEvalThrowsException,
-          115,
-          18,
-          contextMessages: [
-            contextMessage(
-              testFile,
-              51,
-              6,
-              textContains: [
-                "The error is in the field initializer of 'C', and occurs here.",
-              ],
-            ),
-          ],
-        ),
-      ],
-    );
+''');
   }
 
   test_asExpression_typeParameter_nested() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 class C<T> {
   final t;
   const C(dynamic x) : t = x as List<T>;
+//                         ^^^^^^^^^^^^
+// [context 1] The error is in the field initializer of 'C', and occurs here.
+// [context 2] The error is in the field initializer of 'C', and occurs here.
 }
 
 main() {
   const C<int>(<int>[]);
   const C<int>(<num>[]);
+//^^^^^^^^^^^^^^^^^^^^^
+// [diag.constEvalThrowsException][context 1] Evaluation of this constant expression throws an exception.
   const C<int>(null);
+//^^^^^^^^^^^^^^^^^^
+// [diag.constEvalThrowsException][context 2] Evaluation of this constant expression throws an exception.
 }
-''',
-      [
-        error(
-          diag.constEvalThrowsException,
-          104,
-          21,
-          contextMessages: [
-            contextMessage(
-              testFile,
-              51,
-              12,
-              textContains: [
-                "The error is in the field initializer of 'C', and occurs here.",
-              ],
-            ),
-          ],
-        ),
-        error(
-          diag.constEvalThrowsException,
-          129,
-          18,
-          contextMessages: [
-            contextMessage(
-              testFile,
-              51,
-              12,
-              textContains: [
-                "The error is in the field initializer of 'C', and occurs here.",
-              ],
-            ),
-          ],
-        ),
-      ],
-    );
+''');
   }
 
   test_assertInitializer() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   const A(int x, int y) : assert(x < y);
+//                        ^^^^^^^^^^^^^
+// [context 1] The exception is 'The assertion in this constant expression failed.' and occurs here.
 }
 var v = const A(3, 2);
-''',
-      [
-        error(
-          diag.constEvalThrowsException,
-          61,
-          13,
-          contextMessages: [
-            contextMessage(
-              testFile,
-              36,
-              13,
-              textContains: [
-                "The exception is 'The assertion in this constant expression failed.' and occurs here.",
-              ],
-            ),
-          ],
-        ),
-      ],
-    );
+//      ^^^^^^^^^^^^^
+// [diag.constEvalThrowsException][context 1] Evaluation of this constant expression throws an exception.
+''');
   }
 
   test_assertInitializer_indirect() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   const A(int i)
   : assert(i == 1); // (2)
+//  ^^^^^^^^^^^^^^
+// [context 2] The exception is 'The assertion in this constant expression failed.' and occurs here.
 }
 class B extends A {
   const B(int i) : super(i);
+//      ^
+// [context 1] The evaluated constructor 'A' is called by 'B' and 'B' is defined here.
 }
 main() {
   print(const B(2)); // (1)
+//      ^^^^^^^^^^
+// [diag.constEvalThrowsException][context 1][context 2] Evaluation of this constant expression throws an exception.
 }
-''',
-      [
-        error(
-          diag.constEvalThrowsException,
-          124,
-          10,
-          contextMessages: [
-            contextMessage(
-              testFile,
-              84,
-              1,
-              textContains: [
-                "The evaluated constructor 'A' is called by 'B' and 'B' is defined here.",
-              ],
-            ),
-            contextMessage(
-              testFile,
-              31,
-              14,
-              textContains: [
-                "The exception is 'The assertion in this constant expression failed.' and occurs here.",
-              ],
-            ),
-          ],
-        ),
-      ],
-    );
+''');
   }
 
   test_assertInitializer_withMessage() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   const A(int x): assert(x > 0, '$x must be greater than 0');
+//                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// [context 1] The exception is 'An assertion failed with message '0 must be greater than 0'.' and occurs here.
 }
 const a = const A(0);
-''',
-      [
-        error(
-          diag.constEvalThrowsException,
-          84,
-          10,
-          contextMessages: [
-            contextMessage(
-              testFile,
-              28,
-              42,
-              textContains: [
-                "The exception is 'An assertion failed with message '0 must be greater than 0'.' and occurs here.",
-              ],
-            ),
-          ],
-        ),
-      ],
-    );
+//        ^^^^^^^^^^
+// [diag.constEvalThrowsException][context 1] Evaluation of this constant expression throws an exception.
+''');
   }
 
   test_assertInitializer_withMessage_cannotCompute() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   const A(int x): assert(x > 0, '${throw ''}');
+//                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// [context 1] The exception is 'The assertion in this constant expression failed.' and occurs here.
+//                                 ^^^^^^^^
+// [diag.invalidConstant] Invalid constant value.
+// [diag.constConstructorThrowsException] Const constructors can't throw exceptions.
+//                                          ^^^
+// [diag.deadCode] Dead code.
 }
 const a = const A(0);
-''',
-      [
-        error(diag.invalidConstant, 45, 8),
-        error(diag.constConstructorThrowsException, 45, 8),
-        error(diag.deadCode, 54, 3),
-        error(
-          diag.constEvalThrowsException,
-          70,
-          10,
-          contextMessages: [
-            contextMessage(
-              testFile,
-              28,
-              28,
-              textContains: [
-                "The exception is 'The assertion in this constant expression failed.' and occurs here.",
-              ],
-            ),
-          ],
-        ),
-      ],
-    );
+//        ^^^^^^^^^^
+// [diag.constEvalThrowsException][context 1] Evaluation of this constant expression throws an exception.
+''');
   }
 
   test_binaryMinus_null() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 const dynamic D = null;
 const C = D - 5;
-''',
-      [error(diag.constEvalThrowsException, 34, 5)],
-    );
+//        ^^^^^
+// [diag.constEvalThrowsException] Evaluation of this constant expression throws an exception.
+''');
 
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 const dynamic D = null;
 const C = 5 - D;
-''',
-      [error(diag.constEvalThrowsException, 34, 5)],
-    );
+//        ^^^^^
+// [diag.constEvalThrowsException] Evaluation of this constant expression throws an exception.
+''');
   }
 
   test_binaryPlus_null() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 const dynamic D = null;
 const C = D + 5;
-''',
-      [error(diag.constEvalThrowsException, 34, 5)],
-    );
+//        ^^^^^
+// [diag.constEvalThrowsException] Evaluation of this constant expression throws an exception.
+''');
 
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 const dynamic D = null;
 const C = 5 + D;
-''',
-      [error(diag.constEvalThrowsException, 34, 5)],
-    );
+//        ^^^^^
+// [diag.constEvalThrowsException] Evaluation of this constant expression throws an exception.
+''');
   }
 
   test_CastError_intToDouble_constructor_importAnalyzedAfter() async {
@@ -418,7 +238,7 @@
 
   const Bar.some() : this(const Foo(1));
 }''');
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'other.dart';
 
 void main() {
@@ -447,7 +267,7 @@
 
   const Bar.some() : this(const Foo(1));
 }''');
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'other.dart';
 
 void main() {
@@ -468,16 +288,15 @@
     : assert(m != null);
 }
 ''');
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'other.dart';
 
 main() {
   var c = const C();
+//    ^
+// [diag.unusedLocalVariable] The value of the local variable 'c' isn't used.
 }
-''',
-      [error(diag.unusedLocalVariable, 37, 1)],
-    );
+''');
     var otherFileResult = await resolveFile(other);
     assertErrorsInList(otherFileResult.diagnostics, [
       error(diag.unnecessaryNullComparisonNeverNullTrue, 97, 7),
@@ -485,96 +304,51 @@
   }
 
   test_enum_constructor_initializer_asExpression() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 enum E {
   v();
+//^^^
+// [diag.constEvalThrowsException][context 1] Evaluation of this constant expression throws an exception.
   final int x;
   const E({int? x}) : x = x as int;
+//                        ^^^^^^^^
+// [context 1] The error is in the field initializer of 'E', and occurs here.
 }
-''',
-      [
-        error(
-          diag.constEvalThrowsException,
-          11,
-          3,
-          contextMessages: [
-            contextMessage(
-              testFile,
-              57,
-              8,
-              textContains: [
-                "The error is in the field initializer of 'E', and occurs here.",
-              ],
-            ),
-          ],
-        ),
-      ],
-    );
+''');
   }
 
   test_enum_int_null() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 const dynamic a = null;
 
 enum E {
   v(a);
+//^^^^
+// [diag.constEvalThrowsException][context 1] Evaluation of this constant expression throws an exception.
+//  ^
+// [context 1] The exception is 'A value of type 'Null' can't be assigned to a parameter of type 'int' in a const constructor.' and occurs here.
   const E(int a);
 }
-''',
-      [
-        error(
-          diag.constEvalThrowsException,
-          36,
-          4,
-          contextMessages: [
-            contextMessage(
-              testFile,
-              38,
-              1,
-              textContains: [
-                "The exception is 'A value of type 'Null' can't be assigned to a parameter of type 'int' in a const constructor.' and occurs here.",
-              ],
-            ),
-          ],
-        ),
-      ],
-    );
+''');
   }
 
   test_enum_int_String() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 const dynamic a = '0';
 
 enum E {
   v(a);
+//^^^^
+// [diag.constEvalThrowsException][context 1] Evaluation of this constant expression throws an exception.
+//  ^
+// [context 1] The exception is 'A value of type 'String' can't be assigned to a parameter of type 'int' in a const constructor.' and occurs here.
   const E(int a);
 }
-''',
-      [
-        error(
-          diag.constEvalThrowsException,
-          35,
-          4,
-          contextMessages: [
-            contextMessage(
-              testFile,
-              37,
-              1,
-              textContains: [
-                "The exception is 'A value of type 'String' can't be assigned to a parameter of type 'int' in a const constructor.' and occurs here.",
-              ],
-            ),
-          ],
-        ),
-      ],
-    );
+''');
   }
 
   test_eqEq_nonPrimitiveRightOperand() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 const c = const T.eq(1, const Object());
 class T {
   final Object value;
@@ -584,7 +358,7 @@
   }
 
   test_fromEnvironment_assertInitializer() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   const A(int x) : assert(x >= 0);
 }
@@ -597,37 +371,35 @@
   }
 
   test_fromEnvironment_bool_badArgs() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 var b1 = const bool.fromEnvironment(1);
+//       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// [diag.constEvalThrowsException] Evaluation of this constant expression throws an exception.
+//                                  ^
+// [diag.argumentTypeNotAssignable] The argument type 'int' can't be assigned to the parameter type 'String'. 
 var b2 = const bool.fromEnvironment('x', defaultValue: 1);
-''',
-      [
-        error(diag.constEvalThrowsException, 9, 29),
-        error(diag.argumentTypeNotAssignable, 36, 1),
-        error(diag.constEvalThrowsException, 49, 48),
-        error(diag.argumentTypeNotAssignable, 95, 1),
-      ],
-    );
+//       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// [diag.constEvalThrowsException] Evaluation of this constant expression throws an exception.
+//                                                     ^
+// [diag.argumentTypeNotAssignable] The argument type 'int' can't be assigned to the parameter type 'bool'. 
+''');
   }
 
   test_fromEnvironment_bool_badDefault_whenDefined() async {
     // The type of the defaultValue needs to be correct even when the default
     // value isn't used (because the variable is defined in the environment).
     declaredVariables = {'x': 'true'};
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 var b = const bool.fromEnvironment('x', defaultValue: 1);
-''',
-      [
-        error(diag.constEvalThrowsException, 8, 48),
-        error(diag.argumentTypeNotAssignable, 54, 1),
-      ],
-    );
+//      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// [diag.constEvalThrowsException] Evaluation of this constant expression throws an exception.
+//                                                    ^
+// [diag.argumentTypeNotAssignable] The argument type 'int' can't be assigned to the parameter type 'bool'. 
+''');
   }
 
   test_fromEnvironment_ifElement() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 const b = bool.fromEnvironment('foo');
 
 main() {
@@ -639,139 +411,98 @@
   }
 
   test_ifElement_false_thenNotEvaluated() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 const dynamic nil = null;
 const c = [if (1 < 0) nil + 1];
 ''');
   }
 
   test_ifElement_true_elseNotEvaluated() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 const dynamic nil = null;
 const c = [if (0 < 1) 3 else nil + 1];
 ''');
   }
 
   test_redirectingConstructor_paramTypeMismatch() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   const A.a1(x) : this.a2(x);
+//                        ^
+// [context 1] The exception is 'A value of type 'int' can't be assigned to a parameter of type 'String' in a const constructor.' and occurs here.
   const A.a2(String x);
 }
 var v = const A.a1(0);
-''',
-      [
-        error(
-          diag.constEvalThrowsException,
-          74,
-          13,
-          contextMessages: [
-            contextMessage(
-              testFile,
-              36,
-              1,
-              textContains: [
-                "The exception is 'A value of type 'int' can't be assigned to a parameter of type 'String' in a const constructor.' and occurs here.",
-              ],
-            ),
-          ],
-        ),
-      ],
-    );
+//      ^^^^^^^^^^^^^
+// [diag.constEvalThrowsException][context 1] Evaluation of this constant expression throws an exception.
+''');
   }
 
   test_superConstructor_paramTypeMismatch() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class C {
   final double d;
   const C(this.d);
 }
 class D extends C {
   const D(d) : super(d);
+//      ^
+// [context 1] The evaluated constructor 'C' is called by 'D' and 'D' is defined here.
+//                   ^
+// [context 2] The exception is 'A value of type 'String' can't be assigned to a parameter of type 'double' in a const constructor.' and occurs here.
 }
 const f = const D('0.0');
-''',
-      [
-        error(
-          diag.constEvalThrowsException,
-          106,
-          14,
-          contextMessages: [
-            contextMessage(
-              testFile,
-              77,
-              1,
-              textContains: [
-                "The evaluated constructor 'C' is called by 'D' and 'D' is defined here.",
-              ],
-            ),
-            contextMessage(
-              testFile,
-              90,
-              1,
-              textContains: [
-                "The exception is 'A value of type 'String' can't be assigned to a parameter of type 'double' in a const constructor.' and occurs here.",
-              ],
-            ),
-          ],
-        ),
-      ],
-    );
+//        ^^^^^^^^^^^^^^
+// [diag.constEvalThrowsException][context 1][context 2] Evaluation of this constant expression throws an exception.
+''');
   }
 
   test_symbolConstructor_nonStringArgument() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 var s2 = const Symbol(3);
-''',
-      [
-        error(diag.constEvalThrowsException, 9, 15),
-        error(diag.argumentTypeNotAssignable, 22, 1),
-      ],
-    );
+//       ^^^^^^^^^^^^^^^
+// [diag.constEvalThrowsException] Evaluation of this constant expression throws an exception.
+//                    ^
+// [diag.argumentTypeNotAssignable] The argument type 'int' can't be assigned to the parameter type 'String'. 
+''');
   }
 
   test_symbolConstructor_string_digit() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 var s = const Symbol('3');
 ''');
   }
 
   test_symbolConstructor_string_underscore() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 var s = const Symbol('_');
 ''');
   }
 
   test_unaryBitNot_null() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 const dynamic D = null;
 const C = ~D;
-''',
-      [error(diag.constEvalThrowsException, 34, 2)],
-    );
+//        ^^
+// [diag.constEvalThrowsException] Evaluation of this constant expression throws an exception.
+''');
   }
 
   test_unaryNegated_null() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 const dynamic D = null;
 const C = -D;
-''',
-      [error(diag.constEvalThrowsException, 34, 2)],
-    );
+//        ^^
+// [diag.constEvalThrowsException] Evaluation of this constant expression throws an exception.
+''');
   }
 
   test_unaryNot_null() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 const dynamic D = null;
 const C = !D;
-''',
-      [error(diag.constEvalThrowsException, 34, 2)],
-    );
+//        ^^
+// [diag.constEvalThrowsException] Evaluation of this constant expression throws an exception.
+''');
   }
 }
diff --git a/pkg/analyzer/test/src/diagnostics/const_eval_throws_idbze_test.dart b/pkg/analyzer/test/src/diagnostics/const_eval_throws_idbze_test.dart
index d796c2e..cb3ad7e 100644
--- a/pkg/analyzer/test/src/diagnostics/const_eval_throws_idbze_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/const_eval_throws_idbze_test.dart
@@ -2,7 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/src/diagnostic/diagnostic.dart' as diag;
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../dart/resolution/context_collection_resolution.dart';
@@ -16,11 +15,10 @@
 @reflectiveTest
 class ConstEvalThrowsIdbzeTest extends PubPackageResolutionTest {
   test_divisionByZero() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 const C = 1 ~/ 0;
-''',
-      [error(diag.constEvalThrowsIdbze, 10, 6)],
-    );
+//        ^^^^^^
+// [diag.constEvalThrowsIdbze] Evaluation of this constant expression throws an IntegerDivisionByZeroException.
+''');
   }
 }
diff --git a/pkg/analyzer/test/src/diagnostics/const_eval_type_bool_int_test.dart b/pkg/analyzer/test/src/diagnostics/const_eval_type_bool_int_test.dart
index 3b0421f..3ebb40c 100644
--- a/pkg/analyzer/test/src/diagnostics/const_eval_type_bool_int_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/const_eval_type_bool_int_test.dart
@@ -2,7 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/src/diagnostic/diagnostic.dart' as diag;
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../dart/resolution/context_collection_resolution.dart';
@@ -15,24 +14,58 @@
 
 @reflectiveTest
 class ConstEvalTypeBoolIntTest extends PubPackageResolutionTest {
-  test_binary() async {
-    await _check_constEvalTypeBoolOrInt_binary("a ^ ''");
-    await _check_constEvalTypeBoolOrInt_binary("a & ''");
-    await _check_constEvalTypeBoolOrInt_binary("a | ''");
-    await _check_constEvalTypeBoolOrInt_binary("a >> ''");
-    await _check_constEvalTypeBoolOrInt_binary("a << ''");
+  test_binary_bitAnd() async {
+    await resolveTestCodeWithDiagnostics(r'''
+const int a = 0;
+const b = a & '';
+//        ^^^^^^
+// [diag.constEvalTypeBoolInt] In constant expressions, operands of this operator must be of type 'bool' or 'int'.
+//            ^^
+// [diag.argumentTypeNotAssignable] The argument type 'String' can't be assigned to the parameter type 'int'. 
+''');
   }
 
-  Future<void> _check_constEvalTypeBoolOrInt_binary(String expr) async {
-    await assertErrorsInCode(
-      '''
+  test_binary_bitOr() async {
+    await resolveTestCodeWithDiagnostics(r'''
 const int a = 0;
-const b = $expr;
-''',
-      [
-        error(diag.constEvalTypeBoolInt, 27, 6),
-        error(diag.argumentTypeNotAssignable, 31, 2),
-      ],
-    );
+const b = a | '';
+//        ^^^^^^
+// [diag.constEvalTypeBoolInt] In constant expressions, operands of this operator must be of type 'bool' or 'int'.
+//            ^^
+// [diag.argumentTypeNotAssignable] The argument type 'String' can't be assigned to the parameter type 'int'. 
+''');
+  }
+
+  test_binary_bitXor() async {
+    await resolveTestCodeWithDiagnostics(r'''
+const int a = 0;
+const b = a ^ '';
+//        ^^^^^^
+// [diag.constEvalTypeBoolInt] In constant expressions, operands of this operator must be of type 'bool' or 'int'.
+//            ^^
+// [diag.argumentTypeNotAssignable] The argument type 'String' can't be assigned to the parameter type 'int'. 
+''');
+  }
+
+  test_binary_shiftLeft() async {
+    await resolveTestCodeWithDiagnostics(r'''
+const int a = 0;
+const b = a << '';
+//        ^^^^^^^
+// [diag.constEvalTypeInt] In constant expressions, operands of this operator must be of type 'int'.
+//             ^^
+// [diag.argumentTypeNotAssignable] The argument type 'String' can't be assigned to the parameter type 'int'. 
+''');
+  }
+
+  test_binary_shiftRight() async {
+    await resolveTestCodeWithDiagnostics(r'''
+const int a = 0;
+const b = a >> '';
+//        ^^^^^^^
+// [diag.constEvalTypeInt] In constant expressions, operands of this operator must be of type 'int'.
+//             ^^
+// [diag.argumentTypeNotAssignable] The argument type 'String' can't be assigned to the parameter type 'int'. 
+''');
   }
 }
diff --git a/pkg/analyzer/test/src/diagnostics/const_eval_type_bool_num_string_test.dart b/pkg/analyzer/test/src/diagnostics/const_eval_type_bool_num_string_test.dart
index ace834b..f885745 100644
--- a/pkg/analyzer/test/src/diagnostics/const_eval_type_bool_num_string_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/const_eval_type_bool_num_string_test.dart
@@ -2,7 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/src/diagnostic/diagnostic.dart' as diag;
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../dart/resolution/context_collection_resolution.dart';
@@ -16,7 +15,7 @@
 @reflectiveTest
 class ConstEvalTypeBoolNumStringTest extends PubPackageResolutionTest {
   test_equal_double_object_language219() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 // @dart = 2.19
 const a = 0.1;
 const b = a == Object();
@@ -24,8 +23,7 @@
   }
 
   test_equal_userClass_int_language219() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 // @dart = 2.19
 class A {
   const A();
@@ -33,13 +31,13 @@
 
 const a = A();
 const b = a == 0;
-''',
-      [error(diag.constEvalTypeBoolNumString, 67, 6)],
-    );
+//        ^^^^^^
+// [diag.constEvalTypeBoolNumString] In constant expressions, operands of this operator must be of type 'bool', 'num', 'String' or 'null'.
+''');
   }
 
   test_notEqual_double_object_language219() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 // @dart = 2.19
 const a = 0.1;
 const b = a != Object();
@@ -47,8 +45,7 @@
   }
 
   test_notEqual_userClass_int_language219() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 // @dart = 2.19
 class A {
   const A();
@@ -56,17 +53,16 @@
 
 const a = A();
 const b = a != 0;
-''',
-      [error(diag.constEvalTypeBoolNumString, 67, 6)],
-    );
+//        ^^^^^^
+// [diag.constEvalTypeBoolNumString] In constant expressions, operands of this operator must be of type 'bool', 'num', 'String' or 'null'.
+''');
   }
 
   test_stringInterpolation_list() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 const x = '${const [2]}';
-''',
-      [error(diag.constEvalTypeBoolNumString, 11, 12)],
-    );
+//         ^^^^^^^^^^^^
+// [diag.constEvalTypeBoolNumString] In constant expressions, operands of this operator must be of type 'bool', 'num', 'String' or 'null'.
+''');
   }
 }
diff --git a/pkg/analyzer/test/src/diagnostics/const_eval_type_bool_test.dart b/pkg/analyzer/test/src/diagnostics/const_eval_type_bool_test.dart
index f2c403a..08b5c95 100644
--- a/pkg/analyzer/test/src/diagnostics/const_eval_type_bool_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/const_eval_type_bool_test.dart
@@ -2,7 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/src/diagnostic/diagnostic.dart' as diag;
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../dart/resolution/context_collection_resolution.dart';
@@ -16,54 +15,48 @@
 @reflectiveTest
 class ConstEvalTypeBoolTest extends PubPackageResolutionTest {
   test_binary_and() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 const c = true && '';
-''',
-      [
-        error(diag.constEvalTypeBool, 10, 10),
-        error(diag.nonBoolOperand, 18, 2),
-      ],
-    );
+//        ^^^^^^^^^^
+// [diag.constEvalTypeBool] In constant expressions, operands of this operator must be of type 'bool'.
+//                ^^
+// [diag.nonBoolOperand] The operands of the operator '&&' must be assignable to 'bool'.
+''');
   }
 
   test_binary_leftTrue() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 const c = (true || 0);
-''',
-      [error(diag.deadCode, 16, 4), error(diag.nonBoolOperand, 19, 1)],
-    );
+//              ^^^^
+// [diag.deadCode] Dead code.
+//                 ^
+// [diag.nonBoolOperand] The operands of the operator '||' must be assignable to 'bool'.
+''');
   }
 
   test_binary_or() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 const c = false || '';
-''',
-      [
-        error(diag.constEvalTypeBool, 10, 11),
-        error(diag.nonBoolOperand, 19, 2),
-      ],
-    );
+//        ^^^^^^^^^^^
+// [diag.constEvalTypeBool] In constant expressions, operands of this operator must be of type 'bool'.
+//                 ^^
+// [diag.nonBoolOperand] The operands of the operator '||' must be assignable to 'bool'.
+''');
   }
 
   test_lengthOfErroneousConstant() async {
     // Attempting to compute the length of constant that couldn't be evaluated
     // (due to an error) should not crash the analyzer (see dartbug.com/23383)
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 const int i = (1 ? 'alpha' : 'beta').length;
-''',
-      [
-        error(diag.nonBoolCondition, 15, 1),
-        error(diag.constEvalTypeBool, 15, 1),
-      ],
-    );
+//             ^
+// [diag.nonBoolCondition] Conditions must have a static type of 'bool'.
+// [diag.constEvalTypeBool] In constant expressions, operands of this operator must be of type 'bool'.
+''');
   }
 
   test_logicalOr_trueLeftOperand() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class C {
   final int? x;
   const C({this.x}) : assert(x == null || x >= 0);
diff --git a/pkg/analyzer/test/src/diagnostics/const_eval_type_num_test.dart b/pkg/analyzer/test/src/diagnostics/const_eval_type_num_test.dart
index 59b2518..6cfcff8 100644
--- a/pkg/analyzer/test/src/diagnostics/const_eval_type_num_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/const_eval_type_num_test.dart
@@ -2,7 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/src/diagnostic/diagnostic.dart' as diag;
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../dart/resolution/context_collection_resolution.dart';
@@ -15,29 +14,113 @@
 
 @reflectiveTest
 class ConstEvalTypeNumTest extends PubPackageResolutionTest {
-  test_binary() async {
-    await _check_constEvalTypeNum_binary("a + ''");
-    await _check_constEvalTypeNum_binary("a - ''");
-    await _check_constEvalTypeNum_binary("a * ''");
-    await _check_constEvalTypeNum_binary("a / ''");
-    await _check_constEvalTypeNum_binary("a ~/ ''");
-    await _check_constEvalTypeNum_binary("a > ''");
-    await _check_constEvalTypeNum_binary("a < ''");
-    await _check_constEvalTypeNum_binary("a >= ''");
-    await _check_constEvalTypeNum_binary("a <= ''");
-    await _check_constEvalTypeNum_binary("a % ''");
+  test_binary_add() async {
+    await resolveTestCodeWithDiagnostics(r'''
+const num a = 0;
+const b = a + '';
+//        ^^^^^^
+// [diag.constEvalTypeNum] In constant expressions, operands of this operator must be of type 'num'.
+//            ^^
+// [diag.argumentTypeNotAssignable] The argument type 'String' can't be assigned to the parameter type 'num'. 
+''');
   }
 
-  Future<void> _check_constEvalTypeNum_binary(String expr) async {
-    await assertErrorsInCode(
-      '''
+  test_binary_divide() async {
+    await resolveTestCodeWithDiagnostics(r'''
 const num a = 0;
-const b = $expr;
-''',
-      [
-        error(diag.constEvalTypeNum, 27, 6),
-        error(diag.argumentTypeNotAssignable, 31, 2),
-      ],
-    );
+const b = a / '';
+//        ^^^^^^
+// [diag.constEvalTypeNum] In constant expressions, operands of this operator must be of type 'num'.
+//            ^^
+// [diag.argumentTypeNotAssignable] The argument type 'String' can't be assigned to the parameter type 'num'. 
+''');
+  }
+
+  test_binary_greaterOrEqual() async {
+    await resolveTestCodeWithDiagnostics(r'''
+const num a = 0;
+const b = a >= '';
+//        ^^^^^^^
+// [diag.constEvalTypeNum] In constant expressions, operands of this operator must be of type 'num'.
+//             ^^
+// [diag.argumentTypeNotAssignable] The argument type 'String' can't be assigned to the parameter type 'num'. 
+''');
+  }
+
+  test_binary_greaterThan() async {
+    await resolveTestCodeWithDiagnostics(r'''
+const num a = 0;
+const b = a > '';
+//        ^^^^^^
+// [diag.constEvalTypeNum] In constant expressions, operands of this operator must be of type 'num'.
+//            ^^
+// [diag.argumentTypeNotAssignable] The argument type 'String' can't be assigned to the parameter type 'num'. 
+''');
+  }
+
+  test_binary_lessOrEqual() async {
+    await resolveTestCodeWithDiagnostics(r'''
+const num a = 0;
+const b = a <= '';
+//        ^^^^^^^
+// [diag.constEvalTypeNum] In constant expressions, operands of this operator must be of type 'num'.
+//             ^^
+// [diag.argumentTypeNotAssignable] The argument type 'String' can't be assigned to the parameter type 'num'. 
+''');
+  }
+
+  test_binary_lessThan() async {
+    await resolveTestCodeWithDiagnostics(r'''
+const num a = 0;
+const b = a < '';
+//        ^^^^^^
+// [diag.constEvalTypeNum] In constant expressions, operands of this operator must be of type 'num'.
+//            ^^
+// [diag.argumentTypeNotAssignable] The argument type 'String' can't be assigned to the parameter type 'num'. 
+''');
+  }
+
+  test_binary_modulo() async {
+    await resolveTestCodeWithDiagnostics(r'''
+const num a = 0;
+const b = a % '';
+//        ^^^^^^
+// [diag.constEvalTypeNum] In constant expressions, operands of this operator must be of type 'num'.
+//            ^^
+// [diag.argumentTypeNotAssignable] The argument type 'String' can't be assigned to the parameter type 'num'. 
+''');
+  }
+
+  test_binary_multiply() async {
+    await resolveTestCodeWithDiagnostics(r'''
+const num a = 0;
+const b = a * '';
+//        ^^^^^^
+// [diag.constEvalTypeNum] In constant expressions, operands of this operator must be of type 'num'.
+//            ^^
+// [diag.argumentTypeNotAssignable] The argument type 'String' can't be assigned to the parameter type 'num'. 
+''');
+  }
+
+  test_binary_subtract() async {
+    await resolveTestCodeWithDiagnostics(r'''
+const num a = 0;
+const b = a - '';
+//        ^^^^^^
+// [diag.constEvalTypeNum] In constant expressions, operands of this operator must be of type 'num'.
+//            ^^
+// [diag.argumentTypeNotAssignable] The argument type 'String' can't be assigned to the parameter type 'num'. 
+''');
+  }
+
+  test_binary_truncatingDivide() async {
+    await resolveTestCodeWithDiagnostics(r'''
+const num a = 0;
+const b = a ~/ '';
+//        ^^^^^^^
+// [diag.constEvalTypeNum] In constant expressions, operands of this operator must be of type 'num'.
+//             ^^
+// [diag.argumentTypeNotAssignable] The argument type 'String' can't be assigned to the parameter type 'num'. 
+''');
   }
 }
diff --git a/pkg/analyzer/test/src/diagnostics/const_eval_type_string_test.dart b/pkg/analyzer/test/src/diagnostics/const_eval_type_string_test.dart
index 7690ae9..15b8237 100644
--- a/pkg/analyzer/test/src/diagnostics/const_eval_type_string_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/const_eval_type_string_test.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/src/diagnostic/diagnostic.dart' as diag;
-import 'package:analyzer_testing/analysis_rule/analysis_rule.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../dart/resolution/context_collection_resolution.dart';
@@ -17,34 +15,20 @@
 @reflectiveTest
 class ConstEvalTypeStringTest extends PubPackageResolutionTest {
   test_length_unresolvedType() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 class B {
   final l;
   const B(String o) : l = o.length;
+//                        ^^^^^^^^
+// [context 1] The error is in the field initializer of 'B', and occurs here.
 }
 
 const y = B(x);
-''',
-      [
-        error(
-          diag.constEvalTypeString,
-          70,
-          4,
-          contextMessages: [
-            contextMessage(
-              testFile,
-              47,
-              8,
-              textContains: [
-                "The error is in the field initializer of 'B', and occurs here.",
-              ],
-            ),
-          ],
-        ),
-        error(diag.undefinedIdentifier, 72, 1),
-        error(diag.constWithNonConstantArgument, 72, 1),
-      ],
-    );
+//        ^^^^
+// [diag.constEvalTypeString][context 1] In constant expressions, operands of this operator must be of type 'String'.
+//          ^
+// [diag.undefinedIdentifier] Undefined name 'x'.
+// [diag.constWithNonConstantArgument] Arguments of a constant creation must be constant expressions.
+''');
   }
 }
diff --git a/pkg/analyzer/test/src/diagnostics/const_field_initializer_not_assignable_test.dart b/pkg/analyzer/test/src/diagnostics/const_field_initializer_not_assignable_test.dart
index 66fa153..d4a741b 100644
--- a/pkg/analyzer/test/src/diagnostics/const_field_initializer_not_assignable_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/const_field_initializer_not_assignable_test.dart
@@ -2,7 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/src/diagnostic/diagnostic.dart' as diag;
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../dart/resolution/context_collection_resolution.dart';
@@ -16,7 +15,7 @@
 @reflectiveTest
 class ConstFieldInitializerNotAssignableTest extends PubPackageResolutionTest {
   test_assignable_subtype() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   final num x;
   const A() : x = 1;
@@ -25,30 +24,27 @@
   }
 
   test_enum_unrelated() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 enum E {
   v;
+//^
+// [diag.constConstructorFieldTypeMismatch] In a const constructor, a value of type 'String' can't be assigned to the field 'x', which has type 'int'.
   final int x;
   const E() : x = '';
+//                ^^
+// [diag.constFieldInitializerNotAssignable] The initializer type 'String' can't be assigned to the field type 'int' in a const constructor.
 }
-''',
-      [
-        error(diag.constConstructorFieldTypeMismatch, 11, 1),
-        error(diag.constFieldInitializerNotAssignable, 47, 2),
-      ],
-    );
+''');
   }
 
   test_notAssignable_unrelated() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   final int x;
   const A() : x = '';
+//                ^^
+// [diag.constFieldInitializerNotAssignable] The initializer type 'String' can't be assigned to the field type 'int' in a const constructor.
 }
-''',
-      [error(diag.constFieldInitializerNotAssignable, 43, 2)],
-    );
+''');
   }
 }
diff --git a/pkg/analyzer/test/src/diagnostics/const_initialized_with_non_constant_value_from_deferred_library_test.dart b/pkg/analyzer/test/src/diagnostics/const_initialized_with_non_constant_value_from_deferred_library_test.dart
index 3a0d9f4..6554307 100644
--- a/pkg/analyzer/test/src/diagnostics/const_initialized_with_non_constant_value_from_deferred_library_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/const_initialized_with_non_constant_value_from_deferred_library_test.dart
@@ -2,7 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/src/diagnostic/diagnostic.dart' as diag;
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../dart/resolution/context_collection_resolution.dart';
@@ -23,20 +22,13 @@
 library lib1;
 const V = 1;
 ''');
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 library root;
 import 'lib1.dart' deferred as a;
 const B = a.V;
-''',
-      [
-        error(
-          diag.constInitializedWithNonConstantValueFromDeferredLibrary,
-          60,
-          1,
-        ),
-      ],
-    );
+//          ^
+// [diag.constInitializedWithNonConstantValueFromDeferredLibrary] Constant values from a deferred library can't be used to initialize a 'const' variable.
+''');
   }
 
   test_nested() async {
@@ -44,39 +36,26 @@
 library lib1;
 const V = 1;
 ''');
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 library root;
 import 'lib1.dart' deferred as a;
 const B = a.V + 1;
-''',
-      [
-        error(
-          diag.constInitializedWithNonConstantValueFromDeferredLibrary,
-          60,
-          1,
-        ),
-      ],
-    );
+//          ^
+// [diag.constInitializedWithNonConstantValueFromDeferredLibrary] Constant values from a deferred library can't be used to initialize a 'const' variable.
+''');
   }
 
   test_staticMethod_ofExtension() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 import '' deferred as self;
+//     ^^
+// [diag.deferredImportOfExtension] Deferred library imports must hide all extension declarations.
 extension E on int {
   static int f(String s) => 7;
 }
 const g = self.E.f;
-''',
-      [
-        error(diag.deferredImportOfExtension, 7, 2),
-        error(
-          diag.constInitializedWithNonConstantValueFromDeferredLibrary,
-          97,
-          1,
-        ),
-      ],
-    );
+//             ^
+// [diag.constInitializedWithNonConstantValueFromDeferredLibrary] Constant values from a deferred library can't be used to initialize a 'const' variable.
+''');
   }
 }
diff --git a/pkg/analyzer/test/src/diagnostics/const_initialized_with_non_constant_value_test.dart b/pkg/analyzer/test/src/diagnostics/const_initialized_with_non_constant_value_test.dart
index 486ded8..eaad674 100644
--- a/pkg/analyzer/test/src/diagnostics/const_initialized_with_non_constant_value_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/const_initialized_with_non_constant_value_test.dart
@@ -2,7 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/src/diagnostic/diagnostic.dart' as diag;
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../dart/resolution/context_collection_resolution.dart';
@@ -17,66 +16,59 @@
 class ConstInitializedWithNonConstantValueTest
     extends PubPackageResolutionTest {
   test_dynamic() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 f(p) {
   const c = p;
+//      ^
+// [diag.unusedLocalVariable] The value of the local variable 'c' isn't used.
+//          ^
+// [diag.constInitializedWithNonConstantValue] Const variables must be initialized with a constant value.
 }
-''',
-      [
-        error(diag.unusedLocalVariable, 15, 1),
-        error(diag.constInitializedWithNonConstantValue, 19, 1),
-      ],
-    );
+''');
   }
 
   test_finalField() async {
     // Regression test for bug #25526; previously, two errors were reported.
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class Foo {
   final field = 0;
   foo([int x = field]) {}
+//             ^^^^^
+// [diag.nonConstantDefaultValue] The default value of an optional parameter must be constant.
+// [diag.implicitThisReferenceInInitializer] The instance member 'field' can't be accessed in an initializer.
 }
-''',
-      [
-        error(diag.nonConstantDefaultValue, 46, 5),
-        error(diag.implicitThisReferenceInInitializer, 46, 5),
-      ],
-    );
+''');
   }
 
   test_functionExpression() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 const a = () {};
-''',
-      [error(diag.constInitializedWithNonConstantValue, 10, 5)],
-    );
+//        ^^^^^
+// [diag.constInitializedWithNonConstantValue] Const variables must be initialized with a constant value.
+''');
   }
 
   test_missingConstInListLiteral() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 const List L = [0];
 ''');
   }
 
   test_missingConstInMapLiteral() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 const Map M = {'a' : 0};
 ''');
   }
 
   test_newInstance_constConstructor() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   const A();
 }
 const a = new A();
-''',
-      [error(diag.constInitializedWithNonConstantValue, 35, 7)],
-    );
+//        ^^^^^^^
+// [diag.constInitializedWithNonConstantValue] Const variables must be initialized with a constant value.
+''');
   }
 
   test_newInstance_externalFactoryConstConstructor() async {
@@ -91,27 +83,26 @@
   }
 
   test_propertyExtraction_targetNotConst() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   const A();
   int m() => 0;
 }
 final a = const A();
 const c = a.m;
-''',
-      [error(diag.constInitializedWithNonConstantValue, 72, 1)],
-    );
+//        ^
+// [diag.constInitializedWithNonConstantValue] Const variables must be initialized with a constant value.
+''');
   }
 
   test_typeLiteral_interfaceType() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 const a = int;
 ''');
   }
 
   test_typeLiteral_typeAlias_interfaceType() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 typedef A = int;
 const a = A;
 ''');
diff --git a/pkg/analyzer/test/src/diagnostics/const_instance_field_test.dart b/pkg/analyzer/test/src/diagnostics/const_instance_field_test.dart
index 47dabeb..dc35fac 100644
--- a/pkg/analyzer/test/src/diagnostics/const_instance_field_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/const_instance_field_test.dart
@@ -2,7 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/src/diagnostic/diagnostic.dart' as diag;
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../dart/resolution/context_collection_resolution.dart';
@@ -16,24 +15,22 @@
 @reflectiveTest
 class ConstInstanceFieldTest extends PubPackageResolutionTest {
   test_class() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class C {
   const int f = 0;
+//^^^^^
+// [diag.constInstanceField] Only static fields can be declared as const.
 }
-''',
-      [error(diag.constInstanceField, 12, 5)],
-    );
+''');
   }
 
   test_mixin() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 mixin C {
   const int f = 0;
+//^^^^^
+// [diag.constInstanceField] Only static fields can be declared as const.
 }
-''',
-      [error(diag.constInstanceField, 12, 5)],
-    );
+''');
   }
 }
diff --git a/pkg/analyzer/test/src/diagnostics/const_map_key_not_primitive_equality_test.dart b/pkg/analyzer/test/src/diagnostics/const_map_key_not_primitive_equality_test.dart
index 9e49b85..5cdac9e 100644
--- a/pkg/analyzer/test/src/diagnostics/const_map_key_not_primitive_equality_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/const_map_key_not_primitive_equality_test.dart
@@ -2,7 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/src/diagnostic/diagnostic.dart' as diag;
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../dart/resolution/context_collection_resolution.dart';
@@ -16,7 +15,7 @@
 @reflectiveTest
 class ConstMapKeyNotPrimitiveEqualityTest extends PubPackageResolutionTest {
   test_declaresEqEq_abstract() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   const A();
   bool operator==(Object other);
@@ -29,8 +28,7 @@
   }
 
   test_implementsEqEq_direct() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   const A();
   operator ==(other) => false;
@@ -38,29 +36,27 @@
 
 main() {
   const {const A() : 0};
+//       ^^^^^^^^^
+// [diag.constMapKeyNotPrimitiveEquality] The type of a key in a constant map can't override the '==' operator, or 'hashCode', but the class 'A' does.
 }
-''',
-      [error(diag.constMapKeyNotPrimitiveEquality, 75, 9)],
-    );
+''');
   }
 
   test_implementsEqEq_double() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 main() {
   const {double.infinity: 0};
+//       ^^^^^^^^^^^^^^^
+// [diag.constMapKeyNotPrimitiveEquality] The type of a key in a constant map can't override the '==' operator, or 'hashCode', but the class 'double' does.
 }
-''',
-      [error(diag.constMapKeyNotPrimitiveEquality, 18, 15)],
-    );
+''');
   }
 
   test_implementsEqEq_dynamic() async {
     // Note: static type of B.a is "dynamic", but actual type of the const
     // object is A.  We need to make sure we examine the actual type when
     // deciding whether there is a problem with operator==.
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   const A();
   operator ==(other) => false;
@@ -72,15 +68,14 @@
 
 main() {
   const {B.a : 0};
+//       ^^^
+// [diag.constMapKeyNotPrimitiveEquality] The type of a key in a constant map can't override the '==' operator, or 'hashCode', but the class 'A' does.
 }
-''',
-      [error(diag.constMapKeyNotPrimitiveEquality, 118, 3)],
-    );
+''');
   }
 
   test_implementsEqEq_factory() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   const factory A() = B;
 }
@@ -92,15 +87,14 @@
 
 main() {
   const {const A(): 42};
+//       ^^^^^^^^^
+// [diag.constMapKeyNotPrimitiveEquality] The type of a key in a constant map can't override the '==' operator, or 'hashCode', but the class 'B' does.
 }
-''',
-      [error(diag.constMapKeyNotPrimitiveEquality, 121, 9)],
-    );
+''');
   }
 
   test_implementsEqEq_nestedIn_instanceCreation() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   const A();
 
@@ -113,15 +107,14 @@
 
 main() {
   const B({A(): 0});
+//         ^^^
+// [diag.constMapKeyNotPrimitiveEquality] The type of a key in a constant map can't override the '==' operator, or 'hashCode', but the class 'A' does.
 }
-''',
-      [error(diag.constMapKeyNotPrimitiveEquality, 110, 3)],
-    );
+''');
   }
 
   test_implementsEqEq_record_named() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   const A();
   operator ==(other) => false;
@@ -129,15 +122,14 @@
 
 const x = {
   (a: 0, b: const A()): 0,
+//^^^^^^^^^^^^^^^^^^^^
+// [diag.constMapKeyNotPrimitiveEquality] The type of a key in a constant map can't override the '==' operator, or 'hashCode', but the class '({int a, A b})' does.
 };
-''',
-      [error(diag.constMapKeyNotPrimitiveEquality, 71, 20)],
-    );
+''');
   }
 
   test_implementsEqEq_record_positional() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   const A();
   operator ==(other) => false;
@@ -145,15 +137,14 @@
 
 const x = {
   (0, const A()): 0,
+//^^^^^^^^^^^^^^
+// [diag.constMapKeyNotPrimitiveEquality] The type of a key in a constant map can't override the '==' operator, or 'hashCode', but the class '(int, A)' does.
 };
-''',
-      [error(diag.constMapKeyNotPrimitiveEquality, 71, 14)],
-    );
+''');
   }
 
   test_implementsEqEq_super() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   const A();
   operator ==(other) => false;
@@ -165,28 +156,27 @@
 
 main() {
   const {const B() : 0};
+//       ^^^^^^^^^
+// [diag.constMapKeyNotPrimitiveEquality] The type of a key in a constant map can't override the '==' operator, or 'hashCode', but the class 'B' does.
 }
-''',
-      [error(diag.constMapKeyNotPrimitiveEquality, 111, 9)],
-    );
+''');
   }
 
   test_implementsHashCode_direct() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 const v = {A(): 0};
+//         ^^^
+// [diag.constMapKeyNotPrimitiveEquality] The type of a key in a constant map can't override the '==' operator, or 'hashCode', but the class 'A' does.
 
 class A {
   const A();
   int get hashCode => 0;
 }
-''',
-      [error(diag.constMapKeyNotPrimitiveEquality, 11, 3)],
-    );
+''');
   }
 
   test_implementsNone_record_named() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   const A();
 }
@@ -198,7 +188,7 @@
   }
 
   test_implementsNone_record_positional() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   const A();
 }
diff --git a/pkg/analyzer/test/src/diagnostics/const_set_element_not_primitive_equality_test.dart b/pkg/analyzer/test/src/diagnostics/const_set_element_not_primitive_equality_test.dart
index b5d5392..bf46c77 100644
--- a/pkg/analyzer/test/src/diagnostics/const_set_element_not_primitive_equality_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/const_set_element_not_primitive_equality_test.dart
@@ -2,7 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/src/diagnostic/diagnostic.dart' as diag;
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../dart/resolution/context_collection_resolution.dart';
@@ -16,8 +15,7 @@
 @reflectiveTest
 class ConstSetElementNotPrimitiveEqualityTest extends PubPackageResolutionTest {
   test_implementsEqEq_constField() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   static const a = const A();
   const A();
@@ -25,33 +23,31 @@
 }
 main() {
   const {A.a};
+//       ^^^
+// [diag.constSetElementNotPrimitiveEquality] An element in a constant set can't override the '==' operator, or 'hashCode', but the type 'A' does.
 }
-''',
-      [error(diag.constSetElementNotPrimitiveEquality, 104, 3)],
-    );
+''');
   }
 
   test_implementsEqEq_direct() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   const A();
   operator ==(other) => false;
 }
 main() {
   const {const A()};
+//       ^^^^^^^^^
+// [diag.constSetElementNotPrimitiveEquality] An element in a constant set can't override the '==' operator, or 'hashCode', but the type 'A' does.
 }
-''',
-      [error(diag.constSetElementNotPrimitiveEquality, 74, 9)],
-    );
+''');
   }
 
   test_implementsEqEq_dynamic() async {
     // Note: static type of B.a is "dynamic", but actual type of the const
     // object is A.  We need to make sure we examine the actual type when
     // deciding whether there is a problem with operator==.
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   const A();
   operator ==(other) => false;
@@ -61,15 +57,14 @@
 }
 main() {
   const {B.a};
+//       ^^^
+// [diag.constSetElementNotPrimitiveEquality] An element in a constant set can't override the '==' operator, or 'hashCode', but the type 'A' does.
 }
-''',
-      [error(diag.constSetElementNotPrimitiveEquality, 116, 3)],
-    );
+''');
   }
 
   test_implementsEqEq_factory() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A { const factory A() = B; }
 
 class B implements A {
@@ -80,16 +75,15 @@
 
 main() {
   var m = const {const A()};
+//               ^^^^^^^^^
+// [diag.constSetElementNotPrimitiveEquality] An element in a constant set can't override the '==' operator, or 'hashCode', but the type 'B' does.
   print(m);
 }
-''',
-      [error(diag.constSetElementNotPrimitiveEquality, 128, 9)],
-    );
+''');
   }
 
   test_implementsEqEq_nestedIn_instanceCreation() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   const A();
 
@@ -102,15 +96,14 @@
 
 main() {
   const B({A()});
+//         ^^^
+// [diag.constSetElementNotPrimitiveEquality] An element in a constant set can't override the '==' operator, or 'hashCode', but the type 'A' does.
 }
-''',
-      [error(diag.constSetElementNotPrimitiveEquality, 110, 3)],
-    );
+''');
   }
 
   test_implementsEqEq_record_named() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   const A();
   operator ==(other) => false;
@@ -118,15 +111,14 @@
 
 const x = {
   (a: 0, b: const A()),
+//^^^^^^^^^^^^^^^^^^^^
+// [diag.constSetElementNotPrimitiveEquality] An element in a constant set can't override the '==' operator, or 'hashCode', but the type '({int a, A b})' does.
 };
-''',
-      [error(diag.constSetElementNotPrimitiveEquality, 71, 20)],
-    );
+''');
   }
 
   test_implementsEqEq_record_positional() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   const A();
   operator ==(other) => false;
@@ -134,15 +126,14 @@
 
 const x = {
   (0, const A()),
+//^^^^^^^^^^^^^^
+// [diag.constSetElementNotPrimitiveEquality] An element in a constant set can't override the '==' operator, or 'hashCode', but the type '(int, A)' does.
 };
-''',
-      [error(diag.constSetElementNotPrimitiveEquality, 71, 14)],
-    );
+''');
   }
 
   test_implementsEqEq_spread_intoList_set() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   const A();
   operator ==(other) => false;
@@ -150,15 +141,14 @@
 
 main() {
   const [...{A()}];
+//           ^^^
+// [diag.constSetElementNotPrimitiveEquality] An element in a constant set can't override the '==' operator, or 'hashCode', but the type 'A' does.
 }
-''',
-      [error(diag.constSetElementNotPrimitiveEquality, 79, 3)],
-    );
+''');
   }
 
   test_implementsEqEq_spread_intoSet_list() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   const A();
   operator ==(other) => false;
@@ -166,15 +156,14 @@
 
 main() {
   const {...[A()]};
+//       ^^^^^^^^
+// [diag.constSetElementNotPrimitiveEquality] An element in a constant set can't override the '==' operator, or 'hashCode', but the type 'List<A>' does.
 }
-''',
-      [error(diag.constSetElementNotPrimitiveEquality, 75, 8)],
-    );
+''');
   }
 
   test_implementsEqEq_spread_intoSet_set() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   const A();
   operator ==(other) => false;
@@ -182,15 +171,14 @@
 
 main() {
   const {...{A()}};
+//           ^^^
+// [diag.constSetElementNotPrimitiveEquality] An element in a constant set can't override the '==' operator, or 'hashCode', but the type 'A' does.
 }
-''',
-      [error(diag.constSetElementNotPrimitiveEquality, 79, 3)],
-    );
+''');
   }
 
   test_implementsEqEq_super() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   const A();
   operator ==(other) => false;
@@ -200,52 +188,51 @@
 }
 main() {
   const {const B()};
+//       ^^^^^^^^^
+// [diag.constSetElementNotPrimitiveEquality] An element in a constant set can't override the '==' operator, or 'hashCode', but the type 'B' does.
 }
-''',
-      [error(diag.constSetElementNotPrimitiveEquality, 109, 9)],
-    );
+''');
   }
 
   test_implementsHashCode_direct() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 const v = {A()};
+//         ^^^
+// [diag.constSetElementNotPrimitiveEquality] An element in a constant set can't override the '==' operator, or 'hashCode', but the type 'A' does.
 
 class A {
   const A();
   int get hashCode => 0;
 }
-''',
-      [error(diag.constSetElementNotPrimitiveEquality, 11, 3)],
-    );
+''');
   }
 
   test_implementsNone_record_named() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   const A();
 }
 
 const x = {
-  (a: 0, b: const A()),
+  (a: 0, b: const A()): 0,
 };
 ''');
   }
 
   test_implementsNone_record_positional() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   const A();
 }
 
 const x = {
-  (0, const A()),
+  (0, const A()): 0,
 };
 ''');
   }
 
   test_listLiteral_spread() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   const A();
   operator ==(other) => false;
diff --git a/pkg/analyzer/test/src/diagnostics/const_spread_expected_list_or_set_test.dart b/pkg/analyzer/test/src/diagnostics/const_spread_expected_list_or_set_test.dart
index c64d5e7..bc111eb 100644
--- a/pkg/analyzer/test/src/diagnostics/const_spread_expected_list_or_set_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/const_spread_expected_list_or_set_test.dart
@@ -2,7 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/src/diagnostic/diagnostic.dart' as diag;
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../dart/resolution/context_collection_resolution.dart';
@@ -19,126 +18,119 @@
 
 mixin ConstSpreadExpectedListOrSetTestCases on PubPackageResolutionTest {
   test_const_listInt() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 const dynamic a = 5;
 var b = const <int>[...a];
-''',
-      [error(diag.constSpreadExpectedListOrSet, 44, 1)],
-    );
+//                     ^
+// [diag.constSpreadExpectedListOrSet] A list or a set is expected in this spread.
+''');
   }
 
   test_const_listInt_constVariable() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 const dynamic a = 5;
 const x = <int>[...a];
-''',
-      [error(diag.constSpreadExpectedListOrSet, 40, 1)],
-    );
+//                 ^
+// [diag.constSpreadExpectedListOrSet] A list or a set is expected in this spread.
+''');
   }
 
   test_const_listList() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 const dynamic a = [5];
 var b = const <int>[...a];
 ''');
   }
 
   test_const_listMap() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 const dynamic a = <int, int>{0: 1};
 var b = const <int>[...a];
-''',
-      [error(diag.constSpreadExpectedListOrSet, 59, 1)],
-    );
+//                     ^
+// [diag.constSpreadExpectedListOrSet] A list or a set is expected in this spread.
+''');
   }
 
   test_const_listNull() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 const dynamic a = null;
 var b = const <int>[...a];
-''',
-      [error(diag.constSpreadExpectedListOrSet, 47, 1)],
-    );
+//                     ^
+// [diag.constSpreadExpectedListOrSet] A list or a set is expected in this spread.
+''');
   }
 
   test_const_listNull_nullable() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 const dynamic a = null;
 var b = const <int>[...?a];
 ''');
   }
 
   test_const_listSet() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 const dynamic a = <int>{5};
 var b = const <int>[...a];
 ''');
   }
 
   test_const_setInt() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 const dynamic a = 5;
 var b = const <int>{...a};
-''',
-      [error(diag.constSpreadExpectedListOrSet, 44, 1)],
-    );
+//                     ^
+// [diag.constSpreadExpectedListOrSet] A list or a set is expected in this spread.
+''');
   }
 
   test_const_setList() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 const dynamic a = <int>[5];
 var b = const <int>{...a};
 ''');
   }
 
   test_const_setMap() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 const dynamic a = <int, int>{1: 2};
 var b = const <int>{...a};
-''',
-      [error(diag.constSpreadExpectedListOrSet, 59, 1)],
-    );
+//                     ^
+// [diag.constSpreadExpectedListOrSet] A list or a set is expected in this spread.
+''');
   }
 
   test_const_setNull() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 const dynamic a = null;
 var b = const <int>{...a};
-''',
-      [error(diag.constSpreadExpectedListOrSet, 47, 1)],
-    );
+//                     ^
+// [diag.constSpreadExpectedListOrSet] A list or a set is expected in this spread.
+''');
   }
 
   test_const_setNull_nullable() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 const dynamic a = null;
 var b = const <int>{...?a};
 ''');
   }
 
   test_const_setSet() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 const dynamic a = <int>{5};
 var b = const <int>{...a};
 ''');
   }
 
   test_nonConst_listInt() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 const dynamic a = 5;
 var b = <int>[...a];
 ''');
   }
 
   test_nonConst_setInt() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 const dynamic a = 5;
 var b = <int>{...a};
 ''');
diff --git a/pkg/analyzer/test/src/diagnostics/const_spread_expected_map_test.dart b/pkg/analyzer/test/src/diagnostics/const_spread_expected_map_test.dart
index ff8bec6..5fa198b 100644
--- a/pkg/analyzer/test/src/diagnostics/const_spread_expected_map_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/const_spread_expected_map_test.dart
@@ -2,7 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/src/diagnostic/diagnostic.dart' as diag;
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../dart/resolution/context_collection_resolution.dart';
@@ -19,68 +18,64 @@
 
 mixin ConstSpreadExpectedMapTestCases on PubPackageResolutionTest {
   test_const_mapInt() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 const dynamic a = 5;
 var b = const <int, int>{...a};
-''',
-      [error(diag.constSpreadExpectedMap, 49, 1)],
-    );
+//                          ^
+// [diag.constSpreadExpectedMap] A map is expected in this spread.
+''');
   }
 
   test_const_mapList() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 const dynamic a = <int>[5];
 var b = const <int, int>{...a};
-''',
-      [error(diag.constSpreadExpectedMap, 56, 1)],
-    );
+//                          ^
+// [diag.constSpreadExpectedMap] A map is expected in this spread.
+''');
   }
 
   test_const_mapMap() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 const dynamic a = <int, int>{1: 2};
 var b = <int, int>{...a};
 ''');
   }
 
   test_const_mapNull() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 const dynamic a = null;
 var b = const <int, int>{...a};
-''',
-      [error(diag.constSpreadExpectedMap, 52, 1)],
-    );
+//                          ^
+// [diag.constSpreadExpectedMap] A map is expected in this spread.
+''');
   }
 
   test_const_mapNull_nullable() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 const dynamic a = null;
 var b = <int, int>{...?a};
 ''');
   }
 
   test_const_mapSet() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 const dynamic a = <int>{5};
 var b = const <int, int>{...a};
-''',
-      [error(diag.constSpreadExpectedMap, 56, 1)],
-    );
+//                          ^
+// [diag.constSpreadExpectedMap] A map is expected in this spread.
+''');
   }
 
   test_nonConst_mapInt() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 const dynamic a = 5;
 var b = <int, int>{...a};
 ''');
   }
 
   test_nonConst_mapMap() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 const dynamic a = {1: 2};
 var b = <int, int>{...a};
 ''');
diff --git a/pkg/analyzer/test/src/diagnostics/const_type_parameter_test.dart b/pkg/analyzer/test/src/diagnostics/const_type_parameter_test.dart
index a5ae350..8403ac1 100644
--- a/pkg/analyzer/test/src/diagnostics/const_type_parameter_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/const_type_parameter_test.dart
@@ -2,7 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/src/diagnostic/diagnostic.dart' as diag;
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../dart/resolution/context_collection_resolution.dart';
@@ -16,35 +15,32 @@
 @reflectiveTest
 class ConstTypeParameterTest extends PubPackageResolutionTest {
   test_constantPattern_typeParameter() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 void f<T>(x) {
   if (x case T) {}
+//           ^
+// [diag.constTypeParameter] Type parameters can't be used in a constant expression.
 }
-''',
-      [error(diag.constTypeParameter, 28, 1)],
-    );
+''');
   }
 
   test_constantPattern_typeParameter_nested() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 void f<T>(Object? x) {
   if (x case const (T)) {}
+//                  ^
+// [diag.constTypeParameter] Type parameters can't be used in a constant expression.
 }
-''',
-      [error(diag.constTypeParameter, 43, 1)],
-    );
+''');
   }
 
   test_constantPattern_typeParameter_nested2() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 void f<T>(Object? x) {
   if (x case const (List<T>)) {}
+//                  ^^^^^^^
+// [diag.constTypeParameter] Type parameters can't be used in a constant expression.
 }
-''',
-      [error(diag.constTypeParameter, 43, 7)],
-    );
+''');
   }
 }
diff --git a/pkg/analyzer/test/src/diagnostics/const_with_non_const_test.dart b/pkg/analyzer/test/src/diagnostics/const_with_non_const_test.dart
index 44ceff3..5b0524d 100644
--- a/pkg/analyzer/test/src/diagnostics/const_with_non_const_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/const_with_non_const_test.dart
@@ -2,7 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/src/diagnostic/diagnostic.dart' as diag;
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../dart/resolution/context_collection_resolution.dart';
@@ -16,8 +15,7 @@
 @reflectiveTest
 class ConstWithNonConstTest extends PubPackageResolutionTest {
   test_inConstContext() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   const A(x);
 }
@@ -25,14 +23,14 @@
 }
 main() {
   const A(B());
+//        ^^^
+// [diag.constWithNonConst] The constructor being called isn't a const constructor.
 }
-''',
-      [error(diag.constWithNonConst, 57, 3)],
-    );
+''');
   }
 
   test_mixinApplication_constSuperConstructor() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 mixin M {}
 class A {
   const A();
@@ -43,8 +41,7 @@
   }
 
   test_mixinApplication_constSuperConstructor_field() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 mixin M {
   int i = 0;
 }
@@ -53,13 +50,13 @@
 }
 class B = A with M;
 var b = const B();
-''',
-      [error(diag.constWithNonConst, 78, 5)],
-    );
+//      ^^^^^
+// [diag.constWithNonConst] The constructor being called isn't a const constructor.
+''');
   }
 
   test_mixinApplication_constSuperConstructor_getter() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 mixin M {
   int get i => 0;
 }
@@ -72,7 +69,7 @@
   }
 
   test_mixinApplication_constSuperConstructor_setter() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 mixin M {
   set(int i) {}
 }
@@ -85,18 +82,17 @@
   }
 
   test_nonConst_factory() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   factory A(int a) => throw 0;
 }
 
 void f() {
   const A(0);
+//^^^^^
+// [diag.constWithNonConst] The constructor being called isn't a const constructor.
 }
-''',
-      [error(diag.constWithNonConst, 57, 5)],
-    );
+''');
 
     var node = findNode.singleInstanceCreationExpression;
     assertResolvedNodeText(node, r'''
@@ -121,18 +117,17 @@
   }
 
   test_nonConst_generative() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   A(int a);
 }
 
 void f() {
   const A(0);
+//^^^^^
+// [diag.constWithNonConst] The constructor being called isn't a const constructor.
 }
-''',
-      [error(diag.constWithNonConst, 38, 5)],
-    );
+''');
 
     var node = findNode.singleInstanceCreationExpression;
     assertResolvedNodeText(node, r'''
diff --git a/pkg/analyzer/test/src/diagnostics/const_with_non_constant_argument_test.dart b/pkg/analyzer/test/src/diagnostics/const_with_non_constant_argument_test.dart
index 2362fb5..ecf344a 100644
--- a/pkg/analyzer/test/src/diagnostics/const_with_non_constant_argument_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/const_with_non_constant_argument_test.dart
@@ -2,7 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/src/diagnostic/diagnostic.dart' as diag;
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../dart/resolution/context_collection_resolution.dart';
@@ -16,23 +15,21 @@
 @reflectiveTest
 class ConstWithNonConstantArgumentTest extends PubPackageResolutionTest {
   test_annotation() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   const A(int p);
 }
 var v = 42;
 @A(v)
+// ^
+// [diag.constWithNonConstantArgument] Arguments of a constant creation must be constant expressions.
 main() {
 }
-''',
-      [error(diag.constWithNonConstantArgument, 45, 1)],
-    );
+''');
   }
 
   test_classShadowedBySetter() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class Annotation {
   const Annotation(Object obj);
 }
@@ -41,32 +38,29 @@
 
 class Foo {
   @Annotation(Bar)
+//            ^^^
+// [diag.undefinedIdentifier] Undefined name 'Bar'.
+// [diag.constWithNonConstantArgument] Arguments of a constant creation must be constant expressions.
   set Bar(int value) {}
 }
-''',
-      [
-        error(diag.constWithNonConstantArgument, 94, 3),
-        error(diag.undefinedIdentifier, 94, 3),
-      ],
-    );
+''');
   }
 
   test_enumConstant() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 var a = 42;
 
 enum E {
   v(a);
+//  ^
+// [diag.constWithNonConstantArgument] Arguments of a constant creation must be constant expressions.
   const E(_);
 }
-''',
-      [error(diag.constWithNonConstantArgument, 26, 1)],
-    );
+''');
   }
 
   test_enumConstant_constantContext() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 enum E {
   v([]);
   const E(_);
@@ -75,20 +69,18 @@
   }
 
   test_instanceCreation() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   const A(a);
 }
 f(p) { return const A(p); }
-''',
-      [error(diag.constWithNonConstantArgument, 48, 1)],
-    );
+//                    ^
+// [diag.constWithNonConstantArgument] Arguments of a constant creation must be constant expressions.
+''');
   }
 
   test_issue47603() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class C {
   final void Function() c;
   const C(this.c);
@@ -96,9 +88,9 @@
 
 void main() {
   const C(() {});
+//        ^^^^^
+// [diag.constWithNonConstantArgument] Arguments of a constant creation must be constant expressions.
 }
-''',
-      [error(diag.constWithNonConstantArgument, 83, 5)],
-    );
+''');
   }
 }
diff --git a/pkg/analyzer/test/src/diagnostics/const_with_non_type_test.dart b/pkg/analyzer/test/src/diagnostics/const_with_non_type_test.dart
index e614722..7a77152 100644
--- a/pkg/analyzer/test/src/diagnostics/const_with_non_type_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/const_with_non_type_test.dart
@@ -2,7 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/src/diagnostic/diagnostic.dart' as diag;
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../dart/resolution/context_collection_resolution.dart';
@@ -17,26 +16,24 @@
 class ConstWithNonTypeTest extends PubPackageResolutionTest {
   test_fromLibrary() async {
     newFile('$testPackageLibPath/lib1.dart', '');
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'lib1.dart' as lib;
 void f() {
   const lib.A();
+//          ^
+// [diag.constWithNonType] The name 'A' isn't a class.
 }
-''',
-      [error(diag.constWithNonType, 50, 1)],
-    );
+''');
   }
 
   test_variable() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 int A = 0;
 f() {
   return const A();
+//             ^
+// [diag.constWithNonType] The name 'A' isn't a class.
 }
-''',
-      [error(diag.constWithNonType, 32, 1)],
-    );
+''');
   }
 }
diff --git a/pkg/analyzer/test/src/diagnostics/const_with_type_parameters_test.dart b/pkg/analyzer/test/src/diagnostics/const_with_type_parameters_test.dart
index 12f9387..2cdf8a1 100644
--- a/pkg/analyzer/test/src/diagnostics/const_with_type_parameters_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/const_with_type_parameters_test.dart
@@ -2,7 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/src/diagnostic/diagnostic.dart' as diag;
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../dart/resolution/context_collection_resolution.dart';
@@ -19,114 +18,100 @@
 class ConstWithTypeParametersConstructorTearoffTest
     extends PubPackageResolutionTest {
   test_asExpression_functionType() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 void f<T>(T a) {}
 void g() {
   const [f as void Function<T>(T, [int])];
+//       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// [diag.listElementTypeNotAssignable] The element type 'void Function<T>(T)' can't be assigned to the list type 'void Function<T>(T, [int])'.
 }
-''',
-      [error(diag.listElementTypeNotAssignable, 38, 31)],
-    );
+''');
   }
 
   test_defaultValue() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 class A<T> {
   void m([fn = A<T>.new]) {}
+//               ^
+// [diag.constWithTypeParametersConstructorTearoff] A constant constructor tearoff can't use a type parameter as a type argument.
 }
-''',
-      [error(diag.constWithTypeParametersConstructorTearoff, 30, 1)],
-    );
+''');
   }
 
   test_defaultValue_fieldFormalParameter() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 class A<T> {
   A<T> Function() fn;
   A([this.fn = A<T>.new]);
+//               ^
+// [diag.constWithTypeParametersConstructorTearoff] A constant constructor tearoff can't use a type parameter as a type argument.
 }
-''',
-      [error(diag.constWithTypeParametersConstructorTearoff, 52, 1)],
-    );
+''');
   }
 
   test_defaultValue_noTypeVariableInferredFromParameter() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 class A<T> {
   void m([A<T> Function() fn = A.new]) {}
+//                             ^^^^^
+// [diag.invalidAssignment] A value of type 'A<dynamic> Function()' can't be assigned to a variable of type 'A<T> Function()'.
 }
-''',
-      [
-        // `A<dynamic> Function()` cannot be assigned to `A<T> Function()`, but
-        // there should not be any other error reported here.
-        error(diag.invalidAssignment, 44, 5),
-      ],
-    );
+''');
   }
 
   test_direct() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 class A<T> {
   void m() {
     const c = A<T>.new;
+//        ^
+// [diag.unusedLocalVariable] The value of the local variable 'c' isn't used.
+//              ^
+// [diag.constWithTypeParametersConstructorTearoff] A constant constructor tearoff can't use a type parameter as a type argument.
   }
 }
-''',
-      [
-        error(diag.unusedLocalVariable, 36, 1),
-        error(diag.constWithTypeParametersConstructorTearoff, 42, 1),
-      ],
-    );
+''');
   }
 
   test_fieldValue_constClass() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 class A<T> {
   const A();
   final x = A<T>.new;
+//            ^
+// [diag.constWithTypeParametersConstructorTearoff] A constant constructor tearoff can't use a type parameter as a type argument.
 }
-''',
-      [error(diag.constWithTypeParametersConstructorTearoff, 40, 1)],
-    );
+''');
   }
 
   test_indirect() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 class A<T> {
   void m() {
     const c = A<List<T>>.new;
+//        ^
+// [diag.unusedLocalVariable] The value of the local variable 'c' isn't used.
+//                   ^
+// [diag.constWithTypeParametersConstructorTearoff] A constant constructor tearoff can't use a type parameter as a type argument.
   }
 }
-''',
-      [
-        error(diag.unusedLocalVariable, 36, 1),
-        error(diag.constWithTypeParametersConstructorTearoff, 47, 1),
-      ],
-    );
+''');
   }
 
   test_isExpression_functionType() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 class A<T> {
   void m() {
     const [false is void Function(T)];
+//                                ^
+// [diag.constWithTypeParameters] A constant creation can't use a type parameter as a type argument.
   }
 }
-''',
-      [error(diag.constWithTypeParameters, 60, 1)],
-    );
+''');
   }
 
   test_nonConst() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 class A<T> {
   void m() {
     A<T>.new;
@@ -140,129 +125,114 @@
 class ConstWithTypeParametersFunctionTearoffTest
     extends PubPackageResolutionTest {
   test_appliedTypeParameter_defaultConstructorValue() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 void f<T>(T t) => t;
 
 class C<T> {
   final void Function(T) p;
   const C({this.p = f});
+//                  ^
+// [diag.constWithTypeParametersFunctionTearoff] A constant function tearoff can't use a type parameter as a type argument.
 }
-''',
-      [error(diag.constWithTypeParametersFunctionTearoff, 83, 1)],
-    );
+''');
   }
 
   test_appliedTypeParameter_defaultFunctionValue() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 void f<T>(T t) => t;
 
 void bar<T>([void Function(T) p = f]) {}
-''',
-      [error(diag.constWithTypeParametersFunctionTearoff, 56, 1)],
-    );
+//                                ^
+// [diag.constWithTypeParametersFunctionTearoff] A constant function tearoff can't use a type parameter as a type argument.
+''');
   }
 
   test_appliedTypeParameter_defaultMethodValue() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 void f<T>(T t) => t;
 
 class C<T> {
   void foo([void Function(T) p = f]) {}
+//                               ^
+// [diag.constWithTypeParametersFunctionTearoff] A constant function tearoff can't use a type parameter as a type argument.
 }
-''',
-      [error(diag.constWithTypeParametersFunctionTearoff, 68, 1)],
-    );
+''');
   }
 
   test_appliedTypeParameter_nested() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 void f<T>(T t) => t;
 
 void bar<T>([void Function(List<T>) p = f]) {}
-''',
-      [error(diag.constWithTypeParametersFunctionTearoff, 62, 1)],
-    );
+//                                      ^
+// [diag.constWithTypeParametersFunctionTearoff] A constant function tearoff can't use a type parameter as a type argument.
+''');
   }
 
   test_appliedTypeParameter_nestedFunction() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 void f<T>(T t) => t;
 
 void bar<T>([void Function(T Function()) p = f]) {}
-''',
-      [error(diag.constWithTypeParametersFunctionTearoff, 67, 1)],
-    );
+//                                           ^
+// [diag.constWithTypeParametersFunctionTearoff] A constant function tearoff can't use a type parameter as a type argument.
+''');
   }
 
   test_defaultValue() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 void f<T>(T a) {}
 class A<U> {
   void m([void Function(U) fn = f<U>]) {}
+//                                ^
+// [diag.constWithTypeParametersFunctionTearoff] A constant function tearoff can't use a type parameter as a type argument.
 }
-''',
-      [error(diag.constWithTypeParametersFunctionTearoff, 65, 1)],
-    );
+''');
   }
 
   test_direct() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 void f<T>(T a) {}
 class A<U> {
   void m() {
     const c = f<U>;
+//        ^
+// [diag.unusedLocalVariable] The value of the local variable 'c' isn't used.
+//              ^
+// [diag.constWithTypeParametersFunctionTearoff] A constant function tearoff can't use a type parameter as a type argument.
   }
 }
-''',
-      [
-        error(diag.unusedLocalVariable, 54, 1),
-        error(diag.constWithTypeParametersFunctionTearoff, 60, 1),
-      ],
-    );
+''');
   }
 
   test_fieldValue_constClass() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 void f<T>(T a) {}
 class A<U> {
   const A();
+//^^^^^
+// [diag.constConstructorWithFieldInitializedByNonConst] Can't define the 'const' constructor because the field 'x' is initialized with a non-constant value.
   final x = f<U>;
+//            ^
+// [diag.constWithTypeParametersFunctionTearoff] A constant function tearoff can't use a type parameter as a type argument.
 }
-''',
-      [
-        error(diag.constConstructorWithFieldInitializedByNonConst, 33, 5),
-        error(diag.constWithTypeParametersFunctionTearoff, 58, 1),
-      ],
-    );
+''');
   }
 
   test_fieldValue_extension() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 void f<T>(T a) {}
 class A<U> {}
 extension<U> on A<U> {
   final x = f<U>;
+//      ^
+// [diag.extensionDeclaresInstanceField] Extensions can't declare instance fields.
 }
-''',
-      [
-        // An instance field is illegal, but we should not also report an
-        // additional error for the type variable.
-        error(diag.extensionDeclaresInstanceField, 63, 1),
-      ],
-    );
+''');
   }
 
   test_fieldValue_nonConstClass() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 void f<T>(T a) {}
 class A<U> {
   final x = f<U>;
@@ -271,24 +241,22 @@
   }
 
   test_indirect() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 void f<T>(T a) {}
 class A<U> {
   void m() {
     const c = f<List<U>>;
+//        ^
+// [diag.unusedLocalVariable] The value of the local variable 'c' isn't used.
+//                   ^
+// [diag.constWithTypeParametersFunctionTearoff] A constant function tearoff can't use a type parameter as a type argument.
   }
 }
-''',
-      [
-        error(diag.unusedLocalVariable, 54, 1),
-        error(diag.constWithTypeParametersFunctionTearoff, 65, 1),
-      ],
-    );
+''');
   }
 
   test_nonConst() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 void f<T>(T a) {}
 class A<U> {
   void m() {
@@ -302,63 +270,59 @@
 @reflectiveTest
 class ConstWithTypeParametersTest extends PubPackageResolutionTest {
   test_direct() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 class A<T> {
   const A();
   void m() {
     const A<T>();
+//          ^
+// [diag.constWithTypeParameters] A constant creation can't use a type parameter as a type argument.
   }
 }
-''',
-      [error(diag.constWithTypeParameters, 51, 1)],
-    );
+''');
   }
 
   test_indirect() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 class A<T> {
   const A();
   void m() {
     const A<List<T>>();
+//               ^
+// [diag.constWithTypeParameters] A constant creation can't use a type parameter as a type argument.
   }
 }
-''',
-      [error(diag.constWithTypeParameters, 56, 1)],
-    );
+''');
   }
 
   test_indirect_functionType_returnType() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 class A<T> {
   const A();
   void m() {
     const A<T Function()>();
+//          ^
+// [diag.constWithTypeParameters] A constant creation can't use a type parameter as a type argument.
   }
 }
-''',
-      [error(diag.constWithTypeParameters, 51, 1)],
-    );
+''');
   }
 
   test_indirect_functionType_simpleParameter() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 class A<T> {
   const A();
   void m() {
     const A<void Function(T)>();
+//                        ^
+// [diag.constWithTypeParameters] A constant creation can't use a type parameter as a type argument.
   }
 }
-''',
-      [error(diag.constWithTypeParameters, 65, 1)],
-    );
+''');
   }
 
   test_indirect_functionType_typeParameter() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 class A<T> {
   const A();
   void m() {
@@ -369,7 +333,7 @@
   }
 
   test_indirect_functionType_typeParameter_nestedFunctionType() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 class A<T> {
   const A();
   void m() {
@@ -380,7 +344,7 @@
   }
 
   test_indirect_functionType_typeParameter_referencedDirectly() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 class A<T> {
   const A();
   void m() {
@@ -391,7 +355,7 @@
   }
 
   test_indirect_functionType_typeParameter_typeArgumentOfReturnType() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 class A<T> {
   const A();
   void m() {
@@ -402,21 +366,20 @@
   }
 
   test_indirect_functionType_typeParameter_typeParameterBound() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 class A<T> {
   const A();
   void m() {
     const A<void Function<U extends T>()>();
+//                                  ^
+// [diag.constWithTypeParameters] A constant creation can't use a type parameter as a type argument.
   }
 }
-''',
-      [error(diag.constWithTypeParameters, 75, 1)],
-    );
+''');
   }
 
   test_nonConstContext() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 class A<T> {
   const A();
   void m() {
diff --git a/pkg/analyzer/test/src/diagnostics/const_with_undefined_constructor_test.dart b/pkg/analyzer/test/src/diagnostics/const_with_undefined_constructor_test.dart
index 7cbafaf..a1543341 100644
--- a/pkg/analyzer/test/src/diagnostics/const_with_undefined_constructor_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/const_with_undefined_constructor_test.dart
@@ -2,7 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/src/diagnostic/diagnostic.dart' as diag;
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../dart/resolution/context_collection_resolution.dart';
@@ -16,82 +15,54 @@
 @reflectiveTest
 class ConstWithUndefinedConstructorTest extends PubPackageResolutionTest {
   test_class_named() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   const A();
 }
 f() {
   return const A.noSuchConstructor();
+//               ^^^^^^^^^^^^^^^^^
+// [diag.constWithUndefinedConstructor] The class 'A' doesn't have a constant constructor 'noSuchConstructor'.
 }
-''',
-      [
-        error(
-          diag.constWithUndefinedConstructor,
-          48,
-          17,
-          messageContains: ["class 'A'", "constructor 'noSuchConstructor'"],
-        ),
-      ],
-    );
+''');
   }
 
   test_class_named_prefixed() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'dart:async' as a;
 f() {
   return const a.Future.noSuchConstructor();
+//                      ^^^^^^^^^^^^^^^^^
+// [diag.constWithUndefinedConstructor] The class 'a.Future' doesn't have a constant constructor 'noSuchConstructor'.
 }
-''',
-      [
-        error(
-          diag.constWithUndefinedConstructor,
-          56,
-          17,
-          messageContains: [
-            "class 'a.Future'",
-            "constructor 'noSuchConstructor'",
-          ],
-        ),
-      ],
-    );
+''');
   }
 
   test_class_nonFunctionTypedef() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   const A.name();
 }
 typedef B = A;
 f() {
   return const B();
+//             ^
+// [diag.constWithUndefinedConstructorDefault] The class 'B' doesn't have an unnamed constant constructor.
 }
-''',
-      [error(diag.constWithUndefinedConstructorDefault, 66, 1)],
-    );
+''');
   }
 
   test_class_unnamed() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   const A.name();
 }
 f() {
   return const A();
+//             ^
+// [diag.constWithUndefinedConstructorDefault] The class 'A' doesn't have an unnamed constant constructor.
 }
-''',
-      [
-        error(
-          diag.constWithUndefinedConstructorDefault,
-          51,
-          1,
-          messageContains: ["'A'"],
-        ),
-      ],
-    );
+''');
   }
 
   test_class_unnamed_prefixed() async {
@@ -100,44 +71,36 @@
   const A.name();
 }
 ''');
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'lib1.dart' as lib1;
 f() {
   return const lib1.A();
+//             ^^^^^^
+// [diag.constWithUndefinedConstructorDefault] The class 'lib1.A' doesn't have an unnamed constant constructor.
 }
-''',
-      [
-        error(
-          diag.constWithUndefinedConstructorDefault,
-          49,
-          6,
-          messageContains: ["'lib1.A'"],
-        ),
-      ],
-    );
+''');
   }
 
   test_enum_notConstructor_constant() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 void f() {
   const E.v();
+//        ^
+// [diag.constWithUndefinedConstructor] The class 'E' doesn't have a constant constructor 'v'.
 }
 
 enum E {
   v
 }
-''',
-      [error(diag.constWithUndefinedConstructor, 21, 1)],
-    );
+''');
   }
 
   test_enum_notConstructor_method() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 void f() {
   const E.foo();
+//        ^^^
+// [diag.constWithUndefinedConstructor] The class 'E' doesn't have a constant constructor 'foo'.
 }
 
 enum E {
@@ -145,23 +108,20 @@
   
   void foo() {}
 }
-''',
-      [error(diag.constWithUndefinedConstructor, 21, 3)],
-    );
+''');
   }
 
   test_enum_unresolved() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 void f() {
   const E.foo();
+//        ^^^
+// [diag.constWithUndefinedConstructor] The class 'E' doesn't have a constant constructor 'foo'.
 }
 
 enum E {
   v
 }
-''',
-      [error(diag.constWithUndefinedConstructor, 21, 3)],
-    );
+''');
   }
 }
diff --git a/pkg/analyzer/test/src/diagnostics/constant_pattern_never_matches_value_type_test.dart b/pkg/analyzer/test/src/diagnostics/constant_pattern_never_matches_value_type_test.dart
index c1cbad8..cc4bbd0 100644
--- a/pkg/analyzer/test/src/diagnostics/constant_pattern_never_matches_value_type_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/constant_pattern_never_matches_value_type_test.dart
@@ -2,7 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/src/diagnostic/diagnostic.dart' as diag;
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../dart/resolution/context_collection_resolution.dart';
@@ -17,7 +16,7 @@
 class ConstantPatternNeverMatchesValueTypeTest
     extends PubPackageResolutionTest {
   test_bool_bool() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 void f(bool x) {
   if (x case (true)) {}
 }
@@ -25,29 +24,27 @@
   }
 
   test_bool_int() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 void f(int x) {
   if (x case (true)) {}
+//            ^^^^
+// [diag.constantPatternNeverMatchesValueType] The matched value type 'int' can never be equal to this constant of type 'bool'.
 }
-''',
-      [error(diag.constantPatternNeverMatchesValueType, 30, 4)],
-    );
+''');
   }
 
   test_bool_ListOfBool() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 void f(List<bool> x) {
   if (x case (true)) {}
+//            ^^^^
+// [diag.constantPatternNeverMatchesValueType] The matched value type 'List<bool>' can never be equal to this constant of type 'bool'.
 }
-''',
-      [error(diag.constantPatternNeverMatchesValueType, 37, 4)],
-    );
+''');
   }
 
   test_bool_typeParameter_bound_bool() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 void f<T extends bool>(T x) {
   if (x case (true)) {}
 }
@@ -55,7 +52,7 @@
   }
 
   test_bool_typeParameter_bound_bool_nested() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 void f<T extends bool>(List<T> x) {
   if (x case [true]) {}
 }
@@ -63,29 +60,27 @@
   }
 
   test_bool_typeParameter_bound_num() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 void f<T extends num>(T x) {
   if (x case (true)) {}
+//            ^^^^
+// [diag.constantPatternNeverMatchesValueType] The matched value type 'T' can never be equal to this constant of type 'bool'.
 }
-''',
-      [error(diag.constantPatternNeverMatchesValueType, 43, 4)],
-    );
+''');
   }
 
   test_bool_typeParameter_bound_num_nested() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 void f<T extends num>(List<T> x) {
   if (x case [true]) {}
+//            ^^^^
+// [diag.constantPatternNeverMatchesValueType] The matched value type 'T' can never be equal to this constant of type 'bool'.
 }
-''',
-      [error(diag.constantPatternNeverMatchesValueType, 49, 4)],
-    );
+''');
   }
 
   test_bool_typeParameter_promoted_bool() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 void f<T>(T x) {
   if (x is bool) {
     if (x case (true)) {}
@@ -95,20 +90,19 @@
   }
 
   test_bool_typeParameter_promoted_int() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 void f<T>(T x) {
   if (x is int) {
     if (x case (true)) {}
+//              ^^^^
+// [diag.constantPatternNeverMatchesValueType] The matched value type 'T & int' can never be equal to this constant of type 'bool'.
   }
 }
-''',
-      [error(diag.constantPatternNeverMatchesValueType, 51, 4)],
-    );
+''');
   }
 
   test_custom_notPrimitiveEquality_constantIsSubtypeOfValue() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 void f(A x) {
   if (x case const B()) {}
 }
@@ -125,7 +119,7 @@
   }
 
   test_custom_notPrimitiveEquality_constantIsSupertypeOfValue() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 void f(B x) {
   if (x case const A()) {}
 }
@@ -142,7 +136,7 @@
   }
 
   test_custom_primitiveEquality_constantIsSameTypeAsValue() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 void f(A x) {
   if (x case const A()) {}
 }
@@ -154,7 +148,7 @@
   }
 
   test_custom_primitiveEquality_constantIsSubtypeOfValue() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 void f(A x) {
   if (x case const B()) {}
 }
@@ -170,10 +164,11 @@
   }
 
   test_custom_primitiveEquality_constantIsSupertypeOfValue() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 void f(B x) {
   if (x case const A()) {}
+//           ^^^^^^^^^
+// [diag.constantPatternNeverMatchesValueType] The matched value type 'B' can never be equal to this constant of type 'A'.
 }
 
 class A {
@@ -183,13 +178,11 @@
 class B extends A {
   const B();
 }
-''',
-      [error(diag.constantPatternNeverMatchesValueType, 27, 9)],
-    );
+''');
   }
 
   test_custom_primitiveEquality_generic_differentElement_constantIsSubtypeOfValue() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 void f(A<int> x) {
   if (x case const B()) {}
 }
@@ -205,10 +198,11 @@
   }
 
   test_custom_primitiveEquality_generic_differentElement_constantIsSupertypeOfValue() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 void f(B x) {
   if (x case const A<int>()) {}
+//           ^^^^^^^^^^^^^^
+// [diag.constantPatternNeverMatchesValueType] The matched value type 'B' can never be equal to this constant of type 'A<int>'.
 }
 
 class A<T> {
@@ -218,13 +212,11 @@
 class B extends A<int> {
   const B();
 }
-''',
-      [error(diag.constantPatternNeverMatchesValueType, 27, 14)],
-    );
+''');
   }
 
   test_custom_primitiveEquality_generic_sameElement_constantIsSameTypeAsValue() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 void f(A<int> x) {
   if (x case const A<int>()) {}
 }
@@ -236,7 +228,7 @@
   }
 
   test_custom_primitiveEquality_generic_sameElement_constantIsSubtypeOfValue() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 void f(A<num> x) {
   if (x case const A<int>()) {}
 }
@@ -248,22 +240,21 @@
   }
 
   test_custom_primitiveEquality_generic_sameElement_constantIsSupertypeOfValue() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 void f(A<int> x) {
   if (x case const A<num>()) {}
+//           ^^^^^^^^^^^^^^
+// [diag.constantPatternNeverMatchesValueType] The matched value type 'A<int>' can never be equal to this constant of type 'A<num>'.
 }
 
 class A<T> {
   const A();
 }
-''',
-      [error(diag.constantPatternNeverMatchesValueType, 32, 14)],
-    );
+''');
   }
 
   test_custom_primitiveEquality_generic_sameElement_typeParameter() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 void f<T>(A<T> x) {
   if (x case const A<int>()) {}
 }
@@ -275,7 +266,7 @@
   }
 
   test_custom_primitiveEquality_generic_sameElement_typeParameter_contravariant() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 void f<T>(A<void Function(T)> x) {
   if (x case const A<void Function(int)>()) {}
 }
@@ -287,18 +278,17 @@
   }
 
   test_int_bool() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 void f(bool x) {
   if (x case (0)) {}
+//            ^
+// [diag.constantPatternNeverMatchesValueType] The matched value type 'bool' can never be equal to this constant of type 'int'.
 }
-''',
-      [error(diag.constantPatternNeverMatchesValueType, 31, 1)],
-    );
+''');
   }
 
   test_int_double() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 void f(double x) {
   if (x case (zero)) {}
 }
@@ -308,20 +298,19 @@
   }
 
   test_int_extensionTypeBool() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 extension type E(bool it) {}
 
 void f(E x) {
   if (x case (0)) {}
+//            ^
+// [diag.constantPatternNeverMatchesValueType] The matched value type 'bool' can never be equal to this constant of type 'int'.
 }
-''',
-      [error(diag.constantPatternNeverMatchesValueType, 58, 1)],
-    );
+''');
   }
 
   test_int_extensionTypeInt() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 extension type E(int it) {}
 
 void f(E x) {
@@ -331,20 +320,19 @@
   }
 
   test_int_functionType() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 void f(void Function() x) {
   if (x case (0)) {}
+//            ^
+// [diag.constantPatternNeverMatchesValueType] The matched value type 'void Function()' can never be equal to this constant of type 'int'.
 }
 
 class A {}
-''',
-      [error(diag.constantPatternNeverMatchesValueType, 42, 1)],
-    );
+''');
   }
 
   test_int_int() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 void f(int x) {
   if (x case (0)) {}
 }
@@ -352,7 +340,7 @@
   }
 
   test_int_intQuestion() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 void f(int? x) {
   if (x case (0)) {}
 }
@@ -360,7 +348,7 @@
   }
 
   test_int_num() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 void f(num x) {
   if (x case (0)) {}
 }
@@ -368,58 +356,53 @@
   }
 
   test_int_otherClass() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 void f(A x) {
   if (x case (0)) {}
+//            ^
+// [diag.constantPatternNeverMatchesValueType] The matched value type 'A' can never be equal to this constant of type 'int'.
 }
 
 class A {}
-''',
-      [error(diag.constantPatternNeverMatchesValueType, 28, 1)],
-    );
+''');
   }
 
   test_int_recordType() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 void f((int, int) x) {
   if (x case 0) {}
+//           ^
+// [diag.constantPatternNeverMatchesValueType] The matched value type '(int, int)' can never be equal to this constant of type 'int'.
 }
 
 class A {}
-''',
-      [error(diag.constantPatternNeverMatchesValueType, 36, 1)],
-    );
+''');
   }
 
   test_int_String() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 void f(String x) {
   if (x case (0)) {}
+//            ^
+// [diag.constantPatternNeverMatchesValueType] The matched value type 'String' can never be equal to this constant of type 'int'.
 }
-''',
-      [error(diag.constantPatternNeverMatchesValueType, 33, 1)],
-    );
+''');
   }
 
   test_Null_functionType() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 void f(void Function() x) {
   if (x case null) {}
+//           ^^^^
+// [diag.constantPatternNeverMatchesValueType] The matched value type 'void Function()' can never be equal to this constant of type 'Null'.
+//                 ^^
+// [diag.deadCode] Dead code.
 }
-''',
-      [
-        error(diag.constantPatternNeverMatchesValueType, 41, 4),
-        error(diag.deadCode, 47, 2),
-      ],
-    );
+''');
   }
 
   test_Null_functionTypeQuestion() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 void f(void Function()? x) {
   if (x case null) {}
 }
@@ -427,21 +410,19 @@
   }
 
   test_Null_int() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 void f(int x) {
   if (x case null) {}
+//           ^^^^
+// [diag.constantPatternNeverMatchesValueType] The matched value type 'int' can never be equal to this constant of type 'Null'.
+//                 ^^
+// [diag.deadCode] Dead code.
 }
-''',
-      [
-        error(diag.constantPatternNeverMatchesValueType, 29, 4),
-        error(diag.deadCode, 35, 2),
-      ],
-    );
+''');
   }
 
   test_Null_intQuestion() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 void f(int? x) {
   if (x case null) {}
 }
@@ -449,21 +430,19 @@
   }
 
   test_Null_recordType() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 void f((int, int) x) {
   if (x case null) {}
+//           ^^^^
+// [diag.constantPatternNeverMatchesValueType] The matched value type '(int, int)' can never be equal to this constant of type 'Null'.
+//                 ^^
+// [diag.deadCode] Dead code.
 }
-''',
-      [
-        error(diag.constantPatternNeverMatchesValueType, 36, 4),
-        error(diag.deadCode, 42, 2),
-      ],
-    );
+''');
   }
 
   test_Null_recordTypeQuestion() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 void f((int, int)? x) {
   if (x case null) {}
 }
@@ -471,21 +450,19 @@
   }
 
   test_Null_typeParameterType_notNullableBound() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 void f<T extends Object>(T x) {
   if (x case null) {}
+//           ^^^^
+// [diag.constantPatternNeverMatchesValueType] The matched value type 'T' can never be equal to this constant of type 'Null'.
+//                 ^^
+// [diag.deadCode] Dead code.
 }
-''',
-      [
-        error(diag.constantPatternNeverMatchesValueType, 45, 4),
-        error(diag.deadCode, 51, 2),
-      ],
-    );
+''');
   }
 
   test_Null_typeParameterType_notNullableBound_question() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 void f<T extends Object>(T? x) {
   if (x case null) {}
 }
@@ -493,7 +470,7 @@
   }
 
   test_Null_typeParameterType_nullableBound() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 void f<T>(T x) {
   if (x case null) {}
 }
@@ -501,7 +478,7 @@
   }
 
   test_Null_typeParameterType_nullableBound_question() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 void f<T>(T? x) {
   if (x case null) {}
 }
diff --git a/pkg/analyzer/test/src/diagnostics/constant_pattern_with_non_constant_expression_test.dart b/pkg/analyzer/test/src/diagnostics/constant_pattern_with_non_constant_expression_test.dart
index c36f462..3173982 100644
--- a/pkg/analyzer/test/src/diagnostics/constant_pattern_with_non_constant_expression_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/constant_pattern_with_non_constant_expression_test.dart
@@ -2,7 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/src/diagnostic/diagnostic.dart' as diag;
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../dart/resolution/context_collection_resolution.dart';
@@ -17,7 +16,7 @@
 class ConstantPatternWithNonConstantExpressionTest
     extends PubPackageResolutionTest {
   test_boolLiteral() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 void f(x) {
   if (x case true) {}
 }
@@ -35,7 +34,7 @@
   }
 
   test_class_field_const() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   static const a = 0;
 }
@@ -66,22 +65,21 @@
   }
 
   test_class_field_notConst() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   static final a = 0;
 }
 
 void f(x) {
   if (x case A.a) {}
+//           ^^^
+// [diag.constantPatternWithNonConstantExpression] The expression of a constant pattern must be a valid constant.
 }
-''',
-      [error(diag.constantPatternWithNonConstantExpression, 60, 3)],
-    );
+''');
   }
 
   test_doubleLiteral() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 void f(x) {
   if (x case 1.2) {}
 }
@@ -105,7 +103,7 @@
 }
 ''');
 
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'a.dart' as prefix;
 
 void f(x) {
@@ -147,7 +145,7 @@
 }
 ''');
 
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'a.dart' as prefix;
 
 void f(x) {
@@ -183,7 +181,7 @@
   }
 
   test_instanceCreation_const() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   const A();
 }
@@ -214,7 +212,7 @@
   }
 
   test_intLiteral() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 void f(x) {
   if (x case 0) {}
 }
@@ -232,7 +230,7 @@
   }
 
   test_listLiteral_element_intLiteral() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 void f(x) {
   if (x case const [0]) {}
 }
@@ -256,7 +254,7 @@
   }
 
   test_listLiteral_element_localVariable_const() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 void f(x) {
   const a = 0;
   if (x case const [a]) {}
@@ -282,19 +280,18 @@
   }
 
   test_listLiteral_element_localVariable_notConst() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 void f(x) {
   final a = 0;
   if (x case const [a]) {}
+//                  ^
+// [diag.constantPatternWithNonConstantExpression] The expression of a constant pattern must be a valid constant.
 }
-''',
-      [error(diag.constantPatternWithNonConstantExpression, 47, 1)],
-    );
+''');
   }
 
   test_localVariable_const() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 void f(x) {
   const a = 0;
   if (x case a) {}
@@ -314,19 +311,18 @@
   }
 
   test_localVariable_notConst() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 void f(x) {
   var a = 0;
   if (x case a) {}
+//           ^
+// [diag.constantPatternWithNonConstantExpression] The expression of a constant pattern must be a valid constant.
 }
-''',
-      [error(diag.constantPatternWithNonConstantExpression, 38, 1)],
-    );
+''');
   }
 
   test_mapLiteral_entries_intLiteral_intLiteral() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 void f(x) {
   if (x case const {0: 1}) {}
 }
@@ -356,7 +352,7 @@
   }
 
   test_mapLiteral_entries_key_localVariable_const() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 void f(x) {
   const a = 0;
   if (x case const {a: 1}) {}
@@ -388,19 +384,18 @@
   }
 
   test_mapLiteral_entries_key_localVariable_notConst() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 void f(x) {
   final a = 0;
   if (x case const {a: 1}) {}
+//                  ^
+// [diag.constantPatternWithNonConstantExpression] The expression of a constant pattern must be a valid constant.
 }
-''',
-      [error(diag.constantPatternWithNonConstantExpression, 47, 1)],
-    );
+''');
   }
 
   test_mapLiteral_entries_value_localVariable_const() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 void f(x) {
   const a = 0;
   if (x case const {0: a}) {}
@@ -432,19 +427,18 @@
   }
 
   test_mapLiteral_entries_value_localVariable_notConst() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 void f(x) {
   final a = 0;
   if (x case const {0: a}) {}
+//                     ^
+// [diag.constantPatternWithNonConstantExpression] The expression of a constant pattern must be a valid constant.
 }
-''',
-      [error(diag.constantPatternWithNonConstantExpression, 50, 1)],
-    );
+''');
   }
 
   test_setLiteral_element_intLiteral() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 void f(x) {
   if (x case const {0}) {}
 }
@@ -469,7 +463,7 @@
   }
 
   test_setLiteral_element_localVariable_const() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 void f(x) {
   const a = 0;
   if (x case const {a}) {}
@@ -496,21 +490,20 @@
   }
 
   test_switch_constPattern_parameter() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 void f(e, int a) {
   switch (e) {
     case const (3 + a):
+//                  ^
+// [diag.constantPatternWithNonConstantExpression] The expression of a constant pattern must be a valid constant.
       break;
   }
 }
-''',
-      [error(diag.constantPatternWithNonConstantExpression, 54, 1)],
-    );
+''');
   }
 
   test_topLevelVariable_const() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 const a = 0;
 
 void f(x) {
@@ -531,16 +524,15 @@
   }
 
   test_topLevelVariable_notConst() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 final a = 0;
 
 void f(x) {
   if (x case a) {}
+//           ^
+// [diag.constantPatternWithNonConstantExpression] The expression of a constant pattern must be a valid constant.
 }
-''',
-      [error(diag.constantPatternWithNonConstantExpression, 39, 1)],
-    );
+''');
 
     var node = findNode.singleGuardedPattern;
     assertResolvedNodeText(node, r'''
@@ -555,14 +547,13 @@
   }
 
   test_unresolvedIdentifier() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 void f(Object? x) {
   if (x case foo) {}
+//           ^^^
+// [diag.undefinedIdentifier] Undefined name 'foo'.
 }
-''',
-      [error(diag.undefinedIdentifier, 33, 3)],
-    );
+''');
 
     var node = findNode.singleGuardedPattern;
     assertResolvedNodeText(node, r'''
diff --git a/pkg/analyzer/test/src/diagnostics/constructor_body_test.dart b/pkg/analyzer/test/src/diagnostics/constructor_body_test.dart
index cbd26b8..162e921 100644
--- a/pkg/analyzer/test/src/diagnostics/constructor_body_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/constructor_body_test.dart
@@ -2,7 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/src/diagnostic/diagnostic.dart' as diag;
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../dart/resolution/context_collection_resolution.dart';
@@ -16,18 +15,17 @@
 @reflectiveTest
 class ConstructorBodyTest extends PubPackageResolutionTest {
   test_class_primaryConstructor_const_blockBody() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class const C() {
   this {}
+//     ^
+// [diag.constPrimaryConstructorWithBlockBody] The body part of a constant primary constructor can't have a block body.
 }
-''',
-      [error(diag.constPrimaryConstructorWithBlockBody, 25, 1)],
-    );
+''');
   }
 
   test_class_primaryConstructor_const_emptyBody() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class const C() {
   this;
 }
@@ -35,7 +33,7 @@
   }
 
   test_class_primaryConstructor_const_emptyBody_hasAssert() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class const C() {
   this : assert(true);
 }
@@ -43,121 +41,112 @@
   }
 
   test_class_primaryConstructor_const_expressionBody() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class const C() {
   this => null;
+//     ^^
+// [diag.constPrimaryConstructorWithExpressionBody] The body part of a constant primary constructor can't have an expression body.
 }
-''',
-      [error(diag.constPrimaryConstructorWithExpressionBody, 25, 2)],
-    );
+''');
   }
 
   test_class_primaryConstructor_const_noBody() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class const C() {}
 ''');
   }
 
   test_class_primaryConstructor_expressionBody() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A() {
   this => 0;
+//     ^^
+// [diag.primaryConstructorBodyWithExpressionBody] A primary constructor body can't use '=>'.
 }
-''',
-      [error(diag.primaryConstructorBodyWithExpressionBody, 19, 2)],
-    );
+''');
   }
 
   test_class_primaryConstructor_modifier_async() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A() {
   this async {}
+//     ^^^^^
+// [diag.primaryConstructorBodyWithModifier] A primary constructor body can't have the modifier 'async'.
 }
-''',
-      [error(diag.primaryConstructorBodyWithModifier, 19, 5)],
-    );
+''');
   }
 
   test_class_primaryConstructor_modifier_asyncStar() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A() {
   this async* {}
+//     ^^^^^
+// [diag.primaryConstructorBodyWithModifier] A primary constructor body can't have the modifier 'async*'.
 }
-''',
-      [error(diag.primaryConstructorBodyWithModifier, 19, 5)],
-    );
+''');
   }
 
   test_class_primaryConstructor_modifier_syncStar() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A() {
   this sync* {}
+//     ^^^^
+// [diag.primaryConstructorBodyWithModifier] A primary constructor body can't have the modifier 'sync*'.
 }
-''',
-      [error(diag.primaryConstructorBodyWithModifier, 19, 4)],
-    );
+''');
   }
 
   test_class_secondaryConstructor_constFactory_blockBody() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class C {
   const C();
   const factory C.named() {
+//^^^^^
+// [diag.constFactory] Only redirecting factory constructors can be declared to be 'const'.
     return const C();
   }
 }
-''',
-      [error(diag.constFactory, 25, 5)],
-    );
+''');
   }
 
   test_class_secondaryConstructor_constFactory_emptyBody() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class C {
   const factory C();
+//^^^^^
+// [diag.constFactory] Only redirecting factory constructors can be declared to be 'const'.
+//                 ^
+// [diag.missingFunctionBody] A function body must be provided.
 }
-''',
-      [error(diag.constFactory, 12, 5), error(diag.missingFunctionBody, 29, 1)],
-    );
+''');
   }
 
   test_class_secondaryConstructor_constFactory_expressionBody() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class C {
   const factory C() => null;
+//^^^^^
+// [diag.constFactory] Only redirecting factory constructors can be declared to be 'const'.
+//                     ^^^^
+// [diag.returnOfInvalidTypeFromConstructor] A value of type 'Null' can't be returned from the constructor 'C' because it has a return type of 'C'.
 }
-''',
-      [
-        error(diag.constFactory, 12, 5),
-        error(diag.returnOfInvalidTypeFromConstructor, 33, 4),
-      ],
-    );
+''');
   }
 
   test_class_secondaryConstructor_constFactory_external_blockBody() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class C {
   external const factory C() {}
+//                       ^
+// [diag.bodyMightCompleteNormally] The body might complete normally, causing 'null' to be returned, but the return type, 'C', is a potentially non-nullable type.
+//                           ^
+// [diag.externalFactoryWithBody] External factories can't have a body.
 }
-''',
-      [
-        error(diag.bodyMightCompleteNormally, 35, 1),
-        error(diag.externalFactoryWithBody, 39, 1),
-      ],
-    );
+''');
   }
 
   test_class_secondaryConstructor_constFactory_external_emptyBody() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class C {
   external const factory C();
 }
@@ -165,21 +154,19 @@
   }
 
   test_class_secondaryConstructor_constFactory_external_expressionBody() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class C {
   external const factory C() => null;
+//                           ^^
+// [diag.externalFactoryWithBody] External factories can't have a body.
+//                              ^^^^
+// [diag.returnOfInvalidTypeFromConstructor] A value of type 'Null' can't be returned from the constructor 'C' because it has a return type of 'C'.
 }
-''',
-      [
-        error(diag.externalFactoryWithBody, 39, 2),
-        error(diag.returnOfInvalidTypeFromConstructor, 42, 4),
-      ],
-    );
+''');
   }
 
   test_class_secondaryConstructor_constFactory_redirecting() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class C {
   const C();
   const factory C.named() = C;
@@ -188,29 +175,27 @@
   }
 
   test_class_secondaryConstructor_constFactory_redirecting_unresolved() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class C {
   const factory C.named() = Unresolved;
+//                          ^^^^^^^^^^
+// [diag.redirectToNonClass] The name 'Unresolved' isn't a type and can't be used in a redirected constructor.
 }
-''',
-      [error(diag.redirectToNonClass, 38, 10)],
-    );
+''');
   }
 
   test_class_secondaryConstructor_constGenerative_blockBody() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class C {
   const C() {}
+//          ^
+// [diag.constConstructorWithBody] Const constructors can't have a body.
 }
-''',
-      [error(diag.constConstructorWithBody, 22, 1)],
-    );
+''');
   }
 
   test_class_secondaryConstructor_constGenerative_emptyBody() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class C {
   const C();
 }
@@ -218,7 +203,7 @@
   }
 
   test_class_secondaryConstructor_constGenerative_emptyBody_hasAssert() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class C {
   const C() : assert(true);
 }
@@ -226,36 +211,31 @@
   }
 
   test_class_secondaryConstructor_constGenerative_expressionBody() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class C {
   const C();
   const C.named() => C();
+//                ^^
+// [diag.constConstructorWithBody] Const constructors can't have a body.
+//                ^^^^^^^
+// [diag.returnInGenerativeConstructor] Constructors can't return values.
 }
-''',
-      [
-        error(diag.constConstructorWithBody, 41, 2),
-        error(diag.returnInGenerativeConstructor, 41, 7),
-      ],
-    );
+''');
   }
 
   test_class_secondaryConstructor_constGenerative_external_blockBody() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class C {
   external const C() {}
+//                   ^
+// [diag.externalMethodWithBody] An external or native method can't have a body.
+// [diag.constConstructorWithBody] Const constructors can't have a body.
 }
-''',
-      [
-        error(diag.externalMethodWithBody, 31, 1),
-        error(diag.constConstructorWithBody, 31, 1),
-      ],
-    );
+''');
   }
 
   test_class_secondaryConstructor_constGenerative_external_emptyBody() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class C {
   external const C();
 }
@@ -263,38 +243,34 @@
   }
 
   test_class_secondaryConstructor_constGenerative_external_expressionBody() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class C {
   external const C() => null;
+//                   ^^
+// [diag.externalMethodWithBody] An external or native method can't have a body.
+// [diag.constConstructorWithBody] Const constructors can't have a body.
+//                   ^^^^^^^^
+// [diag.returnInGenerativeConstructor] Constructors can't return values.
+//                      ^^^^
+// [diag.returnOfInvalidTypeFromConstructor] A value of type 'Null' can't be returned from the constructor 'C' because it has a return type of 'C'.
 }
-''',
-      [
-        error(diag.externalMethodWithBody, 31, 2),
-        error(diag.constConstructorWithBody, 31, 2),
-        error(diag.returnInGenerativeConstructor, 31, 8),
-        error(diag.returnOfInvalidTypeFromConstructor, 34, 4),
-      ],
-    );
+''');
   }
 
   test_class_secondaryConstructor_constGenerativeRedirecting_blockBody() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class C {
   const C();
   const C.named() : this() {}
+//                         ^
+// [diag.redirectingConstructorWithBody] Redirecting constructors can't have a body.
+// [diag.constConstructorWithBody] Const constructors can't have a body.
 }
-''',
-      [
-        error(diag.redirectingConstructorWithBody, 50, 1),
-        error(diag.constConstructorWithBody, 50, 1),
-      ],
-    );
+''');
   }
 
   test_class_secondaryConstructor_constGenerativeRedirecting_emptyBody() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class C {
   const C();
   const C.named() : this();
@@ -303,38 +279,35 @@
   }
 
   test_class_secondaryConstructor_constGenerativeRedirecting_expressionBody() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class C {
   const C();
   const C.named() : this() => null;
+//                         ^^
+// [diag.redirectingConstructorWithBody] Redirecting constructors can't have a body.
+// [diag.constConstructorWithBody] Const constructors can't have a body.
+//                         ^^^^^^^^
+// [diag.returnInGenerativeConstructor] Constructors can't return values.
+//                            ^^^^
+// [diag.returnOfInvalidTypeFromConstructor] A value of type 'Null' can't be returned from the constructor 'C.named' because it has a return type of 'C'.
 }
-''',
-      [
-        error(diag.redirectingConstructorWithBody, 50, 2),
-        error(diag.constConstructorWithBody, 50, 2),
-        error(diag.returnInGenerativeConstructor, 50, 8),
-        error(diag.returnOfInvalidTypeFromConstructor, 53, 4),
-      ],
-    );
+''');
   }
 
   test_class_secondaryConstructor_factory_external_blockBody() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class C {
   external factory C() {}
+//                 ^
+// [diag.bodyMightCompleteNormally] The body might complete normally, causing 'null' to be returned, but the return type, 'C', is a potentially non-nullable type.
+//                     ^
+// [diag.externalFactoryWithBody] External factories can't have a body.
 }
-''',
-      [
-        error(diag.bodyMightCompleteNormally, 29, 1),
-        error(diag.externalFactoryWithBody, 33, 1),
-      ],
-    );
+''');
   }
 
   test_class_secondaryConstructor_factory_external_emptyBody() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class C {
   external factory C();
 }
@@ -342,32 +315,29 @@
   }
 
   test_class_secondaryConstructor_factory_external_expressionBody() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class C {
   external factory C() => null;
+//                     ^^
+// [diag.externalFactoryWithBody] External factories can't have a body.
+//                        ^^^^
+// [diag.returnOfInvalidTypeFromConstructor] A value of type 'Null' can't be returned from the constructor 'C' because it has a return type of 'C'.
 }
-''',
-      [
-        error(diag.externalFactoryWithBody, 33, 2),
-        error(diag.returnOfInvalidTypeFromConstructor, 36, 4),
-      ],
-    );
+''');
   }
 
   test_class_secondaryConstructor_generative_external_blockBody() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class C {
   external C() {}
+//             ^
+// [diag.externalMethodWithBody] An external or native method can't have a body.
 }
-''',
-      [error(diag.externalMethodWithBody, 25, 1)],
-    );
+''');
   }
 
   test_class_secondaryConstructor_generative_external_emptyBody() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class C {
   external C();
 }
@@ -375,34 +345,32 @@
   }
 
   test_class_secondaryConstructor_generative_external_expressionBody() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class C {
   external C() => null;
+//             ^^
+// [diag.externalMethodWithBody] An external or native method can't have a body.
+//             ^^^^^^^^
+// [diag.returnInGenerativeConstructor] Constructors can't return values.
+//                ^^^^
+// [diag.returnOfInvalidTypeFromConstructor] A value of type 'Null' can't be returned from the constructor 'C' because it has a return type of 'C'.
 }
-''',
-      [
-        error(diag.externalMethodWithBody, 25, 2),
-        error(diag.returnInGenerativeConstructor, 25, 8),
-        error(diag.returnOfInvalidTypeFromConstructor, 28, 4),
-      ],
-    );
+''');
   }
 
   test_enum_primaryConstructor_const_blockBody() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 enum const E() {
   v;
   this {}
+//     ^
+// [diag.constPrimaryConstructorWithBlockBody] The body part of a constant primary constructor can't have a block body.
 }
-''',
-      [error(diag.constPrimaryConstructorWithBlockBody, 29, 1)],
-    );
+''');
   }
 
   test_enum_primaryConstructor_const_emptyBody() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 enum const E() {
   v;
   this;
@@ -411,7 +379,7 @@
   }
 
   test_enum_primaryConstructor_const_emptyBody_hasAssert() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 enum const E() {
   v;
   this : assert(true);
@@ -420,19 +388,18 @@
   }
 
   test_enum_primaryConstructor_const_expressionBody() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 enum const E() {
   v;
   this => null;
+//     ^^
+// [diag.constPrimaryConstructorWithExpressionBody] The body part of a constant primary constructor can't have an expression body.
 }
-''',
-      [error(diag.constPrimaryConstructorWithExpressionBody, 29, 2)],
-    );
+''');
   }
 
   test_enum_primaryConstructor_const_noBody() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 enum const E() {
   v;
 }
@@ -440,124 +407,113 @@
   }
 
   test_enum_primaryConstructor_expressionBody() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 enum E() {
   v;
   this => 0;
+//     ^^
+// [diag.constPrimaryConstructorWithExpressionBody] The body part of a constant primary constructor can't have an expression body.
 }
-''',
-      [error(diag.constPrimaryConstructorWithExpressionBody, 23, 2)],
-    );
+''');
   }
 
   test_enum_primaryConstructor_modifier_async() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 enum E() {
   v;
   this async {}
+//     ^^^^^
+// [diag.primaryConstructorBodyWithModifier] A primary constructor body can't have the modifier 'async'.
+//           ^
+// [diag.constPrimaryConstructorWithBlockBody] The body part of a constant primary constructor can't have a block body.
 }
-''',
-      [
-        error(diag.primaryConstructorBodyWithModifier, 23, 5),
-        error(diag.constPrimaryConstructorWithBlockBody, 29, 1),
-      ],
-    );
+''');
   }
 
   test_enum_primaryConstructor_modifier_asyncStar() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 enum E() {
   v;
   this async* {}
+//     ^^^^^
+// [diag.primaryConstructorBodyWithModifier] A primary constructor body can't have the modifier 'async*'.
+//            ^
+// [diag.constPrimaryConstructorWithBlockBody] The body part of a constant primary constructor can't have a block body.
 }
-''',
-      [
-        error(diag.primaryConstructorBodyWithModifier, 23, 5),
-        error(diag.constPrimaryConstructorWithBlockBody, 30, 1),
-      ],
-    );
+''');
   }
 
   test_enum_primaryConstructor_modifier_syncStar() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 enum E() {
   v;
   this sync* {}
+//     ^^^^
+// [diag.primaryConstructorBodyWithModifier] A primary constructor body can't have the modifier 'sync*'.
+//           ^
+// [diag.constPrimaryConstructorWithBlockBody] The body part of a constant primary constructor can't have a block body.
 }
-''',
-      [
-        error(diag.primaryConstructorBodyWithModifier, 23, 4),
-        error(diag.constPrimaryConstructorWithBlockBody, 29, 1),
-      ],
-    );
+''');
   }
 
   test_enum_secondaryConstructor_constFactory_blockBody() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 enum E {
   v;
   const E();
   const factory E.named() {
+//^^^^^
+// [diag.constFactory] Only redirecting factory constructors can be declared to be 'const'.
     return v;
   }
 }
-''',
-      [error(diag.constFactory, 29, 5)],
-    );
+''');
   }
 
   test_enum_secondaryConstructor_constFactory_emptyBody() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 enum E {
   v;
   const E();
   const factory E.named();
+//^^^^^
+// [diag.constFactory] Only redirecting factory constructors can be declared to be 'const'.
+//                       ^
+// [diag.missingFunctionBody] A function body must be provided.
 }
-''',
-      [error(diag.constFactory, 29, 5), error(diag.missingFunctionBody, 52, 1)],
-    );
+''');
   }
 
   test_enum_secondaryConstructor_constFactory_expressionBody() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 enum E {
   v;
   const E();
   const factory E.named() => null;
+//^^^^^
+// [diag.constFactory] Only redirecting factory constructors can be declared to be 'const'.
+//                           ^^^^
+// [diag.returnOfInvalidTypeFromConstructor] A value of type 'Null' can't be returned from the constructor 'E.named' because it has a return type of 'E'.
 }
-''',
-      [
-        error(diag.constFactory, 29, 5),
-        error(diag.returnOfInvalidTypeFromConstructor, 56, 4),
-      ],
-    );
+''');
   }
 
   test_enum_secondaryConstructor_constFactory_external_blockBody() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 enum E {
   v;
   const E();
   external const factory E.named() {}
+//                       ^^^^^^^
+// [diag.bodyMightCompleteNormally] The body might complete normally, causing 'null' to be returned, but the return type, 'E', is a potentially non-nullable type.
+//                                 ^
+// [diag.externalFactoryWithBody] External factories can't have a body.
 }
-''',
-      [
-        error(diag.bodyMightCompleteNormally, 52, 7),
-        error(diag.externalFactoryWithBody, 62, 1),
-      ],
-    );
+''');
   }
 
   test_enum_secondaryConstructor_constFactory_external_emptyBody() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 enum E {
   v;
   const E();
@@ -567,48 +523,44 @@
   }
 
   test_enum_secondaryConstructor_constFactory_external_expressionBody() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 enum E {
   v;
   const E();
   external const factory E.named() => null;
+//                                 ^^
+// [diag.externalFactoryWithBody] External factories can't have a body.
+//                                    ^^^^
+// [diag.returnOfInvalidTypeFromConstructor] A value of type 'Null' can't be returned from the constructor 'E.named' because it has a return type of 'E'.
 }
-''',
-      [
-        error(diag.externalFactoryWithBody, 62, 2),
-        error(diag.returnOfInvalidTypeFromConstructor, 65, 4),
-      ],
-    );
+''');
   }
 
   test_enum_secondaryConstructor_constFactory_redirecting() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 enum E {
   v;
   const E();
   const factory E.named() = E;
+//                          ^
+// [diag.invalidReferenceToGenerativeEnumConstructor] Generative enum constructors can only be used to create an enum constant.
 }
-''',
-      [error(diag.invalidReferenceToGenerativeEnumConstructor, 55, 1)],
-    );
+''');
   }
 
   test_enum_secondaryConstructor_constGenerative_blockBody() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 enum E {
   v;
   const E() {}
+//          ^
+// [diag.constConstructorWithBody] Const constructors can't have a body.
 }
-''',
-      [error(diag.constConstructorWithBody, 26, 1)],
-    );
+''');
   }
 
   test_enum_secondaryConstructor_constGenerative_emptyBody() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 enum E {
   v;
   const E();
@@ -617,7 +569,7 @@
   }
 
   test_enum_secondaryConstructor_constGenerative_emptyBody_hasAssert() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 enum E {
   v;
   const E() : assert(true);
@@ -626,40 +578,37 @@
   }
 
   test_enum_secondaryConstructor_constGenerative_expressionBody() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 enum E {
   v;
   const E();
   const E.named() => null;
+//        ^^^^^
+// [diag.unusedElement] The declaration 'E.named' isn't referenced.
+//                ^^
+// [diag.constConstructorWithBody] Const constructors can't have a body.
+//                ^^^^^^^^
+// [diag.returnInGenerativeConstructor] Constructors can't return values.
+//                   ^^^^
+// [diag.returnOfInvalidTypeFromConstructor] A value of type 'Null' can't be returned from the constructor 'E.named' because it has a return type of 'E'.
 }
-''',
-      [
-        error(diag.unusedElement, 37, 5),
-        error(diag.constConstructorWithBody, 45, 2),
-        error(diag.returnInGenerativeConstructor, 45, 8),
-        error(diag.returnOfInvalidTypeFromConstructor, 48, 4),
-      ],
-    );
+''');
   }
 
   test_enum_secondaryConstructor_constGenerative_external_blockBody() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 enum E {
   v;
   external const E() {}
+//                   ^
+// [diag.externalMethodWithBody] An external or native method can't have a body.
+// [diag.constConstructorWithBody] Const constructors can't have a body.
 }
-''',
-      [
-        error(diag.externalMethodWithBody, 35, 1),
-        error(diag.constConstructorWithBody, 35, 1),
-      ],
-    );
+''');
   }
 
   test_enum_secondaryConstructor_constGenerative_external_emptyBody() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 enum E {
   v;
   external const E();
@@ -668,40 +617,36 @@
   }
 
   test_enum_secondaryConstructor_constGenerative_external_expressionBody() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 enum E {
   v;
   external const E() => null;
+//                   ^^
+// [diag.externalMethodWithBody] An external or native method can't have a body.
+// [diag.constConstructorWithBody] Const constructors can't have a body.
+//                   ^^^^^^^^
+// [diag.returnInGenerativeConstructor] Constructors can't return values.
+//                      ^^^^
+// [diag.returnOfInvalidTypeFromConstructor] A value of type 'Null' can't be returned from the constructor 'E' because it has a return type of 'E'.
 }
-''',
-      [
-        error(diag.externalMethodWithBody, 35, 2),
-        error(diag.constConstructorWithBody, 35, 2),
-        error(diag.returnInGenerativeConstructor, 35, 8),
-        error(diag.returnOfInvalidTypeFromConstructor, 38, 4),
-      ],
-    );
+''');
   }
 
   test_enum_secondaryConstructor_constGenerativeRedirecting_blockBody() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 enum E {
   v1, v2.named();
   const E();
   const E.named() : this() {}
+//                         ^
+// [diag.redirectingConstructorWithBody] Redirecting constructors can't have a body.
+// [diag.constConstructorWithBody] Const constructors can't have a body.
 }
-''',
-      [
-        error(diag.redirectingConstructorWithBody, 67, 1),
-        error(diag.constConstructorWithBody, 67, 1),
-      ],
-    );
+''');
   }
 
   test_enum_secondaryConstructor_constGenerativeRedirecting_emptyBody() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 enum E {
   v1, v2.named();
   const E();
@@ -711,41 +656,38 @@
   }
 
   test_enum_secondaryConstructor_constGenerativeRedirecting_expressionBody() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 enum E {
   v1, v2.named();
   const E();
   const E.named() : this() => null;
+//                         ^^
+// [diag.redirectingConstructorWithBody] Redirecting constructors can't have a body.
+// [diag.constConstructorWithBody] Const constructors can't have a body.
+//                         ^^^^^^^^
+// [diag.returnInGenerativeConstructor] Constructors can't return values.
+//                            ^^^^
+// [diag.returnOfInvalidTypeFromConstructor] A value of type 'Null' can't be returned from the constructor 'E.named' because it has a return type of 'E'.
 }
-''',
-      [
-        error(diag.redirectingConstructorWithBody, 67, 2),
-        error(diag.constConstructorWithBody, 67, 2),
-        error(diag.returnInGenerativeConstructor, 67, 8),
-        error(diag.returnOfInvalidTypeFromConstructor, 70, 4),
-      ],
-    );
+''');
   }
 
   test_enum_secondaryConstructor_factory_external_blockBody() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 enum E {
   v;
   const E();
   external factory E.named() {}
+//                 ^^^^^^^
+// [diag.bodyMightCompleteNormally] The body might complete normally, causing 'null' to be returned, but the return type, 'E', is a potentially non-nullable type.
+//                           ^
+// [diag.externalFactoryWithBody] External factories can't have a body.
 }
-''',
-      [
-        error(diag.bodyMightCompleteNormally, 46, 7),
-        error(diag.externalFactoryWithBody, 56, 1),
-      ],
-    );
+''');
   }
 
   test_enum_secondaryConstructor_factory_external_emptyBody() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 enum E {
   v;
   const E();
@@ -755,34 +697,31 @@
   }
 
   test_enum_secondaryConstructor_factory_external_expressionBody() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 enum E {
   v;
   const E();
   external factory E.named() => null;
+//                           ^^
+// [diag.externalFactoryWithBody] External factories can't have a body.
+//                              ^^^^
+// [diag.returnOfInvalidTypeFromConstructor] A value of type 'Null' can't be returned from the constructor 'E.named' because it has a return type of 'E'.
 }
-''',
-      [
-        error(diag.externalFactoryWithBody, 56, 2),
-        error(diag.returnOfInvalidTypeFromConstructor, 59, 4),
-      ],
-    );
+''');
   }
 
   test_extensionType_primaryConstructor_const_blockBody() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 extension type const E(int it) {
   this {}
+//     ^
+// [diag.constPrimaryConstructorWithBlockBody] The body part of a constant primary constructor can't have a block body.
 }
-''',
-      [error(diag.constPrimaryConstructorWithBlockBody, 40, 1)],
-    );
+''');
   }
 
   test_extensionType_primaryConstructor_const_emptyBody() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 extension type const E(int it) {
   this;
 }
@@ -790,7 +729,7 @@
   }
 
   test_extensionType_primaryConstructor_const_emptyBody_hasAssert() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 extension type const E(int it) {
   this : assert(true);
 }
@@ -798,120 +737,111 @@
   }
 
   test_extensionType_primaryConstructor_const_expressionBody() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 extension type const E(int it) {
   this => null;
+//     ^^
+// [diag.constPrimaryConstructorWithExpressionBody] The body part of a constant primary constructor can't have an expression body.
 }
-''',
-      [error(diag.constPrimaryConstructorWithExpressionBody, 40, 2)],
-    );
+''');
   }
 
   test_extensionType_primaryConstructor_const_noBody() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 extension type const E(int it) {}
 ''');
   }
 
   test_extensionType_primaryConstructor_expressionBody() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 extension type A(int x) {
   this => 0;
+//     ^^
+// [diag.primaryConstructorBodyWithExpressionBody] A primary constructor body can't use '=>'.
 }
-''',
-      [error(diag.primaryConstructorBodyWithExpressionBody, 33, 2)],
-    );
+''');
   }
 
   test_extensionType_primaryConstructor_modifier_async() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 extension type A(int x) {
   this async {}
+//     ^^^^^
+// [diag.primaryConstructorBodyWithModifier] A primary constructor body can't have the modifier 'async'.
 }
-''',
-      [error(diag.primaryConstructorBodyWithModifier, 33, 5)],
-    );
+''');
   }
 
   test_extensionType_primaryConstructor_modifier_asyncStar() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 extension type A(int x) {
   this async* {}
+//     ^^^^^
+// [diag.primaryConstructorBodyWithModifier] A primary constructor body can't have the modifier 'async*'.
 }
-''',
-      [error(diag.primaryConstructorBodyWithModifier, 33, 5)],
-    );
+''');
   }
 
   test_extensionType_primaryConstructor_modifier_syncStar() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 extension type A(int x) {
   this sync* {}
+//     ^^^^
+// [diag.primaryConstructorBodyWithModifier] A primary constructor body can't have the modifier 'sync*'.
 }
-''',
-      [error(diag.primaryConstructorBodyWithModifier, 33, 4)],
-    );
+''');
   }
 
   test_extensionType_secondaryConstructor_constFactory_blockBody() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 extension type const E(int it) {
   const factory E.named() {
+//^^^^^
+// [diag.constFactory] Only redirecting factory constructors can be declared to be 'const'.
     return const E(0);
   }
 }
-''',
-      [error(diag.constFactory, 35, 5)],
-    );
+''');
   }
 
   test_extensionType_secondaryConstructor_constFactory_emptyBody() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 extension type const E(int it) {
   const factory E.named();
+//^^^^^
+// [diag.constFactory] Only redirecting factory constructors can be declared to be 'const'.
+//                       ^
+// [diag.missingFunctionBody] A function body must be provided.
 }
-''',
-      [error(diag.constFactory, 35, 5), error(diag.missingFunctionBody, 58, 1)],
-    );
+''');
   }
 
   test_extensionType_secondaryConstructor_constFactory_expressionBody() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 extension type const E(int it) {
   const factory E.named() => null;
+//^^^^^
+// [diag.constFactory] Only redirecting factory constructors can be declared to be 'const'.
+//                           ^^^^
+// [diag.returnOfInvalidTypeFromConstructor] A value of type 'Null' can't be returned from the constructor 'E.named' because it has a return type of 'E'.
 }
-''',
-      [
-        error(diag.constFactory, 35, 5),
-        error(diag.returnOfInvalidTypeFromConstructor, 62, 4),
-      ],
-    );
+''');
   }
 
   test_extensionType_secondaryConstructor_constFactory_external_blockBody() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 extension type const E(int it) {
   external const factory E.named() {}
+//                       ^^^^^^^
+// [diag.bodyMightCompleteNormally] The body might complete normally, causing 'null' to be returned, but the return type, 'E', is a potentially non-nullable type.
+//                                 ^
+// [diag.externalFactoryWithBody] External factories can't have a body.
 }
-''',
-      [
-        error(diag.bodyMightCompleteNormally, 58, 7),
-        error(diag.externalFactoryWithBody, 68, 1),
-      ],
-    );
+''');
   }
 
   test_extensionType_secondaryConstructor_constFactory_external_emptyBody() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 extension type const E(int it) {
   external const factory E.named();
 }
@@ -919,21 +849,19 @@
   }
 
   test_extensionType_secondaryConstructor_constFactory_external_expressionBody() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 extension type const E(int it) {
   external const factory E.named() => null;
+//                                 ^^
+// [diag.externalFactoryWithBody] External factories can't have a body.
+//                                    ^^^^
+// [diag.returnOfInvalidTypeFromConstructor] A value of type 'Null' can't be returned from the constructor 'E.named' because it has a return type of 'E'.
 }
-''',
-      [
-        error(diag.externalFactoryWithBody, 68, 2),
-        error(diag.returnOfInvalidTypeFromConstructor, 71, 4),
-      ],
-    );
+''');
   }
 
   test_extensionType_secondaryConstructor_constFactory_redirecting() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 extension type const E(int it) {
   const factory E.named(int i) = E;
 }
@@ -941,18 +869,17 @@
   }
 
   test_extensionType_secondaryConstructor_constGenerative_blockBody() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 extension type const E(int it) {
   const E.named() : it = 0 {}
+//                         ^
+// [diag.constConstructorWithBody] Const constructors can't have a body.
 }
-''',
-      [error(diag.constConstructorWithBody, 60, 1)],
-    );
+''');
   }
 
   test_extensionType_secondaryConstructor_constGenerative_emptyBody() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 extension type const E(int it) {
   const E.named() : it = 0;
 }
@@ -960,7 +887,7 @@
   }
 
   test_extensionType_secondaryConstructor_constGenerative_emptyBody_hasAssert() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 extension type const E(int it) {
   const E.named() : it = 0, assert(true);
 }
@@ -968,35 +895,30 @@
   }
 
   test_extensionType_secondaryConstructor_constGenerative_expressionBody() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 extension type const E(int it) {
   const E.named() : it = 0 => E(0);
+//                         ^^
+// [diag.constConstructorWithBody] Const constructors can't have a body.
+//                         ^^^^^^^^
+// [diag.returnInGenerativeConstructor] Constructors can't return values.
 }
-''',
-      [
-        error(diag.constConstructorWithBody, 60, 2),
-        error(diag.returnInGenerativeConstructor, 60, 8),
-      ],
-    );
+''');
   }
 
   test_extensionType_secondaryConstructor_constGenerative_external_blockBody() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 extension type const E(int it) {
   external const E.named() {}
+//                         ^
+// [diag.externalMethodWithBody] An external or native method can't have a body.
+// [diag.constConstructorWithBody] Const constructors can't have a body.
 }
-''',
-      [
-        error(diag.externalMethodWithBody, 60, 1),
-        error(diag.constConstructorWithBody, 60, 1),
-      ],
-    );
+''');
   }
 
   test_extensionType_secondaryConstructor_constGenerative_external_emptyBody() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 extension type const E(int it) {
   external const E.named();
 }
@@ -1004,37 +926,33 @@
   }
 
   test_extensionType_secondaryConstructor_constGenerative_external_expressionBody() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 extension type const E(int it) {
   external const E.named() => null;
+//                         ^^
+// [diag.externalMethodWithBody] An external or native method can't have a body.
+// [diag.constConstructorWithBody] Const constructors can't have a body.
+//                         ^^^^^^^^
+// [diag.returnInGenerativeConstructor] Constructors can't return values.
+//                            ^^^^
+// [diag.returnOfInvalidTypeFromConstructor] A value of type 'Null' can't be returned from the constructor 'E.named' because it has a return type of 'E'.
 }
-''',
-      [
-        error(diag.externalMethodWithBody, 60, 2),
-        error(diag.constConstructorWithBody, 60, 2),
-        error(diag.returnInGenerativeConstructor, 60, 8),
-        error(diag.returnOfInvalidTypeFromConstructor, 63, 4),
-      ],
-    );
+''');
   }
 
   test_extensionType_secondaryConstructor_constGenerativeRedirecting_blockBody() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 extension type const E(int it) {
   const E.named() : this(0) {}
+//                          ^
+// [diag.redirectingConstructorWithBody] Redirecting constructors can't have a body.
+// [diag.constConstructorWithBody] Const constructors can't have a body.
 }
-''',
-      [
-        error(diag.redirectingConstructorWithBody, 61, 1),
-        error(diag.constConstructorWithBody, 61, 1),
-      ],
-    );
+''');
   }
 
   test_extensionType_secondaryConstructor_constGenerativeRedirecting_emptyBody() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 extension type const E(int it) {
   const E.named() : this(0);
 }
@@ -1042,37 +960,34 @@
   }
 
   test_extensionType_secondaryConstructor_constGenerativeRedirecting_expressionBody() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 extension type const E(int it) {
   const E.named() : this(0) => null;
+//                          ^^
+// [diag.redirectingConstructorWithBody] Redirecting constructors can't have a body.
+// [diag.constConstructorWithBody] Const constructors can't have a body.
+//                          ^^^^^^^^
+// [diag.returnInGenerativeConstructor] Constructors can't return values.
+//                             ^^^^
+// [diag.returnOfInvalidTypeFromConstructor] A value of type 'Null' can't be returned from the constructor 'E.named' because it has a return type of 'E'.
 }
-''',
-      [
-        error(diag.redirectingConstructorWithBody, 61, 2),
-        error(diag.constConstructorWithBody, 61, 2),
-        error(diag.returnInGenerativeConstructor, 61, 8),
-        error(diag.returnOfInvalidTypeFromConstructor, 64, 4),
-      ],
-    );
+''');
   }
 
   test_extensionType_secondaryConstructor_factory_external_blockBody() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 extension type const E(int it) {
   external factory E.named() {}
+//                 ^^^^^^^
+// [diag.bodyMightCompleteNormally] The body might complete normally, causing 'null' to be returned, but the return type, 'E', is a potentially non-nullable type.
+//                           ^
+// [diag.externalFactoryWithBody] External factories can't have a body.
 }
-''',
-      [
-        error(diag.bodyMightCompleteNormally, 52, 7),
-        error(diag.externalFactoryWithBody, 62, 1),
-      ],
-    );
+''');
   }
 
   test_extensionType_secondaryConstructor_factory_external_emptyBody() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 extension type const E(int it) {
   external factory E.named();
 }
@@ -1080,32 +995,29 @@
   }
 
   test_extensionType_secondaryConstructor_factory_external_expressionBody() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 extension type const E(int it) {
   external factory E.named() => null;
+//                           ^^
+// [diag.externalFactoryWithBody] External factories can't have a body.
+//                              ^^^^
+// [diag.returnOfInvalidTypeFromConstructor] A value of type 'Null' can't be returned from the constructor 'E.named' because it has a return type of 'E'.
 }
-''',
-      [
-        error(diag.externalFactoryWithBody, 62, 2),
-        error(diag.returnOfInvalidTypeFromConstructor, 65, 4),
-      ],
-    );
+''');
   }
 
   test_extensionType_secondaryConstructor_generative_external_blockBody() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 extension type E(int it) {
   external E.named() {}
+//                   ^
+// [diag.externalMethodWithBody] An external or native method can't have a body.
 }
-''',
-      [error(diag.externalMethodWithBody, 48, 1)],
-    );
+''');
   }
 
   test_extensionType_secondaryConstructor_generative_external_emptyBody() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 extension type E(int it) {
   external E.named();
 }
@@ -1113,17 +1025,16 @@
   }
 
   test_extensionType_secondaryConstructor_generative_external_expressionBody() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 extension type E(int it) {
   external E.named() => null;
+//                   ^^
+// [diag.externalMethodWithBody] An external or native method can't have a body.
+//                   ^^^^^^^^
+// [diag.returnInGenerativeConstructor] Constructors can't return values.
+//                      ^^^^
+// [diag.returnOfInvalidTypeFromConstructor] A value of type 'Null' can't be returned from the constructor 'E.named' because it has a return type of 'E'.
 }
-''',
-      [
-        error(diag.externalMethodWithBody, 48, 2),
-        error(diag.returnInGenerativeConstructor, 48, 8),
-        error(diag.returnOfInvalidTypeFromConstructor, 51, 4),
-      ],
-    );
+''');
   }
 }
diff --git a/pkg/analyzer/test/src/diagnostics/continue_label_invalid_test.dart b/pkg/analyzer/test/src/diagnostics/continue_label_invalid_test.dart
index f3c1413..a825fb1 100644
--- a/pkg/analyzer/test/src/diagnostics/continue_label_invalid_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/continue_label_invalid_test.dart
@@ -2,7 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/src/diagnostic/diagnostic.dart' as diag;
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../dart/resolution/context_collection_resolution.dart';
@@ -16,50 +15,46 @@
 @reflectiveTest
 class ContinueLabelInvalidTest extends PubPackageResolutionTest {
   test_onBlock() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 void f() {
   L:
   {
     for (var i in []) {
+//           ^
+// [diag.unusedLocalVariable] The value of the local variable 'i' isn't used.
       continue L;
+//    ^^^^^^^^^^^
+// [diag.continueLabelInvalid] The label used in a 'continue' statement must be defined on either a loop or a switch member.
     }
   }
 }
-''',
-      [
-        error(diag.unusedLocalVariable, 33, 1),
-        error(diag.continueLabelInvalid, 50, 11),
-      ],
-    );
+''');
   }
 
   test_onSwitchStatement() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 void f(int x) {
   L: switch (x) {
     case 0:
       continue L;
+//    ^^^^^^^^^^^
+// [diag.continueLabelInvalid] The label used in a 'continue' statement must be defined on either a loop or a switch member.
   }
 }
-''',
-      [error(diag.continueLabelInvalid, 52, 11)],
-    );
+''');
   }
 
   test_onSwitchStatement_language219() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 // @dart = 2.19
 void f(int x) {
   L: switch (x) {
     case 0:
       continue L;
+//    ^^^^^^^^^^^
+// [diag.continueLabelInvalid] The label used in a 'continue' statement must be defined on either a loop or a switch member.
   }
 }
-''',
-      [error(diag.continueLabelInvalid, 68, 11)],
-    );
+''');
   }
 }
diff --git a/pkg/analyzer/test/src/diagnostics/could_not_infer_test.dart b/pkg/analyzer/test/src/diagnostics/could_not_infer_test.dart
index 1bf3946..facc9c7 100644
--- a/pkg/analyzer/test/src/diagnostics/could_not_infer_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/could_not_infer_test.dart
@@ -18,6 +18,8 @@
 @reflectiveTest
 class CouldNotInferTest extends PubPackageResolutionTest {
   test_constructors_inferenceFBounded() async {
+    // Skipped migration to resolveTestCodeWithDiagnostics due to multi-line
+    // error messages for couldNotInfer which are not supported well by the tool.
     await assertErrorsInCode(
       '''
 class C<T> {}
@@ -56,8 +58,7 @@
   }
 
   test_constructors_inferFromArguments_argumentNotAssignable() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {}
 
 typedef T F<T>();
@@ -68,22 +69,21 @@
 
 class NotA {}
 NotA myF() => null;
+//            ^^^^
+// [diag.returnOfInvalidTypeFromFunction] A value of type 'Null' can't be returned from the function 'myF' because it has a return type of 'NotA'.
 
 main() {
   var x = C(myF);
+//    ^
+// [diag.unusedLocalVariable] The value of the local variable 'x' isn't used.
+//          ^^^
+// [diag.argumentTypeNotAssignable] The argument type 'NotA Function()' can't be assigned to the parameter type 'F<A>'. 
 }
-''',
-      [
-        error(diag.returnOfInvalidTypeFromFunction, 98, 4),
-        error(diag.unusedLocalVariable, 120, 1),
-        error(diag.argumentTypeNotAssignable, 126, 3),
-      ],
-    );
+''');
   }
 
   test_downwardInference_fixes_noUpwardsErrors() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'dart:math';
 // T max<T extends num>(T x, T y);
 main() {
@@ -91,49 +91,52 @@
   dynamic y;
 
   num a = max(x, y);
+//    ^
+// [diag.unusedLocalVariable] The value of the local variable 'a' isn't used.
+//            ^
+// [diag.notAssignedPotentiallyNonNullableLocalVariable] The non-nullable local variable 'x' must be assigned before it can be used.
   Object b = max(x, y);
+//       ^
+// [diag.unusedLocalVariable] The value of the local variable 'b' isn't used.
+//               ^
+// [diag.notAssignedPotentiallyNonNullableLocalVariable] The non-nullable local variable 'x' must be assigned before it can be used.
   dynamic c = max(x, y);
+//        ^
+// [diag.unusedLocalVariable] The value of the local variable 'c' isn't used.
+//                ^
+// [diag.notAssignedPotentiallyNonNullableLocalVariable] The non-nullable local variable 'x' must be assigned before it can be used.
   var d = max(x, y);
+//    ^
+// [diag.unusedLocalVariable] The value of the local variable 'd' isn't used.
+//            ^
+// [diag.notAssignedPotentiallyNonNullableLocalVariable] The non-nullable local variable 'x' must be assigned before it can be used.
 }
-''',
-      [
-        error(diag.unusedLocalVariable, 93, 1),
-        error(diag.notAssignedPotentiallyNonNullableLocalVariable, 101, 1),
-        error(diag.unusedLocalVariable, 117, 1),
-        error(diag.notAssignedPotentiallyNonNullableLocalVariable, 125, 1),
-        error(diag.unusedLocalVariable, 142, 1),
-        error(diag.notAssignedPotentiallyNonNullableLocalVariable, 150, 1),
-        error(diag.unusedLocalVariable, 163, 1),
-        error(diag.notAssignedPotentiallyNonNullableLocalVariable, 171, 1),
-      ],
-    );
+''');
   }
 
   test_function() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 T f<T>(T t) => null;
+//             ^^^^
+// [diag.returnOfInvalidTypeFromFunction] A value of type 'Null' can't be returned from the function 'f' because it has a return type of 'T'.
 main() { f(<S>(S s) => s); }
-''',
-      [error(diag.returnOfInvalidTypeFromFunction, 15, 4)],
-    );
+''');
   }
 
   test_function_argument_invalidType() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 void foo<T extends num>(T t) {}
 
 void f(X x) {
+//     ^
+// [diag.undefinedClass] Undefined class 'X'.
   foo(x);
 }
-''',
-      [error(diag.undefinedClass, 40, 1)],
-    );
+''');
   }
 
   test_functionType() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 void f<X>() {}
 
 main() {
@@ -143,7 +146,7 @@
   }
 
   test_functionType_allSameSubtype() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 external T f<T extends num>(T a, T b);
 void g(int cb(int a, int b)) {}
 void main() {
@@ -153,6 +156,8 @@
   }
 
   test_functionType_instantiatedToBounds() async {
+    // Skipped migration to resolveTestCodeWithDiagnostics due to multi-line
+    // error messages for couldNotInfer which are not supported well by the tool.
     await assertErrorsInCode(
       r'''
 class A<X extends A<X>> {}
@@ -171,6 +176,8 @@
     newFile('$testPackageLibPath/a.dart', '''
 void f<X>() {}
 ''');
+    // Skipped migration to resolveTestCodeWithDiagnostics due to multi-line
+    // error messages for couldNotInfer which are not supported well by the tool.
     await assertErrorsInCode(
       '''
 // @dart=2.12
@@ -184,7 +191,7 @@
   }
 
   test_functionType_parameterIsBound_returnIsBound() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 external T f<T extends num>(T a, T b);
 void g(num cb(num a, num b)) {}
 void main() {
@@ -194,50 +201,46 @@
   }
 
   test_functionType_parameterIsObject_returnIsBound() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 external T f<T extends num>(T a, T b);
 void g(num cb(Object a, Object b)) {}
 void main() {
   g(f);
+//  ^
+// [diag.argumentTypeNotAssignable] The argument type 'num Function(num, num)' can't be assigned to the parameter type 'num Function(Object, Object)'. 
 }
-''',
-      [error(diag.argumentTypeNotAssignable, 95, 1)],
-    );
+''');
   }
 
   test_functionType_parameterIsObject_returnIsBound_prefixedFunction() async {
     newFile('$testPackageLibPath/a.dart', '''
 external T f<T extends num>(T a, T b);
 ''');
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'a.dart' as a;
 void g(num cb(Object a, Object b)) {}
 void main() {
   g(a.f);
+//  ^^^
+// [diag.argumentTypeNotAssignable] The argument type 'num Function(num, num)' can't be assigned to the parameter type 'num Function(Object, Object)'. 
 }
-''',
-      [error(diag.argumentTypeNotAssignable, 78, 3)],
-    );
+''');
   }
 
   test_functionType_parameterIsObject_returnIsSubtype() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 external T f<T extends num>(T a, T b);
 void g(int cb(Object a, Object b)) {}
 void main() {
   g(f);
+//  ^
+// [diag.argumentTypeNotAssignable] The argument type 'num Function(num, num)' can't be assigned to the parameter type 'int Function(Object, Object)'. 
 }
-''',
-      [error(diag.argumentTypeNotAssignable, 95, 1)],
-    );
+''');
   }
 
   test_functionType_parameterIsObject_returnIsSubtype_tearOff() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 class C {
   T m<T extends num>(T x, T y) {
     throw 'error';
@@ -246,14 +249,14 @@
 void g(int cb(Object a, Object b)) {}
 void main() {
   g(C().m);
+//  ^^^^^
+// [diag.argumentTypeNotAssignable] The argument type 'num Function(num, num)' can't be assigned to the parameter type 'int Function(Object, Object)'. 
 }
-''',
-      [error(diag.argumentTypeNotAssignable, 124, 5)],
-    );
+''');
   }
 
   test_functionType_parameterIsSubtype_returnIsBound() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 external T f<T extends num>(T a, T b);
 void g(num cb(int a, int b)) {}
 void main() {
@@ -263,7 +266,7 @@
   }
 
   test_functionType_parameterIsSubtype_returnIsObject() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 external T f<T extends num>(T a, T b);
 void g(Object cb(int a, int b)) {}
 void main() {
@@ -273,7 +276,7 @@
   }
 
   test_functionType_parametersAreSubtypes_returnIsBound() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 external T f<T extends num>(T a, T b);
 void g(num cb(int a, double b)) {}
 void main() {
@@ -283,6 +286,8 @@
   }
 
   test_functionType_parametersAreSubtypes_returnIsOne() async {
+    // Skipped migration to resolveTestCodeWithDiagnostics due to multi-line
+    // error messages for couldNotInfer which are not supported well by the tool.
     await assertErrorsInCode(
       '''
 external T f<T extends num>(T a, T b);
@@ -300,20 +305,21 @@
 
   test_genericMethods_correctlyRecognizeGenericUpperBound() async {
     // Regression test for https://github.com/dart-lang/sdk/issues/25740.
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class Foo<T extends Pattern> {
   U method<U extends T>(U u) => u;
 }
 main() {
   new Foo<String>().method(42);
+//                         ^^
+// [diag.argumentTypeNotAssignable] The argument type 'int' can't be assigned to the parameter type 'String'. 
 }
-''',
-      [error(diag.argumentTypeNotAssignable, 104, 2)],
-    );
+''');
   }
 
   test_instanceCreation_viaTypeAlias_notWellBounded() async {
+    // Skipped migration to resolveTestCodeWithDiagnostics due to multi-line
+    // error messages for couldNotInfer which are not supported well by the tool.
     await assertErrorsInCode(
       '''
 class C<X> {
@@ -339,28 +345,26 @@
   }
 
   test_method() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class C {
   T f<T>(T t) => null;
+//               ^^^^
+// [diag.returnOfInvalidTypeFromMethod] A value of type 'Null' can't be returned from the method 'f' because it has a return type of 'T'.
 }
 main() { new C().f(<S>(S s) => s); }
-''',
-      [error(diag.returnOfInvalidTypeFromMethod, 27, 4)],
-    );
+''');
   }
 
   test_topLevel() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 class C<P extends num> {
   factory C(Iterable<P> p) => C._();
   C._();
 }
 
 var c = C([]);
-''',
-      [error(diag.argumentTypeNotAssignable, 84, 2)],
-    );
+//        ^^
+// [diag.argumentTypeNotAssignable] The argument type 'List<dynamic>' can't be assigned to the parameter type 'Iterable<num>'. 
+''');
   }
 }
diff --git a/pkg/analyzer/test/src/diagnostics/creation_of_struct_or_union_test.dart b/pkg/analyzer/test/src/diagnostics/creation_of_struct_or_union_test.dart
index af1fbac..47cef9e 100644
--- a/pkg/analyzer/test/src/diagnostics/creation_of_struct_or_union_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/creation_of_struct_or_union_test.dart
@@ -2,7 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/src/diagnostic/diagnostic.dart' as diag;
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../dart/resolution/context_collection_resolution.dart';
@@ -16,8 +15,7 @@
 @reflectiveTest
 class CreationOfStructOrUnionTest extends PubPackageResolutionTest {
   test_struct() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'dart:ffi';
 
 final class A extends Struct {
@@ -27,15 +25,14 @@
 
 void f() {
   A();
+//^
+// [diag.creationOfStructOrUnion] Subclasses of 'Struct' and 'Union' are backed by native memory, and can't be instantiated by a generative constructor.
 }
-''',
-      [error(diag.creationOfStructOrUnion, 96, 1)],
-    );
+''');
   }
 
   test_union() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'dart:ffi';
 
 final class A extends Union {
@@ -45,9 +42,9 @@
 
 void f() {
   A();
+//^
+// [diag.creationOfStructOrUnion] Subclasses of 'Struct' and 'Union' are backed by native memory, and can't be instantiated by a generative constructor.
 }
-''',
-      [error(diag.creationOfStructOrUnion, 95, 1)],
-    );
+''');
   }
 }
diff --git a/pkg/analyzer/test/src/diagnostics/creation_with_non_type_test.dart b/pkg/analyzer/test/src/diagnostics/creation_with_non_type_test.dart
index 4a73024..a868d5e 100644
--- a/pkg/analyzer/test/src/diagnostics/creation_with_non_type_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/creation_with_non_type_test.dart
@@ -2,7 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/src/diagnostic/diagnostic.dart' as diag;
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../dart/resolution/context_collection_resolution.dart';
@@ -16,527 +15,321 @@
 @reflectiveTest
 class CreationWithNonTypeTest extends PubPackageResolutionTest {
   test_const_nonPrefix_generic() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 void nonPrefix() {}
 f() {
   const nonPrefix.Class<int>();
+//      ^^^^^^^^^
+// [diag.prefixShadowedByLocalDeclaration] The prefix 'nonPrefix' can't be used here because it's shadowed by a local declaration.
 }
-''',
-      [
-        error(
-          diag.prefixShadowedByLocalDeclaration,
-          34,
-          9,
-          messageContains: ["'nonPrefix'"],
-        ),
-      ],
-    );
+''');
   }
 
   test_const_nonPrefix_genericNamed() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 void nonPrefix() {}
 f() {
   const nonPrefix.Class<int>.named();
+//      ^^^^^^^^^
+// [diag.prefixShadowedByLocalDeclaration] The prefix 'nonPrefix' can't be used here because it's shadowed by a local declaration.
 }
-''',
-      [
-        error(
-          diag.prefixShadowedByLocalDeclaration,
-          34,
-          9,
-          messageContains: ["'nonPrefix'"],
-        ),
-      ],
-    );
+''');
   }
 
   test_const_nonPrefix_named() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 void nonPrefix() {}
 f() {
   const nonPrefix.Class.named();
+//      ^^^^^^^^^
+// [diag.prefixShadowedByLocalDeclaration] The prefix 'nonPrefix' can't be used here because it's shadowed by a local declaration.
 }
-''',
-      [
-        error(
-          diag.prefixShadowedByLocalDeclaration,
-          34,
-          9,
-          messageContains: ["'nonPrefix'"],
-        ),
-      ],
-    );
+''');
   }
 
   test_const_nonPrefix_unnamed() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 void nonPrefix() {}
 f() {
   const nonPrefix.Class();
+//      ^^^^^^^^^
+// [diag.prefixShadowedByLocalDeclaration] The prefix 'nonPrefix' can't be used here because it's shadowed by a local declaration.
 }
-''',
-      [
-        error(
-          diag.prefixShadowedByLocalDeclaration,
-          34,
-          9,
-          messageContains: ["'nonPrefix"],
-        ),
-      ],
-    );
+''');
   }
 
   test_const_nonType_generic() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 void NonType<T>() {}
 f() {
   const NonType<int>();
+//      ^^^^^^^
+// [diag.constWithNonType] The name 'NonType' isn't a class.
 }
-''',
-      [
-        error(
-          diag.constWithNonType,
-          35,
-          7,
-          text: "The name 'NonType' isn't a class.",
-        ),
-      ],
-    );
+''');
   }
 
   test_const_nonType_genericNamed() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 void NonType<T>() {}
 f() {
   const NonType<int>.named();
+//      ^^^^^^^
+// [diag.constWithNonType] The name 'NonType' isn't a class.
 }
-''',
-      [
-        error(
-          diag.constWithNonType,
-          35,
-          7,
-          text: "The name 'NonType' isn't a class.",
-        ),
-      ],
-    );
+''');
   }
 
   test_const_nonType_named() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 void NonType() {}
 f() {
   const NonType.named();
+//      ^^^^^^^
+// [diag.prefixShadowedByLocalDeclaration] The prefix 'NonType' can't be used here because it's shadowed by a local declaration.
 }
-''',
-      [
-        error(
-          diag.prefixShadowedByLocalDeclaration,
-          32,
-          7,
-          messageContains: ["'NonType"],
-        ),
-      ],
-    );
+''');
   }
 
   test_const_nonType_prefixed() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'test.dart' as prefix;
 
 void NonType() {}
 f() {
   const prefix.NonType();
+//             ^^^^^^^
+// [diag.constWithNonType] The name 'NonType' isn't a class.
 }
-''',
-      [
-        error(
-          diag.constWithNonType,
-          70,
-          7,
-          text: "The name 'NonType' isn't a class.",
-        ),
-      ],
-    );
+''');
   }
 
   test_const_nonType_prefixedGeneric() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'test.dart' as prefix;
 
 void NonType<T>() {}
 f() {
   const prefix.NonType<int>();
+//             ^^^^^^^
+// [diag.constWithNonType] The name 'NonType' isn't a class.
 }
-''',
-      [
-        error(
-          diag.constWithNonType,
-          73,
-          7,
-          text: "The name 'NonType' isn't a class.",
-        ),
-      ],
-    );
+''');
   }
 
   test_const_nonType_prefixedGenericNamed() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'test.dart' as prefix;
 
 void NonType<T>() {}
 f() {
   const prefix.NonType<int>.named();
+//             ^^^^^^^
+// [diag.constWithNonType] The name 'NonType' isn't a class.
 }
-''',
-      [
-        error(
-          diag.constWithNonType,
-          73,
-          7,
-          text: "The name 'NonType' isn't a class.",
-        ),
-      ],
-    );
+''');
   }
 
   test_const_nonType_prefixedNamed() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'test.dart' as prefix;
 
 void NonType() {}
 f() {
   const prefix.NonType.named();
+//             ^^^^^^^
+// [diag.constWithNonType] The name 'NonType' isn't a class.
 }
-''',
-      [
-        error(
-          diag.constWithNonType,
-          70,
-          7,
-          text: "The name 'NonType' isn't a class.",
-        ),
-      ],
-    );
+''');
   }
 
   test_const_nonType_unnamed() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 void NonType() {}
 f() {
   const NonType();
+//      ^^^^^^^
+// [diag.constWithNonType] The name 'NonType' isn't a class.
 }
-''',
-      [
-        error(
-          diag.constWithNonType,
-          32,
-          7,
-          text: "The name 'NonType' isn't a class.",
-        ),
-      ],
-    );
+''');
   }
 
   test_const_unresolvedClass_generic() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 f() {
   const UnresolvedClass<int>();
+//      ^^^^^^^^^^^^^^^
+// [diag.constWithNonType] The name 'UnresolvedClass' isn't a class.
 }
-''',
-      [
-        error(
-          diag.constWithNonType,
-          14,
-          15,
-          text: "The name 'UnresolvedClass' isn't a class.",
-        ),
-      ],
-    );
+''');
   }
 
   test_const_unresolvedClass_genericNamed() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 f() {
   const UnresolvedClass<int>.named();
+//      ^^^^^^^^^^^^^^^
+// [diag.constWithNonType] The name 'UnresolvedClass' isn't a class.
 }
-''',
-      [
-        error(
-          diag.constWithNonType,
-          14,
-          15,
-          text: "The name 'UnresolvedClass' isn't a class.",
-        ),
-      ],
-    );
+''');
   }
 
   test_const_unresolvedClass_named() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 f() {
   const UnresolvedClass.named();
+//      ^^^^^^^^^^^^^^^^^^^^^
+// [diag.undefinedIdentifier] Undefined name 'UnresolvedClass'.
 }
-''',
-      [
-        error(
-          diag.undefinedIdentifier,
-          14,
-          21,
-          text: "Undefined name 'UnresolvedClass'.",
-        ),
-      ],
-    );
+''');
   }
 
   test_const_unresolvedClass_prefixed() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'test.dart' as prefix;
 
 f() {
   const prefix.UnresolvedClass();
+//             ^^^^^^^^^^^^^^^
+// [diag.constWithNonType] The name 'UnresolvedClass' isn't a class.
 }
-''',
-      [
-        error(
-          diag.constWithNonType,
-          52,
-          15,
-          text: "The name 'UnresolvedClass' isn't a class.",
-        ),
-      ],
-    );
+''');
   }
 
   test_const_unresolvedClass_prefixedGeneric() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'test.dart' as prefix;
 
 f() {
   const prefix.UnresolvedClass<int>();
+//             ^^^^^^^^^^^^^^^
+// [diag.constWithNonType] The name 'UnresolvedClass' isn't a class.
 }
-''',
-      [
-        error(
-          diag.constWithNonType,
-          52,
-          15,
-          text: "The name 'UnresolvedClass' isn't a class.",
-        ),
-      ],
-    );
+''');
   }
 
   test_const_unresolvedClass_prefixedGenericNamed() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'test.dart' as prefix;
 
 f() {
   const prefix.UnresolvedClass<int>.named();
+//             ^^^^^^^^^^^^^^^
+// [diag.constWithNonType] The name 'UnresolvedClass' isn't a class.
 }
-''',
-      [
-        error(
-          diag.constWithNonType,
-          52,
-          15,
-          text: "The name 'UnresolvedClass' isn't a class.",
-        ),
-      ],
-    );
+''');
   }
 
   test_const_unresolvedClass_prefixedNamed() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'test.dart' as prefix;
 
 f() {
   const prefix.UnresolvedClass.named();
+//             ^^^^^^^^^^^^^^^
+// [diag.constWithNonType] The name 'UnresolvedClass' isn't a class.
 }
-''',
-      [
-        error(
-          diag.constWithNonType,
-          52,
-          15,
-          text: "The name 'UnresolvedClass' isn't a class.",
-        ),
-      ],
-    );
+''');
   }
 
   test_const_unresolvedClass_unnamed() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 f() {
   const UnresolvedClass();
+//      ^^^^^^^^^^^^^^^
+// [diag.constWithNonType] The name 'UnresolvedClass' isn't a class.
 }
-''',
-      [
-        error(
-          diag.constWithNonType,
-          14,
-          15,
-          text: "The name 'UnresolvedClass' isn't a class.",
-        ),
-      ],
-    );
+''');
   }
 
   test_const_unresolvedPrefix_generic() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 f() {
   const unresolved.Class<int>();
+//      ^^^^^^^^^^^^^^^^
+// [diag.undefinedIdentifier] Undefined name 'unresolved'.
 }
-''',
-      [
-        error(
-          diag.undefinedIdentifier,
-          14,
-          16,
-          text: "Undefined name 'unresolved'.",
-        ),
-      ],
-    );
+''');
   }
 
   test_const_unresolvedPrefix_genericNamed() async {
-    await assertErrorsInCode(
-      r'''
+    // TODO(johnniwinther): This could be "Undefined prefix 'unresolved'.".
+    await resolveTestCodeWithDiagnostics(r'''
 f() {
   const unresolved.Class<int>.named();
+//      ^^^^^^^^^^^^^^^^
+// [diag.undefinedIdentifier] Undefined name 'unresolved'.
 }
-''',
-      [
-        error(
-          // TODO(johnniwinther): This could be
-          //  "Undefined prefix 'unresolved'.".
-          diag.undefinedIdentifier,
-          14,
-          16,
-          text: "Undefined name 'unresolved'.",
-        ),
-      ],
-    );
+''');
   }
 
   test_const_unresolvedPrefix_named() async {
-    await assertErrorsInCode(
-      r'''
+    // TODO(johnniwinther): This could be "Undefined prefix 'unresolved'.".
+    await resolveTestCodeWithDiagnostics(r'''
 f() {
   const unresolved.Class.named();
+//      ^^^^^^^^^^^^^^^^
+// [diag.undefinedIdentifier] Undefined name 'unresolved'.
 }
-''',
-      [
-        error(
-          // TODO(johnniwinther): This could be
-          //  "Undefined prefix 'unresolved'.".
-          diag.undefinedIdentifier,
-          14,
-          16,
-          text: "Undefined name 'unresolved'.",
-        ),
-      ],
-    );
+''');
   }
 
   test_const_unresolvedPrefix_unnamed() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 f() {
   const unresolved.Class();
+//      ^^^^^^^^^^^^^^^^
+// [diag.undefinedIdentifier] Undefined name 'unresolved'.
 }
-''',
-      [
-        error(
-          diag.undefinedIdentifier,
-          14,
-          16,
-          text: "Undefined name 'unresolved'.",
-        ),
-      ],
-    );
+''');
   }
 
   test_implicit_nonPrefix_generic() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 void nonPrefix() {}
 f() {
   nonPrefix.Class<int>();
+//          ^^^^^
+// [diag.undefinedMethod] The method 'Class' isn't defined for the type 'Function'.
 }
-''',
-      [
-        error(diag.undefinedMethod, 38, 5, messageContains: ["'Class'"]),
-      ],
-    );
+''');
   }
 
   test_implicit_nonPrefix_genericNamed() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 void nonPrefix() {}
 f() {
   nonPrefix.Class<int>.named();
+//          ^^^^^
+// [diag.undefinedGetter] The getter 'Class' isn't defined for the type 'void Function()'.
 }
-''',
-      [
-        error(diag.undefinedGetter, 38, 5, messageContains: ["'Class'"]),
-      ],
-    );
+''');
   }
 
   test_implicit_nonPrefix_named() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 void nonPrefix() {}
 f() {
   nonPrefix.Class.named();
+//          ^^^^^
+// [diag.undefinedGetter] The getter 'Class' isn't defined for the type 'void Function()'.
 }
-''',
-      [
-        error(diag.undefinedGetter, 38, 5, messageContains: ["'Class'"]),
-      ],
-    );
+''');
   }
 
   test_implicit_nonPrefix_unnamed() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 void nonPrefix() {}
 f() {
   nonPrefix.Class();
+//          ^^^^^
+// [diag.undefinedMethod] The method 'Class' isn't defined for the type 'Function'.
 }
-''',
-      [
-        error(diag.undefinedMethod, 38, 5, messageContains: ["'Class'"]),
-      ],
-    );
+''');
   }
 
   test_implicit_nonType_generic() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 void NonType<T>() {}
 f() {
   NonType<int>();
@@ -545,35 +338,29 @@
   }
 
   test_implicit_nonType_genericNamed() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 void NonType<T>() {}
 f() {
   NonType<int>.named();
+//             ^^^^^
+// [diag.undefinedMethod] The method 'named' isn't defined for the type 'Function'.
 }
-''',
-      [
-        error(diag.undefinedMethod, 42, 5, messageContains: ["'named"]),
-      ],
-    );
+''');
   }
 
   test_implicit_nonType_named() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 void NonType() {}
 f() {
   NonType.named();
+//        ^^^^^
+// [diag.undefinedMethod] The method 'named' isn't defined for the type 'Function'.
 }
-''',
-      [
-        error(diag.undefinedMethod, 34, 5, messageContains: ["'named'"]),
-      ],
-    );
+''');
   }
 
   test_implicit_nonType_prefixed() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'test.dart' as prefix;
 
 void NonType() {}
@@ -584,7 +371,7 @@
   }
 
   test_implicit_nonType_prefixedGeneric() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'test.dart' as prefix;
 
 void NonType<T>() {}
@@ -595,39 +382,33 @@
   }
 
   test_implicit_nonType_prefixedGenericNamed() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'test.dart' as prefix;
 
 void NonType<T>() {}
 f() {
   prefix.NonType<int>.named();
+//                    ^^^^^
+// [diag.undefinedMethod] The method 'named' isn't defined for the type 'Function'.
 }
-''',
-      [
-        error(diag.undefinedMethod, 80, 5, messageContains: ["'named'"]),
-      ],
-    );
+''');
   }
 
   test_implicit_nonType_prefixedNamed() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'test.dart' as prefix;
 
 void NonType() {}
 f() {
   prefix.NonType.named();
+//               ^^^^^
+// [diag.undefinedMethod] The method 'named' isn't defined for the type 'Function'.
 }
-''',
-      [
-        error(diag.undefinedMethod, 72, 5, messageContains: ["'named'"]),
-      ],
-    );
+''');
   }
 
   test_implicit_nonType_unnamed() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 void NonType() {}
 f() {
   NonType();
@@ -636,690 +417,400 @@
   }
 
   test_implicit_unresolvedClass_generic() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 f() {
   UnresolvedClass<int>();
+//^^^^^^^^^^^^^^^
+// [diag.undefinedFunction] The function 'UnresolvedClass' isn't defined.
 }
-''',
-      [
-        error(
-          diag.undefinedFunction,
-          8,
-          15,
-          text: "The function 'UnresolvedClass' isn't defined.",
-        ),
-      ],
-    );
+''');
   }
 
   test_implicit_unresolvedClass_genericNamed() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 f() {
   UnresolvedClass<int>.named();
+//^^^^^^^^^^^^^^^
+// [diag.newWithNonType] The name 'UnresolvedClass' isn't a class.
 }
-''',
-      [
-        error(
-          diag.newWithNonType,
-          8,
-          15,
-          text: "The name 'UnresolvedClass' isn't a class.",
-        ),
-      ],
-    );
+''');
   }
 
   test_implicit_unresolvedClass_named() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 f() {
   UnresolvedClass.named();
+//^^^^^^^^^^^^^^^
+// [diag.undefinedIdentifier] Undefined name 'UnresolvedClass'.
 }
-''',
-      [
-        error(
-          diag.undefinedIdentifier,
-          8,
-          15,
-          text: "Undefined name 'UnresolvedClass'.",
-        ),
-      ],
-    );
+''');
   }
 
   test_implicit_unresolvedClass_prefixed() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'test.dart' as prefix;
 
 f() {
   prefix.UnresolvedClass();
+//       ^^^^^^^^^^^^^^^
+// [diag.undefinedFunction] The function 'UnresolvedClass' isn't defined.
 }
-''',
-      [
-        error(
-          diag.undefinedFunction,
-          46,
-          15,
-          text: "The function 'UnresolvedClass' isn't defined.",
-        ),
-      ],
-    );
+''');
   }
 
   test_implicit_unresolvedClass_prefixedGeneric() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'test.dart' as prefix;
 
 f() {
   prefix.UnresolvedClass<int>();
+//       ^^^^^^^^^^^^^^^
+// [diag.undefinedFunction] The function 'UnresolvedClass' isn't defined.
 }
-''',
-      [
-        error(
-          diag.undefinedFunction,
-          46,
-          15,
-          text: "The function 'UnresolvedClass' isn't defined.",
-        ),
-      ],
-    );
+''');
   }
 
   test_implicit_unresolvedClass_prefixedGenericNamed() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'test.dart' as prefix;
 
 f() {
   prefix.UnresolvedClass<int>.named();
+//       ^^^^^^^^^^^^^^^
+// [diag.newWithNonType] The name 'UnresolvedClass' isn't a class.
 }
-''',
-      [
-        error(
-          diag.newWithNonType,
-          46,
-          15,
-          text: "The name 'UnresolvedClass' isn't a class.",
-        ),
-      ],
-    );
+''');
   }
 
   test_implicit_unresolvedClass_prefixedNamed() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'test.dart' as prefix;
 
 f() {
   prefix.UnresolvedClass.named();
+//       ^^^^^^^^^^^^^^^
+// [diag.undefinedPrefixedName] The name 'UnresolvedClass' is being referenced through the prefix 'prefix', but it isn't defined in any of the libraries imported using that prefix.
 }
-''',
-      [
-        error(
-          diag.undefinedPrefixedName,
-          46,
-          15,
-          messageContains: ["'UnresolvedClass'"],
-        ),
-      ],
-    );
+''');
   }
 
   test_implicit_unresolvedClass_unnamed() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 f() {
   UnresolvedClass();
+//^^^^^^^^^^^^^^^
+// [diag.undefinedFunction] The function 'UnresolvedClass' isn't defined.
 }
-''',
-      [
-        error(
-          diag.undefinedFunction,
-          8,
-          15,
-          text: "The function 'UnresolvedClass' isn't defined.",
-        ),
-      ],
-    );
+''');
   }
 
   test_implicit_unresolvedPrefix_generic() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 f() {
   unresolved.Class<int>();
+//^^^^^^^^^^
+// [diag.undefinedIdentifier] Undefined name 'unresolved'.
 }
-''',
-      [
-        error(
-          diag.undefinedIdentifier,
-          8,
-          10,
-          text: "Undefined name 'unresolved'.",
-        ),
-      ],
-    );
+''');
   }
 
   test_implicit_unresolvedPrefix_genericNamed() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 f() {
   unresolved.Class<int>.named();
+//^^^^^^^^^^
+// [diag.undefinedIdentifier] Undefined name 'unresolved'.
 }
-''',
-      [
-        error(
-          diag.undefinedIdentifier,
-          8,
-          10,
-          text: "Undefined name 'unresolved'.",
-        ),
-      ],
-    );
+''');
   }
 
   test_implicit_unresolvedPrefix_named() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 f() {
   unresolved.Class.named();
+//^^^^^^^^^^
+// [diag.undefinedIdentifier] Undefined name 'unresolved'.
 }
-''',
-      [
-        error(
-          diag.undefinedIdentifier,
-          8,
-          10,
-          text: "Undefined name 'unresolved'.",
-        ),
-      ],
-    );
+''');
   }
 
   test_implicit_unresolvedPrefix_unnamed() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 f() {
   unresolved.Class();
+//^^^^^^^^^^
+// [diag.undefinedIdentifier] Undefined name 'unresolved'.
 }
-''',
-      [
-        error(
-          diag.undefinedIdentifier,
-          8,
-          10,
-          text: "Undefined name 'unresolved'.",
-        ),
-      ],
-    );
+''');
   }
 
   test_new_nonPrefix_generic() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 void nonPrefix() {}
 f() {
   new nonPrefix.Class<int>();
+//    ^^^^^^^^^
+// [diag.prefixShadowedByLocalDeclaration] The prefix 'nonPrefix' can't be used here because it's shadowed by a local declaration.
 }
-''',
-      [
-        error(
-          diag.prefixShadowedByLocalDeclaration,
-          32,
-          9,
-          messageContains: ["'nonPrefix'"],
-        ),
-      ],
-    );
+''');
   }
 
   test_new_nonPrefix_genericNamed() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 void nonPrefix() {}
 f() {
   new nonPrefix.Class<int>.named();
+//    ^^^^^^^^^
+// [diag.prefixShadowedByLocalDeclaration] The prefix 'nonPrefix' can't be used here because it's shadowed by a local declaration.
 }
-''',
-      [
-        error(
-          diag.prefixShadowedByLocalDeclaration,
-          32,
-          9,
-          messageContains: ["'nonPrefix'"],
-        ),
-      ],
-    );
+''');
   }
 
   test_new_nonPrefix_named() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 void nonPrefix() {}
 f() {
   new nonPrefix.Class.named();
+//    ^^^^^^^^^
+// [diag.prefixShadowedByLocalDeclaration] The prefix 'nonPrefix' can't be used here because it's shadowed by a local declaration.
 }
-''',
-      [
-        error(
-          diag.prefixShadowedByLocalDeclaration,
-          32,
-          9,
-          messageContains: ["'nonPrefix'"],
-        ),
-      ],
-    );
+''');
   }
 
   test_new_nonPrefix_unnamed() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 void nonPrefix() {}
 f() {
   new nonPrefix.Class();
+//    ^^^^^^^^^
+// [diag.prefixShadowedByLocalDeclaration] The prefix 'nonPrefix' can't be used here because it's shadowed by a local declaration.
 }
-''',
-      [
-        error(
-          diag.prefixShadowedByLocalDeclaration,
-          32,
-          9,
-          messageContains: ["nonPrefix"],
-        ),
-      ],
-    );
+''');
   }
 
   test_new_nonType_generic() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 void nonPrefix() {}
 f() {
   new NonType<int>();
+//    ^^^^^^^
+// [diag.newWithNonType] The name 'NonType' isn't a class.
 }
-''',
-      [
-        error(
-          diag.newWithNonType,
-          32,
-          7,
-          text: "The name 'NonType' isn't a class.",
-        ),
-      ],
-    );
+''');
   }
 
   test_new_nonType_genericNamed() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 void NonType<T>() {}
 f() {
   new NonType<int>.named();
+//    ^^^^^^^
+// [diag.newWithNonType] The name 'NonType' isn't a class.
 }
-''',
-      [
-        error(
-          diag.newWithNonType,
-          33,
-          7,
-          text: "The name 'NonType' isn't a class.",
-        ),
-      ],
-    );
+''');
   }
 
   test_new_nonType_named() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 void NonType() {}
 f() {
   new NonType.named();
+//    ^^^^^^^
+// [diag.prefixShadowedByLocalDeclaration] The prefix 'NonType' can't be used here because it's shadowed by a local declaration.
 }
-''',
-      [
-        error(
-          diag.prefixShadowedByLocalDeclaration,
-          30,
-          7,
-          messageContains: ["'NonType'"],
-        ),
-      ],
-    );
+''');
   }
 
   test_new_nonType_prefixed() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'test.dart' as prefix;
 
 void NonType() {}
 f() {
   new prefix.NonType();
+//           ^^^^^^^
+// [diag.newWithNonType] The name 'NonType' isn't a class.
 }
-''',
-      [
-        error(
-          diag.newWithNonType,
-          68,
-          7,
-          text: "The name 'NonType' isn't a class.",
-        ),
-      ],
-    );
+''');
   }
 
   test_new_nonType_prefixedGeneric() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'test.dart' as prefix;
 
 void NonType<T>() {}
 f() {
   new prefix.NonType<int>();
+//           ^^^^^^^
+// [diag.newWithNonType] The name 'NonType' isn't a class.
 }
-''',
-      [
-        error(
-          diag.newWithNonType,
-          71,
-          7,
-          text: "The name 'NonType' isn't a class.",
-        ),
-      ],
-    );
+''');
   }
 
   test_new_nonType_prefixedGenericNamed() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'test.dart' as prefix;
 
 void NonType<T>() {}
 f() {
   new prefix.NonType<int>.named();
+//           ^^^^^^^
+// [diag.newWithNonType] The name 'NonType' isn't a class.
 }
-''',
-      [
-        error(
-          diag.newWithNonType,
-          71,
-          7,
-          text: "The name 'NonType' isn't a class.",
-        ),
-      ],
-    );
+''');
   }
 
   test_new_nonType_prefixedNamed() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'test.dart' as prefix;
 
 void NonType() {}
 f() {
   new prefix.NonType.named();
+//           ^^^^^^^
+// [diag.newWithNonType] The name 'NonType' isn't a class.
 }
-''',
-      [
-        error(
-          diag.newWithNonType,
-          68,
-          7,
-          text: "The name 'NonType' isn't a class.",
-        ),
-      ],
-    );
+''');
   }
 
   test_new_nonType_unnamed() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 void NonType() {}
 f() {
   new NonType();
+//    ^^^^^^^
+// [diag.newWithNonType] The name 'NonType' isn't a class.
 }
-''',
-      [
-        error(
-          diag.newWithNonType,
-          30,
-          7,
-          text: "The name 'NonType' isn't a class.",
-        ),
-      ],
-    );
+''');
   }
 
   test_new_unresolvedClass_generic() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 f() {
   new UnresolvedClass<int>();
+//    ^^^^^^^^^^^^^^^
+// [diag.newWithNonType] The name 'UnresolvedClass' isn't a class.
 }
-''',
-      [
-        error(
-          diag.newWithNonType,
-          12,
-          15,
-          text: "The name 'UnresolvedClass' isn't a class.",
-        ),
-      ],
-    );
+''');
   }
 
   test_new_unresolvedClass_genericNamed() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 f() {
   new UnresolvedClass<int>.named();
+//    ^^^^^^^^^^^^^^^
+// [diag.newWithNonType] The name 'UnresolvedClass' isn't a class.
 }
-''',
-      [
-        error(
-          diag.newWithNonType,
-          12,
-          15,
-          text: "The name 'UnresolvedClass' isn't a class.",
-        ),
-      ],
-    );
+''');
   }
 
   test_new_unresolvedClass_named() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 f() {
   new UnresolvedClass.named();
+//    ^^^^^^^^^^^^^^^^^^^^^
+// [diag.undefinedIdentifier] Undefined name 'UnresolvedClass'.
 }
-''',
-      [
-        error(
-          diag.undefinedIdentifier,
-          12,
-          21,
-          text: "Undefined name 'UnresolvedClass'.",
-        ),
-      ],
-    );
+''');
   }
 
   test_new_unresolvedClass_prefixed() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'test.dart' as prefix;
 
 f() {
   new prefix.UnresolvedClass();
+//           ^^^^^^^^^^^^^^^
+// [diag.newWithNonType] The name 'UnresolvedClass' isn't a class.
 }
-''',
-      [
-        error(
-          diag.newWithNonType,
-          50,
-          15,
-          text: "The name 'UnresolvedClass' isn't a class.",
-        ),
-      ],
-    );
+''');
   }
 
   test_new_unresolvedClass_prefixedGeneric() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'test.dart' as prefix;
 
 f() {
   new prefix.UnresolvedClass<int>();
+//           ^^^^^^^^^^^^^^^
+// [diag.newWithNonType] The name 'UnresolvedClass' isn't a class.
 }
-''',
-      [
-        error(
-          diag.newWithNonType,
-          50,
-          15,
-          text: "The name 'UnresolvedClass' isn't a class.",
-        ),
-      ],
-    );
+''');
   }
 
   test_new_unresolvedClass_prefixedGenericNamed() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'test.dart' as prefix;
 
 f() {
   new prefix.UnresolvedClass<int>.named();
+//           ^^^^^^^^^^^^^^^
+// [diag.newWithNonType] The name 'UnresolvedClass' isn't a class.
 }
-''',
-      [
-        error(
-          diag.newWithNonType,
-          50,
-          15,
-          text: "The name 'UnresolvedClass' isn't a class.",
-        ),
-      ],
-    );
+''');
   }
 
   test_new_unresolvedClass_prefixedNamed() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'test.dart' as prefix;
 
 f() {
   new prefix.UnresolvedClass.named();
+//           ^^^^^^^^^^^^^^^
+// [diag.newWithNonType] The name 'UnresolvedClass' isn't a class.
 }
-''',
-      [
-        error(
-          diag.newWithNonType,
-          50,
-          15,
-          text: "The name 'UnresolvedClass' isn't a class.",
-        ),
-      ],
-    );
+''');
   }
 
   test_new_unresolvedClass_unnamed() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 f() {
   new UnresolvedClass();
+//    ^^^^^^^^^^^^^^^
+// [diag.newWithNonType] The name 'UnresolvedClass' isn't a class.
 }
-''',
-      [
-        error(
-          diag.newWithNonType,
-          12,
-          15,
-          text: "The name 'UnresolvedClass' isn't a class.",
-        ),
-      ],
-    );
+''');
   }
 
   test_new_unresolvedPrefix_generic() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 f() {
   new unresolved.Class<int>();
+//    ^^^^^^^^^^^^^^^^
+// [diag.undefinedIdentifier] Undefined name 'unresolved'.
 }
-''',
-      [
-        error(
-          diag.undefinedIdentifier,
-          12,
-          16,
-          text: "Undefined name 'unresolved'.",
-        ),
-      ],
-    );
+''');
   }
 
   test_new_unresolvedPrefix_genericNamed() async {
-    await assertErrorsInCode(
-      r'''
+    // TODO(johnniwinther): This could be "Undefined prefix 'unresolved'.".
+    await resolveTestCodeWithDiagnostics(r'''
 f() {
   new unresolved.Class<int>.named();
+//    ^^^^^^^^^^^^^^^^
+// [diag.undefinedIdentifier] Undefined name 'unresolved'.
 }
-''',
-      [
-        error(
-          diag.undefinedIdentifier,
-          12,
-          16,
-          // TODO(johnniwinther): This could be
-          //  "Undefined prefix 'unresolved'.".
-          text: "Undefined name 'unresolved'.",
-        ),
-      ],
-    );
+''');
   }
 
   test_new_unresolvedPrefix_named() async {
-    await assertErrorsInCode(
-      r'''
+    // TODO(johnniwinther): This could be "Undefined prefix 'unresolved'.".
+    await resolveTestCodeWithDiagnostics(r'''
 f() {
   new unresolved.Class.named();
+//    ^^^^^^^^^^^^^^^^
+// [diag.undefinedIdentifier] Undefined name 'unresolved'.
 }
-''',
-      [
-        error(
-          diag.undefinedIdentifier,
-          12,
-          16,
-          // TODO(johnniwinther): This could be
-          //  "Undefined prefix 'unresolved'.".
-          text: "Undefined name 'unresolved'.",
-        ),
-      ],
-    );
+''');
   }
 
   test_new_unresolvedPrefix_unnamed() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 f() {
   new unresolved.Class();
+//    ^^^^^^^^^^^^^^^^
+// [diag.undefinedIdentifier] Undefined name 'unresolved'.
 }
-''',
-      [
-        error(
-          diag.undefinedIdentifier,
-          12,
-          16,
-          text: "Undefined name 'unresolved'.",
-        ),
-      ],
-    );
+''');
   }
 }
diff --git a/pkg/analyzer/test/src/diagnostics/dead_code_test.dart b/pkg/analyzer/test/src/diagnostics/dead_code_test.dart
index 8f5c5ea..0bfdc86 100644
--- a/pkg/analyzer/test/src/diagnostics/dead_code_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/dead_code_test.dart
@@ -2,7 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/src/diagnostic/diagnostic.dart' as diag;
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../dart/resolution/context_collection_resolution.dart';
@@ -19,360 +18,320 @@
 class DeadCodeTest extends PubPackageResolutionTest
     with DeadCodeTestCases_Language212 {
   test_asExpression_type() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 Never doNotReturn() => throw 0;
 
 test() => doNotReturn() as int;
-''',
-      [error(diag.deadCode, 60, 4)],
-    );
+//                         ^^^^
+// [diag.deadCode] Dead code.
+''');
   }
 
   test_deadBlock_conditionalElse_recordPropertyAccess() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 void f(({int x, int y}) p) {
   true ? p.x : p.y;
+//             ^^^
+// [diag.deadCode] Dead code.
 }
-''',
-      [error(diag.deadCode, 44, 3)],
-    );
+''');
   }
 
   test_deadOperandLHS_or_recordPropertyAccess() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 void f(({bool b, }) r) {
   if (true || r.b) {}
+//         ^^^^^^
+// [diag.deadCode] Dead code.
 }
-''',
-      [error(diag.deadCode, 36, 6)],
-    );
+''');
   }
 
   test_deadPattern_ifCase_logicalOrPattern_leftAlwaysMatches() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 void f(int x) {
   if (x case int() || 0) {}
+//                 ^^^^
+// [diag.deadCode] Dead code.
 }
-''',
-      [error(diag.deadCode, 35, 4)],
-    );
+''');
   }
 
   test_deadPattern_ifCase_logicalOrPattern_leftAlwaysMatches_nested() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 void f(int x) {
   if (x case (int() || 0) && 1) {}
+//                  ^^^^
+// [diag.deadCode] Dead code.
 }
-''',
-      [error(diag.deadCode, 36, 4)],
-    );
+''');
   }
 
   test_deadPattern_ifCase_logicalOrPattern_leftAlwaysMatches_nested2() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 void f(Object? x) {
   if (x case <int>[int() || 0, 1]) {}
+//                       ^^^^
+// [diag.deadCode] Dead code.
 }
-''',
-      [error(diag.deadCode, 45, 4)],
-    );
+''');
   }
 
   test_deadPattern_switchExpression_logicalOrPattern() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 Object f(int x) {
   return switch (x) {
     int() || 0 => 0,
+//        ^^^^
+// [diag.deadCode] Dead code.
   };
 }
-''',
-      [error(diag.deadCode, 50, 4)],
-    );
+''');
   }
 
   test_deadPattern_switchExpression_logicalOrPattern_nextCases() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 Object f(int x) {
   return switch (x) {
     int() || 0 => 0,
+//        ^^^^
+// [diag.deadCode] Dead code.
     int() => 1,
+//  ^^^^^^^^^^
+// [diag.deadCode] Dead code.
+//        ^^
+// [diag.unreachableSwitchCase] This case is covered by the previous cases.
     _ => 2,
+//  ^^^^^^
+// [diag.deadCode] Dead code.
+//    ^^
+// [diag.unreachableSwitchCase] This case is covered by the previous cases.
   };
 }
-''',
-      [
-        error(diag.deadCode, 50, 4),
-        error(diag.deadCode, 65, 10),
-        error(diag.unreachableSwitchCase, 71, 2),
-        error(diag.deadCode, 81, 6),
-        error(diag.unreachableSwitchCase, 83, 2),
-      ],
-    );
+''');
   }
 
   test_deadPattern_switchStatement_logicalOrPattern() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 void f(int x) {
   switch (x) {
     case int() || 0:
+//             ^^^^
+// [diag.deadCode] Dead code.
       break;
   }
 }
-''',
-      [error(diag.deadCode, 46, 4)],
-    );
+''');
   }
 
   test_deadPattern_switchStatement_nextCases() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 void f(int x) {
   switch (x) {
     case int() || 0:
+//             ^^^^
+// [diag.deadCode] Dead code.
     case 1:
+//  ^^^^
+// [diag.deadCode] Dead code.
+// [diag.unreachableSwitchCase] This case is covered by the previous cases.
     default:
+//  ^^^^^^^
+// [diag.deadCode] Dead code.
       break;
   }
 }
-''',
-      [
-        error(diag.deadCode, 46, 4),
-        error(diag.deadCode, 56, 4),
-        error(diag.unreachableSwitchCase, 56, 4),
-        error(diag.deadCode, 68, 7),
-      ],
-    );
+''');
   }
 
   test_deadPattern_switchStatement_nextCases2() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 void f(int x) {
   switch (x) {
     case int() || 42:
+//             ^^^^^
+// [diag.deadCode] Dead code.
     case int() || 1:
+//  ^^^^
+// [diag.deadCode] Dead code.
+// [diag.unreachableSwitchCase] This case is covered by the previous cases.
     case 2:
+//  ^^^^
+// [diag.deadCode] Dead code.
+// [diag.unreachableSwitchCase] This case is covered by the previous cases.
       break;
   }
 }
-''',
-      [
-        error(diag.deadCode, 46, 5),
-        error(diag.deadCode, 57, 4),
-        error(diag.unreachableSwitchCase, 57, 4),
-        error(diag.deadCode, 78, 4),
-        error(diag.unreachableSwitchCase, 78, 4),
-      ],
-    );
+''');
   }
 
   test_flowEnd_forElementParts_initializer_pattern_throw() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 f() => [for (var (i) = throw 0; true; 1) 0];
-''',
-      [error(diag.unusedLocalVariable, 18, 1), error(diag.deadCode, 32, 7)],
-    );
+//                ^
+// [diag.unusedLocalVariable] The value of the local variable 'i' isn't used.
+//                              ^^^^^^^
+// [diag.deadCode] Dead code.
+''');
   }
 
   test_flowEnd_forParts_initializer_pattern_throw() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 void f() {
   for (var (i) = throw 0; true; 1) {}
+//          ^
+// [diag.unusedLocalVariable] The value of the local variable 'i' isn't used.
+//                        ^^^^^^^
+// [diag.deadCode] Dead code.
 }
-''',
-      [error(diag.unusedLocalVariable, 23, 1), error(diag.deadCode, 37, 7)],
-    );
+''');
   }
 
   test_forLoop_noUpdaters() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 Never foo() => throw "Never";
 
 test() {
   int i = 0;
   for (foo(); (i = 42) < 0;) {}
+// [diag.deadCode][column 15][length 81] Dead code.
   return i;
 }
-''',
-      [error(diag.deadCode, 67, 29)],
-    );
+''');
   }
 
   test_ifElement_patternAssignment() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 void f(int a) {
   [if (false) (a) = 0];
+//            ^^^^^^^
+// [diag.deadCode] Dead code.
 }
-''',
-      [error(diag.deadCode, 30, 7)],
-    );
+''');
   }
 
   test_isExpression_type() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 Never doNotReturn() => throw 0;
 
 test() => doNotReturn() is int;
-''',
-      [
-        error(diag.unnecessaryTypeCheckTrue, 43, 20),
-        error(diag.deadCode, 60, 4),
-      ],
-    );
+//        ^^^^^^^^^^^^^^^^^^^^
+// [diag.unnecessaryTypeCheckTrue] Unnecessary type check; the result is always 'true'.
+//                         ^^^^
+// [diag.deadCode] Dead code.
+''');
   }
 
   test_localFunction_wildcard() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 void f() {
   _(){}
+//^^^^^
+// [diag.deadCode] Dead code.
 }
-''',
-      [error(diag.deadCode, 13, 5)],
-    );
+''');
   }
 
   test_localFunction_wildcard_preWildcards() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 // @dart = 3.4
 // (pre wildcard-variables)
 
 void f() {
   _(){}
+//^
+// [diag.unusedElement] The declaration '_' isn't referenced.
 }
-''',
-      [
-        // No dead code.
-        error(diag.unusedElement, 57, 1),
-      ],
-    );
+''');
   }
 
   test_nullAwareIndexedRead() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 void f(Null n, int i) {
   n?[i];
+//   ^^
+// [diag.deadCode] Dead code.
   print('reached');
 }
-''',
-      [
-        // Dead range: `i]`
-        error(diag.deadCode, 29, 2),
-      ],
-    );
+''');
   }
 
   test_nullAwareIndexedWrite() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 void f(Null n, int i, int j) {
   n?[i] = j;
+//   ^^^^^^
+// [diag.deadCode] Dead code.
   print('reached');
 }
-''',
-      [
-        // Dead range: `i] = j`
-        error(diag.deadCode, 36, 6),
-      ],
-    );
+''');
   }
 
   test_nullAwareMethodInvocation() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 void f(Null n, int i) {
   n?.foo(i);
+//   ^^^^^^
+// [diag.deadCode] Dead code.
   print('reached');
 }
-''',
-      [
-        // Dead range: `foo(i)`
-        error(diag.deadCode, 29, 6),
-      ],
-    );
+''');
   }
 
   test_nullAwarePropertyRead() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 void f(Null n) {
   n?.p;
+//   ^
+// [diag.deadCode] Dead code.
   print('reached');
 }
-''',
-      [
-        // Dead range: `p`
-        error(diag.deadCode, 22, 1),
-      ],
-    );
+''');
   }
 
   test_nullAwarePropertyWrite() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 void f(Null n, int i) {
   n?.p = i;
+//   ^^^^^
+// [diag.deadCode] Dead code.
   print('reached');
 }
-''',
-      [
-        // Dead range: `p = i`
-        error(diag.deadCode, 29, 5),
-      ],
-    );
+''');
   }
 
   test_objectPattern_neverTypedGetter() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   Never get foo => throw 0;
 }
 
 void f(Object x) {
   if (x case A(foo: _)) {}
+//                      ^^
+// [diag.deadCode] Dead code.
 }
-''',
-      [error(diag.deadCode, 84, 2)],
-    );
+''');
   }
 
   test_prefixedIdentifier_identifier() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 Never get doNotReturn => throw 0;
 
 test() => doNotReturn.hashCode;
-''',
-      [error(diag.deadCode, 57, 9)],
-    );
+//                    ^^^^^^^^^
+// [diag.deadCode] Dead code.
+''');
   }
 
   test_propertyAccess_property() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 Never doNotReturn() => throw 0;
 
 test() => doNotReturn().hashCode;
-''',
-      [error(diag.deadCode, 57, 9)],
-    );
+//                      ^^^^^^^^^
+// [diag.deadCode] Dead code.
+''');
   }
 }
 
@@ -382,99 +341,91 @@
   List<String> get experiments => ['anonymous-methods'];
 
   test_cascaded_deadCode() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 void f() {
   never..=> 1;
+//     ^^^^^^^
+// [diag.deadCode] Dead code.
 }
 
 Never get never => throw 0;
-''',
-      [error(diag.deadCode, 18, 7)],
-    );
+''');
   }
 
   test_nullaware_deadCode() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 void f() {
   null?.=> 1;
+//    ^^^^^^
+// [diag.deadCode] Dead code.
 }
-''',
-      [error(diag.deadCode, 17, 6)],
-    );
+''');
   }
 
   test_nullawareCascaded_deadCode() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 void f() {
   null?..=> 1;
+//    ^^^^^^^^
+// [diag.deadCode] Dead code.
 }
-''',
-      [error(diag.deadCode, 17, 8)],
-    );
+''');
   }
 
   test_parameterized_cascaded_deadCode() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 void f() {
   never..(_) => 1;
+//     ^^^^^^^^^^^
+// [diag.deadCode] Dead code.
 }
 
 Never get never => throw 0;
-''',
-      [error(diag.deadCode, 18, 11)],
-    );
+''');
   }
 
   test_parameterized_nullaware_deadCode() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 void f() {
   null?.(_) => 1;
+//    ^^^^^^^^^^
+// [diag.deadCode] Dead code.
 }
-''',
-      [error(diag.deadCode, 17, 10)],
-    );
+''');
   }
 
   test_parameterized_nullawareCascaded_deadCode() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 void f() {
   null?..(_) => 1;
+//    ^^^^^^^^^^^^
+// [diag.deadCode] Dead code.
 }
-''',
-      [error(diag.deadCode, 17, 12)],
-    );
+''');
   }
 
   test_parameterized_plain_deadCode() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 void f() {
   never.(_) => 1;
+//     ^^^^^^^^^^
+// [diag.deadCode] Dead code.
 }
 
 Never get never => throw 0;
-''',
-      [error(diag.deadCode, 18, 10)],
-    );
+''');
   }
 
   test_plain_deadCode() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 void f() {
   never.=> 1;
+//     ^^^^^^
+// [diag.deadCode] Dead code.
 }
 
 Never get never => throw 0;
-''',
-      [error(diag.deadCode, 18, 6)],
-    );
+''');
   }
 }
 
@@ -547,15 +498,14 @@
   }
 
   test_assert() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 void f() {
   return;
   assert (true);
+//^^^^^^^^^^^^^^
+// [diag.deadCode] Dead code.
 }
-''',
-      [error(diag.deadCode, 23, 14)],
-    );
+''');
   }
 
   test_assert_dead_message() async {
@@ -563,54 +513,49 @@
     // because this results in nuisance warnings for desirable assertions (e.g.
     // a `!= null` assertion that is redundant with strong checking but still
     // useful with weak checking).
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics('''
 void f(Object waldo) {
   assert(waldo != null, "Where's Waldo?");
+//             ^^^^^^^
+// [diag.unnecessaryNullComparisonNeverNullTrue] The operand can't be 'null', so the condition is always 'true'.
 }
-''',
-      [error(diag.unnecessaryNullComparisonNeverNullTrue, 38, 7)],
-    );
+''');
   }
 
   test_assigned_methodInvocation() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 void f() {
   int? i = 1;
   i?.truncate();
+// ^^
+// [diag.invalidNullAwareOperator] The receiver can't be null, so the null-aware operator '?.' is unnecessary.
 }
-''',
-      [error(diag.invalidNullAwareOperator, 28, 2)],
-    );
+''');
   }
 
   test_class_field_initializer_listLiteral() async {
     // Based on https://github.com/dart-lang/sdk/issues/49701
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics('''
 Never f() { throw ''; }
 
 class C {
   static final x = [1, 2, f(), 4];
+//                             ^^
+// [diag.deadCode] Dead code.
 }
-''',
-      [error(diag.deadCode, 66, 2)],
-    );
+''');
   }
 
   test_constructorInitializerWithThrow_thenBlockBody() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   int x;
   A() : x = throw 0 {
+// [diag.deadCode][column 21][length 64] Dead code.
     x;
   }
 }
-''',
-      [error(diag.deadCode, 39, 12)],
-    );
+''');
   }
 
   test_constructorInitializerWithThrow_thenEmptyBlockBody() async {
@@ -632,30 +577,28 @@
   }
 
   test_constructorInitializerWithThrow_thenExpressions() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   var x = [8];
   A() : x = [7, throw 8, 9];
+//                       ^^^
+// [diag.deadCode] Dead code.
 }
-''',
-      [error(diag.deadCode, 50, 3)],
-    );
+''');
   }
 
   test_constructorInitializerWithThrow_thenInitializer() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   int x;
   int y;
   A()
       : x = throw 0,
         y = 7;
+//      ^^^^^
+// [diag.deadCode] Dead code.
 }
-''',
-      [error(diag.deadCode, 63, 5)],
-    );
+''');
   }
 
   test_continueInSwitch() async {
@@ -672,14 +615,13 @@
   }
 
   test_deadBlock_conditionalElse() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 f() {
   true ? 1 : 2;
+//           ^
+// [diag.deadCode] Dead code.
 }
-''',
-      [error(diag.deadCode, 19, 1)],
-    );
+''');
   }
 
   test_deadBlock_conditionalElse_debugConst() async {
@@ -693,25 +635,23 @@
 
   test_deadBlock_conditionalElse_nested() async {
     // Test that a dead else-statement can't generate additional violations.
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 f() {
   true ? true : false && false;
+//              ^^^^^^^^^^^^^^
+// [diag.deadCode] Dead code.
 }
-''',
-      [error(diag.deadCode, 22, 14)],
-    );
+''');
   }
 
   test_deadBlock_conditionalThen() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 f() {
   false ? 1 : 2;
+//        ^
+// [diag.deadCode] Dead code.
 }
-''',
-      [error(diag.deadCode, 16, 1)],
-    );
+''');
   }
 
   test_deadBlock_conditionalThen_debugConst() async {
@@ -725,25 +665,23 @@
 
   test_deadBlock_conditionalThen_nested() async {
     // Test that a dead then-statement can't generate additional violations.
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 f() {
   false ? false && false : true;
+//        ^^^^^^^^^^^^^^
+// [diag.deadCode] Dead code.
 }
-''',
-      [error(diag.deadCode, 16, 14)],
-    );
+''');
   }
 
   test_deadBlock_else() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 f() {
   if(true) {} else {}
+//                 ^^
+// [diag.deadCode] Dead code.
 }
-''',
-      [error(diag.deadCode, 25, 2)],
-    );
+''');
   }
 
   test_deadBlock_else_debugConst() async {
@@ -757,25 +695,23 @@
 
   test_deadBlock_else_nested() async {
     // Test that a dead else-statement can't generate additional violations.
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 f() {
   if(true) {} else {if (false) {}}
+//                 ^^^^^^^^^^^^^^^
+// [diag.deadCode] Dead code.
 }
-''',
-      [error(diag.deadCode, 25, 15)],
-    );
+''');
   }
 
   test_deadBlock_if() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 f() {
   if(false) {}
+//          ^^
+// [diag.deadCode] Dead code.
 }
-''',
-      [error(diag.deadCode, 18, 2)],
-    );
+''');
   }
 
   test_deadBlock_if_debugConst_prefixedIdentifier() async {
@@ -827,52 +763,48 @@
 
   test_deadBlock_if_nested() async {
     // Test that a dead then-statement can't generate additional violations.
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 f() {
   if(false) {if(false) {}}
+//          ^^^^^^^^^^^^^^
+// [diag.deadCode] Dead code.
 }
-''',
-      [error(diag.deadCode, 18, 14)],
-    );
+''');
   }
 
   test_deadBlock_ifElement() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 f() {
   [
     if (false) 2,
+//             ^
+// [diag.deadCode] Dead code.
   ];
 }
-''',
-      [error(diag.deadCode, 25, 1)],
-    );
+''');
   }
 
   test_deadBlock_ifElement_else() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 f() {
   [
     if (true) 2
     else 3,
+//       ^
+// [diag.deadCode] Dead code.
   ];
 }
-''',
-      [error(diag.deadCode, 35, 1)],
-    );
+''');
   }
 
   test_deadBlock_while() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 f() {
   while(false) {}
+//             ^^
+// [diag.deadCode] Dead code.
 }
-''',
-      [error(diag.deadCode, 21, 2)],
-    );
+''');
   }
 
   test_deadBlock_while_debugConst() async {
@@ -886,131 +818,119 @@
 
   test_deadBlock_while_nested() async {
     // Test that a dead while body can't generate additional violations.
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 f() {
   while(false) {if(false) {}}
+//             ^^^^^^^^^^^^^^
+// [diag.deadCode] Dead code.
 }
-''',
-      [error(diag.deadCode, 21, 14)],
-    );
+''');
   }
 
   test_deadCatch_catchFollowingCatch() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {}
 f() {
   try {} catch (e) {} catch (e) {}
+//                    ^^^^^^^^^^^^
+// [diag.deadCodeCatchFollowingCatch] Dead code: Catch clauses after a 'catch (e)' or an 'on Object catch (e)' are never reached.
 }
-''',
-      [error(diag.deadCodeCatchFollowingCatch, 39, 12)],
-    );
+''');
   }
 
   test_deadCatch_catchFollowingCatch_nested() async {
     // Test that a dead catch clause can't generate additional violations.
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {}
 f() {
   try {} catch (e) {} catch (e) {if(false) {}}
+//                    ^^^^^^^^^^^^^^^^^^^^^^^^
+// [diag.deadCodeCatchFollowingCatch] Dead code: Catch clauses after a 'catch (e)' or an 'on Object catch (e)' are never reached.
 }
-''',
-      [error(diag.deadCodeCatchFollowingCatch, 39, 24)],
-    );
+''');
   }
 
   test_deadCatch_catchFollowingCatch_object() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 f() {
   try {} on Object catch (e) {} catch (e) {}
+//                        ^
+// [diag.unusedCatchClause] The exception variable 'e' isn't used, so the 'catch' clause can be removed.
+//                              ^^^^^^^^^^^^
+// [diag.deadCodeCatchFollowingCatch] Dead code: Catch clauses after a 'catch (e)' or an 'on Object catch (e)' are never reached.
 }
-''',
-      [
-        error(diag.unusedCatchClause, 32, 1),
-        error(diag.deadCodeCatchFollowingCatch, 38, 12),
-      ],
-    );
+''');
   }
 
   test_deadCatch_catchFollowingCatch_object_nested() async {
     // Test that a dead catch clause can't generate additional violations.
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 f() {
   try {} on Object catch (e) {} catch (e) {if(false) {}}
+//                        ^
+// [diag.unusedCatchClause] The exception variable 'e' isn't used, so the 'catch' clause can be removed.
+//                              ^^^^^^^^^^^^^^^^^^^^^^^^
+// [diag.deadCodeCatchFollowingCatch] Dead code: Catch clauses after a 'catch (e)' or an 'on Object catch (e)' are never reached.
 }
-''',
-      [
-        error(diag.unusedCatchClause, 32, 1),
-        error(diag.deadCodeCatchFollowingCatch, 38, 24),
-      ],
-    );
+''');
   }
 
   test_deadCatch_onCatchSubtype() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {}
 class B extends A {}
 f() {
   try {} on A catch (e) {} on B catch (e) {}
+//                   ^
+// [diag.unusedCatchClause] The exception variable 'e' isn't used, so the 'catch' clause can be removed.
+//                         ^^^^^^^^^^^^^^^^^
+// [diag.deadCodeOnCatchSubtype] Dead code: This on-catch block won't be executed because 'B' is a subtype of 'A' and hence will have been caught already.
+//                                     ^
+// [diag.unusedCatchClause] The exception variable 'e' isn't used, so the 'catch' clause can be removed.
 }
-''',
-      [
-        error(diag.unusedCatchClause, 59, 1),
-        error(diag.deadCodeOnCatchSubtype, 65, 17),
-        error(diag.unusedCatchClause, 77, 1),
-      ],
-    );
+''');
   }
 
   test_deadCatch_onCatchSubtype_nested() async {
     // Test that a dead catch clause can't generate additional violations.
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {}
 class B extends A {}
 f() {
   try {} on A catch (e) {} on B catch (e) {if(false) {}}
+//                   ^
+// [diag.unusedCatchClause] The exception variable 'e' isn't used, so the 'catch' clause can be removed.
+//                         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// [diag.deadCodeOnCatchSubtype] Dead code: This on-catch block won't be executed because 'B' is a subtype of 'A' and hence will have been caught already.
+//                                     ^
+// [diag.unusedCatchClause] The exception variable 'e' isn't used, so the 'catch' clause can be removed.
 }
-''',
-      [
-        error(diag.unusedCatchClause, 59, 1),
-        error(diag.deadCodeOnCatchSubtype, 65, 29),
-        error(diag.unusedCatchClause, 77, 1),
-      ],
-    );
+''');
   }
 
   test_deadCatch_onCatchSupertype() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {}
 class B extends A {}
 f() {
   try {} on B catch (e) {} on A catch (e) {} catch (e) {}
+//                   ^
+// [diag.unusedCatchClause] The exception variable 'e' isn't used, so the 'catch' clause can be removed.
+//                                     ^
+// [diag.unusedCatchClause] The exception variable 'e' isn't used, so the 'catch' clause can be removed.
 }
-''',
-      [
-        error(diag.unusedCatchClause, 59, 1),
-        error(diag.unusedCatchClause, 77, 1),
-      ],
-    );
+''');
   }
 
   test_deadOperandLHS_and() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 f() {
   bool b = false && false;
+//               ^^^^^^^^
+// [diag.deadCode] Dead code.
   print(b);
 }
-''',
-      [error(diag.deadCode, 23, 8)],
-    );
+''');
   }
 
   test_deadOperandLHS_and_debugConst() async {
@@ -1024,51 +944,47 @@
   }
 
   test_deadOperandLHS_and_nested() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 f() {
   bool b = false && (false && false);
+//               ^^^^^^^^^^^^^^^^^^^
+// [diag.deadCode] Dead code.
   print(b);
 }
-''',
-      [error(diag.deadCode, 23, 19)],
-    );
+''');
   }
 
   test_deadOperandLHS_or() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 f() {
   bool b = true || true;
+//              ^^^^^^^
+// [diag.deadCode] Dead code.
   print(b);
 }
-''',
-      [error(diag.deadCode, 22, 7)],
-    );
+''');
   }
 
   test_deadOperandLHS_or_debugConst() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 const bool DEBUG = true;
 f() {
   bool b = DEBUG || true;
+//     ^
+// [diag.unusedLocalVariable] The value of the local variable 'b' isn't used.
 }
-''',
-      [error(diag.unusedLocalVariable, 38, 1)],
-    );
+''');
   }
 
   test_deadOperandLHS_or_nested() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 f() {
   bool b = true || (false && false);
+//              ^^^^^^^^^^^^^^^^^^^
+// [diag.deadCode] Dead code.
   print(b);
 }
-''',
-      [error(diag.deadCode, 22, 19)],
-    );
+''');
   }
 
   test_documentationComment() async {
@@ -1079,22 +995,20 @@
   }
 
   test_doWhile() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 void f(bool c) {
   do {
     print(c);
     return;
   } while (c);
+//^^^^^^^^^^^^
+// [diag.deadCode] Dead code.
 }
-''',
-      [error(diag.deadCode, 52, 12)],
-    );
+''');
   }
 
   test_doWhile_break() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 void f(bool c) {
   do {
     if (c) {
@@ -1102,16 +1016,15 @@
     }
     return;
   } while (c);
+//^^^^^^^^^^^^
+// [diag.deadCode] Dead code.
   print('');
 }
-''',
-      [error(diag.deadCode, 69, 12)],
-    );
+''');
   }
 
   test_doWhile_break_doLabel() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 void f(bool c) {
   label:
   do {
@@ -1120,16 +1033,15 @@
     }
     return;
   } while (c);
+//^^^^^^^^^^^^
+// [diag.deadCode] Dead code.
   print('');
 }
-''',
-      [error(diag.deadCode, 85, 12)],
-    );
+''');
   }
 
   test_doWhile_break_inner() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 void f(bool c) {
   do {
     while (c) {
@@ -1137,16 +1049,17 @@
     }
     return;
   } while (c);
+//^^^^^^^^^^^^
+// [diag.deadCode] Dead code.
   print('');
+//^^^^^^^^^^
+// [diag.deadCode] Dead code.
 }
-''',
-      [error(diag.deadCode, 73, 12), error(diag.deadCode, 88, 10)],
-    );
+''');
   }
 
   Future<void> test_doWhile_break_outerDoLabel() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 void f(bool c) {
   label:
   do {
@@ -1156,18 +1069,18 @@
       }
       return;
     } while (c);
+//  ^^^^^^^^^^^^
+// [diag.deadCode] Dead code.
     print('');
+// [diag.deadCode][column 5][length 89] Dead code.
   } while (c);
   print('');
 }
-''',
-      [error(diag.deadCode, 104, 12), error(diag.deadCode, 121, 38)],
-    );
+''');
   }
 
   Future<void> test_doWhile_break_outerLabel() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 void f(bool c) {
   label: {
     do {
@@ -1176,523 +1089,495 @@
       }
       return;
     } while (c);
+//  ^^^^^^^^^^^^
+// [diag.deadCode] Dead code.
     print('');
+// [diag.deadCode][column 5][length 65] Dead code.
   }
 }
-''',
-      [error(diag.deadCode, 98, 12), error(diag.deadCode, 115, 14)],
-    );
+''');
   }
 
   test_doWhile_statements() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 void f(bool c) {
   do {
     print(c);
     return;
   } while (c);
+//^^^^^^^^^^^^
+// [diag.deadCode] Dead code.
   print('2');
+//^^^^^^^^^^^
+// [diag.deadCode] Dead code.
 }
-''',
-      [error(diag.deadCode, 52, 12), error(diag.deadCode, 67, 11)],
-    );
+''');
   }
 
   test_flowEnd_block_forStatement_updaters() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 void f() {
   for (;; 1) {
+//        ^
+// [diag.deadCode] Dead code.
     return;
     2;
+//  ^^
+// [diag.deadCode] Dead code.
   }
 }
-''',
-      [error(diag.deadCode, 21, 1), error(diag.deadCode, 42, 2)],
-    );
+''');
   }
 
   test_flowEnd_block_forStatement_updaters_multiple() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 void f() {
   for (;; 1, 2) {
+//        ^^^^
+// [diag.deadCode] Dead code.
     return;
   }
 }
-''',
-      [error(diag.deadCode, 21, 4)],
-    );
+''');
   }
 
   test_flowEnd_forElementParts_condition_exists() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 f() => [for (; throw 0; 1) 0];
-''',
-      [error(diag.deadCode, 24, 1), error(diag.deadCode, 27, 3)],
-    );
+//                      ^
+// [diag.deadCode] Dead code.
+//                         ^^^
+// [diag.deadCode] Dead code.
+''');
   }
 
   test_flowEnd_forElementParts_condition_throw() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 f(bool Function(Object?, Object?) g) => [for (; g(throw 0, 1); 2) 0];
-''',
-      [error(diag.deadCode, 59, 10)],
-    );
+//                                                         ^^^^^^^^^^
+// [diag.deadCode] Dead code.
+''');
   }
 
   test_flowEnd_forElementParts_initializer_declaration_throw() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 f() => [for (var i = throw 0; true; 1) 0];
-''',
-      [error(diag.unusedLocalVariable, 17, 1), error(diag.deadCode, 30, 7)],
-    );
+//               ^
+// [diag.unusedLocalVariable] The value of the local variable 'i' isn't used.
+//                            ^^^^^^^
+// [diag.deadCode] Dead code.
+''');
   }
 
   test_flowEnd_forElementParts_initializer_expression_throw() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 f() => [for (throw 0; true; 1) 0];
-''',
-      [error(diag.deadCode, 22, 7)],
-    );
+//                    ^^^^^^^
+// [diag.deadCode] Dead code.
+''');
   }
 
   test_flowEnd_forElementParts_updaters_assignmentExpression() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 f() => [for (var i = 0;; i = i + 1) throw ''];
-''',
-      [error(diag.deadCode, 25, 9)],
-    );
+//                       ^^^^^^^^^
+// [diag.deadCode] Dead code.
+''');
   }
 
   test_flowEnd_forElementParts_updaters_binaryExpression() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 f() => [for (var i = 0;; i + 1) throw ''];
-''',
-      [error(diag.deadCode, 25, 5)],
-    );
+//                       ^^^^^
+// [diag.deadCode] Dead code.
+''');
   }
 
   test_flowEnd_forElementParts_updaters_cascadeExpression() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 f() => [for (var i = 0;; i..sign) throw ''];
-''',
-      [error(diag.deadCode, 25, 7)],
-    );
+//                       ^^^^^^^
+// [diag.deadCode] Dead code.
+''');
   }
 
   test_flowEnd_forElementParts_updaters_conditionalExpression() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 f() => [for (var i = 0;; i > 1 ? i : i) throw ''];
-''',
-      [error(diag.deadCode, 25, 13)],
-    );
+//                       ^^^^^^^^^^^^^
+// [diag.deadCode] Dead code.
+''');
   }
 
   test_flowEnd_forElementParts_updaters_indexExpression() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 f(List<int> values) => [for (;; values[0]) throw ''];
-''',
-      [error(diag.deadCode, 32, 9)],
-    );
+//                              ^^^^^^^^^
+// [diag.deadCode] Dead code.
+''');
   }
 
   test_flowEnd_forElementParts_updaters_instanceCreationExpression() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class C {}
 f() => [for (;; C()) throw ''];
-''',
-      [error(diag.deadCode, 27, 3)],
-    );
+//              ^^^
+// [diag.deadCode] Dead code.
+''');
   }
 
   test_flowEnd_forElementParts_updaters_methodInvocation() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 f() => [for (var i = 0;; i.toString()) throw ''];
-''',
-      [error(diag.deadCode, 25, 12)],
-    );
+//                       ^^^^^^^^^^^^
+// [diag.deadCode] Dead code.
+''');
   }
 
   test_flowEnd_forElementParts_updaters_postfixExpression() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 f() => [for (var i = 0;; i++) throw ''];
-''',
-      [error(diag.deadCode, 25, 3)],
-    );
+//                       ^^^
+// [diag.deadCode] Dead code.
+''');
   }
 
   test_flowEnd_forElementParts_updaters_prefixedIdentifier() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'dart:math' as m;
 
 f() => [for (;; m.Point) throw ''];
-''',
-      [error(diag.deadCode, 42, 7)],
-    );
+//              ^^^^^^^
+// [diag.deadCode] Dead code.
+''');
   }
 
   test_flowEnd_forElementParts_updaters_prefixExpression() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 f() => [for (var i = 0;; ++i) throw ''];
-''',
-      [error(diag.deadCode, 25, 3)],
-    );
+//                       ^^^
+// [diag.deadCode] Dead code.
+''');
   }
 
   test_flowEnd_forElementParts_updaters_propertyAccess() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 f() => [for (var i = 0;; (i).sign) throw ''];
-''',
-      [error(diag.deadCode, 25, 8)],
-    );
+//                       ^^^^^^^^
+// [diag.deadCode] Dead code.
+''');
   }
 
   test_flowEnd_forElementParts_updaters_throw() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 f() => [for (;; 0, throw 1, 2) 0];
-''',
-      [error(diag.deadCode, 28, 1)],
-    );
+//                          ^
+// [diag.deadCode] Dead code.
+''');
   }
 
   test_flowEnd_forParts_condition_exists() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 void f() {
   for (; throw 0; 1) {}
+//                ^
+// [diag.deadCode] Dead code.
+//                   ^^
+// [diag.deadCode] Dead code.
 }
-''',
-      [error(diag.deadCode, 29, 1), error(diag.deadCode, 32, 2)],
-    );
+''');
   }
 
   test_flowEnd_forParts_condition_throw() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 void f(bool Function(Object?, Object?) g) {
   for (; g(throw 0, 1); 2) {}
+//                  ^^^^^^^^^
+// [diag.deadCode] Dead code.
 }
-''',
-      [error(diag.deadCode, 64, 9)],
-    );
+''');
   }
 
   test_flowEnd_forParts_initializer_declaration_throw() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 void f() {
   for (var i = throw 0; true; 1) {}
+//         ^
+// [diag.unusedLocalVariable] The value of the local variable 'i' isn't used.
+//                      ^^^^^^^
+// [diag.deadCode] Dead code.
 }
-''',
-      [error(diag.unusedLocalVariable, 22, 1), error(diag.deadCode, 35, 7)],
-    );
+''');
   }
 
   test_flowEnd_forParts_initializer_expression_throw() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 void f() {
   for (throw 0; true; 1) {}
+//              ^^^^^^^
+// [diag.deadCode] Dead code.
 }
-''',
-      [error(diag.deadCode, 27, 7)],
-    );
+''');
   }
 
   test_flowEnd_forParts_updaters_assignmentExpression() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 void f() {
   for (var i = 0;; i = i + 1) {
+//                 ^^^^^^^^^
+// [diag.deadCode] Dead code.
     return;
   }
 }
-''',
-      [error(diag.deadCode, 30, 9)],
-    );
+''');
   }
 
   test_flowEnd_forParts_updaters_binaryExpression() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 void f() {
   for (var i = 0;; i + 1) {
+//                 ^^^^^
+// [diag.deadCode] Dead code.
     return;
   }
 }
-''',
-      [error(diag.deadCode, 30, 5)],
-    );
+''');
   }
 
   test_flowEnd_forParts_updaters_cascadeExpression() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 void f() {
   for (var i = 0;; i..sign) {
+//                 ^^^^^^^
+// [diag.deadCode] Dead code.
     return;
   }
 }
-''',
-      [error(diag.deadCode, 30, 7)],
-    );
+''');
   }
 
   test_flowEnd_forParts_updaters_conditionalExpression() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 void f() {
   for (var i = 0;; i > 1 ? i : i) {
+//                 ^^^^^^^^^^^^^
+// [diag.deadCode] Dead code.
     return;
   }
 }
-''',
-      [error(diag.deadCode, 30, 13)],
-    );
+''');
   }
 
   test_flowEnd_forParts_updaters_indexExpression() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 void f(List<int> values) {
   for (;; values[0]) {
+//        ^^^^^^^^^
+// [diag.deadCode] Dead code.
     return;
   }
 }
-''',
-      [error(diag.deadCode, 37, 9)],
-    );
+''');
   }
 
   test_flowEnd_forParts_updaters_instanceCreationExpression() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class C {}
 void f() {
   for (;; C()) {
+//        ^^^
+// [diag.deadCode] Dead code.
     return;
   }
 }
-''',
-      [error(diag.deadCode, 32, 3)],
-    );
+''');
   }
 
   test_flowEnd_forParts_updaters_methodInvocation() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 void f() {
   for (var i = 0;; i.toString()) {
+//                 ^^^^^^^^^^^^
+// [diag.deadCode] Dead code.
     return;
   }
 }
-''',
-      [error(diag.deadCode, 30, 12)],
-    );
+''');
   }
 
   test_flowEnd_forParts_updaters_postfixExpression() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 void f() {
   for (var i = 0;; i++) {
+//                 ^^^
+// [diag.deadCode] Dead code.
     return;
   }
 }
-''',
-      [error(diag.deadCode, 30, 3)],
-    );
+''');
   }
 
   test_flowEnd_forParts_updaters_prefixedIdentifier() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'dart:math' as m;
 
 void f() {
   for (;; m.Point) {
+//        ^^^^^^^
+// [diag.deadCode] Dead code.
     return;
   }
 }
-''',
-      [error(diag.deadCode, 47, 7)],
-    );
+''');
   }
 
   test_flowEnd_forParts_updaters_prefixExpression() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 void f() {
   for (var i = 0;; ++i) {
+//                 ^^^
+// [diag.deadCode] Dead code.
     return;
   }
 }
-''',
-      [error(diag.deadCode, 30, 3)],
-    );
+''');
   }
 
   test_flowEnd_forParts_updaters_propertyAccess() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 void f() {
   for (var i = 0;; (i).sign) {
+//                 ^^^^^^^^
+// [diag.deadCode] Dead code.
     return;
   }
 }
-''',
-      [error(diag.deadCode, 30, 8)],
-    );
+''');
   }
 
   test_flowEnd_forParts_updaters_throw() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 void f() {
   for (;; 0, throw 1, 2) {}
+//                    ^
+// [diag.deadCode] Dead code.
 }
-''',
-      [error(diag.deadCode, 33, 1)],
-    );
+''');
   }
 
   test_flowEnd_forStatement() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 main() {
   for (var v in [0, 1, 2]) {
     v;
     return;
     1;
+//  ^^
+// [diag.deadCode] Dead code.
   }
   2;
 }
-''',
-      [error(diag.deadCode, 61, 2)],
-    );
+''');
   }
 
   test_flowEnd_ifStatement() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 void f(bool a) {
   if (a) {
     return;
     1;
+//  ^^
+// [diag.deadCode] Dead code.
   }
   2;
 }
-''',
-      [error(diag.deadCode, 44, 2)],
-    );
+''');
   }
 
   test_flowEnd_list_forElement_updaters() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 f() => [for (;; 1) ...[throw '', 2]];
-''',
-      [error(diag.deadCode, 16, 1), error(diag.deadCode, 33, 4)],
-    );
+//              ^
+// [diag.deadCode] Dead code.
+//                               ^^^^
+// [diag.deadCode] Dead code.
+''');
   }
 
   test_flowEnd_list_forElement_updaters_multiple() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 f() => [for (;; 1, 2) ...[throw '']];
-''',
-      [error(diag.deadCode, 16, 4)],
-    );
+//              ^^^^
+// [diag.deadCode] Dead code.
+''');
   }
 
   test_flowEnd_nestedBlock_forStatement_updaters() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 void f() {
   for (;; 1) {
+//        ^
+// [diag.deadCode] Dead code.
     {
       return;
       2;
+// [diag.deadCode][column 7][length 59] Dead code.
     }
   }
 }
-''',
-      [error(diag.deadCode, 21, 1), error(diag.deadCode, 52, 8)],
-    );
+''');
   }
 
   test_flowEnd_nestedBlock_forStatement_updaters_multiple() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 void f() {
   for (;; 1, 2) {
+//        ^^^^
+// [diag.deadCode] Dead code.
     {
       return;
     }
   }
 }
-''',
-      [error(diag.deadCode, 21, 4)],
-    );
+''');
   }
 
   test_flowEnd_tryStatement_body() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 Never foo() => throw 0;
 
 main() {
   try {
     foo();
     1;
+//  ^^
+// [diag.deadCode] Dead code.
   } catch (_) {
     2;
   }
   3;
 }
-''',
-      [error(diag.deadCode, 57, 2)],
-    );
+''');
   }
 
   test_flowEnd_tryStatement_catchClause() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 main() {
   try {
     1;
   } catch (_) {
     return;
     2;
+//  ^^
+// [diag.deadCode] Dead code.
   }
   3;
 }
-''',
-      [error(diag.deadCode, 56, 2)],
-    );
+''');
   }
 
   test_flowEnd_tryStatement_finally() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 main() {
   try {
     1;
@@ -1700,106 +1585,99 @@
     2;
     return;
     3;
+// [diag.deadCode][column 5][length 62] Dead code.
   }
   4;
 }
-''',
-      [error(diag.deadCode, 61, 11)],
-    );
+''');
   }
 
   test_forStatement() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 void f() {
   return;
   for (;;) {}
+//^^^^^^^^^^^
+// [diag.deadCode] Dead code.
 }
-''',
-      [error(diag.deadCode, 23, 11)],
-    );
+''');
   }
 
   test_ifStatement_noCase_conditionFalse() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 void f() {
   if (false) {
+// [diag.deadCode][column 14][length 64] Dead code.
     1;
   } else {
     2;
   }
   3;
 }
-''',
-      [error(diag.deadCode, 24, 12)],
-    );
+''');
   }
 
   test_ifStatement_noCase_conditionTrue() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 void f() {
   if (true) {
     1;
   } else {
+// [diag.deadCode][column 10][length 64] Dead code.
     2;
   }
   3;
 }
-''',
-      [error(diag.deadCode, 41, 12)],
-    );
+''');
   }
 
   test_invokeNever_functionExpressionInvocation_getter_propertyAccess() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   Never get f => throw 0;
 }
 void g(A a) {
   a.f(0);
+//^^^
+// [diag.receiverOfTypeNever] The receiver is of type 'Never', and will never complete with a value.
+// [diag.deadCode][column 6][length 175] Dead code.
   print(1);
 }
-''',
-      [error(diag.receiverOfTypeNever, 54, 3), error(diag.deadCode, 57, 16)],
-    );
+''');
   }
 
   test_invokeNever_functionExpressionInvocation_parenthesizedExpression() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 void g(Never f) {
   (f)(0);
+//^^^
+// [diag.receiverOfTypeNever] The receiver is of type 'Never', and will never complete with a value.
+// [diag.deadCode][column 6][length 175] Dead code.
   print(1);
 }
-''',
-      [error(diag.receiverOfTypeNever, 20, 3), error(diag.deadCode, 23, 16)],
-    );
+''');
   }
 
   test_invokeNever_functionExpressionInvocation_simpleIdentifier() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 void g(Never f) {
   f(0);
+//^
+// [diag.receiverOfTypeNever] The receiver is of type 'Never', and will never complete with a value.
+// [diag.deadCode][column 4][length 173] Dead code.
   print(1);
 }
-''',
-      [error(diag.receiverOfTypeNever, 20, 1), error(diag.deadCode, 21, 16)],
-    );
+''');
   }
 
   test_lateWildCardVariable_initializer() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 f() {
   late var _ = 0;
+//             ^
+// [diag.deadCodeLateWildcardVariableInitializer] Dead code: The assigned-to wildcard variable is marked late and can never be referenced so this initializer will never be evaluated.
 }
-''',
-      [error(diag.deadCodeLateWildcardVariableInitializer, 21, 1)],
-    );
+''');
   }
 
   test_lateWildCardVariable_noInitializer() async {
@@ -1831,175 +1709,163 @@
   }
 
   test_returnTypeNever_function() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 Never foo() => throw 0;
 
 main() {
   foo();
   1;
+//^^
+// [diag.deadCode] Dead code.
 }
-''',
-      [error(diag.deadCode, 45, 2)],
-    );
+''');
   }
 
   test_returnTypeNever_getter() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 Never get foo => throw 0;
 
 main() {
   foo;
   2;
+//^^
+// [diag.deadCode] Dead code.
 }
-''',
-      [error(diag.deadCode, 45, 2)],
-    );
+''');
   }
 
-  @failingTest
   test_statementAfterAlwaysThrowsGetter() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'package:meta/meta.dart';
 
 class C {
   @alwaysThrows
+// ^^^^^^^^^^^^
+// [diag.deprecatedMemberUseWithMessage] 'alwaysThrows' is deprecated and shouldn't be used. Use a return type of 'Never' instead.
   int get a {
     throw 'msg';
   }
+}
 
 f() {
   print(1);
   new C().a;
   print(2);
 }
-''',
-      [error(diag.deadCode, 129, 9)],
-    );
+''');
   }
 
   test_statementAfterBreak_inDefaultCase() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 f(v) {
   switch(v) {
     case 1:
     default:
       break;
       print(1);
+//    ^^^^^^^^^
+// [diag.deadCode] Dead code.
   }
 }
-''',
-      [error(diag.deadCode, 65, 9)],
-    );
+''');
   }
 
   test_statementAfterBreak_inForEachStatement() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 f() {
   var list;
   for(var l in list) {
     break;
     print(l);
+//  ^^^^^^^^^
+// [diag.deadCode] Dead code.
   }
 }
-''',
-      [error(diag.deadCode, 56, 9)],
-    );
+''');
   }
 
   test_statementAfterBreak_inForStatement() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 f() {
   for(;;) {
     break;
     print(1);
+//  ^^^^^^^^^
+// [diag.deadCode] Dead code.
   }
 }
-''',
-      [error(diag.deadCode, 33, 9)],
-    );
+''');
   }
 
   test_statementAfterBreak_inSwitchCase() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 f(v) {
   switch(v) {
     case 1:
       break;
       print(1);
+//    ^^^^^^^^^
+// [diag.deadCode] Dead code.
   }
 }
-''',
-      [error(diag.deadCode, 52, 9)],
-    );
+''');
   }
 
   test_statementAfterBreak_inWhileStatement() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 f(v) {
   while(v) {
     break;
     print(1);
+//  ^^^^^^^^^
+// [diag.deadCode] Dead code.
   }
 }
-''',
-      [error(diag.deadCode, 35, 9)],
-    );
+''');
   }
 
   test_statementAfterContinue_inForEachStatement() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 f() {
   var list;
   for(var l in list) {
     continue;
     print(l);
+//  ^^^^^^^^^
+// [diag.deadCode] Dead code.
   }
 }
-''',
-      [error(diag.deadCode, 59, 9)],
-    );
+''');
   }
 
   test_statementAfterContinue_inForStatement() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 f() {
   for(;;) {
     continue;
     print(1);
+//  ^^^^^^^^^
+// [diag.deadCode] Dead code.
   }
 }
-''',
-      [error(diag.deadCode, 36, 9)],
-    );
+''');
   }
 
   test_statementAfterContinue_inWhileStatement() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 f(v) {
   while(v) {
     continue;
     print(1);
+//  ^^^^^^^^^
+// [diag.deadCode] Dead code.
   }
 }
-''',
-      [error(diag.deadCode, 38, 9)],
-    );
+''');
   }
 
   test_statementAfterExitingIf_returns() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 f() {
   if (1 > 2) {
     return;
@@ -2007,10 +1873,10 @@
     return;
   }
   print(1);
+//^^^^^^^^^
+// [diag.deadCode] Dead code.
 }
-''',
-      [error(diag.deadCode, 62, 9)],
-    );
+''');
   }
 
   test_statementAfterIfWithoutElse() async {
@@ -2025,139 +1891,128 @@
   }
 
   test_statementAfterRethrow() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 f() {
   try {
     print(1);
   } catch (e) {
     rethrow;
     print(2);
+//  ^^^^^^^^^
+// [diag.deadCode] Dead code.
   }
 }
-''',
-      [error(diag.deadCode, 61, 9)],
-    );
+''');
   }
 
   test_statementAfterReturn_function() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 f() {
   print(1);
   return;
   print(2);
+//^^^^^^^^^
+// [diag.deadCode] Dead code.
 }
-''',
-      [error(diag.deadCode, 30, 9)],
-    );
+''');
   }
 
   test_statementAfterReturn_function_local() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 f() {
   void g() {
     print(1);
     return;
     print(2);
+//  ^^^^^^^^^
+// [diag.deadCode] Dead code.
   }
   g();
 }
-''',
-      [error(diag.deadCode, 49, 9)],
-    );
+''');
   }
 
   test_statementAfterReturn_functionExpression() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 f() {
   () {
     print(1);
     return;
     print(2);
+//  ^^^^^^^^^
+// [diag.deadCode] Dead code.
   };
 }
-''',
-      [error(diag.deadCode, 43, 9)],
-    );
+''');
   }
 
   test_statementAfterReturn_ifStatement() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 f(bool b) {
   if(b) {
     print(1);
     return;
     print(2);
+//  ^^^^^^^^^
+// [diag.deadCode] Dead code.
   }
 }
-''',
-      [error(diag.deadCode, 52, 9)],
-    );
+''');
   }
 
   test_statementAfterReturn_method() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   m() {
     print(1);
     return;
     print(2);
+//  ^^^^^^^^^
+// [diag.deadCode] Dead code.
   }
 }
-''',
-      [error(diag.deadCode, 48, 9)],
-    );
+''');
   }
 
   test_statementAfterReturn_nested() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 f() {
   print(1);
   return;
   if(false) {}
+//^^^^^^^^^^^^
+// [diag.deadCode] Dead code.
 }
-''',
-      [error(diag.deadCode, 30, 12)],
-    );
+''');
   }
 
   test_statementAfterReturn_twoReturns() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 f() {
   print(1);
   return;
   print(2);
+// [diag.deadCode][column 3][length 82] Dead code.
   return;
   print(3);
 }
-''',
-      [error(diag.deadCode, 30, 31)],
-    );
+''');
   }
 
   test_statementAfterThrow() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 f() {
   print(1);
   throw 'Stop here';
   print(2);
+//^^^^^^^^^
+// [diag.deadCode] Dead code.
 }
-''',
-      [error(diag.deadCode, 41, 9)],
-    );
+''');
   }
 
   test_switchCase_final_break() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 void f(int a) {
   switch (a) {
     case 0:
@@ -2165,16 +2020,15 @@
         return;
       }
       break;
+//    ^^^^^^
+// [diag.deadCode] Dead code.
   }
 }
-''',
-      [error(diag.deadCode, 96, 6)],
-    );
+''');
   }
 
   test_switchCase_final_continue() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 void f(int a) {
   for (var i = 0; i < 2; i++) {
     switch (a) {
@@ -2183,17 +2037,16 @@
           return;
         }
         continue;
+//      ^^^^^^^^^
+// [diag.deadCode] Dead code.
     }
   }
 }
-''',
-      [error(diag.deadCode, 140, 9)],
-    );
+''');
   }
 
   test_switchCase_final_rethrow() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 void f(int a) {
   try {
     // empty
@@ -2204,17 +2057,16 @@
           return;
         }
         rethrow;
+//      ^^^^^^^^
+// [diag.deadCode] Dead code.
     }
   }
 }
-''',
-      [error(diag.deadCode, 142, 8)],
-    );
+''');
   }
 
   test_switchCase_final_return() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 void f(int a) {
   switch (a) {
     case 0:
@@ -2222,16 +2074,15 @@
         return;
       }
       return;
+//    ^^^^^^^
+// [diag.deadCode] Dead code.
   }
 }
-''',
-      [error(diag.deadCode, 96, 7)],
-    );
+''');
   }
 
   test_switchCase_final_throw() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 void f(int a) {
   switch (a) {
     case 0:
@@ -2239,16 +2090,15 @@
         return;
       }
       throw 0;
+//    ^^^^^^^^
+// [diag.deadCode] Dead code.
   }
 }
-''',
-      [error(diag.deadCode, 96, 8)],
-    );
+''');
   }
 
   test_switchStatement_exhaustive() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 enum Foo { a, b }
 
 int f(Foo foo) {
@@ -2257,171 +2107,160 @@
     case Foo.b: return 1;
   }
   return -1;
+//^^^^^^^^^^
+// [diag.deadCode] Dead code.
 }
-''',
-      [error(diag.deadCode, 111, 10)],
-    );
+''');
   }
 
   test_topLevelVariable_initializer_listLiteral() async {
     // Based on https://github.com/dart-lang/sdk/issues/49701
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics('''
 Never f() { throw ''; }
 
 var x = [1, 2, f(), 4];
-''',
-      [error(diag.deadCode, 45, 2)],
-    );
+//                  ^^
+// [diag.deadCode] Dead code.
+''');
   }
 
   test_try_finally() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics('''
 main() {
   try {
     foo();
     print('dead');
+//  ^^^^^^^^^^^^^^
+// [diag.deadCode] Dead code.
   } finally {
     print('alive');
   }
   print('dead');
+//^^^^^^^^^^^^^^
+// [diag.deadCode] Dead code.
 }
 Never foo() => throw 'exception';
-''',
-      [error(diag.deadCode, 32, 14), error(diag.deadCode, 87, 14)],
-    );
+''');
   }
 
   test_unassigned_cascadeExpression_indexExpression() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 void f() {
   List<int>? l;
   l?..[0]..length;
+// ^^^^^^^^^^^^^^
+// [diag.deadCode] Dead code.
 }
-''',
-      [error(diag.deadCode, 30, 14)],
-    );
+''');
   }
 
   test_unassigned_cascadeExpression_methodInvocation() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 void f() {
   int? i;
   i?..toInt()..isEven;
+// ^^^^^^^^^^^^^^^^^^
+// [diag.deadCode] Dead code.
 }
-''',
-      [error(diag.deadCode, 24, 18)],
-    );
+''');
   }
 
   test_unassigned_cascadeExpression_propertyAccess() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 void f() {
   int? i;
   i?..sign..isEven;
+// ^^^^^^^^^^^^^^^
+// [diag.deadCode] Dead code.
 }
-''',
-      [error(diag.deadCode, 24, 15)],
-    );
+''');
   }
 
   test_unassigned_indexExpression() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 void f() {
   List<int>? l;
   l?[0];
+// ^^^^
+// [diag.deadCode] Dead code.
 }
-''',
-      [error(diag.deadCode, 30, 4)],
-    );
+''');
   }
 
   test_unassigned_indexExpression_indexExpression() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 void f() {
   List<List<int>>? l;
   l?[0][0];
+// ^^^^^^^
+// [diag.deadCode] Dead code.
 }
-''',
-      [error(diag.deadCode, 36, 7)],
-    );
+''');
   }
 
   test_unassigned_methodInvocation() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 void f() {
   int? i;
   i?.truncate();
+// ^^^^^^^^^^^^
+// [diag.deadCode] Dead code.
 }
-''',
-      [error(diag.deadCode, 24, 12)],
-    );
+''');
   }
 
   test_unassigned_methodInvocation_methodInvocation() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 void f() {
   int? i;
   i?.truncate().truncate();
+// ^^^^^^^^^^^^^^^^^^^^^^^
+// [diag.deadCode] Dead code.
 }
-''',
-      [error(diag.deadCode, 24, 23)],
-    );
+''');
   }
 
   test_unassigned_methodInvocation_propertyAccess() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 void f() {
   int? i;
   i?.truncate().sign;
+// ^^^^^^^^^^^^^^^^^
+// [diag.deadCode] Dead code.
 }
-''',
-      [error(diag.deadCode, 24, 17)],
-    );
+''');
   }
 
   test_unassigned_propertyAccess() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 void f() {
   int? i;
   (i)?.sign;
+//   ^^^^^^
+// [diag.deadCode] Dead code.
 }
-''',
-      [error(diag.deadCode, 26, 6)],
-    );
+''');
   }
 
   test_unassigned_propertyAccess_propertyAccess() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 void f() {
   int? i;
   (i)?.sign.sign;
+//   ^^^^^^^^^^^
+// [diag.deadCode] Dead code.
 }
-''',
-      [error(diag.deadCode, 26, 11)],
-    );
+''');
   }
 
   test_yield() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 Iterable<int> f() sync* {
   return;
   yield 1;
+//^^^^^^^^
+// [diag.deadCode] Dead code.
 }
-''',
-      [error(diag.deadCode, 38, 8)],
-    );
+''');
   }
 }
diff --git a/pkg/analyzer/test/src/diagnostics/dead_null_aware_expression_test.dart b/pkg/analyzer/test/src/diagnostics/dead_null_aware_expression_test.dart
index d02713c..45ea355 100644
--- a/pkg/analyzer/test/src/diagnostics/dead_null_aware_expression_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/dead_null_aware_expression_test.dart
@@ -2,21 +2,22 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/src/diagnostic/diagnostic.dart' as diag;
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../dart/resolution/context_collection_resolution.dart';
+import '../dart/resolution/node_text_expectations.dart';
 
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(DeadNullAwareExpressionTest);
+    defineReflectiveTests(UpdateNodeTextExpectations);
   });
 }
 
 @reflectiveTest
 class DeadNullAwareExpressionTest extends PubPackageResolutionTest {
   test_assignCompound_map() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class MyMap<K, V> {
   V? operator[](K key) => null;
   void operator[]=(K key, V value) {}
@@ -29,18 +30,19 @@
   }
 
   test_assignCompound_nonNullable() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 f(int x) {
   x ??= 0;
+//      ^^
+// [diag.deadCode] Dead code.
+//      ^
+// [diag.deadNullAwareExpression] The left operand can't be null, so the right operand is never executed.
 }
-''',
-      [error(diag.deadCode, 19, 2), error(diag.deadNullAwareExpression, 19, 1)],
-    );
+''');
   }
 
   test_assignCompound_nullable() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 f(int? x) {
   x ??= 0;
 }
@@ -48,18 +50,19 @@
   }
 
   test_binary_nonNullable() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 f(int x) {
   x ?? 0;
+//  ^^^^
+// [diag.deadCode] Dead code.
+//     ^
+// [diag.deadNullAwareExpression] The left operand can't be null, so the right operand is never executed.
 }
-''',
-      [error(diag.deadCode, 15, 4), error(diag.deadNullAwareExpression, 18, 1)],
-    );
+''');
   }
 
   test_binary_nullable() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 f(int? x) {
   x ?? 0;
 }
@@ -67,7 +70,7 @@
   }
 
   test_binary_nullType() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 f(Null x) {
   x ?? 1;
 }
diff --git a/pkg/analyzer/test/src/diagnostics/default_value_in_function_type_test.dart b/pkg/analyzer/test/src/diagnostics/default_value_in_function_type_test.dart
index a1dd3a6..63140fd 100644
--- a/pkg/analyzer/test/src/diagnostics/default_value_in_function_type_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/default_value_in_function_type_test.dart
@@ -2,81 +2,72 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/src/diagnostic/diagnostic.dart' as diag;
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../dart/resolution/context_collection_resolution.dart';
+import '../dart/resolution/node_text_expectations.dart';
 
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(DefaultValueInFunctionTypeTest);
+    defineReflectiveTests(UpdateNodeTextExpectations);
   });
 }
 
 @reflectiveTest
 class DefaultValueInFunctionTypeTest extends PubPackageResolutionTest {
   test_new_named() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 typedef F = int Function({Map<String, String> m = const {}});
-''',
-      [error(diag.defaultValueInFunctionType, 48, 1)],
-    );
+//                                              ^
+// [diag.defaultValueInFunctionType] Parameters in a function type can't have default values.
+''');
   }
 
   test_new_named_ambiguous() async {
-    // Test that the strong checker does not crash when given an ambiguous set
-    // or map literal.
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 typedef F = int Function({Object m = const {1, 2: 3}});
-''',
-      [
-        error(diag.defaultValueInFunctionType, 35, 1),
-        error(diag.ambiguousSetOrMapLiteralBoth, 37, 15),
-      ],
-    );
+//                                 ^
+// [diag.defaultValueInFunctionType] Parameters in a function type can't have default values.
+//                                   ^^^^^^^^^^^^^^^
+// [diag.ambiguousSetOrMapLiteralBoth] The literal can't be either a map or a set because it contains at least one literal map entry or a spread operator spreading a 'Map', and at least one element which is neither of these.
+''');
   }
 
   test_new_positional() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 typedef F = int Function([Map<String, String> m = const {}]);
-''',
-      [error(diag.defaultValueInFunctionType, 48, 1)],
-    );
+//                                              ^
+// [diag.defaultValueInFunctionType] Parameters in a function type can't have default values.
+''');
   }
 
   test_old_named() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 typedef F([x = 0]);
-''',
-      [error(diag.defaultValueInFunctionType, 13, 1)],
-    );
+//           ^
+// [diag.defaultValueInFunctionType] Parameters in a function type can't have default values.
+''');
   }
 
   test_old_positional() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 typedef F([x = 0]);
-''',
-      [error(diag.defaultValueInFunctionType, 13, 1)],
-    );
+//           ^
+// [diag.defaultValueInFunctionType] Parameters in a function type can't have default values.
+''');
   }
 
   test_typeArgument_ofInstanceCreation() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 class A<T> {}
 
 void f() {
   A<void Function([int x = 42])>();
+//                       ^
+// [diag.defaultValueInFunctionType] Parameters in a function type can't have default values.
 }
-''',
-      [error(diag.defaultValueInFunctionType, 51, 1)],
-    );
-    // The expression is resolved, even if it is invalid.
+''');
     assertType(findNode.integerLiteral('42'), 'int');
   }
 }
diff --git a/pkg/analyzer/test/src/diagnostics/default_value_in_redirecting_factory_constructor_test.dart b/pkg/analyzer/test/src/diagnostics/default_value_in_redirecting_factory_constructor_test.dart
index 4697b58..864da9b 100644
--- a/pkg/analyzer/test/src/diagnostics/default_value_in_redirecting_factory_constructor_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/default_value_in_redirecting_factory_constructor_test.dart
@@ -2,14 +2,15 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/src/diagnostic/diagnostic.dart' as diag;
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../dart/resolution/context_collection_resolution.dart';
+import '../dart/resolution/node_text_expectations.dart';
 
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(DefaultValueInRedirectingFactoryConstructorTest);
+    defineReflectiveTests(UpdateNodeTextExpectations);
   });
 }
 
@@ -17,17 +18,16 @@
 class DefaultValueInRedirectingFactoryConstructorTest
     extends PubPackageResolutionTest {
   test_default_value() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   factory A([int x = 0]) = B;
+//               ^
+// [diag.defaultValueInRedirectingFactoryConstructor] Default values aren't allowed in factory constructors that redirect to another constructor.
 }
 
 class B implements A {
   B([int x = 1]) {}
 }
-''',
-      [error(diag.defaultValueInRedirectingFactoryConstructor, 27, 1)],
-    );
+''');
   }
 }
diff --git a/pkg/analyzer/test/src/diagnostics/default_value_on_required_parameter_test.dart b/pkg/analyzer/test/src/diagnostics/default_value_on_required_parameter_test.dart
index 0e2336e..0da2d90 100644
--- a/pkg/analyzer/test/src/diagnostics/default_value_on_required_parameter_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/default_value_on_required_parameter_test.dart
@@ -2,65 +2,63 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/src/diagnostic/diagnostic.dart' as diag;
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../dart/resolution/context_collection_resolution.dart';
+import '../dart/resolution/node_text_expectations.dart';
 
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(DefaultValueOnRequiredParameterTest);
+    defineReflectiveTests(UpdateNodeTextExpectations);
   });
 }
 
 @reflectiveTest
 class DefaultValueOnRequiredParameterTest extends PubPackageResolutionTest {
   test_function_notRequired_default() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 void log({String message = 'no message'}) {}
 ''');
   }
 
   test_function_notRequired_noDefault() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 void log({String? message}) {}
 ''');
   }
 
   test_function_required_default() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 void log({required String? message = 'no message'}) {}
-''',
-      [error(diag.defaultValueOnRequiredParameter, 27, 7)],
-    );
+//                         ^^^^^^^
+// [diag.defaultValueOnRequiredParameter] Required named parameters can't have a default value.
+''');
   }
 
   test_function_required_noDefault() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 void log({required String message}) {}
 ''');
   }
 
   test_method_abstract_required_default() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 abstract class C {
   void foo({required int? a = 0});
+//                        ^
+// [diag.defaultValueOnRequiredParameter] Required named parameters can't have a default value.
 }
-''',
-      [error(diag.defaultValueOnRequiredParameter, 45, 1)],
-    );
+''');
   }
 
   test_method_required_default() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 class C {
   void foo({required int? a = 0}) {}
+//                        ^
+// [diag.defaultValueOnRequiredParameter] Required named parameters can't have a default value.
 }
-''',
-      [error(diag.defaultValueOnRequiredParameter, 36, 1)],
-    );
+''');
   }
 }
diff --git a/pkg/analyzer/test/src/diagnostics/deferred_import_of_extension_test.dart b/pkg/analyzer/test/src/diagnostics/deferred_import_of_extension_test.dart
index a9b2678..3740721 100644
--- a/pkg/analyzer/test/src/diagnostics/deferred_import_of_extension_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/deferred_import_of_extension_test.dart
@@ -2,14 +2,15 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/src/diagnostic/diagnostic.dart' as diag;
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../dart/resolution/context_collection_resolution.dart';
+import '../dart/resolution/node_text_expectations.dart';
 
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(DeferredImportOfExtensionTest);
+    defineReflectiveTests(UpdateNodeTextExpectations);
   });
 }
 
@@ -20,16 +21,15 @@
 extension E on C {}
 class C {}
 ''');
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'foo.dart' deferred as foo;
+//     ^^^^^^^^^^
+// [diag.deferredImportOfExtension] Deferred library imports must hide all extension declarations.
 
 void f() {
   foo.C();
 }
-''',
-      [error(diag.deferredImportOfExtension, 7, 10)],
-    );
+''');
   }
 
   Future<void> test_deferredImport_withHiddenExtensions() async {
@@ -37,7 +37,7 @@
 extension E on C {}
 class C {}
 ''');
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'foo.dart' deferred as foo hide E;
 
 void f() {
@@ -50,7 +50,7 @@
     newFile('$testPackageLibPath/foo.dart', '''
 class C {}
 ''');
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'foo.dart' deferred as foo;
 
 void f() {
@@ -64,7 +64,7 @@
 extension E on C {}
 class C {}
 ''');
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'foo.dart' deferred as foo show C;
 
 void f() {
diff --git a/pkg/analyzer/test/src/diagnostics/definitely_unassigned_late_local_variable_test.dart b/pkg/analyzer/test/src/diagnostics/definitely_unassigned_late_local_variable_test.dart
index be29699..ac251f9 100644
--- a/pkg/analyzer/test/src/diagnostics/definitely_unassigned_late_local_variable_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/definitely_unassigned_late_local_variable_test.dart
@@ -2,53 +2,47 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/error/error.dart';
-import 'package:analyzer/src/diagnostic/diagnostic.dart' as diag;
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../dart/resolution/context_collection_resolution.dart';
+import '../dart/resolution/node_text_expectations.dart';
 
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(DefinitelyUnassignedLateLocalVariableTest);
+    defineReflectiveTests(UpdateNodeTextExpectations);
   });
 }
 
 @reflectiveTest
 class DefinitelyUnassignedLateLocalVariableTest
     extends PubPackageResolutionTest {
-  DiagnosticCode get _errorCode {
-    return diag.definitelyUnassignedLateLocalVariable;
-  }
-
   test_definitelyAssigned_after_compoundAssignment() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 void f() {
   late int v;
   v += 1;
+//^
+// [diag.definitelyUnassignedLateLocalVariable] The late local variable 'v' is definitely unassigned at this point.
   v;
 }
-''',
-      [error(_errorCode, 27, 1)],
-    );
+''');
   }
 
   test_definitelyAssigned_after_postfixExpression_increment() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 void f() {
   late int v;
   v++;
+//^
+// [diag.definitelyUnassignedLateLocalVariable] The late local variable 'v' is definitely unassigned at this point.
   v;
 }
-''',
-      [error(_errorCode, 27, 1)],
-    );
+''');
   }
 
   test_mightBeAssigned_byPatternAssignment() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 void main() {
   late String s;
   () {
@@ -60,7 +54,7 @@
   }
 
   test_mightBeAssigned_if_else() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 void f(bool c) {
   late int v;
   if (c) {
@@ -74,7 +68,7 @@
   }
 
   test_mightBeAssigned_if_then() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 void f(bool c) {
   late int v;
   if (c) {
@@ -86,7 +80,7 @@
   }
 
   test_mightBeAssigned_while() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 void f(bool c) {
   late int v;
   while (c) {
@@ -98,74 +92,74 @@
   }
 
   test_neverAssigned_assignment_compound() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 void f() {
   late int v;
+//         ^
+// [diag.unusedLocalVariable] The value of the local variable 'v' isn't used.
   v += 1;
+//^
+// [diag.definitelyUnassignedLateLocalVariable] The late local variable 'v' is definitely unassigned at this point.
 }
-''',
-      [error(diag.unusedLocalVariable, 22, 1), error(_errorCode, 27, 1)],
-    );
+''');
   }
 
   test_neverAssigned_assignment_pure() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 void f() {
   late int v;
+//         ^
+// [diag.unusedLocalVariable] The value of the local variable 'v' isn't used.
   v = 0;
 }
-''',
-      [error(diag.unusedLocalVariable, 22, 1)],
-    );
+''');
   }
 
   test_neverAssigned_nullable() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 void f() {
   late int? v;
   v;
+//^
+// [diag.definitelyUnassignedLateLocalVariable] The late local variable 'v' is definitely unassigned at this point.
 }
-''',
-      [error(_errorCode, 28, 1)],
-    );
+''');
   }
 
   test_neverAssigned_prefixExpression() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 void f() {
   late int v;
+//         ^
+// [diag.unusedLocalVariable] The value of the local variable 'v' isn't used.
   ++v;
+//  ^
+// [diag.definitelyUnassignedLateLocalVariable] The late local variable 'v' is definitely unassigned at this point.
 }
-''',
-      [error(diag.unusedLocalVariable, 22, 1), error(_errorCode, 29, 1)],
-    );
+''');
   }
 
   test_neverAssigned_read() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 void f() {
   late int v;
   v;
+//^
+// [diag.definitelyUnassignedLateLocalVariable] The late local variable 'v' is definitely unassigned at this point.
 }
-''',
-      [error(_errorCode, 27, 1)],
-    );
+''');
   }
 
   test_neverAssigned_suffixExpression() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 void f() {
   late int v;
+//         ^
+// [diag.unusedLocalVariable] The value of the local variable 'v' isn't used.
   v++;
+//^
+// [diag.definitelyUnassignedLateLocalVariable] The late local variable 'v' is definitely unassigned at this point.
 }
-''',
-      [error(diag.unusedLocalVariable, 22, 1), error(_errorCode, 27, 1)],
-    );
+''');
   }
 }
diff --git a/pkg/analyzer/test/src/diagnostics/deprecated_colon_for_default_value_test.dart b/pkg/analyzer/test/src/diagnostics/deprecated_colon_for_default_value_test.dart
index ef828b4..82e7230 100644
--- a/pkg/analyzer/test/src/diagnostics/deprecated_colon_for_default_value_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/deprecated_colon_for_default_value_test.dart
@@ -2,14 +2,15 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/src/diagnostic/diagnostic.dart' as diag;
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../dart/resolution/context_collection_resolution.dart';
+import '../dart/resolution/node_text_expectations.dart';
 
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(DeprecatedColonForDefaultValueTest);
+    defineReflectiveTests(UpdateNodeTextExpectations);
   });
 }
 
@@ -19,14 +20,13 @@
   String get testPackageLanguageVersion => '2.19';
 
   test_noDefault() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 void f({int? x}) {}
 ''');
   }
 
   test_superFormalParameter() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   String? a;
   A({this.a});
@@ -34,23 +34,22 @@
 
 class B extends A {
   B({super.a : ''});
+//           ^
+// [diag.deprecatedColonForDefaultValue] Using a colon as the separator before a default value is deprecated and will not be supported in language version 3.0 and later.
 }
-''',
-      [error(diag.deprecatedColonForDefaultValue, 74, 1)],
-    );
+''');
   }
 
   test_usesColon() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 void f({int x : 0}) {}
-''',
-      [error(diag.deprecatedColonForDefaultValue, 14, 1)],
-    );
+//            ^
+// [diag.deprecatedColonForDefaultValue] Using a colon as the separator before a default value is deprecated and will not be supported in language version 3.0 and later.
+''');
   }
 
   test_usesEqual() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 void f({int x = 0}) {}
 ''');
   }
diff --git a/pkg/analyzer/test/src/diagnostics/deprecated_export_use_test.dart b/pkg/analyzer/test/src/diagnostics/deprecated_export_use_test.dart
index 0972696..f496ec7 100644
--- a/pkg/analyzer/test/src/diagnostics/deprecated_export_use_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/deprecated_export_use_test.dart
@@ -2,7 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/src/diagnostic/diagnostic.dart' as diag;
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../dart/resolution/context_collection_resolution.dart';
@@ -27,16 +26,15 @@
 export 'a.dart';
 ''');
 
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'b.dart';
 
 void f() {
   A;
+//^
+// [diag.deprecatedExportUse] The ability to import 'A' indirectly is deprecated.
 }
-''',
-      [error(diag.deprecatedExportUse, 31, 1)],
-    );
+''');
   }
 
   test_deprecated_class_asExpression_prefixed() async {
@@ -51,16 +49,15 @@
 export 'a.dart';
 ''');
 
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'b.dart' as prefix;
 
 void f() {
   prefix.A;
+//       ^
+// [diag.deprecatedExportUse] The ability to import 'A' indirectly is deprecated.
 }
-''',
-      [error(diag.deprecatedExportUse, 48, 1)],
-    );
+''');
   }
 
   test_deprecated_class_asType() async {
@@ -75,14 +72,13 @@
 export 'a.dart';
 ''');
 
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'b.dart';
 
 void f(A a) {}
-''',
-      [error(diag.deprecatedExportUse, 25, 1)],
-    );
+//     ^
+// [diag.deprecatedExportUse] The ability to import 'A' indirectly is deprecated.
+''');
   }
 
   test_deprecated_class_asType_prefixed() async {
@@ -97,14 +93,13 @@
 export 'a.dart';
 ''');
 
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'b.dart' as prefix;
 
 void f(prefix.A a) {}
-''',
-      [error(diag.deprecatedExportUse, 42, 1)],
-    );
+//            ^
+// [diag.deprecatedExportUse] The ability to import 'A' indirectly is deprecated.
+''');
   }
 
   test_deprecated_class_import_show() async {
@@ -119,14 +114,13 @@
 export 'a.dart';
 ''');
 
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'b.dart' show A;
 
 void f(A a) {}
-''',
-      [error(diag.deprecatedExportUse, 32, 1)],
-    );
+//     ^
+// [diag.deprecatedExportUse] The ability to import 'A' indirectly is deprecated.
+''');
   }
 
   test_deprecated_function() async {
@@ -141,16 +135,15 @@
 export 'a.dart';
 ''');
 
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'b.dart';
 
 void f() {
   foo();
+//^^^
+// [diag.deprecatedExportUse] The ability to import 'foo' indirectly is deprecated.
 }
-''',
-      [error(diag.deprecatedExportUse, 31, 3)],
-    );
+''');
   }
 
   test_deprecated_function_prefixed() async {
@@ -165,16 +158,15 @@
 export 'a.dart';
 ''');
 
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'b.dart' as prefix;
 
 void f() {
   prefix.foo();
+//       ^^^
+// [diag.deprecatedExportUse] The ability to import 'foo' indirectly is deprecated.
 }
-''',
-      [error(diag.deprecatedExportUse, 48, 3)],
-    );
+''');
   }
 
   test_deprecated_getter() async {
@@ -192,16 +184,15 @@
 set foo(int _) {}
 ''');
 
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'b.dart';
 
 void f() {
   foo;
+//^^^
+// [diag.deprecatedExportUse] The ability to import 'foo' indirectly is deprecated.
 }
-''',
-      [error(diag.deprecatedExportUse, 31, 3)],
-    );
+''');
   }
 
   test_deprecated_getter_prefixed() async {
@@ -219,16 +210,15 @@
 set foo(int _) {}
 ''');
 
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'b.dart' as prefix;
 
 void f() {
   prefix.foo;
+//       ^^^
+// [diag.deprecatedExportUse] The ability to import 'foo' indirectly is deprecated.
 }
-''',
-      [error(diag.deprecatedExportUse, 48, 3)],
-    );
+''');
   }
 
   /// While linking `b.dart` and `c.dart` library cycle, we build their
@@ -253,16 +243,15 @@
 import 'b.dart';
 ''');
 
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'b.dart';
 
 void f() {
   foo();
+//^^^
+// [diag.deprecatedExportUse] The ability to import 'foo' indirectly is deprecated.
 }
-''',
-      [error(diag.deprecatedExportUse, 31, 3)],
-    );
+''');
   }
 
   test_deprecated_setter() async {
@@ -280,16 +269,15 @@
 int get foo => 0;
 ''');
 
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'b.dart';
 
 void f() {
   foo = 0;
+//^^^
+// [diag.deprecatedExportUse] The ability to import 'foo' indirectly is deprecated.
 }
-''',
-      [error(diag.deprecatedExportUse, 31, 3)],
-    );
+''');
   }
 
   test_deprecated_setter_prefixed() async {
@@ -307,16 +295,15 @@
 int get foo => 0;
 ''');
 
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'b.dart' as prefix;
 
 void f() {
   prefix.foo = 0;
+//       ^^^
+// [diag.deprecatedExportUse] The ability to import 'foo' indirectly is deprecated.
 }
-''',
-      [error(diag.deprecatedExportUse, 48, 3)],
-    );
+''');
   }
 
   test_deprecated_variable() async {
@@ -331,16 +318,15 @@
 export 'a.dart';
 ''');
 
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'b.dart';
 
 void f() {
   foo;
+//^^^
+// [diag.deprecatedExportUse] The ability to import 'foo' indirectly is deprecated.
 }
-''',
-      [error(diag.deprecatedExportUse, 31, 3)],
-    );
+''');
   }
 
   test_notDeprecated_class_exportedFromPart() async {
@@ -357,7 +343,7 @@
 part 'b.dart';
 ''');
 
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'c.dart';
 
 void f(A a) {}
@@ -378,7 +364,7 @@
 class B {}
 ''');
 
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'a.dart';
 import 'b.dart';
 
@@ -401,7 +387,7 @@
 export 'a.dart';
 ''');
 
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'b.dart';
 
 void f(A a) {}
@@ -422,7 +408,7 @@
 class B {}
 ''');
 
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'a.dart';
 import 'b.dart' hide A;
 
@@ -439,7 +425,7 @@
 export 'a.dart';
 ''');
 
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'b.dart';
 
 void f(A a) {}
@@ -460,7 +446,7 @@
 set foo(int _) {}
 ''');
 
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'b.dart';
 
 void f() {
@@ -483,7 +469,7 @@
 set foo(int _) {}
 ''');
 
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'b.dart' as prefix;
 
 void f() {
@@ -506,7 +492,7 @@
 int get foo => 0;
 ''');
 
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'b.dart';
 
 void f() {
@@ -529,7 +515,7 @@
 int get foo => 0;
 ''');
 
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'b.dart' as prefix;
 
 void f() {
diff --git a/pkg/analyzer/test/src/diagnostics/deprecated_extend_test.dart b/pkg/analyzer/test/src/diagnostics/deprecated_extend_test.dart
index 54f13f8..9e34e8e 100644
--- a/pkg/analyzer/test/src/diagnostics/deprecated_extend_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/deprecated_extend_test.dart
@@ -2,14 +2,15 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/src/diagnostic/diagnostic.dart' as diag;
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../dart/resolution/context_collection_resolution.dart';
+import '../dart/resolution/node_text_expectations.dart';
 
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(DeprecatedExtendTest);
+    defineReflectiveTests(UpdateNodeTextExpectations);
   });
 }
 
@@ -21,13 +22,12 @@
 class Foo {}
 ''');
 
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'foo.dart';
 class Bar extends Foo {}
-''',
-      [error(diag.deprecatedExtend, 37, 3)],
-    );
+//                ^^^
+// [diag.deprecatedExtend] Extending 'Foo' is deprecated.
+''');
   }
 
   test_annotatedClass_indirect() async {
@@ -37,7 +37,7 @@
 class Bar extends Foo {}
 ''');
 
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'foo.dart';
 class Baz extends Bar {}
 ''');
@@ -50,7 +50,7 @@
 typedef Foo2 = Foo;
 ''');
 
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'foo.dart';
 class Bar extends Foo2 {}
 ''');
@@ -63,13 +63,12 @@
 mixin M {}
 ''');
 
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'foo.dart';
 class Bar extends Foo {}
-''',
-      [error(diag.deprecatedExtend, 37, 3)],
-    );
+//                ^^^
+// [diag.deprecatedExtend] Extending 'Foo' is deprecated.
+''');
   }
 
   test_classTypeAlias() async {
@@ -78,18 +77,17 @@
 class Foo {}
 ''');
 
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'foo.dart';
 mixin M {}
 class Bar = Foo with M;
-''',
-      [error(diag.deprecatedExtend, 42, 3)],
-    );
+//          ^^^
+// [diag.deprecatedExtend] Extending 'Foo' is deprecated.
+''');
   }
 
   test_insideLibrary() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 @Deprecated.extend()
 class Foo {}
 class Bar extends Foo {}
@@ -101,7 +99,7 @@
 class Foo {}
 ''');
 
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'foo.dart';
 class Bar extends Foo {}
 ''');
diff --git a/pkg/analyzer/test/src/diagnostics/deprecated_extends_function_test.dart b/pkg/analyzer/test/src/diagnostics/deprecated_extends_function_test.dart
index 8369401..2a11939 100644
--- a/pkg/analyzer/test/src/diagnostics/deprecated_extends_function_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/deprecated_extends_function_test.dart
@@ -2,57 +2,54 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/src/diagnostic/diagnostic.dart' as diag;
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../dart/resolution/context_collection_resolution.dart';
+import '../dart/resolution/node_text_expectations.dart';
 
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(DeprecatedExtendsFunctionTest);
+    defineReflectiveTests(UpdateNodeTextExpectations);
   });
 }
 
 @reflectiveTest
 class DeprecatedExtendsFunctionTest extends PubPackageResolutionTest {
   test_core() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 class A extends Function {}
-''',
-      [error(diag.finalClassExtendedOutsideOfLibrary, 16, 8)],
-    );
+//              ^^^^^^^^
+// [diag.finalClassExtendedOutsideOfLibrary] The class 'Function' can't be extended outside of its library because it's a final class.
+''');
   }
 
   test_core_language219() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 // @dart = 2.19
 class A extends Function {}
-''',
-      [error(diag.deprecatedExtendsFunction, 32, 8)],
-    );
+//              ^^^^^^^^
+// [diag.deprecatedExtendsFunction] Extending 'Function' is deprecated.
+''');
   }
 
   test_core_language219_viaTypedef() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 // @dart = 2.19
 typedef F = Function;
 class A extends F {}
-''',
-      [error(diag.deprecatedExtendsFunction, 54, 1)],
-    );
+//              ^
+// [diag.deprecatedExtendsFunction] Extending 'Function' is deprecated.
+''');
   }
 
   test_local_language219() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 // @dart = 2.19
 class Function {}
+//    ^^^^^^^^
+// [diag.builtInIdentifierAsTypeName] The built-in identifier 'Function' can't be used as a type name.
 class A extends Function {}
-''',
-      [error(diag.builtInIdentifierAsTypeName, 22, 8)],
-    );
+''');
   }
 }
diff --git a/pkg/analyzer/test/src/diagnostics/deprecated_factory_method_test.dart b/pkg/analyzer/test/src/diagnostics/deprecated_factory_method_test.dart
index 8d838df..9feefaf 100644
--- a/pkg/analyzer/test/src/diagnostics/deprecated_factory_method_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/deprecated_factory_method_test.dart
@@ -2,21 +2,22 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/src/diagnostic/diagnostic.dart' as diag;
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../dart/resolution/context_collection_resolution.dart';
+import '../dart/resolution/node_text_expectations.dart';
 
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(DeprecatedFactoryMethodTest);
+    defineReflectiveTests(UpdateNodeTextExpectations);
   });
 }
 
 @reflectiveTest
 class DeprecatedFactoryMethodTest extends PubPackageResolutionTest {
   test_noTypeOrModifier_after() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 class C {
   factory() => throw 0;
 }
@@ -24,19 +25,18 @@
   }
 
   test_noTypeOrModifier_before() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 // @dart=2.12
 class C {
   factory() => throw 0;
+//^^^^^^^
+// [diag.deprecatedFactoryMethod] Methods named 'factory' will become constructors when the primary_constructors feature is enabled.
 }
-''',
-      [error(diag.deprecatedFactoryMethod, 26, 7)],
-    );
+''');
   }
 
   test_withAnnotation_after() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 class C {
   @deprecated
   factory() => throw 0;
@@ -45,76 +45,77 @@
   }
 
   test_withAnnotation_before() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 // @dart=2.12
 class C {
   @deprecated
   factory() => throw 0;
+//^^^^^^^
+// [diag.deprecatedFactoryMethod] Methods named 'factory' will become constructors when the primary_constructors feature is enabled.
 }
-''',
-      [error(diag.deprecatedFactoryMethod, 40, 7)],
-    );
+''');
   }
 
   test_withModifier_augment_after() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics('''
 class C {
   augment factory() => throw 0;
+//^^^^^^^
+// [diag.augmentationWithoutDeclaration] The declaration being augmented doesn't exist.
 }
 ''');
   }
 
   test_withModifier_augment_before() async {
-    await assertErrorsInCode(
-      '''
+    // TODO(brianwilkerson): The diagnostic produced here is expected to
+    //  change to `deprecatedFactoryMethod` when `augmentations` is enabled
+    //  for tests.
+    await resolveTestCodeWithDiagnostics(r'''
 // @dart=2.12
 class C {
   augment factory() => throw 0;
+//^^^^^^^
+// [diag.undefinedClass] Undefined class 'augment'.
 }
-''',
-      // TODO(brianwilkerson): The diagnostic produced here is expected to
-      //  change to `deprecatedFactoryMethod` when `augmentations` is enabled
-      //  for tests.
-      [error(diag.undefinedClass, 26, 7)],
-    );
+''');
   }
 
   test_withModifier_augmentAndExternal_after() async {
-    await assertErrorsInCode(
-      '''
+    // TODO(brianwilkerson): The `conflictingModifiers` diagnostic should not
+    //  be produced here.
+    await resolveTestCodeWithDiagnostics(r'''
 class C {
   augment external factory();
+//^^^^^^^
+// [diag.augmentationWithoutDeclaration] The declaration being augmented doesn't exist.
+//        ^^^^^^^^
+// [diag.conflictingModifiers] Members can't be declared to be both 'external' and 'augment'.
 }
-''',
-      // TODO(brianwilkerson): The `conflictingModifiers` diagnostic should not
-      //  be produced here.
-      [error(diag.conflictingModifiers, 20, 8)],
-    );
+''');
   }
 
   test_withModifier_augmentAndExternal_before() async {
-    await assertErrorsInCode(
-      '''
+    // TODO(brianwilkerson): The `deprecatedFactoryMethod` diagnostic is
+    //  expected to be the only diagnostic when `augmentations` is enabled for
+    //  tests.
+    await resolveTestCodeWithDiagnostics(r'''
 // @dart=2.12
 class C {
   augment external factory();
+//^^^^^^^
+// [diag.undefinedClass] Undefined class 'augment'.
+//        ^^^^^^^^
+// [diag.expectedToken] Expected to find ';'.
+//                 ^^^^^^^^^^
+// [diag.concreteClassWithAbstractMember] 'factory' must have a method body because 'C' isn't abstract.
+//                 ^^^^^^^
+// [diag.deprecatedFactoryMethod] Methods named 'factory' will become constructors when the primary_constructors feature is enabled.
 }
-''',
-      // TODO(brianwilkerson): The `deprecatedFactoryMethod` diagnostic is
-      //  expected to be the only diagnostic when `augmentations` is enabled for
-      //  tests.
-      [
-        error(diag.undefinedClass, 26, 7),
-        error(diag.expectedToken, 34, 8),
-        error(diag.concreteClassWithAbstractMember, 43, 10),
-        error(diag.deprecatedFactoryMethod, 43, 7),
-      ],
-    );
+''');
   }
 
   test_withModifier_external_after() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 class C {
   external factory();
 }
@@ -122,19 +123,18 @@
   }
 
   test_withModifier_external_before() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 // @dart=2.12
 class C {
   external factory();
+//         ^^^^^^^
+// [diag.deprecatedFactoryMethod] Methods named 'factory' will become constructors when the primary_constructors feature is enabled.
 }
-''',
-      [error(diag.deprecatedFactoryMethod, 35, 7)],
-    );
+''');
   }
 
   test_withModifier_static_after() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 class C {
   static factory() {}
 }
@@ -142,7 +142,7 @@
   }
 
   test_withModifier_static_before() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 // @dart=2.12
 class C {
   static factory() {}
@@ -151,7 +151,7 @@
   }
 
   test_withType_after() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 class C {
   int factory() => 0;
 }
@@ -159,7 +159,7 @@
   }
 
   test_withType_before() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 // @dart=2.12
 class C {
   int factory() => 0;
diff --git a/pkg/analyzer/test/src/diagnostics/deprecated_implement_test.dart b/pkg/analyzer/test/src/diagnostics/deprecated_implement_test.dart
index e952b69..66ec080 100644
--- a/pkg/analyzer/test/src/diagnostics/deprecated_implement_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/deprecated_implement_test.dart
@@ -2,14 +2,15 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/src/diagnostic/diagnostic.dart' as diag;
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../dart/resolution/context_collection_resolution.dart';
+import '../dart/resolution/node_text_expectations.dart';
 
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(DeprecatedImplementTest);
+    defineReflectiveTests(UpdateNodeTextExpectations);
   });
 }
 
@@ -21,13 +22,12 @@
 class Foo {}
 ''');
 
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'foo.dart';
 class Bar implements Foo {}
-''',
-      [error(diag.deprecatedImplement, 40, 3)],
-    );
+//                   ^^^
+// [diag.deprecatedImplement] Implementing 'Foo' is deprecated.
+''');
   }
 
   test_annotatedClass_indirect() async {
@@ -37,7 +37,7 @@
 class Bar extends Foo {}
 ''');
 
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'foo.dart';
 class Baz implements Bar {}
 ''');
@@ -50,7 +50,7 @@
 typedef Foo2 = Foo;
 ''');
 
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'foo.dart';
 class Bar implements Foo2 {}
 ''');
@@ -63,13 +63,12 @@
 mixin M {}
 ''');
 
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'foo.dart';
 class Bar implements Foo {}
-''',
-      [error(diag.deprecatedImplement, 40, 3)],
-    );
+//                   ^^^
+// [diag.deprecatedImplement] Implementing 'Foo' is deprecated.
+''');
   }
 
   test_classTypeAlias() async {
@@ -78,14 +77,13 @@
 class Foo {}
 ''');
 
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'foo.dart';
 mixin M {}
 class Bar = Object with M implements Foo;
-''',
-      [error(diag.deprecatedImplement, 67, 3)],
-    );
+//                                   ^^^
+// [diag.deprecatedImplement] Implementing 'Foo' is deprecated.
+''');
   }
 
   test_enum() async {
@@ -94,17 +92,16 @@
 class Foo {}
 ''');
 
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'foo.dart';
 enum Bar implements Foo { one; }
-''',
-      [error(diag.deprecatedImplement, 39, 3)],
-    );
+//                  ^^^
+// [diag.deprecatedImplement] Implementing 'Foo' is deprecated.
+''');
   }
 
   test_insideLibrary() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 @Deprecated.implement()
 class Foo {}
 class Bar implements Foo {}
@@ -117,13 +114,12 @@
 class Foo {}
 ''');
 
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'foo.dart';
 mixin Bar implements Foo {}
-''',
-      [error(diag.deprecatedImplement, 40, 3)],
-    );
+//                   ^^^
+// [diag.deprecatedImplement] Implementing 'Foo' is deprecated.
+''');
   }
 
   test_mixinOnClass() async {
@@ -132,13 +128,12 @@
 class Foo {}
 ''');
 
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'foo.dart';
 mixin Bar on Foo {}
-''',
-      [error(diag.deprecatedImplement, 32, 3)],
-    );
+//           ^^^
+// [diag.deprecatedImplement] Implementing 'Foo' is deprecated.
+''');
   }
 
   test_noAnnotation() async {
@@ -146,7 +141,7 @@
 class Foo {}
 ''');
 
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'foo.dart';
 class Bar implements Foo {}
 ''');
diff --git a/pkg/analyzer/test/src/diagnostics/deprecated_implements_function_test.dart b/pkg/analyzer/test/src/diagnostics/deprecated_implements_function_test.dart
index 34b0d3b..c1b85fb 100644
--- a/pkg/analyzer/test/src/diagnostics/deprecated_implements_function_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/deprecated_implements_function_test.dart
@@ -2,105 +2,96 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/src/diagnostic/diagnostic.dart' as diag;
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../dart/resolution/context_collection_resolution.dart';
+import '../dart/resolution/node_text_expectations.dart';
 
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(DeprecatedImplementsFunctionTest);
+    defineReflectiveTests(UpdateNodeTextExpectations);
   });
 }
 
 @reflectiveTest
 class DeprecatedImplementsFunctionTest extends PubPackageResolutionTest {
   test_class_core() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 class A implements Function {}
-''',
-      [error(diag.finalClassImplementedOutsideOfLibrary, 19, 8)],
-    );
+//                 ^^^^^^^^
+// [diag.finalClassImplementedOutsideOfLibrary] The class 'Function' can't be implemented outside of its library because it's a final class.
+''');
   }
 
   test_class_core2() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 class A implements Function, Function {}
-''',
-      [
-        error(diag.finalClassImplementedOutsideOfLibrary, 19, 8),
-        error(diag.implementsRepeated, 29, 8),
-        error(diag.finalClassImplementedOutsideOfLibrary, 29, 8),
-      ],
-    );
+//                 ^^^^^^^^
+// [diag.finalClassImplementedOutsideOfLibrary] The class 'Function' can't be implemented outside of its library because it's a final class.
+//                           ^^^^^^^^
+// [diag.implementsRepeated] 'Function' can only be implemented once.
+// [diag.finalClassImplementedOutsideOfLibrary] The class 'Function' can't be implemented outside of its library because it's a final class.
+''');
   }
 
   test_class_core2_language219() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 // @dart = 2.19
 class A implements Function, Function {}
-''',
-      [
-        error(diag.deprecatedImplementsFunction, 35, 8),
-        error(diag.implementsRepeated, 45, 8),
-      ],
-    );
+//                 ^^^^^^^^
+// [diag.deprecatedImplementsFunction] Implementing 'Function' has no effect.
+//                           ^^^^^^^^
+// [diag.implementsRepeated] 'Function' can only be implemented once.
+''');
   }
 
   test_class_core_language219() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 // @dart = 2.19
 class A implements Function {}
-''',
-      [error(diag.deprecatedImplementsFunction, 35, 8)],
-    );
+//                 ^^^^^^^^
+// [diag.deprecatedImplementsFunction] Implementing 'Function' has no effect.
+''');
   }
 
   test_class_core_language219_viaTypedef() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 // @dart = 2.19
 typedef F = Function;
 class A implements F {}
-''',
-      [error(diag.deprecatedImplementsFunction, 57, 1)],
-    );
+//                 ^
+// [diag.deprecatedImplementsFunction] Implementing 'Function' has no effect.
+''');
   }
 
   test_class_local() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 class Function {}
+//    ^^^^^^^^
+// [diag.builtInIdentifierAsTypeName] The built-in identifier 'Function' can't be used as a type name.
 class A implements Function {}
-''',
-      [error(diag.builtInIdentifierAsTypeName, 6, 8)],
-    );
+''');
   }
 
   test_classAlias_core_language219() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 // @dart = 2.19
 mixin M {}
 class A = Object with M implements Function;
-''',
-      [error(diag.deprecatedImplementsFunction, 62, 8)],
-    );
+//                                 ^^^^^^^^
+// [diag.deprecatedImplementsFunction] Implementing 'Function' has no effect.
+''');
   }
 
   test_classAlias_core_language219_viaTypedef() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 // @dart = 2.19
 mixin M {}
 typedef F = Function;
 class A = Object with M implements F;
-''',
-      [error(diag.deprecatedImplementsFunction, 84, 1)],
-    );
+//                                 ^
+// [diag.deprecatedImplementsFunction] Implementing 'Function' has no effect.
+''');
   }
 }
diff --git a/pkg/analyzer/test/src/diagnostics/deprecated_instantiate_test.dart b/pkg/analyzer/test/src/diagnostics/deprecated_instantiate_test.dart
index c30fcc5..7649669 100644
--- a/pkg/analyzer/test/src/diagnostics/deprecated_instantiate_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/deprecated_instantiate_test.dart
@@ -2,14 +2,15 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/src/diagnostic/diagnostic.dart' as diag;
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../dart/resolution/context_collection_resolution.dart';
+import '../dart/resolution/node_text_expectations.dart';
 
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(DeprecatedInstantiateTest);
+    defineReflectiveTests(UpdateNodeTextExpectations);
   });
 }
 
@@ -21,13 +22,12 @@
 class Foo {}
 ''');
 
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'foo.dart';
 var x = Foo();
-''',
-      [error(diag.deprecatedInstantiate, 27, 3)],
-    );
+//      ^^^
+// [diag.deprecatedInstantiate] Instantiating 'Foo' is deprecated.
+''');
   }
 
   test_annotatedClass_dotShorthand() async {
@@ -35,13 +35,12 @@
 @Deprecated.instantiate()
 class Foo {}
 ''');
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'foo.dart';
 Foo x = .new();
-''',
-      [error(diag.deprecatedInstantiate, 28, 3)],
-    );
+//       ^^^
+// [diag.deprecatedInstantiate] Instantiating 'Foo' is deprecated.
+''');
   }
 
   test_annotatedClass_dotShorthand_named() async {
@@ -51,13 +50,12 @@
   Foo.named();
 }
 ''');
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'foo.dart';
 Foo x = .named();
-''',
-      [error(diag.deprecatedInstantiate, 28, 5)],
-    );
+//       ^^^^^
+// [diag.deprecatedInstantiate] Instantiating 'Foo' is deprecated.
+''');
   }
 
   test_annotatedClass_redirectedFactory_named() async {
@@ -69,16 +67,15 @@
 }
 ''');
 
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'foo.dart';
 class Bar {
   Bar();
   factory Bar.one() = Foo.two;
+//                    ^^^^^^^
+// [diag.deprecatedInstantiate] Instantiating 'Foo' is deprecated.
 }
-''',
-      [error(diag.deprecatedInstantiate, 62, 7)],
-    );
+''');
   }
 
   test_annotatedClass_redirectedFactory_unnamed() async {
@@ -90,16 +87,15 @@
 }
 ''');
 
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'foo.dart';
 class Bar {
   Bar();
   factory Bar.one() = Foo;
+//                    ^^^
+// [diag.deprecatedInstantiate] Instantiating 'Foo' is deprecated.
 }
-''',
-      [error(diag.deprecatedInstantiate, 62, 3)],
-    );
+''');
   }
 
   test_annotatedClass_superInvocation_named() async {
@@ -110,7 +106,7 @@
 }
 ''');
 
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'foo.dart';
 class Bar extends Foo {
   Bar.named() : super.named();
@@ -123,7 +119,7 @@
 @Deprecated.instantiate()
 class Foo {}
 ''');
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'foo.dart';
 class Bar extends Foo {
   Bar() : super();
@@ -137,13 +133,12 @@
 class Foo {}
 ''');
 
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'foo.dart';
 var x = Foo.new;
-''',
-      [error(diag.deprecatedInstantiate, 27, 7)],
-    );
+//      ^^^^^^^
+// [diag.deprecatedInstantiate] Instantiating 'Foo' is deprecated.
+''');
   }
 
   test_annotatedClass_typedef() async {
@@ -153,7 +148,7 @@
 typedef Foo2 = Foo;
 ''');
 
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'foo.dart';
 var x = Foo2();
 ''');
@@ -166,13 +161,12 @@
 typedef Foo2 = Foo;
 ''');
 
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'foo.dart';
 Foo2 x = .new();
-''',
-      [error(diag.deprecatedInstantiate, 29, 3)],
-    );
+//        ^^^
+// [diag.deprecatedInstantiate] Instantiating 'Foo' is deprecated.
+''');
   }
 
   test_annotatedClass_typedef_tearoff() async {
@@ -182,7 +176,7 @@
 typedef Foo2 = Foo;
 ''');
 
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'foo.dart';
 var x = Foo2.new;
 ''');
@@ -195,17 +189,16 @@
 mixin M {}
 ''');
 
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'foo.dart';
 var x = Foo();
-''',
-      [error(diag.deprecatedInstantiate, 27, 3)],
-    );
+//      ^^^
+// [diag.deprecatedInstantiate] Instantiating 'Foo' is deprecated.
+''');
   }
 
   test_insideLibrary() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 @Deprecated.implement()
 class Foo {}
 var x = Foo();
@@ -217,7 +210,7 @@
 class Foo {}
 ''');
 
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'foo.dart';
 var x = Foo();
 ''');
diff --git a/pkg/analyzer/test/src/diagnostics/deprecated_member_use_test.dart b/pkg/analyzer/test/src/diagnostics/deprecated_member_use_test.dart
index 075084f..0819e57 100644
--- a/pkg/analyzer/test/src/diagnostics/deprecated_member_use_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/deprecated_member_use_test.dart
@@ -8,6 +8,7 @@
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../dart/resolution/context_collection_resolution.dart';
+import '../dart/resolution/node_text_expectations.dart';
 
 void main() {
   defineReflectiveSuite(() {
@@ -15,6 +16,7 @@
     defineReflectiveTests(DeprecatedMemberUse_GnWorkspaceTest);
     defineReflectiveTests(DeprecatedMemberUse_PackageBuildWorkspaceTest);
     defineReflectiveTests(DeprecatedMemberUse_PackageConfigWorkspaceTest);
+    defineReflectiveTests(UpdateNodeTextExpectations);
   });
 }
 
@@ -27,14 +29,13 @@
 class A {}
 ''');
 
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'package:foo.bar/a.dart';
 
 void f(A a) {}
-''',
-      [error(diag.deprecatedMemberUse, 41, 1)],
-    );
+//     ^
+// [diag.deprecatedMemberUse] 'A' is deprecated and shouldn't be used.
+''');
   }
 
   test_thirdPartyDart() async {
@@ -45,14 +46,13 @@
 
     assertBlazeWorkspaceFor(testFile);
 
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'package:aaa/a.dart';
 
 void f(A a) {}
-''',
-      [error(diag.deprecatedMemberUse, 37, 1)],
-    );
+//     ^
+// [diag.deprecatedMemberUse] 'A' is deprecated and shouldn't be used.
+''');
   }
 }
 
@@ -102,14 +102,13 @@
 class A {}
 ''');
 
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'package:aaa/a.dart';
 
 void f(A a) {}
-''',
-      [error(diag.deprecatedMemberUse, 37, 1)],
-    );
+//     ^
+// [diag.deprecatedMemberUse] 'A' is deprecated and shouldn't be used.
+''');
   }
 
   @override
@@ -158,14 +157,13 @@
 ''',
     );
 
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'package:aaa/a.dart';
 
 void f(A a) {}
-''',
-      [error(diag.deprecatedMemberUse, 37, 1)],
-    );
+//     ^
+// [diag.deprecatedMemberUse] 'A' is deprecated and shouldn't be used.
+''');
   }
 
   test_lib() async {
@@ -182,14 +180,13 @@
     newPubspecYamlFile(testPackageRootPath, 'name: test');
     _createTestPackageBuildMarker();
 
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'package:aaa/a.dart';
 
 void f(A a) {}
-''',
-      [error(diag.deprecatedMemberUse, 37, 1)],
-    );
+//     ^
+// [diag.deprecatedMemberUse] 'A' is deprecated and shouldn't be used.
+''');
   }
 }
 
@@ -225,6 +222,18 @@
 ''');
   }
 
+  Future<void> resolveTestCodeWithDiagnostics2({
+    required String externalCode,
+    required String code,
+  }) async {
+    newFile(externalLibPath, externalCode);
+
+    await resolveTestCodeWithDiagnostics('''
+import '$externalLibUri';
+$code
+''');
+  }
+
   @override
   void setUp() {
     super.setUp();
@@ -236,7 +245,7 @@
   }
 
   test_assignmentExpression_compound_deprecatedGetter() async {
-    await assertErrorsInCode2(
+    await resolveTestCodeWithDiagnostics2(
       externalCode: r'''
 @deprecated
 int get x => 0;
@@ -246,14 +255,15 @@
       code: r'''
 void f() {
   x += 2;
+//^
+// [diag.deprecatedMemberUse] 'x' is deprecated and shouldn't be used.
 }
 ''',
-      [error(diag.deprecatedMemberUse, 42, 1)],
     );
   }
 
   test_assignmentExpression_compound_deprecatedSetter() async {
-    await assertErrorsInCode2(
+    await resolveTestCodeWithDiagnostics2(
       externalCode: r'''
 int get x => 0;
 
@@ -263,14 +273,15 @@
       code: r'''
 void f() {
   x += 2;
+//^
+// [diag.deprecatedMemberUse] 'x' is deprecated and shouldn't be used.
 }
 ''',
-      [error(diag.deprecatedMemberUse, 42, 1)],
     );
   }
 
   test_assignmentExpression_simple_deprecatedGetter() async {
-    await assertNoErrorsInCode2(
+    await resolveTestCodeWithDiagnostics2(
       externalCode: r'''
 @deprecated
 int get x => 0;
@@ -286,7 +297,7 @@
   }
 
   test_assignmentExpression_simple_deprecatedGetterSetter() async {
-    await assertErrorsInCode2(
+    await resolveTestCodeWithDiagnostics2(
       externalCode: r'''
 @deprecated
 int x = 1;
@@ -294,14 +305,15 @@
       code: r'''
 void f() {
   x = 0;
+//^
+// [diag.deprecatedMemberUse] 'x' is deprecated and shouldn't be used.
 }
 ''',
-      [error(diag.deprecatedMemberUse, 42, 1)],
     );
   }
 
   test_assignmentExpression_simple_deprecatedSetter() async {
-    await assertErrorsInCode2(
+    await resolveTestCodeWithDiagnostics2(
       externalCode: r'''
 int get x => 0;
 
@@ -311,14 +323,15 @@
       code: r'''
 void f() {
   x = 0;
+//^
+// [diag.deprecatedMemberUse] 'x' is deprecated and shouldn't be used.
 }
 ''',
-      [error(diag.deprecatedMemberUse, 42, 1)],
     );
   }
 
   test_call() async {
-    await assertErrorsInCode2(
+    await resolveTestCodeWithDiagnostics2(
       externalCode: r'''
 class A {
   @deprecated
@@ -328,22 +341,24 @@
       code: r'''
 void f(A a) {
   a();
+//^^^
+// [diag.deprecatedMemberUse] 'call' is deprecated and shouldn't be used.
 }
 ''',
-      [error(diag.deprecatedMemberUse, 45, 3)],
     );
   }
 
   test_class() async {
-    await assertErrorsInCode2(
+    await resolveTestCodeWithDiagnostics2(
       externalCode: r'''
 @deprecated
 class A {}
 ''',
       code: r'''
 void f(A a) {}
+//     ^
+// [diag.deprecatedMemberUse] 'A' is deprecated and shouldn't be used.
 ''',
-      [error(diag.deprecatedMemberUse, 36, 1)],
     );
   }
 
@@ -353,7 +368,7 @@
 class A {}
 ''');
 
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'package:aaa/a.dart';
 
 @deprecated
@@ -367,7 +382,7 @@
 class A {}
 ''');
 
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'package:aaa/a.dart';
 
 @deprecated
@@ -376,7 +391,7 @@
   }
 
   test_compoundAssignment() async {
-    await assertErrorsInCode2(
+    await resolveTestCodeWithDiagnostics2(
       externalCode: r'''
 class A {
   @deprecated
@@ -386,14 +401,15 @@
       code: r'''
 f(A a, A b) {
   a += b;
+//^^^^^^
+// [diag.deprecatedMemberUse] '+' is deprecated and shouldn't be used.
 }
 ''',
-      [error(diag.deprecatedMemberUse, 45, 6)],
     );
   }
 
   test_constructor_inAnnotation() async {
-    await assertErrorsInCode2(
+    await resolveTestCodeWithDiagnostics2(
       externalCode: r'''
 class MyAnnotation {
   @deprecated
@@ -402,14 +418,14 @@
 ''',
       code: r'''
 @MyAnnotation()
+// [diag.deprecatedMemberUse][column 2][length 12] 'MyAnnotation' is deprecated and shouldn't be used.
 void g() {}
 ''',
-      [error(diag.deprecatedMemberUse, 30, 12)],
     );
   }
 
   test_deprecatedField_inObjectPattern_explicitName() async {
-    await assertErrorsInCode2(
+    await resolveTestCodeWithDiagnostics2(
       externalCode: r'''
 class C {
   @Deprecated('')
@@ -420,15 +436,16 @@
 int g(Object s) =>
   switch (s) {
     C(foo: var f) => f,
+//    ^^^
+// [diag.deprecatedMemberUse] 'foo' is deprecated and shouldn't be used.
     _ => 7,
   };
 ''',
-      [error(diag.deprecatedMemberUse, 69, 3)],
     );
   }
 
   test_deprecatedField_inObjectPattern_inferredName() async {
-    await assertErrorsInCode2(
+    await resolveTestCodeWithDiagnostics2(
       externalCode: r'''
 class C {
   @Deprecated('')
@@ -439,10 +456,11 @@
 int g(Object s) =>
   switch (s) {
     C(:var foo) => foo,
+//         ^^^
+// [diag.deprecatedMemberUse] 'foo' is deprecated and shouldn't be used.
     _ => 7,
   };
 ''',
-      [error(diag.deprecatedMemberUse, 74, 3)],
     );
   }
 
@@ -456,21 +474,17 @@
 void wantA(A _) {}
 ''');
 
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'package:aaa/a.dart';
 
 void f() {
   wantA(.new());
+//      ^^^^^^
+// [diag.deprecatedMemberUse] 'A' is deprecated and shouldn't be used.
+//       ^^^
+// [diag.deprecatedMemberUse] 'A' is deprecated and shouldn't be used.
 }
-''',
-      [
-        // TODO(srawlins): This seems like a wide range (`.new()`). Could be
-        // more specific.
-        error(diag.deprecatedMemberUse, 49, 6),
-        error(diag.deprecatedMemberUse, 50, 3),
-      ],
-    );
+''');
   }
 
   test_dotShorthandConstructorInvocation_deprecatedClass_undeprecatedConstructor() async {
@@ -482,16 +496,15 @@
 void wantA(A _) {}
 ''');
 
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'package:aaa/a.dart';
 
 void f() {
   wantA(.new());
+//      ^^^^^^
+// [diag.deprecatedMemberUse] 'A' is deprecated and shouldn't be used.
 }
-''',
-      [error(diag.deprecatedMemberUse, 49, 6)],
-    );
+''');
   }
 
   test_dotShorthandConstructorInvocation_deprecatedClass_undeprecatedNamedConstructor() async {
@@ -503,20 +516,19 @@
 void wantA(A _) {}
 ''');
 
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'package:aaa/a.dart';
 
 void f() {
   wantA(.a());
+//      ^^^^
+// [diag.deprecatedMemberUse] 'A' is deprecated and shouldn't be used.
 }
-''',
-      [error(diag.deprecatedMemberUse, 49, 4)],
-    );
+''');
   }
 
   test_dotShorthandConstructorInvocation_namedConstructor() async {
-    await assertErrorsInCode2(
+    await resolveTestCodeWithDiagnostics2(
       externalCode: r'''
 class A {
   @deprecated
@@ -527,16 +539,10 @@
       code: r'''
 f() {
   wantA(.named(1));
+//       ^^^^^
+// [diag.deprecatedMemberUse] 'A.named' is deprecated and shouldn't be used.
 }
 ''',
-      [
-        error(
-          diag.deprecatedMemberUse,
-          44,
-          5,
-          messageContains: ["'A.named' is deprecated and shouldn't be used."],
-        ),
-      ],
     );
   }
 
@@ -549,16 +555,15 @@
 void wantA(A _) {}
 ''');
 
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'package:aaa/a.dart';
 
 void f() {
   wantA(.new());
+//       ^^^
+// [diag.deprecatedMemberUse] 'A' is deprecated and shouldn't be used.
 }
-''',
-      [error(diag.deprecatedMemberUse, 50, 3)],
-    );
+''');
   }
 
   test_dotShorthandInvocation_deprecatedMethod() async {
@@ -570,16 +575,15 @@
 void wantA(A _) {}
 ''');
 
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'package:aaa/a.dart';
 
 void f() {
   wantA(.m());
+//       ^
+// [diag.deprecatedMemberUse] 'm' is deprecated and shouldn't be used.
 }
-''',
-      [error(diag.deprecatedMemberUse, 50, 1)],
-    );
+''');
   }
 
   test_dotShorthandPropertyAccess() async {
@@ -591,16 +595,15 @@
 void wantA(A _) {}
 ''');
 
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'package:aaa/a.dart';
 
 void f() {
   wantA(.x);
+//       ^
+// [diag.deprecatedMemberUse] 'x' is deprecated and shouldn't be used.
 }
-''',
-      [error(diag.deprecatedMemberUse, 50, 1)],
-    );
+''');
   }
 
   test_export() async {
@@ -609,12 +612,10 @@
 library a;
 ''');
 
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 export 'package:aaa/a.dart';
-''',
-      [error(diag.deprecatedMemberUse, 0, 28)],
-    );
+// [diag.deprecatedMemberUse][column 1][length 28] 'package:aaa/a.dart' is deprecated and shouldn't be used.
+''');
   }
 
   test_export_fromSamePackage() async {
@@ -623,13 +624,13 @@
 library a;
 ''');
 
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 export 'lib2.dart';
 ''');
   }
 
   test_extensionOverride() async {
-    await assertErrorsInCode2(
+    await resolveTestCodeWithDiagnostics2(
       externalCode: r'''
 @deprecated
 extension E on int {
@@ -639,9 +640,10 @@
       code: '''
 void f() {
   E(0).foo;
+//^
+// [diag.deprecatedMemberUse] 'E' is deprecated and shouldn't be used.
 }
 ''',
-      [error(diag.deprecatedMemberUse, 42, 1)],
     );
   }
 
@@ -653,16 +655,15 @@
 }
 ''');
 
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'package:aaa/a.dart';
 
 void f(A a) {
   a.foo;
+//  ^^^
+// [diag.deprecatedMemberUse] 'foo' is deprecated and shouldn't be used.
 }
-''',
-      [error(diag.deprecatedMemberUse, 48, 3)],
-    );
+''');
   }
 
   test_field_implicitSetter() async {
@@ -673,16 +674,15 @@
 }
 ''');
 
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'package:aaa/a.dart';
 
 void f(A a) {
   a.foo = 0;
+//  ^^^
+// [diag.deprecatedMemberUse] 'foo' is deprecated and shouldn't be used.
 }
-''',
-      [error(diag.deprecatedMemberUse, 48, 3)],
-    );
+''');
   }
 
   test_field_inDeprecatedConstructor() async {
@@ -693,7 +693,7 @@
 }
 ''');
 
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'package:aaa/a.dart';
 
 class B extends A {
@@ -711,9 +711,9 @@
 @deprecated
 class A {}
 ''');
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 // ignore: unused_import
-import '$externalLibUri' hide A;
+import 'package:aaa/a.dart' hide A;
 ''');
   }
 
@@ -723,49 +723,38 @@
 library a;
 ''');
 
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 // ignore:unused_import
 import 'package:aaa/a.dart';
-''',
-      [
-        error(
-          diag.deprecatedMemberUse,
-          24,
-          28,
-          messageContains: ['package:aaa/a.dart'],
-        ),
-      ],
-    );
+// [diag.deprecatedMemberUse][column 1][length 28] 'package:aaa/a.dart' is deprecated and shouldn't be used.
+''');
   }
 
   test_incorrectlyNestedNamedParameterDeclaration() async {
     // This is a regression test; previously this code would cause an analyzer
     // crash in DeprecatedMemberUseVerifier.
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class C {
   final String x;
   final bool y;
 
   const C({
+//      ^
+// [diag.finalNotInitializedConstructor1] All final variables must be initialized, but 'y' isn't.
     required this.x,
     {this.y = false}
+//  ^
+// [diag.missingIdentifier] Expected an identifier.
+// [diag.expectedToken] Expected to find '}'.
   });
 }
 
 const z = C(x: '');
-''',
-      [
-        error(diag.finalNotInitializedConstructor1, 53, 1),
-        error(diag.missingIdentifier, 82, 1),
-        error(diag.expectedToken, 82, 1),
-      ],
-    );
+''');
   }
 
   test_inDeprecatedClass() async {
-    await assertNoErrorsInCode2(
+    await resolveTestCodeWithDiagnostics2(
       externalCode: r'''
 @deprecated
 f() {}
@@ -815,7 +804,7 @@
   }
 
   test_inDeprecatedExtension() async {
-    await assertNoErrorsInCode2(
+    await resolveTestCodeWithDiagnostics2(
       externalCode: r'''
 @deprecated
 void f() {}
@@ -832,7 +821,7 @@
   }
 
   test_inDeprecatedExtensionType() async {
-    await assertNoErrorsInCode2(
+    await resolveTestCodeWithDiagnostics2(
       externalCode: r'''
 @deprecated
 f() {}
@@ -849,7 +838,7 @@
   }
 
   test_inDeprecatedField() async {
-    await assertNoErrorsInCode2(
+    await resolveTestCodeWithDiagnostics2(
       externalCode: r'''
 @deprecated
 class C {}
@@ -865,7 +854,7 @@
   }
 
   test_inDeprecatedFieldFormalParameter() async {
-    await assertNoErrorsInCode2(
+    await resolveTestCodeWithDiagnostics2(
       externalCode: r'''
 @deprecated
 class C {}
@@ -880,7 +869,7 @@
   }
 
   test_inDeprecatedFunction() async {
-    await assertNoErrorsInCode2(
+    await resolveTestCodeWithDiagnostics2(
       externalCode: r'''
 @deprecated
 f() {}
@@ -895,7 +884,7 @@
   }
 
   test_inDeprecatedFunctionTypedFormalParameter() async {
-    await assertNoErrorsInCode2(
+    await resolveTestCodeWithDiagnostics2(
       externalCode: r'''
 @deprecated
 class C {}
@@ -911,10 +900,10 @@
 @deprecated
 f() {}
 ''');
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 @deprecated
 library lib;
-import '$externalLibUri';
+import 'package:aaa/a.dart';
 
 class C {
   m() {
@@ -925,7 +914,7 @@
   }
 
   test_inDeprecatedMethod() async {
-    await assertNoErrorsInCode2(
+    await resolveTestCodeWithDiagnostics2(
       externalCode: r'''
 @deprecated
 f() {}
@@ -942,7 +931,7 @@
   }
 
   test_inDeprecatedMethod_inDeprecatedClass() async {
-    await assertNoErrorsInCode2(
+    await resolveTestCodeWithDiagnostics2(
       externalCode: r'''
 @deprecated
 f() {}
@@ -960,7 +949,7 @@
   }
 
   test_inDeprecatedMixin() async {
-    await assertNoErrorsInCode2(
+    await resolveTestCodeWithDiagnostics2(
       externalCode: r'''
 @deprecated
 f() {}
@@ -977,7 +966,7 @@
   }
 
   test_inDeprecatedSimpleFormalParameter() async {
-    await assertNoErrorsInCode2(
+    await resolveTestCodeWithDiagnostics2(
       externalCode: r'''
 @deprecated
 class C {}
@@ -989,7 +978,7 @@
   }
 
   test_inDeprecatedSuperFormalParameter() async {
-    await assertNoErrorsInCode2(
+    await resolveTestCodeWithDiagnostics2(
       externalCode: r'''
 @deprecated
 class C {}
@@ -1006,7 +995,7 @@
   }
 
   test_inDeprecatedTopLevelVariable() async {
-    await assertNoErrorsInCode2(
+    await resolveTestCodeWithDiagnostics2(
       externalCode: r'''
 @deprecated
 class C {}
@@ -1020,7 +1009,7 @@
   }
 
   test_indexExpression() async {
-    await assertErrorsInCode2(
+    await resolveTestCodeWithDiagnostics2(
       externalCode: r'''
 class A {
   @deprecated
@@ -1030,14 +1019,15 @@
       code: r'''
 void f(A a) {
   return a[1];
+//       ^^^^
+// [diag.deprecatedMemberUse] '[]' is deprecated and shouldn't be used.
 }
 ''',
-      [error(diag.deprecatedMemberUse, 52, 4)],
     );
   }
 
   test_inEnum() async {
-    await assertErrorsInCode2(
+    await resolveTestCodeWithDiagnostics2(
       externalCode: r'''
 @deprecated
 void f() {}
@@ -1048,15 +1038,16 @@
 
   void m() {
     f();
+//  ^
+// [diag.deprecatedMemberUse] 'f' is deprecated and shouldn't be used.
   }
 }
 ''',
-      [error(diag.deprecatedMemberUse, 68, 1)],
     );
   }
 
   test_inExtension() async {
-    await assertErrorsInCode2(
+    await resolveTestCodeWithDiagnostics2(
       externalCode: r'''
 @deprecated
 void f() {}
@@ -1065,10 +1056,11 @@
 extension E on int {
   void m() {
     f();
+//  ^
+// [diag.deprecatedMemberUse] 'f' is deprecated and shouldn't be used.
   }
 }
 ''',
-      [error(diag.deprecatedMemberUse, 67, 1)],
     );
   }
 
@@ -1081,16 +1073,15 @@
 }
 ''');
 
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'package:aaa/a.dart';
 
 void f() {
   A();
+//^
+// [diag.deprecatedMemberUse] 'A' is deprecated and shouldn't be used.
 }
-''',
-      [error(diag.deprecatedMemberUse, 43, 1)],
-    );
+''');
   }
 
   test_instanceCreation_deprecatedClass_undeprecatedConstructor() async {
@@ -1101,16 +1092,15 @@
 }
 ''');
 
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'package:aaa/a.dart';
 
 void f() {
   A();
+//^
+// [diag.deprecatedMemberUse] 'A' is deprecated and shouldn't be used.
 }
-''',
-      [error(diag.deprecatedMemberUse, 43, 1)],
-    );
+''');
   }
 
   test_instanceCreation_deprecatedClass_undeprecatedNamedConstructor() async {
@@ -1121,24 +1111,19 @@
 }
 ''');
 
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'package:aaa/a.dart';
 
 void f() {
   A.a();
+//^
+// [diag.deprecatedMemberUse] 'A' is deprecated and shouldn't be used.
 }
-''',
-      [
-        // https://github.com/dart-lang/linter/issues/4752
-        // Highlights `A`.
-        error(diag.deprecatedMemberUse, 43, 1),
-      ],
-    );
+''');
   }
 
   test_instanceCreation_namedConstructor() async {
-    await assertErrorsInCode2(
+    await resolveTestCodeWithDiagnostics2(
       externalCode: r'''
 class A {
   @deprecated
@@ -1148,16 +1133,10 @@
       code: r'''
 f() {
   return new A.named(1);
+//           ^^^^^^^
+// [diag.deprecatedMemberUse] 'A.named' is deprecated and shouldn't be used.
 }
 ''',
-      [
-        error(
-          diag.deprecatedMemberUse,
-          48,
-          7,
-          messageContains: ["'A.named' is deprecated and shouldn't be used."],
-        ),
-      ],
     );
   }
 
@@ -1169,16 +1148,15 @@
 }
 ''');
 
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'package:aaa/a.dart';
 
 void f() {
   A();
+//^
+// [diag.deprecatedMemberUse] 'A' is deprecated and shouldn't be used.
 }
-''',
-      [error(diag.deprecatedMemberUse, 43, 1)],
-    );
+''');
   }
 
   test_instanceCreation_undeprecatedClass_deprecatedConstructor_primary() async {
@@ -1189,20 +1167,19 @@
 }
 ''');
 
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'package:aaa/a.dart';
 
 void f() {
   A();
+//^
+// [diag.deprecatedMemberUse] 'A' is deprecated and shouldn't be used.
 }
-''',
-      [error(diag.deprecatedMemberUse, 43, 1)],
-    );
+''');
   }
 
   test_instanceCreation_unnamedConstructor() async {
-    await assertErrorsInCode2(
+    await resolveTestCodeWithDiagnostics2(
       externalCode: r'''
 class A {
   @deprecated
@@ -1212,9 +1189,10 @@
       code: r'''
 f() {
   return new A(1);
+//           ^
+// [diag.deprecatedMemberUse] 'A' is deprecated and shouldn't be used.
 }
 ''',
-      [error(diag.deprecatedMemberUse, 48, 1)],
     );
   }
 
@@ -1226,128 +1204,98 @@
 }
 ''');
 
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'package:aaa/a.dart';
 
 void f(A a) {
   a.foo();
+//  ^^^
+// [diag.deprecatedMemberUse] 'foo' is deprecated and shouldn't be used.
 }
-''',
-      [error(diag.deprecatedMemberUse, 48, 3)],
-    );
+''');
   }
 
   test_methodInvocation_constantAnnotation() async {
-    await assertErrorsInCode2(
+    await resolveTestCodeWithDiagnostics2(
       externalCode: r'''
 @deprecated
 int f() => 0;
 ''',
       code: r'''
 var x = f();
+//      ^
+// [diag.deprecatedMemberUse] 'f' is deprecated and shouldn't be used.
 ''',
-      [error(diag.deprecatedMemberUse, 37, 1)],
     );
   }
 
   test_methodInvocation_constructorAnnotation() async {
-    await assertErrorsInCode2(
+    await resolveTestCodeWithDiagnostics2(
       externalCode: r'''
 @Deprecated('0.9')
 int f() => 0;
 ''',
       code: r'''
 var x = f();
+//      ^
+// [diag.deprecatedMemberUseWithMessage] 'f' is deprecated and shouldn't be used. 0.9.
 ''',
-      [
-        error(
-          diag.deprecatedMemberUseWithMessage,
-          37,
-          1,
-          text: "'f' is deprecated and shouldn't be used. 0.9.",
-        ),
-      ],
     );
   }
 
   test_methodInvocation_constructorAnnotation_dot() async {
-    await assertErrorsInCode2(
+    await resolveTestCodeWithDiagnostics2(
       externalCode: r'''
 @Deprecated('0.9.')
 int f() => 0;
 ''',
       code: r'''
 var x = f();
+//      ^
+// [diag.deprecatedMemberUseWithMessage] 'f' is deprecated and shouldn't be used. 0.9.
 ''',
-      [
-        error(
-          diag.deprecatedMemberUseWithMessage,
-          37,
-          1,
-          text: "'f' is deprecated and shouldn't be used. 0.9.",
-        ),
-      ],
     );
   }
 
   test_methodInvocation_constructorAnnotation_exclamationMark() async {
-    await assertErrorsInCode2(
+    await resolveTestCodeWithDiagnostics2(
       externalCode: r'''
 @Deprecated(' Really! ')
 int f() => 0;
 ''',
       code: r'''
 var x = f();
+//      ^
+// [diag.deprecatedMemberUseWithMessage] 'f' is deprecated and shouldn't be used. Really!
 ''',
-      [
-        error(
-          diag.deprecatedMemberUseWithMessage,
-          37,
-          1,
-          text: "'f' is deprecated and shouldn't be used. Really!",
-        ),
-      ],
     );
   }
 
   test_methodInvocation_constructorAnnotation_onlyDot() async {
-    await assertErrorsInCode2(
+    await resolveTestCodeWithDiagnostics2(
       externalCode: r'''
 @Deprecated('.')
 int f() => 0;
 ''',
       code: r'''
 var x = f();
+//      ^
+// [diag.deprecatedMemberUse] 'f' is deprecated and shouldn't be used.
 ''',
-      [
-        error(
-          diag.deprecatedMemberUse,
-          37,
-          1,
-          text: "'f' is deprecated and shouldn't be used.",
-        ),
-      ],
     );
   }
 
   test_methodInvocation_constructorAnnotation_questionMark() async {
-    await assertErrorsInCode2(
+    await resolveTestCodeWithDiagnostics2(
       externalCode: r'''
 @Deprecated('Are you sure?')
 int f() => 0;
 ''',
       code: r'''
 var x = f();
+//      ^
+// [diag.deprecatedMemberUseWithMessage] 'f' is deprecated and shouldn't be used. Are you sure?
 ''',
-      [
-        error(
-          diag.deprecatedMemberUseWithMessage,
-          37,
-          1,
-          text: "'f' is deprecated and shouldn't be used. Are you sure?",
-        ),
-      ],
     );
   }
 
@@ -1359,7 +1307,7 @@
 }
 ''');
 
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'lib2.dart';
 
 void f(A a) {
@@ -1374,7 +1322,7 @@
 void foo() {}
 ''');
 
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'lib2.dart';
 class A {
   @deprecated
@@ -1391,7 +1339,7 @@
 void foo() {}
 ''');
 
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'lib2.dart';
 class A() {
   @deprecated
@@ -1410,7 +1358,7 @@
 }
 ''');
 
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'package:aaa/a.dart';
 
 void f(A a) {
@@ -1427,7 +1375,7 @@
 }
 ''');
 
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'package:aaa/a.dart';
 
 void f(A a) {
@@ -1444,23 +1392,15 @@
 }
 ''');
 
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'package:aaa/a.dart';
 
 void f(A a) {
   a.foo();
+//  ^^^
+// [diag.deprecatedMemberUseWithMessage] 'foo' is deprecated and shouldn't be used. 0.9.
 }
-''',
-      [
-        error(
-          diag.deprecatedMemberUseWithMessage,
-          48,
-          3,
-          text: "'foo' is deprecated and shouldn't be used. 0.9.",
-        ),
-      ],
-    );
+''');
   }
 
   test_mixin_inDeprecatedClassTypeAlias() async {
@@ -1496,7 +1436,7 @@
   }
 
   test_operator() async {
-    await assertErrorsInCode2(
+    await resolveTestCodeWithDiagnostics2(
       externalCode: r'''
 class A {
   @deprecated
@@ -1506,26 +1446,28 @@
       code: r'''
 f(A a, A b) {
   return a + b;
+//       ^^^^^
+// [diag.deprecatedMemberUse] '+' is deprecated and shouldn't be used.
 }
 ''',
-      [error(diag.deprecatedMemberUse, 52, 5)],
     );
   }
 
   test_parameter_named() async {
-    await assertErrorsInCode2(
+    await resolveTestCodeWithDiagnostics2(
       externalCode: r'''
 void f({@deprecated int x = 0}) {}
 ''',
       code: r'''
 void g() => f(x: 1);
+//            ^
+// [diag.deprecatedMemberUse] 'x' is deprecated and shouldn't be used.
 ''',
-      [error(diag.deprecatedMemberUse, 43, 1)],
     );
   }
 
   test_parameter_named_inAnnotation() async {
-    await assertErrorsInCode2(
+    await resolveTestCodeWithDiagnostics2(
       externalCode: r'''
 class MyAnnotation {
   const MyAnnotation({@deprecated int? x});
@@ -1533,14 +1475,15 @@
 ''',
       code: r'''
 @MyAnnotation(x: 1)
+//            ^
+// [diag.deprecatedMemberUse] 'x' is deprecated and shouldn't be used.
 void g() {}
 ''',
-      [error(diag.deprecatedMemberUse, 43, 1)],
     );
   }
 
   test_parameter_named_inDefiningConstructor_asFieldFormalParameter() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class C {
   int x;
   C({@deprecated this.x = 0});
@@ -1549,7 +1492,7 @@
   }
 
   test_parameter_named_inDefiningConstructor_assertInitializer() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class C {
   C({@deprecated int y = 0}) : assert(y > 0);
 }
@@ -1557,7 +1500,7 @@
   }
 
   test_parameter_named_inDefiningConstructor_fieldInitializer() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class C {
   int x;
   C({@deprecated int y = 0}) : x = y;
@@ -1566,7 +1509,7 @@
   }
 
   test_parameter_named_inDefiningConstructor_inFieldFormalParameter_notName() async {
-    await assertErrorsInCode2(
+    await resolveTestCodeWithDiagnostics2(
       externalCode: r'''
 class A {}
 
@@ -1581,20 +1524,21 @@
 class C {
   final A a;
   C({B this.a = instance});
+//   ^
+// [diag.deprecatedMemberUse] 'B' is deprecated and shouldn't be used.
 }
 ''',
-      [error(diag.deprecatedMemberUse, 57, 1)],
     );
   }
 
   test_parameter_named_inDefiningFunction() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 f({@deprecated int x = 0}) => x;
 ''');
   }
 
   test_parameter_named_inDefiningLocalFunction() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class C {
   m() {
     f({@deprecated int x = 0}) {
@@ -1607,7 +1551,7 @@
   }
 
   test_parameter_named_inDefiningMethod() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class C {
   m({@deprecated int x = 0}) {
     return x;
@@ -1617,7 +1561,7 @@
   }
 
   test_parameter_named_inNestedLocalFunction() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class C {
   m({@deprecated int x = 0}) {
     f() {
@@ -1634,16 +1578,15 @@
 void foo({@deprecated int a}) {}
 ''');
 
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'package:aaa/a.dart';
 
 void f() {
   foo(a: 0);
+//    ^
+// [diag.deprecatedMemberUse] 'a' is deprecated and shouldn't be used.
 }
-''',
-      [error(diag.deprecatedMemberUse, 47, 1)],
-    );
+''');
   }
 
   test_parameter_named_ofMethod() async {
@@ -1653,32 +1596,32 @@
 }
 ''');
 
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'package:aaa/a.dart';
 
 void f(A a) {
   a.foo(a: 0);
+//      ^
+// [diag.deprecatedMemberUse] 'a' is deprecated and shouldn't be used.
 }
-''',
-      [error(diag.deprecatedMemberUse, 52, 1)],
-    );
+''');
   }
 
   test_parameter_namedInPrimaryConstructor() async {
-    await assertErrorsInCode2(
+    await resolveTestCodeWithDiagnostics2(
       externalCode: r'''
 class A({@deprecated int x = 0});
 ''',
       code: '''
 var x = A(x: 7);
+//        ^
+// [diag.deprecatedMemberUse] 'x' is deprecated and shouldn't be used.
 ''',
-      [error(diag.deprecatedMemberUse, 39, 1)],
     );
   }
 
   test_parameter_positionalOptional() async {
-    await assertErrorsInCode2(
+    await resolveTestCodeWithDiagnostics2(
       externalCode: r'''
 class A {
   void foo([@deprecated int x = 0]) {}
@@ -1687,14 +1630,15 @@
       code: '''
 void f(A a) {
   a.foo(0);
+//      ^
+// [diag.deprecatedMemberUse] 'x' is deprecated and shouldn't be used.
 }
 ''',
-      [error(diag.deprecatedMemberUse, 51, 1)],
     );
   }
 
   test_parameter_positionalOptional_inDeprecatedConstructor() async {
-    await assertNoErrorsInCode2(
+    await resolveTestCodeWithDiagnostics2(
       externalCode: r'''
 void foo([@deprecated int x = 0]) {}
 ''',
@@ -1710,7 +1654,7 @@
   }
 
   test_parameter_positionalOptional_inDeprecatedFunction() async {
-    await assertNoErrorsInCode2(
+    await resolveTestCodeWithDiagnostics2(
       externalCode: r'''
 class A {
   void foo([@deprecated int x = 0]) {}
@@ -1726,7 +1670,7 @@
   }
 
   test_parameter_positionalOptional_inDeprecatedPrimaryConstructor() async {
-    await assertNoErrorsInCode2(
+    await resolveTestCodeWithDiagnostics2(
       externalCode: r'''
 void foo([@deprecated int x = 0]) {}
 ''',
@@ -1742,19 +1686,20 @@
   }
 
   test_parameter_positionalOptionalInPrimaryConstructor() async {
-    await assertErrorsInCode2(
+    await resolveTestCodeWithDiagnostics2(
       externalCode: r'''
 class A([@deprecated int x = 0]);
 ''',
       code: '''
 var x = A(7);
+//        ^
+// [diag.deprecatedMemberUse] 'x' is deprecated and shouldn't be used.
 ''',
-      [error(diag.deprecatedMemberUse, 39, 1)],
     );
   }
 
   test_parameter_positionalRequired() async {
-    await assertNoErrorsInCode2(
+    await resolveTestCodeWithDiagnostics2(
       externalCode: r'''
 class A {
   void foo(@deprecated int x) {}
@@ -1775,16 +1720,15 @@
 }
 ''');
 
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'package:aaa/a.dart';
 
 class B extends A {
   B() : super(7);
+//            ^
+// [diag.deprecatedMemberUse] 'p' is deprecated and shouldn't be used.
 }
-''',
-      [error(diag.deprecatedMemberUse, 64, 1)],
-    );
+''');
   }
 
   test_parameterInSuper_explicitInvocation_inPrimaryConstructorBody() async {
@@ -1794,16 +1738,15 @@
 }
 ''');
 
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'package:aaa/a.dart';
 
 class B() extends A {
   this : super(7);
+//             ^
+// [diag.deprecatedMemberUse] 'p' is deprecated and shouldn't be used.
 }
-''',
-      [error(diag.deprecatedMemberUse, 67, 1)],
-    );
+''');
   }
 
   test_parameterInSuper_explicitInvocation_namedParameter() async {
@@ -1813,16 +1756,15 @@
 }
 ''');
 
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'package:aaa/a.dart';
 
 class B extends A {
   B() : super(p: 7);
+//            ^
+// [diag.deprecatedMemberUse] 'p' is deprecated and shouldn't be used.
 }
-''',
-      [error(diag.deprecatedMemberUse, 64, 1)],
-    );
+''');
   }
 
   test_parameterInSuper_implicitArgument() async {
@@ -1832,16 +1774,15 @@
 }
 ''');
 
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'package:aaa/a.dart';
 
 class B extends A {
   B([super.p]);
+//   ^^^^^^^
+// [diag.deprecatedMemberUse] 'p' is deprecated and shouldn't be used.
 }
-''',
-      [error(diag.deprecatedMemberUse, 55, 7)],
-    );
+''');
   }
 
   test_parameterInSuper_implicitArgument_alsoDeprecated() async {
@@ -1851,7 +1792,7 @@
 }
 ''');
 
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'package:aaa/a.dart';
 
 class B extends A {
@@ -1867,7 +1808,7 @@
 }
 ''');
 
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'package:aaa/a.dart';
 
 class B([@deprecated super.p]) extends A;
@@ -1881,16 +1822,15 @@
 }
 ''');
 
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'package:aaa/a.dart';
 
 class B extends A {
   B([super.p]) : super.named();
+//   ^^^^^^^
+// [diag.deprecatedMemberUse] 'p' is deprecated and shouldn't be used.
 }
-''',
-      [error(diag.deprecatedMemberUse, 55, 7)],
-    );
+''');
   }
 
   test_parameterInSuper_implicitArgument_explicitInvocation_inPrimaryConstructor() async {
@@ -1900,16 +1840,15 @@
 }
 ''');
 
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'package:aaa/a.dart';
 
 class B([super.p]) extends A {
+//       ^^^^^^^
+// [diag.deprecatedMemberUse] 'p' is deprecated and shouldn't be used.
   this : super.named();
 }
-''',
-      [error(diag.deprecatedMemberUse, 39, 7)],
-    );
+''');
   }
 
   test_parameterInSuper_implicitArgument_inPrimaryConstructor() async {
@@ -1919,14 +1858,13 @@
 }
 ''');
 
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'package:aaa/a.dart';
 
 class B([super.p]) extends A;
-''',
-      [error(diag.deprecatedMemberUse, 39, 7)],
-    );
+//       ^^^^^^^
+// [diag.deprecatedMemberUse] 'p' is deprecated and shouldn't be used.
+''');
   }
 
   test_parameterInSuper_implicitInvocation_namedParameter() async {
@@ -1936,27 +1874,26 @@
 }
 ''');
 
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'package:aaa/a.dart';
 
 class B extends A {
   B({super.p});
+//   ^^^^^^^
+// [diag.deprecatedMemberUse] 'p' is deprecated and shouldn't be used.
 }
-''',
-      [error(diag.deprecatedMemberUse, 55, 7)],
-    );
+''');
   }
 
   test_parameterOfGenericFunctionType_inCommentReference() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 /// [x]
 typedef F = void Function(@deprecated int x);
 ''');
   }
 
   test_postfixExpression_deprecatedGetter() async {
-    await assertErrorsInCode2(
+    await resolveTestCodeWithDiagnostics2(
       externalCode: r'''
 @deprecated
 int get x => 0;
@@ -1966,14 +1903,15 @@
       code: r'''
 void f() {
   x++;
+//^
+// [diag.deprecatedMemberUse] 'x' is deprecated and shouldn't be used.
 }
 ''',
-      [error(diag.deprecatedMemberUse, 42, 1)],
     );
   }
 
   test_postfixExpression_deprecatedNothing() async {
-    await assertNoErrorsInCode2(
+    await resolveTestCodeWithDiagnostics2(
       externalCode: r'''
 int get x => 0;
 
@@ -1988,7 +1926,7 @@
   }
 
   test_postfixExpression_deprecatedSetter() async {
-    await assertErrorsInCode2(
+    await resolveTestCodeWithDiagnostics2(
       externalCode: r'''
 int get x => 0;
 
@@ -1998,14 +1936,15 @@
       code: r'''
 void f() {
   x++;
+//^
+// [diag.deprecatedMemberUse] 'x' is deprecated and shouldn't be used.
 }
 ''',
-      [error(diag.deprecatedMemberUse, 42, 1)],
     );
   }
 
   test_prefixedIdentifier_identifier() async {
-    await assertErrorsInCode2(
+    await resolveTestCodeWithDiagnostics2(
       externalCode: r'''
 class A {
   @deprecated
@@ -2015,14 +1954,15 @@
       code: r'''
 void f() {
   A.foo;
+//  ^^^
+// [diag.deprecatedMemberUse] 'foo' is deprecated and shouldn't be used.
 }
 ''',
-      [error(diag.deprecatedMemberUse, 44, 3)],
     );
   }
 
   test_prefixedIdentifier_prefix() async {
-    await assertErrorsInCode2(
+    await resolveTestCodeWithDiagnostics2(
       externalCode: r'''
 @deprecated
 class A {
@@ -2032,14 +1972,15 @@
       code: r'''
 void f() {
   A.foo;
+//^
+// [diag.deprecatedMemberUse] 'A' is deprecated and shouldn't be used.
 }
 ''',
-      [error(diag.deprecatedMemberUse, 42, 1)],
     );
   }
 
   test_prefixExpression_deprecatedGetter() async {
-    await assertErrorsInCode2(
+    await resolveTestCodeWithDiagnostics2(
       externalCode: r'''
 @deprecated
 int get x => 0;
@@ -2049,14 +1990,15 @@
       code: r'''
 void f() {
   ++x;
+//  ^
+// [diag.deprecatedMemberUse] 'x' is deprecated and shouldn't be used.
 }
 ''',
-      [error(diag.deprecatedMemberUse, 44, 1)],
     );
   }
 
   test_prefixExpression_deprecatedSetter() async {
-    await assertErrorsInCode2(
+    await resolveTestCodeWithDiagnostics2(
       externalCode: r'''
 int get x => 0;
 
@@ -2066,14 +2008,15 @@
       code: r'''
 void f() {
   ++x;
+//  ^
+// [diag.deprecatedMemberUse] 'x' is deprecated and shouldn't be used.
 }
 ''',
-      [error(diag.deprecatedMemberUse, 44, 1)],
     );
   }
 
   test_propertyAccess_super() async {
-    await assertErrorsInCode2(
+    await resolveTestCodeWithDiagnostics2(
       externalCode: r'''
 class A {
   @deprecated
@@ -2084,15 +2027,16 @@
 class B extends A {
   void bar() {
     super.foo;
+//        ^^^
+// [diag.deprecatedMemberUse] 'foo' is deprecated and shouldn't be used.
   }
 }
 ''',
-      [error(diag.deprecatedMemberUse, 74, 3)],
     );
   }
 
   test_redirectedConstructor_fromFactoryConstructor() async {
-    await assertErrorsInCode2(
+    await resolveTestCodeWithDiagnostics2(
       externalCode: r'''
 import 'package:test/test.dart';
 class B extends A {
@@ -2103,14 +2047,15 @@
       code: r'''
 class A {
   factory A.two() = B;
+//                  ^
+// [diag.deprecatedMemberUse] 'B' is deprecated and shouldn't be used.
 }
 ''',
-      [error(diag.deprecatedMemberUse, 59, 1)],
     );
   }
 
   test_redirectedParameter_redirectingFactoryConstructor() async {
-    await assertErrorsInCode2(
+    await resolveTestCodeWithDiagnostics2(
       externalCode: r'''
 import 'package:test/test.dart';
 class B extends A {
@@ -2120,14 +2065,15 @@
       code: r'''
 class A {
   factory A.two([int? p]) = B;
+//               ^^^^^^
+// [diag.deprecatedMemberUse] 'p' is deprecated and shouldn't be used.
 }
 ''',
-      [error(diag.deprecatedMemberUse, 56, 6)],
     );
   }
 
   test_redirectedParameter_redirectingFactoryConstructor_deprecatedFunctionTypedParameter() async {
-    await assertNoErrorsInCode2(
+    await resolveTestCodeWithDiagnostics2(
       externalCode: r'''
 import 'package:test/test.dart';
 class B extends A {
@@ -2143,7 +2089,7 @@
   }
 
   test_redirectedParameter_redirectingFactoryConstructor_deprecatedParameter() async {
-    await assertNoErrorsInCode2(
+    await resolveTestCodeWithDiagnostics2(
       externalCode: r'''
 import 'package:test/test.dart';
 class B extends A {
@@ -2159,7 +2105,7 @@
   }
 
   test_redirectedParameter_redirectingFactoryConstructor_functionTypedParameter() async {
-    await assertErrorsInCode2(
+    await resolveTestCodeWithDiagnostics2(
       externalCode: r'''
 import 'package:test/test.dart';
 class B extends A {
@@ -2169,14 +2115,15 @@
       code: r'''
 class A {
   factory A.two([void p()?]) = B;
+//               ^^^^^^^^^
+// [diag.deprecatedMemberUse] 'p' is deprecated and shouldn't be used.
 }
 ''',
-      [error(diag.deprecatedMemberUse, 56, 9)],
     );
   }
 
   test_redirectedParameter_redirectingFactoryConstructor_named() async {
-    await assertErrorsInCode2(
+    await resolveTestCodeWithDiagnostics2(
       externalCode: r'''
 import 'package:test/test.dart';
 class B extends A {
@@ -2186,14 +2133,15 @@
       code: r'''
 class A {
   factory A.two({int? p}) = B;
+//               ^^^^^^
+// [diag.deprecatedMemberUse] 'p' is deprecated and shouldn't be used.
 }
 ''',
-      [error(diag.deprecatedMemberUse, 56, 6)],
     );
   }
 
   test_redirectingConstructorInvocation_namedParameter() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   A({@deprecated int a = 0}) {}
   A.named() : this(a: 0);
@@ -2209,16 +2157,15 @@
 }
 ''');
 
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'package:aaa/a.dart';
 
 void f(A a) {
   a.foo = 0;
+//  ^^^
+// [diag.deprecatedMemberUse] 'foo' is deprecated and shouldn't be used.
 }
-''',
-      [error(diag.deprecatedMemberUse, 48, 3)],
-    );
+''');
   }
 
   test_showCombinator() async {
@@ -2226,17 +2173,16 @@
 @deprecated
 class A {}
 ''');
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 // ignore: unused_import
-import '$externalLibUri' show A;
-''',
-      [error(diag.deprecatedMemberUse, 58, 1)],
-    );
+import 'package:aaa/a.dart' show A;
+//                               ^
+// [diag.deprecatedMemberUse] 'A' is deprecated and shouldn't be used.
+''');
   }
 
   test_superConstructor_factoryConstructor() async {
-    await assertNoErrorsInCode2(
+    await resolveTestCodeWithDiagnostics2(
       externalCode: r'''
 class A {
   @deprecated
@@ -2254,7 +2200,7 @@
   }
 
   test_superConstructor_implicitCall() async {
-    await assertErrorsInCode2(
+    await resolveTestCodeWithDiagnostics2(
       externalCode: r'''
 class A {
   @deprecated
@@ -2264,14 +2210,15 @@
       code: r'''
 class B extends A {
   B();
+//^^^^
+// [diag.deprecatedMemberUse] 'A' is deprecated and shouldn't be used.
 }
 ''',
-      [error(diag.deprecatedMemberUse, 51, 4)],
     );
   }
 
   test_superConstructor_namedConstructor() async {
-    await assertErrorsInCode2(
+    await resolveTestCodeWithDiagnostics2(
       externalCode: r'''
 class A {
   @deprecated
@@ -2281,21 +2228,15 @@
       code: r'''
 class B extends A {
   B() : super.named() {}
+//      ^^^^^^^^^^^^^
+// [diag.deprecatedMemberUse] 'A.named' is deprecated and shouldn't be used.
 }
 ''',
-      [
-        error(
-          diag.deprecatedMemberUse,
-          57,
-          13,
-          text: "'A.named' is deprecated and shouldn't be used.",
-        ),
-      ],
     );
   }
 
   test_superConstructor_primaryConstructor() async {
-    await assertErrorsInCode2(
+    await resolveTestCodeWithDiagnostics2(
       externalCode: r'''
 class A() {
   @deprecated
@@ -2305,21 +2246,15 @@
       code: r'''
 class B extends A {
   B() : super();
+//      ^^^^^^^
+// [diag.deprecatedMemberUse] 'A' is deprecated and shouldn't be used.
 }
 ''',
-      [
-        error(
-          diag.deprecatedMemberUse,
-          57,
-          7,
-          text: "'A' is deprecated and shouldn't be used.",
-        ),
-      ],
     );
   }
 
   test_superConstructor_redirectingConstructor() async {
-    await assertNoErrorsInCode2(
+    await resolveTestCodeWithDiagnostics2(
       externalCode: r'''
 class A {
   @deprecated
@@ -2337,7 +2272,7 @@
   }
 
   test_superConstructor_unnamedConstructor() async {
-    await assertErrorsInCode2(
+    await resolveTestCodeWithDiagnostics2(
       externalCode: r'''
 class A {
   @deprecated
@@ -2347,21 +2282,15 @@
       code: r'''
 class B extends A {
   B() : super() {}
+//      ^^^^^^^
+// [diag.deprecatedMemberUse] 'A' is deprecated and shouldn't be used.
 }
 ''',
-      [
-        error(
-          diag.deprecatedMemberUse,
-          57,
-          7,
-          text: "'A' is deprecated and shouldn't be used.",
-        ),
-      ],
     );
   }
 
   test_topLevelVariable_argument() async {
-    await assertErrorsInCode2(
+    await resolveTestCodeWithDiagnostics2(
       externalCode: r'''
 @deprecated
 int x = 1;
@@ -2369,14 +2298,15 @@
       code: r'''
 void f() {
   print(x);
+//      ^
+// [diag.deprecatedMemberUse] 'x' is deprecated and shouldn't be used.
 }
 ''',
-      [error(diag.deprecatedMemberUse, 48, 1)],
     );
   }
 
   test_topLevelVariable_assignment_right() async {
-    await assertErrorsInCode2(
+    await resolveTestCodeWithDiagnostics2(
       externalCode: r'''
 @deprecated
 int x = 1;
@@ -2384,14 +2314,15 @@
       code: r'''
 void f(int a) {
   a = x;
+//    ^
+// [diag.deprecatedMemberUse] 'x' is deprecated and shouldn't be used.
 }
 ''',
-      [error(diag.deprecatedMemberUse, 51, 1)],
     );
   }
 
   test_topLevelVariable_binaryExpression() async {
-    await assertErrorsInCode2(
+    await resolveTestCodeWithDiagnostics2(
       externalCode: r'''
 @deprecated
 int x = 1;
@@ -2399,14 +2330,15 @@
       code: r'''
 void f() {
   x + 1;
+//^
+// [diag.deprecatedMemberUse] 'x' is deprecated and shouldn't be used.
 }
 ''',
-      [error(diag.deprecatedMemberUse, 42, 1)],
     );
   }
 
   test_topLevelVariable_constructorFieldInitializer() async {
-    await assertErrorsInCode2(
+    await resolveTestCodeWithDiagnostics2(
       externalCode: r'''
 @deprecated
 const int x = 1;
@@ -2415,27 +2347,29 @@
 class A {
   final int f;
   A() : f = x;
+//          ^
+// [diag.deprecatedMemberUse] 'x' is deprecated and shouldn't be used.
 }
 ''',
-      [error(diag.deprecatedMemberUse, 66, 1)],
     );
   }
 
   test_topLevelVariable_expressionFunctionBody() async {
-    await assertErrorsInCode2(
+    await resolveTestCodeWithDiagnostics2(
       externalCode: r'''
 @deprecated
 int x = 1;
 ''',
       code: r'''
 int f() => x;
+//         ^
+// [diag.deprecatedMemberUse] 'x' is deprecated and shouldn't be used.
 ''',
-      [error(diag.deprecatedMemberUse, 40, 1)],
     );
   }
 
   test_topLevelVariable_expressionStatement() async {
-    await assertErrorsInCode2(
+    await resolveTestCodeWithDiagnostics2(
       externalCode: r'''
 @deprecated
 int x = 1;
@@ -2443,14 +2377,15 @@
       code: r'''
 void f() {
   x;
+//^
+// [diag.deprecatedMemberUse] 'x' is deprecated and shouldn't be used.
 }
 ''',
-      [error(diag.deprecatedMemberUse, 42, 1)],
     );
   }
 
   test_topLevelVariable_forElement_condition() async {
-    await assertErrorsInCode2(
+    await resolveTestCodeWithDiagnostics2(
       externalCode: r'''
 @deprecated
 var x = true;
@@ -2458,14 +2393,15 @@
       code: r'''
 void f() {
   [for (;x;) 0];
+//       ^
+// [diag.deprecatedMemberUse] 'x' is deprecated and shouldn't be used.
 }
 ''',
-      [error(diag.deprecatedMemberUse, 49, 1)],
     );
   }
 
   test_topLevelVariable_forStatement_condition() async {
-    await assertErrorsInCode2(
+    await resolveTestCodeWithDiagnostics2(
       externalCode: r'''
 @deprecated
 var x = true;
@@ -2473,14 +2409,15 @@
       code: r'''
 void f() {
   for (;x;) {}
+//      ^
+// [diag.deprecatedMemberUse] 'x' is deprecated and shouldn't be used.
 }
 ''',
-      [error(diag.deprecatedMemberUse, 48, 1)],
     );
   }
 
   test_topLevelVariable_ifElement_condition() async {
-    await assertErrorsInCode2(
+    await resolveTestCodeWithDiagnostics2(
       externalCode: r'''
 @deprecated
 var x = true;
@@ -2488,14 +2425,15 @@
       code: r'''
 void f() {
   [if (x) 0];
+//     ^
+// [diag.deprecatedMemberUse] 'x' is deprecated and shouldn't be used.
 }
 ''',
-      [error(diag.deprecatedMemberUse, 47, 1)],
     );
   }
 
   test_topLevelVariable_ifStatement_condition() async {
-    await assertErrorsInCode2(
+    await resolveTestCodeWithDiagnostics2(
       externalCode: r'''
 @deprecated
 var x = true;
@@ -2503,14 +2441,15 @@
       code: r'''
 void f() {
   if (x) {}
+//    ^
+// [diag.deprecatedMemberUse] 'x' is deprecated and shouldn't be used.
 }
 ''',
-      [error(diag.deprecatedMemberUse, 46, 1)],
     );
   }
 
   test_topLevelVariable_listLiteral() async {
-    await assertErrorsInCode2(
+    await resolveTestCodeWithDiagnostics2(
       externalCode: r'''
 @deprecated
 int x = 1;
@@ -2518,14 +2457,15 @@
       code: r'''
 void f() {
   [x];
+// ^
+// [diag.deprecatedMemberUse] 'x' is deprecated and shouldn't be used.
 }
 ''',
-      [error(diag.deprecatedMemberUse, 43, 1)],
     );
   }
 
   test_topLevelVariable_mapLiteralEntry() async {
-    await assertErrorsInCode2(
+    await resolveTestCodeWithDiagnostics2(
       externalCode: r'''
 @deprecated
 int x = 1;
@@ -2533,17 +2473,17 @@
       code: r'''
 void f() {
   ({0: x, x: 0});
+//     ^
+// [diag.deprecatedMemberUse] 'x' is deprecated and shouldn't be used.
+//        ^
+// [diag.deprecatedMemberUse] 'x' is deprecated and shouldn't be used.
 }
 ''',
-      [
-        error(diag.deprecatedMemberUse, 47, 1),
-        error(diag.deprecatedMemberUse, 50, 1),
-      ],
     );
   }
 
   test_topLevelVariable_namedExpression() async {
-    await assertErrorsInCode2(
+    await resolveTestCodeWithDiagnostics2(
       externalCode: r'''
 @deprecated
 int x = 1;
@@ -2552,14 +2492,15 @@
 void g({int a = 0}) {}
 void f() {
   g(a: x);
+//     ^
+// [diag.deprecatedMemberUse] 'x' is deprecated and shouldn't be used.
 }
 ''',
-      [error(diag.deprecatedMemberUse, 70, 1)],
     );
   }
 
   test_topLevelVariable_returnStatement() async {
-    await assertErrorsInCode2(
+    await resolveTestCodeWithDiagnostics2(
       externalCode: r'''
 @deprecated
 int x = 1;
@@ -2567,14 +2508,15 @@
       code: r'''
 int f() {
   return x;
+//       ^
+// [diag.deprecatedMemberUse] 'x' is deprecated and shouldn't be used.
 }
 ''',
-      [error(diag.deprecatedMemberUse, 48, 1)],
     );
   }
 
   test_topLevelVariable_setLiteral() async {
-    await assertErrorsInCode2(
+    await resolveTestCodeWithDiagnostics2(
       externalCode: r'''
 @deprecated
 int x = 1;
@@ -2582,14 +2524,15 @@
       code: r'''
 void f() {
   ({x});
+//  ^
+// [diag.deprecatedMemberUse] 'x' is deprecated and shouldn't be used.
 }
 ''',
-      [error(diag.deprecatedMemberUse, 44, 1)],
     );
   }
 
   test_topLevelVariable_spreadElement() async {
-    await assertErrorsInCode2(
+    await resolveTestCodeWithDiagnostics2(
       externalCode: r'''
 @deprecated
 var x = [0];
@@ -2597,14 +2540,15 @@
       code: r'''
 void f() {
   [...x];
+//    ^
+// [diag.deprecatedMemberUse] 'x' is deprecated and shouldn't be used.
 }
 ''',
-      [error(diag.deprecatedMemberUse, 46, 1)],
     );
   }
 
   test_topLevelVariable_switchCase() async {
-    await assertErrorsInCode2(
+    await resolveTestCodeWithDiagnostics2(
       externalCode: r'''
 @deprecated
 const int x = 1;
@@ -2613,11 +2557,12 @@
 void f(int a) {
   switch (a) {
     case x:
+//       ^
+// [diag.deprecatedMemberUse] 'x' is deprecated and shouldn't be used.
       break;
   }
 }
 ''',
-      [error(diag.deprecatedMemberUse, 69, 1)],
     );
   }
 
@@ -2626,23 +2571,22 @@
 @deprecated
 const int x = 1;
 ''');
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 // @dart = 2.19
-import '$externalLibUri';
+import 'package:aaa/a.dart';
 void f(int a) {
   switch (a) {
     case x:
+//       ^
+// [diag.deprecatedMemberUse] 'x' is deprecated and shouldn't be used.
       break;
   }
 }
-''',
-      [error(diag.deprecatedMemberUse, 85, 1)],
-    );
+''');
   }
 
   test_topLevelVariable_switchStatement() async {
-    await assertErrorsInCode2(
+    await resolveTestCodeWithDiagnostics2(
       externalCode: r'''
 @deprecated
 int x = 1;
@@ -2650,9 +2594,10 @@
       code: r'''
 void f() {
   switch (x) {}
+//        ^
+// [diag.deprecatedMemberUse] 'x' is deprecated and shouldn't be used.
 }
 ''',
-      [error(diag.deprecatedMemberUse, 50, 1)],
     );
   }
 
@@ -2661,20 +2606,19 @@
 @deprecated
 int x = 1;
 ''');
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 // @dart = 2.19
-import '$externalLibUri';
+import 'package:aaa/a.dart';
 void f() {
   switch (x) {}
+//        ^
+// [diag.deprecatedMemberUse] 'x' is deprecated and shouldn't be used.
 }
-''',
-      [error(diag.deprecatedMemberUse, 66, 1)],
-    );
+''');
   }
 
   test_topLevelVariable_unaryExpression() async {
-    await assertErrorsInCode2(
+    await resolveTestCodeWithDiagnostics2(
       externalCode: r'''
 @deprecated
 int x = 1;
@@ -2682,14 +2626,15 @@
       code: r'''
 void f() {
   -x;
+// ^
+// [diag.deprecatedMemberUse] 'x' is deprecated and shouldn't be used.
 }
 ''',
-      [error(diag.deprecatedMemberUse, 43, 1)],
     );
   }
 
   test_topLevelVariable_variableDeclaration_initializer() async {
-    await assertErrorsInCode2(
+    await resolveTestCodeWithDiagnostics2(
       externalCode: r'''
 @deprecated
 var x = 1;
@@ -2698,14 +2643,15 @@
 void f() {
   // ignore: unused_local_variable
   var v = x;
+//        ^
+// [diag.deprecatedMemberUse] 'x' is deprecated and shouldn't be used.
 }
 ''',
-      [error(diag.deprecatedMemberUse, 85, 1)],
     );
   }
 
   test_topLevelVariable_whileStatement_condition() async {
-    await assertErrorsInCode2(
+    await resolveTestCodeWithDiagnostics2(
       externalCode: r'''
 @deprecated
 var x = true;
@@ -2713,9 +2659,10 @@
       code: r'''
 void f() {
   while (x) {}
+//       ^
+// [diag.deprecatedMemberUse] 'x' is deprecated and shouldn't be used.
 }
 ''',
-      [error(diag.deprecatedMemberUse, 49, 1)],
     );
   }
 
diff --git a/pkg/analyzer/test/src/diagnostics/deprecated_mixin_function_test.dart b/pkg/analyzer/test/src/diagnostics/deprecated_mixin_function_test.dart
index f940e4c..a809d0b 100644
--- a/pkg/analyzer/test/src/diagnostics/deprecated_mixin_function_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/deprecated_mixin_function_test.dart
@@ -2,88 +2,82 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/src/diagnostic/diagnostic.dart' as diag;
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../dart/resolution/context_collection_resolution.dart';
+import '../dart/resolution/node_text_expectations.dart';
 
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(DeprecatedMixinFunctionTest);
+    defineReflectiveTests(UpdateNodeTextExpectations);
   });
 }
 
 @reflectiveTest
 class DeprecatedMixinFunctionTest extends PubPackageResolutionTest {
   test_class_core() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 class A extends Object with Function {}
-''',
-      [error(diag.classUsedAsMixin, 28, 8)],
-    );
+//                          ^^^^^^^^
+// [diag.classUsedAsMixin] The class 'Function' can't be used as a mixin because it's neither a mixin class nor a mixin.
+''');
   }
 
   test_class_core_language219() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 // @dart = 2.19
 class A extends Object with Function {}
-''',
-      [error(diag.deprecatedMixinFunction, 44, 8)],
-    );
+//                          ^^^^^^^^
+// [diag.deprecatedMixinFunction] Mixing in 'Function' is deprecated.
+''');
   }
 
   test_class_core_language219_viaTypedef() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 // @dart = 2.19
 typedef F = Function;
 class A extends Object with F {}
-''',
-      [error(diag.deprecatedMixinFunction, 66, 1)],
-    );
+//                          ^
+// [diag.deprecatedMixinFunction] Mixing in 'Function' is deprecated.
+''');
   }
 
   test_class_local() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 mixin Function {}
+//    ^^^^^^^^
+// [diag.builtInIdentifierAsTypeName] The built-in identifier 'Function' can't be used as a type name.
 class A extends Object with Function {}
-''',
-      [error(diag.builtInIdentifierAsTypeName, 6, 8)],
-    );
+''');
   }
 
   test_class_local_language219() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 // @dart = 2.19
 mixin Function {}
+//    ^^^^^^^^
+// [diag.builtInIdentifierAsTypeName] The built-in identifier 'Function' can't be used as a type name.
 class A extends Object with Function {}
-''',
-      [error(diag.builtInIdentifierAsTypeName, 22, 8)],
-    );
+''');
   }
 
   test_classAlias_core_language219() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 // @dart = 2.19
 class A = Object with Function;
-''',
-      [error(diag.deprecatedMixinFunction, 38, 8)],
-    );
+//                    ^^^^^^^^
+// [diag.deprecatedMixinFunction] Mixing in 'Function' is deprecated.
+''');
   }
 
   test_classAlias_core_language219_viaTypedef() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 // @dart = 2.19
 typedef F = Function;
 class A = Object with F;
-''',
-      [error(diag.deprecatedMixinFunction, 60, 1)],
-    );
+//                    ^
+// [diag.deprecatedMixinFunction] Mixing in 'Function' is deprecated.
+''');
   }
 }
diff --git a/pkg/analyzer/test/src/diagnostics/deprecated_mixin_test.dart b/pkg/analyzer/test/src/diagnostics/deprecated_mixin_test.dart
index 7839632..45f96d8 100644
--- a/pkg/analyzer/test/src/diagnostics/deprecated_mixin_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/deprecated_mixin_test.dart
@@ -2,14 +2,15 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/src/diagnostic/diagnostic.dart' as diag;
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../dart/resolution/context_collection_resolution.dart';
+import '../dart/resolution/node_text_expectations.dart';
 
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(DeprecatedMixinTest);
+    defineReflectiveTests(UpdateNodeTextExpectations);
   });
 }
 
@@ -22,13 +23,12 @@
 typedef Foo2 = Foo;
 ''');
 
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'foo.dart';
 class Bar with Foo {}
-''',
-      [error(diag.deprecatedMixin, 34, 3)],
-    );
+//             ^^^
+// [diag.deprecatedMixin] Mixing in 'Foo' is deprecated.
+''');
   }
 
   test_annotatedClassTypeAlias() async {
@@ -38,13 +38,12 @@
 mixin class Foo = Object with M;
 ''');
 
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'foo.dart';
 class Bar with Foo {}
-''',
-      [error(diag.deprecatedMixin, 34, 3)],
-    );
+//             ^^^
+// [diag.deprecatedMixin] Mixing in 'Foo' is deprecated.
+''');
   }
 
   test_class() async {
@@ -53,13 +52,12 @@
 mixin class Foo {}
 ''');
 
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'foo.dart';
 class Bar with Foo {}
-''',
-      [error(diag.deprecatedMixin, 34, 3)],
-    );
+//             ^^^
+// [diag.deprecatedMixin] Mixing in 'Foo' is deprecated.
+''');
   }
 
   test_classTypeAlias() async {
@@ -68,13 +66,12 @@
 mixin class Foo {}
 ''');
 
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'foo.dart';
 class Bar = Object with Foo;
-''',
-      [error(diag.deprecatedMixin, 43, 3)],
-    );
+//                      ^^^
+// [diag.deprecatedMixin] Mixing in 'Foo' is deprecated.
+''');
   }
 
   test_enum() async {
@@ -83,19 +80,18 @@
 mixin class Foo {}
 ''');
 
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'foo.dart';
 enum Bar with Foo {
+//            ^^^
+// [diag.deprecatedMixin] Mixing in 'Foo' is deprecated.
   one, two;
 }
-''',
-      [error(diag.deprecatedMixin, 33, 3)],
-    );
+''');
   }
 
   test_insideLibrary() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 @Deprecated.mixin()
 mixin class Foo {}
 class Bar with Foo {}
@@ -107,7 +103,7 @@
 mixin class Foo {}
 ''');
 
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'foo.dart';
 class Bar with Foo {}
 ''');
diff --git a/pkg/analyzer/test/src/diagnostics/deprecated_optional_test.dart b/pkg/analyzer/test/src/diagnostics/deprecated_optional_test.dart
index 6bb2785..2e90d7a 100644
--- a/pkg/analyzer/test/src/diagnostics/deprecated_optional_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/deprecated_optional_test.dart
@@ -2,21 +2,22 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/src/diagnostic/diagnostic.dart' as diag;
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../dart/resolution/context_collection_resolution.dart';
+import '../dart/resolution/node_text_expectations.dart';
 
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(DeprecatedOptionalTest);
+    defineReflectiveTests(UpdateNodeTextExpectations);
   });
 }
 
 @reflectiveTest
 class DeprecatedOptionalTest extends PubPackageResolutionTest {
   test_argumentGiven() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 void f([@Deprecated.optional() int? p]) {}
 
 void g() {
@@ -26,7 +27,7 @@
   }
 
   test_argumentGiven_implicitSuperInvocation_namedParameter() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class C {
   C({@Deprecated.optional() int? p});
 }
@@ -38,7 +39,7 @@
   }
 
   test_argumentGiven_implicitSuperInvocation_namedParameter_primaryConstructor() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class C {
   C({@Deprecated.optional() int? p});
 }
@@ -48,7 +49,7 @@
   }
 
   test_argumentGiven_implicitSuperInvocation_withSuperParameter() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class C {
   C([@Deprecated.optional() int? p]);
 }
@@ -60,7 +61,7 @@
   }
 
   test_argumentGiven_implicitSuperInvocation_withSuperParameter_primaryConstructor() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class C {
   C([@Deprecated.optional() int? p]);
 }
@@ -70,7 +71,7 @@
   }
 
   test_argumentGiven_named() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 void f({@Deprecated.optional() int? p}) {}
 
 void g() {
@@ -80,7 +81,7 @@
   }
 
   test_argumentGiven_redirectedFromFactory_parameter_named() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class C {
   C();
   factory C.two({int? p}) = D;
@@ -93,7 +94,7 @@
   }
 
   test_argumentGiven_redirectedFromFactory_parameter_positional() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class C {
   C();
   factory C.two([int? p]) = D;
@@ -106,7 +107,7 @@
   }
 
   test_argumentGiven_superInvocation() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class C {
   C([@Deprecated.optional() int? p]);
 }
@@ -118,7 +119,7 @@
   }
 
   test_argumentGiven_superInvocation_namedParameter() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class C {
   C({@Deprecated.optional() int? p});
 }
@@ -130,7 +131,7 @@
   }
 
   test_argumentGiven_superInvocation_namedParameter_withSuperParameter() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class C {
   C({@Deprecated.optional() int? p});
 }
@@ -142,7 +143,7 @@
   }
 
   test_argumentGiven_superInvocation_namedSuperConstructor() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class C {
   C.named([@Deprecated.optional() int? p]);
 }
@@ -154,7 +155,7 @@
   }
 
   test_argumentGiven_superInvocation_withSuperParameter() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class C {
   C([@Deprecated.optional() int? p]);
 }
@@ -166,7 +167,7 @@
   }
 
   test_argumentGiven_superInvocation_withSuperParameter_primaryConstructor() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class C {
   C([@Deprecated.optional() int? p]);
 }
@@ -178,136 +179,127 @@
   }
 
   test_argumentOmitted() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 void f([@Deprecated.optional() int? p]) {}
 
 void g() {
   f();
+//^
+// [diag.deprecatedOptional] Omitting an argument for the 'p' parameter is deprecated.
 }
-''',
-      [error(diag.deprecatedOptional, 57, 1)],
-    );
+''');
   }
 
   test_argumentOmitted_dotShorthand() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class C {
   static C m({@Deprecated.optional() int? p}) => C();
 }
 
 C f() {
   return .m();
+//        ^
+// [diag.deprecatedOptional] Omitting an argument for the 'p' parameter is deprecated.
 }
-''',
-      [error(diag.deprecatedOptional, 85, 1)],
-    );
+''');
   }
 
   test_argumentOmitted_dotShorthandConstructor() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class C {
   C({@Deprecated.optional() int? p});
 }
 
 C f() {
   return .new();
+//        ^^^
+// [diag.deprecatedOptional] Omitting an argument for the 'p' parameter is deprecated.
 }
-''',
-      [error(diag.deprecatedOptional, 69, 3)],
-    );
+''');
   }
 
   test_argumentOmitted_implicitSuperInvocation() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class C {
   C([@Deprecated.optional() int? p]);
 }
 
 class D extends C {
   D();
+//^
+// [diag.deprecatedOptional] Omitting an argument for the 'p' parameter is deprecated.
 }
-''',
-      [error(diag.deprecatedOptional, 73, 1)],
-    );
+''');
   }
 
   test_argumentOmitted_implicitSuperInvocation_namedParameter() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class C {
   C({@Deprecated.optional() int? p});
 }
 
 class D extends C {
   D();
+//^
+// [diag.deprecatedOptional] Omitting an argument for the 'p' parameter is deprecated.
 }
-''',
-      [error(diag.deprecatedOptional, 73, 1)],
-    );
+''');
   }
 
   test_argumentOmitted_implicitSuperInvocation_primaryConstructor() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class C {
   C([@Deprecated.optional() int? p]);
 }
 
 class D() extends C;
-''',
-      [error(diag.deprecatedOptional, 57, 1)],
-    );
+//    ^
+// [diag.deprecatedOptional] Omitting an argument for the 'p' parameter is deprecated.
+''');
   }
 
   test_argumentOmitted_instanceCreation() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class C {
   C([@Deprecated.optional() int? p]);
 }
 
 void f() {
   C();
+//^
+// [diag.deprecatedOptional] Omitting an argument for the 'p' parameter is deprecated.
 }
-''',
-      [error(diag.deprecatedOptional, 64, 1)],
-    );
+''');
   }
 
   test_argumentOmitted_methodInvocation() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class C {
   void m({@Deprecated.optional() int? p}) {}
 }
 
 void f(C c) {
   c.m();
+//  ^
+// [diag.deprecatedOptional] Omitting an argument for the 'p' parameter is deprecated.
 }
-''',
-      [error(diag.deprecatedOptional, 76, 1)],
-    );
+''');
   }
 
   test_argumentOmitted_named() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 void f({@Deprecated.optional() int? p}) {}
 
 void g() {
   f();
+//^
+// [diag.deprecatedOptional] Omitting an argument for the 'p' parameter is deprecated.
 }
-''',
-      [error(diag.deprecatedOptional, 57, 1)],
-    );
+''');
   }
 
   test_argumentOmitted_override() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class C {
   void m({@Deprecated.optional() int? p}) {}
 }
@@ -324,15 +316,14 @@
   }
 
   test_argumentOmitted_redirectedConstructor() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class C {
   C([@Deprecated.optional() int? p]);
   C.two() : this();
+//          ^^^^
+// [diag.deprecatedOptional] Omitting an argument for the 'p' parameter is deprecated.
 }
-''',
-      [error(diag.deprecatedOptional, 60, 4)],
-    );
+''');
   }
 
   test_argumentOmitted_redirectedConstructor_indirectlyDeprecated() async {
@@ -343,60 +334,56 @@
     // `this.two()`, because `C.two` does not accept a positional parameter.)
     // Whether and how `C.three` must change depends on how `C.two` is changed
     // to handle the deprecation.
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class C {
   C([@Deprecated.optional() int? p]);
   C.two() : this();
+//          ^^^^
+// [diag.deprecatedOptional] Omitting an argument for the 'p' parameter is deprecated.
   C.three() : this.two();
 }
-''',
-      [error(diag.deprecatedOptional, 60, 4)],
-    );
+''');
   }
 
   test_argumentOmitted_redirectedConstructor_named() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class C {
   C.one([@Deprecated.optional() int? p]);
   C.two() : this.one();
+//               ^^^
+// [diag.deprecatedOptional] Omitting an argument for the 'p' parameter is deprecated.
 }
-''',
-      [error(diag.deprecatedOptional, 69, 3)],
-    );
+''');
   }
 
   test_argumentOmitted_redirectedFromFactory_parameter_named() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class C {
   C();
   factory C.two() = D;
+//        ^^^^^
+// [diag.deprecatedOptional] Omitting an argument for the 'p' parameter is deprecated.
 }
 
 class D extends C {
   D({@Deprecated.optional() int? p});
 }
-''',
-      [error(diag.deprecatedOptional, 27, 5)],
-    );
+''');
   }
 
   test_argumentOmitted_redirectedFromFactory_parameter_positional() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class C {
   C();
   factory C.two() = D;
+//        ^^^^^
+// [diag.deprecatedOptional] Omitting an argument for the 'p' parameter is deprecated.
 }
 
 class D extends C {
   D([@Deprecated.optional() int? p]);
 }
-''',
-      [error(diag.deprecatedOptional, 27, 5)],
-    );
+''');
   }
 
   test_argumentOmitted_redirectedIndirectlyFromFactory_parameter_named() async {
@@ -408,8 +395,7 @@
     // produce a new error or warning at `C.two` (if the signature is adjusted),
     // or will make `C.two` indirectly compliant (like if `D.two` is changed to
     // redirect differently, or not redirect, etc.).
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class C {
   C();
   factory C.two() = D.two;
@@ -418,29 +404,28 @@
 class D extends C {
   D();
   factory D.two() = E;
+//        ^^^^^
+// [diag.deprecatedOptional] Omitting an argument for the 'p' parameter is deprecated.
 }
 
 class E extends D {
   E({@Deprecated.optional() int? p});
 }
-''',
-      [error(diag.deprecatedOptional, 84, 5)],
-    );
+''');
   }
 
   test_argumentOmitted_superInvocation() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class C {
   C([@Deprecated.optional() int? p]);
 }
 
 class D extends C {
   D() : super();
+//      ^^^^^
+// [diag.deprecatedOptional] Omitting an argument for the 'p' parameter is deprecated.
 }
-''',
-      [error(diag.deprecatedOptional, 79, 5)],
-    );
+''');
   }
 
   test_argumentOmitted_superInvocation_indirectlyDeprecated() async {
@@ -450,71 +435,67 @@
     // example, we can't pass a positional argument to `super()`, because
     // `D.new` does not accept a positional parameter.) Whether and how `E.new`
     // must change depends on how `D.new` is changed to handle the deprecation.
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class C {
   C([@Deprecated.optional() int? p]);
 }
 
 class D extends C {
   D() : super();
+//      ^^^^^
+// [diag.deprecatedOptional] Omitting an argument for the 'p' parameter is deprecated.
 }
 
 class E extends D {
   E() : super();
 }
-''',
-      [error(diag.deprecatedOptional, 79, 5)],
-    );
+''');
   }
 
   test_argumentOmitted_superInvocation_namedParameter() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class C {
   C({@Deprecated.optional() int? p});
 }
 
 class D extends C {
   D() : super();
+//      ^^^^^
+// [diag.deprecatedOptional] Omitting an argument for the 'p' parameter is deprecated.
 }
-''',
-      [error(diag.deprecatedOptional, 79, 5)],
-    );
+''');
   }
 
   test_argumentOmitted_superInvocation_namedSuperConstructor() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class C {
   C.named([@Deprecated.optional() int? p]);
 }
 
 class D extends C {
   D() : super.named();
+//            ^^^^^
+// [diag.deprecatedOptional] Omitting an argument for the 'p' parameter is deprecated.
 }
-''',
-      [error(diag.deprecatedOptional, 91, 5)],
-    );
+''');
   }
 
   test_argumentOmitted_superInvocation_primaryConstructor() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class C {
   C([@Deprecated.optional() int? p]);
 }
 
 class D() extends C {
   this : super();
+//       ^^^^^
+// [diag.deprecatedOptional] Omitting an argument for the 'p' parameter is deprecated.
 }
-''',
-      [error(diag.deprecatedOptional, 82, 5)],
-    );
+''');
   }
 
   test_noAnnotation() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 void f([int? p]) {}
 
 void g() {
diff --git a/pkg/analyzer/test/src/diagnostics/deprecated_subclass_test.dart b/pkg/analyzer/test/src/diagnostics/deprecated_subclass_test.dart
index b461435..77683c4 100644
--- a/pkg/analyzer/test/src/diagnostics/deprecated_subclass_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/deprecated_subclass_test.dart
@@ -2,7 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/src/diagnostic/diagnostic.dart' as diag;
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../dart/resolution/context_collection_resolution.dart';
@@ -21,13 +20,12 @@
 class Foo {}
 ''');
 
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'foo.dart';
 enum Bar implements Foo { one; }
-''',
-      [error(diag.deprecatedSubclass, 39, 3)],
-    );
+//                  ^^^
+// [diag.deprecatedSubclass] Subclassing 'Foo' is deprecated.
+''');
   }
 
   test_extendsClass() async {
@@ -36,13 +34,12 @@
 class Foo {}
 ''');
 
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'foo.dart';
 class Bar extends Foo {}
-''',
-      [error(diag.deprecatedSubclass, 37, 3)],
-    );
+//                ^^^
+// [diag.deprecatedSubclass] Subclassing 'Foo' is deprecated.
+''');
   }
 
   test_implementsClass() async {
@@ -51,13 +48,12 @@
 class Foo {}
 ''');
 
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'foo.dart';
 class Bar implements Foo {}
-''',
-      [error(diag.deprecatedSubclass, 40, 3)],
-    );
+//                   ^^^
+// [diag.deprecatedSubclass] Subclassing 'Foo' is deprecated.
+''');
   }
 
   test_implementsMixin() async {
@@ -66,17 +62,16 @@
 mixin Foo {}
 ''');
 
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'foo.dart';
 class Bar implements Foo {}
-''',
-      [error(diag.deprecatedSubclass, 40, 3)],
-    );
+//                   ^^^
+// [diag.deprecatedSubclass] Subclassing 'Foo' is deprecated.
+''');
   }
 
   test_insideLibrary() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 @Deprecated.subclass()
 class Foo {}
 class Bar extends Foo {}
@@ -90,14 +85,13 @@
 class Foo {}
 ''');
 
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 // @dart = 2.12
 import 'foo.dart';
 class Bar extends Object with Foo {}
-''',
-      [error(diag.deprecatedSubclass, 65, 3)],
-    );
+//                            ^^^
+// [diag.deprecatedSubclass] Subclassing 'Foo' is deprecated.
+''');
   }
 
   test_mixinImplementsClass() async {
@@ -106,13 +100,12 @@
 class Foo {}
 ''');
 
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'foo.dart';
 mixin Bar implements Foo {}
-''',
-      [error(diag.deprecatedSubclass, 40, 3)],
-    );
+//                   ^^^
+// [diag.deprecatedSubclass] Subclassing 'Foo' is deprecated.
+''');
   }
 
   test_mixinOnClass() async {
@@ -121,13 +114,12 @@
 class Foo {}
 ''');
 
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'foo.dart';
 mixin Bar on Foo {}
-''',
-      [error(diag.deprecatedSubclass, 32, 3)],
-    );
+//           ^^^
+// [diag.deprecatedSubclass] Subclassing 'Foo' is deprecated.
+''');
   }
 
   test_noAnnotation() async {
@@ -135,7 +127,7 @@
 class Foo {}
 ''');
 
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'foo.dart';
 class Bar extends Foo {}
 ''');
diff --git a/pkg/analyzer/test/src/diagnostics/doc_directive_argument_wrong_format_test.dart b/pkg/analyzer/test/src/diagnostics/doc_directive_argument_wrong_format_test.dart
index f78e639..a2cef18 100644
--- a/pkg/analyzer/test/src/diagnostics/doc_directive_argument_wrong_format_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/doc_directive_argument_wrong_format_test.dart
@@ -2,7 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/src/diagnostic/diagnostic.dart' as diag;
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../dart/resolution/context_collection_resolution.dart';
@@ -16,59 +15,54 @@
 @reflectiveTest
 class DocDirectiveArgumentWrongFormatTest extends PubPackageResolutionTest {
   test_animation_heightWrongFormat() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 /// {@animation 600 nan http://google.com}
+//                  ^^^
+// [diag.docDirectiveArgumentWrongFormat] The 'height' argument must be formatted as an integer.
 class C {}
-''',
-      [error(diag.docDirectiveArgumentWrongFormat, 20, 3)],
-    );
+''');
   }
 
   test_animation_urlWrongFormat() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 /// {@animation 600 400 other}
 class C {}
 ''');
   }
 
   test_animation_widthWrongFormat() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 /// {@animation nan 400 http://google.com}
+//              ^^^
+// [diag.docDirectiveArgumentWrongFormat] The 'width' argument must be formatted as an integer.
 class C {}
-''',
-      [error(diag.docDirectiveArgumentWrongFormat, 16, 3)],
-    );
+''');
   }
 
   test_youtube_heightWrongFormat() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 /// {@youtube 600 nan https://www.youtube.com/watch?v=123}
+//                ^^^
+// [diag.docDirectiveArgumentWrongFormat] The 'height' argument must be formatted as an integer.
 class C {}
-''',
-      [error(diag.docDirectiveArgumentWrongFormat, 18, 3)],
-    );
+''');
   }
 
   test_youtube_urlWrongFormat() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 /// {@youtube 600 400 http://google.com}
+//                    ^^^^^^^^^^^^^^^^^
+// [diag.docDirectiveArgumentWrongFormat] The 'url' argument must be formatted as a YouTube URL, starting with 'https://www.youtube.com/watch?v='.
 class C {}
-''',
-      [error(diag.docDirectiveArgumentWrongFormat, 22, 17)],
-    );
+''');
   }
 
   test_youtube_widthWrongFormat() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 /// {@youtube nan 400 https://www.youtube.com/watch?v=123}
+//            ^^^
+// [diag.docDirectiveArgumentWrongFormat] The 'width' argument must be formatted as an integer.
 class C {}
-''',
-      [error(diag.docDirectiveArgumentWrongFormat, 14, 3)],
-    );
+''');
   }
 }
diff --git a/pkg/analyzer/test/src/diagnostics/doc_directive_has_extra_arguments_test.dart b/pkg/analyzer/test/src/diagnostics/doc_directive_has_extra_arguments_test.dart
index f814d31..7b0c18b 100644
--- a/pkg/analyzer/test/src/diagnostics/doc_directive_has_extra_arguments_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/doc_directive_has_extra_arguments_test.dart
@@ -2,7 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/src/diagnostic/diagnostic.dart' as diag;
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../dart/resolution/context_collection_resolution.dart';
@@ -16,61 +15,57 @@
 @reflectiveTest
 class DocDirectiveHasExtraArgumentsTest extends PubPackageResolutionTest {
   test_animation_hasExtraArgument() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 /// {@animation 600 400 http://google.com foo}
+//                                        ^^^
+// [diag.docDirectiveHasExtraArguments] The 'animation' directive has '4' arguments, but only '3' are expected.
 class C {}
-''',
-      [error(diag.docDirectiveHasExtraArguments, 42, 3)],
-    );
+''');
   }
 
   test_animation_noExtraArguments() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 /// {@animation 600 400 http://google.com}
 class C {}
 ''');
   }
 
   test_animation_optionalNamedArgument() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 /// {@animation 600 400 http://google.com id=my-id}
 class C {}
 ''');
   }
 
   test_macro_hasExtraArgument() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 /// {@macro one two}
+//              ^^^
+// [diag.docDirectiveHasExtraArguments] The 'macro' directive has '2' arguments, but only '1' are expected.
 class C {}
-''',
-      [error(diag.docDirectiveHasExtraArguments, 16, 3)],
-    );
+''');
   }
 
   test_youtube_hasExtraArgument() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 /// {@youtube 600 400 https://www.youtube.com/watch?v=123 foo}
+//                                                        ^^^
+// [diag.docDirectiveHasExtraArguments] The 'youtube' directive has '4' arguments, but only '3' are expected.
 class C {}
-''',
-      [error(diag.docDirectiveHasExtraArguments, 58, 3)],
-    );
+''');
   }
 
   test_youtube_hasExtraArgument_trailingWhitespace() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 /// {@youtube 600 400 https://www.youtube.com/watch?v=123 foo }
+//                                                        ^^^
+// [diag.docDirectiveHasExtraArguments] The 'youtube' directive has '4' arguments, but only '3' are expected.
 class C {}
-''',
-      [error(diag.docDirectiveHasExtraArguments, 58, 3)],
-    );
+''');
   }
 
   test_youtube_noExtraArguments() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 /// {@youtube 600 400 https://www.youtube.com/watch?v=123}
 class C {}
 ''');
diff --git a/pkg/analyzer/test/src/diagnostics/doc_directive_has_unexpected_named_argument_test.dart b/pkg/analyzer/test/src/diagnostics/doc_directive_has_unexpected_named_argument_test.dart
index 5396d6f..c0b427e 100644
--- a/pkg/analyzer/test/src/diagnostics/doc_directive_has_unexpected_named_argument_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/doc_directive_has_unexpected_named_argument_test.dart
@@ -2,7 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/src/diagnostic/diagnostic.dart' as diag;
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../dart/resolution/context_collection_resolution.dart';
@@ -17,27 +16,25 @@
 class DocDirectiveHasUnexpectedNamedArgumentTest
     extends PubPackageResolutionTest {
   test_animation_hasUnexpectedArgument() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 /// {@animation 600 400 http://google.com foo=bar}
+//                                        ^^^^^^^
+// [diag.docDirectiveHasUnexpectedNamedArgument] The 'animation' directive has an unexpected named argument, 'foo'.
 class C {}
-''',
-      [error(diag.docDirectiveHasUnexpectedNamedArgument, 42, 7)],
-    );
+''');
   }
 
   test_macro_hasExtraArgument() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 /// {@macro name foo=bar}
+//               ^^^^^^^
+// [diag.docDirectiveHasUnexpectedNamedArgument] The 'macro' directive has an unexpected named argument, 'foo'.
 class C {}
-''',
-      [error(diag.docDirectiveHasUnexpectedNamedArgument, 17, 7)],
-    );
+''');
   }
 
   test_macro_noExtraArgument() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 /// {@macro name}
 class C {}
 ''');
diff --git a/pkg/analyzer/test/src/diagnostics/doc_directive_missing_one_argument_test.dart b/pkg/analyzer/test/src/diagnostics/doc_directive_missing_one_argument_test.dart
index 7694ed5..9310fcf 100644
--- a/pkg/analyzer/test/src/diagnostics/doc_directive_missing_one_argument_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/doc_directive_missing_one_argument_test.dart
@@ -2,7 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/src/diagnostic/diagnostic.dart' as diag;
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../dart/resolution/context_collection_resolution.dart';
@@ -16,73 +15,63 @@
 @reflectiveTest
 class DocDirectiveMissingOneArgumentTest extends PubPackageResolutionTest {
   test_animation_hasOptionalIdArgument() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 /// {@animation 600 400 http://google.com id=my-id}
 class C {}
 ''');
   }
 
   test_animation_hasThreeArguments() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 /// {@animation 600 400 http://google.com}
 class C {}
 ''');
   }
 
   test_canonicalFor_hasNoArguments() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 /// {@canonicalFor}
+// [diag.docDirectiveMissingOneArgument][column 5][length 16] The 'canonicalFor' directive is missing a 'element' argument.
 class C {}
-''',
-      [error(diag.docDirectiveMissingOneArgument, 4, 16)],
-    );
+''');
   }
 
   test_canonicalFor_hasOneArguments() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 /// {@canonicalFor String}
 class C {}
 ''');
   }
 
   test_macro_hasNoArguments() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 /// {@macro}
+// [diag.docDirectiveMissingOneArgument][column 5][length 9] The 'macro' directive is missing a 'name' argument.
 class C {}
-''',
-      [error(diag.docDirectiveMissingOneArgument, 4, 9)],
-    );
+''');
   }
 
   test_youtube_hasThreeArguments() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 /// {@youtube 600 400 https://www.youtube.com/watch?v=123}
 class C {}
 ''');
   }
 
   test_youtube_missingUrl() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 /// {@youtube 600 400}
+// [diag.docDirectiveMissingOneArgument][column 5][length 19] The 'youtube' directive is missing a 'url' argument.
 class C {}
-''',
-      [error(diag.docDirectiveMissingOneArgument, 4, 19)],
-    );
+''');
   }
 
   test_youtube_missingUrl_andCurlyBrace() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 /// {@youtube 600 400
+// [diag.docDirectiveMissingOneArgument][column 5][length 18] The 'youtube' directive is missing a 'url' argument.
+// [diag.docDirectiveMissingClosingBrace][column 22][length 1] Doc directive is missing a closing curly brace ('}').
 class C {}
-''',
-      [
-        error(diag.docDirectiveMissingOneArgument, 4, 18),
-        error(diag.docDirectiveMissingClosingBrace, 21, 1),
-      ],
-    );
+''');
   }
 }
diff --git a/pkg/analyzer/test/src/diagnostics/doc_directive_missing_three_arguments_test.dart b/pkg/analyzer/test/src/diagnostics/doc_directive_missing_three_arguments_test.dart
index dd601bc..409ce67 100644
--- a/pkg/analyzer/test/src/diagnostics/doc_directive_missing_three_arguments_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/doc_directive_missing_three_arguments_test.dart
@@ -2,7 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/src/diagnostic/diagnostic.dart' as diag;
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../dart/resolution/context_collection_resolution.dart';
@@ -16,46 +15,40 @@
 @reflectiveTest
 class DocDirectiveMissingThreeArgumentsTest extends PubPackageResolutionTest {
   test_animation_hasWidth() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 /// {@animation 600 400 http://google.com}
 class C {}
 ''');
   }
 
   test_animation_missingWidth() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 /// {@animation}
+// [diag.docDirectiveMissingThreeArguments][column 5][length 13] The 'animation' directive is missing a 'width', a 'height', and a 'url' argument.
 class C {}
-''',
-      [error(diag.docDirectiveMissingThreeArguments, 4, 13)],
-    );
+''');
   }
 
   test_youtube_hasWidth() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 /// {@youtube 600 400 https://www.youtube.com/watch?v=123}
 class C {}
 ''');
   }
 
   test_youtube_missingWidth() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 /// {@youtube}
+// [diag.docDirectiveMissingThreeArguments][column 5][length 11] The 'youtube' directive is missing a 'width', a 'height', and a 'url' argument.
 class C {}
-''',
-      [error(diag.docDirectiveMissingThreeArguments, 4, 11)],
-    );
+''');
   }
 
   test_youtube_missingWidth_andCurlyBrace() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 /// {@youtube
+// [diag.docDirectiveMissingThreeArguments][column 5][length 10] The 'youtube' directive is missing a 'width', a 'height', and a 'url' argument.
 class C {}
-''',
-      [error(diag.docDirectiveMissingThreeArguments, 4, 10)],
-    );
+''');
   }
 }
diff --git a/pkg/analyzer/test/src/diagnostics/doc_directive_missing_two_arguments_test.dart b/pkg/analyzer/test/src/diagnostics/doc_directive_missing_two_arguments_test.dart
index a5f6f70..7d85113 100644
--- a/pkg/analyzer/test/src/diagnostics/doc_directive_missing_two_arguments_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/doc_directive_missing_two_arguments_test.dart
@@ -2,7 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/src/diagnostic/diagnostic.dart' as diag;
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../dart/resolution/context_collection_resolution.dart';
@@ -16,56 +15,48 @@
 @reflectiveTest
 class DocDirectiveMissingTwoArgumentsTest extends PubPackageResolutionTest {
   test_animation_hasOptionalIdParameter() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 /// {@animation 600 400 http://google.com id=my-id}
 class C {}
 ''');
   }
 
   test_animation_hasThreeArguments() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 /// {@animation 600 400 http://google.com}
 class C {}
 ''');
   }
 
   test_animation_missingHeight() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 /// {@animation 600}
+// [diag.docDirectiveMissingTwoArguments][column 5][length 17] The 'animation' directive is missing a 'height' and a 'url' argument.
 class C {}
-''',
-      [error(diag.docDirectiveMissingTwoArguments, 4, 17)],
-    );
+''');
   }
 
   test_youtube_hasThreeArguments() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 /// {@youtube 600 400 https://www.youtube.com/watch?v=123}
 class C {}
 ''');
   }
 
   test_youtube_missingHeight() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 /// {@youtube 600}
+// [diag.docDirectiveMissingTwoArguments][column 5][length 15] The 'youtube' directive is missing a 'height' and a 'url' argument.
 class C {}
-''',
-      [error(diag.docDirectiveMissingTwoArguments, 4, 15)],
-    );
+''');
   }
 
   test_youtube_missingHeight_andCurlyBrace() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 /// {@youtube 600
+// [diag.docDirectiveMissingTwoArguments][column 5][length 14] The 'youtube' directive is missing a 'height' and a 'url' argument.
+// [diag.docDirectiveMissingClosingBrace][column 18][length 1] Doc directive is missing a closing curly brace ('}').
 class C {}
-''',
-      [
-        error(diag.docDirectiveMissingTwoArguments, 4, 14),
-        error(diag.docDirectiveMissingClosingBrace, 17, 1),
-      ],
-    );
+''');
   }
 }
diff --git a/pkg/analyzer/test/src/diagnostics/doc_import_cannot_be_deferred_test.dart b/pkg/analyzer/test/src/diagnostics/doc_import_cannot_be_deferred_test.dart
index 8e4be3b..81385fc 100644
--- a/pkg/analyzer/test/src/diagnostics/doc_import_cannot_be_deferred_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/doc_import_cannot_be_deferred_test.dart
@@ -2,7 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/src/diagnostic/diagnostic.dart' as diag;
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../dart/resolution/context_collection_resolution.dart';
@@ -16,20 +15,18 @@
 @reflectiveTest
 class DocImportCannotBeDeferredTest extends PubPackageResolutionTest {
   test_deferred() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 /// @docImport 'dart:math' deferred as math;
+//                         ^^^^^^^^
+// [diag.docImportCannotBeDeferred] Doc imports can't be deferred.
+//                                     ^^^^
+// [diag.docImportCannotHavePrefix] Doc imports can't have prefixes.
 class C {}
-''',
-      [
-        error(diag.docImportCannotBeDeferred, 27, 8),
-        error(diag.docImportCannotHavePrefix, 39, 4),
-      ],
-    );
+''');
   }
 
   test_notDeferred() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 /// @docImport 'dart:math';
 class C {}
 ''');
diff --git a/pkg/analyzer/test/src/diagnostics/doc_import_cannot_have_combinators_test.dart b/pkg/analyzer/test/src/diagnostics/doc_import_cannot_have_combinators_test.dart
index 520658b..ed37453b 100644
--- a/pkg/analyzer/test/src/diagnostics/doc_import_cannot_have_combinators_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/doc_import_cannot_have_combinators_test.dart
@@ -2,7 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/src/diagnostic/diagnostic.dart' as diag;
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../dart/resolution/context_collection_resolution.dart';
@@ -16,17 +15,16 @@
 @reflectiveTest
 class DocImportCannotHaveCombinatorsTest extends PubPackageResolutionTest {
   test_configurations() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 /// @docImport 'dart:math' show max;
+//                         ^^^^^^^^
+// [diag.docImportCannotHaveCombinators] Doc imports can't have show or hide combinators.
 class C {}
-''',
-      [error(diag.docImportCannotHaveCombinators, 27, 8)],
-    );
+''');
   }
 
   test_noConfigurations() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 /// @docImport 'dart:math';
 class C {}
 ''');
diff --git a/pkg/analyzer/test/src/diagnostics/doc_import_cannot_have_configurations_test.dart b/pkg/analyzer/test/src/diagnostics/doc_import_cannot_have_configurations_test.dart
index af9db9c..fad55de 100644
--- a/pkg/analyzer/test/src/diagnostics/doc_import_cannot_have_configurations_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/doc_import_cannot_have_configurations_test.dart
@@ -2,7 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/src/diagnostic/diagnostic.dart' as diag;
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../dart/resolution/context_collection_resolution.dart';
@@ -16,17 +15,16 @@
 @reflectiveTest
 class DocImportCannotHaveConfigurationsTest extends PubPackageResolutionTest {
   test_configurations() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 /// @docImport 'dart:math' if (dart.library.html) 'dart:html';
+//                         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// [diag.docImportCannotHaveConfigurations] Doc imports can't have configurations.
 class C {}
-''',
-      [error(diag.docImportCannotHaveConfigurations, 27, 34)],
-    );
+''');
   }
 
   test_noConfigurations() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 /// @docImport 'dart:math';
 class C {}
 ''');
diff --git a/pkg/analyzer/test/src/diagnostics/doc_import_cannot_have_prefix_test.dart b/pkg/analyzer/test/src/diagnostics/doc_import_cannot_have_prefix_test.dart
index f143e95..791ce42 100644
--- a/pkg/analyzer/test/src/diagnostics/doc_import_cannot_have_prefix_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/doc_import_cannot_have_prefix_test.dart
@@ -2,7 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/src/diagnostic/diagnostic.dart' as diag;
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../dart/resolution/context_collection_resolution.dart';
@@ -16,17 +15,16 @@
 @reflectiveTest
 class DocImportCannotHavePrefixTest extends PubPackageResolutionTest {
   test_configurations() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 /// @docImport 'dart:math' as math;
+//                            ^^^^
+// [diag.docImportCannotHavePrefix] Doc imports can't have prefixes.
 class C {}
-''',
-      [error(diag.docImportCannotHavePrefix, 30, 4)],
-    );
+''');
   }
 
   test_noConfigurations() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 /// @docImport 'dart:math';
 class C {}
 ''');
diff --git a/pkg/analyzer/test/src/diagnostics/duplicate_constructor_default_test.dart b/pkg/analyzer/test/src/diagnostics/duplicate_constructor_default_test.dart
index 7e001cda..0e2af64 100644
--- a/pkg/analyzer/test/src/diagnostics/duplicate_constructor_default_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/duplicate_constructor_default_test.dart
@@ -66,285 +66,260 @@
   }
 
   test_class_primary_unnamed_typeName_new() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class C() {
   C.new() : this();
+//^^^^^
+// [diag.duplicateConstructorDefault] The unnamed constructor is already defined.
 }
-''',
-      [error(diag.duplicateConstructorDefault, 14, 5)],
-    );
+''');
   }
 
   test_class_typeName_new_typeName_new() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class C {
   C.new();
   C.new();
+//^^^^^
+// [diag.duplicateConstructorDefault] The unnamed constructor is already defined.
 }
-''',
-      [error(diag.duplicateConstructorDefault, 23, 5)],
-    );
+''');
   }
 
   test_class_typeName_new_typeName_unnamed() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class C {
   C.new();
   C();
+//^
+// [diag.duplicateConstructorDefault] The unnamed constructor is already defined.
 }
-''',
-      [error(diag.duplicateConstructorDefault, 23, 1)],
-    );
+''');
   }
 
   test_class_typeName_unnamed_factoryHead_unnamed() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class C {
   factory C() => throw 0;
   factory () => throw 0;
+//^^^^^^^
+// [diag.duplicateConstructorDefault] The unnamed constructor is already defined.
 }
-''',
-      [error(diag.duplicateConstructorDefault, 38, 7)],
-    );
+''');
   }
 
   test_class_typeName_unnamed_newHead_unnamed() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class C {
   C();
   new ();
+//^^^
+// [diag.duplicateConstructorDefault] The unnamed constructor is already defined.
 }
-''',
-      [error(diag.duplicateConstructorDefault, 19, 3)],
-    );
+''');
   }
 
   test_class_typeName_unnamed_typeName_new() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class C {
   C();
   C.new();
+//^^^^^
+// [diag.duplicateConstructorDefault] The unnamed constructor is already defined.
 }
-''',
-      [error(diag.duplicateConstructorDefault, 19, 5)],
-    );
+''');
   }
 
   test_class_typeName_unnamed_typeName_unnamed() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class C {
   C();
   C();
+//^
+// [diag.duplicateConstructorDefault] The unnamed constructor is already defined.
 }
-''',
-      [error(diag.duplicateConstructorDefault, 19, 1)],
-    );
+''');
   }
 
   test_class_wrongTypeName_unnamed_typeName_unnamed() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   factory B.new() => throw 0;
+//        ^
+// [diag.invalidFactoryNameNotAClass] The name of a factory constructor must be the same as the name of the immediately enclosing class.
   A();
 }
-''',
-      [error(diag.invalidFactoryNameNotAClass, 20, 1)],
-    );
+''');
   }
 
   test_enum_newHead_unnamed_newHead_unnamed() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 enum E {
   v;
   const new ();
   const new ();
+//      ^^^
+// [diag.duplicateConstructorDefault] The unnamed constructor is already defined.
 }
-''',
-      [error(diag.duplicateConstructorDefault, 38, 3)],
-    );
+''');
   }
 
   test_enum_primary_unnamed_typeName_new() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 enum E() {
   v;
   factory E.new() => v;
+//        ^^^^^
+// [diag.duplicateConstructorDefault] The unnamed constructor is already defined.
 }
-''',
-      [error(diag.duplicateConstructorDefault, 26, 5)],
-    );
+''');
   }
 
   test_enum_typeName_new_typeName_new() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 enum E {
   v;
   const E.new();
   const E.new();
+//      ^^^^^
+// [diag.duplicateConstructorDefault] The unnamed constructor is already defined.
+//        ^^^
+// [diag.unusedElement] The declaration 'E' isn't referenced.
 }
-''',
-      [
-        error(diag.duplicateConstructorDefault, 39, 5),
-        error(diag.unusedElement, 41, 3),
-      ],
-    );
+''');
   }
 
   test_enum_typeName_new_typeName_unnamed() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 enum E {
   v;
   const E.new();
   const E();
+//      ^
+// [diag.duplicateConstructorDefault] The unnamed constructor is already defined.
 }
-''',
-      [error(diag.duplicateConstructorDefault, 39, 1)],
-    );
+''');
   }
 
   test_enum_typeName_unnamed_factoryHead_unnamed() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 enum E {
   v;
   const E();
   factory () => v;
+//^^^^^^^
+// [diag.duplicateConstructorDefault] The unnamed constructor is already defined.
 }
-''',
-      [error(diag.duplicateConstructorDefault, 29, 7)],
-    );
+''');
   }
 
   test_enum_typeName_unnamed_newHead_unnamed() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 enum E {
   v;
   const E();
   const new ();
+//      ^^^
+// [diag.duplicateConstructorDefault] The unnamed constructor is already defined.
 }
-''',
-      [error(diag.duplicateConstructorDefault, 35, 3)],
-    );
+''');
   }
 
   test_enum_typeName_unnamed_typeName_new() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 enum E {
   v;
   const E();
   const E.new();
+//      ^^^^^
+// [diag.duplicateConstructorDefault] The unnamed constructor is already defined.
+//        ^^^
+// [diag.unusedElement] The declaration 'E' isn't referenced.
 }
-''',
-      [
-        error(diag.duplicateConstructorDefault, 35, 5),
-        error(diag.unusedElement, 37, 3),
-      ],
-    );
+''');
   }
 
   test_enum_typeName_unnamed_typeName_unnamed() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 enum E {
   v;
   const E();
   const E();
+//      ^
+// [diag.duplicateConstructorDefault] The unnamed constructor is already defined.
 }
-''',
-      [error(diag.duplicateConstructorDefault, 35, 1)],
-    );
+''');
   }
 
   test_extensionType_primary_new_secondary_typeName_new() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 extension type A.new(int it) {
   A.new(this.it);
+//^^^^^
+// [diag.duplicateConstructorDefault] The unnamed constructor is already defined.
 }
-''',
-      [error(diag.duplicateConstructorDefault, 33, 5)],
-    );
+''');
   }
 
   test_extensionType_primary_new_secondary_typeName_unnamed() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 extension type A.new(int it) {
   A(this.it);
+//^
+// [diag.duplicateConstructorDefault] The unnamed constructor is already defined.
 }
-''',
-      [error(diag.duplicateConstructorDefault, 33, 1)],
-    );
+''');
   }
 
   test_extensionType_primary_unnamed_secondary_newHead_unnamed() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 extension type A(int it) {
   new(this.it);
+//^^^
+// [diag.duplicateConstructorDefault] The unnamed constructor is already defined.
 }
-''',
-      [error(diag.duplicateConstructorDefault, 29, 3)],
-    );
+''');
   }
 
   test_extensionType_primary_unnamed_secondary_typeName_new() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 extension type A(int it) {
   A.new(this.it);
+//^^^^^
+// [diag.duplicateConstructorDefault] The unnamed constructor is already defined.
 }
-''',
-      [error(diag.duplicateConstructorDefault, 29, 5)],
-    );
+''');
   }
 
   test_extensionType_primary_unnamed_secondary_typeName_unnamed() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 extension type A(int it) {
   A(this.it);
+//^
+// [diag.duplicateConstructorDefault] The unnamed constructor is already defined.
 }
-''',
-      [error(diag.duplicateConstructorDefault, 29, 1)],
-    );
+''');
   }
 
   test_extensionType_secondary_factoryHead_unnamed_factoryHead_unnamed() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 extension type A.named(int it) {
   factory (int it) => A.named(it);
   factory (int it) => A.named(it);
+//^^^^^^^
+// [diag.duplicateConstructorDefault] The unnamed constructor is already defined.
 }
-''',
-      [error(diag.duplicateConstructorDefault, 70, 7)],
-    );
+''');
   }
 
   test_extensionType_secondary_newHead_unnamed_newHead_unnamed() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 extension type A.named(int it) {
   new(this.it);
   new(this.it);
+//^^^
+// [diag.duplicateConstructorDefault] The unnamed constructor is already defined.
 }
-''',
-      [error(diag.duplicateConstructorDefault, 51, 3)],
-    );
+''');
   }
 }
diff --git a/pkg/analyzer/test/src/diagnostics/duplicate_constructor_name_test.dart b/pkg/analyzer/test/src/diagnostics/duplicate_constructor_name_test.dart
index 45c2966..a439a8c 100644
--- a/pkg/analyzer/test/src/diagnostics/duplicate_constructor_name_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/duplicate_constructor_name_test.dart
@@ -92,148 +92,135 @@
   }
 
   test_class_newHead_named_newHead_named() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class C {
   new foo();
   new foo();
+//^^^^^^^
+// [diag.duplicateConstructorName] The constructor with name 'foo' is already defined.
 }
-''',
-      [error(diag.duplicateConstructorName, 25, 7)],
-    );
+''');
   }
 
   test_class_primary_named_typeName_named() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class C.foo() {
   C.foo() : this.foo();
+//^^^^^
+// [diag.duplicateConstructorName] The constructor with name 'foo' is already defined.
 }
-''',
-      [error(diag.duplicateConstructorName, 18, 5)],
-    );
+''');
   }
 
   test_class_typeName_named_factoryHead_named() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class C {
   factory C.foo() => throw 0;
   factory foo() => throw 0;
+//^^^^^^^^^^^
+// [diag.duplicateConstructorName] The constructor with name 'foo' is already defined.
 }
-''',
-      [error(diag.duplicateConstructorName, 42, 11)],
-    );
+''');
   }
 
   test_class_typeName_named_newHead_named() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class C {
   C.foo();
   new foo();
+//^^^^^^^
+// [diag.duplicateConstructorName] The constructor with name 'foo' is already defined.
 }
-''',
-      [error(diag.duplicateConstructorName, 23, 7)],
-    );
+''');
   }
 
   test_class_typeName_named_typeName_named() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class C {
   C.foo();
   C.foo();
+//^^^^^
+// [diag.duplicateConstructorName] The constructor with name 'foo' is already defined.
 }
-''',
-      [error(diag.duplicateConstructorName, 23, 5)],
-    );
+''');
   }
 
   test_class_wrongTypeName_named_typeName_named() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   factory B.foo() => throw 0;
+//        ^
+// [diag.invalidFactoryNameNotAClass] The name of a factory constructor must be the same as the name of the immediately enclosing class.
   A.foo();
 }
-''',
-      [error(diag.invalidFactoryNameNotAClass, 20, 1)],
-    );
+''');
   }
 
   test_enum_primary_named_typeName_named() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 enum E.foo() {
   v.foo();
   factory E.foo() => v;
+//        ^^^^^
+// [diag.duplicateConstructorName] The constructor with name 'foo' is already defined.
 }
-''',
-      [error(diag.duplicateConstructorName, 36, 5)],
-    );
+''');
   }
 
   test_enum_typeName_named_typeName_named() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 enum E {
   v.foo();
   const E.foo();
   const E.foo();
+//      ^^^^^
+// [diag.duplicateConstructorName] The constructor with name 'foo' is already defined.
+//        ^^^
+// [diag.unusedElement] The declaration 'E.foo' isn't referenced.
 }
-''',
-      [
-        error(diag.duplicateConstructorName, 45, 5),
-        error(diag.unusedElement, 47, 3),
-      ],
-    );
+''');
   }
 
   test_extensionType_primary_typeName_named_secondary_typeName_named() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 extension type A.foo(int it) {
   A.foo(this.it);
+//^^^^^
+// [diag.duplicateConstructorName] The constructor with name 'foo' is already defined.
 }
-''',
-      [error(diag.duplicateConstructorName, 33, 5)],
-    );
+''');
   }
 
   test_extensionType_secondary_typeName_named_factoryHead_named() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 extension type A(int it) {
   factory A.foo(int it) => A(it);
   factory foo(int it) => A(it);
+//^^^^^^^^^^^
+// [diag.duplicateConstructorName] The constructor with name 'foo' is already defined.
 }
-''',
-      [error(diag.duplicateConstructorName, 63, 11)],
-    );
+''');
   }
 
   test_extensionType_secondary_typeName_named_newHead_named() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 extension type A(int it) {
   A.foo(this.it);
   new foo(this.it);
+//^^^^^^^
+// [diag.duplicateConstructorName] The constructor with name 'foo' is already defined.
 }
-''',
-      [error(diag.duplicateConstructorName, 47, 7)],
-    );
+''');
   }
 
   test_extensionType_secondary_typeName_named_secondary_typeName_named() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 extension type A(int it) {
   A.foo(this.it);
   A.foo(this.it);
+//^^^^^
+// [diag.duplicateConstructorName] The constructor with name 'foo' is already defined.
 }
-''',
-      [error(diag.duplicateConstructorName, 47, 5)],
-    );
+''');
   }
 }
diff --git a/pkg/analyzer/test/src/diagnostics/duplicate_definition_test.dart b/pkg/analyzer/test/src/diagnostics/duplicate_definition_test.dart
index fcba439..cc64cea 100644
--- a/pkg/analyzer/test/src/diagnostics/duplicate_definition_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/duplicate_definition_test.dart
@@ -7,6 +7,7 @@
 
 import '../../generated/test_support.dart';
 import '../dart/resolution/context_collection_resolution.dart';
+import '../dart/resolution/node_text_expectations.dart';
 
 main() {
   defineReflectiveSuite(() {
@@ -17,28 +18,23 @@
     defineReflectiveTests(DuplicateDefinitionExtensionTypeTest);
     defineReflectiveTests(DuplicateDefinitionMixinTest);
     defineReflectiveTests(DuplicateDefinitionUnitTest);
+    defineReflectiveTests(UpdateNodeTextExpectations);
   });
 }
 
 @reflectiveTest
 class DuplicateDefinitionClassTest extends PubPackageResolutionTest {
   test_instance_field_field() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class C {
   int foo = 0;
+//    ^^^
+// [context 1] The first definition of this name.
   int foo = 0;
+//    ^^^
+// [diag.duplicateDefinition][context 1] The name 'foo' is already defined.
 }
-''',
-      [
-        error(
-          diag.duplicateDefinition,
-          31,
-          3,
-          contextMessages: [message(testFile, 16, 3)],
-        ),
-      ],
-    );
+''');
   }
 
   @SkippedTest() // TODO(scheglov): implement augmentation
@@ -67,29 +63,20 @@
   }
 
   test_instance_field_field_field() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class C {
   int foo = 0;
+//    ^^^
+// [context 1] The first definition of this name.
+// [context 2] The first definition of this name.
   int foo = 0;
+//    ^^^
+// [diag.duplicateDefinition][context 1] The name 'foo' is already defined.
   int foo = 0;
+//    ^^^
+// [diag.duplicateDefinition][context 2] The name 'foo' is already defined.
 }
-''',
-      [
-        error(
-          diag.duplicateDefinition,
-          31,
-          3,
-          contextMessages: [message(testFile, 16, 3)],
-        ),
-        error(
-          diag.duplicateDefinition,
-          46,
-          3,
-          contextMessages: [message(testFile, 16, 3)],
-        ),
-      ],
-    );
+''');
   }
 
   @SkippedTest() // TODO(scheglov): implement augmentation
@@ -125,64 +112,46 @@
   }
 
   test_instance_field_getter() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class C {
   int foo = 0;
+//    ^^^
+// [context 1] The first definition of this name.
   int get foo => 0;
+//        ^^^
+// [diag.duplicateDefinition][context 1] The name 'foo' is already defined.
 }
-''',
-      [
-        error(
-          diag.duplicateDefinition,
-          35,
-          3,
-          contextMessages: [message(testFile, 16, 3)],
-        ),
-      ],
-    );
+''');
   }
 
   test_instance_field_method() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class C {
   int foo = 0;
+//    ^^^
+// [context 1] The first definition of this name.
   void foo() {}
+//     ^^^
+// [diag.duplicateDefinition][context 1] The name 'foo' is already defined.
 }
-''',
-      [
-        error(
-          diag.duplicateDefinition,
-          32,
-          3,
-          contextMessages: [message(testFile, 16, 3)],
-        ),
-      ],
-    );
+''');
   }
 
   test_instance_fieldFinal_getter() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class C {
   final int foo = 0;
+//          ^^^
+// [context 1] The first definition of this name.
   int get foo => 0;
+//        ^^^
+// [diag.duplicateDefinition][context 1] The name 'foo' is already defined.
 }
-''',
-      [
-        error(
-          diag.duplicateDefinition,
-          41,
-          3,
-          contextMessages: [message(testFile, 22, 3)],
-        ),
-      ],
-    );
+''');
   }
 
   test_instance_fieldFinal_setter() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class C {
   final int foo = 0;
   set foo(int x) {}
@@ -191,7 +160,7 @@
   }
 
   test_instance_fieldLateFinalInitializer_setter() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class C {
   late final int foo = 1;
   set foo(_) {}
@@ -200,46 +169,34 @@
   }
 
   test_instance_fieldLateFinalNoInitializer_setter() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class C {
   late final int foo;
+//               ^^^
+// [context 1] The first definition of this name.
   set foo(_) {}
+//    ^^^
+// [diag.duplicateDefinition][context 1] The name 'foo' is already defined.
 }
-''',
-      [
-        error(
-          diag.duplicateDefinition,
-          38,
-          3,
-          contextMessages: [message(testFile, 27, 3)],
-        ),
-      ],
-    );
+''');
   }
 
   test_instance_getter_getter() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class C {
   int get foo => 0;
+//        ^^^
+// [context 1] The first definition of this name.
   int get foo => 0;
+//        ^^^
+// [diag.duplicateDefinition][context 1] The name 'foo' is already defined.
 }
-''',
-      [
-        error(
-          diag.duplicateDefinition,
-          40,
-          3,
-          contextMessages: [message(testFile, 20, 3)],
-        ),
-      ],
-    );
+''');
   }
 
   @SkippedTest() // TODO(scheglov): implement augmentation
   test_instance_getter_getter_augment() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class C {
   int get foo => 0;
 }
@@ -252,8 +209,7 @@
 
   @SkippedTest() // TODO(scheglov): implement augmentation
   test_instance_getter_getter_inAugmentation() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class C {
   int get foo => 0;
 }
@@ -261,59 +217,38 @@
 augment class C {
   int get foo => 0;
 }
-''',
-      [
-        error(
-          diag.duplicateDefinition,
-          61,
-          3,
-          contextMessages: [message(testFile, 20, 3)],
-        ),
-      ],
-    );
+''');
   }
 
   test_instance_getter_getter_setter() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   int? get b => null;
+//         ^
+// [context 1] The first definition of this name.
   int? get b => 0;
+//         ^
+// [diag.duplicateDefinition][context 1] The name 'b' is already defined.
   void set b(int? value) {}
 }
-''',
-      [
-        error(
-          diag.duplicateDefinition,
-          43,
-          1,
-          contextMessages: [message(testFile, 21, 1)],
-        ),
-      ],
-    );
+''');
   }
 
   test_instance_getter_method() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class C {
   int get foo => 0;
+//        ^^^
+// [context 1] The first definition of this name.
   void foo() {}
+//     ^^^
+// [diag.duplicateDefinition][context 1] The name 'foo' is already defined.
 }
-''',
-      [
-        error(
-          diag.duplicateDefinition,
-          37,
-          3,
-          contextMessages: [message(testFile, 20, 3)],
-        ),
-      ],
-    );
+''');
   }
 
   test_instance_getter_setter() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class C {
   int get foo => 0;
   set foo(_) {}
@@ -322,86 +257,62 @@
   }
 
   test_instance_getter_setter_getter() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   int? get b => null;
+//         ^
+// [context 1] The first definition of this name.
   void set b(int? value) {}
   int? get b => 0;
+//         ^
+// [diag.duplicateDefinition][context 1] The name 'b' is already defined.
 }
-''',
-      [
-        error(
-          diag.duplicateDefinition,
-          71,
-          1,
-          contextMessages: [message(testFile, 21, 1)],
-        ),
-      ],
-    );
+''');
   }
 
   test_instance_getter_setter_setter() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   int? get b => null;
   void set b(int? value) {}
+//         ^
+// [context 1] The first definition of this name.
   void set b(int? value) {}
+//         ^
+// [diag.duplicateDefinition][context 1] The name 'b' is already defined.
 }
-''',
-      [
-        error(
-          diag.duplicateDefinition,
-          71,
-          1,
-          contextMessages: [message(testFile, 43, 1)],
-        ),
-      ],
-    );
+''');
   }
 
   test_instance_method_getter() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class C {
   void foo() {}
+//     ^^^
+// [context 1] The first definition of this name.
   int get foo => 0;
+//        ^^^
+// [diag.duplicateDefinition][context 1] The name 'foo' is already defined.
 }
-''',
-      [
-        error(
-          diag.duplicateDefinition,
-          36,
-          3,
-          contextMessages: [message(testFile, 17, 3)],
-        ),
-      ],
-    );
+''');
   }
 
   test_instance_method_method() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class C {
   void foo() {}
+//     ^^^
+// [context 1] The first definition of this name.
   void foo() {}
+//     ^^^
+// [diag.duplicateDefinition][context 1] The name 'foo' is already defined.
 }
-''',
-      [
-        error(
-          diag.duplicateDefinition,
-          33,
-          3,
-          contextMessages: [message(testFile, 17, 3)],
-        ),
-      ],
-    );
+''');
   }
 
   @SkippedTest() // TODO(scheglov): implement augmentation
   test_instance_method_method_augment() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   void foo() {}
 }
@@ -414,8 +325,7 @@
 
   @SkippedTest() // TODO(scheglov): implement augmentation
   test_instance_method_method_inAugmentation() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   void foo() {}
 }
@@ -423,41 +333,25 @@
 augment class A {
   void foo() {}
 }
-''',
-      [
-        error(
-          diag.duplicateDefinition,
-          54,
-          3,
-          contextMessages: [message(testFile, 17, 3)],
-        ),
-      ],
-    );
+''');
   }
 
   test_instance_method_setter() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class C {
   void foo() {}
+//     ^^^
+// [context 1] The first definition of this name.
   set foo(_) {}
+//    ^^^
+// [diag.duplicateDefinition][context 1] The name 'foo' is already defined.
 }
-''',
-      [
-        error(
-          diag.duplicateDefinition,
-          32,
-          3,
-          contextMessages: [message(testFile, 17, 3)],
-        ),
-      ],
-    );
+''');
   }
 
   @SkippedTest() // TODO(scheglov): implement augmentation
   test_instance_method_setter_inAugmentation() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   void foo() {}
 }
@@ -465,21 +359,12 @@
 augment class A {
   set foo(_) {}
 }
-''',
-      [
-        error(
-          diag.duplicateDefinition,
-          53,
-          3,
-          contextMessages: [message(testFile, 17, 3)],
-        ),
-      ],
-    );
+''');
   }
 
   @SkippedTest() // TODO(scheglov): implement augmentation
   test_instance_operator_operator_augment() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   int operator +(int _) => 0;
 }
@@ -492,8 +377,7 @@
 
   @SkippedTest() // TODO(scheglov): implement augmentation
   test_instance_operator_operator_inAugmentation() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   int operator +(int _) => 0;
 }
@@ -501,56 +385,35 @@
 augment class A {
   int operator +(int _) => 0;
 }
-''',
-      [
-        error(
-          diag.duplicateDefinition,
-          76,
-          1,
-          contextMessages: [message(testFile, 25, 1)],
-        ),
-      ],
-    );
+''');
   }
 
   test_instance_primaryConstructor_requiredNamed_final_method() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class C({required final int foo}) {
+//                          ^^^
+// [context 1] The first definition of this name.
   void foo() {}
+//     ^^^
+// [diag.duplicateDefinition][context 1] The name 'foo' is already defined.
 }
-''',
-      [
-        error(
-          diag.duplicateDefinition,
-          43,
-          3,
-          contextMessages: [message(testFile, 28, 3)],
-        ),
-      ],
-    );
+''');
   }
 
   test_instance_primaryConstructor_requiredPositional_final_method() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class C(final int foo) {
+//                ^^^
+// [context 1] The first definition of this name.
   void foo() {}
+//     ^^^
+// [diag.duplicateDefinition][context 1] The name 'foo' is already defined.
 }
-''',
-      [
-        error(
-          diag.duplicateDefinition,
-          32,
-          3,
-          contextMessages: [message(testFile, 18, 3)],
-        ),
-      ],
-    );
+''');
   }
 
   test_instance_primaryConstructor_requiredPositional_final_setter() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class C(final int foo) {
   set foo(int x) {}
 }
@@ -558,7 +421,7 @@
   }
 
   test_instance_primaryConstructor_requiredPositional_notDeclaring_setter() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class C(int foo) {
   int get foo => 0;
   set foo(int x) {}
@@ -567,52 +430,39 @@
   }
 
   test_instance_primaryConstructor_requiredPositional_var_setter() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class C(var int foo) {
+//              ^^^
+// [context 1] The first definition of this name.
   set foo(int x) {}
+//    ^^^
+// [diag.duplicateDefinition][context 1] The name 'foo' is already defined.
 }
-''',
-      [
-        error(
-          diag.duplicateDefinition,
-          29,
-          3,
-          contextMessages: [message(testFile, 16, 3)],
-        ),
-      ],
-    );
+''');
   }
 
   test_instance_primaryConstructor_requiredPositional_wildcard() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A(var int _);
-''',
-      [error(diag.unusedFieldFromPrimaryConstructor, 16, 1)],
-    );
+//              ^
+// [diag.unusedFieldFromPrimaryConstructor] The value of the field '_' isn't used.
+''');
   }
 
   test_instance_primaryConstructor_requiredPositional_wildcard_wildcard() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A(var int _, var int _);
-''',
-      [
-        error(diag.unusedFieldFromPrimaryConstructor, 16, 1),
-        error(
-          diag.duplicateDefinition,
-          27,
-          1,
-          contextMessages: [message(testFile, 16, 1)],
-        ),
-        error(diag.unusedFieldFromPrimaryConstructor, 27, 1),
-      ],
-    );
+//              ^
+// [context 1] The first definition of this name.
+// [diag.unusedFieldFromPrimaryConstructor] The value of the field '_' isn't used.
+//                         ^
+// [diag.duplicateDefinition][context 1] The name '_' is already defined.
+// [diag.unusedFieldFromPrimaryConstructor] The value of the field '_' isn't used.
+''');
   }
 
   test_instance_setter_getter() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class C {
   set foo(_) {}
   int get foo => 0;
@@ -621,68 +471,49 @@
   }
 
   test_instance_setter_getter_getter() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   void set b(int? value) {}
   int? get b => null;
+//         ^
+// [context 1] The first definition of this name.
   int? get b => 0;
+//         ^
+// [diag.duplicateDefinition][context 1] The name 'b' is already defined.
 }
-''',
-      [
-        error(
-          diag.duplicateDefinition,
-          71,
-          1,
-          contextMessages: [message(testFile, 49, 1)],
-        ),
-      ],
-    );
+''');
   }
 
   test_instance_setter_getter_setter() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   void set b(int? value) {}
+//         ^
+// [context 1] The first definition of this name.
   int? get b => null;
   void set b(int? value) {}
+//         ^
+// [diag.duplicateDefinition][context 1] The name 'b' is already defined.
 }
-''',
-      [
-        error(
-          diag.duplicateDefinition,
-          71,
-          1,
-          contextMessages: [message(testFile, 21, 1)],
-        ),
-      ],
-    );
+''');
   }
 
   test_instance_setter_method() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class C {
   set foo(_) {}
+//    ^^^
+// [context 1] The first definition of this name.
   void foo() {}
+//     ^^^
+// [diag.duplicateDefinition][context 1] The name 'foo' is already defined.
 }
-''',
-      [
-        error(
-          diag.duplicateDefinition,
-          33,
-          3,
-          contextMessages: [message(testFile, 16, 3)],
-        ),
-      ],
-    );
+''');
   }
 
   @SkippedTest() // TODO(scheglov): implement augmentation
   test_instance_setter_method_inAugmentation() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   set foo(_) {}
 }
@@ -690,40 +521,25 @@
 augment class A {
   void foo() {}
 }
-''',
-      [
-        error(
-          diag.duplicateDefinition,
-          54,
-          3,
-          contextMessages: [message(testFile, 16, 3)],
-        ),
-      ],
-    );
+''');
   }
 
   test_instance_setter_setter() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class C {
   void set foo(_) {}
+//         ^^^
+// [context 1] The first definition of this name.
   void set foo(_) {}
+//         ^^^
+// [diag.duplicateDefinition][context 1] The name 'foo' is already defined.
 }
-''',
-      [
-        error(
-          diag.duplicateDefinition,
-          42,
-          3,
-          contextMessages: [message(testFile, 21, 3)],
-        ),
-      ],
-    );
+''');
   }
 
   @SkippedTest() // TODO(scheglov): implement augmentation
   test_instance_setter_setter_augment() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class C {
   void set foo(_) {}
 }
@@ -735,29 +551,22 @@
   }
 
   test_instance_setter_setter_getter() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   void set b(int? value) {}
+//         ^
+// [context 1] The first definition of this name.
   void set b(int? value) {}
+//         ^
+// [diag.duplicateDefinition][context 1] The name 'b' is already defined.
   int? get b => null;
 }
-''',
-      [
-        error(
-          diag.duplicateDefinition,
-          49,
-          1,
-          contextMessages: [message(testFile, 21, 1)],
-        ),
-      ],
-    );
+''');
   }
 
   @SkippedTest() // TODO(scheglov): implement augmentation
   test_instance_setter_setter_inAugmentation() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class C {
   void set foo(_) {}
 }
@@ -765,96 +574,63 @@
 augment class C {
   void set foo(_) {}
 }
-''',
-      [
-        error(
-          diag.duplicateDefinition,
-          63,
-          3,
-          contextMessages: [message(testFile, 21, 3)],
-        ),
-      ],
-    );
+''');
   }
 
   test_static_field_field() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class C {
   static int foo = 0;
+//           ^^^
+// [context 1] The first definition of this name.
   static int foo = 0;
+//           ^^^
+// [diag.duplicateDefinition][context 1] The name 'foo' is already defined.
 }
-''',
-      [
-        error(
-          diag.duplicateDefinition,
-          45,
-          3,
-          contextMessages: [message(testFile, 23, 3)],
-        ),
-      ],
-    );
+''');
   }
 
   test_static_field_getter() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class C {
   static int foo = 0;
+//           ^^^
+// [context 1] The first definition of this name.
   static int get foo => 0;
+//               ^^^
+// [diag.duplicateDefinition][context 1] The name 'foo' is already defined.
 }
-''',
-      [
-        error(
-          diag.duplicateDefinition,
-          49,
-          3,
-          contextMessages: [message(testFile, 23, 3)],
-        ),
-      ],
-    );
+''');
   }
 
   test_static_field_method() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class C {
   static int foo = 0;
+//           ^^^
+// [context 1] The first definition of this name.
   static void foo() {}
+//            ^^^
+// [diag.duplicateDefinition][context 1] The name 'foo' is already defined.
 }
-''',
-      [
-        error(
-          diag.duplicateDefinition,
-          46,
-          3,
-          contextMessages: [message(testFile, 23, 3)],
-        ),
-      ],
-    );
+''');
   }
 
   test_static_fieldFinal_getter() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class C {
   static final int foo = 0;
+//                 ^^^
+// [context 1] The first definition of this name.
   static int get foo => 0;
+//               ^^^
+// [diag.duplicateDefinition][context 1] The name 'foo' is already defined.
 }
-''',
-      [
-        error(
-          diag.duplicateDefinition,
-          55,
-          3,
-          contextMessages: [message(testFile, 29, 3)],
-        ),
-      ],
-    );
+''');
   }
 
   test_static_fieldFinal_setter() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class C {
   static final int foo = 0;
   static set foo(int x) {}
@@ -863,7 +639,7 @@
   }
 
   test_static_fieldLateFinalInitializer_setter() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class C {
   static late final int foo = 0;
   static set foo(int x) {}
@@ -872,46 +648,34 @@
   }
 
   test_static_fieldLateFinalNoInitializer_setter() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class C {
   static late final int foo;
+//                      ^^^
+// [context 1] The first definition of this name.
   static set foo(int x) {}
+//           ^^^
+// [diag.duplicateDefinition][context 1] The name 'foo' is already defined.
 }
-''',
-      [
-        error(
-          diag.duplicateDefinition,
-          52,
-          3,
-          contextMessages: [message(testFile, 34, 3)],
-        ),
-      ],
-    );
+''');
   }
 
   test_static_getter_getter() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class C {
   static int get foo => 0;
+//               ^^^
+// [context 1] The first definition of this name.
   static int get foo => 0;
+//               ^^^
+// [diag.duplicateDefinition][context 1] The name 'foo' is already defined.
 }
-''',
-      [
-        error(
-          diag.duplicateDefinition,
-          54,
-          3,
-          contextMessages: [message(testFile, 27, 3)],
-        ),
-      ],
-    );
+''');
   }
 
   @SkippedTest() // TODO(scheglov): implement augmentation
   test_static_getter_getter_augment() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   static int get foo => 0;
 }
@@ -924,8 +688,7 @@
 
   @SkippedTest() // TODO(scheglov): implement augmentation
   test_static_getter_getter_inAugmentation() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   static int get foo => 0;
 }
@@ -933,39 +696,24 @@
 augment class A {
   static int get foo => 0;
 }
-''',
-      [
-        error(
-          diag.duplicateDefinition,
-          75,
-          3,
-          contextMessages: [message(testFile, 27, 3)],
-        ),
-      ],
-    );
+''');
   }
 
   test_static_getter_method() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class C {
   static int get foo => 0;
+//               ^^^
+// [context 1] The first definition of this name.
   static void foo() {}
+//            ^^^
+// [diag.duplicateDefinition][context 1] The name 'foo' is already defined.
 }
-''',
-      [
-        error(
-          diag.duplicateDefinition,
-          51,
-          3,
-          contextMessages: [message(testFile, 27, 3)],
-        ),
-      ],
-    );
+''');
   }
 
   test_static_getter_setter() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class C {
   static int get foo => 0;
   static set foo(_) {}
@@ -974,46 +722,34 @@
   }
 
   test_static_method_getter() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class C {
   static void foo() {}
+//            ^^^
+// [context 1] The first definition of this name.
   static int get foo => 0;
+//               ^^^
+// [diag.duplicateDefinition][context 1] The name 'foo' is already defined.
 }
-''',
-      [
-        error(
-          diag.duplicateDefinition,
-          50,
-          3,
-          contextMessages: [message(testFile, 24, 3)],
-        ),
-      ],
-    );
+''');
   }
 
   test_static_method_method() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class C {
   static void foo() {}
+//            ^^^
+// [context 1] The first definition of this name.
   static void foo() {}
+//            ^^^
+// [diag.duplicateDefinition][context 1] The name 'foo' is already defined.
 }
-''',
-      [
-        error(
-          diag.duplicateDefinition,
-          47,
-          3,
-          contextMessages: [message(testFile, 24, 3)],
-        ),
-      ],
-    );
+''');
   }
 
   @SkippedTest() // TODO(scheglov): implement augmentation
   test_static_method_method_augment() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   static void foo() {}
 }
@@ -1026,8 +762,7 @@
 
   @SkippedTest() // TODO(scheglov): implement augmentation
   test_static_method_method_inAugmentation() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   static void foo() {}
 }
@@ -1035,39 +770,24 @@
 augment class A {
   static void foo() {}
 }
-''',
-      [
-        error(
-          diag.duplicateDefinition,
-          68,
-          3,
-          contextMessages: [message(testFile, 24, 3)],
-        ),
-      ],
-    );
+''');
   }
 
   test_static_method_setter() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class C {
   static void foo() {}
+//            ^^^
+// [context 1] The first definition of this name.
   static set foo(_) {}
+//           ^^^
+// [diag.duplicateDefinition][context 1] The name 'foo' is already defined.
 }
-''',
-      [
-        error(
-          diag.duplicateDefinition,
-          46,
-          3,
-          contextMessages: [message(testFile, 24, 3)],
-        ),
-      ],
-    );
+''');
   }
 
   test_static_setter_getter() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class C {
   static set foo(_) {}
   static int get foo => 0;
@@ -1076,46 +796,34 @@
   }
 
   test_static_setter_method() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class C {
   static set foo(_) {}
+//           ^^^
+// [context 1] The first definition of this name.
   static void foo() {}
+//            ^^^
+// [diag.duplicateDefinition][context 1] The name 'foo' is already defined.
 }
-''',
-      [
-        error(
-          diag.duplicateDefinition,
-          47,
-          3,
-          contextMessages: [message(testFile, 23, 3)],
-        ),
-      ],
-    );
+''');
   }
 
   test_static_setter_setter() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class C {
   static void set foo(_) {}
+//                ^^^
+// [context 1] The first definition of this name.
   static void set foo(_) {}
+//                ^^^
+// [diag.duplicateDefinition][context 1] The name 'foo' is already defined.
 }
-''',
-      [
-        error(
-          diag.duplicateDefinition,
-          56,
-          3,
-          contextMessages: [message(testFile, 28, 3)],
-        ),
-      ],
-    );
+''');
   }
 
   @SkippedTest() // TODO(scheglov): implement augmentation
   test_static_setter_setter_augment() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   static void set foo(_) {}
 }
@@ -1128,8 +836,7 @@
 
   @SkippedTest() // TODO(scheglov): implement augmentation
   test_static_setter_setter_inAugmentation() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   static void set foo(_) {}
 }
@@ -1137,121 +844,82 @@
 augment class A {
   static void set foo(_) {}
 }
-''',
-      [
-        error(
-          diag.duplicateDefinition,
-          77,
-          3,
-          contextMessages: [message(testFile, 28, 3)],
-        ),
-      ],
-    );
+''');
   }
 }
 
 @reflectiveTest
 class DuplicateDefinitionEnumTest extends PubPackageResolutionTest {
   test_constant() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 enum E {
   foo, foo
+//^^^
+// [context 1] The first definition of this name.
+//     ^^^
+// [diag.duplicateDefinition][context 1] The name 'foo' is already defined.
 }
-''',
-      [
-        error(
-          diag.duplicateDefinition,
-          16,
-          3,
-          contextMessages: [message(testFile, 11, 3)],
-        ),
-      ],
-    );
+''');
   }
 
   test_instance_field_field() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 enum E {
   v;
   final int foo = 0;
+//          ^^^
+// [context 1] The first definition of this name.
   final int foo = 0;
+//          ^^^
+// [diag.duplicateDefinition][context 1] The name 'foo' is already defined.
 }
-''',
-      [
-        error(
-          diag.duplicateDefinition,
-          47,
-          3,
-          contextMessages: [message(testFile, 26, 3)],
-        ),
-      ],
-    );
+''');
   }
 
   test_instance_field_getter() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 enum E {
   v;
   final int foo = 0;
+//          ^^^
+// [context 1] The first definition of this name.
   int get foo => 0;
+//        ^^^
+// [diag.duplicateDefinition][context 1] The name 'foo' is already defined.
 }
-''',
-      [
-        error(
-          diag.duplicateDefinition,
-          45,
-          3,
-          contextMessages: [message(testFile, 26, 3)],
-        ),
-      ],
-    );
+''');
   }
 
   test_instance_field_method() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 enum E {
   v;
   final int foo = 0;
+//          ^^^
+// [context 1] The first definition of this name.
   void foo() {}
+//     ^^^
+// [diag.duplicateDefinition][context 1] The name 'foo' is already defined.
 }
-''',
-      [
-        error(
-          diag.duplicateDefinition,
-          42,
-          3,
-          contextMessages: [message(testFile, 26, 3)],
-        ),
-      ],
-    );
+''');
   }
 
   test_instance_fieldFinal_getter() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 enum E {
   v;
   final int foo = 0;
+//          ^^^
+// [context 1] The first definition of this name.
   int get foo => 0;
+//        ^^^
+// [diag.duplicateDefinition][context 1] The name 'foo' is already defined.
 }
-''',
-      [
-        error(
-          diag.duplicateDefinition,
-          45,
-          3,
-          contextMessages: [message(testFile, 26, 3)],
-        ),
-      ],
-    );
+''');
   }
 
   test_instance_fieldFinal_setter() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 enum E {
   v;
   final int foo = 0;
@@ -1261,28 +929,22 @@
   }
 
   test_instance_getter_getter() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 enum E {
   v;
   int get foo => 0;
+//        ^^^
+// [context 1] The first definition of this name.
   int get foo => 0;
+//        ^^^
+// [diag.duplicateDefinition][context 1] The name 'foo' is already defined.
 }
-''',
-      [
-        error(
-          diag.duplicateDefinition,
-          44,
-          3,
-          contextMessages: [message(testFile, 24, 3)],
-        ),
-      ],
-    );
+''');
   }
 
   @SkippedTest() // TODO(scheglov): implement augmentation
   test_instance_getter_getter_augment() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 enum E {
   v;
   int get foo => 0;
@@ -1296,8 +958,7 @@
 
   @SkippedTest() // TODO(scheglov): implement augmentation
   test_instance_getter_getter_inAugmentation() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 enum E {
   v;
   int get foo => 0;
@@ -1306,40 +967,25 @@
 augment enum E {;
   int get foo => 0;
 }
-''',
-      [
-        error(
-          diag.duplicateDefinition,
-          65,
-          3,
-          contextMessages: [message(testFile, 24, 3)],
-        ),
-      ],
-    );
+''');
   }
 
   test_instance_getter_method() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 enum E {
   v;
   int get foo => 0;
+//        ^^^
+// [context 1] The first definition of this name.
   void foo() {}
+//     ^^^
+// [diag.duplicateDefinition][context 1] The name 'foo' is already defined.
 }
-''',
-      [
-        error(
-          diag.duplicateDefinition,
-          41,
-          3,
-          contextMessages: [message(testFile, 24, 3)],
-        ),
-      ],
-    );
+''');
   }
 
   test_instance_getter_setter() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 enum E {
   v;
   int get foo => 0;
@@ -1349,48 +995,36 @@
   }
 
   test_instance_method_getter() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 enum E {
   v;
   void foo() {}
+//     ^^^
+// [context 1] The first definition of this name.
   int get foo => 0;
+//        ^^^
+// [diag.duplicateDefinition][context 1] The name 'foo' is already defined.
 }
-''',
-      [
-        error(
-          diag.duplicateDefinition,
-          40,
-          3,
-          contextMessages: [message(testFile, 21, 3)],
-        ),
-      ],
-    );
+''');
   }
 
   test_instance_method_method() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 enum E {
   v;
   void foo() {}
+//     ^^^
+// [context 1] The first definition of this name.
   void foo() {}
+//     ^^^
+// [diag.duplicateDefinition][context 1] The name 'foo' is already defined.
 }
-''',
-      [
-        error(
-          diag.duplicateDefinition,
-          37,
-          3,
-          contextMessages: [message(testFile, 21, 3)],
-        ),
-      ],
-    );
+''');
   }
 
   @SkippedTest() // TODO(scheglov): implement augmentation
   test_instance_method_method_augment() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 enum E {
   v;
   void foo() {}
@@ -1404,8 +1038,7 @@
 
   @SkippedTest() // TODO(scheglov): implement augmentation
   test_instance_method_method_inAugmentation() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 enum E {
   v;
   void foo() {}
@@ -1414,78 +1047,51 @@
 augment enum E {;
   void foo() {}
 }
-''',
-      [
-        error(
-          diag.duplicateDefinition,
-          58,
-          3,
-          contextMessages: [message(testFile, 21, 3)],
-        ),
-      ],
-    );
+''');
   }
 
   test_instance_method_setter() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 enum E {
   v;
   void foo() {}
+//     ^^^
+// [context 1] The first definition of this name.
   set foo(_) {}
+//    ^^^
+// [diag.duplicateDefinition][context 1] The name 'foo' is already defined.
 }
-''',
-      [
-        error(
-          diag.duplicateDefinition,
-          36,
-          3,
-          contextMessages: [message(testFile, 21, 3)],
-        ),
-      ],
-    );
+''');
   }
 
   test_instance_primaryConstructor_requiredNamed_final_method() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 enum E({required final int foo}) {
+//                         ^^^
+// [context 1] The first definition of this name.
   v(foo: 0);
   void foo() {}
+//     ^^^
+// [diag.duplicateDefinition][context 1] The name 'foo' is already defined.
 }
-''',
-      [
-        error(
-          diag.duplicateDefinition,
-          55,
-          3,
-          contextMessages: [message(testFile, 27, 3)],
-        ),
-      ],
-    );
+''');
   }
 
   test_instance_primaryConstructor_requiredPositional_final_method() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 enum E(final int foo) {
+//               ^^^
+// [context 1] The first definition of this name.
   v(0);
   void foo() {}
+//     ^^^
+// [diag.duplicateDefinition][context 1] The name 'foo' is already defined.
 }
-''',
-      [
-        error(
-          diag.duplicateDefinition,
-          39,
-          3,
-          contextMessages: [message(testFile, 17, 3)],
-        ),
-      ],
-    );
+''');
   }
 
   test_instance_primaryConstructor_requiredPositional_final_setter() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 enum E(final int foo) {
   v(0);
   set foo(int x) {}
@@ -1494,7 +1100,7 @@
   }
 
   test_instance_primaryConstructor_requiredPositional_notDeclaring_setter() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 enum E(int foo) {
   v(0);
   int get foo => 0;
@@ -1504,58 +1110,45 @@
   }
 
   test_instance_primaryConstructor_requiredPositional_var_setter() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 enum E(var int foo) {
+//             ^^^
+// [context 1] The first definition of this name.
+// [diag.nonFinalFieldInEnum] Enums can only declare final fields.
   v(0);
   set foo(int x) {}
+//    ^^^
+// [diag.duplicateDefinition][context 1] The name 'foo' is already defined.
 }
-''',
-      [
-        error(diag.nonFinalFieldInEnum, 15, 3),
-        error(
-          diag.duplicateDefinition,
-          36,
-          3,
-          contextMessages: [message(testFile, 15, 3)],
-        ),
-      ],
-    );
+''');
   }
 
   test_instance_primaryConstructor_requiredPositional_wildcard() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 enum E(final int _) {
+//               ^
+// [diag.unusedFieldFromPrimaryConstructor] The value of the field '_' isn't used.
   v(0);
 }
-''',
-      [error(diag.unusedFieldFromPrimaryConstructor, 17, 1)],
-    );
+''');
   }
 
   test_instance_primaryConstructor_requiredPositional_wildcard_wildcard() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 enum E(final int _, final int _) {
+//               ^
+// [context 1] The first definition of this name.
+// [diag.unusedFieldFromPrimaryConstructor] The value of the field '_' isn't used.
+//                            ^
+// [diag.duplicateDefinition][context 1] The name '_' is already defined.
+// [diag.unusedFieldFromPrimaryConstructor] The value of the field '_' isn't used.
   v(0, 0);
 }
-''',
-      [
-        error(diag.unusedFieldFromPrimaryConstructor, 17, 1),
-        error(
-          diag.duplicateDefinition,
-          30,
-          1,
-          contextMessages: [message(testFile, 17, 1)],
-        ),
-        error(diag.unusedFieldFromPrimaryConstructor, 30, 1),
-      ],
-    );
+''');
   }
 
   test_instance_setter_getter() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 enum E {
   v;
   set foo(_) {}
@@ -1565,48 +1158,36 @@
   }
 
   test_instance_setter_method() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 enum E {
   v;
   set foo(_) {}
+//    ^^^
+// [context 1] The first definition of this name.
   void foo() {}
+//     ^^^
+// [diag.duplicateDefinition][context 1] The name 'foo' is already defined.
 }
-''',
-      [
-        error(
-          diag.duplicateDefinition,
-          37,
-          3,
-          contextMessages: [message(testFile, 20, 3)],
-        ),
-      ],
-    );
+''');
   }
 
   test_instance_setter_setter() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 enum E {
   v;
   void set foo(_) {}
+//         ^^^
+// [context 1] The first definition of this name.
   void set foo(_) {}
+//         ^^^
+// [diag.duplicateDefinition][context 1] The name 'foo' is already defined.
 }
-''',
-      [
-        error(
-          diag.duplicateDefinition,
-          46,
-          3,
-          contextMessages: [message(testFile, 25, 3)],
-        ),
-      ],
-    );
+''');
   }
 
   @SkippedTest() // TODO(scheglov): implement augmentation
   test_instance_setter_setter_augment() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 enum E {
   v;
   void set foo(_) {}
@@ -1620,8 +1201,7 @@
 
   @SkippedTest() // TODO(scheglov): implement augmentation
   test_instance_setter_setter_inAugmentation() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 enum E {
   v;
   void set foo(_) {}
@@ -1630,77 +1210,50 @@
 augment enum E {;
   void set foo(_) {}
 }
-''',
-      [
-        error(
-          diag.duplicateDefinition,
-          67,
-          3,
-          contextMessages: [message(testFile, 25, 3)],
-        ),
-      ],
-    );
+''');
   }
 
   test_static_constant_field() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 enum E {
   foo;
+//^^^
+// [context 1] The first definition of this name.
   static int foo = 0;
+//           ^^^
+// [diag.duplicateDefinition][context 1] The name 'foo' is already defined.
 }
-''',
-      [
-        error(
-          diag.duplicateDefinition,
-          29,
-          3,
-          contextMessages: [message(testFile, 11, 3)],
-        ),
-      ],
-    );
+''');
   }
 
   test_static_constant_getter() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 enum E {
   foo;
+//^^^
+// [context 1] The first definition of this name.
   static int get foo => 0;
+//               ^^^
+// [diag.duplicateDefinition][context 1] The name 'foo' is already defined.
 }
-''',
-      [
-        error(
-          diag.duplicateDefinition,
-          33,
-          3,
-          contextMessages: [message(testFile, 11, 3)],
-        ),
-      ],
-    );
+''');
   }
 
   test_static_constant_method() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 enum E {
   foo;
+//^^^
+// [context 1] The first definition of this name.
   static void foo() {}
+//            ^^^
+// [diag.duplicateDefinition][context 1] The name 'foo' is already defined.
 }
-''',
-      [
-        error(
-          diag.duplicateDefinition,
-          30,
-          3,
-          contextMessages: [message(testFile, 11, 3)],
-        ),
-      ],
-    );
+''');
   }
 
   test_static_constant_setter() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 enum E {
   foo;
   static set foo(_) {}
@@ -1709,87 +1262,63 @@
   }
 
   test_static_field_field() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 enum E {
   v;
   static int foo = 0;
+//           ^^^
+// [context 1] The first definition of this name.
   static int foo = 0;
+//           ^^^
+// [diag.duplicateDefinition][context 1] The name 'foo' is already defined.
 }
-''',
-      [
-        error(
-          diag.duplicateDefinition,
-          49,
-          3,
-          contextMessages: [message(testFile, 27, 3)],
-        ),
-      ],
-    );
+''');
   }
 
   test_static_field_getter() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 enum E {
   v;
   static int foo = 0;
+//           ^^^
+// [context 1] The first definition of this name.
   static int get foo => 0;
+//               ^^^
+// [diag.duplicateDefinition][context 1] The name 'foo' is already defined.
 }
-''',
-      [
-        error(
-          diag.duplicateDefinition,
-          53,
-          3,
-          contextMessages: [message(testFile, 27, 3)],
-        ),
-      ],
-    );
+''');
   }
 
   test_static_field_method() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 enum E {
   v;
   static int foo = 0;
+//           ^^^
+// [context 1] The first definition of this name.
   static void foo() {}
+//            ^^^
+// [diag.duplicateDefinition][context 1] The name 'foo' is already defined.
 }
-''',
-      [
-        error(
-          diag.duplicateDefinition,
-          50,
-          3,
-          contextMessages: [message(testFile, 27, 3)],
-        ),
-      ],
-    );
+''');
   }
 
   test_static_fieldFinal_getter() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 enum E {
   v;
   static final int foo = 0;
+//                 ^^^
+// [context 1] The first definition of this name.
   static int get foo => 0;
+//               ^^^
+// [diag.duplicateDefinition][context 1] The name 'foo' is already defined.
 }
-''',
-      [
-        error(
-          diag.duplicateDefinition,
-          59,
-          3,
-          contextMessages: [message(testFile, 33, 3)],
-        ),
-      ],
-    );
+''');
   }
 
   test_static_fieldFinal_setter() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 enum E {
   v;
   static final int foo = 0;
@@ -1799,28 +1328,22 @@
   }
 
   test_static_getter_getter() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 enum E {
   v;
   static int get foo => 0;
+//               ^^^
+// [context 1] The first definition of this name.
   static int get foo => 0;
+//               ^^^
+// [diag.duplicateDefinition][context 1] The name 'foo' is already defined.
 }
-''',
-      [
-        error(
-          diag.duplicateDefinition,
-          58,
-          3,
-          contextMessages: [message(testFile, 31, 3)],
-        ),
-      ],
-    );
+''');
   }
 
   @SkippedTest() // TODO(scheglov): implement augmentation
   test_static_getter_getter_augment() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 enum E {
   v;
   static int get foo => 0;
@@ -1834,8 +1357,7 @@
 
   @SkippedTest() // TODO(scheglov): implement augmentation
   test_static_getter_getter_inAugmentation() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 enum E {
   v;
   static int get foo => 0;
@@ -1844,40 +1366,25 @@
 augment enum E {;
   static int get foo => 0;
 }
-''',
-      [
-        error(
-          diag.duplicateDefinition,
-          79,
-          3,
-          contextMessages: [message(testFile, 31, 3)],
-        ),
-      ],
-    );
+''');
   }
 
   test_static_getter_method() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 enum E {
   v;
   static int get foo => 0;
+//               ^^^
+// [context 1] The first definition of this name.
   static void foo() {}
+//            ^^^
+// [diag.duplicateDefinition][context 1] The name 'foo' is already defined.
 }
-''',
-      [
-        error(
-          diag.duplicateDefinition,
-          55,
-          3,
-          contextMessages: [message(testFile, 31, 3)],
-        ),
-      ],
-    );
+''');
   }
 
   test_static_getter_setter() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 enum E {
   v;
   static int get foo => 0;
@@ -1887,48 +1394,36 @@
   }
 
   test_static_method_getter() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 enum E {
   v;
   static void foo() {}
+//            ^^^
+// [context 1] The first definition of this name.
   static int get foo => 0;
+//               ^^^
+// [diag.duplicateDefinition][context 1] The name 'foo' is already defined.
 }
-''',
-      [
-        error(
-          diag.duplicateDefinition,
-          54,
-          3,
-          contextMessages: [message(testFile, 28, 3)],
-        ),
-      ],
-    );
+''');
   }
 
   test_static_method_method() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 enum E {
   v;
   static void foo() {}
+//            ^^^
+// [context 1] The first definition of this name.
   static void foo() {}
+//            ^^^
+// [diag.duplicateDefinition][context 1] The name 'foo' is already defined.
 }
-''',
-      [
-        error(
-          diag.duplicateDefinition,
-          51,
-          3,
-          contextMessages: [message(testFile, 28, 3)],
-        ),
-      ],
-    );
+''');
   }
 
   @SkippedTest() // TODO(scheglov): implement augmentation
   test_static_method_method_augment() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 enum E {
   v;
   static void foo() {}
@@ -1942,8 +1437,7 @@
 
   @SkippedTest() // TODO(scheglov): implement augmentation
   test_static_method_method_inAugmentation() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 enum E {
   v;
   static void foo() {}
@@ -1952,40 +1446,25 @@
 augment enum E {;
   static void foo() {}
 }
-''',
-      [
-        error(
-          diag.duplicateDefinition,
-          72,
-          3,
-          contextMessages: [message(testFile, 28, 3)],
-        ),
-      ],
-    );
+''');
   }
 
   test_static_method_setter() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 enum E {
   v;
   static void foo() {}
+//            ^^^
+// [context 1] The first definition of this name.
   static set foo(_) {}
+//           ^^^
+// [diag.duplicateDefinition][context 1] The name 'foo' is already defined.
 }
-''',
-      [
-        error(
-          diag.duplicateDefinition,
-          50,
-          3,
-          contextMessages: [message(testFile, 28, 3)],
-        ),
-      ],
-    );
+''');
   }
 
   test_static_setter_getter() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 enum E {
   v;
   static set foo(_) {}
@@ -1995,48 +1474,36 @@
   }
 
   test_static_setter_method() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 enum E {
   v;
   static set foo(_) {}
+//           ^^^
+// [context 1] The first definition of this name.
   static void foo() {}
+//            ^^^
+// [diag.duplicateDefinition][context 1] The name 'foo' is already defined.
 }
-''',
-      [
-        error(
-          diag.duplicateDefinition,
-          51,
-          3,
-          contextMessages: [message(testFile, 27, 3)],
-        ),
-      ],
-    );
+''');
   }
 
   test_static_setter_setter() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 enum E {
   v;
   static void set foo(_) {}
+//                ^^^
+// [context 1] The first definition of this name.
   static void set foo(_) {}
+//                ^^^
+// [diag.duplicateDefinition][context 1] The name 'foo' is already defined.
 }
-''',
-      [
-        error(
-          diag.duplicateDefinition,
-          60,
-          3,
-          contextMessages: [message(testFile, 32, 3)],
-        ),
-      ],
-    );
+''');
   }
 
   @SkippedTest() // TODO(scheglov): implement augmentation
   test_static_setter_setter_augment() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 enum E {
   v;
   static void set foo(_) {}
@@ -2050,8 +1517,7 @@
 
   @SkippedTest() // TODO(scheglov): implement augmentation
   test_static_setter_setter_inAugmentation() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 enum E {
   v;
   static void set foo(_) {}
@@ -2060,23 +1526,14 @@
 augment enum E {;
   static void set foo(_) {}
 }
-''',
-      [
-        error(
-          diag.duplicateDefinition,
-          81,
-          3,
-          contextMessages: [message(testFile, 32, 3)],
-        ),
-      ],
-    );
+''');
   }
 }
 
 @reflectiveTest
 class DuplicateDefinitionExtensionTest extends PubPackageResolutionTest {
   test_extendedType_instance() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics('''
 class A {
   int get foo => 0;
   set foo(_) {}
@@ -2092,7 +1549,7 @@
   }
 
   test_extendedType_static() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics('''
 class A {
   static int get foo => 0;
   static set foo(_) {}
@@ -2108,28 +1565,22 @@
   }
 
   test_instance_getter_getter() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {}
 extension E on A {
   int get foo => 0;
+//        ^^^
+// [context 1] The first definition of this name.
   int get foo => 0;
+//        ^^^
+// [diag.duplicateDefinition][context 1] The name 'foo' is already defined.
 }
-''',
-      [
-        error(
-          diag.duplicateDefinition,
-          60,
-          3,
-          contextMessages: [message(testFile, 40, 3)],
-        ),
-      ],
-    );
+''');
   }
 
   @SkippedTest() // TODO(scheglov): implement augmentation
   test_instance_getter_getter_augment() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 extension E on int {
   int get foo => 0;
 }
@@ -2142,8 +1593,7 @@
 
   @SkippedTest() // TODO(scheglov): implement augmentation
   test_instance_getter_getter_inAugmentation() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 extension E on int {
   int get foo => 0;
 }
@@ -2151,40 +1601,25 @@
 augment extension E {
   int get foo => 0;
 }
-''',
-      [
-        error(
-          diag.duplicateDefinition,
-          76,
-          3,
-          contextMessages: [message(testFile, 31, 3)],
-        ),
-      ],
-    );
+''');
   }
 
   test_instance_getter_method() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {}
 extension E on A {
   int get foo => 0;
+//        ^^^
+// [context 1] The first definition of this name.
   void foo() {}
+//     ^^^
+// [diag.duplicateDefinition][context 1] The name 'foo' is already defined.
 }
-''',
-      [
-        error(
-          diag.duplicateDefinition,
-          57,
-          3,
-          contextMessages: [message(testFile, 40, 3)],
-        ),
-      ],
-    );
+''');
   }
 
   test_instance_getter_setter() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {}
 extension E on A {
   int get foo => 0;
@@ -2194,48 +1629,36 @@
   }
 
   test_instance_method_getter() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {}
 extension E on A {
   void foo() {}
+//     ^^^
+// [context 1] The first definition of this name.
   int get foo => 0;
+//        ^^^
+// [diag.duplicateDefinition][context 1] The name 'foo' is already defined.
 }
-''',
-      [
-        error(
-          diag.duplicateDefinition,
-          56,
-          3,
-          contextMessages: [message(testFile, 37, 3)],
-        ),
-      ],
-    );
+''');
   }
 
   test_instance_method_method() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {}
 extension E on A {
   void foo() {}
+//     ^^^
+// [context 1] The first definition of this name.
   void foo() {}
+//     ^^^
+// [diag.duplicateDefinition][context 1] The name 'foo' is already defined.
 }
-''',
-      [
-        error(
-          diag.duplicateDefinition,
-          53,
-          3,
-          contextMessages: [message(testFile, 37, 3)],
-        ),
-      ],
-    );
+''');
   }
 
   @SkippedTest() // TODO(scheglov): implement augmentation
   test_instance_method_method_augment() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 extension E on int {
   void foo() {}
 }
@@ -2248,8 +1671,7 @@
 
   @SkippedTest() // TODO(scheglov): implement augmentation
   test_instance_method_method_inAugmentation() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 extension E on int {
   void foo() {}
 }
@@ -2257,40 +1679,25 @@
 augment extension E {
   void foo() {}
 }
-''',
-      [
-        error(
-          diag.duplicateDefinition,
-          69,
-          3,
-          contextMessages: [message(testFile, 28, 3)],
-        ),
-      ],
-    );
+''');
   }
 
   test_instance_method_setter() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {}
 extension E on A {
   void foo() {}
+//     ^^^
+// [context 1] The first definition of this name.
   set foo(_) {}
+//    ^^^
+// [diag.duplicateDefinition][context 1] The name 'foo' is already defined.
 }
-''',
-      [
-        error(
-          diag.duplicateDefinition,
-          52,
-          3,
-          contextMessages: [message(testFile, 37, 3)],
-        ),
-      ],
-    );
+''');
   }
 
   test_instance_setter_getter() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {}
 extension E on A {
   set foo(_) {}
@@ -2300,48 +1707,36 @@
   }
 
   test_instance_setter_method() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {}
 extension E on A {
   set foo(_) {}
+//    ^^^
+// [context 1] The first definition of this name.
   void foo() {}
+//     ^^^
+// [diag.duplicateDefinition][context 1] The name 'foo' is already defined.
 }
-''',
-      [
-        error(
-          diag.duplicateDefinition,
-          53,
-          3,
-          contextMessages: [message(testFile, 36, 3)],
-        ),
-      ],
-    );
+''');
   }
 
   test_instance_setter_setter() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {}
 extension E on A {
   void set foo(_) {}
+//         ^^^
+// [context 1] The first definition of this name.
   void set foo(_) {}
+//         ^^^
+// [diag.duplicateDefinition][context 1] The name 'foo' is already defined.
 }
-''',
-      [
-        error(
-          diag.duplicateDefinition,
-          62,
-          3,
-          contextMessages: [message(testFile, 41, 3)],
-        ),
-      ],
-    );
+''');
   }
 
   @SkippedTest() // TODO(scheglov): implement augmentation
   test_instance_setter_setter_augment() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 extension E on int {
   void set foo(_) {}
 }
@@ -2354,8 +1749,7 @@
 
   @SkippedTest() // TODO(scheglov): implement augmentation
   test_instance_setter_setter_inAugmentation() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 extension E on int {
   void set foo(_) {}
 }
@@ -2363,100 +1757,67 @@
 augment extension E {
   void set foo(_) {}
 }
-''',
-      [
-        error(
-          diag.duplicateDefinition,
-          78,
-          3,
-          contextMessages: [message(testFile, 32, 3)],
-        ),
-      ],
-    );
+''');
   }
 
   test_static_field_field() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {}
 extension E on A {
   static int foo = 0;
+//           ^^^
+// [context 1] The first definition of this name.
   static int foo = 0;
+//           ^^^
+// [diag.duplicateDefinition][context 1] The name 'foo' is already defined.
 }
-''',
-      [
-        error(
-          diag.duplicateDefinition,
-          65,
-          3,
-          contextMessages: [message(testFile, 43, 3)],
-        ),
-      ],
-    );
+''');
   }
 
   test_static_field_getter() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {}
 extension E on A {
   static int foo = 0;
+//           ^^^
+// [context 1] The first definition of this name.
   static int get foo => 0;
+//               ^^^
+// [diag.duplicateDefinition][context 1] The name 'foo' is already defined.
 }
-''',
-      [
-        error(
-          diag.duplicateDefinition,
-          69,
-          3,
-          contextMessages: [message(testFile, 43, 3)],
-        ),
-      ],
-    );
+''');
   }
 
   test_static_field_method() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {}
 extension E on A {
   static int foo = 0;
+//           ^^^
+// [context 1] The first definition of this name.
   static void foo() {}
+//            ^^^
+// [diag.duplicateDefinition][context 1] The name 'foo' is already defined.
 }
-''',
-      [
-        error(
-          diag.duplicateDefinition,
-          66,
-          3,
-          contextMessages: [message(testFile, 43, 3)],
-        ),
-      ],
-    );
+''');
   }
 
   test_static_fieldFinal_getter() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {}
 extension E on A {
   static final int foo = 0;
+//                 ^^^
+// [context 1] The first definition of this name.
   static int get foo => 0;
+//               ^^^
+// [diag.duplicateDefinition][context 1] The name 'foo' is already defined.
 }
-''',
-      [
-        error(
-          diag.duplicateDefinition,
-          75,
-          3,
-          contextMessages: [message(testFile, 49, 3)],
-        ),
-      ],
-    );
+''');
   }
 
   test_static_fieldFinal_setter() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {}
 extension E on A {
   static final int foo = 0;
@@ -2466,28 +1827,22 @@
   }
 
   test_static_getter_getter() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {}
 extension E on A {
   static int get foo => 0;
+//               ^^^
+// [context 1] The first definition of this name.
   static int get foo => 0;
+//               ^^^
+// [diag.duplicateDefinition][context 1] The name 'foo' is already defined.
 }
-''',
-      [
-        error(
-          diag.duplicateDefinition,
-          74,
-          3,
-          contextMessages: [message(testFile, 47, 3)],
-        ),
-      ],
-    );
+''');
   }
 
   @SkippedTest() // TODO(scheglov): implement augmentation
   test_static_getter_getter_augment() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 extension E on int {
   static int get foo => 0;
 }
@@ -2500,8 +1855,7 @@
 
   @SkippedTest() // TODO(scheglov): implement augmentation
   test_static_getter_getter_inAugmentation() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 extension E on int {
   static int get foo => 0;
 }
@@ -2509,40 +1863,25 @@
 augment extension E {
   static int get foo => 0;
 }
-''',
-      [
-        error(
-          diag.duplicateDefinition,
-          90,
-          3,
-          contextMessages: [message(testFile, 38, 3)],
-        ),
-      ],
-    );
+''');
   }
 
   test_static_getter_method() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {}
 extension E on A {
   static int get foo => 0;
+//               ^^^
+// [context 1] The first definition of this name.
   static void foo() {}
+//            ^^^
+// [diag.duplicateDefinition][context 1] The name 'foo' is already defined.
 }
-''',
-      [
-        error(
-          diag.duplicateDefinition,
-          71,
-          3,
-          contextMessages: [message(testFile, 47, 3)],
-        ),
-      ],
-    );
+''');
   }
 
   test_static_getter_setter() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {}
 extension E on A {
   static int get foo => 0;
@@ -2552,48 +1891,36 @@
   }
 
   test_static_method_getter() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {}
 extension E on A {
   static void foo() {}
+//            ^^^
+// [context 1] The first definition of this name.
   static int get foo => 0;
+//               ^^^
+// [diag.duplicateDefinition][context 1] The name 'foo' is already defined.
 }
-''',
-      [
-        error(
-          diag.duplicateDefinition,
-          70,
-          3,
-          contextMessages: [message(testFile, 44, 3)],
-        ),
-      ],
-    );
+''');
   }
 
   test_static_method_method() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {}
 extension E on A {
   static void foo() {}
+//            ^^^
+// [context 1] The first definition of this name.
   static void foo() {}
+//            ^^^
+// [diag.duplicateDefinition][context 1] The name 'foo' is already defined.
 }
-''',
-      [
-        error(
-          diag.duplicateDefinition,
-          67,
-          3,
-          contextMessages: [message(testFile, 44, 3)],
-        ),
-      ],
-    );
+''');
   }
 
   @SkippedTest() // TODO(scheglov): implement augmentation
   test_static_method_method_augment() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 extension E on int {
   static void foo() {}
 }
@@ -2606,8 +1933,7 @@
 
   @SkippedTest() // TODO(scheglov): implement augmentation
   test_static_method_method_inAugmentation() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 extension E on int {
   static void foo() {}
 }
@@ -2615,40 +1941,25 @@
 augment extension E {
   static void foo() {}
 }
-''',
-      [
-        error(
-          diag.duplicateDefinition,
-          83,
-          3,
-          contextMessages: [message(testFile, 35, 3)],
-        ),
-      ],
-    );
+''');
   }
 
   test_static_method_setter() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {}
 extension E on A {
   static void foo() {}
+//            ^^^
+// [context 1] The first definition of this name.
   static set foo(_) {}
+//           ^^^
+// [diag.duplicateDefinition][context 1] The name 'foo' is already defined.
 }
-''',
-      [
-        error(
-          diag.duplicateDefinition,
-          66,
-          3,
-          contextMessages: [message(testFile, 44, 3)],
-        ),
-      ],
-    );
+''');
   }
 
   test_static_setter_getter() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 mixin M {
   static set foo(_) {}
   static int get foo => 0;
@@ -2657,48 +1968,36 @@
   }
 
   test_static_setter_method() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {}
 extension E on A {
   static set foo(_) {}
+//           ^^^
+// [context 1] The first definition of this name.
   static void foo() {}
+//            ^^^
+// [diag.duplicateDefinition][context 1] The name 'foo' is already defined.
 }
-''',
-      [
-        error(
-          diag.duplicateDefinition,
-          67,
-          3,
-          contextMessages: [message(testFile, 43, 3)],
-        ),
-      ],
-    );
+''');
   }
 
   test_static_setter_setter() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {}
 extension E on A {
   static void set foo(_) {}
+//                ^^^
+// [context 1] The first definition of this name.
   static void set foo(_) {}
+//                ^^^
+// [diag.duplicateDefinition][context 1] The name 'foo' is already defined.
 }
-''',
-      [
-        error(
-          diag.duplicateDefinition,
-          76,
-          3,
-          contextMessages: [message(testFile, 48, 3)],
-        ),
-      ],
-    );
+''');
   }
 
   @SkippedTest() // TODO(scheglov): implement augmentation
   test_static_setter_setter_augment() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 extension E on int {
   static void set foo(_) {}
 }
@@ -2711,8 +2010,7 @@
 
   @SkippedTest() // TODO(scheglov): implement augmentation
   test_static_setter_setter_inAugmentation() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 extension E on int {
   static void set foo(_) {}
 }
@@ -2720,79 +2018,52 @@
 augment extension E {
   static void set foo(_) {}
 }
-''',
-      [
-        error(
-          diag.duplicateDefinition,
-          92,
-          3,
-          contextMessages: [message(testFile, 39, 3)],
-        ),
-      ],
-    );
+''');
   }
 
   test_unitMembers_extension() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics('''
 class A {}
 extension E on A {}
+//        ^
+// [context 1] The first definition of this name.
 extension E on A {}
-''',
-      [
-        error(
-          diag.duplicateDefinition,
-          41,
-          1,
-          contextMessages: [message(testFile, 21, 1)],
-        ),
-      ],
-    );
+//        ^
+// [diag.duplicateDefinition][context 1] The name 'E' is already defined.
+''');
   }
 }
 
 @reflectiveTest
 class DuplicateDefinitionExtensionTypeTest extends PubPackageResolutionTest {
   test_instance_getter_getter() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 extension type E(int it) {
   int get foo => 0;
+//        ^^^
+// [context 1] The first definition of this name.
   int get foo => 0;
+//        ^^^
+// [diag.duplicateDefinition][context 1] The name 'foo' is already defined.
 }
-''',
-      [
-        error(
-          diag.duplicateDefinition,
-          57,
-          3,
-          contextMessages: [message(testFile, 37, 3)],
-        ),
-      ],
-    );
+''');
   }
 
   test_instance_getter_method() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 extension type E(int it) {
   int get foo => 0;
+//        ^^^
+// [context 1] The first definition of this name.
   void foo() {}
+//     ^^^
+// [diag.duplicateDefinition][context 1] The name 'foo' is already defined.
 }
-''',
-      [
-        error(
-          diag.duplicateDefinition,
-          54,
-          3,
-          contextMessages: [message(testFile, 37, 3)],
-        ),
-      ],
-    );
+''');
   }
 
   test_instance_getter_setter() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 extension type E(int it) {
   int get foo => 0;
   set foo(_) {}
@@ -2801,100 +2072,70 @@
   }
 
   test_instance_method_getter() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 extension type E(int it) {
   void foo() {}
+//     ^^^
+// [context 1] The first definition of this name.
   int get foo => 0;
+//        ^^^
+// [diag.duplicateDefinition][context 1] The name 'foo' is already defined.
 }
-''',
-      [
-        error(
-          diag.duplicateDefinition,
-          53,
-          3,
-          contextMessages: [message(testFile, 34, 3)],
-        ),
-      ],
-    );
+''');
   }
 
   test_instance_method_method() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 extension type E(int it) {
   void foo() {}
+//     ^^^
+// [context 1] The first definition of this name.
   void foo() {}
+//     ^^^
+// [diag.duplicateDefinition][context 1] The name 'foo' is already defined.
 }
-''',
-      [
-        error(
-          diag.duplicateDefinition,
-          50,
-          3,
-          contextMessages: [message(testFile, 34, 3)],
-        ),
-      ],
-    );
+''');
   }
 
   test_instance_method_setter() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 extension type E(int it) {
   void foo() {}
+//     ^^^
+// [context 1] The first definition of this name.
   set foo(_) {}
+//    ^^^
+// [diag.duplicateDefinition][context 1] The name 'foo' is already defined.
 }
-''',
-      [
-        error(
-          diag.duplicateDefinition,
-          49,
-          3,
-          contextMessages: [message(testFile, 34, 3)],
-        ),
-      ],
-    );
+''');
   }
 
   test_instance_representation_getter() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 extension type E(int it) {
+//                   ^^
+// [context 1] The first definition of this name.
   int get it => 0;
+//        ^^
+// [diag.duplicateDefinition][context 1] The name 'it' is already defined.
 }
-''',
-      [
-        error(
-          diag.duplicateDefinition,
-          37,
-          2,
-          contextMessages: [message(testFile, 21, 2)],
-        ),
-      ],
-    );
+''');
   }
 
   test_instance_representation_method() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 extension type E(int it) {
+//                   ^^
+// [context 1] The first definition of this name.
   void it() {}
+//     ^^
+// [diag.duplicateDefinition][context 1] The name 'it' is already defined.
 }
-''',
-      [
-        error(
-          diag.duplicateDefinition,
-          34,
-          2,
-          contextMessages: [message(testFile, 21, 2)],
-        ),
-      ],
-    );
+''');
   }
 
   test_instance_representation_setter() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 extension type E(int it) {
   set it(int _) {}
 }
@@ -2902,7 +2143,7 @@
   }
 
   test_instance_setter_getter() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 extension type E(int it) {
   set foo(_) {}
   int get foo => 0;
@@ -2911,121 +2152,85 @@
   }
 
   test_instance_setter_method() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 extension type E(int it) {
   set foo(_) {}
+//    ^^^
+// [context 1] The first definition of this name.
   void foo() {}
+//     ^^^
+// [diag.duplicateDefinition][context 1] The name 'foo' is already defined.
 }
-''',
-      [
-        error(
-          diag.duplicateDefinition,
-          50,
-          3,
-          contextMessages: [message(testFile, 33, 3)],
-        ),
-      ],
-    );
+''');
   }
 
   test_instance_setter_setter() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 extension type E(int it) {
   void set foo(_) {}
+//         ^^^
+// [context 1] The first definition of this name.
   void set foo(_) {}
+//         ^^^
+// [diag.duplicateDefinition][context 1] The name 'foo' is already defined.
 }
-''',
-      [
-        error(
-          diag.duplicateDefinition,
-          59,
-          3,
-          contextMessages: [message(testFile, 38, 3)],
-        ),
-      ],
-    );
+''');
   }
 
   test_static_field_field() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 extension type E(int it) {
   static int foo = 0;
+//           ^^^
+// [context 1] The first definition of this name.
   static int foo = 0;
+//           ^^^
+// [diag.duplicateDefinition][context 1] The name 'foo' is already defined.
 }
-''',
-      [
-        error(
-          diag.duplicateDefinition,
-          62,
-          3,
-          contextMessages: [message(testFile, 40, 3)],
-        ),
-      ],
-    );
+''');
   }
 
   test_static_field_getter() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 extension type E(int it) {
   static int foo = 0;
+//           ^^^
+// [context 1] The first definition of this name.
   static int get foo => 0;
+//               ^^^
+// [diag.duplicateDefinition][context 1] The name 'foo' is already defined.
 }
-''',
-      [
-        error(
-          diag.duplicateDefinition,
-          66,
-          3,
-          contextMessages: [message(testFile, 40, 3)],
-        ),
-      ],
-    );
+''');
   }
 
   test_static_field_method() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 extension type E(int it) {
   static int foo = 0;
+//           ^^^
+// [context 1] The first definition of this name.
   static void foo() {}
+//            ^^^
+// [diag.duplicateDefinition][context 1] The name 'foo' is already defined.
 }
-''',
-      [
-        error(
-          diag.duplicateDefinition,
-          63,
-          3,
-          contextMessages: [message(testFile, 40, 3)],
-        ),
-      ],
-    );
+''');
   }
 
   test_static_fieldFinal_getter() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 extension type E(int it) {
   static final int foo = 0;
+//                 ^^^
+// [context 1] The first definition of this name.
   static int get foo => 0;
+//               ^^^
+// [diag.duplicateDefinition][context 1] The name 'foo' is already defined.
 }
-''',
-      [
-        error(
-          diag.duplicateDefinition,
-          72,
-          3,
-          contextMessages: [message(testFile, 46, 3)],
-        ),
-      ],
-    );
+''');
   }
 
   test_static_fieldFinal_setter() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 extension type E(int it) {
   static final int foo = 0;
   static set foo(int x) {}
@@ -3034,45 +2239,33 @@
   }
 
   test_static_getter_getter() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 extension type E(int it) {
   static int get foo => 0;
+//               ^^^
+// [context 1] The first definition of this name.
   static int get foo => 0;
+//               ^^^
+// [diag.duplicateDefinition][context 1] The name 'foo' is already defined.
 }
-''',
-      [
-        error(
-          diag.duplicateDefinition,
-          71,
-          3,
-          contextMessages: [message(testFile, 44, 3)],
-        ),
-      ],
-    );
+''');
   }
 
   test_static_getter_method() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 extension type E(int it) {
   static int get foo => 0;
+//               ^^^
+// [context 1] The first definition of this name.
   static void foo() {}
+//            ^^^
+// [diag.duplicateDefinition][context 1] The name 'foo' is already defined.
 }
-''',
-      [
-        error(
-          diag.duplicateDefinition,
-          68,
-          3,
-          contextMessages: [message(testFile, 44, 3)],
-        ),
-      ],
-    );
+''');
   }
 
   test_static_getter_setter() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 extension type E(int it) {
   static int get foo => 0;
   static set foo(_) {}
@@ -3081,64 +2274,46 @@
   }
 
   test_static_method_getter() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 extension type E(int it) {
   static void foo() {}
+//            ^^^
+// [context 1] The first definition of this name.
   static int get foo => 0;
+//               ^^^
+// [diag.duplicateDefinition][context 1] The name 'foo' is already defined.
 }
-''',
-      [
-        error(
-          diag.duplicateDefinition,
-          67,
-          3,
-          contextMessages: [message(testFile, 41, 3)],
-        ),
-      ],
-    );
+''');
   }
 
   test_static_method_method() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 extension type E(int it) {
   static void foo() {}
+//            ^^^
+// [context 1] The first definition of this name.
   static void foo() {}
+//            ^^^
+// [diag.duplicateDefinition][context 1] The name 'foo' is already defined.
 }
-''',
-      [
-        error(
-          diag.duplicateDefinition,
-          64,
-          3,
-          contextMessages: [message(testFile, 41, 3)],
-        ),
-      ],
-    );
+''');
   }
 
   test_static_method_setter() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 extension type E(int it) {
   static void foo() {}
+//            ^^^
+// [context 1] The first definition of this name.
   static set foo(_) {}
+//           ^^^
+// [diag.duplicateDefinition][context 1] The name 'foo' is already defined.
 }
-''',
-      [
-        error(
-          diag.duplicateDefinition,
-          63,
-          3,
-          contextMessages: [message(testFile, 41, 3)],
-        ),
-      ],
-    );
+''');
   }
 
   test_static_setter_getter() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 extension type E(int it) {
   static set foo(_) {}
   static int get foo => 0;
@@ -3147,141 +2322,99 @@
   }
 
   test_static_setter_method() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 extension type E(int it) {
   static set foo(_) {}
+//           ^^^
+// [context 1] The first definition of this name.
   static void foo() {}
+//            ^^^
+// [diag.duplicateDefinition][context 1] The name 'foo' is already defined.
 }
-''',
-      [
-        error(
-          diag.duplicateDefinition,
-          64,
-          3,
-          contextMessages: [message(testFile, 40, 3)],
-        ),
-      ],
-    );
+''');
   }
 
   test_static_setter_setter() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 extension type E(int it) {
   static void set foo(_) {}
+//                ^^^
+// [context 1] The first definition of this name.
   static void set foo(_) {}
+//                ^^^
+// [diag.duplicateDefinition][context 1] The name 'foo' is already defined.
 }
-''',
-      [
-        error(
-          diag.duplicateDefinition,
-          73,
-          3,
-          contextMessages: [message(testFile, 45, 3)],
-        ),
-      ],
-    );
+''');
   }
 
   test_unitMembers_extensionType() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics('''
 extension type E(int it) {}
+//             ^
+// [context 1] The first definition of this name.
 extension type E(int it) {}
-''',
-      [
-        error(
-          diag.duplicateDefinition,
-          43,
-          1,
-          contextMessages: [message(testFile, 15, 1)],
-        ),
-      ],
-    );
+//             ^
+// [diag.duplicateDefinition][context 1] The name 'E' is already defined.
+''');
   }
 }
 
 @reflectiveTest
 class DuplicateDefinitionMixinTest extends PubPackageResolutionTest {
   test_instance_field_field() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 mixin M {
   int foo = 0;
+//    ^^^
+// [context 1] The first definition of this name.
   int foo = 0;
+//    ^^^
+// [diag.duplicateDefinition][context 1] The name 'foo' is already defined.
 }
-''',
-      [
-        error(
-          diag.duplicateDefinition,
-          31,
-          3,
-          contextMessages: [message(testFile, 16, 3)],
-        ),
-      ],
-    );
+''');
   }
 
   test_instance_field_getter() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 mixin M {
   int foo = 0;
+//    ^^^
+// [context 1] The first definition of this name.
   int get foo => 0;
+//        ^^^
+// [diag.duplicateDefinition][context 1] The name 'foo' is already defined.
 }
-''',
-      [
-        error(
-          diag.duplicateDefinition,
-          35,
-          3,
-          contextMessages: [message(testFile, 16, 3)],
-        ),
-      ],
-    );
+''');
   }
 
   test_instance_field_method() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 mixin M {
   int foo = 0;
+//    ^^^
+// [context 1] The first definition of this name.
   void foo() {}
+//     ^^^
+// [diag.duplicateDefinition][context 1] The name 'foo' is already defined.
 }
-''',
-      [
-        error(
-          diag.duplicateDefinition,
-          32,
-          3,
-          contextMessages: [message(testFile, 16, 3)],
-        ),
-      ],
-    );
+''');
   }
 
   test_instance_fieldFinal_getter() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 mixin M {
   final int foo = 0;
+//          ^^^
+// [context 1] The first definition of this name.
   int get foo => 0;
+//        ^^^
+// [diag.duplicateDefinition][context 1] The name 'foo' is already defined.
 }
-''',
-      [
-        error(
-          diag.duplicateDefinition,
-          41,
-          3,
-          contextMessages: [message(testFile, 22, 3)],
-        ),
-      ],
-    );
+''');
   }
 
   test_instance_fieldFinal_setter() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 mixin M {
   final int foo = 0;
   set foo(int x) {}
@@ -3290,45 +2423,33 @@
   }
 
   test_instance_getter_getter() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 mixin M {
   int get foo => 0;
+//        ^^^
+// [context 1] The first definition of this name.
   int get foo => 0;
+//        ^^^
+// [diag.duplicateDefinition][context 1] The name 'foo' is already defined.
 }
-''',
-      [
-        error(
-          diag.duplicateDefinition,
-          40,
-          3,
-          contextMessages: [message(testFile, 20, 3)],
-        ),
-      ],
-    );
+''');
   }
 
   test_instance_getter_method() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 mixin M {
   int get foo => 0;
+//        ^^^
+// [context 1] The first definition of this name.
   void foo() {}
+//     ^^^
+// [diag.duplicateDefinition][context 1] The name 'foo' is already defined.
 }
-''',
-      [
-        error(
-          diag.duplicateDefinition,
-          37,
-          3,
-          contextMessages: [message(testFile, 20, 3)],
-        ),
-      ],
-    );
+''');
   }
 
   test_instance_getter_setter() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 mixin M {
   int get foo => 0;
   set foo(_) {}
@@ -3337,41 +2458,29 @@
   }
 
   test_instance_method_getter() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 mixin M {
   void foo() {}
+//     ^^^
+// [context 1] The first definition of this name.
   int get foo => 0;
+//        ^^^
+// [diag.duplicateDefinition][context 1] The name 'foo' is already defined.
 }
-''',
-      [
-        error(
-          diag.duplicateDefinition,
-          36,
-          3,
-          contextMessages: [message(testFile, 17, 3)],
-        ),
-      ],
-    );
+''');
   }
 
   test_instance_method_method() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 mixin M {
   void foo() {}
+//     ^^^
+// [context 1] The first definition of this name.
   void foo() {}
+//     ^^^
+// [diag.duplicateDefinition][context 1] The name 'foo' is already defined.
 }
-''',
-      [
-        error(
-          diag.duplicateDefinition,
-          33,
-          3,
-          contextMessages: [message(testFile, 17, 3)],
-        ),
-      ],
-    );
+''');
   }
 
   @SkippedTest() // TODO(scheglov): implement augmentation
@@ -3432,26 +2541,20 @@
   }
 
   test_instance_method_setter() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 mixin M {
   void foo() {}
+//     ^^^
+// [context 1] The first definition of this name.
   set foo(_) {}
+//    ^^^
+// [diag.duplicateDefinition][context 1] The name 'foo' is already defined.
 }
-''',
-      [
-        error(
-          diag.duplicateDefinition,
-          32,
-          3,
-          contextMessages: [message(testFile, 17, 3)],
-        ),
-      ],
-    );
+''');
   }
 
   test_instance_setter_getter() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 mixin M {
   set foo(_) {}
   int get foo => 0;
@@ -3460,121 +2563,85 @@
   }
 
   test_instance_setter_method() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 mixin M {
   set foo(_) {}
+//    ^^^
+// [context 1] The first definition of this name.
   void foo() {}
+//     ^^^
+// [diag.duplicateDefinition][context 1] The name 'foo' is already defined.
 }
-''',
-      [
-        error(
-          diag.duplicateDefinition,
-          33,
-          3,
-          contextMessages: [message(testFile, 16, 3)],
-        ),
-      ],
-    );
+''');
   }
 
   test_instance_setter_setter() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 mixin M {
   void set foo(_) {}
+//         ^^^
+// [context 1] The first definition of this name.
   void set foo(_) {}
+//         ^^^
+// [diag.duplicateDefinition][context 1] The name 'foo' is already defined.
 }
-''',
-      [
-        error(
-          diag.duplicateDefinition,
-          42,
-          3,
-          contextMessages: [message(testFile, 21, 3)],
-        ),
-      ],
-    );
+''');
   }
 
   test_static_field_field() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 mixin M {
   static int foo = 0;
+//           ^^^
+// [context 1] The first definition of this name.
   static int foo = 0;
+//           ^^^
+// [diag.duplicateDefinition][context 1] The name 'foo' is already defined.
 }
-''',
-      [
-        error(
-          diag.duplicateDefinition,
-          45,
-          3,
-          contextMessages: [message(testFile, 23, 3)],
-        ),
-      ],
-    );
+''');
   }
 
   test_static_field_getter() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 mixin M {
   static int foo = 0;
+//           ^^^
+// [context 1] The first definition of this name.
   static int get foo => 0;
+//               ^^^
+// [diag.duplicateDefinition][context 1] The name 'foo' is already defined.
 }
-''',
-      [
-        error(
-          diag.duplicateDefinition,
-          49,
-          3,
-          contextMessages: [message(testFile, 23, 3)],
-        ),
-      ],
-    );
+''');
   }
 
   test_static_field_method() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 mixin M {
   static int foo = 0;
+//           ^^^
+// [context 1] The first definition of this name.
   static void foo() {}
+//            ^^^
+// [diag.duplicateDefinition][context 1] The name 'foo' is already defined.
 }
-''',
-      [
-        error(
-          diag.duplicateDefinition,
-          46,
-          3,
-          contextMessages: [message(testFile, 23, 3)],
-        ),
-      ],
-    );
+''');
   }
 
   test_static_fieldFinal_getter() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 mixin M {
   static final int foo = 0;
+//                 ^^^
+// [context 1] The first definition of this name.
   static int get foo => 0;
+//               ^^^
+// [diag.duplicateDefinition][context 1] The name 'foo' is already defined.
 }
-''',
-      [
-        error(
-          diag.duplicateDefinition,
-          55,
-          3,
-          contextMessages: [message(testFile, 29, 3)],
-        ),
-      ],
-    );
+''');
   }
 
   test_static_fieldFinal_setter() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 mixin M {
   static final int foo = 0;
   static set foo(int x) {}
@@ -3583,45 +2650,33 @@
   }
 
   test_static_getter_getter() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 mixin M {
   static int get foo => 0;
+//               ^^^
+// [context 1] The first definition of this name.
   static int get foo => 0;
+//               ^^^
+// [diag.duplicateDefinition][context 1] The name 'foo' is already defined.
 }
-''',
-      [
-        error(
-          diag.duplicateDefinition,
-          54,
-          3,
-          contextMessages: [message(testFile, 27, 3)],
-        ),
-      ],
-    );
+''');
   }
 
   test_static_getter_method() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 mixin M {
   static int get foo => 0;
+//               ^^^
+// [context 1] The first definition of this name.
   static void foo() {}
+//            ^^^
+// [diag.duplicateDefinition][context 1] The name 'foo' is already defined.
 }
-''',
-      [
-        error(
-          diag.duplicateDefinition,
-          51,
-          3,
-          contextMessages: [message(testFile, 27, 3)],
-        ),
-      ],
-    );
+''');
   }
 
   test_static_getter_setter() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 mixin M {
   static int get foo => 0;
   static set foo(_) {}
@@ -3630,64 +2685,46 @@
   }
 
   test_static_method_getter() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 mixin M {
   static void foo() {}
+//            ^^^
+// [context 1] The first definition of this name.
   static int get foo => 0;
+//               ^^^
+// [diag.duplicateDefinition][context 1] The name 'foo' is already defined.
 }
-''',
-      [
-        error(
-          diag.duplicateDefinition,
-          50,
-          3,
-          contextMessages: [message(testFile, 24, 3)],
-        ),
-      ],
-    );
+''');
   }
 
   test_static_method_method() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 mixin M {
   static void foo() {}
+//            ^^^
+// [context 1] The first definition of this name.
   static void foo() {}
+//            ^^^
+// [diag.duplicateDefinition][context 1] The name 'foo' is already defined.
 }
-''',
-      [
-        error(
-          diag.duplicateDefinition,
-          47,
-          3,
-          contextMessages: [message(testFile, 24, 3)],
-        ),
-      ],
-    );
+''');
   }
 
   test_static_method_setter() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 mixin M {
   static void foo() {}
+//            ^^^
+// [context 1] The first definition of this name.
   static set foo(_) {}
+//           ^^^
+// [diag.duplicateDefinition][context 1] The name 'foo' is already defined.
 }
-''',
-      [
-        error(
-          diag.duplicateDefinition,
-          46,
-          3,
-          contextMessages: [message(testFile, 24, 3)],
-        ),
-      ],
-    );
+''');
   }
 
   test_static_setter_getter() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 mixin M {
   static set foo(_) {}
   static int get foo => 0;
@@ -3696,118 +2733,90 @@
   }
 
   test_static_setter_method() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 mixin M {
   static set foo(_) {}
+//           ^^^
+// [context 1] The first definition of this name.
   static void foo() {}
+//            ^^^
+// [diag.duplicateDefinition][context 1] The name 'foo' is already defined.
 }
-''',
-      [
-        error(
-          diag.duplicateDefinition,
-          47,
-          3,
-          contextMessages: [message(testFile, 23, 3)],
-        ),
-      ],
-    );
+''');
   }
 
   test_static_setter_setter() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 mixin M {
   static void set foo(_) {}
+//                ^^^
+// [context 1] The first definition of this name.
   static void set foo(_) {}
+//                ^^^
+// [diag.duplicateDefinition][context 1] The name 'foo' is already defined.
 }
-''',
-      [
-        error(
-          diag.duplicateDefinition,
-          56,
-          3,
-          contextMessages: [message(testFile, 28, 3)],
-        ),
-      ],
-    );
+''');
   }
 }
 
 @reflectiveTest
 class DuplicateDefinitionTest extends PubPackageResolutionTest {
   test_block_localFunction_wildcard() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 void f() {
   void _() {}
+//^^^^^^^^^^^
+// [diag.deadCode] Dead code.
   int _(int _) => 42;
+//^^^^^^^^^^^^^^^^^^^
+// [diag.deadCode] Dead code.
   String _(int _) => "42";
+//^^^^^^^^^^^^^^^^^^^^^^^^
+// [diag.deadCode] Dead code.
 }
-''',
-      [
-        error(diag.deadCode, 13, 11),
-        error(diag.deadCode, 27, 19),
-        error(diag.deadCode, 49, 24),
-      ],
-    );
+''');
   }
 
   test_block_localFunction_wildcard_preWildcards() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 // @dart = 3.4
 // (pre wildcard-variables)
 
 void f() {
   void _() {}
+//     ^
+// [context 1] The first definition of this name.
+// [context 2] The first definition of this name.
+// [diag.unusedElement] The declaration '_' isn't referenced.
   int _(int _) => 42;
+//    ^
+// [diag.duplicateDefinition][context 1] The name '_' is already defined.
+// [diag.unusedElement] The declaration '_' isn't referenced.
   String _(int _) => "42";
+//       ^
+// [diag.duplicateDefinition][context 2] The name '_' is already defined.
+// [diag.unusedElement] The declaration '_' isn't referenced.
 }
-''',
-      [
-        error(diag.unusedElement, 62, 1),
-        error(
-          diag.duplicateDefinition,
-          75,
-          1,
-          contextMessages: [message(testFile, 62, 1)],
-        ),
-        error(diag.unusedElement, 75, 1),
-        error(
-          diag.duplicateDefinition,
-          100,
-          1,
-          contextMessages: [message(testFile, 62, 1)],
-        ),
-        error(diag.unusedElement, 100, 1),
-      ],
-    );
+''');
   }
 
   test_block_localVariable_localVariable() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 void f() {
   var a = 0;
+//    ^
+// [context 1] The first definition of this name.
+// [diag.unusedLocalVariable] The value of the local variable 'a' isn't used.
   var a = 1;
+//    ^
+// [diag.duplicateDefinition][context 1] The name 'a' is already defined.
+// [diag.unusedLocalVariable] The value of the local variable 'a' isn't used.
 }
-''',
-      [
-        error(diag.unusedLocalVariable, 17, 1),
-        error(diag.unusedLocalVariable, 30, 1),
-        error(
-          diag.duplicateDefinition,
-          30,
-          1,
-          contextMessages: [message(testFile, 17, 1)],
-        ),
-      ],
-    );
+''');
   }
 
   test_block_localVariable_localVariable_wildcard() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 void f() {
   var _ = 0;
   var _ = 1;
@@ -3816,50 +2825,38 @@
   }
 
   test_block_localVariable_localVariable_wildcard_preWildcards() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 // @dart = 3.4
 // (pre wildcard-variables)
 
 void f() {
   var _ = 0;
+//    ^
+// [context 1] The first definition of this name.
   var _ = 1;
+//    ^
+// [diag.duplicateDefinition][context 1] The name '_' is already defined.
 }
-''',
-      [
-        error(
-          diag.duplicateDefinition,
-          74,
-          1,
-          contextMessages: [message(testFile, 61, 1)],
-        ),
-      ],
-    );
+''');
   }
 
   test_block_localVariable_patternVariable() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 void f() {
   var a = 0;
+//    ^
+// [context 1] The first definition of this name.
+// [diag.unusedLocalVariable] The value of the local variable 'a' isn't used.
   var (a) = 1;
+//     ^
+// [diag.duplicateDefinition][context 1] The name 'a' is already defined.
+// [diag.unusedLocalVariable] The value of the local variable 'a' isn't used.
 }
-''',
-      [
-        error(diag.unusedLocalVariable, 17, 1),
-        error(
-          diag.duplicateDefinition,
-          31,
-          1,
-          contextMessages: [message(testFile, 17, 1)],
-        ),
-        error(diag.unusedLocalVariable, 31, 1),
-      ],
-    );
+''');
   }
 
   test_block_localVariable_patternVariable_wildcard() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 void f() {
   var _ = 0;
   var (_) = 1;
@@ -3868,7 +2865,7 @@
   }
 
   test_block_localVariable_patternVariable_wildcard_preWildcards() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 // @dart = 3.4
 // (pre wildcard-variables)
 
@@ -3880,127 +2877,96 @@
   }
 
   test_block_patternVariable_localVariable() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 void f() {
   var (a) = 1;
+//     ^
+// [context 1] The first definition of this name.
+// [diag.unusedLocalVariable] The value of the local variable 'a' isn't used.
   var a = 0;
+//    ^
+// [diag.duplicateDefinition][context 1] The name 'a' is already defined.
+// [diag.unusedLocalVariable] The value of the local variable 'a' isn't used.
 }
-''',
-      [
-        error(diag.unusedLocalVariable, 18, 1),
-        error(
-          diag.duplicateDefinition,
-          32,
-          1,
-          contextMessages: [message(testFile, 18, 1)],
-        ),
-        error(diag.unusedLocalVariable, 32, 1),
-      ],
-    );
+''');
   }
 
   test_block_patternVariable_patternVariable() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 void f() {
   var (a) = 0;
+//     ^
+// [context 1] The first definition of this name.
+// [diag.unusedLocalVariable] The value of the local variable 'a' isn't used.
   var (a) = 1;
+//     ^
+// [diag.duplicateDefinition][context 1] The name 'a' is already defined.
+// [diag.unusedLocalVariable] The value of the local variable 'a' isn't used.
 }
-''',
-      [
-        error(diag.unusedLocalVariable, 18, 1),
-        error(
-          diag.duplicateDefinition,
-          33,
-          1,
-          contextMessages: [message(testFile, 18, 1)],
-        ),
-        error(diag.unusedLocalVariable, 33, 1),
-      ],
-    );
+''');
   }
 
   test_catch() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 main() {
   try {} catch (e, e) {}
-}''',
-      [
-        error(diag.unusedCatchStack, 28, 1),
-        error(
-          diag.duplicateDefinition,
-          28,
-          1,
-          contextMessages: [message(testFile, 25, 1)],
-        ),
-      ],
-    );
+//              ^
+// [context 1] The first definition of this name.
+//                 ^
+// [diag.duplicateDefinition][context 1] The name 'e' is already defined.
+// [diag.unusedCatchStack] The stack trace variable 'e' isn't used and can be removed.
+}''');
   }
 
   test_catch_wildcard() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 f() {
   try {} catch (_, _) {}
 }''');
   }
 
   test_catch_wildcard_preWildCards() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 // @dart = 3.4
 // (pre wildcard-variables)
 
 f() {
   try {} catch (_, _) {}
-}''',
-      [
-        error(
-          diag.duplicateDefinition,
-          69,
-          1,
-          contextMessages: [message(testFile, 66, 1)],
-        ),
-      ],
-    );
+//              ^
+// [context 1] The first definition of this name.
+//                 ^
+// [diag.duplicateDefinition][context 1] The name '_' is already defined.
+}''');
   }
 
   test_emptyName() async {
     // Note: This code has two FunctionElements '() {}' with an empty name; this
     // tests that the empty string is not put into the scope (more than once).
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 Map _globalMap = {
+//  ^^^^^^^^^^
+// [diag.unusedElement] The declaration '_globalMap' isn't referenced.
   'a' : () {},
   'b' : () {}
 };
-''',
-      [error(diag.unusedElement, 4, 10)],
-    );
+''');
   }
 
   test_for_initializers() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 f() {
   for (int i = 0, i = 0; i < 5;) {}
+//         ^
+// [context 1] The first definition of this name.
+//                ^
+// [diag.duplicateDefinition][context 1] The name 'i' is already defined.
+// [diag.unusedLocalVariable] The value of the local variable 'i' isn't used.
 }
-''',
-      [
-        error(
-          diag.duplicateDefinition,
-          24,
-          1,
-          contextMessages: [message(testFile, 17, 1)],
-        ),
-        error(diag.unusedLocalVariable, 24, 1),
-      ],
-    );
+''');
   }
 
   test_for_initializers_wildcard() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 f() {
   for (int _ = 0, _ = 0; ;) {}
 }
@@ -4008,188 +2974,150 @@
   }
 
   test_for_initializers_wildcard_preWildcards() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 // @dart = 3.4
 // (pre wildcard-variables)
 
 f() {
   for (int _ = 0, _ = 0; ;) {}
+//         ^
+// [context 1] The first definition of this name.
+//                ^
+// [diag.duplicateDefinition][context 1] The name '_' is already defined.
 }
-''',
-      [
-        error(
-          diag.duplicateDefinition,
-          68,
-          1,
-          contextMessages: [message(testFile, 61, 1)],
-        ),
-      ],
-    );
+''');
   }
 
   test_getter_single() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics('''
 bool get a => true;
 ''');
   }
 
   test_parameters_constructor_field_first() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   int? a;
   A(this.a, int a);
+//       ^
+// [context 1] The first definition of this name.
+//              ^
+// [diag.duplicateDefinition][context 1] The name 'a' is already defined.
 }
-''',
-      [
-        error(
-          diag.duplicateDefinition,
-          36,
-          1,
-          contextMessages: [message(testFile, 29, 1)],
-        ),
-      ],
-    );
+''');
   }
 
   test_parameters_constructor_field_first_wildcard() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   int? _;
+//     ^
+// [diag.unusedField] The value of the field '_' isn't used.
   A(this._, int _);
 }
-''',
-      [error(diag.unusedField, 17, 1)],
-    );
+''');
   }
 
   test_parameters_constructor_field_first_wildcard_preWildcards() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 // @dart = 3.4
 // (pre wildcard-variables)
 
 class A {
   int? _;
+//     ^
+// [diag.unusedField] The value of the field '_' isn't used.
   A(this._, int _);
+//       ^
+// [context 1] The first definition of this name.
+//              ^
+// [diag.duplicateDefinition][context 1] The name '_' is already defined.
 }
-''',
-      [
-        error(diag.unusedField, 61, 1),
-        error(
-          diag.duplicateDefinition,
-          80,
-          1,
-          contextMessages: [message(testFile, 73, 1)],
-        ),
-      ],
-    );
+''');
   }
 
   test_parameters_constructor_field_second() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   int? a;
   A(int a, this.a);
+//      ^
+// [context 1] The first definition of this name.
+//              ^
+// [diag.duplicateDefinition][context 1] The name 'a' is already defined.
 }
-''',
-      [
-        error(
-          diag.duplicateDefinition,
-          36,
-          1,
-          contextMessages: [message(testFile, 28, 1)],
-        ),
-      ],
-    );
+''');
   }
 
   test_parameters_constructor_field_second_wildcard() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   int? _;
+//     ^
+// [diag.unusedField] The value of the field '_' isn't used.
   A(int _, this._);
 }
-''',
-      [error(diag.unusedField, 17, 1)],
-    );
+''');
   }
 
   test_parameters_constructor_field_second_wildcard_preWildcards() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 // @dart = 3.4
 // (pre wildcard-variables)
 
 class A {
   int? _;
+//     ^
+// [diag.unusedField] The value of the field '_' isn't used.
   A(int _, this._);
+//      ^
+// [context 1] The first definition of this name.
+//              ^
+// [diag.duplicateDefinition][context 1] The name '_' is already defined.
 }
-''',
-      [
-        error(diag.unusedField, 61, 1),
-        error(
-          diag.duplicateDefinition,
-          80,
-          1,
-          contextMessages: [message(testFile, 72, 1)],
-        ),
-      ],
-    );
+''');
   }
 
   test_parameters_constructor_super_first_wildcard() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   int? _;
+//     ^
+// [diag.unusedField] The value of the field '_' isn't used.
   A(this._);
 }
 class B extends A {
   B(super._, super._);
+//                 ^
+// [diag.superFormalParameterWithoutAssociatedPositional] No associated positional super constructor parameter.
 }
-''',
-      [
-        error(diag.unusedField, 17, 1),
-        error(diag.superFormalParameterWithoutAssociatedPositional, 74, 1),
-      ],
-    );
+''');
   }
 
   test_parameters_constructor_super_first_wildcard_preWildcards() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 // @dart = 3.4
 // (pre wildcard-variables)
 
 class A {
   int? _;
+//     ^
+// [diag.unusedField] The value of the field '_' isn't used.
   A(this._);
 }
 class B extends A {
   B(super._, super._);
+//        ^
+// [context 1] The first definition of this name.
+//                 ^
+// [diag.duplicateDefinition][context 1] The name '_' is already defined.
+// [diag.superFormalParameterWithoutAssociatedPositional] No associated positional super constructor parameter.
 }
-''',
-      [
-        error(diag.unusedField, 61, 1),
-        error(
-          diag.duplicateDefinition,
-          118,
-          1,
-          contextMessages: [message(testFile, 109, 1)],
-        ),
-        error(diag.superFormalParameterWithoutAssociatedPositional, 118, 1),
-      ],
-    );
+''');
   }
 
   test_parameters_constructor_this_super_wildcard() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   final int x, y;
   A(this.x, [this.y = 0]);
@@ -4197,170 +3125,129 @@
 
 class C extends A {
   final int _;
+//          ^
+// [diag.unusedField] The value of the field '_' isn't used.
 
   C(this._, super._, [super._]);
 }
-''',
-      [error(diag.unusedField, 90, 1)],
-    );
+''');
   }
 
   test_parameters_functionTypeAlias() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 typedef void F(int a, double a);
-''',
-      [
-        error(
-          diag.duplicateDefinition,
-          29,
-          1,
-          contextMessages: [message(testFile, 19, 1)],
-        ),
-      ],
-    );
+//                 ^
+// [context 1] The first definition of this name.
+//                           ^
+// [diag.duplicateDefinition][context 1] The name 'a' is already defined.
+''');
   }
 
   test_parameters_functionTypeAlias_wildcard() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 typedef void F(int _, double _);
 ''');
   }
 
   test_parameters_functionTypeAlias_wildcard_preWildcards() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 // @dart = 3.4
 // (pre wildcard-variables)
 
 typedef void F(int _, double _);
-''',
-      [
-        error(
-          diag.duplicateDefinition,
-          73,
-          1,
-          contextMessages: [message(testFile, 63, 1)],
-        ),
-      ],
-    );
+//                 ^
+// [context 1] The first definition of this name.
+//                           ^
+// [diag.duplicateDefinition][context 1] The name '_' is already defined.
+''');
   }
 
   test_parameters_genericFunction() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 typedef F = void Function(int a, double a);
-''',
-      [
-        error(
-          diag.duplicateDefinition,
-          40,
-          1,
-          contextMessages: [message(testFile, 30, 1)],
-        ),
-      ],
-    );
+//                            ^
+// [context 1] The first definition of this name.
+//                                      ^
+// [diag.duplicateDefinition][context 1] The name 'a' is already defined.
+''');
   }
 
   test_parameters_genericFunction_wildcard() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 typedef F = void Function(int _, double _);
 ''');
   }
 
   test_parameters_genericFunction_wildcard_preWildcards() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 // @dart = 3.4
 // (pre wildcard-variables)
 
 typedef F = void Function(int _, double _);
-''',
-      [
-        error(
-          diag.duplicateDefinition,
-          84,
-          1,
-          contextMessages: [message(testFile, 74, 1)],
-        ),
-      ],
-    );
+//                            ^
+// [context 1] The first definition of this name.
+//                                      ^
+// [diag.duplicateDefinition][context 1] The name '_' is already defined.
+''');
   }
 
   test_parameters_localFunction() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 main() {
   f(int a, double a) {
+//^
+// [diag.unusedElement] The declaration 'f' isn't referenced.
+//      ^
+// [context 1] The first definition of this name.
+//                ^
+// [diag.duplicateDefinition][context 1] The name 'a' is already defined.
   };
 }
-''',
-      [
-        error(diag.unusedElement, 11, 1),
-        error(
-          diag.duplicateDefinition,
-          27,
-          1,
-          contextMessages: [message(testFile, 17, 1)],
-        ),
-      ],
-    );
+''');
   }
 
   test_parameters_localFunction_wildcard() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 f() {
   g(int _, double _) {};
+//^
+// [diag.unusedElement] The declaration 'g' isn't referenced.
 }
-''',
-      [error(diag.unusedElement, 8, 1)],
-    );
+''');
   }
 
   test_parameters_localFunction_wildcard_preWildcards() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 // @dart = 3.4
 // (pre wildcard-variables)
 
 f() {
   g(int _, double _) {};
+//^
+// [diag.unusedElement] The declaration 'g' isn't referenced.
+//      ^
+// [context 1] The first definition of this name.
+//                ^
+// [diag.duplicateDefinition][context 1] The name '_' is already defined.
 }
-''',
-      [
-        error(diag.unusedElement, 52, 1),
-        error(
-          diag.duplicateDefinition,
-          68,
-          1,
-          contextMessages: [message(testFile, 58, 1)],
-        ),
-      ],
-    );
+''');
   }
 
   test_parameters_method() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   m(int a, double a) {
+//      ^
+// [context 1] The first definition of this name.
+//                ^
+// [diag.duplicateDefinition][context 1] The name 'a' is already defined.
   }
 }
-''',
-      [
-        error(
-          diag.duplicateDefinition,
-          28,
-          1,
-          contextMessages: [message(testFile, 18, 1)],
-        ),
-      ],
-    );
+''');
   }
 
   test_parameters_method_wildcard() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   m(int _, double _) {
   }
@@ -4369,249 +3256,185 @@
   }
 
   test_parameters_method_wildcard_preWildcards() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 // @dart = 3.4
 // (pre wildcard-variables)
 
 class A {
   m(int _, double _) {
+//      ^
+// [context 1] The first definition of this name.
+//                ^
+// [diag.duplicateDefinition][context 1] The name '_' is already defined.
   }
 }
-''',
-      [
-        error(
-          diag.duplicateDefinition,
-          72,
-          1,
-          contextMessages: [message(testFile, 62, 1)],
-        ),
-      ],
-    );
+''');
   }
 
   test_parameters_primaryConstructor_field_simple() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A(int a, this.a) {
+//          ^
+// [context 1] The first definition of this name.
+//                  ^
+// [diag.duplicateDefinition][context 1] The name 'a' is already defined.
   int a;
 }
-''',
-      [
-        error(
-          diag.duplicateDefinition,
-          20,
-          1,
-          contextMessages: [message(testFile, 12, 1)],
-        ),
-      ],
-    );
+''');
   }
 
   test_parameters_primaryConstructor_field_simple_wildcard() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A(int _, this._) {
   int _;
+//    ^
+// [diag.unusedField] The value of the field '_' isn't used.
 }
-''',
-      [error(diag.unusedField, 31, 1)],
-    );
+''');
   }
 
   test_parameters_primaryConstructor_simple_field() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A(this.a, int a) {
+//           ^
+// [context 1] The first definition of this name.
+//                  ^
+// [diag.duplicateDefinition][context 1] The name 'a' is already defined.
   int a;
 }
-''',
-      [
-        error(
-          diag.duplicateDefinition,
-          20,
-          1,
-          contextMessages: [message(testFile, 13, 1)],
-        ),
-      ],
-    );
+''');
   }
 
   test_parameters_primaryConstructor_simple_field_wildcard() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A(this._, int _) {
   int _;
+//    ^
+// [diag.unusedField] The value of the field '_' isn't used.
 }
-''',
-      [error(diag.unusedField, 31, 1)],
-    );
+''');
   }
 
   test_parameters_primaryConstructor_simple_simple() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A(int a, int a) {}
-''',
-      [
-        error(
-          diag.duplicateDefinition,
-          19,
-          1,
-          contextMessages: [message(testFile, 12, 1)],
-        ),
-      ],
-    );
+//          ^
+// [context 1] The first definition of this name.
+//                 ^
+// [diag.duplicateDefinition][context 1] The name 'a' is already defined.
+''');
   }
 
   test_parameters_primaryConstructor_super_super() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A(this.a, this.b) {
   int a;
   int b;
 }
 class B(super.a, super.a) extends A {}
-''',
-      [
-        error(
-          diag.duplicateDefinition,
-          69,
-          1,
-          contextMessages: [message(testFile, 60, 1)],
-        ),
-      ],
-    );
+//            ^
+// [context 1] The first definition of this name.
+//                     ^
+// [diag.duplicateDefinition][context 1] The name 'a' is already defined.
+''');
   }
 
   test_parameters_primaryConstructor_this_super() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A(this.a, this.b) {
   int a;
   int b;
 }
 class C(this.x, super.x) extends A {
+//    ^
+// [diag.implicitSuperInitializerMissingArguments] The implicitly invoked unnamed constructor from 'A' has required parameters.
+//           ^
+// [context 1] The first definition of this name.
+//                    ^
+// [diag.duplicateDefinition][context 1] The name 'x' is already defined.
   final int x;
 }
-''',
-      [
-        error(diag.implicitSuperInitializerMissingArguments, 52, 1),
-        error(
-          diag.duplicateDefinition,
-          68,
-          1,
-          contextMessages: [message(testFile, 59, 1)],
-        ),
-      ],
-    );
+''');
   }
 
   test_parameters_topLevelFunction() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 f(int a, double a) {}
-''',
-      [
-        error(
-          diag.duplicateDefinition,
-          16,
-          1,
-          contextMessages: [message(testFile, 6, 1)],
-        ),
-      ],
-    );
+//    ^
+// [context 1] The first definition of this name.
+//              ^
+// [diag.duplicateDefinition][context 1] The name 'a' is already defined.
+''');
   }
 
   test_parameters_topLevelFunction_synthetic() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 f(,[]) {}
-''',
-      [
-        error(diag.missingIdentifier, 2, 1),
-        error(diag.missingIdentifier, 4, 1),
-      ],
-    );
+//^
+// [diag.missingIdentifier] Expected an identifier.
+//  ^
+// [diag.missingIdentifier] Expected an identifier.
+''');
   }
 
   test_parameters_topLevelFunction_wildcard() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 f(int _, double _) {}
 ''');
   }
 
   test_parameters_topLevelFunction_wildcard_preWildcards() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 // @dart = 3.4
 // (pre wildcard-variables)
 
 f(int _, double _) {}
-''',
-      [
-        error(
-          diag.duplicateDefinition,
-          60,
-          1,
-          contextMessages: [message(testFile, 50, 1)],
-        ),
-      ],
-    );
+//    ^
+// [context 1] The first definition of this name.
+//              ^
+// [diag.duplicateDefinition][context 1] The name '_' is already defined.
+''');
   }
 
   test_switchCase_localVariable_localVariable() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 // @dart = 2.19
 void f() {
   switch (0) {
     case 0:
       var a;
+//        ^
+// [context 1] The first definition of this name.
+// [diag.unusedLocalVariable] The value of the local variable 'a' isn't used.
       var a;
+//        ^
+// [diag.duplicateDefinition][context 1] The name 'a' is already defined.
+// [diag.unusedLocalVariable] The value of the local variable 'a' isn't used.
   }
 }
-''',
-      [
-        error(diag.unusedLocalVariable, 64, 1),
-        error(
-          diag.duplicateDefinition,
-          77,
-          1,
-          contextMessages: [message(testFile, 64, 1)],
-        ),
-        error(diag.unusedLocalVariable, 77, 1),
-      ],
-    );
+''');
   }
 
   test_switchDefault_localVariable_localVariable() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 void f() {
   switch (0) {
     default:
       var a;
+//        ^
+// [context 1] The first definition of this name.
+// [diag.unusedLocalVariable] The value of the local variable 'a' isn't used.
       var a;
+//        ^
+// [diag.duplicateDefinition][context 1] The name 'a' is already defined.
+// [diag.unusedLocalVariable] The value of the local variable 'a' isn't used.
   }
 }
-''',
-      [
-        error(diag.unusedLocalVariable, 49, 1),
-        error(
-          diag.duplicateDefinition,
-          62,
-          1,
-          contextMessages: [message(testFile, 49, 1)],
-        ),
-        error(diag.unusedLocalVariable, 62, 1),
-      ],
-    );
+''');
   }
 
   test_switchDefault_localVariable_localVariable_preWildcards() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 // @dart = 3.4
 // (pre wildcard-variables)
 
@@ -4619,23 +3442,18 @@
   switch (0) {
     default:
       var _;
+//        ^
+// [context 1] The first definition of this name.
       var _;
+//        ^
+// [diag.duplicateDefinition][context 1] The name '_' is already defined.
   }
 }
-''',
-      [
-        error(
-          diag.duplicateDefinition,
-          106,
-          1,
-          contextMessages: [message(testFile, 93, 1)],
-        ),
-      ],
-    );
+''');
   }
 
   test_switchDefault_localVariable_localVariable_wildcard() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 void f() {
   switch (0) {
     default:
@@ -4647,31 +3465,25 @@
   }
 
   test_switchPatternCase_localVariable_localVariable() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 void f() {
   switch (0) {
     case 0:
       var a;
+//        ^
+// [context 1] The first definition of this name.
+// [diag.unusedLocalVariable] The value of the local variable 'a' isn't used.
       var a;
+//        ^
+// [diag.duplicateDefinition][context 1] The name 'a' is already defined.
+// [diag.unusedLocalVariable] The value of the local variable 'a' isn't used.
   }
 }
-''',
-      [
-        error(diag.unusedLocalVariable, 48, 1),
-        error(
-          diag.duplicateDefinition,
-          61,
-          1,
-          contextMessages: [message(testFile, 48, 1)],
-        ),
-        error(diag.unusedLocalVariable, 61, 1),
-      ],
-    );
+''');
   }
 
   test_switchPatternCase_localVariable_localVariable_wildcard() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 void f() {
   switch (0) {
     case 0:
@@ -4683,8 +3495,7 @@
   }
 
   test_switchPatternCase_localVariable_localVariable_wildcard_preWildCards() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 // @dart = 3.4
 // (pre wildcard-variables)
 
@@ -4692,125 +3503,90 @@
   switch (0) {
     case 0:
       var _;
+//        ^
+// [context 1] The first definition of this name.
       var _;
+//        ^
+// [diag.duplicateDefinition][context 1] The name '_' is already defined.
   }
 }
-''',
-      [
-        error(
-          diag.duplicateDefinition,
-          105,
-          1,
-          contextMessages: [message(testFile, 92, 1)],
-        ),
-      ],
-    );
+''');
   }
 
   test_topLevel_field_field() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 var f = 1;
+//  ^
+// [context 1] The first definition of this name.
 var f = 2;
-''',
-      [
-        error(
-          diag.duplicateDefinition,
-          15,
-          1,
-          contextMessages: [message(testFile, 4, 1)],
-        ),
-      ],
-    );
+//  ^
+// [diag.duplicateDefinition][context 1] The name 'f' is already defined.
+''');
   }
 
   test_topLevel_field_getter() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 int f = 1;
+//  ^
+// [context 1] The first definition of this name.
 int get f => 7;
-''',
-      [
-        error(
-          diag.duplicateDefinition,
-          19,
-          1,
-          contextMessages: [message(testFile, 4, 1)],
-        ),
-      ],
-    );
+//      ^
+// [diag.duplicateDefinition][context 1] The name 'f' is already defined.
+''');
   }
 
   test_topLevel_field_setter() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 int f = 1;
+//  ^
+// [context 1] The first definition of this name.
 set f(int value) {}
-''',
-      [
-        error(
-          diag.duplicateDefinition,
-          15,
-          1,
-          contextMessages: [message(testFile, 4, 1)],
-        ),
-      ],
-    );
+//  ^
+// [diag.duplicateDefinition][context 1] The name 'f=' is already defined.
+''');
   }
 
   test_topLevel_fieldConst_setter() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 const f = 0;
 set f(_) {}
 ''');
   }
 
   test_topLevel_fieldFinal_setter() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 final f = 1;
 set f(int value) {}
 ''');
   }
 
   test_topLevel_fieldLateFinalInitializer_setter() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 late final f = 1;
 set f(int value) {}
 ''');
   }
 
   test_topLevel_fieldLateFinalNoInitializer_setter() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 late final f;
+//         ^
+// [context 1] The first definition of this name.
 set f(int value) {}
-''',
-      [
-        error(
-          diag.duplicateDefinition,
-          18,
-          1,
-          contextMessages: [message(testFile, 11, 1)],
-        ),
-      ],
-    );
+//  ^
+// [diag.duplicateDefinition][context 1] The name 'f=' is already defined.
+''');
   }
 
   test_topLevel_setter_setter() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 set f(int value) {}
+//  ^
+// [context 1] The first definition of this name.
 set f(int value) {}
-''',
-      [
-        error(
-          diag.duplicateDefinition,
-          24,
-          1,
-          contextMessages: [message(testFile, 4, 1)],
-        ),
-      ],
-    );
+//  ^
+// [diag.duplicateDefinition][context 1] The name 'f=' is already defined.
+''');
   }
 
   test_topLevel_setter_setter_inPart() async {
@@ -4819,7 +3595,7 @@
 set f(int value) {}
 ''');
 
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 part 'a.dart';
 set f(int value) {}
 ''');
@@ -4835,230 +3611,164 @@
   }
 
   test_typeParameters_class() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A<T, T> {}
-''',
-      [
-        error(
-          diag.duplicateDefinition,
-          11,
-          1,
-          contextMessages: [message(testFile, 8, 1)],
-        ),
-      ],
-    );
+//      ^
+// [context 1] The first definition of this name.
+//         ^
+// [diag.duplicateDefinition][context 1] The name 'T' is already defined.
+''');
   }
 
   test_typeParameters_class_wildcard() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A<_, _> {}
 ''');
   }
 
   test_typeParameters_class_wildcard_preWildcards() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 // @dart = 3.4
 // (pre wildcard-variables)
 
 class A<_, _> {}
-''',
-      [
-        error(
-          diag.duplicateDefinition,
-          55,
-          1,
-          contextMessages: [message(testFile, 52, 1)],
-        ),
-      ],
-    );
+//      ^
+// [context 1] The first definition of this name.
+//         ^
+// [diag.duplicateDefinition][context 1] The name '_' is already defined.
+''');
   }
 
   test_typeParameters_functionTypeAlias() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 typedef void F<T, T>();
-''',
-      [
-        error(
-          diag.duplicateDefinition,
-          18,
-          1,
-          contextMessages: [message(testFile, 15, 1)],
-        ),
-      ],
-    );
+//             ^
+// [context 1] The first definition of this name.
+//                ^
+// [diag.duplicateDefinition][context 1] The name 'T' is already defined.
+''');
   }
 
   test_typeParameters_functionTypeAlias_wildcard() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 typedef void F<_, _>();
 ''');
   }
 
   test_typeParameters_functionTypeAlias_wildcard_preWildcards() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 // @dart = 3.4
 // (pre wildcard-variables)
 
 typedef void F<_, _>();
-''',
-      [
-        error(
-          diag.duplicateDefinition,
-          62,
-          1,
-          contextMessages: [message(testFile, 59, 1)],
-        ),
-      ],
-    );
+//             ^
+// [context 1] The first definition of this name.
+//                ^
+// [diag.duplicateDefinition][context 1] The name '_' is already defined.
+''');
   }
 
   test_typeParameters_genericFunction() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 typedef F = void Function<T, T>();
-''',
-      [
-        error(
-          diag.duplicateDefinition,
-          29,
-          1,
-          contextMessages: [message(testFile, 26, 1)],
-        ),
-      ],
-    );
+//                        ^
+// [context 1] The first definition of this name.
+//                           ^
+// [diag.duplicateDefinition][context 1] The name 'T' is already defined.
+''');
   }
 
   test_typeParameters_genericFunction_wildcard() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 typedef F = void Function<_, _>();
 ''');
   }
 
   test_typeParameters_genericFunction_wildcard_preWildcards() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 // @dart = 3.4
 // (pre wildcard-variables)
 
 typedef F = void Function<_, _>();
-''',
-      [
-        error(
-          diag.duplicateDefinition,
-          73,
-          1,
-          contextMessages: [message(testFile, 70, 1)],
-        ),
-      ],
-    );
+//                        ^
+// [context 1] The first definition of this name.
+//                           ^
+// [diag.duplicateDefinition][context 1] The name '_' is already defined.
+''');
   }
 
   test_typeParameters_genericTypedef_functionType() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 typedef F<T, T> = void Function();
-''',
-      [
-        error(
-          diag.duplicateDefinition,
-          13,
-          1,
-          contextMessages: [message(testFile, 10, 1)],
-        ),
-      ],
-    );
+//        ^
+// [context 1] The first definition of this name.
+//           ^
+// [diag.duplicateDefinition][context 1] The name 'T' is already defined.
+''');
   }
 
   test_typeParameters_genericTypedef_functionType_wildcard() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 typedef F<_, _> = void Function();
 ''');
   }
 
   test_typeParameters_genericTypedef_functionType_wildcard_preWildcards() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 // @dart = 3.4
 // (pre wildcard-variables)
 
 typedef F<_, _> = void Function();
-''',
-      [
-        error(
-          diag.duplicateDefinition,
-          57,
-          1,
-          contextMessages: [message(testFile, 54, 1)],
-        ),
-      ],
-    );
+//        ^
+// [context 1] The first definition of this name.
+//           ^
+// [diag.duplicateDefinition][context 1] The name '_' is already defined.
+''');
   }
 
   test_typeParameters_genericTypedef_interfaceType() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 typedef F<T, T> = Map;
-''',
-      [
-        error(
-          diag.duplicateDefinition,
-          13,
-          1,
-          contextMessages: [message(testFile, 10, 1)],
-        ),
-      ],
-    );
+//        ^
+// [context 1] The first definition of this name.
+//           ^
+// [diag.duplicateDefinition][context 1] The name 'T' is already defined.
+''');
   }
 
   test_typeParameters_genericTypedef_interfaceType_wildcard() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 typedef F<_, _> = Map;
 ''');
   }
 
   test_typeParameters_genericTypedef_interfaceType_wildcard_preWildcards() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 // @dart = 3.4
 // (pre wildcard-variables)
 
 typedef F<_, _> = Map;
-''',
-      [
-        error(
-          diag.duplicateDefinition,
-          57,
-          1,
-          contextMessages: [message(testFile, 54, 1)],
-        ),
-      ],
-    );
+//        ^
+// [context 1] The first definition of this name.
+//           ^
+// [diag.duplicateDefinition][context 1] The name '_' is already defined.
+''');
   }
 
   test_typeParameters_method() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   void m<T, T>() {}
+//       ^
+// [context 1] The first definition of this name.
+//          ^
+// [diag.duplicateDefinition][context 1] The name 'T' is already defined.
 }
-''',
-      [
-        error(
-          diag.duplicateDefinition,
-          22,
-          1,
-          contextMessages: [message(testFile, 19, 1)],
-        ),
-      ],
-    );
+''');
   }
 
   test_typeParameters_method_wildcard() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   void m<_, _>() {}
 }
@@ -5066,86 +3776,62 @@
   }
 
   test_typeParameters_method_wildcard_preWildcards() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 // @dart = 3.4
 // (pre wildcard-variables)
 
 class A {
   void m<_, _>() {}
+//       ^
+// [context 1] The first definition of this name.
+//          ^
+// [diag.duplicateDefinition][context 1] The name '_' is already defined.
 }
-''',
-      [
-        error(
-          diag.duplicateDefinition,
-          66,
-          1,
-          contextMessages: [message(testFile, 63, 1)],
-        ),
-      ],
-    );
+''');
   }
 
   test_typeParameters_topLevelFunction() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 void f<T, T>() {}
-''',
-      [
-        error(
-          diag.duplicateDefinition,
-          10,
-          1,
-          contextMessages: [message(testFile, 7, 1)],
-        ),
-      ],
-    );
+//     ^
+// [context 1] The first definition of this name.
+//        ^
+// [diag.duplicateDefinition][context 1] The name 'T' is already defined.
+''');
   }
 
   test_typeParameters_topLevelFunction_wildcard() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 void f<_, _>() {}
 ''');
   }
 
   test_typeParameters_topLevelFunction_wildcard_preWildcards() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 // @dart = 3.4
 // (pre wildcard-variables)
 
 void f<_, _>() {}
-''',
-      [
-        error(
-          diag.duplicateDefinition,
-          54,
-          1,
-          contextMessages: [message(testFile, 51, 1)],
-        ),
-      ],
-    );
+//     ^
+// [context 1] The first definition of this name.
+//        ^
+// [diag.duplicateDefinition][context 1] The name '_' is already defined.
+''');
   }
 }
 
 @reflectiveTest
 class DuplicateDefinitionUnitTest extends PubPackageResolutionTest {
   test_class() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics('''
 class A {}
+//    ^
+// [context 1] The first definition of this name.
 class B {}
 class A {}
-''',
-      [
-        error(
-          diag.duplicateDefinition,
-          28,
-          1,
-          contextMessages: [message(testFile, 6, 1)],
-        ),
-      ],
-    );
+//    ^
+// [diag.duplicateDefinition][context 1] The name 'A' is already defined.
+''');
   }
 
   @SkippedTest() // TODO(scheglov): implement augmentation
@@ -5236,21 +3922,15 @@
   }
 
   test_extension() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics('''
 extension A on int {}
+//        ^
+// [context 1] The first definition of this name.
 extension B on int {}
 extension A on int {}
-''',
-      [
-        error(
-          diag.duplicateDefinition,
-          54,
-          1,
-          contextMessages: [message(testFile, 10, 1)],
-        ),
-      ],
-    );
+//        ^
+// [diag.duplicateDefinition][context 1] The name 'A' is already defined.
+''');
   }
 
   test_extension_library_part() async {
@@ -5282,21 +3962,15 @@
   }
 
   test_extensionType() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics('''
 extension type A(int it) {}
+//             ^
+// [context 1] The first definition of this name.
 extension type B(int it) {}
 extension type A(int it) {}
-''',
-      [
-        error(
-          diag.duplicateDefinition,
-          71,
-          1,
-          contextMessages: [message(testFile, 15, 1)],
-        ),
-      ],
-    );
+//             ^
+// [diag.duplicateDefinition][context 1] The name 'A' is already defined.
+''');
   }
 
   test_extensionType_library_part() async {
@@ -5328,21 +4002,15 @@
   }
 
   test_mixin() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics('''
 mixin A {}
+//    ^
+// [context 1] The first definition of this name.
 mixin B {}
 mixin A {}
-''',
-      [
-        error(
-          diag.duplicateDefinition,
-          28,
-          1,
-          contextMessages: [message(testFile, 6, 1)],
-        ),
-      ],
-    );
+//    ^
+// [diag.duplicateDefinition][context 1] The name 'A' is already defined.
+''');
   }
 
   @SkippedTest() // TODO(scheglov): implement augmentation
@@ -5395,20 +4063,14 @@
   }
 
   test_typedef_interfaceType() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics('''
 typedef A = List<int>;
+//      ^
+// [context 1] The first definition of this name.
 typedef A = List<int>;
-''',
-      [
-        error(
-          diag.duplicateDefinition,
-          31,
-          1,
-          contextMessages: [message(testFile, 8, 1)],
-        ),
-      ],
-    );
+//      ^
+// [diag.duplicateDefinition][context 1] The name 'A' is already defined.
+''');
   }
 
   @SkippedTest() // TODO(scheglov): implement augmentation
diff --git a/pkg/analyzer/test/src/diagnostics/duplicate_field_formal_parameter_test.dart b/pkg/analyzer/test/src/diagnostics/duplicate_field_formal_parameter_test.dart
index d84f7f9..3bd8c65 100644
--- a/pkg/analyzer/test/src/diagnostics/duplicate_field_formal_parameter_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/duplicate_field_formal_parameter_test.dart
@@ -2,7 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/src/diagnostic/diagnostic.dart' as diag;
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../dart/resolution/context_collection_resolution.dart';
@@ -16,473 +15,347 @@
 @reflectiveTest
 class DuplicateFieldFormalParameterTest extends PubPackageResolutionTest {
   test_constructor_optional_named() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   int a;
   A({this.a = 0, this.a = 1});
+//        ^
+// [context 1] The first definition of this name.
+//                    ^
+// [diag.duplicateFieldFormalParameter][context 1] The field 'a' can't be initialized by multiple parameters in the same constructor.
 }
-''',
-      [
-        error(
-          diag.duplicateFieldFormalParameter,
-          41,
-          1,
-          contextMessages: [message(testFile, 29, 1)],
-        ),
-      ],
-    );
+''');
   }
 
   test_constructor_optional_named_wildcard() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   int _;
+//    ^
+// [diag.unusedField] The value of the field '_' isn't used.
   A({this._ = 0, this._ = 1});
+//        ^
+// [context 1] The first definition of this name.
+// [diag.privateNamedParameterWithoutPublicName] A private named parameter must be a public identifier after removing the leading underscore.
+//                    ^
+// [diag.duplicateFieldFormalParameter][context 1] The field '_' can't be initialized by multiple parameters in the same constructor.
+// [diag.privateNamedParameterWithoutPublicName] A private named parameter must be a public identifier after removing the leading underscore.
 }
-''',
-      [
-        error(diag.unusedField, 16, 1),
-        error(diag.privateNamedParameterWithoutPublicName, 29, 1),
-        error(
-          diag.duplicateFieldFormalParameter,
-          41,
-          1,
-          contextMessages: [message(testFile, 29, 1)],
-        ),
-        error(diag.privateNamedParameterWithoutPublicName, 41, 1),
-      ],
-    );
+''');
   }
 
   test_constructor_optional_named_wildcard_preWildcards() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 // @dart = 3.4
 // (pre wildcard-variables)
 
 class A {
   int _;
+//    ^
+// [diag.unusedField] The value of the field '_' isn't used.
   A({this._ = 0, this._ = 1});
+//        ^
+// [context 1] The first definition of this name.
+// [diag.experimentNotEnabled] This requires the 'private-named-parameters' language feature to be enabled.
+//                    ^
+// [diag.duplicateFieldFormalParameter][context 1] The field '_' can't be initialized by multiple parameters in the same constructor.
+// [diag.experimentNotEnabled] This requires the 'private-named-parameters' language feature to be enabled.
 }
-''',
-      [
-        error(diag.unusedField, 60, 1),
-        error(diag.experimentNotEnabled, 73, 1),
-        error(diag.experimentNotEnabled, 85, 1),
-        error(
-          diag.duplicateFieldFormalParameter,
-          85,
-          1,
-          contextMessages: [message(testFile, 73, 1)],
-        ),
-      ],
-    );
+''');
   }
 
   test_constructor_optional_positional() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   int a;
   A([this.a = 0, this.a = 1]);
+//        ^
+// [context 1] The first definition of this name.
+//                    ^
+// [diag.duplicateFieldFormalParameter][context 1] The field 'a' can't be initialized by multiple parameters in the same constructor.
 }
-''',
-      [
-        error(
-          diag.duplicateFieldFormalParameter,
-          41,
-          1,
-          contextMessages: [message(testFile, 29, 1)],
-        ),
-      ],
-    );
+''');
   }
 
   test_constructor_optional_positional_final() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   final x;
   A([this.x = 1, this.x = 2]) {}
+//        ^
+// [context 1] The first definition of this name.
+//                    ^
+// [diag.duplicateFieldFormalParameter][context 1] The field 'x' can't be initialized by multiple parameters in the same constructor.
 }
-''',
-      [
-        error(
-          diag.duplicateFieldFormalParameter,
-          43,
-          1,
-          contextMessages: [message(testFile, 31, 1)],
-        ),
-      ],
-    );
+''');
   }
 
   test_constructor_optional_positional_final_wildcard() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   final _;
+//      ^
+// [diag.unusedField] The value of the field '_' isn't used.
   A([this._ = 1, this._ = 2]) {}
+//        ^
+// [context 1] The first definition of this name.
+//                    ^
+// [diag.duplicateFieldFormalParameter][context 1] The field '_' can't be initialized by multiple parameters in the same constructor.
 }
-''',
-      [
-        error(diag.unusedField, 18, 1),
-        error(
-          diag.duplicateFieldFormalParameter,
-          43,
-          1,
-          contextMessages: [message(testFile, 31, 1)],
-        ),
-      ],
-    );
+''');
   }
 
   test_constructor_optional_positional_final_wildcard_preWildcards() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 // @dart = 3.4
 // (pre wildcard-variables)
 
 class A {
   final _;
+//      ^
+// [diag.unusedField] The value of the field '_' isn't used.
   A([this._ = 1, this._ = 2]) {}
+//        ^
+// [context 1] The first definition of this name.
+//                    ^
+// [diag.duplicateFieldFormalParameter][context 1] The field '_' can't be initialized by multiple parameters in the same constructor.
 }
-''',
-      [
-        error(diag.unusedField, 62, 1),
-        error(
-          diag.duplicateFieldFormalParameter,
-          87,
-          1,
-          contextMessages: [message(testFile, 75, 1)],
-        ),
-      ],
-    );
+''');
   }
 
   test_constructor_optional_positional_wildcard() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   int _;
+//    ^
+// [diag.unusedField] The value of the field '_' isn't used.
   A([this._ = 0, this._ = 1]);
+//        ^
+// [context 1] The first definition of this name.
+//                    ^
+// [diag.duplicateFieldFormalParameter][context 1] The field '_' can't be initialized by multiple parameters in the same constructor.
 }
-''',
-      [
-        error(diag.unusedField, 16, 1),
-        error(
-          diag.duplicateFieldFormalParameter,
-          41,
-          1,
-          contextMessages: [message(testFile, 29, 1)],
-        ),
-      ],
-    );
+''');
   }
 
   test_constructor_optional_positional_wildcard_preWildcards() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 // @dart = 3.4
 // (pre wildcard-variables)
 
 class A {
   int _;
+//    ^
+// [diag.unusedField] The value of the field '_' isn't used.
   A([this._ = 0, this._ = 1]);
+//        ^
+// [context 1] The first definition of this name.
+//                    ^
+// [diag.duplicateFieldFormalParameter][context 1] The field '_' can't be initialized by multiple parameters in the same constructor.
 }
-''',
-      [
-        error(diag.unusedField, 60, 1),
-        error(
-          diag.duplicateFieldFormalParameter,
-          85,
-          1,
-          contextMessages: [message(testFile, 73, 1)],
-        ),
-      ],
-    );
+''');
   }
 
   test_constructor_required_named() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   int a;
   A({required this.a, required this.a});
+//                 ^
+// [context 1] The first definition of this name.
+//                                  ^
+// [diag.duplicateFieldFormalParameter][context 1] The field 'a' can't be initialized by multiple parameters in the same constructor.
 }
-''',
-      [
-        error(
-          diag.duplicateFieldFormalParameter,
-          55,
-          1,
-          contextMessages: [message(testFile, 38, 1)],
-        ),
-      ],
-    );
+''');
   }
 
   test_constructor_required_named_wildcard() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   int _;
+//    ^
+// [diag.unusedField] The value of the field '_' isn't used.
   A({required this._, required this._});
+//                 ^
+// [context 1] The first definition of this name.
+// [diag.privateNamedParameterWithoutPublicName] A private named parameter must be a public identifier after removing the leading underscore.
+//                                  ^
+// [diag.duplicateFieldFormalParameter][context 1] The field '_' can't be initialized by multiple parameters in the same constructor.
+// [diag.privateNamedParameterWithoutPublicName] A private named parameter must be a public identifier after removing the leading underscore.
 }
-''',
-      [
-        error(diag.unusedField, 16, 1),
-        error(diag.privateNamedParameterWithoutPublicName, 38, 1),
-        error(
-          diag.duplicateFieldFormalParameter,
-          55,
-          1,
-          contextMessages: [message(testFile, 38, 1)],
-        ),
-        error(diag.privateNamedParameterWithoutPublicName, 55, 1),
-      ],
-    );
+''');
   }
 
   test_constructor_required_named_wildcard_preWildcards() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 // @dart = 3.4
 // (pre wildcard-variables)
 
 class A {
   int _;
+//    ^
+// [diag.unusedField] The value of the field '_' isn't used.
   A({required this._, required this._});
+//                 ^
+// [context 1] The first definition of this name.
+// [diag.experimentNotEnabled] This requires the 'private-named-parameters' language feature to be enabled.
+//                                  ^
+// [diag.duplicateFieldFormalParameter][context 1] The field '_' can't be initialized by multiple parameters in the same constructor.
+// [diag.experimentNotEnabled] This requires the 'private-named-parameters' language feature to be enabled.
 }
-''',
-      [
-        error(diag.unusedField, 60, 1),
-        error(diag.experimentNotEnabled, 82, 1),
-        error(diag.experimentNotEnabled, 99, 1),
-        error(
-          diag.duplicateFieldFormalParameter,
-          99,
-          1,
-          contextMessages: [message(testFile, 82, 1)],
-        ),
-      ],
-    );
+''');
   }
 
   test_constructor_required_positional() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   int a;
   A(this.a, this.a);
+//       ^
+// [context 1] The first definition of this name.
+//               ^
+// [diag.duplicateFieldFormalParameter][context 1] The field 'a' can't be initialized by multiple parameters in the same constructor.
 }
-''',
-      [
-        error(
-          diag.duplicateFieldFormalParameter,
-          36,
-          1,
-          contextMessages: [message(testFile, 28, 1)],
-        ),
-      ],
-    );
+''');
   }
 
   test_constructor_required_positional_final() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   final x;
   A(this.x, this.x) {}
+//       ^
+// [context 1] The first definition of this name.
+//               ^
+// [diag.duplicateFieldFormalParameter][context 1] The field 'x' can't be initialized by multiple parameters in the same constructor.
 }
-''',
-      [
-        error(
-          diag.duplicateFieldFormalParameter,
-          38,
-          1,
-          contextMessages: [message(testFile, 30, 1)],
-        ),
-      ],
-    );
+''');
   }
 
   test_constructor_required_positional_final_wildcard() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   final _;
+//      ^
+// [diag.unusedField] The value of the field '_' isn't used.
   A(this._, this._) {}
+//       ^
+// [context 1] The first definition of this name.
+//               ^
+// [diag.duplicateFieldFormalParameter][context 1] The field '_' can't be initialized by multiple parameters in the same constructor.
 }
-''',
-      [
-        error(diag.unusedField, 18, 1),
-        error(
-          diag.duplicateFieldFormalParameter,
-          38,
-          1,
-          contextMessages: [message(testFile, 30, 1)],
-        ),
-      ],
-    );
+''');
   }
 
   test_constructor_required_positional_final_wildcard_preWildcards() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 // @dart = 3.4
 // (pre wildcard-variables)
 
 class A {
   final _;
+//      ^
+// [diag.unusedField] The value of the field '_' isn't used.
   A(this._, this._) {}
+//       ^
+// [context 1] The first definition of this name.
+//               ^
+// [diag.duplicateFieldFormalParameter][context 1] The field '_' can't be initialized by multiple parameters in the same constructor.
 }
-''',
-      [
-        error(diag.unusedField, 62, 1),
-        error(
-          diag.duplicateFieldFormalParameter,
-          82,
-          1,
-          contextMessages: [message(testFile, 74, 1)],
-        ),
-      ],
-    );
+''');
   }
 
   test_constructor_required_positional_preWildcards() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 // @dart = 3.4
 // (pre wildcard-variables)
 
 class A {
   int? _;
+//     ^
+// [diag.unusedField] The value of the field '_' isn't used.
   A(this._, this._);
+//       ^
+// [context 1] The first definition of this name.
+//               ^
+// [diag.duplicateFieldFormalParameter][context 1] The field '_' can't be initialized by multiple parameters in the same constructor.
 }
-''',
-      [
-        error(diag.unusedField, 61, 1),
-        error(
-          diag.duplicateFieldFormalParameter,
-          81,
-          1,
-          contextMessages: [message(testFile, 73, 1)],
-        ),
-      ],
-    );
+''');
   }
 
   test_constructor_required_positional_primaryConstructor() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A(this.f, this.f) {
+//           ^
+// [context 1] The first definition of this name.
+//                   ^
+// [diag.duplicateFieldFormalParameter][context 1] The field 'f' can't be initialized by multiple parameters in the same constructor.
   int f;
 }
-''',
-      [
-        error(
-          diag.duplicateFieldFormalParameter,
-          21,
-          1,
-          contextMessages: [message(testFile, 13, 1)],
-        ),
-      ],
-    );
+''');
   }
 
   // TODO(pq): add more tests (https://github.com/dart-lang/sdk/issues/56092)
   test_constructor_required_positional_wildcard() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   int? _;
+//     ^
+// [diag.unusedField] The value of the field '_' isn't used.
   A(this._, this._);
+//       ^
+// [context 1] The first definition of this name.
+//               ^
+// [diag.duplicateFieldFormalParameter][context 1] The field '_' can't be initialized by multiple parameters in the same constructor.
 }
-''',
-      [
-        error(diag.unusedField, 17, 1),
-        error(
-          diag.duplicateFieldFormalParameter,
-          37,
-          1,
-          contextMessages: [message(testFile, 29, 1)],
-        ),
-      ],
-    );
+''');
   }
 
   test_primaryConstructor_optional_named() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A({this.a = 0, this.a = 1}) {
+//            ^
+// [context 1] The first definition of this name.
+//                        ^
+// [diag.duplicateFieldFormalParameter][context 1] The field 'a' can't be initialized by multiple parameters in the same constructor.
   int a;
 }
-''',
-      [
-        error(
-          diag.duplicateFieldFormalParameter,
-          26,
-          1,
-          contextMessages: [message(testFile, 14, 1)],
-        ),
-      ],
-    );
+''');
   }
 
   test_primaryConstructor_optional_positional() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A([this.a = 0, this.a = 1]) {
+//            ^
+// [context 1] The first definition of this name.
+//                        ^
+// [diag.duplicateFieldFormalParameter][context 1] The field 'a' can't be initialized by multiple parameters in the same constructor.
   int a;
 }
-''',
-      [
-        error(
-          diag.duplicateFieldFormalParameter,
-          26,
-          1,
-          contextMessages: [message(testFile, 14, 1)],
-        ),
-      ],
-    );
+''');
   }
 
   test_primaryConstructor_required_named() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A({required this.a, required this.a}) {
+//                     ^
+// [context 1] The first definition of this name.
+//                                      ^
+// [diag.duplicateFieldFormalParameter][context 1] The field 'a' can't be initialized by multiple parameters in the same constructor.
   int a;
 }
-''',
-      [
-        error(
-          diag.duplicateFieldFormalParameter,
-          40,
-          1,
-          contextMessages: [message(testFile, 23, 1)],
-        ),
-      ],
-    );
+''');
   }
 
   test_primaryConstructor_required_positional() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A(this.a, this.a) {
+//           ^
+// [context 1] The first definition of this name.
+//                   ^
+// [diag.duplicateFieldFormalParameter][context 1] The field 'a' can't be initialized by multiple parameters in the same constructor.
   int a;
 }
-''',
-      [
-        error(
-          diag.duplicateFieldFormalParameter,
-          21,
-          1,
-          contextMessages: [message(testFile, 13, 1)],
-        ),
-      ],
-    );
+''');
   }
 }
diff --git a/pkg/analyzer/test/src/diagnostics/duplicate_field_name_test.dart b/pkg/analyzer/test/src/diagnostics/duplicate_field_name_test.dart
index 63c321c..bf5ab9f 100644
--- a/pkg/analyzer/test/src/diagnostics/duplicate_field_name_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/duplicate_field_name_test.dart
@@ -2,7 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/src/diagnostic/diagnostic.dart' as diag;
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../dart/resolution/context_collection_resolution.dart';
@@ -17,23 +16,17 @@
 @reflectiveTest
 class DuplicateFieldName_RecordLiteralTest extends PubPackageResolutionTest {
   void test_duplicated() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 var r = (a: 1, a: 2);
-''',
-      [
-        error(
-          diag.duplicateFieldName,
-          15,
-          1,
-          contextMessages: [message(testFile, 9, 1)],
-        ),
-      ],
-    );
+//       ^
+// [context 1] The first 
+//             ^
+// [diag.duplicateFieldName][context 1] The field name 'a' is already used in this record.
+''');
   }
 
   void test_notDuplicated() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 var r = (a: 1, b: 2);
 ''');
   }
@@ -43,113 +36,82 @@
 class DuplicateFieldName_RecordTypeAnnotationTest
     extends PubPackageResolutionTest {
   void test_duplicated_named() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 void f(({int a, int a}) r) {}
-''',
-      [
-        error(
-          diag.duplicateFieldName,
-          20,
-          1,
-          contextMessages: [message(testFile, 13, 1)],
-        ),
-      ],
-    );
+//           ^
+// [context 1] The first 
+//                  ^
+// [diag.duplicateFieldName][context 1] The field name 'a' is already used in this record.
+''');
   }
 
   void test_duplicated_positional() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 void f((int a, int a) r) {}
-''',
-      [
-        error(
-          diag.duplicateFieldName,
-          19,
-          1,
-          contextMessages: [message(testFile, 12, 1)],
-        ),
-      ],
-    );
+//          ^
+// [context 1] The first 
+//                 ^
+// [diag.duplicateFieldName][context 1] The field name 'a' is already used in this record.
+''');
   }
 
   void test_duplicated_positionalAndNamed() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 void f((int a, {int a}) r) {}
-''',
-      [
-        error(
-          diag.duplicateFieldName,
-          20,
-          1,
-          contextMessages: [message(testFile, 12, 1)],
-        ),
-      ],
-    );
+//          ^
+// [context 1] The first 
+//                  ^
+// [diag.duplicateFieldName][context 1] The field name 'a' is already used in this record.
+''');
   }
 
   void test_duplicated_wildcard_named() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 void f(({int _, int _}) r) {}
-''',
-      [
-        // Only positional wildcard fields can be duplicated.
-        error(diag.invalidFieldNamePrivate, 13, 1),
-        error(
-          diag.duplicateFieldName,
-          20,
-          1,
-          contextMessages: [message(testFile, 13, 1)],
-        ),
-        error(diag.invalidFieldNamePrivate, 20, 1),
-      ],
-    );
+//           ^
+// [context 1] The first 
+// [diag.invalidFieldNamePrivate] Record field names can't be private.
+//                  ^
+// [diag.duplicateFieldName][context 1] The field name '_' is already used in this record.
+// [diag.invalidFieldNamePrivate] Record field names can't be private.
+''');
   }
 
   void test_duplicated_wildcard_positional() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 void f((int _, int _) r) {}
 ''');
   }
 
   void test_duplicated_wildcard_positional_preWildcards() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 // @dart = 3.4
 // (pre wildcard-variables)
 
 void f((int _, int _) r) {}
-''',
-      [
-        error(diag.invalidFieldNamePrivate, 56, 1),
-        error(
-          diag.duplicateFieldName,
-          63,
-          1,
-          contextMessages: [message(testFile, 56, 1)],
-        ),
-        error(diag.invalidFieldNamePrivate, 63, 1),
-      ],
-    );
+//          ^
+// [context 1] The first 
+// [diag.invalidFieldNamePrivate] Record field names can't be private.
+//                 ^
+// [diag.duplicateFieldName][context 1] The field name '_' is already used in this record.
+// [diag.invalidFieldNamePrivate] Record field names can't be private.
+''');
   }
 
   void test_notDuplicated_named() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 void f(({int a, int b}) r) {}
 ''');
   }
 
   void test_notDuplicated_positional() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 void f((int a, int b) r) {}
 ''');
   }
 
   void test_notDuplicated_positionalAndNamed() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 void f((int a, {int b}) r) {}
 ''');
   }
diff --git a/pkg/analyzer/test/src/diagnostics/duplicate_hidden_name_test.dart b/pkg/analyzer/test/src/diagnostics/duplicate_hidden_name_test.dart
index f4abb94..795af55 100644
--- a/pkg/analyzer/test/src/diagnostics/duplicate_hidden_name_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/duplicate_hidden_name_test.dart
@@ -20,12 +20,11 @@
 class A {}
 class B {}
 ''');
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 export 'lib1.dart' hide A, B, A;
-''',
-      [error(diag.duplicateHiddenName, 30, 1)],
-    );
+//                            ^
+// [diag.duplicateHiddenName] Duplicate hidden name.
+''');
   }
 
   test_part_hidden() async {
diff --git a/pkg/analyzer/test/src/diagnostics/duplicate_ignore_test.dart b/pkg/analyzer/test/src/diagnostics/duplicate_ignore_test.dart
index 2570dda..0543da6 100644
--- a/pkg/analyzer/test/src/diagnostics/duplicate_ignore_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/duplicate_ignore_test.dart
@@ -2,7 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/src/diagnostic/diagnostic.dart' as diag;
 import 'package:analyzer_testing/utilities/utilities.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
@@ -28,72 +27,70 @@
   }
 
   test_name_file() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 // ignore_for_file: unused_local_variable, unused_local_variable
+//                                         ^^^^^^^^^^^^^^^^^^^^^
+// [diag.duplicateIgnore] The diagnostic 'unused_local_variable' doesn't need to be ignored here because it's already being ignored.
 void f() {
   var x = 0;
 }
-''',
-      [error(diag.duplicateIgnore, 43, 21)],
-    );
+''');
   }
 
   test_name_line() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 void f() {
   // ignore: unused_local_variable, unused_local_variable
+//                                  ^^^^^^^^^^^^^^^^^^^^^
+// [diag.duplicateIgnore] The diagnostic 'unused_local_variable' doesn't need to be ignored here because it's already being ignored.
   var x = 0;
+//    ^
+// [diag.unusedLocalVariable] The value of the local variable 'x' isn't used.
 }
-''',
-      [error(diag.duplicateIgnore, 47, 21)],
-    );
+''');
   }
 
   test_name_lineAndFile() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 // ignore_for_file: unused_local_variable
 void f() {
   // ignore: unused_local_variable
+//           ^^^^^^^^^^^^^^^^^^^^^
+// [diag.duplicateIgnore] The diagnostic 'unused_local_variable' doesn't need to be ignored here because it's already being ignored.
   var x = 0;
 }
-''',
-      [error(diag.duplicateIgnore, 66, 21)],
-    );
+''');
   }
 
   test_type_file() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 // ignore_for_file: type=lint, TYPE=LINT
+//                             ^^^^^^^^^
+// [diag.duplicateIgnore] The diagnostic 'lint' doesn't need to be ignored here because it's already being ignored.
 void f(arg1(int)) {} // AVOID_TYPES_AS_PARAMETER_NAMES
-''',
-      [error(diag.duplicateIgnore, 31, 9)],
-    );
+''');
   }
 
   test_type_line() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 void f() {}
 // ignore: type=lint, TYPE=LINT
+//                    ^^^^^^^^^
+// [diag.duplicateIgnore] The diagnostic 'lint' doesn't need to be ignored here because it's already being ignored.
 void g(arg1(int)) {} // AVOID_TYPES_AS_PARAMETER_NAMES
-''',
-      [error(diag.duplicateIgnore, 34, 9)],
-    );
+//          ^^^
+// [diag.avoidTypesAsParameterNamesFormalParameter] The parameter name 'int' matches a visible type name.
+''');
   }
 
   test_type_lineAndFile() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 // ignore_for_file: type=lint
 void f() {}
 // ignore: type=lint
+//         ^^^^^^^^^
+// [diag.duplicateIgnore] The diagnostic 'lint' doesn't need to be ignored here because it's already being ignored.
 void g(arg1(int)) {} // AVOID_TYPES_AS_PARAMETER_NAMES
-''',
-      [error(diag.duplicateIgnore, 53, 9)],
-    );
+''');
   }
 }
diff --git a/pkg/analyzer/test/src/diagnostics/duplicate_import_test.dart b/pkg/analyzer/test/src/diagnostics/duplicate_import_test.dart
index 3d739c7..e9fdd6f 100644
--- a/pkg/analyzer/test/src/diagnostics/duplicate_import_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/duplicate_import_test.dart
@@ -21,13 +21,12 @@
 class A {}
 class B {}
 ''');
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 export 'lib1.dart';
 export 'lib1.dart';
-''',
-      [error(diag.duplicateExport, 27, 11)],
-    );
+//     ^^^^^^^^^^^
+// [diag.duplicateExport] Duplicate export.
+''');
   }
 
   test_library_duplicateExport_differentShow() async {
@@ -35,7 +34,7 @@
 class A {}
 class B {}
 ''');
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 export 'lib1.dart' show A;
 export 'lib1.dart' show B;
 ''');
@@ -46,13 +45,12 @@
 class A {}
 class B {}
 ''');
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 export 'lib1.dart' show A;
 export 'lib1.dart' show A;
-''',
-      [error(diag.duplicateExport, 34, 11)],
-    );
+//     ^^^^^^^^^^^
+// [diag.duplicateExport] Duplicate export.
+''');
   }
 
   test_part_duplicateExport() async {
@@ -79,15 +77,14 @@
 class A {}
 ''');
 
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'package:test/a.dart';
 import 'package:test/a.dart';
+//     ^^^^^^^^^^^^^^^^^^^^^
+// [diag.duplicateImport] Duplicate import.
 
 final a = A();
-''',
-      [error(diag.duplicateImport, 37, 21)],
-    );
+''');
   }
 
   test_library_duplicateImport_relative_absolute() async {
@@ -95,15 +92,14 @@
 class A {}
 ''');
 
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'a.dart';
 import 'package:test/a.dart';
+//     ^^^^^^^^^^^^^^^^^^^^^
+// [diag.duplicateImport] Duplicate import.
 
 final a = A();
-''',
-      [error(diag.duplicateImport, 24, 21)],
-    );
+''');
   }
 
   test_library_duplicateImport_relative_relative() async {
@@ -111,15 +107,14 @@
 class A {}
 ''');
 
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'a.dart';
 import 'a.dart';
+//     ^^^^^^^^
+// [diag.duplicateImport] Duplicate import.
 
 final a = A();
-''',
-      [error(diag.duplicateImport, 24, 8)],
-    );
+''');
   }
 
   test_library_importsHaveIdenticalShowHide() async {
diff --git a/pkg/analyzer/test/src/diagnostics/duplicate_named_argument_test.dart b/pkg/analyzer/test/src/diagnostics/duplicate_named_argument_test.dart
index 8a36ddb..b68041e 100644
--- a/pkg/analyzer/test/src/diagnostics/duplicate_named_argument_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/duplicate_named_argument_test.dart
@@ -2,7 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/src/diagnostic/diagnostic.dart' as diag;
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../dart/resolution/context_collection_resolution.dart';
@@ -16,70 +15,65 @@
 @reflectiveTest
 class DuplicateNamedArgumentTest extends PubPackageResolutionTest {
   test_constructor() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class C {
   C({int? a, int? b});
 }
 main() {
   C(a: 1, a: 2);
+//        ^
+// [diag.duplicateNamedArgument] The argument for the named parameter 'a' was already specified.
 }
-''',
-      [error(diag.duplicateNamedArgument, 54, 1)],
-    );
+''');
   }
 
   test_constructor_nonFunctionTypedef() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class C {
   C({int? a, int? b});
 }
 typedef D = C;
 main() {
   D(a: 1, a: 2);
+//        ^
+// [diag.duplicateNamedArgument] The argument for the named parameter 'a' was already specified.
 }
-''',
-      [error(diag.duplicateNamedArgument, 69, 1)],
-    );
+''');
   }
 
   test_constructor_superParameter() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   A({required int a});
 }
 
 class B extends A {
   B({required super.a}) : super(a: 0);
+//                              ^
+// [diag.duplicateNamedArgument] The argument for the named parameter 'a' was already specified.
 }
-''',
-      [error(diag.duplicateNamedArgument, 88, 1)],
-    );
+''');
   }
 
   test_enumConstant() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 enum E {
   v(a: 0, a: 1);
+//        ^
+// [diag.duplicateNamedArgument] The argument for the named parameter 'a' was already specified.
   const E({required int a});
 }
-''',
-      [error(diag.duplicateNamedArgument, 19, 1)],
-    );
+''');
   }
 
   test_function() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 f({a, b}) {}
 main() {
   f(a: 1, a: 2);
+//        ^
+// [diag.duplicateNamedArgument] The argument for the named parameter 'a' was already specified.
 }
-''',
-      [error(diag.duplicateNamedArgument, 32, 1)],
-    );
+''');
   }
 }
diff --git a/pkg/analyzer/test/src/diagnostics/duplicate_part_test.dart b/pkg/analyzer/test/src/diagnostics/duplicate_part_test.dart
index c4a9930..74b0c5d 100644
--- a/pkg/analyzer/test/src/diagnostics/duplicate_part_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/duplicate_part_test.dart
@@ -20,13 +20,12 @@
 part of 'test.dart';
 ''');
 
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 part 'part.dart';
 part 'foo/../part.dart';
-''',
-      [error(diag.duplicatePart, 23, 18)],
-    );
+//   ^^^^^^^^^^^^^^^^^^
+// [diag.duplicatePart] The library already contains a part with the URI 'package:test/part.dart'.
+''');
   }
 
   test_library_sameUri() async {
@@ -34,13 +33,12 @@
 part of 'test.dart';
 ''');
 
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 part 'part.dart';
 part 'part.dart';
-''',
-      [error(diag.duplicatePart, 23, 11)],
-    );
+//   ^^^^^^^^^^^
+// [diag.duplicatePart] The library already contains a part with the URI 'package:test/part.dart'.
+''');
   }
 
   test_no_duplicates() async {
@@ -52,7 +50,7 @@
 part of 'test.dart';
 ''');
 
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 part 'part1.dart';
 part 'part2.dart';
 ''');
diff --git a/pkg/analyzer/test/src/diagnostics/duplicate_pattern_assignment_variable_test.dart b/pkg/analyzer/test/src/diagnostics/duplicate_pattern_assignment_variable_test.dart
index 49ebaf6..9dfd17e 100644
--- a/pkg/analyzer/test/src/diagnostics/duplicate_pattern_assignment_variable_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/duplicate_pattern_assignment_variable_test.dart
@@ -2,7 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/src/diagnostic/diagnostic.dart' as diag;
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../dart/resolution/context_collection_resolution.dart';
@@ -16,73 +15,52 @@
 @reflectiveTest
 class DuplicatePatternAssignmentVariableTest extends PubPackageResolutionTest {
   test_nested() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 void f() {
   int a;
   (a && int(sign: a)) = 0;
+// ^
+// [context 1] The first assigned variable pattern.
+//                ^
+// [diag.duplicatePatternAssignmentVariable][context 1] The variable 'a' is already assigned in this pattern.
   a;
 }
-''',
-      [
-        error(
-          diag.duplicatePatternAssignmentVariable,
-          38,
-          1,
-          contextMessages: [message(testFile, 23, 1)],
-        ),
-      ],
-    );
+''');
   }
 
   test_record_2() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 void f() {
   int a;
   (a, a) = (1, 2);
+// ^
+// [context 1] The first assigned variable pattern.
+//    ^
+// [diag.duplicatePatternAssignmentVariable][context 1] The variable 'a' is already assigned in this pattern.
   a;
 }
-''',
-      [
-        error(
-          diag.duplicatePatternAssignmentVariable,
-          26,
-          1,
-          contextMessages: [message(testFile, 23, 1)],
-        ),
-      ],
-    );
+''');
   }
 
   test_record_3() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 void f() {
   int a;
   (a, a, a) = (1, 2, 3);
+// ^
+// [context 1] The first assigned variable pattern.
+// [context 2] The first assigned variable pattern.
+//    ^
+// [diag.duplicatePatternAssignmentVariable][context 1] The variable 'a' is already assigned in this pattern.
+//       ^
+// [diag.duplicatePatternAssignmentVariable][context 2] The variable 'a' is already assigned in this pattern.
   a;
 }
-''',
-      [
-        error(
-          diag.duplicatePatternAssignmentVariable,
-          26,
-          1,
-          contextMessages: [message(testFile, 23, 1)],
-        ),
-        error(
-          diag.duplicatePatternAssignmentVariable,
-          29,
-          1,
-          contextMessages: [message(testFile, 23, 1)],
-        ),
-      ],
-    );
+''');
   }
 
   test_separate() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 void f() {
   int a;
   (a) = 1;
diff --git a/pkg/analyzer/test/src/diagnostics/duplicate_pattern_field_test.dart b/pkg/analyzer/test/src/diagnostics/duplicate_pattern_field_test.dart
index eb570f3..7980fb3 100644
--- a/pkg/analyzer/test/src/diagnostics/duplicate_pattern_field_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/duplicate_pattern_field_test.dart
@@ -2,7 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/src/diagnostic/diagnostic.dart' as diag;
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../dart/resolution/context_collection_resolution.dart';
@@ -16,130 +15,96 @@
 @reflectiveTest
 class DuplicatePatternFieldTest extends PubPackageResolutionTest {
   test_objectPattern() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 void f(Object? x) {
   switch (x) {
     case int(sign: 0, sign: 1):
+//           ^^^^
+// [context 1] The first field.
+//                    ^^^^
+// [diag.duplicatePatternField][context 1] The field 'sign' is already matched in this pattern.
       break;
   }
 }
-''',
-      [
-        error(
-          diag.duplicatePatternField,
-          57,
-          4,
-          contextMessages: [message(testFile, 48, 4)],
-        ),
-      ],
-    );
+''');
   }
 
   test_recordPattern_dynamicType() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 void f(x) {
   switch (x) {
     case (foo: 0, foo: 1):
+//        ^^^
+// [context 1] The first field.
+//                ^^^
+// [diag.duplicatePatternField][context 1] The field 'foo' is already matched in this pattern.
       break;
   }
 }
-''',
-      [
-        error(
-          diag.duplicatePatternField,
-          45,
-          3,
-          contextMessages: [message(testFile, 37, 3)],
-        ),
-      ],
-    );
+''');
   }
 
   test_recordPattern_dynamicType_implicitName_duplicate() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 void f(x) {
   switch (x) {
     case (foo: 0, :var foo):
+//        ^^^
+// [context 1] The first field.
+//                ^
+// [diag.duplicatePatternField][context 1] The field 'foo' is already matched in this pattern.
+//                     ^^^
+// [diag.unusedLocalVariable] The value of the local variable 'foo' isn't used.
       break;
   }
 }
-''',
-      [
-        error(
-          diag.duplicatePatternField,
-          45,
-          1,
-          contextMessages: [message(testFile, 37, 3)],
-        ),
-        error(diag.unusedLocalVariable, 50, 3),
-      ],
-    );
+''');
   }
 
   test_recordPattern_dynamicType_implicitName_original() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 void f(x) {
   switch (x) {
     case (:var foo, foo: 1):
+//        ^
+// [context 1] The first field.
+//             ^^^
+// [diag.unusedLocalVariable] The value of the local variable 'foo' isn't used.
+//                  ^^^
+// [diag.duplicatePatternField][context 1] The field 'foo' is already matched in this pattern.
       break;
   }
 }
-''',
-      [
-        error(diag.unusedLocalVariable, 42, 3),
-        error(
-          diag.duplicatePatternField,
-          47,
-          3,
-          contextMessages: [message(testFile, 37, 1)],
-        ),
-      ],
-    );
+''');
   }
 
   test_recordPattern_interfaceType() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 void f(Object? x) {
   switch (x) {
     case (foo: 0, foo: 1):
+//        ^^^
+// [context 1] The first field.
+//                ^^^
+// [diag.duplicatePatternField][context 1] The field 'foo' is already matched in this pattern.
       break;
   }
 }
-''',
-      [
-        error(
-          diag.duplicatePatternField,
-          53,
-          3,
-          contextMessages: [message(testFile, 45, 3)],
-        ),
-      ],
-    );
+''');
   }
 
   test_recordPattern_recordType() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 void f(({int foo}) x) {
   switch (x) {
     case (foo: 0, foo: 1):
+//        ^^^
+// [context 1] The first field.
+//                ^^^
+// [diag.duplicatePatternField][context 1] The field 'foo' is already matched in this pattern.
       break;
   }
 }
-''',
-      [
-        error(
-          diag.duplicatePatternField,
-          57,
-          3,
-          contextMessages: [message(testFile, 49, 3)],
-        ),
-      ],
-    );
+''');
   }
 }
diff --git a/pkg/analyzer/test/src/diagnostics/duplicate_private_named_parameter_test.dart b/pkg/analyzer/test/src/diagnostics/duplicate_private_named_parameter_test.dart
index 926e50f7..feab9f5 100644
--- a/pkg/analyzer/test/src/diagnostics/duplicate_private_named_parameter_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/duplicate_private_named_parameter_test.dart
@@ -2,7 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/src/diagnostic/diagnostic.dart' as diag;
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../dart/resolution/context_collection_resolution.dart';
@@ -16,165 +15,125 @@
 @reflectiveTest
 class DuplicatePrivateNamedParameterTest extends PubPackageResolutionTest {
   test_initializingFormal_initializingFormal() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class C {
   final String? _foo;
+//              ^^^^
+// [diag.unusedField] The value of the field '_foo' isn't used.
   C({required this._foo, required this._foo}) {}
+//                 ^^^^
+// [context 1] The first definition of this name.
+//                                     ^^^^
+// [diag.duplicateFieldFormalParameter][context 1] The field '_foo' can't be initialized by multiple parameters in the same constructor.
 }
-''',
-      [
-        error(diag.unusedField, 26, 4),
-        error(
-          diag.duplicateFieldFormalParameter,
-          71,
-          4,
-          contextMessages: [message(testFile, 51, 4)],
-        ),
-      ],
-    );
+''');
   }
 
   test_initializingFormal_privateNamed() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class C {
   final String? _foo;
+//              ^^^^
+// [diag.unusedField] The value of the field '_foo' isn't used.
   C({required this._foo, String? _foo}) {}
+//                 ^^^^
+// [context 1] The first definition of this name.
+//                               ^^^^
+// [diag.duplicateDefinition][context 1] The name '_foo' is already defined.
+// [diag.privateNamedNonFieldParameter] Named parameters that don't refer to instance variables can't start with underscore.
 }
-''',
-      [
-        error(diag.unusedField, 26, 4),
-        error(diag.privateNamedNonFieldParameter, 65, 4),
-        error(
-          diag.duplicateDefinition,
-          65,
-          4,
-          contextMessages: [message(testFile, 51, 4)],
-        ),
-      ],
-    );
+''');
   }
 
   test_initializingFormal_publicNamed() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class C {
   final String? _foo;
+//              ^^^^
+// [diag.unusedField] The value of the field '_foo' isn't used.
   C({required this._foo, String? foo}) {}
+//                 ^^^^
+// [diag.privateNamedParameterDuplicatePublicName][context 1] The corresponding public name 'foo' is already the name of another parameter.
+//                               ^^^
+// [context 1] The first definition of this name.
 }
-''',
-      [
-        error(diag.unusedField, 26, 4),
-        error(
-          diag.privateNamedParameterDuplicatePublicName,
-          51,
-          4,
-          contextMessages: [message(testFile, 65, 3)],
-        ),
-      ],
-    );
+''');
   }
 
   test_privateNamed_initializingFormal() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class C {
   final String? _foo;
+//              ^^^^
+// [diag.unusedField] The value of the field '_foo' isn't used.
   C({String? _foo, required this._foo}) {}
+//           ^^^^
+// [context 1] The first definition of this name.
+// [diag.privateNamedNonFieldParameter] Named parameters that don't refer to instance variables can't start with underscore.
+//                               ^^^^
+// [diag.duplicateDefinition][context 1] The name '_foo' is already defined.
 }
-''',
-      [
-        error(diag.unusedField, 26, 4),
-        error(diag.privateNamedNonFieldParameter, 45, 4),
-        error(
-          diag.duplicateDefinition,
-          65,
-          4,
-          contextMessages: [message(testFile, 45, 4)],
-        ),
-      ],
-    );
+''');
   }
 
   test_privatePositional_initializingFormal() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class C {
   final String? _foo;
+//              ^^^^
+// [diag.unusedField] The value of the field '_foo' isn't used.
   C(String _foo, {required this._foo}) {}
+//         ^^^^
+// [context 1] The first definition of this name.
+//                              ^^^^
+// [diag.duplicateDefinition][context 1] The name '_foo' is already defined.
 }
-''',
-      [
-        error(diag.unusedField, 26, 4),
-        error(
-          diag.duplicateDefinition,
-          64,
-          4,
-          contextMessages: [message(testFile, 43, 4)],
-        ),
-      ],
-    );
+''');
   }
 
   test_publicInitializingFormal_privateInitializingFormal() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class C {
   final String? foo;
   final String? _foo;
+//              ^^^^
+// [diag.unusedField] The value of the field '_foo' isn't used.
   C({required this.foo, required this._foo}) {}
+//                 ^^^
+// [context 1] The first definition of this name.
+//                                    ^^^^
+// [diag.privateNamedParameterDuplicatePublicName][context 1] The corresponding public name 'foo' is already the name of another parameter.
 }
-''',
-      [
-        error(diag.unusedField, 47, 4),
-        error(
-          diag.privateNamedParameterDuplicatePublicName,
-          91,
-          4,
-          contextMessages: [message(testFile, 72, 3)],
-        ),
-      ],
-    );
+''');
   }
 
   test_publicNamed_initializingFormal() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class C {
   final String? _foo;
+//              ^^^^
+// [diag.unusedField] The value of the field '_foo' isn't used.
   C({String? foo, required this._foo}) {}
+//           ^^^
+// [context 1] The first definition of this name.
+//                              ^^^^
+// [diag.privateNamedParameterDuplicatePublicName][context 1] The corresponding public name 'foo' is already the name of another parameter.
 }
-''',
-      [
-        error(diag.unusedField, 26, 4),
-        error(
-          diag.privateNamedParameterDuplicatePublicName,
-          64,
-          4,
-          contextMessages: [message(testFile, 45, 3)],
-        ),
-      ],
-    );
+''');
   }
 
   test_publicPositional_initializingFormal() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class C {
   final String? _foo;
+//              ^^^^
+// [diag.unusedField] The value of the field '_foo' isn't used.
   C(String? foo, {required this._foo}) {}
+//          ^^^
+// [context 1] The first definition of this name.
+//                              ^^^^
+// [diag.privateNamedParameterDuplicatePublicName][context 1] The corresponding public name 'foo' is already the name of another parameter.
 }
-''',
-      [
-        error(diag.unusedField, 26, 4),
-        error(
-          diag.privateNamedParameterDuplicatePublicName,
-          64,
-          4,
-          contextMessages: [message(testFile, 44, 3)],
-        ),
-      ],
-    );
+''');
   }
 }
diff --git a/pkg/analyzer/test/src/diagnostics/duplicate_rest_element_in_pattern_test.dart b/pkg/analyzer/test/src/diagnostics/duplicate_rest_element_in_pattern_test.dart
index a451e7e..64be0b3 100644
--- a/pkg/analyzer/test/src/diagnostics/duplicate_rest_element_in_pattern_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/duplicate_rest_element_in_pattern_test.dart
@@ -2,7 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/src/diagnostic/diagnostic.dart' as diag;
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../dart/resolution/context_collection_resolution.dart';
@@ -16,21 +15,15 @@
 @reflectiveTest
 class DuplicateRestElementInPatternTest extends PubPackageResolutionTest {
   test_listPattern() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 void f(List<int> x) {
   if (x case [..., ...]) {}
+//            ^^^
+// [context 1] The first rest element.
+//                 ^^^
+// [diag.duplicateRestElementInPattern][context 1] At most one rest element is allowed in a list or map pattern.
 }
-''',
-      [
-        error(
-          diag.duplicateRestElementInPattern,
-          41,
-          3,
-          contextMessages: [message(testFile, 36, 3)],
-        ),
-      ],
-    );
+''');
     var node = findNode.singleGuardedPattern.pattern;
     assertResolvedNodeText(node, r'''
 ListPattern
diff --git a/pkg/analyzer/test/src/diagnostics/duplicate_shown_name_test.dart b/pkg/analyzer/test/src/diagnostics/duplicate_shown_name_test.dart
index 9566164..874607b 100644
--- a/pkg/analyzer/test/src/diagnostics/duplicate_shown_name_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/duplicate_shown_name_test.dart
@@ -20,12 +20,11 @@
 class A {}
 class B {}
 ''');
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 export 'lib1.dart' show A, B, A;
-''',
-      [error(diag.duplicateShownName, 30, 1)],
-    );
+//                            ^
+// [diag.duplicateShownName] Duplicate shown name.
+''');
   }
 
   test_part_shown() async {
diff --git a/pkg/analyzer/test/src/diagnostics/duplicate_variable_pattern_test.dart b/pkg/analyzer/test/src/diagnostics/duplicate_variable_pattern_test.dart
index f7c98ff..48fe998 100644
--- a/pkg/analyzer/test/src/diagnostics/duplicate_variable_pattern_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/duplicate_variable_pattern_test.dart
@@ -2,7 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/src/diagnostic/diagnostic.dart' as diag;
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../dart/resolution/context_collection_resolution.dart';
@@ -16,23 +15,18 @@
 @reflectiveTest
 class DuplicateVariablePatternTest extends PubPackageResolutionTest {
   test_ifCase() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 void f(int x) {
   if (x case var a && var a) {
+//               ^
+// [context 1] The first definition of this name.
+//                        ^
+// [diag.duplicateVariablePattern][context 1] The variable 'a' is already defined in this pattern.
     a;
   }
 }
-''',
-      [
-        error(
-          diag.duplicateVariablePattern,
-          42,
-          1,
-          contextMessages: [message(testFile, 33, 1)],
-        ),
-      ],
-    );
+''');
+
     var node = findNode.singleIfStatement;
     assertResolvedNodeText(node, r'''
 IfStatement
@@ -77,24 +71,19 @@
   }
 
   test_switchStatement() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 void f(int x) {
   switch (x) {
     case var a && var a:
+//           ^
+// [context 1] The first definition of this name.
+//                    ^
+// [diag.duplicateVariablePattern][context 1] The variable 'a' is already defined in this pattern.
       a;
   }
 }
-''',
-      [
-        error(
-          diag.duplicateVariablePattern,
-          53,
-          1,
-          contextMessages: [message(testFile, 44, 1)],
-        ),
-      ],
-    );
+''');
+
     var node = findNode.singleSwitchPatternCase;
     assertResolvedNodeText(node, r'''
 SwitchPatternCase
@@ -129,22 +118,16 @@
   }
 
   test_variableDeclaration() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 void f() {
   var [a, a] = [0, 1];
+//     ^
+// [context 1] The first definition of this name.
+//        ^
+// [diag.duplicateVariablePattern][context 1] The variable 'a' is already defined in this pattern.
   a;
 }
-''',
-      [
-        error(
-          diag.duplicateVariablePattern,
-          21,
-          1,
-          contextMessages: [message(testFile, 18, 1)],
-        ),
-      ],
-    );
+''');
 
     var node = findNode.singleBlock;
     assertResolvedNodeText(node, r'''
diff --git a/pkg/analyzer/test/src/diagnostics/enum_constant_invokes_factory_constructor_test.dart b/pkg/analyzer/test/src/diagnostics/enum_constant_invokes_factory_constructor_test.dart
index a50bc63..588203b 100644
--- a/pkg/analyzer/test/src/diagnostics/enum_constant_invokes_factory_constructor_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/enum_constant_invokes_factory_constructor_test.dart
@@ -2,7 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/src/diagnostic/diagnostic.dart' as diag;
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../dart/resolution/context_collection_resolution.dart';
@@ -17,11 +16,12 @@
 class EnumConstantInvokesFactoryConstructorTest
     extends PubPackageResolutionTest {
   test_factory_named() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 enum E {
   e1,
   e2.named();
+//   ^^^^^
+// [diag.enumConstantInvokesFactoryConstructor] An enum value can't invoke a factory constructor.
 
   const E();
   const factory E.named() = ET.named;
@@ -30,17 +30,16 @@
 extension type const ET(E it) implements E {
   const ET.named() : this(E.e1);
 }
-''',
-      [error(diag.enumConstantInvokesFactoryConstructor, 20, 5)],
-    );
+''');
   }
 
   test_factory_unnamed() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 enum E {
   e1.primary(),
   e2;
+//^^
+// [diag.enumConstantInvokesFactoryConstructor] An enum value can't invoke a factory constructor.
 
   const E.primary();
   const factory E() = ET.named;
@@ -49,17 +48,16 @@
 extension type const ET(E it) implements E {
   const ET.named() : this(E.e1);
 }
-''',
-      [error(diag.enumConstantInvokesFactoryConstructor, 27, 2)],
-    );
+''');
   }
 
   test_factory_unnamed_withArguments() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 enum E {
   e1.primary(),
   e2();
+//^^
+// [diag.enumConstantInvokesFactoryConstructor] An enum value can't invoke a factory constructor.
 
   const E.primary();
   const factory E() = ET.named;
@@ -68,8 +66,6 @@
 extension type const ET(E it) implements E {
   const ET.named() : this(E.e1);
 }
-''',
-      [error(diag.enumConstantInvokesFactoryConstructor, 27, 2)],
-    );
+''');
   }
 }
diff --git a/pkg/analyzer/test/src/diagnostics/enum_constant_same_name_as_enclosing_test.dart b/pkg/analyzer/test/src/diagnostics/enum_constant_same_name_as_enclosing_test.dart
index e6f0967..9b43367 100644
--- a/pkg/analyzer/test/src/diagnostics/enum_constant_same_name_as_enclosing_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/enum_constant_same_name_as_enclosing_test.dart
@@ -2,7 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/src/diagnostic/diagnostic.dart' as diag;
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../dart/resolution/context_collection_resolution.dart';
@@ -16,13 +15,12 @@
 @reflectiveTest
 class EnumConstantSameNameAsEnclosingTest extends PubPackageResolutionTest {
   test_name() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 enum E {
   E
+//^
+// [diag.enumConstantSameNameAsEnclosing] The name of the enum value can't be the same as the enum's name.
 }
-''',
-      [error(diag.enumConstantSameNameAsEnclosing, 11, 1)],
-    );
+''');
   }
 }
diff --git a/pkg/analyzer/test/src/diagnostics/enum_instantiated_to_bounds_is_not_well_bounded_test.dart b/pkg/analyzer/test/src/diagnostics/enum_instantiated_to_bounds_is_not_well_bounded_test.dart
index b90b811..49b9263 100644
--- a/pkg/analyzer/test/src/diagnostics/enum_instantiated_to_bounds_is_not_well_bounded_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/enum_instantiated_to_bounds_is_not_well_bounded_test.dart
@@ -2,7 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/src/diagnostic/diagnostic.dart' as diag;
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../dart/resolution/context_collection_resolution.dart';
@@ -17,15 +16,14 @@
 class EnumInstantiatedToBoundsIsNotWellBoundedTest
     extends PubPackageResolutionTest {
   test_enum_it() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 typedef A<X> = X Function(X);
 
 enum E<T extends A<T>, U> {
+//   ^
+// [diag.enumInstantiatedToBoundsIsNotWellBounded] The result of instantiating the enum to bounds is not well-bounded.
   v<Never, int>()
 }
-''',
-      [error(diag.enumInstantiatedToBoundsIsNotWellBounded, 36, 1)],
-    );
+''');
   }
 }
diff --git a/pkg/analyzer/test/src/diagnostics/enum_mixin_with_instance_variable_test.dart b/pkg/analyzer/test/src/diagnostics/enum_mixin_with_instance_variable_test.dart
index d4a9ad7..a60e87c 100644
--- a/pkg/analyzer/test/src/diagnostics/enum_mixin_with_instance_variable_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/enum_mixin_with_instance_variable_test.dart
@@ -2,7 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/src/diagnostic/diagnostic.dart' as diag;
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../dart/resolution/context_collection_resolution.dart';
@@ -16,37 +15,35 @@
 @reflectiveTest
 class EnumMixinWithInstanceVariableTest extends PubPackageResolutionTest {
   test_field_instance() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 mixin M {
   var foo = 0;
 }
 
 enum E with M {
+//          ^
+// [diag.enumMixinWithInstanceVariable] Mixins applied to enums can't have instance variables.
   v
 }
-''',
-      [error(diag.enumMixinWithInstanceVariable, 40, 1)],
-    );
+''');
   }
 
   test_field_instance_final() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 mixin M {
   final foo = 0;
 }
 
 enum E with M {
+//          ^
+// [diag.enumMixinWithInstanceVariable] Mixins applied to enums can't have instance variables.
   v
 }
-''',
-      [error(diag.enumMixinWithInstanceVariable, 42, 1)],
-    );
+''');
   }
 
   test_field_static() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 mixin M {
   static var foo = 0;
 }
@@ -58,7 +55,7 @@
   }
 
   test_getter_instance() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 mixin M {
   int get foo => 0;
 }
@@ -70,7 +67,7 @@
   }
 
   test_setter_instance() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 mixin M {
   set foo(int _) {}
 }
diff --git a/pkg/analyzer/test/src/diagnostics/enum_with_abstract_member_test.dart b/pkg/analyzer/test/src/diagnostics/enum_with_abstract_member_test.dart
index 53a4fc5..3585a95 100644
--- a/pkg/analyzer/test/src/diagnostics/enum_with_abstract_member_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/enum_with_abstract_member_test.dart
@@ -2,7 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/src/diagnostic/diagnostic.dart' as diag;
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../dart/resolution/context_collection_resolution.dart';
@@ -16,38 +15,35 @@
 @reflectiveTest
 class EnumWithAbstractMemberTest extends PubPackageResolutionTest {
   test_getter() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 enum E {
   v;
   int get foo;
+//^^^^^^^^^^^^
+// [diag.enumWithAbstractMember] 'foo' must have a method body because 'E' is an enum.
 }
-''',
-      [error(diag.enumWithAbstractMember, 16, 12)],
-    );
+''');
   }
 
   test_method() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 enum E {
   v;
   void foo();
+//^^^^^^^^^^^
+// [diag.enumWithAbstractMember] 'foo' must have a method body because 'E' is an enum.
 }
-''',
-      [error(diag.enumWithAbstractMember, 16, 11)],
-    );
+''');
   }
 
   test_setter() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 enum E {
   v;
   set foo(int _);
+//^^^^^^^^^^^^^^^
+// [diag.enumWithAbstractMember] 'foo' must have a method body because 'E' is an enum.
 }
-''',
-      [error(diag.enumWithAbstractMember, 16, 15)],
-    );
+''');
   }
 }
diff --git a/pkg/analyzer/test/src/diagnostics/enum_with_name_values_test.dart b/pkg/analyzer/test/src/diagnostics/enum_with_name_values_test.dart
index 5a3f859..5eaf207 100644
--- a/pkg/analyzer/test/src/diagnostics/enum_with_name_values_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/enum_with_name_values_test.dart
@@ -2,7 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/src/diagnostic/diagnostic.dart' as diag;
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../dart/resolution/context_collection_resolution.dart';
@@ -16,13 +15,12 @@
 @reflectiveTest
 class EnumWithNameValuesTest extends PubPackageResolutionTest {
   test_name() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 enum values {
+//   ^^^^^^
+// [diag.enumWithNameValues] The name 'values' is not a valid name for an enum.
   v
 }
-''',
-      [error(diag.enumWithNameValues, 5, 6)],
-    );
+''');
   }
 }
diff --git a/pkg/analyzer/test/src/diagnostics/enum_without_constants_test.dart b/pkg/analyzer/test/src/diagnostics/enum_without_constants_test.dart
index 9c43948..b4a138e 100644
--- a/pkg/analyzer/test/src/diagnostics/enum_without_constants_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/enum_without_constants_test.dart
@@ -24,19 +24,18 @@
 }
 ''');
 
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 part 'a.dart';
 enum E {}
 ''');
   }
 
   test_noConstants() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 enum E {}
-''',
-      [error(diag.enumWithoutConstants, 5, 1)],
-    );
+//   ^
+// [diag.enumWithoutConstants] The enum must have at least one enum constant.
+''');
   }
 
   @SkippedTest() // TODO(scheglov): implement augmentation
diff --git a/pkg/analyzer/test/src/diagnostics/equal_elements_in_const_set_test.dart b/pkg/analyzer/test/src/diagnostics/equal_elements_in_const_set_test.dart
index 7d01fab..1113bbf 100644
--- a/pkg/analyzer/test/src/diagnostics/equal_elements_in_const_set_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/equal_elements_in_const_set_test.dart
@@ -2,7 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/src/diagnostic/diagnostic.dart' as diag;
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../dart/resolution/context_collection_resolution.dart';
@@ -19,117 +18,87 @@
 
 mixin EqualElementsInConstSetTestCases on PubPackageResolutionTest {
   test_const_entry() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 var c = const {1, 2, 1};
-''',
-      [
-        error(
-          diag.equalElementsInConstSet,
-          21,
-          1,
-          contextMessages: [message(testFile, 15, 1)],
-        ),
-      ],
-    );
+//             ^
+// [context 1] The first element with this value.
+//                   ^
+// [diag.equalElementsInConstSet][context 1] Two elements in a constant set literal can't be equal.
+''');
   }
 
   test_const_entry_extensionType_typeValue() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 const x = {int, E};
+//         ^^^
+// [context 1] The first element with this value.
+//              ^
+// [diag.equalElementsInConstSet][context 1] Two elements in a constant set literal can't be equal.
 extension type E(int it) {}
-''',
-      [
-        error(
-          diag.equalElementsInConstSet,
-          16,
-          1,
-          contextMessages: [message(testFile, 11, 3)],
-        ),
-      ],
-    );
+''');
   }
 
   test_const_ifElement_thenElseFalse() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 var c = const {1, if (1 < 0) 2 else 1};
-''',
-      [
-        error(
-          diag.equalElementsInConstSet,
-          36,
-          1,
-          contextMessages: [message(testFile, 15, 1)],
-        ),
-      ],
-    );
+//             ^
+// [context 1] The first element with this value.
+//                                  ^
+// [diag.equalElementsInConstSet][context 1] Two elements in a constant set literal can't be equal.
+''');
   }
 
   test_const_ifElement_thenElseFalse_onlyElse() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 var c = const {if (0 < 1) 1 else 1};
 ''');
   }
 
   test_const_ifElement_thenElseTrue() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 var c = const {1, if (0 < 1) 2 else 1};
 ''');
   }
 
   test_const_ifElement_thenElseTrue_onlyThen() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 var c = const {if (0 < 1) 1 else 1};
 ''');
   }
 
   test_const_ifElement_thenFalse() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 var c = const {2, if (1 < 0) 2};
 ''');
   }
 
   test_const_ifElement_thenTrue() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 var c = const {1, if (0 < 1) 1};
-''',
-      [
-        error(
-          diag.equalElementsInConstSet,
-          29,
-          1,
-          contextMessages: [message(testFile, 15, 1)],
-        ),
-      ],
-    );
+//             ^
+// [context 1] The first element with this value.
+//                           ^
+// [diag.equalElementsInConstSet][context 1] Two elements in a constant set literal can't be equal.
+''');
   }
 
   test_const_instanceCreation_equalTypeArgs() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A<T> {
   const A();
 }
 
 var c = const {const A<int>(), const A<int>()};
-''',
-      [
-        error(
-          diag.equalElementsInConstSet,
-          60,
-          14,
-          contextMessages: [message(testFile, 44, 14)],
-        ),
-      ],
-    );
+//             ^^^^^^^^^^^^^^
+// [context 1] The first element with this value.
+//                             ^^^^^^^^^^^^^^
+// [diag.equalElementsInConstSet][context 1] Two elements in a constant set literal can't be equal.
+''');
   }
 
   test_const_instanceCreation_notEqualTypeArgs() async {
     // No error because A<int> and A<num> are different types.
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A<T> {
   const A();
 }
@@ -139,78 +108,59 @@
   }
 
   test_const_list_hasEqual() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 const x = {[0], [0]};
-''',
-      [
-        error(
-          diag.equalElementsInConstSet,
-          16,
-          3,
-          contextMessages: [message(testFile, 11, 3)],
-        ),
-      ],
-    );
+//         ^^^
+// [context 1] The first element with this value.
+//              ^^^
+// [diag.equalElementsInConstSet][context 1] Two elements in a constant set literal can't be equal.
+''');
   }
 
   test_const_list_noEqual() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 const x = {[0], [1]};
 ''');
   }
 
   test_const_record_hasEqual() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 const x = {(0, 1), (0, 1)};
-''',
-      [
-        error(
-          diag.equalElementsInConstSet,
-          19,
-          6,
-          contextMessages: [message(testFile, 11, 6)],
-        ),
-      ],
-    );
+//         ^^^^^^
+// [context 1] The first element with this value.
+//                 ^^^^^^
+// [diag.equalElementsInConstSet][context 1] Two elements in a constant set literal can't be equal.
+''');
   }
 
   test_const_record_noEqual() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 const x = {(0, 1), (0, 2)};
 ''');
   }
 
   test_const_spread__noDuplicate() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 var c = const {1, ...{2}};
 ''');
   }
 
   test_const_spread_hasDuplicate() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 var c = const {1, ...{1}};
-''',
-      [
-        error(
-          diag.equalElementsInConstSet,
-          21,
-          3,
-          contextMessages: [message(testFile, 15, 1)],
-        ),
-      ],
-    );
+//             ^
+// [context 1] The first element with this value.
+//                   ^^^
+// [diag.equalElementsInConstSet][context 1] Two elements in a constant set literal can't be equal.
+''');
   }
 
   test_nonConst_entry() async {
     // No error, but there is a hint.
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 var c = {1, 2, 1};
-''',
-      [error(diag.equalElementsInSet, 15, 1)],
-    );
+//             ^
+// [diag.equalElementsInSet] Two elements in a set literal shouldn't be equal.
+''');
   }
 }
diff --git a/pkg/analyzer/test/src/diagnostics/equal_elements_in_set_test.dart b/pkg/analyzer/test/src/diagnostics/equal_elements_in_set_test.dart
index 897542c..c2beb28 100644
--- a/pkg/analyzer/test/src/diagnostics/equal_elements_in_set_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/equal_elements_in_set_test.dart
@@ -2,7 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/src/diagnostic/diagnostic.dart' as diag;
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../dart/resolution/context_collection_resolution.dart';
@@ -16,32 +15,29 @@
 @reflectiveTest
 class EqualElementsInSetTest extends PubPackageResolutionTest {
   test_constant_constant() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 const a = 1;
 const b = 1;
 var s = {a, b};
-''',
-      [error(diag.equalElementsInSet, 38, 1)],
-    );
+//          ^
+// [diag.equalElementsInSet] Two elements in a set literal shouldn't be equal.
+''');
   }
 
   test_literal_constant() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 const one = 1;
 var s = {1, one};
-''',
-      [error(diag.equalElementsInSet, 27, 3)],
-    );
+//          ^^^
+// [diag.equalElementsInSet] Two elements in a set literal shouldn't be equal.
+''');
   }
 
   test_literal_literal() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 var s = {1, 1};
-''',
-      [error(diag.equalElementsInSet, 12, 1)],
-    );
+//          ^
+// [diag.equalElementsInSet] Two elements in a set literal shouldn't be equal.
+''');
   }
 }
diff --git a/pkg/analyzer/test/src/diagnostics/equal_keys_in_const_map_test.dart b/pkg/analyzer/test/src/diagnostics/equal_keys_in_const_map_test.dart
index a105a2b..805b3fd 100644
--- a/pkg/analyzer/test/src/diagnostics/equal_keys_in_const_map_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/equal_keys_in_const_map_test.dart
@@ -2,7 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/src/diagnostic/diagnostic.dart' as diag;
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../dart/resolution/context_collection_resolution.dart';
@@ -19,117 +18,87 @@
 
 mixin EqualKeysInConstMapTestCases on PubPackageResolutionTest {
   test_const_entry() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 var c = const {1: null, 2: null, 1: null};
-''',
-      [
-        error(
-          diag.equalKeysInConstMap,
-          33,
-          1,
-          contextMessages: [message(testFile, 15, 1)],
-        ),
-      ],
-    );
+//             ^
+// [context 1] The first key with this value.
+//                               ^
+// [diag.equalKeysInConstMap][context 1] Two keys in a constant map literal can't be equal.
+''');
   }
 
   test_const_entry_extensionType_typeValue() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 const x = {int: 0, E: 0};
+//         ^^^
+// [context 1] The first key with this value.
+//                 ^
+// [diag.equalKeysInConstMap][context 1] Two keys in a constant map literal can't be equal.
 extension type E(int it) {}
-''',
-      [
-        error(
-          diag.equalKeysInConstMap,
-          19,
-          1,
-          contextMessages: [message(testFile, 11, 3)],
-        ),
-      ],
-    );
+''');
   }
 
   test_const_ifElement_thenElseFalse() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 var c = const {1: null, if (1 < 0) 2: null else 1: null};
-''',
-      [
-        error(
-          diag.equalKeysInConstMap,
-          48,
-          1,
-          contextMessages: [message(testFile, 15, 1)],
-        ),
-      ],
-    );
+//             ^
+// [context 1] The first key with this value.
+//                                              ^
+// [diag.equalKeysInConstMap][context 1] Two keys in a constant map literal can't be equal.
+''');
   }
 
   test_const_ifElement_thenElseFalse_onlyElse() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 var c = const {if (0 < 1) 1: null else 1: null};
 ''');
   }
 
   test_const_ifElement_thenElseTrue() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 var c = const {1: null, if (0 < 1) 2: null else 1: null};
 ''');
   }
 
   test_const_ifElement_thenElseTrue_onlyThen() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 var c = const {if (0 < 1) 1: null else 1: null};
 ''');
   }
 
   test_const_ifElement_thenFalse() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 var c = const {2: null, if (1 < 0) 2: 2};
 ''');
   }
 
   test_const_ifElement_thenTrue() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 var c = const {1: null, if (0 < 1) 1: null};
-''',
-      [
-        error(
-          diag.equalKeysInConstMap,
-          35,
-          1,
-          contextMessages: [message(testFile, 15, 1)],
-        ),
-      ],
-    );
+//             ^
+// [context 1] The first key with this value.
+//                                 ^
+// [diag.equalKeysInConstMap][context 1] Two keys in a constant map literal can't be equal.
+''');
   }
 
   test_const_instanceCreation_equalTypeArgs() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A<T> {
   const A();
 }
 
 var c = const {const A<int>(): null, const A<int>(): null};
-''',
-      [
-        error(
-          diag.equalKeysInConstMap,
-          66,
-          14,
-          contextMessages: [message(testFile, 44, 14)],
-        ),
-      ],
-    );
+//             ^^^^^^^^^^^^^^
+// [context 1] The first key with this value.
+//                                   ^^^^^^^^^^^^^^
+// [diag.equalKeysInConstMap][context 1] Two keys in a constant map literal can't be equal.
+''');
   }
 
   test_const_instanceCreation_notEqualTypeArgs() async {
     // No error because A<int> and A<num> are different types.
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A<T> {
   const A();
 }
@@ -139,78 +108,59 @@
   }
 
   test_const_list_hasEqual() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 const x = {[0]: null, [0]: null};
-''',
-      [
-        error(
-          diag.equalKeysInConstMap,
-          22,
-          3,
-          contextMessages: [message(testFile, 11, 3)],
-        ),
-      ],
-    );
+//         ^^^
+// [context 1] The first key with this value.
+//                    ^^^
+// [diag.equalKeysInConstMap][context 1] Two keys in a constant map literal can't be equal.
+''');
   }
 
   test_const_list_noEqual() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 const x = {[0]: null, [1]: null};
 ''');
   }
 
   test_const_record_hasEqual() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 const x = {(0, 1): null, (0, 1): null};
-''',
-      [
-        error(
-          diag.equalKeysInConstMap,
-          25,
-          6,
-          contextMessages: [message(testFile, 11, 6)],
-        ),
-      ],
-    );
+//         ^^^^^^
+// [context 1] The first key with this value.
+//                       ^^^^^^
+// [diag.equalKeysInConstMap][context 1] Two keys in a constant map literal can't be equal.
+''');
   }
 
   test_const_record_noEqual() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 const x = {(0, 1): null, (0, 2): null};
 ''');
   }
 
   test_const_spread__noDuplicate() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 var c = const {1: null, ...{2: null}};
 ''');
   }
 
   test_const_spread_hasDuplicate() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 var c = const {1: null, ...{1: null}};
-''',
-      [
-        error(
-          diag.equalKeysInConstMap,
-          27,
-          9,
-          contextMessages: [message(testFile, 15, 1)],
-        ),
-      ],
-    );
+//             ^
+// [context 1] The first key with this value.
+//                         ^^^^^^^^^
+// [diag.equalKeysInConstMap][context 1] Two keys in a constant map literal can't be equal.
+''');
   }
 
   test_nonConst_entry() async {
     // No error, but there is a hint.
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 var c = {1: null, 2: null, 1: null};
-''',
-      [error(diag.equalKeysInMap, 27, 1)],
-    );
+//                         ^
+// [diag.equalKeysInMap] Two keys in a map literal shouldn't be equal.
+''');
   }
 }
diff --git a/pkg/analyzer/test/src/diagnostics/equal_keys_in_map_pattern_test.dart b/pkg/analyzer/test/src/diagnostics/equal_keys_in_map_pattern_test.dart
index fa08170..96e9361 100644
--- a/pkg/analyzer/test/src/diagnostics/equal_keys_in_map_pattern_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/equal_keys_in_map_pattern_test.dart
@@ -2,7 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/src/diagnostic/diagnostic.dart' as diag;
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../dart/resolution/context_collection_resolution.dart';
@@ -16,101 +15,71 @@
 @reflectiveTest
 class EqualKeysInMapPatternTest extends PubPackageResolutionTest {
   test_identical_double() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 void f(x) {
   if (x case {3.14: 1, 3.14: 2}) {}
+//            ^^^^
+// [context 1] The first key with this value.
+//                     ^^^^
+// [diag.equalKeysInMapPattern][context 1] Two keys in a map pattern can't be equal.
 }
-''',
-      [
-        error(
-          diag.equalKeysInMapPattern,
-          35,
-          4,
-          contextMessages: [message(testFile, 26, 4)],
-        ),
-      ],
-    );
+''');
   }
 
   test_identical_int() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 void f(x) {
   if (x case {0: 1, 0: 2}) {}
+//            ^
+// [context 1] The first key with this value.
+//                  ^
+// [diag.equalKeysInMapPattern][context 1] Two keys in a map pattern can't be equal.
 }
-''',
-      [
-        error(
-          diag.equalKeysInMapPattern,
-          32,
-          1,
-          contextMessages: [message(testFile, 26, 1)],
-        ),
-      ],
-    );
+''');
   }
 
   test_identical_int_viaIdentifier() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 const a = 0;
 const b = 0;
 
 void f(x) {
   if (x case {a: 1, b: 2}) {}
+//            ^
+// [context 1] The first key with this value.
+//                  ^
+// [diag.equalKeysInMapPattern][context 1] Two keys in a map pattern can't be equal.
 }
-''',
-      [
-        error(
-          diag.equalKeysInMapPattern,
-          59,
-          1,
-          contextMessages: [message(testFile, 53, 1)],
-        ),
-      ],
-    );
+''');
   }
 
   test_identical_type() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 void f(x) {
   if (x case {int: 0, int: 0}) {}
+//            ^^^
+// [context 1] The first key with this value.
+//                    ^^^
+// [diag.equalKeysInMapPattern][context 1] Two keys in a map pattern can't be equal.
 }
-''',
-      [
-        error(
-          diag.equalKeysInMapPattern,
-          34,
-          3,
-          contextMessages: [message(testFile, 26, 3)],
-        ),
-      ],
-    );
+''');
   }
 
   test_identical_type_extensionType() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 void f(x) {
   if (x case {int: 0, E: 0}) {}
+//            ^^^
+// [context 1] The first key with this value.
+//                    ^
+// [diag.equalKeysInMapPattern][context 1] Two keys in a map pattern can't be equal.
 }
 extension type E(int it) {}
-''',
-      [
-        error(
-          diag.equalKeysInMapPattern,
-          34,
-          1,
-          contextMessages: [message(testFile, 26, 3)],
-        ),
-      ],
-    );
+''');
   }
 
   test_notIdentical_double() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 void f(x) {
   if (x case {3.14: 1, 2.71: 2}) {}
 }
@@ -118,7 +87,7 @@
   }
 
   test_notIdentical_int() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 void f(x) {
   if (x case {0: 1, 2: 3}) {}
 }
@@ -126,7 +95,7 @@
   }
 
   test_notIdentical_userClass() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 void f(x) {
   if (x case {const A(0): 1, const A(2): 3}) {}
 }
@@ -140,7 +109,7 @@
   }
 
   test_recordType_notPrimitiveEqual_named() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 void f(x) {
   if (x case {(a: const A()): 1, (a: const A()): 2}) {}
 }
@@ -153,7 +122,7 @@
   }
 
   test_recordType_notPrimitiveEqual_positional() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 void f(x) {
   if (x case {(0, const A()): 1, (0, const A()): 2}) {}
 }
@@ -166,7 +135,7 @@
   }
 
   test_recordType_primitiveEqual_differentShape() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 void f(x) {
   if (x case {(0, 1): 2, (0,): 3}) {}
 }
@@ -174,43 +143,31 @@
   }
 
   test_recordType_primitiveEqual_empty() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 void f(x) {
   if (x case {(): 1, (): 2}) {}
+//            ^^
+// [context 1] The first key with this value.
+//                   ^^
+// [diag.equalKeysInMapPattern][context 1] Two keys in a map pattern can't be equal.
 }
-''',
-      [
-        error(
-          diag.equalKeysInMapPattern,
-          33,
-          2,
-          contextMessages: [message(testFile, 26, 2)],
-        ),
-      ],
-    );
+''');
   }
 
   test_recordType_primitiveEqual_named_equal() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 void f(x) {
   if (x case {(a: 0): 1, (a: 0): 2}) {}
+//            ^^^^^^
+// [context 1] The first key with this value.
+//                       ^^^^^^
+// [diag.equalKeysInMapPattern][context 1] Two keys in a map pattern can't be equal.
 }
-''',
-      [
-        error(
-          diag.equalKeysInMapPattern,
-          37,
-          6,
-          contextMessages: [message(testFile, 26, 6)],
-        ),
-      ],
-    );
+''');
   }
 
   test_recordType_primitiveEqual_named_notEqual() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 void f(x) {
   if (x case {(a: 0): 1, (a: 2): 3}) {}
 }
@@ -218,25 +175,19 @@
   }
 
   test_recordType_primitiveEqual_positional_equal() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 void f(x) {
   if (x case {(0,): 1, (0,): 2}) {}
+//            ^^^^
+// [context 1] The first key with this value.
+//                     ^^^^
+// [diag.equalKeysInMapPattern][context 1] Two keys in a map pattern can't be equal.
 }
-''',
-      [
-        error(
-          diag.equalKeysInMapPattern,
-          35,
-          4,
-          contextMessages: [message(testFile, 26, 4)],
-        ),
-      ],
-    );
+''');
   }
 
   test_recordType_primitiveEqual_positional_notEqual() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 void f(x) {
   if (x case {(0,): 1, (2,): 3}) {}
 }
diff --git a/pkg/analyzer/test/src/diagnostics/equal_keys_in_map_test.dart b/pkg/analyzer/test/src/diagnostics/equal_keys_in_map_test.dart
index 910a9d9..710fc53 100644
--- a/pkg/analyzer/test/src/diagnostics/equal_keys_in_map_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/equal_keys_in_map_test.dart
@@ -2,7 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/src/diagnostic/diagnostic.dart' as diag;
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../dart/resolution/context_collection_resolution.dart';
@@ -16,32 +15,29 @@
 @reflectiveTest
 class EqualKeysInMapTest extends PubPackageResolutionTest {
   test_constant_constant() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 const a = 1;
 const b = 1;
 var s = {a: 2, b: 3};
-''',
-      [error(diag.equalKeysInMap, 41, 1)],
-    );
+//             ^
+// [diag.equalKeysInMap] Two keys in a map literal shouldn't be equal.
+''');
   }
 
   test_literal_constant() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 const one = 1;
 var s = {1: 2, one: 3};
-''',
-      [error(diag.equalKeysInMap, 30, 3)],
-    );
+//             ^^^
+// [diag.equalKeysInMap] Two keys in a map literal shouldn't be equal.
+''');
   }
 
   test_literal_literal() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 var s = {1: 2, 1: 3};
-''',
-      [error(diag.equalKeysInMap, 15, 1)],
-    );
+//             ^
+// [diag.equalKeysInMap] Two keys in a map literal shouldn't be equal.
+''');
   }
 }
diff --git a/pkg/analyzer/test/src/diagnostics/expected_one_list_pattern_type_arguments_test.dart b/pkg/analyzer/test/src/diagnostics/expected_one_list_pattern_type_arguments_test.dart
index 9567975..391073f 100644
--- a/pkg/analyzer/test/src/diagnostics/expected_one_list_pattern_type_arguments_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/expected_one_list_pattern_type_arguments_test.dart
@@ -2,7 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/src/diagnostic/diagnostic.dart' as diag;
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../dart/resolution/context_collection_resolution.dart';
@@ -16,7 +15,7 @@
 @reflectiveTest
 class ExpectedOneListPatternTypeArgumentsTest extends PubPackageResolutionTest {
   test_1() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 void f(x) {
   if (x case <int>[0]) {}
 }
@@ -24,13 +23,12 @@
   }
 
   test_2() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 void f(x) {
   if (x case <int, int>[0]) {}
+//           ^^^^^^^^^^
+// [diag.expectedOneListPatternTypeArguments] List patterns require one type argument or none, but 2 found.
 }
-''',
-      [error(diag.expectedOneListPatternTypeArguments, 25, 10)],
-    );
+''');
   }
 }
diff --git a/pkg/analyzer/test/src/diagnostics/expected_one_list_type_arguments_test.dart b/pkg/analyzer/test/src/diagnostics/expected_one_list_type_arguments_test.dart
index 856429d..bd77006 100644
--- a/pkg/analyzer/test/src/diagnostics/expected_one_list_type_arguments_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/expected_one_list_type_arguments_test.dart
@@ -2,7 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/src/diagnostic/diagnostic.dart' as diag;
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../dart/resolution/context_collection_resolution.dart';
@@ -16,7 +15,7 @@
 @reflectiveTest
 class ExpectedOneListTypeArgumentsTest extends PubPackageResolutionTest {
   test_one_type_argument() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 main() {
   <int> [];
 }
@@ -24,12 +23,11 @@
   }
 
   test_two_type_arguments() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 main() {
   <int, int>[];
-}''',
-      [error(diag.expectedOneListTypeArguments, 11, 10)],
-    );
+//^^^^^^^^^^
+// [diag.expectedOneListTypeArguments] List literals require one type argument or none, but 2 found.
+}''');
   }
 }
diff --git a/pkg/analyzer/test/src/diagnostics/expected_one_set_type_arguments_test.dart b/pkg/analyzer/test/src/diagnostics/expected_one_set_type_arguments_test.dart
index cf485be..77bf859 100644
--- a/pkg/analyzer/test/src/diagnostics/expected_one_set_type_arguments_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/expected_one_set_type_arguments_test.dart
@@ -2,7 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/src/diagnostic/diagnostic.dart' as diag;
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../dart/resolution/context_collection_resolution.dart';
@@ -16,12 +15,11 @@
 @reflectiveTest
 class ExpectedOneSetTypeArgumentsTest extends PubPackageResolutionTest {
   test_multiple_type_arguments() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 main() {
   <int, int, int>{2, 3};
-}''',
-      [error(diag.expectedOneSetTypeArguments, 11, 15)],
-    );
+//^^^^^^^^^^^^^^^
+// [diag.expectedOneSetTypeArguments] Set literals require one type argument or none, but 3 were found.
+}''');
   }
 }
diff --git a/pkg/analyzer/test/src/diagnostics/expected_two_map_pattern_type_arguments_test.dart b/pkg/analyzer/test/src/diagnostics/expected_two_map_pattern_type_arguments_test.dart
index 055a692..c840ef7 100644
--- a/pkg/analyzer/test/src/diagnostics/expected_two_map_pattern_type_arguments_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/expected_two_map_pattern_type_arguments_test.dart
@@ -2,7 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/src/diagnostic/diagnostic.dart' as diag;
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../dart/resolution/context_collection_resolution.dart';
@@ -16,7 +15,7 @@
 @reflectiveTest
 class ExpectedTwoMapPatternTypeArgumentsTest extends PubPackageResolutionTest {
   test_0() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 void f(x) {
   if (x case {0: _}) {}
 }
@@ -24,18 +23,17 @@
   }
 
   test_1() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 void f(x) {
   if (x case <int>{0: _}) {}
+//           ^^^^^
+// [diag.expectedTwoMapPatternTypeArguments] Map patterns require two type arguments or none, but 1 found.
 }
-''',
-      [error(diag.expectedTwoMapPatternTypeArguments, 25, 5)],
-    );
+''');
   }
 
   test_2() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 void f(x) {
   if (x case <bool, int>{0: _}) {}
 }
@@ -43,13 +41,12 @@
   }
 
   test_3() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 void f(x) {
   if (x case <bool, int, String>{0: _}) {}
+//           ^^^^^^^^^^^^^^^^^^^
+// [diag.expectedTwoMapPatternTypeArguments] Map patterns require two type arguments or none, but 3 found.
 }
-''',
-      [error(diag.expectedTwoMapPatternTypeArguments, 25, 19)],
-    );
+''');
   }
 }
diff --git a/pkg/analyzer/test/src/diagnostics/expected_two_map_type_arguments_test.dart b/pkg/analyzer/test/src/diagnostics/expected_two_map_type_arguments_test.dart
index ea6271f..27d4ee1 100644
--- a/pkg/analyzer/test/src/diagnostics/expected_two_map_type_arguments_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/expected_two_map_type_arguments_test.dart
@@ -2,7 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/src/diagnostic/diagnostic.dart' as diag;
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../dart/resolution/context_collection_resolution.dart';
@@ -18,27 +17,25 @@
   test_three_type_arguments_ambiguous() async {
     // TODO(brianwilkerson): We probably need a new error code for "expected
     //  either one or two type arguments" to handle the ambiguous case.
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 main() {
   <int, int, int>{};
-}''',
-      [error(diag.expectedTwoMapTypeArguments, 11, 15)],
-    );
+//^^^^^^^^^^^^^^^
+// [diag.expectedTwoMapTypeArguments] Map literals require two type arguments or none, but 3 found.
+}''');
   }
 
   test_three_type_arguments_map() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 main() {
   <int, int, int>{1: 2};
-}''',
-      [error(diag.expectedTwoMapTypeArguments, 11, 15)],
-    );
+//^^^^^^^^^^^^^^^
+// [diag.expectedTwoMapTypeArguments] Map literals require two type arguments or none, but 3 found.
+}''');
   }
 
   test_two_type_arguments() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 main() {
   <int, int> {};
 }
diff --git a/pkg/analyzer/test/src/diagnostics/experiment_not_enabled_test.dart b/pkg/analyzer/test/src/diagnostics/experiment_not_enabled_test.dart
index 0500065..9866fd8 100644
--- a/pkg/analyzer/test/src/diagnostics/experiment_not_enabled_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/experiment_not_enabled_test.dart
@@ -2,7 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/src/diagnostic/diagnostic.dart' as diag;
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../dart/resolution/context_collection_resolution.dart';
@@ -16,8 +15,7 @@
 @reflectiveTest
 class ExperimentNotEnabledTest extends PubPackageResolutionTest {
   test_constructor_tearoffs_disabled_grammar() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 // @dart = 2.12
 class Foo<X> {
   const Foo.bar();
@@ -25,58 +23,55 @@
 }
 main() {
   Foo<int>.bar.baz();
+//   ^^^^^
+// [diag.experimentNotEnabled] This requires the 'constructor-tearoffs' language feature to be enabled.
+//             ^^^
+// [diag.undefinedMethod] The method 'baz' isn't defined for the type 'Function'.
 }
-''',
-      [
-        error(diag.experimentNotEnabled, 86, 5),
-        error(diag.undefinedMethod, 96, 3),
-      ],
-    );
+''');
   }
 
   test_dotShorthands_disabled() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 // @dart = 3.8
 void main() {
   Object c = .hash(1, 2);
+//           ^
+// [diag.experimentNotEnabled] This requires the 'dot-shorthands' language feature to be enabled.
   print(c);
 }
-''',
-      [error(diag.experimentNotEnabled, 42, 1)],
-    );
+''');
   }
 
   test_nonFunctionTypeAliases_disabled() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 // @dart = 2.12
 typedef A = int;
-''',
-      [error(diag.experimentNotEnabled, 26, 1)],
-    );
+//        ^
+// [diag.experimentNotEnabled] This requires the 'nonfunction-type-aliases' language feature to be enabled.
+''');
   }
 
   test_nonFunctionTypeAliases_disabled_nullable() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 // @dart = 2.12
 typedef A = int?;
-''',
-      [error(diag.experimentNotEnabled, 26, 1)],
-    );
+//        ^
+// [diag.experimentNotEnabled] This requires the 'nonfunction-type-aliases' language feature to be enabled.
+''');
   }
 
   test_privateNamedParameters_disabled() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 // @dart = 3.8
 class C {
   int? _x;
+//     ^^
+// [diag.unusedField] The value of the field '_x' isn't used.
   C({this._x});
+//        ^^
+// [diag.experimentNotEnabled] This requires the 'private-named-parameters' language feature to be enabled.
 }
-''',
-      [error(diag.unusedField, 32, 2), error(diag.experimentNotEnabled, 46, 2)],
-    );
+''');
   }
 }
diff --git a/pkg/analyzer/test/src/diagnostics/experimental_member_use_test.dart b/pkg/analyzer/test/src/diagnostics/experimental_member_use_test.dart
index aa5984c..5eeda4a 100644
--- a/pkg/analyzer/test/src/diagnostics/experimental_member_use_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/experimental_member_use_test.dart
@@ -21,84 +21,87 @@
 @reflectiveTest
 class ExperimentalExtendTest extends _TestBase {
   test_annotatedClass() async {
-    await assertErrorsInCode2(
-      externalCode: r'''
+    newFile(externalLibPath, r'''
 import 'package:meta/meta.dart';
 
 @experimental
 class Foo {}
-''',
-      code: r'''
+''');
+
+    await resolveTestCodeWithDiagnostics(r'''
+import 'package:aaa/a.dart';
 class Bar extends Foo {}
-''',
-      [error(diag.experimentalMemberUse, 47, 3)],
-    );
+//                ^^^
+// [diag.experimentalMemberUse] 'Foo' is experimental and could be removed or changed at any time.
+''');
   }
 
   test_annotatedClass_indirect() async {
-    await assertNoErrorsInCode2(
-      externalCode: r'''
+    newFile(externalLibPath, r'''
 import 'package:meta/meta.dart';
 
 @experimental
 class Foo {}
 class Bar extends Foo {}
-''',
-      code: r'''
+''');
+
+    await resolveTestCodeWithDiagnostics(r'''
+import 'package:aaa/a.dart';
 class Baz extends Bar {}
-''',
-    );
+''');
   }
 
   test_annotatedClass_typedef() async {
-    await assertNoErrorsInCode2(
-      externalCode: r'''
+    newFile(externalLibPath, r'''
 import 'package:meta/meta.dart';
 
 @experimental
 class Foo {}
 typedef Foo2 = Foo;
-''',
-      code: r'''
+''');
+
+    await resolveTestCodeWithDiagnostics(r'''
+import 'package:aaa/a.dart';
 class Bar extends Foo2 {}
-''',
-    );
+''');
   }
 
   test_annotatedClassTypeAlias() async {
-    await assertErrorsInCode2(
-      externalCode: r'''
+    newFile(externalLibPath, r'''
 import 'package:meta/meta.dart';
 
 @experimental
 class Foo = Object with M;
 mixin M {}
-''',
-      code: r'''
+''');
+
+    await resolveTestCodeWithDiagnostics(r'''
+import 'package:aaa/a.dart';
 class Bar extends Foo {}
-''',
-      [error(diag.experimentalMemberUse, 47, 3)],
-    );
+//                ^^^
+// [diag.experimentalMemberUse] 'Foo' is experimental and could be removed or changed at any time.
+''');
   }
 
   test_classTypeAlias() async {
-    await assertErrorsInCode2(
-      externalCode: r'''
+    newFile(externalLibPath, r'''
 import 'package:meta/meta.dart';
 
 @experimental
 class Foo {}
-''',
-      code: r'''
+''');
+
+    await resolveTestCodeWithDiagnostics(r'''
+import 'package:aaa/a.dart';
 mixin M {}
 class Bar = Foo with M;
-''',
-      [error(diag.experimentalMemberUse, 52, 3)],
-    );
+//          ^^^
+// [diag.experimentalMemberUse] 'Foo' is experimental and could be removed or changed at any time.
+''');
   }
 
   test_insideLibrary() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'package:meta/meta.dart';
 
 @experimental
@@ -108,117 +111,117 @@
   }
 
   test_noAnnotation() async {
-    newFile('$testPackageLibPath/foo.dart', r'''
+    newFile(externalLibPath, r'''
 class Foo {}
 ''');
 
-    await assertNoErrorsInCode2(
-      externalCode: r'''
-class Foo {}
-''',
-      code: r'''
+    await resolveTestCodeWithDiagnostics(r'''
+import 'package:aaa/a.dart';
 class Bar extends Foo {}
-''',
-    );
+''');
   }
 }
 
 @reflectiveTest
 class ExperimentalImplementTest extends _TestBase {
   test_annotatedClass() async {
-    await assertErrorsInCode2(
-      externalCode: r'''
+    newFile(externalLibPath, r'''
 import 'package:meta/meta.dart';
 
 @experimental
 class Foo {}
-''',
-      code: r'''
+''');
+
+    await resolveTestCodeWithDiagnostics(r'''
+import 'package:aaa/a.dart';
 class Bar implements Foo {}
-''',
-      [error(diag.experimentalMemberUse, 50, 3)],
-    );
+//                   ^^^
+// [diag.experimentalMemberUse] 'Foo' is experimental and could be removed or changed at any time.
+''');
   }
 
   test_annotatedClass_indirect() async {
-    await assertNoErrorsInCode2(
-      externalCode: r'''
+    newFile(externalLibPath, r'''
 import 'package:meta/meta.dart';
 
 @experimental
 class Foo {}
 class Bar extends Foo {}
-''',
-      code: r'''
+''');
+
+    await resolveTestCodeWithDiagnostics(r'''
+import 'package:aaa/a.dart';
 class Baz implements Bar {}
-''',
-    );
+''');
   }
 
   test_annotatedClass_typedef() async {
-    await assertNoErrorsInCode2(
-      externalCode: r'''
+    newFile(externalLibPath, r'''
 import 'package:meta/meta.dart';
 
 @experimental
 class Foo {}
 typedef Foo2 = Foo;
-''',
-      code: r'''
+''');
+
+    await resolveTestCodeWithDiagnostics(r'''
+import 'package:aaa/a.dart';
 class Bar implements Foo2 {}
-''',
-    );
+''');
   }
 
   test_annotatedClassTypeAlias() async {
-    await assertErrorsInCode2(
-      externalCode: r'''
+    newFile(externalLibPath, r'''
 import 'package:meta/meta.dart';
 
 @experimental
 class Foo = Object with M;
 mixin M {}
-''',
-      code: r'''
+''');
+
+    await resolveTestCodeWithDiagnostics(r'''
+import 'package:aaa/a.dart';
 class Bar implements Foo {}
-''',
-      [error(diag.experimentalMemberUse, 50, 3)],
-    );
+//                   ^^^
+// [diag.experimentalMemberUse] 'Foo' is experimental and could be removed or changed at any time.
+''');
   }
 
   test_classTypeAlias() async {
-    await assertErrorsInCode2(
-      externalCode: r'''
+    newFile(externalLibPath, r'''
 import 'package:meta/meta.dart';
 
 @experimental
 class Foo {}
-''',
-      code: r'''
+''');
+
+    await resolveTestCodeWithDiagnostics(r'''
+import 'package:aaa/a.dart';
 mixin M {}
 class Bar = Object with M implements Foo;
-''',
-      [error(diag.experimentalMemberUse, 77, 3)],
-    );
+//                                   ^^^
+// [diag.experimentalMemberUse] 'Foo' is experimental and could be removed or changed at any time.
+''');
   }
 
   test_enum() async {
-    await assertErrorsInCode2(
-      externalCode: r'''
+    newFile(externalLibPath, r'''
 import 'package:meta/meta.dart';
 
 @experimental
 class Foo {}
-''',
-      code: r'''
+''');
+
+    await resolveTestCodeWithDiagnostics(r'''
+import 'package:aaa/a.dart';
 enum Bar implements Foo { one; }
-''',
-      [error(diag.experimentalMemberUse, 49, 3)],
-    );
+//                  ^^^
+// [diag.experimentalMemberUse] 'Foo' is experimental and could be removed or changed at any time.
+''');
   }
 
   test_insideLibrary() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'package:meta/meta.dart';
 
 @experimental
@@ -228,127 +231,132 @@
   }
 
   test_mixinImplementsClass() async {
-    await assertErrorsInCode2(
-      externalCode: r'''
+    newFile(externalLibPath, r'''
 import 'package:meta/meta.dart';
 
 @experimental
 class Foo {}
-''',
-      code: r'''
+''');
+
+    await resolveTestCodeWithDiagnostics(r'''
+import 'package:aaa/a.dart';
 mixin Bar implements Foo {}
-''',
-      [error(diag.experimentalMemberUse, 50, 3)],
-    );
+//                   ^^^
+// [diag.experimentalMemberUse] 'Foo' is experimental and could be removed or changed at any time.
+''');
   }
 
   test_mixinOnClass() async {
-    await assertErrorsInCode2(
-      externalCode: r'''
+    newFile(externalLibPath, r'''
 import 'package:meta/meta.dart';
 
 @experimental
 class Foo {}
-''',
-      code: r'''
+''');
+
+    await resolveTestCodeWithDiagnostics(r'''
+import 'package:aaa/a.dart';
 mixin Bar on Foo {}
-''',
-      [error(diag.experimentalMemberUse, 42, 3)],
-    );
+//           ^^^
+// [diag.experimentalMemberUse] 'Foo' is experimental and could be removed or changed at any time.
+''');
   }
 
   test_noAnnotation() async {
-    await assertNoErrorsInCode2(
-      externalCode: r'''
+    newFile(externalLibPath, r'''
 class Foo {}
-''',
-      code: r'''
+''');
+
+    await resolveTestCodeWithDiagnostics(r'''
+import 'package:aaa/a.dart';
 class Bar implements Foo {}
-''',
-    );
+''');
   }
 }
 
 @reflectiveTest
 class ExperimentalInstantiateTest extends _TestBase {
   test_annotatedClass() async {
-    await assertErrorsInCode2(
-      externalCode: r'''
+    newFile(externalLibPath, r'''
 import 'package:meta/meta.dart';
 
 @experimental
 class Foo {}
-''',
-      code: r'''
+''');
+
+    await resolveTestCodeWithDiagnostics(r'''
+import 'package:aaa/a.dart';
 var x = Foo();
-''',
-      [error(diag.experimentalMemberUse, 37, 3)],
-    );
+//      ^^^
+// [diag.experimentalMemberUse] 'Foo' is experimental and could be removed or changed at any time.
+''');
   }
 
   test_annotatedClass_tearoff() async {
-    await assertErrorsInCode2(
-      externalCode: r'''
+    newFile(externalLibPath, r'''
 import 'package:meta/meta.dart';
 
 @experimental
 class Foo {}
-''',
-      code: r'''
+''');
+
+    await resolveTestCodeWithDiagnostics(r'''
+import 'package:aaa/a.dart';
 var x = Foo.new;
-''',
-      [error(diag.experimentalMemberUse, 37, 3)],
-    );
+//      ^^^
+// [diag.experimentalMemberUse] 'Foo' is experimental and could be removed or changed at any time.
+''');
   }
 
   test_annotatedClass_typedef() async {
-    await assertNoErrorsInCode2(
-      externalCode: r'''
+    newFile(externalLibPath, r'''
 import 'package:meta/meta.dart';
 
 @experimental
 class Foo {}
 typedef Foo2 = Foo;
-''',
-      code: r'''
+''');
+
+    await resolveTestCodeWithDiagnostics(r'''
+import 'package:aaa/a.dart';
 var x = Foo2();
-''',
-    );
+''');
   }
 
   test_annotatedClass_typedef_tearoff() async {
-    await assertNoErrorsInCode2(
-      externalCode: r'''
+    newFile(externalLibPath, r'''
 import 'package:meta/meta.dart';
 
 @experimental
 class Foo {}
 typedef Foo2 = Foo;
-''',
-      code: r'''
+''');
+
+    await resolveTestCodeWithDiagnostics(r'''
+import 'package:aaa/a.dart';
 var x = Foo2.new;
-''',
-    );
+''');
   }
 
   test_annotatedClassTypeAlias() async {
-    await assertErrorsInCode2(
-      externalCode: r'''
+    newFile(externalLibPath, r'''
 import 'package:meta/meta.dart';
 
 @experimental
 class Foo = Object with M;
 mixin M {}
-''',
-      code: r'''
+''');
+
+    await resolveTestCodeWithDiagnostics(r'''
+import 'package:aaa/a.dart';
 var x = Foo();
-''',
-      [error(diag.experimentalMemberUse, 37, 3)],
-    );
+//      ^^^
+// [diag.experimentalMemberUse] 'Foo' is experimental and could be removed or changed at any time.
+''');
   }
 
   test_insideLibrary() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'package:meta/meta.dart';
 
 @experimental
@@ -358,143 +366,149 @@
   }
 
   test_noAnnotation() async {
-    await assertNoErrorsInCode2(
-      externalCode: r'''
+    newFile(externalLibPath, r'''
 class Foo {}
-''',
-      code: r'''
+''');
+
+    await resolveTestCodeWithDiagnostics(r'''
+import 'package:aaa/a.dart';
 var x = Foo();
-''',
-    );
+''');
   }
 }
 
 @reflectiveTest
 class ExperimentalMemberUseTest extends _TestBase {
   test_assignmentExpression_compound_experimentalGetter() async {
-    await assertErrorsInCode2(
-      externalCode: r'''
+    newFile(externalLibPath, r'''
 import 'package:meta/meta.dart';
 
 @experimental
 int get x => 0;
 
 set x(int _) {}
-''',
-      code: r'''
+''');
+
+    await resolveTestCodeWithDiagnostics(r'''
+import 'package:aaa/a.dart';
 void f() {
   x += 2;
+//^
+// [diag.experimentalMemberUse] 'x' is experimental and could be removed or changed at any time.
 }
-''',
-      [error(diag.experimentalMemberUse, 42, 1)],
-    );
+''');
   }
 
   test_assignmentExpression_compound_experimentalSetter() async {
-    await assertErrorsInCode2(
-      externalCode: r'''
+    newFile(externalLibPath, r'''
 import 'package:meta/meta.dart';
 
 int get x => 0;
 
 @experimental
 set x(int _) {}
-''',
-      code: r'''
+''');
+
+    await resolveTestCodeWithDiagnostics(r'''
+import 'package:aaa/a.dart';
 void f() {
   x += 2;
+//^
+// [diag.experimentalMemberUse] 'x' is experimental and could be removed or changed at any time.
 }
-''',
-      [error(diag.experimentalMemberUse, 42, 1)],
-    );
+''');
   }
 
   test_assignmentExpression_simple_experimentalGetter() async {
-    await assertNoErrorsInCode2(
-      externalCode: r'''
+    newFile(externalLibPath, r'''
 import 'package:meta/meta.dart';
 
 @experimental
 int get x => 0;
 
 set x(int _) {}
-''',
-      code: r'''
+''');
+
+    await resolveTestCodeWithDiagnostics(r'''
+import 'package:aaa/a.dart';
 void f() {
   x = 0;
 }
-''',
-    );
+''');
   }
 
   test_assignmentExpression_simple_experimentalGetterSetter() async {
-    await assertErrorsInCode2(
-      externalCode: r'''
+    newFile(externalLibPath, r'''
 import 'package:meta/meta.dart';
 
 @experimental
 int x = 1;
-''',
-      code: r'''
+''');
+
+    await resolveTestCodeWithDiagnostics(r'''
+import 'package:aaa/a.dart';
 void f() {
   x = 0;
+//^
+// [diag.experimentalMemberUse] 'x' is experimental and could be removed or changed at any time.
 }
-''',
-      [error(diag.experimentalMemberUse, 42, 1)],
-    );
+''');
   }
 
   test_assignmentExpression_simple_experimentalSetter() async {
-    await assertErrorsInCode2(
-      externalCode: r'''
+    newFile(externalLibPath, r'''
 import 'package:meta/meta.dart';
 
 int get x => 0;
 
 @experimental
 set x(int _) {}
-''',
-      code: r'''
+''');
+
+    await resolveTestCodeWithDiagnostics(r'''
+import 'package:aaa/a.dart';
 void f() {
   x = 0;
+//^
+// [diag.experimentalMemberUse] 'x' is experimental and could be removed or changed at any time.
 }
-''',
-      [error(diag.experimentalMemberUse, 42, 1)],
-    );
+''');
   }
 
   test_call() async {
-    await assertErrorsInCode2(
-      externalCode: r'''
+    newFile(externalLibPath, r'''
 import 'package:meta/meta.dart';
 
 class A {
   @experimental
   call() {}
 }
-''',
-      code: r'''
+''');
+
+    await resolveTestCodeWithDiagnostics(r'''
+import 'package:aaa/a.dart';
 void f(A a) {
   a();
+//^^^
+// [diag.experimentalMemberUse] 'call' is experimental and could be removed or changed at any time.
 }
-''',
-      [error(diag.experimentalMemberUse, 45, 3)],
-    );
+''');
   }
 
   test_class() async {
-    await assertErrorsInCode2(
-      externalCode: r'''
+    newFile(externalLibPath, r'''
 import 'package:meta/meta.dart';
 
 @experimental
 class A {}
-''',
-      code: r'''
+''');
+
+    await resolveTestCodeWithDiagnostics(r'''
+import 'package:aaa/a.dart';
 void f(A a) {}
-''',
-      [error(diag.experimentalMemberUse, 36, 1)],
-    );
+//     ^
+// [diag.experimentalMemberUse] 'A' is experimental and could be removed or changed at any time.
+''');
   }
 
   test_class_inExperimentalFunctionTypeAlias() async {
@@ -505,7 +519,7 @@
 class A {}
 ''');
 
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'package:meta/meta.dart';
 import 'package:aaa/a.dart';
 
@@ -522,7 +536,7 @@
 class A {}
 ''');
 
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'package:meta/meta.dart';
 import 'package:aaa/a.dart';
 
@@ -532,22 +546,23 @@
   }
 
   test_compoundAssignment() async {
-    await assertErrorsInCode2(
-      externalCode: r'''
+    newFile(externalLibPath, r'''
 import 'package:meta/meta.dart';
 
 class A {
   @experimental
   A operator+(A a) { return a; }
 }
-''',
-      code: r'''
+''');
+
+    await resolveTestCodeWithDiagnostics(r'''
+import 'package:aaa/a.dart';
 f(A a, A b) {
   a += b;
+//^^^^^^
+// [diag.experimentalMemberUse] '+' is experimental and could be removed or changed at any time.
 }
-''',
-      [error(diag.experimentalMemberUse, 45, 6)],
-    );
+''');
   }
 
   test_dotShorthandConstructorInvocation_experimentalClass_experimentalConstructor() async {
@@ -563,19 +578,17 @@
 void g(A a) {}
 ''');
 
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'package:aaa/a.dart';
 
 void f() {
   g(.new());
+//  ^^^^^^
+// [diag.experimentalMemberUse] 'A' is experimental and could be removed or changed at any time.
+//   ^^^
+// [diag.experimentalMemberUse] 'A' is experimental and could be removed or changed at any time.
 }
-''',
-      [
-        error(diag.experimentalMemberUse, 45, 6),
-        error(diag.experimentalMemberUse, 46, 3),
-      ],
-    );
+''');
   }
 
   test_dotShorthandConstructorInvocation_experimentalClass_unexperimentalConstructor() async {
@@ -589,16 +602,15 @@
 void g(A a) {}
 ''');
 
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'package:aaa/a.dart';
 
 void f() {
   g(.new());
+//  ^^^^^^
+// [diag.experimentalMemberUse] 'A' is experimental and could be removed or changed at any time.
 }
-''',
-      [error(diag.experimentalMemberUse, 45, 6)],
-    );
+''');
   }
 
   test_dotShorthandConstructorInvocation_experimentalClass_unexperimentalNamedConstructor() async {
@@ -612,21 +624,19 @@
 void g(A _) {}
 ''');
 
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'package:aaa/a.dart';
 
 void f() {
   g(.a());
+//  ^^^^
+// [diag.experimentalMemberUse] 'A' is experimental and could be removed or changed at any time.
 }
-''',
-      [error(diag.experimentalMemberUse, 45, 4)],
-    );
+''');
   }
 
   test_dotShorthandConstructorInvocation_namedConstructor() async {
-    await assertErrorsInCode2(
-      externalCode: r'''
+    newFile(externalLibPath, r'''
 import 'package:meta/meta.dart';
 
 class A {
@@ -634,23 +644,16 @@
   A.named(int i) {}
 }
 void g(A a) {}
-''',
-      code: r'''
+''');
+
+    await resolveTestCodeWithDiagnostics(r'''
+import 'package:aaa/a.dart';
 f() {
   g(.named(1));
+//   ^^^^^
+// [diag.experimentalMemberUse] 'A.named' is experimental and could be removed or changed at any time.
 }
-''',
-      [
-        error(
-          diag.experimentalMemberUse,
-          40,
-          5,
-          messageContains: [
-            "'A.named' is experimental and could be removed or changed at any time.",
-          ],
-        ),
-      ],
-    );
+''');
   }
 
   test_dotShorthandConstructorInvocation_unexperimentalClass_experimentalConstructor() async {
@@ -664,58 +667,59 @@
 void g(A a) {}
 ''');
 
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'package:aaa/a.dart';
 
 void f() {
   g(.new());
+//   ^^^
+// [diag.experimentalMemberUse] 'A' is experimental and could be removed or changed at any time.
 }
-''',
-      [error(diag.experimentalMemberUse, 46, 3)],
-    );
+''');
   }
 
   test_experimentalField_inObjectPattern_explicitName() async {
-    await assertErrorsInCode2(
-      externalCode: r'''
+    newFile(externalLibPath, r'''
 import 'package:meta/meta.dart';
 
 class C {
   @experimental
   final int foo = 0;
 }
-''',
-      code: '''
+''');
+
+    await resolveTestCodeWithDiagnostics(r'''
+import 'package:aaa/a.dart';
 int g(Object s) =>
   switch (s) {
     C(foo: var f) => f,
+//    ^^^
+// [diag.experimentalMemberUse] 'foo' is experimental and could be removed or changed at any time.
     _ => 7,
   };
-''',
-      [error(diag.experimentalMemberUse, 69, 3)],
-    );
+''');
   }
 
   test_experimentalField_inObjectPattern_inferredName() async {
-    await assertErrorsInCode2(
-      externalCode: r'''
+    newFile(externalLibPath, r'''
 import 'package:meta/meta.dart';
 
 class C {
   @experimental
   final int foo = 0;
 }
-''',
-      code: '''
+''');
+
+    await resolveTestCodeWithDiagnostics(r'''
+import 'package:aaa/a.dart';
 int g(Object s) =>
   switch (s) {
     C(:var foo) => foo,
+//         ^^^
+// [diag.experimentalMemberUse] 'foo' is experimental and could be removed or changed at any time.
     _ => 7,
   };
-''',
-      [error(diag.experimentalMemberUse, 74, 3)],
-    );
+''');
   }
 
   test_export() async {
@@ -726,12 +730,10 @@
 library a;
 ''');
 
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 export 'package:aaa/a.dart';
-''',
-      [error(diag.experimentalMemberUse, 0, 28)],
-    );
+// [diag.experimentalMemberUse][column 1][length 28] 'package:aaa/a.dart' is experimental and could be removed or changed at any time.
+''');
   }
 
   test_export_fromSamePackage() async {
@@ -742,28 +744,29 @@
 library a;
 ''');
 
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 export 'lib2.dart';
 ''');
   }
 
   test_extensionOverride() async {
-    await assertErrorsInCode2(
-      externalCode: r'''
+    newFile(externalLibPath, r'''
 import 'package:meta/meta.dart';
 
 @experimental
 extension E on int {
   int get foo => 0;
 }
-''',
-      code: '''
+''');
+
+    await resolveTestCodeWithDiagnostics(r'''
+import 'package:aaa/a.dart';
 void f() {
   E(0).foo;
+//^
+// [diag.experimentalMemberUse] 'E' is experimental and could be removed or changed at any time.
 }
-''',
-      [error(diag.experimentalMemberUse, 42, 1)],
-    );
+''');
   }
 
   test_field_implicitGetter() async {
@@ -798,16 +801,15 @@
 }
 ''');
 
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'package:aaa/a.dart';
 
 void f(A a) {
   a.foo = 0;
+//  ^^^
+// [diag.experimentalMemberUse] 'foo' is experimental and could be removed or changed at any time.
 }
-''',
-      [error(diag.experimentalMemberUse, 48, 3)],
-    );
+''');
   }
 
   test_field_inExperimentalConstructor() async {
@@ -820,7 +822,7 @@
 }
 ''');
 
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'package:meta/meta.dart';
 import 'package:aaa/a.dart';
 
@@ -841,9 +843,9 @@
 @experimental
 class A {}
 ''');
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 // ignore: unused_import
-import '$externalLibUri' hide A;
+import 'package:aaa/a.dart' hide A;
 ''');
   }
 
@@ -855,97 +857,89 @@
 library a;
 ''');
 
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 // ignore:unused_import
 import 'package:aaa/a.dart';
-''',
-      [
-        error(
-          diag.experimentalMemberUse,
-          24,
-          28,
-          messageContains: ['package:aaa/a.dart'],
-        ),
-      ],
-    );
+// [diag.experimentalMemberUse][column 1][length 28] 'package:aaa/a.dart' is experimental and could be removed or changed at any time.
+''');
   }
 
   test_incorrectlyNestedNamedParameterDeclaration() async {
     // This is a regression test; previously this code would cause an analyzer
     // crash in ExperimentalMemberUseVerifier.
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class C {
   final String x;
   final bool y;
 
   const C({
+//      ^
+// [diag.finalNotInitializedConstructor1] All final variables must be initialized, but 'y' isn't.
     required this.x,
     {this.y = false}
+//  ^
+// [diag.missingIdentifier] Expected an identifier.
+// [diag.expectedToken] Expected to find '}'.
   });
 }
 
 const z = C(x: '');
-''',
-      [
-        error(diag.finalNotInitializedConstructor1, 53, 1),
-        error(diag.missingIdentifier, 82, 1),
-        error(diag.expectedToken, 82, 1),
-      ],
-    );
+''');
   }
 
   test_indexExpression() async {
-    await assertErrorsInCode2(
-      externalCode: r'''
+    newFile(externalLibPath, r'''
 import 'package:meta/meta.dart';
 
 class A {
   @experimental
   operator[](int i) {}
 }
-''',
-      code: r'''
+''');
+
+    await resolveTestCodeWithDiagnostics(r'''
+import 'package:aaa/a.dart';
 void f(A a) {
   return a[1];
+//       ^^^^
+// [diag.experimentalMemberUse] '[]' is experimental and could be removed or changed at any time.
 }
-''',
-      [error(diag.experimentalMemberUse, 52, 4)],
-    );
+''');
   }
 
   test_inEnum() async {
-    await assertErrorsInCode2(
-      externalCode: r'''
+    newFile(externalLibPath, r'''
 import 'package:meta/meta.dart';
 
 @experimental
 void f() {}
-''',
-      code: r'''
+''');
+
+    await resolveTestCodeWithDiagnostics(r'''
+import 'package:aaa/a.dart';
 enum E {
   one, two;
 
   void m() {
     f();
+//  ^
+// [diag.experimentalMemberUse] 'f' is experimental and could be removed or changed at any time.
   }
 }
-''',
-      [error(diag.experimentalMemberUse, 68, 1)],
-    );
+''');
   }
 
   test_inExperimentalClass() async {
-    await assertNoErrorsInCode2(
-      externalCode: r'''
+    newFile(externalLibPath, r'''
 import 'package:meta/meta.dart';
 
 @experimental
 f() {}
-''',
-      code: r'''
+''');
+
+    await resolveTestCodeWithDiagnostics(r'''
 import 'package:meta/meta.dart';
+import 'package:aaa/a.dart';
 
 @experimental
 class C {
@@ -953,38 +947,38 @@
     f();
   }
 }
-''',
-    );
+''');
   }
 
   test_inExperimentalDefaultFormalParameter() async {
-    await assertNoErrorsInCode2(
-      externalCode: r'''
+    newFile(externalLibPath, r'''
 import 'package:meta/meta.dart';
 
 @experimental
 class C {
   const C();
 }
-''',
-      code: r'''
+''');
+
+    await resolveTestCodeWithDiagnostics(r'''
 import 'package:meta/meta.dart';
+import 'package:aaa/a.dart';
 
 f({@experimental C? c = const C()}) {}
-''',
-    );
+''');
   }
 
   test_inExperimentalEnum() async {
-    await assertNoErrorsInCode2(
-      externalCode: r'''
+    newFile(externalLibPath, r'''
 import 'package:meta/meta.dart';
 
 @experimental
 void f() {}
-''',
-      code: r'''
+''');
+
+    await resolveTestCodeWithDiagnostics(r'''
 import 'package:meta/meta.dart';
+import 'package:aaa/a.dart';
 
 @experimental
 enum E {
@@ -994,20 +988,20 @@
     f();
   }
 }
-''',
-    );
+''');
   }
 
   test_inExperimentalExtension() async {
-    await assertNoErrorsInCode2(
-      externalCode: r'''
+    newFile(externalLibPath, r'''
 import 'package:meta/meta.dart';
 
 @experimental
 void f() {}
-''',
-      code: r'''
+''');
+
+    await resolveTestCodeWithDiagnostics(r'''
 import 'package:meta/meta.dart';
+import 'package:aaa/a.dart';
 
 @experimental
 extension E on int {
@@ -1015,20 +1009,20 @@
     f();
   }
 }
-''',
-    );
+''');
   }
 
   test_inExperimentalExtensionType() async {
-    await assertNoErrorsInCode2(
-      externalCode: r'''
+    newFile(externalLibPath, r'''
 import 'package:meta/meta.dart';
 
 @experimental
 f() {}
-''',
-      code: '''
+''');
+
+    await resolveTestCodeWithDiagnostics(r'''
 import 'package:meta/meta.dart';
+import 'package:aaa/a.dart';
 
 @experimental
 extension type E(int i) {
@@ -1036,96 +1030,95 @@
     f();
   }
 }
-''',
-    );
+''');
   }
 
   test_inExperimentalField() async {
-    await assertNoErrorsInCode2(
-      externalCode: r'''
+    newFile(externalLibPath, r'''
 import 'package:meta/meta.dart';
 
 @experimental
 class C {}
-''',
-      code: r'''
+''');
+
+    await resolveTestCodeWithDiagnostics(r'''
 import 'package:meta/meta.dart';
+import 'package:aaa/a.dart';
 
 class X {
   @experimental
   C f;
   X(this.f);
 }
-''',
-    );
+''');
   }
 
   test_inExperimentalFieldFormalParameter() async {
-    await assertNoErrorsInCode2(
-      externalCode: r'''
+    newFile(externalLibPath, r'''
 import 'package:meta/meta.dart';
 
 @experimental
 class C {}
-''',
-      code: r'''
+''');
+
+    await resolveTestCodeWithDiagnostics(r'''
 import 'package:meta/meta.dart';
+import 'package:aaa/a.dart';
 
 class A {
   Object? o;
   A({@experimental C? this.o});
 }
-''',
-    );
+''');
   }
 
   test_inExperimentalFunction() async {
-    await assertNoErrorsInCode2(
-      externalCode: r'''
-import 'package:meta/meta.dart';
-
-@experimental
-f() {}
-''',
-      code: '''
-import 'package:meta/meta.dart';
-
-@experimental
-g() {
-  f();
-}
-''',
-    );
-  }
-
-  test_inExperimentalFunctionTypedFormalParameter() async {
-    await assertNoErrorsInCode2(
-      externalCode: r'''
-import 'package:meta/meta.dart';
-
-@experimental
-class C {}
-''',
-      code: r'''
-import 'package:meta/meta.dart';
-
-f({@experimental C? callback()?}) {}
-''',
-    );
-  }
-
-  test_inExperimentalLibrary() async {
     newFile(externalLibPath, r'''
 import 'package:meta/meta.dart';
 
 @experimental
 f() {}
 ''');
-    await assertNoErrorsInCode('''
+
+    await resolveTestCodeWithDiagnostics(r'''
+import 'package:meta/meta.dart';
+import 'package:aaa/a.dart';
+
+@experimental
+g() {
+  f();
+}
+''');
+  }
+
+  test_inExperimentalFunctionTypedFormalParameter() async {
+    newFile(externalLibPath, r'''
+import 'package:meta/meta.dart';
+
+@experimental
+class C {}
+''');
+
+    await resolveTestCodeWithDiagnostics(r'''
+import 'package:meta/meta.dart';
+import 'package:aaa/a.dart';
+
+f({@experimental C? callback()?}) {}
+''');
+  }
+
+  test_inExperimentalLibrary() async {
+    newFile('$workspaceRootPath/aaa/lib/a.dart', r'''
+import 'package:meta/meta.dart';
+
+@experimental
+f() {}
+''');
+    await resolveTestCodeWithDiagnostics(r'''
 @experimental
 library lib;
 import 'package:meta/meta.dart';
-import '$externalLibUri';
+import 'package:aaa/a.dart';
 
 class C {
   m() {
@@ -1136,15 +1129,16 @@
   }
 
   test_inExperimentalMethod() async {
-    await assertNoErrorsInCode2(
-      externalCode: r'''
+    newFile(externalLibPath, r'''
 import 'package:meta/meta.dart';
 
 @experimental
 f() {}
-''',
-      code: '''
+''');
+
+    await resolveTestCodeWithDiagnostics(r'''
 import 'package:meta/meta.dart';
+import 'package:aaa/a.dart';
 
 class C {
   @experimental
@@ -1152,20 +1146,20 @@
     f();
   }
 }
-''',
-    );
+''');
   }
 
   test_inExperimentalMethod_inExperimentalClass() async {
-    await assertNoErrorsInCode2(
-      externalCode: r'''
+    newFile(externalLibPath, r'''
 import 'package:meta/meta.dart';
 
 @experimental
 f() {}
-''',
-      code: '''
+''');
+
+    await resolveTestCodeWithDiagnostics(r'''
 import 'package:meta/meta.dart';
+import 'package:aaa/a.dart';
 
 @experimental
 class C {
@@ -1174,20 +1168,20 @@
     f();
   }
 }
-''',
-    );
+''');
   }
 
   test_inExperimentalMixin() async {
-    await assertNoErrorsInCode2(
-      externalCode: r'''
+    newFile(externalLibPath, r'''
 import 'package:meta/meta.dart';
 
 @experimental
 f() {}
-''',
-      code: '''
+''');
+
+    await resolveTestCodeWithDiagnostics(r'''
 import 'package:meta/meta.dart';
+import 'package:aaa/a.dart';
 
 @experimental
 mixin M {
@@ -1195,36 +1189,36 @@
     f();
   }
 }
-''',
-    );
+''');
   }
 
   test_inExperimentalSimpleFormalParameter() async {
-    await assertNoErrorsInCode2(
-      externalCode: r'''
+    newFile(externalLibPath, r'''
 import 'package:meta/meta.dart';
 
 @experimental
 class C {}
-''',
-      code: r'''
+''');
+
+    await resolveTestCodeWithDiagnostics(r'''
 import 'package:meta/meta.dart';
+import 'package:aaa/a.dart';
 
 f({@experimental C? c}) {}
-''',
-    );
+''');
   }
 
   test_inExperimentalSuperFormalParameter() async {
-    await assertNoErrorsInCode2(
-      externalCode: r'''
+    newFile(externalLibPath, r'''
 import 'package:meta/meta.dart';
 
 @experimental
 class C {}
-''',
-      code: r'''
+''');
+
+    await resolveTestCodeWithDiagnostics(r'''
 import 'package:meta/meta.dart';
+import 'package:aaa/a.dart';
 
 class A {
   A({Object? o});
@@ -1232,45 +1226,45 @@
 class B extends A {
   B({@experimental C? super.o});
 }
-''',
-    );
+''');
   }
 
   test_inExperimentalTopLevelVariable() async {
-    await assertNoErrorsInCode2(
-      externalCode: r'''
+    newFile(externalLibPath, r'''
 import 'package:meta/meta.dart';
 
 @experimental
 class C {}
 var x = C();
-''',
-      code: r'''
+''');
+
+    await resolveTestCodeWithDiagnostics(r'''
 import 'package:meta/meta.dart';
+import 'package:aaa/a.dart';
 
 @experimental
 C v = x;
-''',
-    );
+''');
   }
 
   test_inExtension() async {
-    await assertErrorsInCode2(
-      externalCode: r'''
+    newFile(externalLibPath, r'''
 import 'package:meta/meta.dart';
 
 @experimental
 void f() {}
-''',
-      code: r'''
+''');
+
+    await resolveTestCodeWithDiagnostics(r'''
+import 'package:aaa/a.dart';
 extension E on int {
   void m() {
     f();
+//  ^
+// [diag.experimentalMemberUse] 'f' is experimental and could be removed or changed at any time.
   }
 }
-''',
-      [error(diag.experimentalMemberUse, 67, 1)],
-    );
+''');
   }
 
   test_instanceCreation_experimentalClass_experimentalConstructor() async {
@@ -1284,16 +1278,15 @@
 }
 ''');
 
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'package:aaa/a.dart';
 
 void f() {
   A();
+//^
+// [diag.experimentalMemberUse] 'A' is experimental and could be removed or changed at any time.
 }
-''',
-      [error(diag.experimentalMemberUse, 43, 1)],
-    );
+''');
   }
 
   test_instanceCreation_experimentalClass_unexperimentalConstructor() async {
@@ -1306,16 +1299,15 @@
 }
 ''');
 
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'package:aaa/a.dart';
 
 void f() {
   A();
+//^
+// [diag.experimentalMemberUse] 'A' is experimental and could be removed or changed at any time.
 }
-''',
-      [error(diag.experimentalMemberUse, 43, 1)],
-    );
+''');
   }
 
   test_instanceCreation_experimentalClass_unexperimentalNamedConstructor() async {
@@ -1328,70 +1320,51 @@
 }
 ''');
 
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'package:aaa/a.dart';
 
 void f() {
   A.a();
+//^
+// [diag.experimentalMemberUse] 'A' is experimental and could be removed or changed at any time.
 }
-''',
-      [
-        // https://github.com/dart-lang/linter/issues/4752
-        // Highlights `A`.
-        error(diag.experimentalMemberUse, 43, 1),
-      ],
-    );
+''');
   }
 
   test_instanceCreation_namedConstructor() async {
-    await assertErrorsInCode2(
-      externalCode: r'''
+    newFile(externalLibPath, r'''
 import 'package:meta/meta.dart';
 
 class A {
   @experimental
   A.named(int i) {}
 }
-''',
-      code: r'''
+''');
+
+    await resolveTestCodeWithDiagnostics(r'''
+import 'package:aaa/a.dart';
 var a = A.named(1);
-''',
-      [
-        error(
-          diag.experimentalMemberUse,
-          37,
-          7,
-          messageContains: [
-            "'A.named' is experimental and could be removed or changed at any time.",
-          ],
-        ),
-      ],
-    );
+//      ^^^^^^^
+// [diag.experimentalMemberUse] 'A.named' is experimental and could be removed or changed at any time.
+''');
   }
 
   test_instanceCreation_namedConstructor_primary() async {
-    await assertErrorsInCode2(
-      externalCode: r'''
+    newFile(externalLibPath, r'''
 import 'package:meta/meta.dart';
 
 class A.named() {
   @experimental
   this;
 }
-''',
-      code: r'''
+''');
+
+    await resolveTestCodeWithDiagnostics(r'''
+import 'package:aaa/a.dart';
 var a = A.named();
-''',
-      [
-        error(
-          diag.experimentalMemberUse,
-          37,
-          7,
-          messageContains: ["'A.named' is experimental and could be removed"],
-        ),
-      ],
-    );
+//      ^^^^^^^
+// [diag.experimentalMemberUse] 'A.named' is experimental and could be removed or changed at any time.
+''');
   }
 
   test_instanceCreation_unexperimentalClass_experimentalConstructor() async {
@@ -1445,54 +1418,47 @@
 }
 ''');
 
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'package:aaa/a.dart';
 
 void f(A a) {
   a.foo();
+//  ^^^
+// [diag.experimentalMemberUse] 'foo' is experimental and could be removed or changed at any time.
 }
-''',
-      [error(diag.experimentalMemberUse, 48, 3)],
-    );
+''');
   }
 
   test_methodInvocation_constantAnnotation() async {
-    await assertErrorsInCode2(
-      externalCode: r'''
+    newFile(externalLibPath, r'''
 import 'package:meta/meta.dart';
 
 @experimental
 int f() => 0;
-''',
-      code: r'''
+''');
+
+    await resolveTestCodeWithDiagnostics(r'''
+import 'package:aaa/a.dart';
 var x = f();
-''',
-      [error(diag.experimentalMemberUse, 37, 1)],
-    );
+//      ^
+// [diag.experimentalMemberUse] 'f' is experimental and could be removed or changed at any time.
+''');
   }
 
   test_methodInvocation_constructorAnnotation() async {
-    await assertErrorsInCode2(
-      externalCode: r'''
+    newFile(externalLibPath, r'''
 import 'package:meta/meta.dart';
 
 @experimental
 int f() => 0;
-''',
-      code: r'''
+''');
+
+    await resolveTestCodeWithDiagnostics(r'''
+import 'package:aaa/a.dart';
 var x = f();
-''',
-      [
-        error(
-          diag.experimentalMemberUse,
-          37,
-          1,
-          text:
-              "'f' is experimental and could be removed or changed at any time.",
-        ),
-      ],
-    );
+//      ^
+// [diag.experimentalMemberUse] 'f' is experimental and could be removed or changed at any time.
+''');
   }
 
   test_methodInvocation_fromSamePackage() async {
@@ -1505,7 +1471,7 @@
 }
 ''');
 
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'lib2.dart';
 
 void f(A a) {
@@ -1515,7 +1481,7 @@
   }
 
   test_methodInvocation_inExperimentalConstructor() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'package:meta/meta.dart';
 
 class A {
@@ -1538,7 +1504,7 @@
 mixin A {}
 ''');
 
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'package:meta/meta.dart';
 import 'package:aaa/a.dart';
 
@@ -1550,56 +1516,57 @@
   test_namedParameterMissingName() async {
     // This is a regression test; previously this code would cause an analyzer
     // crash in ExperimentalMemberUseVerifier.
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class C {
   const C({this.});
+//         ^^^^^
+// [diag.initializingFormalForNonExistentField] '' isn't a field in the enclosing class.
+//              ^
+// [diag.missingIdentifier] Expected an identifier.
 }
 var z = C(x: '');
-''',
-      [
-        error(diag.initializingFormalForNonExistentField, 21, 5),
-        error(diag.missingIdentifier, 26, 1),
-        error(diag.undefinedNamedParameter, 42, 1),
-      ],
-    );
+//        ^
+// [diag.undefinedNamedParameter] The named parameter 'x' isn't defined.
+''');
   }
 
   test_operator() async {
-    await assertErrorsInCode2(
-      externalCode: r'''
+    newFile(externalLibPath, r'''
 import 'package:meta/meta.dart';
 
 class A {
   @experimental
   operator+(A a) {}
 }
-''',
-      code: r'''
+''');
+
+    await resolveTestCodeWithDiagnostics(r'''
+import 'package:aaa/a.dart';
 f(A a, A b) {
   return a + b;
+//       ^^^^^
+// [diag.experimentalMemberUse] '+' is experimental and could be removed or changed at any time.
 }
-''',
-      [error(diag.experimentalMemberUse, 52, 5)],
-    );
+''');
   }
 
   test_parameter_named() async {
-    await assertErrorsInCode2(
-      externalCode: r'''
+    newFile(externalLibPath, r'''
 import 'package:meta/meta.dart';
 
 void f({@experimental int x = 0}) {}
-''',
-      code: r'''
+''');
+
+    await resolveTestCodeWithDiagnostics(r'''
+import 'package:aaa/a.dart';
 void g() => f(x: 1);
-''',
-      [error(diag.experimentalMemberUse, 43, 1)],
-    );
+//            ^
+// [diag.experimentalMemberUse] 'x' is experimental and could be removed or changed at any time.
+''');
   }
 
   test_parameter_named_inDefiningConstructor_asFieldFormalParameter() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'package:meta/meta.dart';
 
 class C {
@@ -1610,7 +1577,7 @@
   }
 
   test_parameter_named_inDefiningConstructor_assertInitializer() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'package:meta/meta.dart';
 
 class C {
@@ -1620,7 +1587,7 @@
   }
 
   test_parameter_named_inDefiningConstructor_fieldInitializer() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'package:meta/meta.dart';
 
 class C {
@@ -1631,8 +1598,7 @@
   }
 
   test_parameter_named_inDefiningConstructor_inFieldFormalParameter_notName() async {
-    await assertErrorsInCode2(
-      externalCode: r'''
+    newFile(externalLibPath, r'''
 import 'package:meta/meta.dart';
 
 class A {}
@@ -1643,19 +1609,21 @@
 }
 
 const B instance = const B();
-''',
-      code: r'''
+''');
+
+    await resolveTestCodeWithDiagnostics(r'''
+import 'package:aaa/a.dart';
 class C {
   final A a;
   C({B this.a = instance});
+//   ^
+// [diag.experimentalMemberUse] 'B' is experimental and could be removed or changed at any time.
 }
-''',
-      [error(diag.experimentalMemberUse, 57, 1)],
-    );
+''');
   }
 
   test_parameter_named_inDefiningFunction() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'package:meta/meta.dart';
 
 f({@experimental int x = 0}) => x;
@@ -1663,7 +1631,7 @@
   }
 
   test_parameter_named_inDefiningLocalFunction() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'package:meta/meta.dart';
 
 class C {
@@ -1678,7 +1646,7 @@
   }
 
   test_parameter_named_inDefiningMethod() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'package:meta/meta.dart';
 
 class C {
@@ -1690,7 +1658,7 @@
   }
 
   test_parameter_named_inNestedLocalFunction() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'package:meta/meta.dart';
 
 class C {
@@ -1705,7 +1673,7 @@
   }
 
   test_parameter_named_inPrimaryConstructor_assertInitializer() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'package:meta/meta.dart';
 
 class C({@experimental int y = 0}) {
@@ -1721,16 +1689,15 @@
 void foo({@experimental int a}) {}
 ''');
 
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'package:aaa/a.dart';
 
 void f() {
   foo(a: 0);
+//    ^
+// [diag.experimentalMemberUse] 'a' is experimental and could be removed or changed at any time.
 }
-''',
-      [error(diag.experimentalMemberUse, 47, 1)],
-    );
+''');
   }
 
   test_parameter_named_ofMethod() async {
@@ -1742,45 +1709,46 @@
 }
 ''');
 
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'package:aaa/a.dart';
 
 void f(A a) {
   a.foo(a: 0);
+//      ^
+// [diag.experimentalMemberUse] 'a' is experimental and could be removed or changed at any time.
 }
-''',
-      [error(diag.experimentalMemberUse, 52, 1)],
-    );
+''');
   }
 
   test_parameter_positionalOptional() async {
-    await assertErrorsInCode2(
-      externalCode: r'''
+    newFile(externalLibPath, r'''
 import 'package:meta/meta.dart';
 
 class A {
   void foo([@experimental int x = 0]) {}
 }
-''',
-      code: '''
+''');
+
+    await resolveTestCodeWithDiagnostics(r'''
+import 'package:aaa/a.dart';
 void f(A a) {
   a.foo(0);
+//      ^
+// [diag.experimentalMemberUse] 'x' is experimental and could be removed or changed at any time.
 }
-''',
-      [error(diag.experimentalMemberUse, 51, 1)],
-    );
+''');
   }
 
   test_parameter_positionalOptional_inExperimentalConstructor() async {
-    await assertNoErrorsInCode2(
-      externalCode: r'''
+    newFile(externalLibPath, r'''
 import 'package:meta/meta.dart';
 
 void foo([@experimental int x = 0]) {}
-''',
-      code: r'''
+''');
+
+    await resolveTestCodeWithDiagnostics(r'''
 import 'package:meta/meta.dart';
+import 'package:aaa/a.dart';
 
 class A {
   @experimental
@@ -1788,39 +1756,39 @@
     foo(0);
   }
 }
-''',
-    );
+''');
   }
 
   test_parameter_positionalOptional_inExperimentalFunction() async {
-    await assertNoErrorsInCode2(
-      externalCode: r'''
+    newFile(externalLibPath, r'''
 import 'package:meta/meta.dart';
 
 class A {
   void foo([@experimental int x = 0]) {}
 }
-''',
-      code: r'''
+''');
+
+    await resolveTestCodeWithDiagnostics(r'''
 import 'package:meta/meta.dart';
+import 'package:aaa/a.dart';
 
 @experimental
 void f(A a) {
   a.foo(0);
 }
-''',
-    );
+''');
   }
 
   test_parameter_positionalOptional_inExperimentalPrimaryConstructor() async {
-    await assertNoErrorsInCode2(
-      externalCode: r'''
+    newFile(externalLibPath, r'''
 import 'package:meta/meta.dart';
 
 void foo([@experimental int x = 0]) {}
-''',
-      code: r'''
+''');
+
+    await resolveTestCodeWithDiagnostics(r'''
 import 'package:meta/meta.dart';
+import 'package:aaa/a.dart';
 
 class A() {
   @experimental
@@ -1828,179 +1796,185 @@
     foo(0);
   }
 }
-''',
-    );
+''');
   }
 
   test_parameter_positionalRequired() async {
-    await assertNoErrorsInCode2(
-      externalCode: r'''
+    newFile(externalLibPath, r'''
 import 'package:meta/meta.dart';
 
 class A {
   void foo(@experimental int x) {}
 }
-''',
-      code: r'''
+''');
+
+    await resolveTestCodeWithDiagnostics(r'''
+import 'package:aaa/a.dart';
 void f(A a) {
   a.foo(0);
 }
-''',
-    );
+''');
   }
 
   test_postfixExpression_experimentalGetter() async {
-    await assertErrorsInCode2(
-      externalCode: r'''
+    newFile(externalLibPath, r'''
 import 'package:meta/meta.dart';
 
 @experimental
 int get x => 0;
 
 set x(int _) {}
-''',
-      code: r'''
+''');
+
+    await resolveTestCodeWithDiagnostics(r'''
+import 'package:aaa/a.dart';
 void f() {
   x++;
+//^
+// [diag.experimentalMemberUse] 'x' is experimental and could be removed or changed at any time.
 }
-''',
-      [error(diag.experimentalMemberUse, 42, 1)],
-    );
+''');
   }
 
   test_postfixExpression_experimentalNothing() async {
-    await assertNoErrorsInCode2(
-      externalCode: r'''
+    newFile(externalLibPath, r'''
 int get x => 0;
 
 set x(int _) {}
-''',
-      code: r'''
+''');
+
+    await resolveTestCodeWithDiagnostics(r'''
+import 'package:aaa/a.dart';
 void f() {
   x++;
 }
-''',
-    );
+''');
   }
 
   test_postfixExpression_experimentalSetter() async {
-    await assertErrorsInCode2(
-      externalCode: r'''
+    newFile(externalLibPath, r'''
 import 'package:meta/meta.dart';
 
 int get x => 0;
 
 @experimental
 set x(int _) {}
-''',
-      code: r'''
+''');
+
+    await resolveTestCodeWithDiagnostics(r'''
+import 'package:aaa/a.dart';
 void f() {
   x++;
+//^
+// [diag.experimentalMemberUse] 'x' is experimental and could be removed or changed at any time.
 }
-''',
-      [error(diag.experimentalMemberUse, 42, 1)],
-    );
+''');
   }
 
   test_prefixedIdentifier_identifier() async {
-    await assertErrorsInCode2(
-      externalCode: r'''
+    newFile(externalLibPath, r'''
 import 'package:meta/meta.dart';
 
 class A {
   @experimental
   static const foo = 0;
 }
-''',
-      code: r'''
+''');
+
+    await resolveTestCodeWithDiagnostics(r'''
+import 'package:aaa/a.dart';
 void f() {
   A.foo;
+//  ^^^
+// [diag.experimentalMemberUse] 'foo' is experimental and could be removed or changed at any time.
 }
-''',
-      [error(diag.experimentalMemberUse, 44, 3)],
-    );
+''');
   }
 
   test_prefixedIdentifier_prefix() async {
-    await assertErrorsInCode2(
-      externalCode: r'''
+    newFile(externalLibPath, r'''
 import 'package:meta/meta.dart';
 
 @experimental
 class A {
   static const foo = 0;
 }
-''',
-      code: r'''
+''');
+
+    await resolveTestCodeWithDiagnostics(r'''
+import 'package:aaa/a.dart';
 void f() {
   A.foo;
+//^
+// [diag.experimentalMemberUse] 'A' is experimental and could be removed or changed at any time.
 }
-''',
-      [error(diag.experimentalMemberUse, 42, 1)],
-    );
+''');
   }
 
   test_prefixExpression_experimentalGetter() async {
-    await assertErrorsInCode2(
-      externalCode: r'''
+    newFile(externalLibPath, r'''
 import 'package:meta/meta.dart';
 
 @experimental
 int get x => 0;
 
 set x(int _) {}
-''',
-      code: r'''
+''');
+
+    await resolveTestCodeWithDiagnostics(r'''
+import 'package:aaa/a.dart';
 void f() {
   ++x;
+//  ^
+// [diag.experimentalMemberUse] 'x' is experimental and could be removed or changed at any time.
 }
-''',
-      [error(diag.experimentalMemberUse, 44, 1)],
-    );
+''');
   }
 
   test_prefixExpression_experimentalSetter() async {
-    await assertErrorsInCode2(
-      externalCode: r'''
+    newFile(externalLibPath, r'''
 import 'package:meta/meta.dart';
 
 int get x => 0;
 
 @experimental
 set x(int _) {}
-''',
-      code: r'''
+''');
+
+    await resolveTestCodeWithDiagnostics(r'''
+import 'package:aaa/a.dart';
 void f() {
   ++x;
+//  ^
+// [diag.experimentalMemberUse] 'x' is experimental and could be removed or changed at any time.
 }
-''',
-      [error(diag.experimentalMemberUse, 44, 1)],
-    );
+''');
   }
 
   test_propertyAccess_super() async {
-    await assertErrorsInCode2(
-      externalCode: r'''
+    newFile(externalLibPath, r'''
 import 'package:meta/meta.dart';
 
 class A {
   @experimental
   int get foo => 0;
 }
-''',
-      code: r'''
+''');
+
+    await resolveTestCodeWithDiagnostics(r'''
+import 'package:aaa/a.dart';
 class B extends A {
   void bar() {
     super.foo;
+//        ^^^
+// [diag.experimentalMemberUse] 'foo' is experimental and could be removed or changed at any time.
   }
 }
-''',
-      [error(diag.experimentalMemberUse, 74, 3)],
-    );
+''');
   }
 
   test_redirectingConstructorInvocation_namedParameter() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'package:meta/meta.dart';
 
 class A {
@@ -2020,16 +1994,14 @@
 }
 ''');
 
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'package:aaa/a.dart';
-
 void f(A a) {
   a.foo = 0;
+//  ^^^
+// [diag.experimentalMemberUse] 'foo' is experimental and could be removed or changed at any time.
 }
-''',
-      [error(diag.experimentalMemberUse, 48, 3)],
-    );
+''');
   }
 
   test_showCombinator() async {
@@ -2039,362 +2011,363 @@
 @experimental
 class A {}
 ''');
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 // ignore: unused_import
-import '$externalLibUri' show A;
-''',
-      [error(diag.experimentalMemberUse, 58, 1)],
-    );
+import 'package:aaa/a.dart' show A;
+//                               ^
+// [diag.experimentalMemberUse] 'A' is experimental and could be removed or changed at any time.
+''');
   }
 
   test_superConstructor_namedConstructor() async {
-    await assertErrorsInCode2(
-      externalCode: r'''
+    newFile(externalLibPath, r'''
 import 'package:meta/meta.dart';
 
 class A {
   @experimental
   A.named() {}
 }
-''',
-      code: r'''
+''');
+
+    await resolveTestCodeWithDiagnostics(r'''
+import 'package:aaa/a.dart';
 class B extends A {
   B() : super.named() {}
+//      ^^^^^^^^^^^^^
+// [diag.experimentalMemberUse] 'A.named' is experimental and could be removed or changed at any time.
 }
-''',
-      [
-        error(
-          diag.experimentalMemberUse,
-          57,
-          13,
-          text:
-              "'A.named' is experimental and could be removed or changed at any time.",
-        ),
-      ],
-    );
+''');
   }
 
   test_superConstructor_unnamedConstructor() async {
-    await assertErrorsInCode2(
-      externalCode: r'''
+    newFile(externalLibPath, r'''
 import 'package:meta/meta.dart';
 
 class A {
   @experimental
   A() {}
 }
-''',
-      code: r'''
+''');
+
+    await resolveTestCodeWithDiagnostics(r'''
+import 'package:aaa/a.dart';
 class B extends A {
   B() : super() {}
+//      ^^^^^^^
+// [diag.experimentalMemberUse] 'A' is experimental and could be removed or changed at any time.
 }
-''',
-      [
-        error(
-          diag.experimentalMemberUse,
-          57,
-          7,
-          text:
-              "'A' is experimental and could be removed or changed at any time.",
-        ),
-      ],
-    );
+''');
   }
 
   test_topLevelVariable_argument() async {
-    await assertErrorsInCode2(
-      externalCode: r'''
+    newFile(externalLibPath, r'''
 import 'package:meta/meta.dart';
 
 @experimental
 int x = 1;
-''',
-      code: r'''
+''');
+
+    await resolveTestCodeWithDiagnostics(r'''
+import 'package:aaa/a.dart';
 void f() {
   print(x);
+//      ^
+// [diag.experimentalMemberUse] 'x' is experimental and could be removed or changed at any time.
 }
-''',
-      [error(diag.experimentalMemberUse, 48, 1)],
-    );
+''');
   }
 
   test_topLevelVariable_assignment_right() async {
-    await assertErrorsInCode2(
-      externalCode: r'''
+    newFile(externalLibPath, r'''
 import 'package:meta/meta.dart';
 
 @experimental
 int x = 1;
-''',
-      code: r'''
+''');
+
+    await resolveTestCodeWithDiagnostics(r'''
+import 'package:aaa/a.dart';
 void f(int a) {
   a = x;
+//    ^
+// [diag.experimentalMemberUse] 'x' is experimental and could be removed or changed at any time.
 }
-''',
-      [error(diag.experimentalMemberUse, 51, 1)],
-    );
+''');
   }
 
   test_topLevelVariable_binaryExpression() async {
-    await assertErrorsInCode2(
-      externalCode: r'''
+    newFile(externalLibPath, r'''
 import 'package:meta/meta.dart';
 
 @experimental
 int x = 1;
-''',
-      code: r'''
+''');
+
+    await resolveTestCodeWithDiagnostics(r'''
+import 'package:aaa/a.dart';
 void f() {
   x + 1;
+//^
+// [diag.experimentalMemberUse] 'x' is experimental and could be removed or changed at any time.
 }
-''',
-      [error(diag.experimentalMemberUse, 42, 1)],
-    );
+''');
   }
 
   test_topLevelVariable_constructorFieldInitializer() async {
-    await assertErrorsInCode2(
-      externalCode: r'''
+    newFile(externalLibPath, r'''
 import 'package:meta/meta.dart';
 
 @experimental
 const int x = 1;
-''',
-      code: r'''
+''');
+
+    await resolveTestCodeWithDiagnostics(r'''
+import 'package:aaa/a.dart';
 class A {
   final int f;
   A() : f = x;
+//          ^
+// [diag.experimentalMemberUse] 'x' is experimental and could be removed or changed at any time.
 }
-''',
-      [error(diag.experimentalMemberUse, 66, 1)],
-    );
+''');
   }
 
   test_topLevelVariable_expressionFunctionBody() async {
-    await assertErrorsInCode2(
-      externalCode: r'''
+    newFile(externalLibPath, r'''
 import 'package:meta/meta.dart';
 
 @experimental
 int x = 1;
-''',
-      code: r'''
+''');
+
+    await resolveTestCodeWithDiagnostics(r'''
+import 'package:aaa/a.dart';
 int f() => x;
-''',
-      [error(diag.experimentalMemberUse, 40, 1)],
-    );
+//         ^
+// [diag.experimentalMemberUse] 'x' is experimental and could be removed or changed at any time.
+''');
   }
 
   test_topLevelVariable_expressionStatement() async {
-    await assertErrorsInCode2(
-      externalCode: r'''
+    newFile(externalLibPath, r'''
 import 'package:meta/meta.dart';
 
 @experimental
 int x = 1;
-''',
-      code: r'''
+''');
+
+    await resolveTestCodeWithDiagnostics(r'''
+import 'package:aaa/a.dart';
 void f() {
   x;
+//^
+// [diag.experimentalMemberUse] 'x' is experimental and could be removed or changed at any time.
 }
-''',
-      [error(diag.experimentalMemberUse, 42, 1)],
-    );
+''');
   }
 
   test_topLevelVariable_forElement_condition() async {
-    await assertErrorsInCode2(
-      externalCode: r'''
+    newFile(externalLibPath, r'''
 import 'package:meta/meta.dart';
 
 @experimental
 var x = true;
-''',
-      code: r'''
+''');
+
+    await resolveTestCodeWithDiagnostics(r'''
+import 'package:aaa/a.dart';
 void f() {
   [for (;x;) 0];
+//       ^
+// [diag.experimentalMemberUse] 'x' is experimental and could be removed or changed at any time.
 }
-''',
-      [error(diag.experimentalMemberUse, 49, 1)],
-    );
+''');
   }
 
   test_topLevelVariable_forStatement_condition() async {
-    await assertErrorsInCode2(
-      externalCode: r'''
+    newFile(externalLibPath, r'''
 import 'package:meta/meta.dart';
 
 @experimental
 var x = true;
-''',
-      code: r'''
+''');
+
+    await resolveTestCodeWithDiagnostics(r'''
+import 'package:aaa/a.dart';
 void f() {
   for (;x;) {}
+//      ^
+// [diag.experimentalMemberUse] 'x' is experimental and could be removed or changed at any time.
 }
-''',
-      [error(diag.experimentalMemberUse, 48, 1)],
-    );
+''');
   }
 
   test_topLevelVariable_ifElement_condition() async {
-    await assertErrorsInCode2(
-      externalCode: r'''
+    newFile(externalLibPath, r'''
 import 'package:meta/meta.dart';
 
 @experimental
 var x = true;
-''',
-      code: r'''
+''');
+
+    await resolveTestCodeWithDiagnostics(r'''
+import 'package:aaa/a.dart';
 void f() {
   [if (x) 0];
+//     ^
+// [diag.experimentalMemberUse] 'x' is experimental and could be removed or changed at any time.
 }
-''',
-      [error(diag.experimentalMemberUse, 47, 1)],
-    );
+''');
   }
 
   test_topLevelVariable_ifStatement_condition() async {
-    await assertErrorsInCode2(
-      externalCode: r'''
+    newFile(externalLibPath, r'''
 import 'package:meta/meta.dart';
 
 @experimental
 var x = true;
-''',
-      code: r'''
+''');
+
+    await resolveTestCodeWithDiagnostics(r'''
+import 'package:aaa/a.dart';
 void f() {
   if (x) {}
+//    ^
+// [diag.experimentalMemberUse] 'x' is experimental and could be removed or changed at any time.
 }
-''',
-      [error(diag.experimentalMemberUse, 46, 1)],
-    );
+''');
   }
 
   test_topLevelVariable_listLiteral() async {
-    await assertErrorsInCode2(
-      externalCode: r'''
+    newFile(externalLibPath, r'''
 import 'package:meta/meta.dart';
 
 @experimental
 int x = 1;
-''',
-      code: r'''
+''');
+
+    await resolveTestCodeWithDiagnostics(r'''
+import 'package:aaa/a.dart';
 void f() {
   [x];
+// ^
+// [diag.experimentalMemberUse] 'x' is experimental and could be removed or changed at any time.
 }
-''',
-      [error(diag.experimentalMemberUse, 43, 1)],
-    );
+''');
   }
 
   test_topLevelVariable_mapLiteralEntry() async {
-    await assertErrorsInCode2(
-      externalCode: r'''
+    newFile(externalLibPath, r'''
 import 'package:meta/meta.dart';
 
 @experimental
 int x = 1;
-''',
-      code: r'''
+''');
+
+    await resolveTestCodeWithDiagnostics(r'''
+import 'package:aaa/a.dart';
 void f() {
   ({0: x, x: 0});
+//     ^
+// [diag.experimentalMemberUse] 'x' is experimental and could be removed or changed at any time.
+//        ^
+// [diag.experimentalMemberUse] 'x' is experimental and could be removed or changed at any time.
 }
-''',
-      [
-        error(diag.experimentalMemberUse, 47, 1),
-        error(diag.experimentalMemberUse, 50, 1),
-      ],
-    );
+''');
   }
 
   test_topLevelVariable_namedExpression() async {
-    await assertErrorsInCode2(
-      externalCode: r'''
+    newFile(externalLibPath, r'''
 import 'package:meta/meta.dart';
 
 @experimental
 int x = 1;
-''',
-      code: r'''
+''');
+
+    await resolveTestCodeWithDiagnostics(r'''
+import 'package:aaa/a.dart';
 void g({int a = 0}) {}
 void f() {
   g(a: x);
+//     ^
+// [diag.experimentalMemberUse] 'x' is experimental and could be removed or changed at any time.
 }
-''',
-      [error(diag.experimentalMemberUse, 70, 1)],
-    );
+''');
   }
 
   test_topLevelVariable_returnStatement() async {
-    await assertErrorsInCode2(
-      externalCode: r'''
+    newFile(externalLibPath, r'''
 import 'package:meta/meta.dart';
 
 @experimental
 int x = 1;
-''',
-      code: r'''
+''');
+
+    await resolveTestCodeWithDiagnostics(r'''
+import 'package:aaa/a.dart';
 int f() {
   return x;
+//       ^
+// [diag.experimentalMemberUse] 'x' is experimental and could be removed or changed at any time.
 }
-''',
-      [error(diag.experimentalMemberUse, 48, 1)],
-    );
+''');
   }
 
   test_topLevelVariable_setLiteral() async {
-    await assertErrorsInCode2(
-      externalCode: r'''
+    newFile(externalLibPath, r'''
 import 'package:meta/meta.dart';
 
 @experimental
 int x = 1;
-''',
-      code: r'''
+''');
+
+    await resolveTestCodeWithDiagnostics(r'''
+import 'package:aaa/a.dart';
 void f() {
   ({x});
+//  ^
+// [diag.experimentalMemberUse] 'x' is experimental and could be removed or changed at any time.
 }
-''',
-      [error(diag.experimentalMemberUse, 44, 1)],
-    );
+''');
   }
 
   test_topLevelVariable_spreadElement() async {
-    await assertErrorsInCode2(
-      externalCode: r'''
+    newFile(externalLibPath, r'''
 import 'package:meta/meta.dart';
 
 @experimental
 var x = [0];
-''',
-      code: r'''
+''');
+
+    await resolveTestCodeWithDiagnostics(r'''
+import 'package:aaa/a.dart';
 void f() {
   [...x];
+//    ^
+// [diag.experimentalMemberUse] 'x' is experimental and could be removed or changed at any time.
 }
-''',
-      [error(diag.experimentalMemberUse, 46, 1)],
-    );
+''');
   }
 
   test_topLevelVariable_switchCase() async {
-    await assertErrorsInCode2(
-      externalCode: r'''
+    newFile(externalLibPath, r'''
 import 'package:meta/meta.dart';
 
 @experimental
 const int x = 1;
-''',
-      code: r'''
+''');
+
+    await resolveTestCodeWithDiagnostics(r'''
+import 'package:aaa/a.dart';
 void f(int a) {
   switch (a) {
     case x:
+//       ^
+// [diag.experimentalMemberUse] 'x' is experimental and could be removed or changed at any time.
       break;
   }
 }
-''',
-      [error(diag.experimentalMemberUse, 69, 1)],
-    );
+''');
   }
 
   test_topLevelVariable_switchCase_language219() async {
@@ -2404,36 +2377,36 @@
 @experimental
 const int x = 1;
 ''');
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 // @dart = 2.19
-import '$externalLibUri';
+import 'package:aaa/a.dart';
 void f(int a) {
   switch (a) {
     case x:
+//       ^
+// [diag.experimentalMemberUse] 'x' is experimental and could be removed or changed at any time.
       break;
   }
 }
-''',
-      [error(diag.experimentalMemberUse, 85, 1)],
-    );
+''');
   }
 
   test_topLevelVariable_switchStatement() async {
-    await assertErrorsInCode2(
-      externalCode: r'''
+    newFile(externalLibPath, r'''
 import 'package:meta/meta.dart';
 
 @experimental
 int x = 1;
-''',
-      code: r'''
+''');
+
+    await resolveTestCodeWithDiagnostics(r'''
+import 'package:aaa/a.dart';
 void f() {
   switch (x) {}
+//        ^
+// [diag.experimentalMemberUse] 'x' is experimental and could be removed or changed at any time.
 }
-''',
-      [error(diag.experimentalMemberUse, 50, 1)],
-    );
+''');
   }
 
   test_topLevelVariable_switchStatement_language219() async {
@@ -2443,68 +2416,70 @@
 @experimental
 int x = 1;
 ''');
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 // @dart = 2.19
-import '$externalLibUri';
+import 'package:aaa/a.dart';
 void f() {
   switch (x) {}
+//        ^
+// [diag.experimentalMemberUse] 'x' is experimental and could be removed or changed at any time.
 }
-''',
-      [error(diag.experimentalMemberUse, 66, 1)],
-    );
+''');
   }
 
   test_topLevelVariable_unaryExpression() async {
-    await assertErrorsInCode2(
-      externalCode: r'''
+    newFile(externalLibPath, r'''
 import 'package:meta/meta.dart';
 
 @experimental
 int x = 1;
-''',
-      code: r'''
+''');
+
+    await resolveTestCodeWithDiagnostics(r'''
+import 'package:aaa/a.dart';
 void f() {
   -x;
+// ^
+// [diag.experimentalMemberUse] 'x' is experimental and could be removed or changed at any time.
 }
-''',
-      [error(diag.experimentalMemberUse, 43, 1)],
-    );
+''');
   }
 
   test_topLevelVariable_variableDeclaration_initializer() async {
-    await assertErrorsInCode2(
-      externalCode: r'''
+    newFile(externalLibPath, r'''
 import 'package:meta/meta.dart';
 
 @experimental
 var x = 1;
-''',
-      code: r'''
+''');
+
+    await resolveTestCodeWithDiagnostics(r'''
+import 'package:aaa/a.dart';
 void f() {
   // ignore: unused_local_variable
   var v = x;
+//        ^
+// [diag.experimentalMemberUse] 'x' is experimental and could be removed or changed at any time.
 }
-''',
-      [error(diag.experimentalMemberUse, 85, 1)],
-    );
+''');
   }
 
   test_topLevelVariable_whileStatement_condition() async {
-    await assertErrorsInCode2(
-      externalCode: r'''
+    newFile(externalLibPath, r'''
 import 'package:meta/meta.dart';
 
 @experimental
 var x = true;
-''',
-      code: r'''
+''');
+
+    await resolveTestCodeWithDiagnostics(r'''
+import 'package:aaa/a.dart';
 void f() {
   while (x) {}
+//       ^
+// [diag.experimentalMemberUse] 'x' is experimental and could be removed or changed at any time.
 }
-''',
-      [error(diag.experimentalMemberUse, 49, 1)],
-    );
+''');
   }
 
   @override
@@ -2517,86 +2492,91 @@
 @reflectiveTest
 class ExperimentalMixinTest extends _TestBase {
   test_annotatedClass_typedef() async {
-    await assertErrorsInCode2(
-      externalCode: r'''
+    newFile(externalLibPath, r'''
 import 'package:meta/meta.dart';
 
 @experimental
 mixin class Foo {}
 typedef Foo2 = Foo;
-''',
-      code: r'''
+''');
+
+    await resolveTestCodeWithDiagnostics(r'''
+import 'package:aaa/a.dart';
 class Bar with Foo {}
-''',
-      [error(diag.experimentalMemberUse, 44, 3)],
-    );
+//             ^^^
+// [diag.experimentalMemberUse] 'Foo' is experimental and could be removed or changed at any time.
+''');
   }
 
   test_annotatedClassTypeAlias() async {
-    await assertErrorsInCode2(
-      externalCode: r'''
+    newFile(externalLibPath, r'''
 mixin M {}
 import 'package:meta/meta.dart';
 
 @experimental
 mixin class Foo = Object with M;
-''',
-      code: r'''
+''');
+
+    await resolveTestCodeWithDiagnostics(r'''
+import 'package:aaa/a.dart';
 class Bar with Foo {}
-''',
-      [error(diag.experimentalMemberUse, 44, 3)],
-    );
+//             ^^^
+// [diag.experimentalMemberUse] 'Foo' is experimental and could be removed or changed at any time.
+''');
   }
 
   test_class() async {
-    await assertErrorsInCode2(
-      externalCode: r'''
+    newFile(externalLibPath, r'''
 import 'package:meta/meta.dart';
 
 @experimental
 mixin class Foo {}
-''',
-      code: r'''
+''');
+
+    await resolveTestCodeWithDiagnostics(r'''
+import 'package:aaa/a.dart';
 class Bar with Foo {}
-''',
-      [error(diag.experimentalMemberUse, 44, 3)],
-    );
+//             ^^^
+// [diag.experimentalMemberUse] 'Foo' is experimental and could be removed or changed at any time.
+''');
   }
 
   test_classTypeAlias() async {
-    await assertErrorsInCode2(
-      externalCode: r'''
+    newFile(externalLibPath, r'''
 import 'package:meta/meta.dart';
 
 @experimental
 mixin class Foo {}
-''',
-      code: r'''
+''');
+
+    await resolveTestCodeWithDiagnostics(r'''
+import 'package:aaa/a.dart';
 class Bar = Object with Foo;
-''',
-      [error(diag.experimentalMemberUse, 53, 3)],
-    );
+//                      ^^^
+// [diag.experimentalMemberUse] 'Foo' is experimental and could be removed or changed at any time.
+''');
   }
 
   test_enum() async {
-    await assertErrorsInCode2(
-      externalCode: r'''
+    newFile(externalLibPath, r'''
 import 'package:meta/meta.dart';
 
 @experimental
 mixin class Foo {}
-''',
-      code: r'''
+''');
+
+    await resolveTestCodeWithDiagnostics(r'''
+import 'package:aaa/a.dart';
 enum Bar with Foo {
+//            ^^^
+// [diag.experimentalMemberUse] 'Foo' is experimental and could be removed or changed at any time.
   one, two;
 }
-''',
-      [error(diag.experimentalMemberUse, 43, 3)],
-    );
+''');
   }
 
   test_insideLibrary() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'package:meta/meta.dart';
 
 @experimental
@@ -2606,14 +2586,14 @@
   }
 
   test_noAnnotation() async {
-    await assertNoErrorsInCode2(
-      externalCode: r'''
+    newFile(externalLibPath, r'''
 mixin class Foo {}
-''',
-      code: r'''
+''');
+
+    await resolveTestCodeWithDiagnostics(r'''
+import 'package:aaa/a.dart';
 class Bar with Foo {}
-''',
-    );
+''');
   }
 }
 
diff --git a/pkg/analyzer/test/src/diagnostics/export_internal_library_test.dart b/pkg/analyzer/test/src/diagnostics/export_internal_library_test.dart
index 16173c0..2f33ab4 100644
--- a/pkg/analyzer/test/src/diagnostics/export_internal_library_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/export_internal_library_test.dart
@@ -2,7 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/src/diagnostic/diagnostic.dart' as diag;
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../dart/resolution/context_collection_resolution.dart';
@@ -16,18 +15,9 @@
 @reflectiveTest
 class ExportInternalLibraryTest extends PubPackageResolutionTest {
   test_export_internal_library() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 export 'dart:_internal';
-''',
-      [
-        error(
-          diag.exportInternalLibrary,
-          0,
-          24,
-          messageContains: ["library 'dart:_internal' "],
-        ),
-      ],
-    );
+// [diag.exportInternalLibrary][column 1][length 24] The library 'dart:_internal' is internal and can't be exported.
+''');
   }
 }
diff --git a/pkg/analyzer/test/src/diagnostics/export_of_non_library_test.dart b/pkg/analyzer/test/src/diagnostics/export_of_non_library_test.dart
index 6f51ac5..27c1f25 100644
--- a/pkg/analyzer/test/src/diagnostics/export_of_non_library_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/export_of_non_library_test.dart
@@ -2,7 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/src/diagnostic/diagnostic.dart' as diag;
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../dart/resolution/context_collection_resolution.dart';
@@ -19,25 +18,17 @@
     newFile('$testPackageLibPath/lib1.dart', '''
 part of lib;
 ''');
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 library L;
 export 'lib1.dart';
-''',
-      [
-        error(
-          diag.exportOfNonLibrary,
-          18,
-          11,
-          messageContains: ["library 'lib1.dart' "],
-        ),
-      ],
-    );
+//     ^^^^^^^^^^^
+// [diag.exportOfNonLibrary] The exported library 'lib1.dart' can't have a part-of directive.
+''');
   }
 
   test_libraryDeclared() async {
     newFile('$testPackageLibPath/lib1.dart', "library lib1;");
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 library L;
 export 'lib1.dart';
 ''');
@@ -45,7 +36,7 @@
 
   test_libraryNotDeclared() async {
     newFile('$testPackageLibPath/lib1.dart', '');
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 library L;
 export 'lib1.dart';
 ''');
diff --git a/pkg/analyzer/test/src/diagnostics/expression_in_map_test.dart b/pkg/analyzer/test/src/diagnostics/expression_in_map_test.dart
index 96be76e..cbf89d7 100644
--- a/pkg/analyzer/test/src/diagnostics/expression_in_map_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/expression_in_map_test.dart
@@ -2,7 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/src/diagnostic/diagnostic.dart' as diag;
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../dart/resolution/context_collection_resolution.dart';
@@ -16,20 +15,18 @@
 @reflectiveTest
 class ExpressionInMapTest extends PubPackageResolutionTest {
   test_map() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 var m = <String, int>{'a', 'b' : 2};
-''',
-      [error(diag.expressionInMap, 22, 3)],
-    );
+//                    ^^^
+// [diag.expressionInMap] Expressions can't be used in a map literal.
+''');
   }
 
   test_map_const() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 const m = <String, int>{'a', 'b' : 2};
-''',
-      [error(diag.expressionInMap, 24, 3)],
-    );
+//                      ^^^
+// [diag.expressionInMap] Expressions can't be used in a map literal.
+''');
   }
 }
diff --git a/pkg/analyzer/test/src/diagnostics/extends_deferred_class_test.dart b/pkg/analyzer/test/src/diagnostics/extends_deferred_class_test.dart
index 5151a32..125c38b 100644
--- a/pkg/analyzer/test/src/diagnostics/extends_deferred_class_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/extends_deferred_class_test.dart
@@ -2,7 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/src/diagnostic/diagnostic.dart' as diag;
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../dart/resolution/context_collection_resolution.dart';
@@ -20,15 +19,14 @@
 library lib1;
 class A {}
 ''');
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 library root;
 import 'lib1.dart' deferred as a;
 mixin M {}
 class C = a.A with M;
-''',
-      [error(diag.extendsDeferredClass, 69, 3)],
-    );
+//        ^^^
+// [diag.extendsDeferredClass] Classes can't extend deferred classes.
+''');
   }
 
   test_extends_deferred_class() async {
@@ -36,14 +34,13 @@
 library lib1;
 class A {}
 ''');
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 library root;
 import 'lib1.dart' deferred as a;
 class B extends a.A {}
-''',
-      [error(diag.extendsDeferredClass, 64, 3)],
-    );
+//              ^^^
+// [diag.extendsDeferredClass] Classes can't extend deferred classes.
+''');
   }
 
   test_extends_deferred_interfaceTypeTypedef() async {
@@ -52,13 +49,12 @@
 class A {}
 class B {}
 ''');
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 library root;
 import 'lib1.dart' deferred as a;
 class B extends a.B {}
-''',
-      [error(diag.extendsDeferredClass, 64, 3)],
-    );
+//              ^^^
+// [diag.extendsDeferredClass] Classes can't extend deferred classes.
+''');
   }
 }
diff --git a/pkg/analyzer/test/src/diagnostics/extends_disallowed_class_test.dart b/pkg/analyzer/test/src/diagnostics/extends_disallowed_class_test.dart
index 5e7c715b..edd1fb9 100644
--- a/pkg/analyzer/test/src/diagnostics/extends_disallowed_class_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/extends_disallowed_class_test.dart
@@ -16,107 +16,96 @@
 @reflectiveTest
 class ExtendsDisallowedClassTest extends PubPackageResolutionTest {
   test_class_bool() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 class A extends bool {}
-''',
-      [error(diag.extendsDisallowedClass, 16, 4)],
-    );
+//              ^^^^
+// [diag.extendsDisallowedClass] Classes can't extend 'bool'.
+''');
   }
 
   test_class_double() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 class A extends double {}
-''',
-      [error(diag.extendsDisallowedClass, 16, 6)],
-    );
+//              ^^^^^^
+// [diag.extendsDisallowedClass] Classes can't extend 'double'.
+''');
   }
 
   test_class_FutureOr() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'dart:async';
 class A extends FutureOr {}
-''',
-      [error(diag.extendsDisallowedClass, 37, 8)],
-    );
+//              ^^^^^^^^
+// [diag.extendsDisallowedClass] Classes can't extend 'FutureOr<dynamic>'.
+''');
   }
 
   test_class_FutureOr_typeArgument() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'dart:async';
 class A extends FutureOr<int> {}
-''',
-      [error(diag.extendsDisallowedClass, 37, 13)],
-    );
+//              ^^^^^^^^^^^^^
+// [diag.extendsDisallowedClass] Classes can't extend 'FutureOr<int>'.
+''');
   }
 
   test_class_FutureOr_typedef() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'dart:async';
 typedef F = FutureOr<void>;
 class A extends F {}
-''',
-      [error(diag.extendsDisallowedClass, 65, 1)],
-    );
+//              ^
+// [diag.extendsDisallowedClass] Classes can't extend 'F'.
+''');
   }
 
   test_class_FutureOr_typeVariable() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'dart:async';
 class A<T> extends FutureOr<T> {}
-''',
-      [error(diag.extendsDisallowedClass, 40, 11)],
-    );
+//                 ^^^^^^^^^^^
+// [diag.extendsDisallowedClass] Classes can't extend 'FutureOr<T>'.
+''');
   }
 
   test_class_int() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 class A extends int {}
-''',
-      [error(diag.extendsDisallowedClass, 16, 3)],
-    );
+//              ^^^
+// [diag.extendsDisallowedClass] Classes can't extend 'int'.
+''');
   }
 
   test_class_Null() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 class A extends Null {}
-''',
-      [error(diag.extendsDisallowedClass, 16, 4)],
-    );
+//              ^^^^
+// [diag.extendsDisallowedClass] Classes can't extend 'Null'.
+''');
   }
 
   test_class_num() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 class A extends num {}
-''',
-      [error(diag.extendsDisallowedClass, 16, 3)],
-    );
+//              ^^^
+// [diag.extendsDisallowedClass] Classes can't extend 'num'.
+''');
   }
 
   test_class_Record() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 class A extends Record {}
-''',
-      [error(diag.extendsDisallowedClass, 16, 6)],
-    );
+//              ^^^^^^
+// [diag.extendsDisallowedClass] Classes can't extend 'Record'.
+''');
   }
 
   test_class_String() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 class A extends String {}
-''',
-      [error(diag.extendsDisallowedClass, 16, 6)],
-    );
+//              ^^^^^^
+// [diag.extendsDisallowedClass] Classes can't extend 'String'.
+''');
   }
 
   @SkippedTest() // TODO(scheglov): implement augmentation
@@ -136,73 +125,66 @@
   }
 
   test_classTypeAlias_bool() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class M {}
 class C = bool with M;
-''',
-      [error(diag.extendsDisallowedClass, 21, 4)],
-    );
+//        ^^^^
+// [diag.extendsDisallowedClass] Classes can't extend 'bool'.
+''');
   }
 
   test_classTypeAlias_double() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class M {}
 class C = double with M;
-''',
-      [error(diag.extendsDisallowedClass, 21, 6)],
-    );
+//        ^^^^^^
+// [diag.extendsDisallowedClass] Classes can't extend 'double'.
+''');
   }
 
   test_classTypeAlias_FutureOr() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'dart:async';
 class M {}
 class C = FutureOr with M;
-''',
-      [error(diag.extendsDisallowedClass, 42, 8)],
-    );
+//        ^^^^^^^^
+// [diag.extendsDisallowedClass] Classes can't extend 'FutureOr<dynamic>'.
+''');
   }
 
   test_classTypeAlias_int() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class M {}
 class C = int with M;
-''',
-      [error(diag.extendsDisallowedClass, 21, 3)],
-    );
+//        ^^^
+// [diag.extendsDisallowedClass] Classes can't extend 'int'.
+''');
   }
 
   test_classTypeAlias_Null() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class M {}
 class C = Null with M;
-''',
-      [error(diag.extendsDisallowedClass, 21, 4)],
-    );
+//        ^^^^
+// [diag.extendsDisallowedClass] Classes can't extend 'Null'.
+''');
   }
 
   test_classTypeAlias_num() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class M {}
 class C = num with M;
-''',
-      [error(diag.extendsDisallowedClass, 21, 3)],
-    );
+//        ^^^
+// [diag.extendsDisallowedClass] Classes can't extend 'num'.
+''');
   }
 
   test_classTypeAlias_String() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class M {}
 class C = String with M;
-''',
-      [error(diag.extendsDisallowedClass, 21, 6)],
-    );
+//        ^^^^^^
+// [diag.extendsDisallowedClass] Classes can't extend 'String'.
+''');
   }
 }
diff --git a/pkg/analyzer/test/src/diagnostics/extends_non_class_test.dart b/pkg/analyzer/test/src/diagnostics/extends_non_class_test.dart
index bd8a50e..ac33487 100644
--- a/pkg/analyzer/test/src/diagnostics/extends_non_class_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/extends_non_class_test.dart
@@ -2,7 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/src/diagnostic/diagnostic.dart' as diag;
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../dart/resolution/context_collection_resolution.dart';
@@ -16,12 +15,11 @@
 @reflectiveTest
 class ExtendsNonClassTest extends PubPackageResolutionTest {
   test_class_dynamic() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A extends dynamic {}
-''',
-      [error(diag.extendsNonClass, 16, 7)],
-    );
+//              ^^^^^^^
+// [diag.extendsNonClass] Classes can only extend other classes.
+''');
 
     var node = findNode.singleExtendsClause;
     assertResolvedNodeText(node, r'''
@@ -35,13 +33,12 @@
   }
 
   test_class_enum() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 enum E { ONE }
 class A extends E {}
-''',
-      [error(diag.extendsNonClass, 31, 1)],
-    );
+//              ^
+// [diag.extendsNonClass] Classes can only extend other classes.
+''');
 
     var node = findNode.singleExtendsClause;
     assertResolvedNodeText(node, r'''
@@ -55,13 +52,12 @@
   }
 
   test_class_extensionType() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 extension type A(int it) {}
 class B extends A {}
-''',
-      [error(diag.extendsNonClass, 44, 1)],
-    );
+//              ^
+// [diag.extendsNonClass] Classes can only extend other classes.
+''');
 
     var node = findNode.singleExtendsClause;
     assertResolvedNodeText(node, r'''
@@ -75,13 +71,12 @@
   }
 
   test_class_mixin() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 mixin M {}
 class A extends M {}
-''',
-      [error(diag.extendsNonClass, 27, 1)],
-    );
+//              ^
+// [diag.extendsNonClass] Classes can only extend other classes.
+''');
 
     var node = findNode.singleExtendsClause;
     assertResolvedNodeText(node, r'''
@@ -95,13 +90,12 @@
   }
 
   test_class_variable() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 int v = 0;
 class A extends v {}
-''',
-      [error(diag.extendsNonClass, 27, 1)],
-    );
+//              ^
+// [diag.extendsNonClass] Classes can only extend other classes.
+''');
 
     var node = findNode.singleExtendsClause;
     assertResolvedNodeText(node, r'''
@@ -115,13 +109,12 @@
   }
 
   test_class_variable_generic() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 int v = 0;
 class A extends v<int> {}
-''',
-      [error(diag.extendsNonClass, 27, 1)],
-    );
+//              ^
+// [diag.extendsNonClass] Classes can only extend other classes.
+''');
 
     var node = findNode.singleExtendsClause;
     assertResolvedNodeText(node, r'''
@@ -143,12 +136,11 @@
   }
 
   test_Never() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 class A extends Never {}
-''',
-      [error(diag.extendsNonClass, 16, 5)],
-    );
+//              ^^^^^
+// [diag.extendsNonClass] Classes can only extend other classes.
+''');
 
     var node = findNode.singleExtendsClause;
     assertResolvedNodeText(node, r'''
@@ -162,12 +154,11 @@
   }
 
   test_undefined() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class C extends A {}
-''',
-      [error(diag.extendsNonClass, 16, 1)],
-    );
+//              ^
+// [diag.extendsNonClass] Classes can only extend other classes.
+''');
 
     var node = findNode.singleExtendsClause;
     assertResolvedNodeText(node, r'''
@@ -181,14 +172,13 @@
   }
 
   test_undefined_ignore_import_prefix() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'a.dart' as p;
+//     ^^^^^^^^
+// [diag.uriDoesNotExist] Target of URI doesn't exist: 'a.dart'.
 
 class C extends p.A {}
-''',
-      [error(diag.uriDoesNotExist, 7, 8)],
-    );
+''');
 
     var node = findNode.singleExtendsClause;
     assertResolvedNodeText(node, r'''
@@ -211,7 +201,7 @@
 part 'test.dart';
 ''');
 
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 part of 'a.dart';
 class C extends p.A {}
 ''');
@@ -236,14 +226,13 @@
 part 'test.dart';
 ''');
 
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 part of 'a.dart';
 import 'x.dart' as p;
+//     ^^^^^^^^
+// [diag.uriDoesNotExist] Target of URI doesn't exist: 'x.dart'.
 class C extends p.A {}
-''',
-      [error(diag.uriDoesNotExist, 25, 8)],
-    );
+''');
 
     var node = findNode.singleExtendsClause;
     assertResolvedNodeText(node, r'''
@@ -261,14 +250,13 @@
   }
 
   test_undefined_ignore_import_show_it() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'a.dart' show A;
+//     ^^^^^^^^
+// [diag.uriDoesNotExist] Target of URI doesn't exist: 'a.dart'.
 
 class C extends A {}
-''',
-      [error(diag.uriDoesNotExist, 7, 8)],
-    );
+''');
   }
 
   test_undefined_ignore_import_show_it_part() async {
@@ -277,7 +265,7 @@
 import 'x.dart' show A;
 ''');
 
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 part of 'a.dart';
 class C extends A {}
 ''');
@@ -288,14 +276,13 @@
 part 'test.dart';
 ''');
 
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 part of 'a.dart';
 import 'x.dart' show A;
+//     ^^^^^^^^
+// [diag.uriDoesNotExist] Target of URI doesn't exist: 'x.dart'.
 class C extends A {}
-''',
-      [error(diag.uriDoesNotExist, 25, 8)],
-    );
+''');
   }
 
   test_undefined_ignore_import_show_it_part3() async {
@@ -310,7 +297,7 @@
 ''');
 
     // This file is on the path with `b.dart`, so no error.
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 part of 'b.dart';
 class C extends A {}
 ''');
@@ -328,24 +315,24 @@
 ''');
 
     // This file is not on the path with `b.dart`, so the error.
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 part of 'a.dart';
 class C extends A {}
-''',
-      [error(diag.extendsNonClass, 34, 1)],
-    );
+//              ^
+// [diag.extendsNonClass] Classes can only extend other classes.
+''');
   }
 
   test_undefined_ignore_import_show_other() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'a.dart' show B;
+//     ^^^^^^^^
+// [diag.uriDoesNotExist] Target of URI doesn't exist: 'a.dart'.
 
 class C extends A {}
-''',
-      [error(diag.uriDoesNotExist, 7, 8), error(diag.extendsNonClass, 41, 1)],
-    );
+//              ^
+// [diag.extendsNonClass] Classes can only extend other classes.
+''');
   }
 
   test_undefined_ignore_part_exists_uriGenerated_nameIgnorable() async {
@@ -353,72 +340,69 @@
 part of 'test.dart';
 ''');
 
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 part 'a.g.dart';
 
 class C extends _$A {}
-''',
-      [error(diag.extendsNonClass, 34, 3)],
-    );
+//              ^^^
+// [diag.extendsNonClass] Classes can only extend other classes.
+''');
   }
 
   test_undefined_ignore_part_notExist_uriGenerated_nameIgnorable() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 part 'a.g.dart';
+//   ^^^^^^^^^^
+// [diag.uriHasNotBeenGenerated] Target of URI hasn't been generated: 'package:test/a.g.dart'.
 
 class C extends _$A {}
-''',
-      [error(diag.uriHasNotBeenGenerated, 5, 10)],
-    );
+''');
   }
 
   test_undefined_ignore_part_notExist_uriGenerated_nameNotIgnorable() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 part 'a.g.dart';
+//   ^^^^^^^^^^
+// [diag.uriHasNotBeenGenerated] Target of URI hasn't been generated: 'package:test/a.g.dart'.
 
 class C extends A {}
-''',
-      [
-        error(diag.uriHasNotBeenGenerated, 5, 10),
-        error(diag.extendsNonClass, 34, 1),
-      ],
-    );
+//              ^
+// [diag.extendsNonClass] Classes can only extend other classes.
+''');
   }
 
   test_undefined_ignore_part_notExist_uriNotGenerated_nameIgnorable() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 part 'a.dart';
+//   ^^^^^^^^
+// [diag.uriDoesNotExist] Target of URI doesn't exist: 'package:test/a.dart'.
 
 class C extends _$A {}
-''',
-      [error(diag.uriDoesNotExist, 5, 8), error(diag.extendsNonClass, 32, 3)],
-    );
+//              ^^^
+// [diag.extendsNonClass] Classes can only extend other classes.
+''');
   }
 
   test_undefined_ignore_part_notExist_uriNotGenerated_nameNotIgnorable() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 part 'a.dart';
+//   ^^^^^^^^
+// [diag.uriDoesNotExist] Target of URI doesn't exist: 'package:test/a.dart'.
 
 class C extends A {}
-''',
-      [error(diag.uriDoesNotExist, 5, 8), error(diag.extendsNonClass, 32, 1)],
-    );
+//              ^
+// [diag.extendsNonClass] Classes can only extend other classes.
+''');
   }
 
   test_undefined_import_exists_prefixed() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'dart:math' as p;
 
 class C extends p.A {}
-''',
-      [error(diag.extendsNonClass, 42, 3)],
-    );
+//              ^^^
+// [diag.extendsNonClass] Classes can only extend other classes.
+''');
 
     var node = findNode.singleExtendsClause;
     assertResolvedNodeText(node, r'''
diff --git a/pkg/analyzer/test/src/diagnostics/extends_type_alias_expands_to_type_parameter_test.dart b/pkg/analyzer/test/src/diagnostics/extends_type_alias_expands_to_type_parameter_test.dart
index d4ba184..d8a2616 100644
--- a/pkg/analyzer/test/src/diagnostics/extends_type_alias_expands_to_type_parameter_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/extends_type_alias_expands_to_type_parameter_test.dart
@@ -2,7 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/src/diagnostic/diagnostic.dart' as diag;
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../dart/resolution/context_collection_resolution.dart';
@@ -17,7 +16,7 @@
 class ExtendsTypeAliasExpandsToTypeParameterTest
     extends PubPackageResolutionTest {
   test_class() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {}
 typedef T = A;
 class B extends A {}
@@ -25,24 +24,22 @@
   }
 
   test_class_noTypeArguments() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {}
 typedef T<X extends A> = X;
 class B extends T {}
-''',
-      [error(diag.extendsTypeAliasExpandsToTypeParameter, 55, 1)],
-    );
+//              ^
+// [diag.extendsTypeAliasExpandsToTypeParameter] A type alias that expands to a type parameter can't be used as a superclass.
+''');
   }
 
   test_class_withTypeArguments() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {}
 typedef T<X extends A> = X;
 class B extends T<A> {}
-''',
-      [error(diag.extendsTypeAliasExpandsToTypeParameter, 55, 1)],
-    );
+//              ^
+// [diag.extendsTypeAliasExpandsToTypeParameter] A type alias that expands to a type parameter can't be used as a superclass.
+''');
   }
 }
diff --git a/pkg/analyzer/test/src/diagnostics/extension_as_expression_test.dart b/pkg/analyzer/test/src/diagnostics/extension_as_expression_test.dart
index cf1fe03..974743b 100644
--- a/pkg/analyzer/test/src/diagnostics/extension_as_expression_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/extension_as_expression_test.dart
@@ -2,7 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/src/diagnostic/diagnostic.dart' as diag;
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../dart/resolution/context_collection_resolution.dart';
@@ -19,25 +18,23 @@
     newFile('$testPackageLibPath/a.dart', r'''
 extension E on int {}
 ''');
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'a.dart' as p;
 var v = p.E;
-''',
-      [error(diag.extensionAsExpression, 30, 3)],
-    );
+//      ^^^
+// [diag.extensionAsExpression] Extension 'p.E' can't be used as an expression.
+''');
     assertTypeDynamic(findNode.simple('E;'));
     assertTypeDynamic(findNode.prefixed('p.E;'));
   }
 
   test_simpleIdentifier() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 extension E on int {}
 var v = E;
-''',
-      [error(diag.extensionAsExpression, 30, 1)],
-    );
+//      ^
+// [diag.extensionAsExpression] Extension 'E' can't be used as an expression.
+''');
     assertTypeDynamic(findNode.simple('E;'));
   }
 }
diff --git a/pkg/analyzer/test/src/diagnostics/extension_conflicting_static_and_instance_test.dart b/pkg/analyzer/test/src/diagnostics/extension_conflicting_static_and_instance_test.dart
index dbe4f72..64f0277a 100644
--- a/pkg/analyzer/test/src/diagnostics/extension_conflicting_static_and_instance_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/extension_conflicting_static_and_instance_test.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/error/error.dart';
-import 'package:analyzer/src/diagnostic/diagnostic.dart' as diag;
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../dart/resolution/context_collection_resolution.dart';
@@ -17,10 +15,8 @@
 @reflectiveTest
 class ExtensionConflictingStaticAndInstanceTest
     extends PubPackageResolutionTest {
-  DiagnosticCode get _errorCode => diag.extensionConflictingStaticAndInstance;
-
   test_extendedType_staticField() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   static int foo = 0;
   int bar = 0;
@@ -34,7 +30,7 @@
   }
 
   test_extendedType_staticGetter() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   static int get foo => 0;
   int get bar => 0;
@@ -48,7 +44,7 @@
   }
 
   test_extendedType_staticMethod() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   static void foo() {}
   void bar() {}
@@ -62,7 +58,7 @@
   }
 
   test_extendedType_staticSetter() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   static set foo(_) {}
   set bar(_) {}
@@ -77,8 +73,7 @@
 
   @SkippedTest() // TODO(scheglov): implement augmentation
   test_instanceMethod_staticMethodInAugmentation() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 extension A on int {
   void foo() {}
 }
@@ -86,135 +81,122 @@
 augment extension A {
   static void foo() {}
 }
-''',
-      [error(_errorCode, 76, 3)],
-    );
+''');
   }
 
   test_staticField_instanceGetter() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 extension E on String {
   static int foo = 0;
+//           ^^^
+// [diag.extensionConflictingStaticAndInstance] An extension can't define static member 'foo' and an instance member with the same name.
   int get foo => 0;
 }
-''',
-      [error(_errorCode, 37, 3)],
-    );
+''');
   }
 
   test_staticField_instanceGetter_unnamed() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 extension E on String {
   static int foo = 0;
+//           ^^^
+// [diag.extensionConflictingStaticAndInstance] An extension can't define static member 'foo' and an instance member with the same name.
   int get foo => 0;
 }
-''',
-      [error(_errorCode, 37, 3)],
-    );
+''');
   }
 
   test_staticField_instanceMethod() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 extension E on String {
   static int foo = 0;
+//           ^^^
+// [diag.extensionConflictingStaticAndInstance] An extension can't define static member 'foo' and an instance member with the same name.
   void foo() {}
 }
-''',
-      [error(_errorCode, 37, 3)],
-    );
+''');
   }
 
   test_staticField_instanceSetter() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 extension E on String {
   static int foo = 0;
+//           ^^^
+// [diag.extensionConflictingStaticAndInstance] An extension can't define static member 'foo' and an instance member with the same name.
   set foo(_) {}
 }
-''',
-      [error(_errorCode, 37, 3)],
-    );
+''');
   }
 
   test_staticGetter_instanceGetter() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 extension E on String {
   static int get foo => 0;
+//               ^^^
+// [diag.extensionConflictingStaticAndInstance] An extension can't define static member 'foo' and an instance member with the same name.
   int get foo => 0;
 }
-''',
-      [error(_errorCode, 41, 3)],
-    );
+''');
   }
 
   test_staticGetter_instanceGetter_unnamed() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 extension E on String {
   static int get foo => 0;
+//               ^^^
+// [diag.extensionConflictingStaticAndInstance] An extension can't define static member 'foo' and an instance member with the same name.
   int get foo => 0;
 }
-''',
-      [error(_errorCode, 41, 3)],
-    );
+''');
   }
 
   test_staticGetter_instanceMethod() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 extension E on String {
   static int get foo => 0;
+//               ^^^
+// [diag.extensionConflictingStaticAndInstance] An extension can't define static member 'foo' and an instance member with the same name.
   void foo() {}
 }
-''',
-      [error(_errorCode, 41, 3)],
-    );
+''');
   }
 
   test_staticGetter_instanceSetter() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 extension E on String {
   static int get foo => 0;
+//               ^^^
+// [diag.extensionConflictingStaticAndInstance] An extension can't define static member 'foo' and an instance member with the same name.
   set foo(_) {}
 }
-''',
-      [error(_errorCode, 41, 3)],
-    );
+''');
   }
 
   test_staticMethod_instanceGetter() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 extension E on String {
   static void foo() {}
+//            ^^^
+// [diag.extensionConflictingStaticAndInstance] An extension can't define static member 'foo' and an instance member with the same name.
   int get foo => 0;
 }
-''',
-      [error(_errorCode, 38, 3)],
-    );
+''');
   }
 
   test_staticMethod_instanceMethod() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 extension E on String {
   static void foo() {}
+//            ^^^
+// [diag.extensionConflictingStaticAndInstance] An extension can't define static member 'foo' and an instance member with the same name.
   void foo() {}
 }
-''',
-      [error(_errorCode, 38, 3)],
-    );
+''');
   }
 
   @SkippedTest() // TODO(scheglov): implement augmentation
   test_staticMethod_instanceMethodInAugmentation() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 extension A on int {
   static void foo() {}
 }
@@ -222,56 +204,50 @@
 augment extension A {
   void foo() {}
 }
-''',
-      [error(_errorCode, 35, 3)],
-    );
+''');
   }
 
   test_staticMethod_instanceSetter() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 extension E on String {
   static void foo() {}
+//            ^^^
+// [diag.extensionConflictingStaticAndInstance] An extension can't define static member 'foo' and an instance member with the same name.
   set foo(_) {}
 }
-''',
-      [error(_errorCode, 38, 3)],
-    );
+''');
   }
 
   test_staticSetter_instanceGetter() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 extension E on String {
   static set foo(_) {}
+//           ^^^
+// [diag.extensionConflictingStaticAndInstance] An extension can't define static member 'foo' and an instance member with the same name.
   int get foo => 0;
 }
-''',
-      [error(_errorCode, 37, 3)],
-    );
+''');
   }
 
   test_staticSetter_instanceMethod() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 extension E on String {
   static set foo(_) {}
+//           ^^^
+// [diag.extensionConflictingStaticAndInstance] An extension can't define static member 'foo' and an instance member with the same name.
   void foo() {}
 }
-''',
-      [error(_errorCode, 37, 3)],
-    );
+''');
   }
 
   test_staticSetter_instanceSetter() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 extension E on String {
   static set foo(_) {}
+//           ^^^
+// [diag.extensionConflictingStaticAndInstance] An extension can't define static member 'foo' and an instance member with the same name.
   set foo(_) {}
 }
-''',
-      [error(_errorCode, 37, 3)],
-    );
+''');
   }
 }
diff --git a/pkg/analyzer/test/src/diagnostics/extension_declares_abstract_method_test.dart b/pkg/analyzer/test/src/diagnostics/extension_declares_abstract_method_test.dart
index e6f428b..a873ea5 100644
--- a/pkg/analyzer/test/src/diagnostics/extension_declares_abstract_method_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/extension_declares_abstract_method_test.dart
@@ -2,7 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/src/diagnostic/diagnostic.dart' as diag;
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../dart/resolution/context_collection_resolution.dart';
@@ -16,52 +15,48 @@
 @reflectiveTest
 class ExtensionDeclaresAbstractMethodTest extends PubPackageResolutionTest {
   test_getter() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 extension E on String {
   bool get isPalindrome;
+//         ^^^^^^^^^^^^
+// [diag.extensionDeclaresAbstractMember] Extensions can't declare abstract members.
 }
-''',
-      [error(diag.extensionDeclaresAbstractMember, 35, 12)],
-    );
+''');
   }
 
   test_method() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 extension E on String {
   String reversed();
+//       ^^^^^^^^
+// [diag.extensionDeclaresAbstractMember] Extensions can't declare abstract members.
 }
-''',
-      [error(diag.extensionDeclaresAbstractMember, 33, 8)],
-    );
+''');
   }
 
   test_none() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 extension E on String {}
 ''');
   }
 
   test_operator() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 extension E on String {
   String operator -(String otherString);
+//                ^
+// [diag.extensionDeclaresAbstractMember] Extensions can't declare abstract members.
 }
-''',
-      [error(diag.extensionDeclaresAbstractMember, 42, 1)],
-    );
+''');
   }
 
   test_setter() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 extension E on String {
   set length(int newLength);
+//    ^^^^^^
+// [diag.extensionDeclaresAbstractMember] Extensions can't declare abstract members.
 }
-''',
-      [error(diag.extensionDeclaresAbstractMember, 30, 6)],
-    );
+''');
   }
 }
diff --git a/pkg/analyzer/test/src/diagnostics/extension_declares_constructor_test.dart b/pkg/analyzer/test/src/diagnostics/extension_declares_constructor_test.dart
index 6b23341..b073a82 100644
--- a/pkg/analyzer/test/src/diagnostics/extension_declares_constructor_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/extension_declares_constructor_test.dart
@@ -2,7 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/src/diagnostic/diagnostic.dart' as diag;
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../dart/resolution/context_collection_resolution.dart';
@@ -16,30 +15,28 @@
 @reflectiveTest
 class ExtensionDeclaresConstructorTest extends PubPackageResolutionTest {
   test_named() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 extension E on String {
   E.named() : super();
+//^
+// [diag.extensionDeclaresConstructor] Extensions can't declare constructors.
 }
-''',
-      [error(diag.extensionDeclaresConstructor, 26, 1)],
-    );
+''');
   }
 
   test_none() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 extension E on String {}
 ''');
   }
 
   test_unnamed() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 extension E on String {
   E() : super();
+//^
+// [diag.extensionDeclaresConstructor] Extensions can't declare constructors.
 }
-''',
-      [error(diag.extensionDeclaresConstructor, 26, 1)],
-    );
+''');
   }
 }
diff --git a/pkg/analyzer/test/src/diagnostics/extension_declares_field_test.dart b/pkg/analyzer/test/src/diagnostics/extension_declares_field_test.dart
index f04c294..375f701 100644
--- a/pkg/analyzer/test/src/diagnostics/extension_declares_field_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/extension_declares_field_test.dart
@@ -2,7 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/src/diagnostic/diagnostic.dart' as diag;
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../dart/resolution/context_collection_resolution.dart';
@@ -16,49 +15,45 @@
 @reflectiveTest
 class ExtensionDeclaresFieldTest extends PubPackageResolutionTest {
   test_instanceField1_final_late_typeInt() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 extension E on int {
   late final int v;
+//               ^
+// [diag.extensionDeclaresInstanceField] Extensions can't declare instance fields.
 }
-''',
-      [error(diag.extensionDeclaresInstanceField, 38, 1)],
-    );
+''');
   }
 
   test_instanceField1_typeIntQ() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 extension E on int {
   int? v;
+//     ^
+// [diag.extensionDeclaresInstanceField] Extensions can't declare instance fields.
 }
-''',
-      [error(diag.extensionDeclaresInstanceField, 28, 1)],
-    );
+''');
   }
 
-  Future<void> test_instanceField3_typeIntQ() async {
-    await assertErrorsInCode(
-      '''
+  test_instanceField3_typeIntQ() async {
+    await resolveTestCodeWithDiagnostics(r'''
 extension E on int {
   int? v1, v2;
+//     ^^
+// [diag.extensionDeclaresInstanceField] Extensions can't declare instance fields.
+//         ^^
+// [diag.extensionDeclaresInstanceField] Extensions can't declare instance fields.
 }
-''',
-      [
-        error(diag.extensionDeclaresInstanceField, 28, 2),
-        error(diag.extensionDeclaresInstanceField, 32, 2),
-      ],
-    );
+''');
   }
 
-  Future<void> test_none() async {
-    await assertNoErrorsInCode('''
+  test_none() async {
+    await resolveTestCodeWithDiagnostics(r'''
 extension E on int {}
 ''');
   }
 
-  Future<void> test_staticField1_typeInt() async {
-    await assertNoErrorsInCode('''
+  test_staticField1_typeInt() async {
+    await resolveTestCodeWithDiagnostics(r'''
 extension E on int {
   static int v = 0;
 }
diff --git a/pkg/analyzer/test/src/diagnostics/extension_declares_member_of_object_test.dart b/pkg/analyzer/test/src/diagnostics/extension_declares_member_of_object_test.dart
index a1b2bbc..d61dec5 100644
--- a/pkg/analyzer/test/src/diagnostics/extension_declares_member_of_object_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/extension_declares_member_of_object_test.dart
@@ -2,7 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/src/diagnostic/diagnostic.dart' as diag;
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../dart/resolution/context_collection_resolution.dart';
@@ -16,45 +15,44 @@
 @reflectiveTest
 class ExtensionDeclaresMemberOfObjectTest extends PubPackageResolutionTest {
   test_instance_differentKind() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 extension E on String {
   void hashCode() {}
+//     ^^^^^^^^
+// [diag.extensionDeclaresMemberOfObject] Extensions can't declare members with the same name as a member declared by 'Object'.
 }
-''',
-      [error(diag.extensionDeclaresMemberOfObject, 31, 8)],
-    );
+''');
   }
 
   test_instance_sameKind() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 extension E on String {
   bool operator==(Object _) => false;
+//             ^^
+// [diag.extensionDeclaresMemberOfObject] Extensions can't declare members with the same name as a member declared by 'Object'.
   int get hashCode => 0;
+//        ^^^^^^^^
+// [diag.extensionDeclaresMemberOfObject] Extensions can't declare members with the same name as a member declared by 'Object'.
   String toString() => '';
+//       ^^^^^^^^
+// [diag.extensionDeclaresMemberOfObject] Extensions can't declare members with the same name as a member declared by 'Object'.
   dynamic get runtimeType => null;
+//            ^^^^^^^^^^^
+// [diag.extensionDeclaresMemberOfObject] Extensions can't declare members with the same name as a member declared by 'Object'.
   dynamic noSuchMethod(_) => null;
+//        ^^^^^^^^^^^^
+// [diag.extensionDeclaresMemberOfObject] Extensions can't declare members with the same name as a member declared by 'Object'.
 }
-''',
-      [
-        error(diag.extensionDeclaresMemberOfObject, 39, 2),
-        error(diag.extensionDeclaresMemberOfObject, 72, 8),
-        error(diag.extensionDeclaresMemberOfObject, 96, 8),
-        error(diag.extensionDeclaresMemberOfObject, 128, 11),
-        error(diag.extensionDeclaresMemberOfObject, 159, 12),
-      ],
-    );
+''');
   }
 
   test_static() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 extension E on String {
   static void hashCode() {}
+//            ^^^^^^^^
+// [diag.extensionDeclaresMemberOfObject] Extensions can't declare members with the same name as a member declared by 'Object'.
 }
-''',
-      [error(diag.extensionDeclaresMemberOfObject, 38, 8)],
-    );
+''');
   }
 }
diff --git a/pkg/analyzer/test/src/diagnostics/extension_override_access_to_static_member_test.dart b/pkg/analyzer/test/src/diagnostics/extension_override_access_to_static_member_test.dart
index 0f55846..5de7a29 100644
--- a/pkg/analyzer/test/src/diagnostics/extension_override_access_to_static_member_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/extension_override_access_to_static_member_test.dart
@@ -2,7 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/src/diagnostic/diagnostic.dart' as diag;
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../dart/resolution/context_collection_resolution.dart';
@@ -17,18 +16,17 @@
 class ExtensionOverrideAccessToStaticMemberTest
     extends PubPackageResolutionTest {
   test_call() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 extension E on int {
   static void call() {}
 }
 
 void f() {
   E(0)();
+//    ^^
+// [diag.extensionOverrideAccessToStaticMember] An extension override can't be used to access a static member from an extension.
 }
-''',
-      [error(diag.extensionOverrideAccessToStaticMember, 65, 2)],
-    );
+''');
 
     var node = findNode.functionExpressionInvocation('();');
     assertResolvedNodeText(node, r'''
@@ -56,46 +54,43 @@
   }
 
   test_getter() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 extension E on String {
   static String get empty => '';
 }
 void f() {
   E('a').empty;
+//       ^^^^^
+// [diag.extensionOverrideAccessToStaticMember] An extension override can't be used to access a static member from an extension.
 }
-''',
-      [error(diag.extensionOverrideAccessToStaticMember, 79, 5)],
-    );
+''');
   }
 
   test_getterAndSetter() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 extension E on String {
   static String get empty => '';
   static void set empty(String s) {}
 }
 void f() {
   E('a').empty += 'b';
+//       ^^^^^
+// [diag.extensionOverrideAccessToStaticMember] An extension override can't be used to access a static member from an extension.
 }
-''',
-      [error(diag.extensionOverrideAccessToStaticMember, 116, 5)],
-    );
+''');
   }
 
   test_method() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 extension E on String {
   static String empty() => '';
 }
 void f() {
   E('a').empty();
+//       ^^^^^
+// [diag.extensionOverrideAccessToStaticMember] An extension override can't be used to access a static member from an extension.
 }
-''',
-      [error(diag.extensionOverrideAccessToStaticMember, 77, 5)],
-    );
+''');
 
     var node = findNode.methodInvocation('empty();');
     assertResolvedNodeText(node, r'''
@@ -125,16 +120,15 @@
   }
 
   test_setter() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 extension E on String {
   static void set empty(String s) {}
 }
 void f() {
   E('a').empty = 'b';
+//       ^^^^^
+// [diag.extensionOverrideAccessToStaticMember] An extension override can't be used to access a static member from an extension.
 }
-''',
-      [error(diag.extensionOverrideAccessToStaticMember, 83, 5)],
-    );
+''');
   }
 }
diff --git a/pkg/analyzer/test/src/diagnostics/extension_override_argument_not_assignable_test.dart b/pkg/analyzer/test/src/diagnostics/extension_override_argument_not_assignable_test.dart
index 51f5adc..b7fd7e6 100644
--- a/pkg/analyzer/test/src/diagnostics/extension_override_argument_not_assignable_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/extension_override_argument_not_assignable_test.dart
@@ -2,7 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/src/diagnostic/diagnostic.dart' as diag;
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../dart/resolution/context_collection_resolution.dart';
@@ -17,21 +16,20 @@
 class ExtensionOverrideArgumentNotAssignableTest
     extends PubPackageResolutionTest {
   test_override_onNonNullable() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 extension E on String {
   void m() {}
 }
 f() {
   E(null).m();
+//  ^^^^
+// [diag.extensionOverrideArgumentNotAssignable] The type of the argument to the extension override 'Null' isn't assignable to the extended type 'String'.
 }
-''',
-      [error(diag.extensionOverrideArgumentNotAssignable, 50, 4)],
-    );
+''');
   }
 
   test_override_onNullable() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 extension E on String? {
   void m() {}
 }
@@ -42,7 +40,7 @@
   }
 
   test_subtype() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {}
 class B extends A {}
 extension E on A {
@@ -55,8 +53,7 @@
   }
 
   test_supertype() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {}
 class B extends A {}
 extension E on B {
@@ -64,15 +61,14 @@
 }
 void f(A a) {
   E(a).m();
+//  ^
+// [diag.extensionOverrideArgumentNotAssignable] The type of the argument to the extension override 'A' isn't assignable to the extended type 'B'.
 }
-''',
-      [error(diag.extensionOverrideArgumentNotAssignable, 85, 1)],
-    );
+''');
   }
 
   test_unrelated() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {}
 class B {}
 extension E on A {
@@ -80,9 +76,9 @@
 }
 void f(B b) {
   E(b).m();
+//  ^
+// [diag.extensionOverrideArgumentNotAssignable] The type of the argument to the extension override 'B' isn't assignable to the extended type 'A'.
 }
-''',
-      [error(diag.extensionOverrideArgumentNotAssignable, 75, 1)],
-    );
+''');
   }
 }
diff --git a/pkg/analyzer/test/src/diagnostics/extension_override_with_cascade_test.dart b/pkg/analyzer/test/src/diagnostics/extension_override_with_cascade_test.dart
index bfd2c09..315368a 100644
--- a/pkg/analyzer/test/src/diagnostics/extension_override_with_cascade_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/extension_override_with_cascade_test.dart
@@ -2,7 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/src/diagnostic/diagnostic.dart' as diag;
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../dart/resolution/context_collection_resolution.dart';
@@ -16,47 +15,44 @@
 @reflectiveTest
 class ExtensionOverrideWithCascadeTest extends PubPackageResolutionTest {
   test_getter() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 extension E on int {
   int get g => 0;
 }
 f() {
   E(3)..g..g;
+//^
+// [diag.extensionOverrideWithCascade] Extension overrides have no value so they can't be used as the receiver of a cascade expression.
 }
-''',
-      [error(diag.extensionOverrideWithCascade, 49, 1)],
-    );
+''');
     assertTypeDynamic(findNode.extensionOverride('E('));
   }
 
   test_method() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 extension E on int {
   void m() {}
 }
 f() {
   E(3)..m()..m();
+//^
+// [diag.extensionOverrideWithCascade] Extension overrides have no value so they can't be used as the receiver of a cascade expression.
 }
-''',
-      [error(diag.extensionOverrideWithCascade, 45, 1)],
-    );
+''');
     assertTypeDynamic(findNode.extensionOverride('E('));
   }
 
   test_setter() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 extension E on int {
   set s(int i) {}
 }
 f() {
   E(3)..s = 1..s = 2;
+//^
+// [diag.extensionOverrideWithCascade] Extension overrides have no value so they can't be used as the receiver of a cascade expression.
 }
-''',
-      [error(diag.extensionOverrideWithCascade, 49, 1)],
-    );
+''');
     assertTypeDynamic(findNode.extensionOverride('E('));
   }
 }
diff --git a/pkg/analyzer/test/src/diagnostics/extension_override_without_access_test.dart b/pkg/analyzer/test/src/diagnostics/extension_override_without_access_test.dart
index 11e356c..05ba8d6 100644
--- a/pkg/analyzer/test/src/diagnostics/extension_override_without_access_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/extension_override_without_access_test.dart
@@ -2,7 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/src/diagnostic/diagnostic.dart' as diag;
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../dart/resolution/context_collection_resolution.dart';
@@ -16,7 +15,7 @@
 @reflectiveTest
 class ExtensionOverrideWithoutAccessTest extends PubPackageResolutionTest {
   test_binaryExpression() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 class C {}
 extension E on C {
   int operator +(int x) => x;
@@ -28,7 +27,7 @@
   }
 
   test_call() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 class C {}
 
 extension E on C {
@@ -42,23 +41,22 @@
   }
 
   test_expressionStatement() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 class C {}
 extension E on C {
   void m() {}
 }
 f(C c) {
   E(c);
+//^^^^
+// [diag.extensionOverrideWithoutAccess] An extension override can only be used to access instance members.
 }
-''',
-      [error(diag.extensionOverrideWithoutAccess, 57, 4)],
-    );
+''');
     assertTypeDynamic(findNode.extensionOverride('E(c)'));
   }
 
   test_getter() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 class C {}
 extension E on C {
   int get g => 0;
@@ -70,7 +68,7 @@
   }
 
   test_indexExpression_get() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 class C {}
 extension E on C {
   int operator [](int i) => 4;
@@ -82,7 +80,7 @@
   }
 
   test_indexExpression_set() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 class C {}
 extension E on C {
   void operator []=(int i, int v) {}
@@ -94,7 +92,7 @@
   }
 
   test_methodInvocation() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 class C {}
 extension E on C {
   void m() {}
@@ -106,7 +104,7 @@
   }
 
   test_prefixExpression() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 class C {}
 extension E on C {
   int operator -() => 7;
@@ -118,7 +116,7 @@
   }
 
   test_setter() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 class C {}
 extension E on C {
   set s(int x) {}
diff --git a/pkg/analyzer/test/src/diagnostics/extension_type_constructor_with_super_formal_parameter_test.dart b/pkg/analyzer/test/src/diagnostics/extension_type_constructor_with_super_formal_parameter_test.dart
index 7a26270..8935795 100644
--- a/pkg/analyzer/test/src/diagnostics/extension_type_constructor_with_super_formal_parameter_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/extension_type_constructor_with_super_formal_parameter_test.dart
@@ -2,7 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/src/diagnostic/diagnostic.dart' as diag;
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../dart/resolution/context_collection_resolution.dart';
@@ -17,14 +16,13 @@
 class ExtensionTypeConstructorWithSuperFormalParameterTest
     extends PubPackageResolutionTest {
   test_named() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 extension type E(int it) {
   E.named(this.it, {super.foo});
+//                  ^^^^^
+// [diag.extensionTypeConstructorWithSuperFormalParameter] Extension type constructors can't declare super formal parameters.
 }
-''',
-      [error(diag.extensionTypeConstructorWithSuperFormalParameter, 47, 5)],
-    );
+''');
 
     var node = findNode.formalParameterList('super.foo');
     assertResolvedNodeText(node, r'''
@@ -52,14 +50,13 @@
   }
 
   test_positional() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 extension type E(int it) {
   E.named(this.it, super.foo);
+//                 ^^^^^
+// [diag.extensionTypeConstructorWithSuperFormalParameter] Extension type constructors can't declare super formal parameters.
 }
-''',
-      [error(diag.extensionTypeConstructorWithSuperFormalParameter, 46, 5)],
-    );
+''');
 
     var node = findNode.formalParameterList('super.foo');
     assertResolvedNodeText(node, r'''
diff --git a/pkg/analyzer/test/src/diagnostics/extension_type_constructor_with_super_invocation_test.dart b/pkg/analyzer/test/src/diagnostics/extension_type_constructor_with_super_invocation_test.dart
index eadb556e..3913cf5 100644
--- a/pkg/analyzer/test/src/diagnostics/extension_type_constructor_with_super_invocation_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/extension_type_constructor_with_super_invocation_test.dart
@@ -2,7 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/src/diagnostic/diagnostic.dart' as diag;
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../dart/resolution/context_collection_resolution.dart';
@@ -17,14 +16,13 @@
 class ExtensionTypeConstructorWithSuperInvocationTest
     extends PubPackageResolutionTest {
   test_named() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 extension type E(int it) {
   E.named() : it = 0, super.named();
+//                    ^^^^^
+// [diag.extensionTypeConstructorWithSuperInvocation] Extension type constructors can't include super initializers.
 }
-''',
-      [error(diag.extensionTypeConstructorWithSuperInvocation, 49, 5)],
-    );
+''');
 
     var node = findNode.singleSuperConstructorInvocation;
     assertResolvedNodeText(node, r'''
@@ -43,28 +41,25 @@
   }
 
   test_notLast() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 extension type const E._(int it) {
   const E(int it) : super._(it), assert(it >= 0);
+//      ^
+// [diag.finalNotInitializedConstructor1] All final variables must be initialized, but 'it' isn't.
+//                  ^^^^^
+// [diag.extensionTypeConstructorWithSuperInvocation] Extension type constructors can't include super initializers.
 }
-''',
-      [
-        error(diag.finalNotInitializedConstructor1, 43, 1),
-        error(diag.extensionTypeConstructorWithSuperInvocation, 55, 5),
-      ],
-    );
+''');
   }
 
   test_unnamed() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 extension type E(int it) {
   E.named() : it = 0, super();
+//                    ^^^^^
+// [diag.extensionTypeConstructorWithSuperInvocation] Extension type constructors can't include super initializers.
 }
-''',
-      [error(diag.extensionTypeConstructorWithSuperInvocation, 49, 5)],
-    );
+''');
 
     var node = findNode.singleSuperConstructorInvocation;
     assertResolvedNodeText(node, r'''
diff --git a/pkg/analyzer/test/src/diagnostics/extension_type_declares_instance_field_test.dart b/pkg/analyzer/test/src/diagnostics/extension_type_declares_instance_field_test.dart
index 69d9ddc..e944639 100644
--- a/pkg/analyzer/test/src/diagnostics/extension_type_declares_instance_field_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/extension_type_declares_instance_field_test.dart
@@ -2,7 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/src/diagnostic/diagnostic.dart' as diag;
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../dart/resolution/context_collection_resolution.dart';
@@ -16,18 +15,17 @@
 @reflectiveTest
 class ExtensionTypeDeclaresInstanceFieldTest extends PubPackageResolutionTest {
   Future<void> test_instance_field() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 extension type E(int it) {
   final int foo = 0;
+//          ^^^
+// [diag.extensionTypeDeclaresInstanceField] Extension types can't declare instance fields.
 }
-''',
-      [error(diag.extensionTypeDeclaresInstanceField, 39, 3)],
-    );
+''');
   }
 
   Future<void> test_instance_field_external() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 extension type E(int it) {
   external int foo;
 }
@@ -35,7 +33,7 @@
   }
 
   Future<void> test_instance_getter() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 extension type E(int it) {
   int get foo => 0;
 }
@@ -43,7 +41,7 @@
   }
 
   Future<void> test_instance_setter() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 extension type E(int it) {
   set foo(int _) {}
 }
@@ -51,22 +49,21 @@
   }
 
   Future<void> test_multiple() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 extension type E(int it) {
   String? one, two, three;
+//        ^^^
+// [diag.extensionTypeDeclaresInstanceField] Extension types can't declare instance fields.
+//             ^^^
+// [diag.extensionTypeDeclaresInstanceField] Extension types can't declare instance fields.
+//                  ^^^^^
+// [diag.extensionTypeDeclaresInstanceField] Extension types can't declare instance fields.
 }
-''',
-      [
-        error(diag.extensionTypeDeclaresInstanceField, 37, 3),
-        error(diag.extensionTypeDeclaresInstanceField, 42, 3),
-        error(diag.extensionTypeDeclaresInstanceField, 47, 5),
-      ],
-    );
+''');
   }
 
   Future<void> test_static_field() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 extension type E(int it) {
   static final int foo = 0;
 }
diff --git a/pkg/analyzer/test/src/diagnostics/extension_type_declares_member_of_object_test.dart b/pkg/analyzer/test/src/diagnostics/extension_type_declares_member_of_object_test.dart
index 69dc079..5f4428e 100644
--- a/pkg/analyzer/test/src/diagnostics/extension_type_declares_member_of_object_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/extension_type_declares_member_of_object_test.dart
@@ -2,7 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/src/diagnostic/diagnostic.dart' as diag;
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../dart/resolution/context_collection_resolution.dart';
@@ -16,108 +15,108 @@
 @reflectiveTest
 class ExtensionTypeDeclaresMemberOfObjectTest extends PubPackageResolutionTest {
   test_instance_differentKind() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 extension type E(int it) {
   int get hashCode => 0;
+//        ^^^^^^^^
+// [diag.extensionTypeDeclaresMemberOfObject] Extension types can't declare members with the same name as a member declared by 'Object'.
 }
-''',
-      [error(diag.extensionTypeDeclaresMemberOfObject, 37, 8)],
-    );
+''');
   }
 
   test_instance_sameKind() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 extension type E(int it) {
   bool operator==(Object _) => false;
+//             ^^
+// [diag.extensionTypeDeclaresMemberOfObject] Extension types can't declare members with the same name as a member declared by 'Object'.
   int get hashCode => 0;
+//        ^^^^^^^^
+// [diag.extensionTypeDeclaresMemberOfObject] Extension types can't declare members with the same name as a member declared by 'Object'.
   String toString() => '';
+//       ^^^^^^^^
+// [diag.extensionTypeDeclaresMemberOfObject] Extension types can't declare members with the same name as a member declared by 'Object'.
   dynamic get runtimeType => null;
+//            ^^^^^^^^^^^
+// [diag.extensionTypeDeclaresMemberOfObject] Extension types can't declare members with the same name as a member declared by 'Object'.
   dynamic noSuchMethod(_) => null;
+//        ^^^^^^^^^^^^
+// [diag.extensionTypeDeclaresMemberOfObject] Extension types can't declare members with the same name as a member declared by 'Object'.
 }
-''',
-      [
-        error(diag.extensionTypeDeclaresMemberOfObject, 42, 2),
-        error(diag.extensionTypeDeclaresMemberOfObject, 75, 8),
-        error(diag.extensionTypeDeclaresMemberOfObject, 99, 8),
-        error(diag.extensionTypeDeclaresMemberOfObject, 131, 11),
-        error(diag.extensionTypeDeclaresMemberOfObject, 162, 12),
-      ],
-    );
+''');
   }
 
   test_representation() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 extension type E0(Object? hashCode) {}
+//                        ^^^^^^^^
+// [diag.extensionTypeDeclaresMemberOfObject] Extension types can't declare members with the same name as a member declared by 'Object'.
 extension type E1(Object? noSuchMethod) {}
+//                        ^^^^^^^^^^^^
+// [diag.extensionTypeDeclaresMemberOfObject] Extension types can't declare members with the same name as a member declared by 'Object'.
 extension type E2(Object? runtimeType) {}
+//                        ^^^^^^^^^^^
+// [diag.extensionTypeDeclaresMemberOfObject] Extension types can't declare members with the same name as a member declared by 'Object'.
 extension type E3(Object? toString) {}
-''',
-      [
-        error(diag.extensionTypeDeclaresMemberOfObject, 26, 8),
-        error(diag.extensionTypeDeclaresMemberOfObject, 65, 12),
-        error(diag.extensionTypeDeclaresMemberOfObject, 108, 11),
-        error(diag.extensionTypeDeclaresMemberOfObject, 150, 8),
-      ],
-    );
+//                        ^^^^^^^^
+// [diag.extensionTypeDeclaresMemberOfObject] Extension types can't declare members with the same name as a member declared by 'Object'.
+''');
   }
 
   test_static_getter() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 extension type E(int it) {
   static int get hashCode => 0;
+//               ^^^^^^^^
+// [diag.extensionTypeDeclaresMemberOfObject] Extension types can't declare members with the same name as a member declared by 'Object'.
   static int get noSuchMethod => 0;
+//               ^^^^^^^^^^^^
+// [diag.extensionTypeDeclaresMemberOfObject] Extension types can't declare members with the same name as a member declared by 'Object'.
   static int get runtimeType => 0;
+//               ^^^^^^^^^^^
+// [diag.extensionTypeDeclaresMemberOfObject] Extension types can't declare members with the same name as a member declared by 'Object'.
   static int get toString => 0;
+//               ^^^^^^^^
+// [diag.extensionTypeDeclaresMemberOfObject] Extension types can't declare members with the same name as a member declared by 'Object'.
 }
-''',
-      [
-        error(diag.extensionTypeDeclaresMemberOfObject, 44, 8),
-        error(diag.extensionTypeDeclaresMemberOfObject, 76, 12),
-        error(diag.extensionTypeDeclaresMemberOfObject, 112, 11),
-        error(diag.extensionTypeDeclaresMemberOfObject, 147, 8),
-      ],
-    );
+''');
   }
 
   test_static_method() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 extension type E(int it) {
   static int hashCode() => 0;
+//           ^^^^^^^^
+// [diag.extensionTypeDeclaresMemberOfObject] Extension types can't declare members with the same name as a member declared by 'Object'.
   static dynamic noSuchMethod(Invocation i) => null;
+//               ^^^^^^^^^^^^
+// [diag.extensionTypeDeclaresMemberOfObject] Extension types can't declare members with the same name as a member declared by 'Object'.
   static Type runtimeType() => int;
+//            ^^^^^^^^^^^
+// [diag.extensionTypeDeclaresMemberOfObject] Extension types can't declare members with the same name as a member declared by 'Object'.
   static String toString() => '';
+//              ^^^^^^^^
+// [diag.extensionTypeDeclaresMemberOfObject] Extension types can't declare members with the same name as a member declared by 'Object'.
 }
-''',
-      [
-        error(diag.extensionTypeDeclaresMemberOfObject, 40, 8),
-        error(diag.extensionTypeDeclaresMemberOfObject, 74, 12),
-        error(diag.extensionTypeDeclaresMemberOfObject, 124, 11),
-        error(diag.extensionTypeDeclaresMemberOfObject, 162, 8),
-      ],
-    );
+''');
   }
 
   test_static_setter() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 extension type E(int it) {
   static set hashCode(int _) {}
+//           ^^^^^^^^
+// [diag.extensionTypeDeclaresMemberOfObject] Extension types can't declare members with the same name as a member declared by 'Object'.
   static set noSuchMethod(int _) {}
+//           ^^^^^^^^^^^^
+// [diag.extensionTypeDeclaresMemberOfObject] Extension types can't declare members with the same name as a member declared by 'Object'.
   static set runtimeType(int _) {}
+//           ^^^^^^^^^^^
+// [diag.extensionTypeDeclaresMemberOfObject] Extension types can't declare members with the same name as a member declared by 'Object'.
   static set toString(int _) {}
+//           ^^^^^^^^
+// [diag.extensionTypeDeclaresMemberOfObject] Extension types can't declare members with the same name as a member declared by 'Object'.
 }
-''',
-      [
-        error(diag.extensionTypeDeclaresMemberOfObject, 40, 8),
-        error(diag.extensionTypeDeclaresMemberOfObject, 72, 12),
-        error(diag.extensionTypeDeclaresMemberOfObject, 108, 11),
-        error(diag.extensionTypeDeclaresMemberOfObject, 143, 8),
-      ],
-    );
+''');
   }
 }
diff --git a/pkg/analyzer/test/src/diagnostics/extension_type_implements_disallowed_type_test.dart b/pkg/analyzer/test/src/diagnostics/extension_type_implements_disallowed_type_test.dart
index 700031d..3f0a89d 100644
--- a/pkg/analyzer/test/src/diagnostics/extension_type_implements_disallowed_type_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/extension_type_implements_disallowed_type_test.dart
@@ -2,7 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/src/diagnostic/diagnostic.dart' as diag;
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../dart/resolution/context_collection_resolution.dart';
@@ -17,92 +16,84 @@
 class ExtensionTypeImplementsDisallowedTypeTest
     extends PubPackageResolutionTest {
   test_dynamicType() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 extension type A(int it) implements X {}
+//                                  ^
+// [diag.extensionTypeImplementsDisallowedType] Extension types can't implement 'dynamic'.
 typedef X = dynamic;
-''',
-      [error(diag.extensionTypeImplementsDisallowedType, 36, 1)],
-    );
+''');
   }
 
   test_functionType() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 extension type A(int it) implements X {}
+//                                  ^
+// [diag.extensionTypeImplementsDisallowedType] Extension types can't implement 'X'.
 typedef X = void Function();
-''',
-      [error(diag.extensionTypeImplementsDisallowedType, 36, 1)],
-    );
+''');
   }
 
   test_interfaceType_extensionTyp() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 extension type A(int it) implements X {}
 extension type X(num it) {}
 ''');
   }
 
   test_interfaceType_function() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 extension type A(int it) implements Function {}
-''',
-      [error(diag.extensionTypeImplementsDisallowedType, 36, 8)],
-    );
+//                                  ^^^^^^^^
+// [diag.extensionTypeImplementsDisallowedType] Extension types can't implement 'Function'.
+''');
   }
 
   test_interfaceType_futureOr() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 extension type A(int it) implements FutureOr<int> {}
-''',
-      [error(diag.extensionTypeImplementsDisallowedType, 36, 13)],
-    );
+//                                  ^^^^^^^^^^^^^
+// [diag.extensionTypeImplementsDisallowedType] Extension types can't implement 'InvalidType'.
+''');
   }
 
   test_interfaceType_nullable() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 extension type A(int it) implements X {}
+//                                  ^
+// [diag.nullableTypeInImplementsClause] Nullable types can't be implemented.
 typedef X = num?;
-''',
-      [error(diag.nullableTypeInImplementsClause, 36, 1)],
-    );
+''');
   }
 
   test_interfaceType_num() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 extension type A(int it) implements num {}
 ''');
   }
 
   test_recordType() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 extension type A(int it) implements X {}
+//                                  ^
+// [diag.extensionTypeImplementsDisallowedType] Extension types can't implement 'X'.
 typedef X = (int, String);
-''',
-      [error(diag.extensionTypeImplementsDisallowedType, 36, 1)],
-    );
+''');
   }
 
   test_typeParameterType() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 extension type A<T>(int it) implements T {}
-''',
-      [error(diag.extensionTypeImplementsDisallowedType, 39, 1)],
-    );
+//                                     ^
+// [diag.extensionTypeImplementsDisallowedType] Extension types can't implement 'T'.
+''');
   }
 
   test_voidType() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 extension type A(int it) implements X {}
+//                                  ^
+// [diag.extensionTypeImplementsDisallowedType] Extension types can't implement 'void'.
 typedef X = void;
-''',
-      [error(diag.extensionTypeImplementsDisallowedType, 36, 1)],
-    );
+''');
   }
 }
diff --git a/pkg/analyzer/test/src/diagnostics/extension_type_implements_itself_test.dart b/pkg/analyzer/test/src/diagnostics/extension_type_implements_itself_test.dart
index a72115e..80d0250 100644
--- a/pkg/analyzer/test/src/diagnostics/extension_type_implements_itself_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/extension_type_implements_itself_test.dart
@@ -2,7 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/src/diagnostic/diagnostic.dart' as diag;
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../dart/resolution/context_collection_resolution.dart';
@@ -16,24 +15,21 @@
 @reflectiveTest
 class ExtensionTypeImplementsItselfTest extends PubPackageResolutionTest {
   test_hasCycle2() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 extension type A(int it) implements B {}
+//             ^
+// [diag.extensionTypeImplementsItself] The extension type can't implement itself.
 extension type B(int it) implements A {}
-''',
-      [
-        error(diag.extensionTypeImplementsItself, 15, 1),
-        error(diag.extensionTypeImplementsItself, 56, 1),
-      ],
-    );
+//             ^
+// [diag.extensionTypeImplementsItself] The extension type can't implement itself.
+''');
   }
 
   test_hasCycle_self() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 extension type A(int it) implements A {}
-''',
-      [error(diag.extensionTypeImplementsItself, 15, 1)],
-    );
+//             ^
+// [diag.extensionTypeImplementsItself] The extension type can't implement itself.
+''');
   }
 }
diff --git a/pkg/analyzer/test/src/diagnostics/extension_type_implements_not_supertype_of_erasure_test.dart b/pkg/analyzer/test/src/diagnostics/extension_type_implements_not_supertype_of_erasure_test.dart
index 36e628b..e23c9d7 100644
--- a/pkg/analyzer/test/src/diagnostics/extension_type_implements_not_supertype_of_erasure_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/extension_type_implements_not_supertype_of_erasure_test.dart
@@ -2,7 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/src/diagnostic/diagnostic.dart' as diag;
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../dart/resolution/context_collection_resolution.dart';
@@ -16,32 +15,30 @@
 @reflectiveTest
 class ExtensionTypeImplementsNotSupertypeTest extends PubPackageResolutionTest {
   test_notSupertype_extensionType() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 extension type A(int it) {}
 extension type B(A it) implements num {}
-''',
-      [error(diag.extensionTypeImplementsNotSupertype, 62, 3)],
-    );
+//                                ^^^
+// [diag.extensionTypeImplementsNotSupertype] 'num' is not a supertype of 'A', the representation type.
+''');
   }
 
   test_notSupertype_interfaceType() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 extension type A(int it) implements String {}
-''',
-      [error(diag.extensionTypeImplementsNotSupertype, 36, 6)],
-    );
+//                                  ^^^^^^
+// [diag.extensionTypeImplementsNotSupertype] 'String' is not a supertype of 'int', the representation type.
+''');
   }
 
   test_supertype() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 extension type A(int it) implements num {}
 ''');
   }
 
   test_supertype2() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 extension type A(S3 it) implements S1 {}
 class S1 {}
 class S2 extends S1 {}
diff --git a/pkg/analyzer/test/src/diagnostics/extension_type_implements_representation_not_supertype_test.dart b/pkg/analyzer/test/src/diagnostics/extension_type_implements_representation_not_supertype_test.dart
index e0c7e36..d9c9fe5 100644
--- a/pkg/analyzer/test/src/diagnostics/extension_type_implements_representation_not_supertype_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/extension_type_implements_representation_not_supertype_test.dart
@@ -2,7 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/src/diagnostic/diagnostic.dart' as diag;
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../dart/resolution/context_collection_resolution.dart';
@@ -19,24 +18,23 @@
 class ExtensionTypeImplementsRepresentationNotSupertypeTest
     extends PubPackageResolutionTest {
   test_notSupertype() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 extension type A(String it) {}
 extension type B(int it) implements A {}
-''',
-      [error(diag.extensionTypeImplementsRepresentationNotSupertype, 67, 1)],
-    );
+//                                  ^
+// [diag.extensionTypeImplementsRepresentationNotSupertype] 'String', the representation type of 'A', is not a supertype of 'int', the representation type of 'B'.
+''');
   }
 
   test_supertype() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 extension type A(num it) {}
 extension type B(int it) implements A {}
 ''');
   }
 
   test_supertype2() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 extension type A(S1 it) {}
 extension type B(S3 it) implements A {}
 class S1 {}
@@ -46,7 +44,7 @@
   }
 
   test_supertype3() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 extension type V1(num _) {}
 extension type V2(int _) implements V1 {}
 extension type ET(V2 id) implements V1 {}
diff --git a/pkg/analyzer/test/src/diagnostics/extension_type_inherited_member_conflict_test.dart b/pkg/analyzer/test/src/diagnostics/extension_type_inherited_member_conflict_test.dart
index 89f8e86..3e010e0 100644
--- a/pkg/analyzer/test/src/diagnostics/extension_type_inherited_member_conflict_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/extension_type_inherited_member_conflict_test.dart
@@ -2,7 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/src/diagnostic/diagnostic.dart' as diag;
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../dart/resolution/context_collection_resolution.dart';
@@ -23,51 +22,43 @@
 class ExtensionTypeInheritedMemberConflictTest_extension2
     extends PubPackageResolutionTest {
   test_conflict() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 extension type A1(int it) {
   void foo() {}
+//     ^^^
+// [context 1] Inherited from 'A1'
 }
 
 extension type A2(int it) {
   void foo() {}
+//     ^^^
+// [context 2] Inherited from 'A2'
 }
 
 extension type B(int it) implements A1, A2 {}
-''',
-      [
-        error(
-          diag.extensionTypeInheritedMemberConflict,
-          109,
-          1,
-          contextMessages: [message(testFile, 35, 3), message(testFile, 82, 3)],
-        ),
-      ],
-    );
+//             ^
+// [diag.extensionTypeInheritedMemberConflict][context 1][context 2] The extension type 'B' has more than one distinct member named 'foo' from implemented types.
+''');
   }
 
   test_conflict_representationField() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 extension type A(String bar) {}
+//                      ^^^
+// [context 1] Inherited from 'A'
 
 extension type B(String bar) {}
+//                      ^^^
+// [context 2] Inherited from 'B'
 
 extension type C(String foo) implements A, B {}
-''',
-      [
-        error(
-          diag.extensionTypeInheritedMemberConflict,
-          81,
-          1,
-          contextMessages: [message(testFile, 24, 3), message(testFile, 57, 3)],
-        ),
-      ],
-    );
+//             ^
+// [diag.extensionTypeInheritedMemberConflict][context 1][context 2] The extension type 'C' has more than one distinct member named 'bar' from implemented types.
+''');
   }
 
   test_noConflict_redeclared() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 extension type A1(int it) {
   void foo() {}
 }
@@ -83,7 +74,7 @@
   }
 
   test_noConflict_sameDeclaration() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 extension type A(int it) {
   void foo() {}
 }
@@ -101,31 +92,27 @@
 class ExtensionTypeInheritedMemberConflictTest_extensionAndNot
     extends PubPackageResolutionTest {
   test_conflict() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   void foo() {}
+//     ^^^
+// [context 1] Inherited from 'A'
 }
 
 extension type B(A it) {
   void foo() {}
+//     ^^^
+// [context 2] Inherited from 'B'
 }
 
 extension type C(A it) implements A, B {}
-''',
-      [
-        error(
-          diag.extensionTypeInheritedMemberConflict,
-          88,
-          1,
-          contextMessages: [message(testFile, 17, 3), message(testFile, 61, 3)],
-        ),
-      ],
-    );
+//             ^
+// [diag.extensionTypeInheritedMemberConflict][context 1][context 2] The extension type 'C' has more than one distinct member named 'foo' from implemented types.
+''');
   }
 
   test_redeclared() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   void foo() {}
 }
@@ -145,14 +132,17 @@
 class ExtensionTypeInheritedMemberConflictTest_notExtension
     extends PubPackageResolutionTest {
   test_conflict() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   void foo(int a) {}
+//     ^^^
+// [context 1] Inherited from 'A'
 }
 
 class B {
   void foo(String a) {}
+//     ^^^
+// [context 2] Inherited from 'B'
 }
 
 class C implements A, B {
@@ -160,20 +150,13 @@
 }
 
 extension type D(C it) implements A, B {}
-''',
-      [
-        error(
-          diag.extensionTypeInheritedMemberConflict,
-          139,
-          1,
-          contextMessages: [message(testFile, 17, 3), message(testFile, 51, 3)],
-        ),
-      ],
-    );
+//             ^
+// [diag.extensionTypeInheritedMemberConflict][context 1][context 2] The extension type 'D' has more than one distinct member named 'foo' from implemented types.
+''');
   }
 
   test_noConflict_notExtension_combined() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 abstract class A<T> {
   (Object?, dynamic, dynamic) method(T t);
 }
@@ -197,7 +180,7 @@
   }
 
   test_noConflict_redeclared() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   void foo(int a) {}
 }
@@ -217,7 +200,7 @@
   }
 
   test_noConflict_sameDeclaration() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   int foo() => 0;
 }
diff --git a/pkg/analyzer/test/src/diagnostics/extension_type_representation_depends_on_itself_test.dart b/pkg/analyzer/test/src/diagnostics/extension_type_representation_depends_on_itself_test.dart
index 6eb5d63..1816a7d 100644
--- a/pkg/analyzer/test/src/diagnostics/extension_type_representation_depends_on_itself_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/extension_type_representation_depends_on_itself_test.dart
@@ -2,7 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/src/diagnostic/diagnostic.dart' as diag;
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../dart/resolution/context_collection_resolution.dart';
@@ -17,48 +16,42 @@
 class ExtensionTypeRepresentationDependsOnItselfTest
     extends PubPackageResolutionTest {
   test_depends_cycle2_direct() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 extension type A(B it) {}
+//             ^
+// [diag.extensionTypeRepresentationDependsOnItself] The extension type representation can't depend on itself.
 
 extension type B(A it) {}
-''',
-      [
-        error(diag.extensionTypeRepresentationDependsOnItself, 15, 1),
-        error(diag.extensionTypeRepresentationDependsOnItself, 42, 1),
-      ],
-    );
+//             ^
+// [diag.extensionTypeRepresentationDependsOnItself] The extension type representation can't depend on itself.
+''');
   }
 
   test_depends_cycle2_typeArgument() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 extension type A(List<B> it) {}
+//             ^
+// [diag.extensionTypeRepresentationDependsOnItself] The extension type representation can't depend on itself.
 
 extension type B(List<A> it) {}
-''',
-      [
-        error(diag.extensionTypeRepresentationDependsOnItself, 15, 1),
-        error(diag.extensionTypeRepresentationDependsOnItself, 48, 1),
-      ],
-    );
+//             ^
+// [diag.extensionTypeRepresentationDependsOnItself] The extension type representation can't depend on itself.
+''');
   }
 
   test_depends_self_direct() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 extension type A(A it) {}
-''',
-      [error(diag.extensionTypeRepresentationDependsOnItself, 15, 1)],
-    );
+//             ^
+// [diag.extensionTypeRepresentationDependsOnItself] The extension type representation can't depend on itself.
+''');
   }
 
   test_depends_self_typeArgument() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 extension type A(List<A> it) {}
-''',
-      [error(diag.extensionTypeRepresentationDependsOnItself, 15, 1)],
-    );
+//             ^
+// [diag.extensionTypeRepresentationDependsOnItself] The extension type representation can't depend on itself.
+''');
   }
 }
diff --git a/pkg/analyzer/test/src/diagnostics/extension_type_representation_type_bottom_test.dart b/pkg/analyzer/test/src/diagnostics/extension_type_representation_type_bottom_test.dart
index 37b712c..3f078dc 100644
--- a/pkg/analyzer/test/src/diagnostics/extension_type_representation_type_bottom_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/extension_type_representation_type_bottom_test.dart
@@ -2,7 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/src/diagnostic/diagnostic.dart' as diag;
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../dart/resolution/context_collection_resolution.dart';
@@ -17,43 +16,41 @@
 class ExtensionTypeRepresentationTypeBottomTest
     extends PubPackageResolutionTest {
   test_never() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 extension type A(Never it) {}
-''',
-      [error(diag.extensionTypeRepresentationTypeBottom, 17, 5)],
-    );
+//               ^^^^^
+// [diag.extensionTypeRepresentationTypeBottom] The representation type can't be a bottom type.
+''');
   }
 
   test_neverQuestion() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 extension type A(Never? it) {}
 ''');
   }
 
   test_typeParameter_never_none() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 extension type A<T extends Never>(T it) {}
-''',
-      [error(diag.extensionTypeRepresentationTypeBottom, 34, 1)],
-    );
+//                                ^
+// [diag.extensionTypeRepresentationTypeBottom] The representation type can't be a bottom type.
+''');
   }
 
   test_typeParameter_never_question() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 extension type A<T extends Never>(T? it) {}
 ''');
   }
 
   test_typeParameter_never_question2() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 extension type A<T extends Never, S extends T>(S? it) {}
 ''');
   }
 
   test_typeParameter_never_question3() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 extension type A<T extends Never, S extends T?>(S it) {}
 ''');
   }
diff --git a/pkg/analyzer/test/src/diagnostics/extension_type_with_abstract_member_test.dart b/pkg/analyzer/test/src/diagnostics/extension_type_with_abstract_member_test.dart
index 985addb..66b428b 100644
--- a/pkg/analyzer/test/src/diagnostics/extension_type_with_abstract_member_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/extension_type_with_abstract_member_test.dart
@@ -2,7 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/src/diagnostic/diagnostic.dart' as diag;
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../dart/resolution/context_collection_resolution.dart';
@@ -16,18 +15,17 @@
 @reflectiveTest
 class ExtensionTypeWithAbstractMemberTest extends PubPackageResolutionTest {
   test_getter() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 extension type A(int it) {
   int get foo;
+//^^^^^^^^^^^^
+// [diag.extensionTypeWithAbstractMember] 'foo' must have a method body because 'A' is an extension type.
 }
-''',
-      [error(diag.extensionTypeWithAbstractMember, 29, 12)],
-    );
+''');
   }
 
   test_getter_external() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 extension type A(int it) {
   external int get foo;
 }
@@ -35,7 +33,7 @@
   }
 
   test_getter_static() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 extension type A(int it) {
   static int get foo;
 }
@@ -43,30 +41,28 @@
   }
 
   test_getter_static_language305() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 // @dart = 3.5
 extension type A(int it) {
   static int get foo;
+//                  ^
+// [diag.missingFunctionBody] A function body must be provided.
 }
-''',
-      [error(diag.missingFunctionBody, 62, 1)],
-    );
+''');
   }
 
   test_method() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 extension type A(int it) {
   void foo();
+//^^^^^^^^^^^
+// [diag.extensionTypeWithAbstractMember] 'foo' must have a method body because 'A' is an extension type.
 }
-''',
-      [error(diag.extensionTypeWithAbstractMember, 29, 11)],
-    );
+''');
   }
 
   test_method_external() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 extension type A(int it) {
   external void foo();
 }
@@ -74,7 +70,7 @@
   }
 
   test_method_static() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 extension type A(int it) {
   static void foo();
 }
@@ -82,30 +78,28 @@
   }
 
   test_method_static_language305() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 // @dart = 3.5
 extension type A(int it) {
   static void foo();
+//                 ^
+// [diag.missingFunctionBody] A function body must be provided.
 }
-''',
-      [error(diag.missingFunctionBody, 61, 1)],
-    );
+''');
   }
 
   test_setter() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 extension type A(int it) {
   set foo(int _);
+//^^^^^^^^^^^^^^^
+// [diag.extensionTypeWithAbstractMember] 'foo' must have a method body because 'A' is an extension type.
 }
-''',
-      [error(diag.extensionTypeWithAbstractMember, 29, 15)],
-    );
+''');
   }
 
   test_setter_external() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 extension type A(int it) {
   external set foo(int _);
 }
@@ -113,7 +107,7 @@
   }
 
   test_setter_static() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 extension type A(int it) {
   static set foo(int _);
 }
@@ -121,14 +115,13 @@
   }
 
   test_setter_static_language305() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 // @dart = 3.5
 extension type A(int it) {
   static set foo(int _);
+//                     ^
+// [diag.missingFunctionBody] A function body must be provided.
 }
-''',
-      [error(diag.missingFunctionBody, 65, 1)],
-    );
+''');
   }
 }
diff --git a/pkg/analyzer/test/src/diagnostics/external_field_constructor_initializer_test.dart b/pkg/analyzer/test/src/diagnostics/external_field_constructor_initializer_test.dart
index 46b2908..f19a533 100644
--- a/pkg/analyzer/test/src/diagnostics/external_field_constructor_initializer_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/external_field_constructor_initializer_test.dart
@@ -2,7 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/src/diagnostic/diagnostic.dart' as diag;
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../dart/resolution/context_collection_resolution.dart';
@@ -16,43 +15,40 @@
 @reflectiveTest
 class ExternalFieldConstructorInitializerTest extends PubPackageResolutionTest {
   test_external_field_constructor_initializer() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   external int x;
   A() : x = 0;
+//      ^
+// [diag.externalFieldConstructorInitializer] External fields can't have initializers.
 }
-''',
-      [error(diag.externalFieldConstructorInitializer, 36, 1)],
-    );
+''');
   }
 
   test_external_field_final_constructor_initializer() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   external final int x;
   A() : x = 0;
+//      ^
+// [diag.externalFieldConstructorInitializer] External fields can't have initializers.
 }
-''',
-      [error(diag.externalFieldConstructorInitializer, 42, 1)],
-    );
+''');
   }
 
   test_external_field_final_initializing_formal() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   external final int x;
   A(this.x);
+//       ^
+// [diag.externalFieldConstructorInitializer] External fields can't have initializers.
 }
-''',
-      [error(diag.externalFieldConstructorInitializer, 43, 1)],
-    );
+''');
   }
 
   test_external_field_final_no_initialization() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   external final int x;
   A();
@@ -61,19 +57,18 @@
   }
 
   test_external_field_initializing_formal() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   external int x;
   A(this.x);
+//       ^
+// [diag.externalFieldConstructorInitializer] External fields can't have initializers.
 }
-''',
-      [error(diag.externalFieldConstructorInitializer, 37, 1)],
-    );
+''');
   }
 
   test_external_field_no_initialization() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   external int x;
   A();
diff --git a/pkg/analyzer/test/src/diagnostics/external_method_with_body_test.dart b/pkg/analyzer/test/src/diagnostics/external_method_with_body_test.dart
index 62f0d5b..163f257 100644
--- a/pkg/analyzer/test/src/diagnostics/external_method_with_body_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/external_method_with_body_test.dart
@@ -2,7 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/src/diagnostic/diagnostic.dart' as diag;
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../dart/resolution/context_collection_resolution.dart';
@@ -16,92 +15,82 @@
 @reflectiveTest
 class ExternalMethodWithBodyTest extends PubPackageResolutionTest {
   test_class_getter_external_blockBody() async {
-    await assertErrorsInCode(
-      r'''
-class A {
+    await resolveTestCodeWithDiagnostics(r'''
+class C {
   external int get foo {}
+//                 ^^^
+// [diag.bodyMightCompleteNormally] The body might complete normally, causing 'null' to be returned, but the return type, 'int', is a potentially non-nullable type.
+//                     ^
+// [diag.externalMethodWithBody] An external or native method can't have a body.
 }
-''',
-      [
-        error(diag.bodyMightCompleteNormally, 29, 3),
-        error(diag.externalMethodWithBody, 33, 1),
-      ],
-    );
+''');
   }
 
   test_class_getter_external_expressionBody() async {
-    await assertErrorsInCode(
-      r'''
-class A {
+    await resolveTestCodeWithDiagnostics(r'''
+class C {
   external int get foo => 0;
+//                     ^^
+// [diag.externalMethodWithBody] An external or native method can't have a body.
 }
-''',
-      [error(diag.externalMethodWithBody, 33, 2)],
-    );
+''');
   }
 
   test_class_method_external_blockBody() async {
-    await assertErrorsInCode(
-      r'''
-class A {
+    await resolveTestCodeWithDiagnostics(r'''
+class C {
   external void foo() {}
+//                    ^
+// [diag.externalMethodWithBody] An external or native method can't have a body.
 }
-''',
-      [error(diag.externalMethodWithBody, 32, 1)],
-    );
+''');
   }
 
   test_class_method_external_expressionBody() async {
-    await assertErrorsInCode(
-      r'''
-class A {
+    await resolveTestCodeWithDiagnostics(r'''
+class C {
   external void foo() => null;
+//                    ^^
+// [diag.externalMethodWithBody] An external or native method can't have a body.
 }
-''',
-      [error(diag.externalMethodWithBody, 32, 2)],
-    );
+''');
   }
 
   test_class_operator_external_blockBody() async {
-    await assertErrorsInCode(
-      r'''
-class A {
+    await resolveTestCodeWithDiagnostics(r'''
+class C {
   external int operator +(int other) {}
+//                      ^
+// [diag.bodyMightCompleteNormally] The body might complete normally, causing 'null' to be returned, but the return type, 'int', is a potentially non-nullable type.
+//                                   ^
+// [diag.externalMethodWithBody] An external or native method can't have a body.
 }
-''',
-      [
-        error(diag.bodyMightCompleteNormally, 34, 1),
-        error(diag.externalMethodWithBody, 47, 1),
-      ],
-    );
+''');
   }
 
   test_class_setter_external_blockBody() async {
-    await assertErrorsInCode(
-      r'''
-class A {
+    await resolveTestCodeWithDiagnostics(r'''
+class C {
   external void set foo(int v) {}
+//                             ^
+// [diag.externalMethodWithBody] An external or native method can't have a body.
 }
-''',
-      [error(diag.externalMethodWithBody, 41, 1)],
-    );
+''');
   }
 
   test_topLevelFunction_external_blockBody() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 external void foo() {}
-''',
-      [error(diag.externalMethodWithBody, 20, 1)],
-    );
+//                  ^
+// [diag.externalMethodWithBody] An external or native method can't have a body.
+''');
   }
 
   test_topLevelFunction_external_expressionBody() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 external void foo() => null;
-''',
-      [error(diag.externalMethodWithBody, 20, 2)],
-    );
+//                  ^^
+// [diag.externalMethodWithBody] An external or native method can't have a body.
+''');
   }
 }
diff --git a/pkg/analyzer/test/src/diagnostics/extra_annotation_on_struct_field_test.dart b/pkg/analyzer/test/src/diagnostics/extra_annotation_on_struct_field_test.dart
index 791dbcb..35f89eb 100644
--- a/pkg/analyzer/test/src/diagnostics/extra_annotation_on_struct_field_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/extra_annotation_on_struct_field_test.dart
@@ -2,7 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/src/diagnostic/diagnostic.dart' as diag;
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../dart/resolution/context_collection_resolution.dart';
@@ -16,7 +15,7 @@
 @reflectiveTest
 class ExtraAnnotationOnStructFieldTest extends PubPackageResolutionTest {
   test_one() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'dart:ffi';
 final class C extends Struct {
   @Int32()
@@ -26,16 +25,15 @@
   }
 
   test_two() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'dart:ffi';
 final class C extends Struct {
   @Int32()
   @Int16()
+//^^^^^^^^
+// [diag.extraAnnotationOnStructField] Fields in a struct class must have exactly one annotation indicating the native type.
   external int x;
 }
-''',
-      [error(diag.extraAnnotationOnStructField, 63, 8)],
-    );
+''');
   }
 }
diff --git a/pkg/analyzer/test/src/diagnostics/extra_positional_arguments_test.dart b/pkg/analyzer/test/src/diagnostics/extra_positional_arguments_test.dart
index 8e62f7a9..8ae0e92 100644
--- a/pkg/analyzer/test/src/diagnostics/extra_positional_arguments_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/extra_positional_arguments_test.dart
@@ -2,7 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/src/diagnostic/diagnostic.dart' as diag;
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../dart/resolution/context_collection_resolution.dart';
@@ -18,61 +17,57 @@
 class ExtraPositionalArgumentsCouldBeNamedTest
     extends PubPackageResolutionTest {
   test_class_constConstructor() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   const A({int x = 0});
 }
 main() {
   const A(0);
+//        ^
+// [diag.extraPositionalArgumentsCouldBeNamed] Too many positional arguments: 0 expected, but 1 found.
 }
-''',
-      [error(diag.extraPositionalArgumentsCouldBeNamed, 55, 1)],
-    );
+''');
   }
 
   test_class_constConstructor_super() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   const A({int x = 0});
 }
 class B extends A {
   const B() : super(0);
+//                  ^
+// [diag.extraPositionalArgumentsCouldBeNamed] Too many positional arguments: 0 expected, but 1 found.
 }
-''',
-      [error(diag.extraPositionalArgumentsCouldBeNamed, 76, 1)],
-    );
+''');
   }
 
   test_class_constConstructor_typedef() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   const A({int x = 0});
 }
 typedef B = A;
 main() {
   const B(0);
+//        ^
+// [diag.extraPositionalArgumentsCouldBeNamed] Too many positional arguments: 0 expected, but 1 found.
 }
-''',
-      [error(diag.extraPositionalArgumentsCouldBeNamed, 70, 1)],
-    );
+''');
   }
 
   test_context() async {
     // No context type should be supplied when type inferring an extra
     // positional argument, even if there is an unmatched name parameter.
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 T f<T>() => throw '$T';
 g({int? named}) {}
 main() {
   g(f());
+//  ^^^
+// [diag.extraPositionalArgumentsCouldBeNamed] Too many positional arguments: 0 expected, but 1 found.
 }
-''',
-      [error(diag.extraPositionalArgumentsCouldBeNamed, 56, 3)],
-    );
+''');
     assertType(
       findNode.methodInvocation('f()').typeArgumentTypes!.single,
       'dynamic',
@@ -80,133 +75,120 @@
   }
 
   test_functionExpressionInvocation() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 main() {
   (int x, {int y = 0}) {} (0, 1);
+//                            ^
+// [diag.extraPositionalArgumentsCouldBeNamed] Too many positional arguments: 1 expected, but 2 found.
 }
-''',
-      [error(diag.extraPositionalArgumentsCouldBeNamed, 39, 1)],
-    );
+''');
   }
 
   test_metadata_enumConstant() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 enum E {
   v(0);
+//  ^
+// [diag.extraPositionalArgumentsCouldBeNamed] Too many positional arguments: 0 expected, but 1 found.
   const E({int? a});
+//              ^
+// [diag.unusedElementParameter] A value for optional parameter 'a' isn't ever given.
 }
-''',
-      [
-        error(diag.extraPositionalArgumentsCouldBeNamed, 13, 1),
-        error(diag.unusedElementParameter, 33, 1),
-      ],
-    );
+''');
   }
 
   test_metadata_extensionType() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 extension type const A(int it) {}
 
 @A(0, 1)
+//    ^
+// [diag.extraPositionalArguments] Too many positional arguments: 1 expected, but 2 found.
 void f() {}
-''',
-      [error(diag.extraPositionalArguments, 41, 1)],
-    );
+''');
   }
 
   test_methodInvocation_topLevelFunction() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 f({x, y}) {}
 main() {
   f(0, 1, '2');
+//  ^
+// [diag.extraPositionalArgumentsCouldBeNamed] Too many positional arguments: 0 expected, but 3 found.
 }
-''',
-      [error(diag.extraPositionalArgumentsCouldBeNamed, 26, 1)],
-    );
+''');
   }
 
   test_partiallyTypedName() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 f({int xx = 0, int yy = 0, int zz = 0}) {}
 
 main() {
   f(xx: 1, yy: 2, z);
+//                ^
+// [diag.undefinedIdentifier] Undefined name 'z'.
+// [diag.extraPositionalArgumentsCouldBeNamed] Too many positional arguments: 0 expected, but 1 found.
 }
-''',
-      [
-        error(diag.extraPositionalArgumentsCouldBeNamed, 71, 1),
-        error(diag.undefinedIdentifier, 71, 1),
-      ],
-    );
+''');
   }
 }
 
 @reflectiveTest
 class ExtraPositionalArgumentsTest extends PubPackageResolutionTest {
   test_constConstructor() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   const A();
 }
 main() {
   const A(0);
+//        ^
+// [diag.extraPositionalArguments] Too many positional arguments: 0 expected, but 1 found.
 }
-''',
-      [error(diag.extraPositionalArguments, 44, 1)],
-    );
+''');
   }
 
   test_constConstructor_super() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   const A();
 }
 class B extends A {
   const B() : super(0);
+//                  ^
+// [diag.extraPositionalArguments] Too many positional arguments: 0 expected, but 1 found.
 }
-''',
-      [error(diag.extraPositionalArguments, 65, 1)],
-    );
+''');
   }
 
   test_enumConstant() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 enum E {
   v(0)
+//  ^
+// [diag.extraPositionalArguments] Too many positional arguments: 0 expected, but 1 found.
 }
-''',
-      [error(diag.extraPositionalArguments, 13, 1)],
-    );
+''');
   }
 
   test_functionExpressionInvocation() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 main() {
   (int x) {} (0, 1);
+//               ^
+// [diag.extraPositionalArguments] Too many positional arguments: 1 expected, but 2 found.
 }
-''',
-      [error(diag.extraPositionalArguments, 26, 1)],
-    );
+''');
   }
 
   test_methodInvocation_topLevelFunction() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 f() {}
 main() {
   f(0, 1, '2');
+//  ^
+// [diag.extraPositionalArguments] Too many positional arguments: 0 expected, but 3 found.
 }
-''',
-      [error(diag.extraPositionalArguments, 20, 1)],
-    );
+''');
   }
 }
diff --git a/pkg/analyzer/test/src/diagnostics/extra_size_annotation_carray_test.dart b/pkg/analyzer/test/src/diagnostics/extra_size_annotation_carray_test.dart
index 3895846..605d134 100644
--- a/pkg/analyzer/test/src/diagnostics/extra_size_annotation_carray_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/extra_size_annotation_carray_test.dart
@@ -2,7 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/src/diagnostic/diagnostic.dart' as diag;
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../dart/resolution/context_collection_resolution.dart';
@@ -16,7 +15,7 @@
 @reflectiveTest
 class ExtraSizeAnnotationArray extends PubPackageResolutionTest {
   test_const() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'dart:ffi';
 
 const EIGHT = 8;
@@ -29,7 +28,7 @@
   }
 
   test_one() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'dart:ffi';
 
 final class C extends Struct {
@@ -40,17 +39,16 @@
   }
 
   test_two() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'dart:ffi';
 
 final class C extends Struct {
   @Array(8)
   @Array(8)
+//^^^^^^^^^
+// [diag.extraSizeAnnotationCarray] 'Array's must have exactly one 'Array' annotation.
   external Array<Uint8> a0;
 }
-''',
-      [error(diag.extraSizeAnnotationCarray, 65, 9)],
-    );
+''');
   }
 }
diff --git a/pkg/analyzer/test/src/diagnostics/ffi_address_of_cast_test.dart b/pkg/analyzer/test/src/diagnostics/ffi_address_of_cast_test.dart
index 2008efe..f68dc28 100644
--- a/pkg/analyzer/test/src/diagnostics/ffi_address_of_cast_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/ffi_address_of_cast_test.dart
@@ -2,7 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/src/diagnostic/diagnostic.dart' as diag;
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../dart/resolution/context_collection_resolution.dart';
@@ -16,8 +15,7 @@
 @reflectiveTest
 class FfiAddressOfCast extends PubPackageResolutionTest {
   test_struct_error_1() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'dart:ffi';
 
 @Native<Void Function(Pointer<Void>)>()
@@ -26,6 +24,8 @@
 main() {
   final myStruct = Struct.create<MyStruct>();
   myNonLeafNative(myStruct.arr.address.cast());
+//                             ^^^^^^^
+// [diag.addressPosition] The '.address' expression can only be used as argument to a leaf native external call.
 }
 
 final class MyStruct extends Struct {
@@ -34,14 +34,11 @@
   @Array(2)
   external Array<Int8> arr;
 }
-''',
-      [error(diag.addressPosition, 200, 7)],
-    );
+''');
   }
 
   test_struct_error_2() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'dart:ffi';
 
 @Native<Void Function(Pointer<Void>)>()
@@ -50,6 +47,8 @@
 main() {
   final myStruct = Struct.create<MyStruct>();
   myNonLeafNative(myStruct.value.address.cast());
+//                               ^^^^^^^
+// [diag.addressPosition] The '.address' expression can only be used as argument to a leaf native external call.
 }
 
 final class MyStruct extends Struct {
@@ -58,13 +57,11 @@
   @Array(2)
   external Array<Int8> arr;
 }
-''',
-      [error(diag.addressPosition, 202, 7)],
-    );
+''');
   }
 
   test_struct_no_error() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'dart:ffi';
 
 @Native<Void Function(Pointer<Void>)>(isLeaf: true)
@@ -86,8 +83,7 @@
   }
 
   test_typed_data_error() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'dart:ffi';
 import 'dart:typed_data';
 
@@ -97,14 +93,14 @@
 main() {
   final buffer = Int8List(2);
   myNonLeafNative(buffer.address.cast());
+//                       ^^^^^^^
+// [diag.addressPosition] The '.address' expression can only be used as argument to a leaf native external call.
 }
-''',
-      [error(diag.addressPosition, 204, 7)],
-    );
+''');
   }
 
   test_typed_data_no_error() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'dart:ffi';
 import 'dart:typed_data';
 
@@ -119,8 +115,7 @@
   }
 
   test_union_error_1() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'dart:ffi';
 
 @Native<Void Function(Pointer<Void>)>()
@@ -129,6 +124,8 @@
 main() {
   final myUnion = Union.create<MyUnion>();
   myNonLeafNative(myUnion.arr.address.cast());
+//                            ^^^^^^^
+// [diag.addressPosition] The '.address' expression can only be used as argument to a leaf native external call.
 }
 
 final class MyUnion extends Union {
@@ -137,14 +134,11 @@
   @Array(2)
   external Array<Int8> arr;
 }
-''',
-      [error(diag.addressPosition, 196, 7)],
-    );
+''');
   }
 
   test_union_error_2() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'dart:ffi';
 
 @Native<Void Function(Pointer<Void>)>()
@@ -153,20 +147,20 @@
 main() {
   final myUnion = Union.create<MyUnion>();
   myNonLeafNative(myUnion.value.address.cast());
+//                              ^^^^^^^
+// [diag.addressPosition] The '.address' expression can only be used as argument to a leaf native external call.
 }
 final class MyUnion extends Union {
   @Int8()
   external int value;
   @Array(2)
   external Array<Int8> arr;
-      }
-''',
-      [error(diag.addressPosition, 198, 7)],
-    );
+}
+''');
   }
 
   test_union_no_error() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'dart:ffi';
 
 @Native<Void Function(Pointer<Void>)>(isLeaf: true)
diff --git a/pkg/analyzer/test/src/diagnostics/ffi_array_test.dart b/pkg/analyzer/test/src/diagnostics/ffi_array_test.dart
index 4879d2e..3b57401 100644
--- a/pkg/analyzer/test/src/diagnostics/ffi_array_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/ffi_array_test.dart
@@ -2,7 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/src/diagnostic/diagnostic.dart' as diag;
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../dart/resolution/context_collection_resolution.dart';
@@ -16,21 +15,20 @@
 @reflectiveTest
 class InlineArrayTest extends PubPackageResolutionTest {
   test_array_negativeDimension() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'dart:ffi';
 
 final class MyStruct extends Struct {
   @Array(-1)
+//       ^^
+// [diag.nonPositiveArrayDimension] Array dimensions must be positive numbers.
   external Array<Int8> arr;
 }
-''',
-      [error(diag.nonPositiveArrayDimension, 67, 2)],
-    );
+''');
   }
 
   test_array_positiveDimension() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'dart:ffi';
 
 final class MyStruct extends Struct {
@@ -41,35 +39,33 @@
   }
 
   test_array_zeroDimension() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'dart:ffi';
 
 final class MyStruct extends Struct {
   @Array(0)
+//       ^
+// [diag.nonPositiveArrayDimension] Array dimensions must be positive numbers.
   external Array<Int8> arr;
 }
-''',
-      [error(diag.nonPositiveArrayDimension, 67, 1)],
-    );
+''');
   }
 
   test_multi_negativeDimension() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'dart:ffi';
 
 final class MyStruct extends Struct {
   @Array.multi([-2, 2])
+//              ^^
+// [diag.nonPositiveArrayDimension] Array dimensions must be positive numbers.
   external Array<Array<Int8>> arr;
 }
-''',
-      [error(diag.nonPositiveArrayDimension, 74, 2)],
-    );
+''');
   }
 
   test_multi_positiveDimension() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'dart:ffi';
 
 final class MyStruct extends Struct {
@@ -80,35 +76,33 @@
   }
 
   test_multi_zeroDimension() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'dart:ffi';
 
 final class MyStruct extends Struct {
   @Array.multi([0, 2])
+//              ^
+// [diag.nonPositiveArrayDimension] Array dimensions must be positive numbers.
   external Array<Array<Int8>> arr;
 }
-''',
-      [error(diag.nonPositiveArrayDimension, 74, 1)],
-    );
+''');
   }
 
   test_variable_negativeDimension() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'dart:ffi';
 
 final class MyStruct extends Struct {
   @Array.variable(-1)
+//                ^^
+// [diag.nonPositiveArrayDimension] Array dimensions must be positive numbers.
   external Array<Array<Int8>> arr;
 }
-''',
-      [error(diag.nonPositiveArrayDimension, 76, 2)],
-    );
+''');
   }
 
   test_variable_positiveDimension() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'dart:ffi';
 
 final class MyStruct extends Struct {
@@ -119,7 +113,7 @@
   }
 
   test_variable_valid() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'dart:ffi';
 
 final class MyStruct extends Struct {
@@ -130,35 +124,33 @@
   }
 
   test_variable_zeroDimension() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'dart:ffi';
 
 final class MyStruct extends Struct {
   @Array.variable(0)
+//                ^
+// [diag.nonPositiveArrayDimension] Array dimensions must be positive numbers.
   external Array<Array<Int8>> arr;
 }
-''',
-      [error(diag.nonPositiveArrayDimension, 76, 1)],
-    );
+''');
   }
 
   test_variableMulti_negativeDimension() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'dart:ffi';
 
 final class MyStruct extends Struct {
   @Array.variableMulti(variableDimension: -1, [2, 2])
+//                                        ^^
+// [diag.negativeVariableDimension] The variable dimension of a variable-length array must be non-negative.
   external Array<Array<Array<Int8>>> arr;
 }
-''',
-      [error(diag.negativeVariableDimension, 100, 2)],
-    );
+''');
   }
 
   test_variableMulti_positiveDimension() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'dart:ffi';
 
 final class MyStruct extends Struct {
@@ -169,7 +161,7 @@
   }
 
   test_variableMulti_valid() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'dart:ffi';
 
 final class MyStruct extends Struct {
@@ -180,7 +172,7 @@
   }
 
   test_variableMulti_zeroDimension() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'dart:ffi';
 
 final class MyStruct extends Struct {
@@ -191,21 +183,20 @@
   }
 
   test_variableWithVariableDimension_negativeDimension() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'dart:ffi';
 
 final class MyStruct extends Struct {
   @Array.variableWithVariableDimension(-1)
+//                                     ^^
+// [diag.negativeVariableDimension] The variable dimension of a variable-length array must be non-negative.
   external Array<Int8> arr;
 }
-''',
-      [error(diag.negativeVariableDimension, 97, 2)],
-    );
+''');
   }
 
   test_variableWithVariableDimension_positiveDimension() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'dart:ffi';
 
 final class MyStruct extends Struct {
@@ -216,7 +207,7 @@
   }
 
   test_variableWithVariableDimension_zeroDimension() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'dart:ffi';
 
 final class MyStruct extends Struct {
diff --git a/pkg/analyzer/test/src/diagnostics/ffi_async_callback_test.dart b/pkg/analyzer/test/src/diagnostics/ffi_async_callback_test.dart
index d6901d3..bba6fcf 100644
--- a/pkg/analyzer/test/src/diagnostics/ffi_async_callback_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/ffi_async_callback_test.dart
@@ -2,7 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/src/diagnostic/diagnostic.dart' as diag;
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../dart/resolution/context_collection_resolution.dart';
@@ -17,34 +16,32 @@
 class FfiNativeCallableListenersMustReturnVoid
     extends PubPackageResolutionTest {
   test_NativeCallable_isolateLocal_argumentMustBeAConstant() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'dart:ffi';
 int f(int i) => i * 2;
 void g() {
   int e = 123;
   NativeCallable<Int32 Function(Int32)>.isolateLocal(f, exceptionalReturn: e);
+//                                                                         ^
+// [diag.argumentMustBeAConstant] Argument 'exceptionalReturn' must be a constant.
 }
-''',
-      [error(diag.argumentMustBeAConstant, 143, 1)],
-    );
+''');
   }
 
   test_NativeCallable_isolateLocal_exceptionMustBeASubtype() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'dart:ffi';
 int f(int i) => i * 2;
 void g() {
   NativeCallable<Int32 Function(Int32)>.isolateLocal(f, exceptionalReturn: '?');
+//                                                                         ^^^
+// [diag.mustBeASubtype] The type 'String' must be a subtype of 'Int32' for 'isolateLocal'.
 }
-''',
-      [error(diag.mustBeASubtype, 128, 3)],
-    );
+''');
   }
 
   test_NativeCallable_isolateLocal_inferred() async {
-    await assertErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'dart:ffi';
 int f(int i) => i * 2;
 void g() {
@@ -52,115 +49,101 @@
   callback = NativeCallable.isolateLocal(f, exceptionalReturn: 4);
   callback.close();
 }
-''', []);
+''');
   }
 
   test_NativeCallable_isolateLocal_invalidExceptionValue() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'dart:ffi';
 void f(int i) => i * 2;
 void g() {
   NativeCallable<Void Function(Int32)>.isolateLocal(f, exceptionalReturn: 4);
+//                                                     ^^^^^^^^^^^^^^^^^^^^
+// [diag.invalidExceptionValue] The method isolateLocal can't have an exceptional return value (the second argument) when the return type of the function is either 'void', 'Handle' or 'Pointer'.
 }
-''',
-      [error(diag.invalidExceptionValue, 109, 20)],
-    );
+''');
   }
 
   test_NativeCallable_isolateLocal_missingExceptionValue() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'dart:ffi';
 int f(int i) => i * 2;
 void g() {
   NativeCallable<Int32 Function(Int32)>.isolateLocal(f);
+//^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// [diag.missingExceptionValue] The method isolateLocal must have an exceptional return value (the second argument) when the return type of the function is neither 'void', 'Handle', nor 'Pointer'.
 }
-''',
-      [error(diag.missingExceptionValue, 55, 53)],
-    );
+''');
   }
 
   test_NativeCallable_isolateLocal_mustBeANativeFunctionType() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'dart:ffi';
 int f(int i) => i * 2;
 void g() {
   NativeCallable<int Function(int)>.isolateLocal(f, exceptionalReturn: 4);
+//^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// [diag.mustBeANativeFunctionType] The type 'int Function(int)' given to 'NativeCallable' must be a valid 'dart:ffi' native function type.
 }
-''',
-      [
-        error(
-          diag.mustBeANativeFunctionType,
-          55,
-          46,
-          messageContains: [
-            "The type 'int Function(int)' given to 'NativeCallable' must be",
-          ],
-        ),
-      ],
-    );
+''');
   }
 
   test_NativeCallable_isolateLocal_mustBeASubtype() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'dart:ffi';
 int f(int i) => i * 2;
 void g() {
   NativeCallable<Int32 Function(Double)>.isolateLocal(f, exceptionalReturn: 4);
+//                                                    ^
+// [diag.mustBeASubtype] The type 'int Function(int)' must be a subtype of 'Int32 Function(Double)' for 'NativeCallable'.
 }
-''',
-      [error(diag.mustBeASubtype, 107, 1)],
-    );
+''');
   }
 
   test_NativeCallable_isolateLocal_mustHaveTypeArgs() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'dart:ffi';
 int f(int i) => i * 2;
 void g() {
   NativeCallable.isolateLocal(f, exceptionalReturn: 4);
+//^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// [diag.mustBeANativeFunctionType] The type 'Function' given to 'NativeCallable' must be a valid 'dart:ffi' native function type.
 }
-''',
-      [error(diag.mustBeANativeFunctionType, 55, 27)],
-    );
+''');
   }
 
   test_NativeCallable_isolateLocal_ok() async {
-    await assertErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'dart:ffi';
 int f(int i) => i * 2;
 void g() {
   NativeCallable<Int32 Function(Int32)>.isolateLocal(f, exceptionalReturn: 4);
 }
-''', []);
+''');
   }
 
   test_NativeCallable_isolateLocal_okVoid() async {
-    await assertErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'dart:ffi';
 void f(int i) => i * 2;
 void g() {
   NativeCallable<Void Function(Int32)>.isolateLocal(f);
 }
-''', []);
+''');
   }
 
   test_NativeCallable_isolateLocal_voidReturnPermissive() async {
-    await assertErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'dart:ffi';
 int f(int i) => i * 2;
 void g() {
   NativeCallable<Void Function(Int32)>.isolateLocal(f);
 }
-''', []);
+''');
   }
 
   test_NativeCallable_listener_inferred() async {
-    await assertErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'dart:ffi';
 void f(int i) => i * 2;
 void g() {
@@ -168,78 +151,74 @@
   callback = NativeCallable.listener(f);
   callback.close();
 }
-''', []);
+''');
   }
 
   test_NativeCallable_listener_mustBeANativeFunctionType() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'dart:ffi';
 void f(int i) => i * 2;
 void g() {
   NativeCallable<void Function(int)>.listener(f);
+//^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// [diag.mustBeANativeFunctionType] The type 'void Function(int)' given to 'NativeCallable' must be a valid 'dart:ffi' native function type.
 }
-''',
-      [error(diag.mustBeANativeFunctionType, 56, 43)],
-    );
+''');
   }
 
   test_NativeCallable_listener_mustBeASubtype() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'dart:ffi';
 void f(int i) => i * 2;
 void g() {
   NativeCallable<Void Function(Double)>.listener(f);
+//                                               ^
+// [diag.mustBeASubtype] The type 'void Function(int)' must be a subtype of 'Void Function(Double)' for 'NativeCallable'.
 }
-''',
-      [error(diag.mustBeASubtype, 103, 1)],
-    );
+''');
   }
 
   test_NativeCallable_listener_mustHaveTypeArgs() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'dart:ffi';
 int f(int i) => i * 2;
 void g() {
   NativeCallable.listener(f);
+//^^^^^^^^^^^^^^^^^^^^^^^
+// [diag.mustBeANativeFunctionType] The type 'Function' given to 'NativeCallable' must be a valid 'dart:ffi' native function type.
 }
-''',
-      [error(diag.mustBeANativeFunctionType, 55, 23)],
-    );
+''');
   }
 
   test_NativeCallable_listener_mustReturnVoid() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'dart:ffi';
 int f(int i) => i * 2;
 void g() {
   NativeCallable<Int32 Function(Int32)>.listener(f);
+//                                               ^
+// [diag.mustReturnVoid] The return type of the function passed to 'NativeCallable.listener' must be 'void' rather than 'Int32'.
 }
-''',
-      [error(diag.mustReturnVoid, 102, 1)],
-    );
+''');
   }
 
   test_NativeCallable_listener_ok() async {
-    await assertErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'dart:ffi';
 void f(int i) => i * 2;
 void g() {
   NativeCallable<Void Function(Int32)>.listener(f);
 }
-''', []);
+''');
   }
 
   test_NativeCallable_listener_voidReturnPermissive() async {
-    await assertErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'dart:ffi';
 int f(int i) => i * 2;
 void g() {
   NativeCallable<Void Function(Int32)>.listener(f);
 }
-''', []);
+''');
   }
 }
diff --git a/pkg/analyzer/test/src/diagnostics/ffi_leaf_call_must_not_use_handle_test.dart b/pkg/analyzer/test/src/diagnostics/ffi_leaf_call_must_not_use_handle_test.dart
index f15407f..eb8c789 100644
--- a/pkg/analyzer/test/src/diagnostics/ffi_leaf_call_must_not_use_handle_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/ffi_leaf_call_must_not_use_handle_test.dart
@@ -2,7 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/src/diagnostic/diagnostic.dart' as diag;
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../dart/resolution/context_collection_resolution.dart';
@@ -16,24 +15,22 @@
 @reflectiveTest
 class LeafCallMustNotUseHandle extends PubPackageResolutionTest {
   test_AsFunctionReturnsHandle() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'dart:ffi';
 typedef NativeReturnsHandle = Handle Function();
 typedef ReturnsHandle = Object Function();
 doThings() {
   Pointer<NativeFunction<NativeReturnsHandle>> p = Pointer.fromAddress(1337);
   ReturnsHandle f = p.asFunction(isLeaf:true);
+//                    ^^^^^^^^^^
+// [diag.leafCallMustNotReturnHandle] FFI leaf call can't return a 'Handle'.
   f();
 }
-''',
-      [error(diag.leafCallMustNotReturnHandle, 224, 10)],
-    );
+''');
   }
 
   test_AsFunctionTakesHandle() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'dart:ffi';
 typedef NativeTakesHandle = Void Function(Handle);
 typedef TakesHandle = void Function(Object);
@@ -41,16 +38,15 @@
 doThings() {
   Pointer<NativeFunction<NativeTakesHandle>> p = Pointer.fromAddress(1337);
   TakesHandle f = p.asFunction(isLeaf:true);
+//                  ^^^^^^^^^^
+// [diag.leafCallMustNotTakeHandle] FFI leaf call can't take arguments of type 'Handle'.
   f(MyClass());
 }
-''',
-      [error(diag.leafCallMustNotTakeHandle, 241, 10)],
-    );
+''');
   }
 
   test_class_getter() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'dart:ffi';
 
 base class NativeFieldWrapperClass1 {}
@@ -58,30 +54,28 @@
 base class A extends NativeFieldWrapperClass1 {
   @Native<Handle Function(Pointer<Void>)>(symbol: 'foo', isLeaf:true)
   external Object get foo;
+//                    ^^^
+// [diag.leafCallMustNotReturnHandle] FFI leaf call can't return a 'Handle'.
 }
-''',
-      [error(diag.leafCallMustNotReturnHandle, 200, 3)],
-    );
+''');
   }
 
   test_LookupFunctionReturnsHandle() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'dart:ffi';
 typedef NativeReturnsHandle = Handle Function();
 typedef ReturnsHandle = Object Function();
 doThings() {
   DynamicLibrary l = DynamicLibrary.open("my_lib");
   l.lookupFunction<NativeReturnsHandle, ReturnsHandle>("timesFour", isLeaf:true);
+//                 ^^^^^^^^^^^^^^^^^^^
+// [diag.leafCallMustNotReturnHandle] FFI leaf call can't return a 'Handle'.
 }
-''',
-      [error(diag.leafCallMustNotReturnHandle, 195, 19)],
-    );
+''');
   }
 
   test_LookupFunctionTakesHandle() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'dart:ffi';
 typedef NativeTakesHandle = Void Function(Handle);
 typedef TakesHandle = void Function(Object);
@@ -89,21 +83,20 @@
 doThings() {
   DynamicLibrary l = DynamicLibrary.open("my_lib");
   l.lookupFunction<NativeTakesHandle, TakesHandle>("timesFour", isLeaf:true);
+//                 ^^^^^^^^^^^^^^^^^
+// [diag.leafCallMustNotTakeHandle] FFI leaf call can't take arguments of type 'Handle'.
 }
-''',
-      [error(diag.leafCallMustNotTakeHandle, 216, 17)],
-    );
+''');
   }
 
   test_unit_getter() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'dart:ffi';
 
 @Native<Handle Function()>(symbol: 'foo', isLeaf:true)
 external Object get foo;
-''',
-      [error(diag.leafCallMustNotReturnHandle, 95, 3)],
-    );
+//                  ^^^
+// [diag.leafCallMustNotReturnHandle] FFI leaf call can't return a 'Handle'.
+''');
   }
 }
diff --git a/pkg/analyzer/test/src/diagnostics/ffi_native_test.dart b/pkg/analyzer/test/src/diagnostics/ffi_native_test.dart
index fa61dd7..f3b6b17 100644
--- a/pkg/analyzer/test/src/diagnostics/ffi_native_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/ffi_native_test.dart
@@ -2,7 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/src/diagnostic/diagnostic.dart' as diag;
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../dart/resolution/context_collection_resolution.dart';
@@ -20,33 +19,30 @@
 @reflectiveTest
 class AddressOfTest extends PubPackageResolutionTest {
   test_invalid_Lambda() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'dart:ffi';
 
 void main() => print(Native.addressOf(() => 3));
-''',
-      [error(diag.argumentMustBeNative, 58, 7)],
-    );
+//                                    ^^^^^^^
+// [diag.argumentMustBeNative] Argument to 'Native.addressOf' must be annotated with @Native
+''');
   }
 
   test_invalid_MismatchedInferredType() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'dart:ffi';
 
 @Native()
 external Pointer<IntPtr> global;
 
 void main() => print(Native.addressOf<Pointer<Double>>(global));
-''',
-      [error(diag.mustBeASubtype, 85, 41)],
-    );
+//                   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// [diag.mustBeASubtype] The type 'Pointer<IntPtr>' must be a subtype of 'Pointer<Double>' for 'Native.addressOf'.
+''');
   }
 
   test_invalid_MismatchingType() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'dart:ffi';
 
 @Native<Void Function()>()
@@ -54,15 +50,14 @@
 
 void main() {
   print(Native.addressOf<NativeFunction<Int8 Function()>>(foo));
+//      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// [diag.mustBeASubtype] The type 'Void Function()' must be a subtype of 'Int8 Function()' for 'Native.addressOf'.
 }
-''',
-      [error(diag.mustBeASubtype, 91, 54)],
-    );
+''');
   }
 
   test_invalid_MissingType() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'dart:ffi';
 
 @Native<Void Function()>()
@@ -70,24 +65,14 @@
 
 void main() {
   print(Native.addressOf(foo));
+//      ^^^^^^^^^^^^^^^^^^^^^
+// [diag.mustBeANativeFunctionType] The type 'NativeType' given to 'Native.addressOf' must be a valid 'dart:ffi' native function type.
 }
-''',
-      [
-        error(
-          diag.mustBeANativeFunctionType,
-          91,
-          21,
-          messageContains: [
-            "The type 'NativeType' given to 'Native.addressOf' must be",
-          ],
-        ),
-      ],
-    );
+''');
   }
 
   test_invalid_MissingType2() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'dart:ffi';
 
 @Native()
@@ -95,38 +80,27 @@
 
 void main() {
   print(Native.addressOf(foo));
+//      ^^^^^^^^^^^^^^^^^^^^^
+// [diag.mustBeANativeFunctionType] The type 'NativeType' given to 'Native.addressOf' must be a valid 'dart:ffi' native function type.
 }
-''',
-      [
-        error(
-          diag.mustBeANativeFunctionType,
-          74,
-          21,
-          messageContains: [
-            "The type 'NativeType' given to 'Native.addressOf' must be",
-          ],
-        ),
-      ],
-    );
+''');
   }
 
   test_invalid_MissingType3() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'dart:ffi';
 
 @Native()
 external Pointer<IntPtr> global;
 
 void main() => print(Native.addressOf(global));
-''',
-      [error(diag.mustBeASubtype, 85, 24)],
-    );
+//                   ^^^^^^^^^^^^^^^^^^^^^^^^
+// [diag.mustBeASubtype] The type 'Pointer<IntPtr>' must be a subtype of 'NativeType' for 'Native.addressOf'.
+''');
   }
 
   test_invalid_NotAConstant() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'dart:ffi';
 
 @Native<Void Function()>()
@@ -136,53 +110,50 @@
 
 void entry(bool condition) {
   print(Native.addressOf(condition ? foo : bar));
+//                       ^^^^^^^^^^^^^^^^^^^^^
+// [diag.argumentMustBeNative] Argument to 'Native.addressOf' must be annotated with @Native
 }
-''',
-      [error(diag.argumentMustBeNative, 171, 21)],
-    );
+''');
   }
 
   test_invalid_NotAPreciseType() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'dart:ffi';
 
 @Native<Void Function()>()
 external void foo();
 
 void main() => print(Native.addressOf<NativeFunction>(foo));
-''',
-      [error(diag.mustBeASubtype, 90, 37)],
-    );
+//                   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// [diag.mustBeASubtype] The type 'Void Function()' must be a subtype of 'Function' for 'Native.addressOf'.
+''');
   }
 
   test_invalid_NotAPreciseType2() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'dart:ffi';
 
 @Native()
 external void foo();
 
 void main() => print(Native.addressOf<NativeFunction>(foo));
-''',
-      [error(diag.mustBeASubtype, 73, 37)],
-    );
+//                   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// [diag.mustBeASubtype] The type 'Void Function()' must be a subtype of 'Function' for 'Native.addressOf'.
+''');
   }
 
   test_invalid_String() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'dart:ffi';
 
 void main() => print(Native.addressOf('malloc'));
-''',
-      [error(diag.argumentMustBeNative, 58, 8)],
-    );
+//                                    ^^^^^^^^
+// [diag.argumentMustBeNative] Argument to 'Native.addressOf' must be annotated with @Native
+''');
   }
 
   test_valid() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'dart:ffi';
 
 @Native<Void Function()>()
@@ -206,35 +177,31 @@
 @reflectiveTest
 class DefaultAssetTest extends PubPackageResolutionTest {
   test_invalid_duplicate() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 @DefaultAsset('foo')
 @DefaultAsset('bar')
+// [diag.ffiNativeInvalidDuplicateDefaultAsset][column 2][length 12] There may be at most one @DefaultAsset annotation on a library.
 library;
 
 import 'dart:ffi';
-''',
-      [error(diag.ffiNativeInvalidDuplicateDefaultAsset, 22, 12)],
-    );
+''');
   }
 
   test_invalid_duplicateFromConst() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 @DefaultAsset('bar')
 @defaults
+// [diag.ffiNativeInvalidDuplicateDefaultAsset][column 2][length 8] There may be at most one @DefaultAsset annotation on a library.
 library;
 
 import 'dart:ffi';
 
 const defaults = DefaultAsset('foo');
-''',
-      [error(diag.ffiNativeInvalidDuplicateDefaultAsset, 22, 8)],
-    );
+''');
   }
 
   test_valid() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 @DefaultAsset('bar')
 library;
 
@@ -246,7 +213,7 @@
   }
 
   test_validFromConst() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 @defaults
 library;
 
@@ -263,7 +230,7 @@
 @reflectiveTest
 class FfiNativeTest extends PubPackageResolutionTest {
   test_annotation_FfiNative_getters() async {
-    await assertErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'dart:ffi';
 
 base class NativeFieldWrapperClass1 {}
@@ -275,117 +242,100 @@
   @Native<Void Function(Pointer<Void>, Double)>(symbol: 'Paragraph::ideographicBaseline', isLeaf: true)
   external set ideographicBaseline(double d);
 }
-''', []);
+''');
   }
 
   test_annotation_FfiNative_noArguments() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'dart:ffi';
 
 @Native
+// [diag.noAnnotationConstructorArguments][column 1][length 7] Annotation creation must have arguments.
 external int foo();
-''',
-      [error(diag.noAnnotationConstructorArguments, 20, 7)],
-    );
+''');
   }
 
   test_annotation_FfiNative_noTypeArguments() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'dart:ffi';
 
 @Native()
 external int foo();
-''',
-      [error(diag.nativeFunctionMissingType, 43, 3)],
-    );
+//           ^^^
+// [diag.nativeFunctionMissingType] The native type of this function couldn't be inferred so it must be specified in the annotation.
+''');
   }
 
   test_FfiNativeCanUseHandles() async {
-    await assertErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'dart:ffi';
 @Native<Handle Function(Handle)>(symbol: 'DoesntMatter')
 external Object doesntMatter(Object);
-''', []);
+''');
   }
 
   test_FfiNativeCanUseLeaf() async {
-    await assertErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'dart:ffi';
 @Native<Int8 Function(Int64)>(symbol: 'DoesntMatter', isLeaf:true)
 external int doesntMatter(int x);
-''', []);
+''');
   }
 
   test_FfiNativeInstanceMethodsMustHaveReceiver() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'dart:ffi';
 class K {
   @Native<Void Function(Double)>(symbol: 'DoesntMatter')
   external void doesntMatter(double x);
+//              ^^^^^^^^^^^^
+// [diag.ffiNativeUnexpectedNumberOfParametersWithReceiver] Unexpected number of Native annotation parameters. Expected 2 but has 1. Native instance method annotation must have receiver as first argument.
 }
-''',
-      [error(diag.ffiNativeUnexpectedNumberOfParametersWithReceiver, 102, 12)],
-    );
+''');
   }
 
   test_FfiNativeLeafMustNotReturnHandle() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'dart:ffi';
 @Native<Handle Function()>(symbol: 'DoesntMatter', isLeaf:true)
 external Object doesntMatter();
-''',
-      [error(diag.leafCallMustNotReturnHandle, 99, 12)],
-    );
+//              ^^^^^^^^^^^^
+// [diag.leafCallMustNotReturnHandle] FFI leaf call can't return a 'Handle'.
+''');
   }
 
   test_FfiNativeLeafMustNotTakeHandles() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'dart:ffi';
 @Native<Void Function(Handle)>(symbol: 'DoesntMatter', isLeaf:true)
 external void doesntMatter(Object o);
-''',
-      [error(diag.leafCallMustNotTakeHandle, 101, 12)],
-    );
+//            ^^^^^^^^^^^^
+// [diag.leafCallMustNotTakeHandle] FFI leaf call can't take arguments of type 'Handle'.
+''');
   }
 
   test_FfiNativeNonFfiParameter() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'dart:ffi';
 @Native<IntPtr Function(int)>(symbol: 'doesntmatter')
 external int nonFfiParameter(int v);
-''',
-      [
-        error(
-          diag.mustBeANativeFunctionType,
-          86,
-          15,
-          messageContains: [
-            "The type 'IntPtr Function(int)' given to 'Native' must be",
-          ],
-        ),
-      ],
-    );
+//           ^^^^^^^^^^^^^^^
+// [diag.mustBeANativeFunctionType] The type 'IntPtr Function(int)' given to 'Native' must be a valid 'dart:ffi' native function type.
+''');
   }
 
   test_FfiNativeNonFfiReturnType() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'dart:ffi';
 @Native<double Function(IntPtr)>(symbol: 'doesntmatter')
 external double nonFfiReturnType(int v);
-''',
-      [error(diag.mustBeANativeFunctionType, 92, 16)],
-    );
+//              ^^^^^^^^^^^^^^^^
+// [diag.mustBeANativeFunctionType] The type 'double Function(IntPtr)' given to 'Native' must be a valid 'dart:ffi' native function type.
+''');
   }
 
   test_FfiNativeOnExtension_valid() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'dart:ffi';
 
 extension on int {
@@ -400,71 +350,67 @@
   }
 
   test_FfiNativeOnExtension_wrongNumberOfParameters() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'dart:ffi';
 
 extension on int {
   @Native<Bool Function(Int64)>(symbol: 'x')
   external bool f(int m);
+//              ^
+// [diag.ffiNativeUnexpectedNumberOfParameters] Unexpected number of Native annotation parameters. Expected 2 but has 1.
 }
 
 void g() {
   0.f(0);
 }
-''',
-      [error(diag.ffiNativeUnexpectedNumberOfParameters, 100, 1)],
-    );
+''');
   }
 
   test_FfiNativeOnExtension_wrongReceiverType() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'dart:ffi';
 
 extension on double {
   @Native<Bool Function(Int64, Int64)>(symbol: 'Dart_PostInteger')
   external bool postInteger(int message);
+//              ^^^^^^^^^^^
+// [diag.mustBeASubtype] The type 'Bool Function(Int64, Int64)' must be a subtype of 'bool Function(double, int)' for 'Native'.
 }
 
 void f() {
   0.0.postInteger(0);
 }
-''',
-      [error(diag.mustBeASubtype, 125, 11)],
-    );
+''');
   }
 
   test_FfiNativeOnExtensionType_wrongReceiverType() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'dart:ffi';
 
 extension type NativeSendPort(int id) {
   @Native<Bool Function(Int64, Int64)>(symbol: 'Dart_PostInteger')
   external bool postInteger(int message);
+//              ^^^^^^^^^^^
+// [diag.mustBeASubtype] The type 'Bool Function(Int64, Int64)' must be a subtype of 'bool Function(NativeSendPort, int)' for 'Native'.
 }
-''',
-      [error(diag.mustBeASubtype, 143, 11)],
-    );
+''');
   }
 
   test_FfiNativeOnExtensionType_wrongRepresentationType() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'dart:ffi';
 
 extension type InvalidNativeSendPort._(double id) {
   @Native<Bool Function(Int64, Int64)>(symbol: 'Dart_PostInteger')
   external bool postInteger(int message);
+//              ^^^^^^^^^^^
+// [diag.mustBeASubtype] The type 'Bool Function(Int64, Int64)' must be a subtype of 'bool Function(InvalidNativeSendPort, int)' for 'Native'.
 }
-''',
-      [error(diag.mustBeASubtype, 155, 11)],
-    );
+''');
   }
 
   test_FfiNativePointerParameter() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'dart:ffi';
 @Native<Void Function(Pointer)>(symbol: 'free')
 external void posixFree(Pointer pointer);
@@ -472,65 +418,60 @@
   }
 
   test_FfiNativeTooFewParameters() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'dart:ffi';
 @Native<Void Function(Double)>(symbol: 'DoesntMatter')
 external void doesntMatter(double x, double y);
-''',
-      [error(diag.ffiNativeUnexpectedNumberOfParameters, 88, 12)],
-    );
+//            ^^^^^^^^^^^^
+// [diag.ffiNativeUnexpectedNumberOfParameters] Unexpected number of Native annotation parameters. Expected 1 but has 2.
+''');
   }
 
   test_FfiNativeTooManyParameters() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'dart:ffi';
 @Native<Void Function(Double, Double)>(symbol: 'DoesntMatter')
 external void doesntMatter(double x);
-''',
-      [error(diag.ffiNativeUnexpectedNumberOfParameters, 96, 12)],
-    );
+//            ^^^^^^^^^^^^
+// [diag.ffiNativeUnexpectedNumberOfParameters] Unexpected number of Native annotation parameters. Expected 2 but has 1.
+''');
   }
 
   test_FfiNativeVoidReturn() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'dart:ffi';
 @Native<Handle Function(Uint32, Uint32, Handle)>(symbol: 'doesntmatter')
 external void voidReturn(int width, int height, Object outImage);
-''',
-      [error(diag.mustBeASubtype, 106, 10)],
-    );
+//            ^^^^^^^^^^
+// [diag.mustBeASubtype] The type 'Handle Function(Uint32, Uint32, Handle)' must be a subtype of 'void Function(int, int, Object)' for 'Native'.
+''');
   }
 
   test_FfiNativeWrongFfiParameter() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'dart:ffi';
 @Native<IntPtr Function(Double)>(symbol: 'doesntmatter')
 external int wrongFfiParameter(int v);
-''',
-      [error(diag.mustBeASubtype, 89, 17)],
-    );
+//           ^^^^^^^^^^^^^^^^^
+// [diag.mustBeASubtype] The type 'IntPtr Function(Double)' must be a subtype of 'int Function(int)' for 'Native'.
+''');
   }
 
   test_FfiNativeWrongFfiReturnType() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'dart:ffi';
 @Native<IntPtr Function(IntPtr)>(symbol: 'doesntmatter')
 external double wrongFfiReturnType(int v);
-''',
-      [error(diag.mustBeASubtype, 92, 18)],
-    );
+//              ^^^^^^^^^^^^^^^^^^
+// [diag.mustBeASubtype] The type 'IntPtr Function(IntPtr)' must be a subtype of 'double Function(int)' for 'Native'.
+''');
   }
 }
 
 @reflectiveTest
 class NativeFieldTest extends PubPackageResolutionTest {
   test_AbiSpecific() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'dart:ffi';
 
 @Native<Int>()
@@ -539,7 +480,7 @@
   }
 
   test_Accessors() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'dart:ffi';
 
 @Native<IntPtr>()
@@ -551,45 +492,41 @@
   }
 
   test_Array_InvalidDimension() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'dart:ffi';
 
 @Native()
 @Array(0)
+//     ^
+// [diag.nonPositiveArrayDimension] Array dimensions must be positive numbers.
 external Array<IntPtr> field;
-''',
-      [error(diag.nonPositiveArrayDimension, 37, 1)],
-    );
+''');
   }
 
   test_Array_InvalidDimensionCount() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'dart:ffi';
 
 @Native()
 @Array(10, 20)
+// [diag.sizeAnnotationDimensions][column 1][length 14] 'Array's must have an 'Array' annotation that matches the dimensions.
 external Array<IntPtr> field;
-''',
-      [error(diag.sizeAnnotationDimensions, 30, 14)],
-    );
+''');
   }
 
   test_Array_MissingAnnotation() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'dart:ffi';
 
 @Native()
 external Array<IntPtr> field;
-''',
-      [error(diag.missingSizeAnnotationCarray, 53, 5)],
-    );
+//                     ^^^^^
+// [diag.missingSizeAnnotationCarray] Fields of type 'Array' must have exactly one 'Array' annotation.
+''');
   }
 
   test_Array_Valid() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'dart:ffi';
 
 @Native()
@@ -599,12 +536,11 @@
 @Array(10, 20)
 @Native()
 external Array<Array<IntPtr>> field1;
-
 ''');
   }
 
   test_Infer() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'dart:ffi';
 
 final class MyStruct extends Struct {
@@ -620,158 +556,138 @@
   }
 
   test_InvalidFunctionType() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'dart:ffi';
 @Native<IntPtr Function(IntPtr)>()
 external int field;
-''',
-      [error(diag.nativeFieldInvalidType, 67, 5)],
-    );
+//           ^^^^^
+// [diag.nativeFieldInvalidType] 'IntPtr Function(IntPtr)' is an unsupported type for native fields. Native fields only support pointers, arrays or numeric and compound types.
+''');
   }
 
   test_InvalidInstanceMember() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'dart:ffi';
 
 class Foo {
   @Native<IntPtr>()
   external int field;
+//             ^^^^^
+// [diag.nativeFieldNotStatic] Native fields must be static.
 }
-''',
-      [error(diag.nativeFieldNotStatic, 67, 5)],
-    );
+''');
   }
 
   test_InvalidNotExternal() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'dart:ffi';
 
 @Native<IntPtr>()
 int field;
-''',
-      [
-        error(diag.notInitializedNonNullableVariable, 42, 5),
-        error(diag.ffiNativeMustBeExternal, 42, 5),
-      ],
-    );
+//  ^^^^^
+// [diag.notInitializedNonNullableVariable] The non-nullable variable 'field' must be initialized.
+// [diag.ffiNativeMustBeExternal] Native functions must be declared external.
+''');
   }
 
   test_MismatchingFunctionType() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'dart:ffi';
 
 @Native<NativeFunction<Double Function()>>()
 external int Function() field;
-''',
-      [error(diag.mustBeASubtype, 89, 5)],
-    );
+//                      ^^^^^
+// [diag.mustBeASubtype] The type 'int Function()' must be a subtype of 'NativeFunction<Double Function()>' for 'Native'.
+''');
   }
 
   test_MismatchingType() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'dart:ffi';
 
 @Native<Double>()
 external int field;
-''',
-      [error(diag.mustBeASubtype, 51, 5)],
-    );
+//           ^^^^^
+// [diag.mustBeASubtype] The type 'int' must be a subtype of 'Double' for 'Native'.
+''');
   }
 
   test_MissingType() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'dart:ffi';
 
 @Native()
 external int invalid;
+//           ^^^^^^^
+// [diag.nativeFieldMissingType] The native type of this field could not be inferred and must be specified in the annotation.
 
 @Native()
 external Pointer<IntPtr> valid;
-''',
-      [error(diag.nativeFieldMissingType, 43, 7)],
-    );
+''');
   }
 
   test_Unsupported_Function() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'dart:ffi';
 
 @Native<NativeFunction<Void Function()>>()
 external void Function() field;
-''',
-      [error(diag.nativeFieldInvalidType, 88, 5)],
-    );
+//                       ^^^^^
+// [diag.nativeFieldInvalidType] 'NativeFunction<Void Function()>' is an unsupported type for native fields. Native fields only support pointers, arrays or numeric and compound types.
+''');
   }
 
   test_Unsupported_Handle() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'dart:ffi';
 
 @Native<Handle>()
 external Object field;
-''',
-      [error(diag.nativeFieldInvalidType, 54, 5)],
-    );
+//              ^^^^^
+// [diag.nativeFieldInvalidType] 'Handle' is an unsupported type for native fields. Native fields only support pointers, arrays or numeric and compound types.
+''');
   }
 }
 
 @reflectiveTest
 class NativeTest extends PubPackageResolutionTest {
   test_annotation_InvalidFieldType() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'dart:ffi';
 
 @Native<IntPtr>()
 external int foo();
-''',
-      [
-        error(
-          diag.mustBeANativeFunctionType,
-          51,
-          3,
-          messageContains: ["The type 'IntPtr' given to 'Native' must be"],
-        ),
-      ],
-    );
+//           ^^^
+// [diag.mustBeANativeFunctionType] The type 'IntPtr' given to 'Native' must be a valid 'dart:ffi' native function type.
+''');
   }
 
   test_annotation_MissingType() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'dart:ffi';
 
 @Native()
 external int foo();
-''',
-      [error(diag.nativeFunctionMissingType, 43, 3)],
-    );
+//           ^^^
+// [diag.nativeFunctionMissingType] The native type of this function couldn't be inferred so it must be specified in the annotation.
+''');
   }
 
   test_annotation_MissingTypeConst() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'dart:ffi';
 
 const a = Native();
 
 @a
 external int foo();
-''',
-      [error(diag.nativeFunctionMissingType, 57, 3)],
-    );
+//           ^^^
+// [diag.nativeFunctionMissingType] The native type of this function couldn't be inferred so it must be specified in the annotation.
+''');
   }
 
   test_annotation_Native_getters() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'dart:ffi';
 
 base class NativeFieldWrapperClass1 {}
@@ -787,19 +703,17 @@
   }
 
   test_annotation_Native_noArguments() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'dart:ffi';
 
 @Native
+// [diag.noAnnotationConstructorArguments][column 1][length 7] Annotation creation must have arguments.
 external int foo();
-''',
-      [error(diag.noAnnotationConstructorArguments, 20, 7)],
-    );
+''');
   }
 
   test_InferPointerReturnNoParameters() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'dart:ffi';
 
 @Native()
@@ -808,7 +722,7 @@
   }
 
   test_InferPointerReturnPointerParameter() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'dart:ffi';
 
 @Native()
@@ -817,7 +731,7 @@
   }
 
   test_InferPointerReturnStructParameter() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'dart:ffi';
 
 @Native()
@@ -831,7 +745,7 @@
   }
 
   test_InferPointerReturnUnionParameter() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'dart:ffi';
 
 @Native()
@@ -847,7 +761,7 @@
   }
 
   test_InferStructReturnNoParameters() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'dart:ffi';
 
 @Native()
@@ -861,7 +775,7 @@
   }
 
   test_InferStructReturnPointerParameter() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'dart:ffi';
 
 @Native()
@@ -875,7 +789,7 @@
   }
 
   test_InferStructReturnStructParameter() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'dart:ffi';
 
 @Native()
@@ -889,7 +803,7 @@
   }
 
   test_InferStructReturnUnionParameter() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'dart:ffi';
 
 @Native()
@@ -910,7 +824,7 @@
   }
 
   test_InferUnionReturnNoParameters() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'dart:ffi';
 
 @Native()
@@ -926,7 +840,7 @@
   }
 
   test_InferUnionReturnPointerParameter() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'dart:ffi';
 
 @Native()
@@ -942,7 +856,7 @@
   }
 
   test_InferUnionReturnStructParameter() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'dart:ffi';
 
 @Native()
@@ -963,7 +877,7 @@
   }
 
   test_InferUnionReturnUnionParameter() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'dart:ffi';
 
 @Native()
@@ -979,7 +893,7 @@
   }
 
   test_InferVoidReturnNoParameters() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'dart:ffi';
 
 @Native()
@@ -988,7 +902,7 @@
   }
 
   test_InferVoidReturnPointerParameter() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'dart:ffi';
 
 @Native()
@@ -997,7 +911,7 @@
   }
 
   test_InferVoidReturnStructParameter() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'dart:ffi';
 
 @Native()
@@ -1011,7 +925,7 @@
   }
 
   test_InferVoidReturnUnionParameter() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'dart:ffi';
 
 @Native()
@@ -1027,50 +941,46 @@
   }
 
   test_NativeCanUseHandles() async {
-    await assertErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'dart:ffi';
 @Native<Handle Function(Handle)>()
 external Object doesntMatter(Object);
-''', []);
+''');
   }
 
   test_NativeCanUseLeaf() async {
-    await assertErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'dart:ffi';
 @Native<Int8 Function(Int64)>(isLeaf:true)
 external int doesntMatter(int x);
-''', []);
+''');
   }
 
   test_NativeDuplicateAnnotation() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'dart:ffi';
 @Native<Int32 Function(Int32)>()
 @Native<Int32 Function(Int32)>(isLeaf: true)
+// [diag.ffiNativeInvalidMultipleAnnotations][column 2][length 6] Native functions and fields must have exactly one `@Native` annotation.
 external int foo(int v);
-''',
-      [error(diag.ffiNativeInvalidMultipleAnnotations, 53, 6)],
-    );
+''');
   }
 
   test_NativeDuplicateAnnotationConst() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'dart:ffi';
 
 const duplicate = Native<Int32 Function(Int32)>(isLeaf: true);
 
 @Native<Int32 Function(Int32)>()
 @duplicate
+// [diag.ffiNativeInvalidMultipleAnnotations][column 2][length 9] Native functions and fields must have exactly one `@Native` annotation.
 external int foo(int v);
-''',
-      [error(diag.ffiNativeInvalidMultipleAnnotations, 118, 9)],
-    );
+''');
   }
 
   test_NativeFromConst() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'dart:ffi';
 
 const annotation = Native<Int32 Function(Int32)>();
@@ -1081,90 +991,83 @@
   }
 
   test_NativeInstanceMethodsMustHaveReceiver() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'dart:ffi';
 class K {
   @Native<Void Function(Double)>()
   external void doesntMatter(double x);
+//              ^^^^^^^^^^^^
+// [diag.ffiNativeUnexpectedNumberOfParametersWithReceiver] Unexpected number of Native annotation parameters. Expected 2 but has 1. Native instance method annotation must have receiver as first argument.
 }
-''',
-      [error(diag.ffiNativeUnexpectedNumberOfParametersWithReceiver, 80, 12)],
-    );
+''');
   }
 
   test_NativeLeafMustNotReturnHandle() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'dart:ffi';
 @Native<Handle Function()>(isLeaf:true)
 external Object doesntMatter();
-''',
-      [error(diag.leafCallMustNotReturnHandle, 75, 12)],
-    );
+//              ^^^^^^^^^^^^
+// [diag.leafCallMustNotReturnHandle] FFI leaf call can't return a 'Handle'.
+''');
   }
 
   test_NativeLeafMustNotReturnHandleConst() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'dart:ffi';
 const annotation = Native<Handle Function()>(isLeaf:true);
 
 @annotation
 external Object doesntMatter();
-''',
-      [error(diag.leafCallMustNotReturnHandle, 107, 12)],
-    );
+//              ^^^^^^^^^^^^
+// [diag.leafCallMustNotReturnHandle] FFI leaf call can't return a 'Handle'.
+''');
   }
 
   test_NativeLeafMustNotTakeHandles() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'dart:ffi';
 @Native<Void Function(Handle)>(symbol: 'DoesntMatter', isLeaf:true)
 external void doesntMatter(Object o);
-''',
-      [error(diag.leafCallMustNotTakeHandle, 101, 12)],
-    );
+//            ^^^^^^^^^^^^
+// [diag.leafCallMustNotTakeHandle] FFI leaf call can't take arguments of type 'Handle'.
+''');
   }
 
   test_NativeLeafMustNotTakeHandlesConst() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'dart:ffi';
 const annotation = Native<Void Function(Handle)>(symbol: 'DoesntMatter', isLeaf:true);
 
 @annotation
 external void doesntMatter(Object o);
-''',
-      [error(diag.leafCallMustNotTakeHandle, 133, 12)],
-    );
+//            ^^^^^^^^^^^^
+// [diag.leafCallMustNotTakeHandle] FFI leaf call can't take arguments of type 'Handle'.
+''');
   }
 
   test_NativeNonFfiParameter() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'dart:ffi';
 @Native<IntPtr Function(int)>()
 external int nonFfiParameter(int v);
-''',
-      [error(diag.mustBeANativeFunctionType, 64, 15)],
-    );
+//           ^^^^^^^^^^^^^^^
+// [diag.mustBeANativeFunctionType] The type 'IntPtr Function(int)' given to 'Native' must be a valid 'dart:ffi' native function type.
+''');
   }
 
   test_NativeNonFfiReturnType() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'dart:ffi';
 @Native<double Function(IntPtr)>()
 external double nonFfiReturnType(int v);
-''',
-      [error(diag.mustBeANativeFunctionType, 70, 16)],
-    );
+//              ^^^^^^^^^^^^^^^^
+// [diag.mustBeANativeFunctionType] The type 'double Function(IntPtr)' given to 'Native' must be a valid 'dart:ffi' native function type.
+''');
   }
 
   test_NativePointerParameter() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'dart:ffi';
 @Native<Void Function(Pointer)>()
 external void free(Pointer pointer);
@@ -1172,29 +1075,27 @@
   }
 
   test_NativeTooFewParameters() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'dart:ffi';
 @Native<Void Function(Double)>()
 external void doesntMatter(double x, double y);
-''',
-      [error(diag.ffiNativeUnexpectedNumberOfParameters, 66, 12)],
-    );
+//            ^^^^^^^^^^^^
+// [diag.ffiNativeUnexpectedNumberOfParameters] Unexpected number of Native annotation parameters. Expected 1 but has 2.
+''');
   }
 
   test_NativeTooManyParameters() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'dart:ffi';
 @Native<Void Function(Double, Double)>()
 external void doesntMatter(double x);
-''',
-      [error(diag.ffiNativeUnexpectedNumberOfParameters, 74, 12)],
-    );
+//            ^^^^^^^^^^^^
+// [diag.ffiNativeUnexpectedNumberOfParameters] Unexpected number of Native annotation parameters. Expected 2 but has 1.
+''');
   }
 
   test_NativeVarArgs() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'dart:ffi';
 @Native<Int8 Function(Int64, VarArgs<(Int32, Double)>)>()
 external int doesntMatter(int x, int y, double z);
@@ -1202,57 +1103,52 @@
   }
 
   test_NativeVarArgsTooFew() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'dart:ffi';
 @Native<Int8 Function(Int64, VarArgs<(Int32, Double)>)>()
 external int doesntMatter(int x, int y);
-''',
-      [error(diag.ffiNativeUnexpectedNumberOfParameters, 90, 12)],
-    );
+//           ^^^^^^^^^^^^
+// [diag.ffiNativeUnexpectedNumberOfParameters] Unexpected number of Native annotation parameters. Expected 3 but has 2.
+''');
   }
 
   test_NativeVarArgsTooMany() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'dart:ffi';
 @Native<Int8 Function(Int64, VarArgs<(Int32, Double)>)>()
 external int doesntMatter(int x, int y, double z, int superfluous);
-''',
-      [error(diag.ffiNativeUnexpectedNumberOfParameters, 90, 12)],
-    );
+//           ^^^^^^^^^^^^
+// [diag.ffiNativeUnexpectedNumberOfParameters] Unexpected number of Native annotation parameters. Expected 3 but has 4.
+''');
   }
 
   test_NativeVoidReturn() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'dart:ffi';
 @Native<Handle Function(Uint32, Uint32, Handle)>()
 external void voidReturn(int width, int height, Object outImage);
-''',
-      [error(diag.mustBeASubtype, 84, 10)],
-    );
+//            ^^^^^^^^^^
+// [diag.mustBeASubtype] The type 'Handle Function(Uint32, Uint32, Handle)' must be a subtype of 'void Function(int, int, Object)' for 'Native'.
+''');
   }
 
   test_NativeWrongFfiParameter() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'dart:ffi';
 @Native<IntPtr Function(Double)>()
 external int wrongFfiParameter(int v);
-''',
-      [error(diag.mustBeASubtype, 67, 17)],
-    );
+//           ^^^^^^^^^^^^^^^^^
+// [diag.mustBeASubtype] The type 'IntPtr Function(Double)' must be a subtype of 'int Function(int)' for 'Native'.
+''');
   }
 
   test_NativeWrongFfiReturnType() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'dart:ffi';
 @Native<IntPtr Function(IntPtr)>()
 external double wrongFfiReturnType(int v);
-''',
-      [error(diag.mustBeASubtype, 70, 18)],
-    );
+//              ^^^^^^^^^^^^^^^^^^
+// [diag.mustBeASubtype] The type 'IntPtr Function(IntPtr)' must be a subtype of 'double Function(int)' for 'Native'.
+''');
   }
 }
diff --git a/pkg/analyzer/test/src/diagnostics/field_initializer_factory_constructor_test.dart b/pkg/analyzer/test/src/diagnostics/field_initializer_factory_constructor_test.dart
index 207a447..948f556 100644
--- a/pkg/analyzer/test/src/diagnostics/field_initializer_factory_constructor_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/field_initializer_factory_constructor_test.dart
@@ -2,7 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/src/diagnostic/diagnostic.dart' as diag;
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../dart/resolution/context_collection_resolution.dart';
@@ -16,49 +15,45 @@
 @reflectiveTest
 class FieldInitializerFactoryConstructorTest extends PubPackageResolutionTest {
   test_class_fieldFormalParameter() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   int x = 0;
   factory A(this.x) => throw 0;
+//          ^^^^^^
+// [diag.fieldInitializerFactoryConstructor] Initializing formal parameters can't be used in factory constructors.
 }
-''',
-      [error(diag.fieldInitializerFactoryConstructor, 35, 6)],
-    );
+''');
   }
 
   test_class_fieldFormalParameter_functionTyped() async {
-    await assertErrorsInCode(
-      r'''
+    // TODO(srawlins): Only report one error. Theoretically change Fasta to
+    // report "Field initializer in factory constructor" as a parse error.
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   int Function()? x;
   factory A(int this.x());
+//          ^^^^^^^^^^^^
+// [diag.fieldInitializerFactoryConstructor] Initializing formal parameters can't be used in factory constructors.
+//                       ^
+// [diag.missingFunctionBody] A function body must be provided.
 }
-''',
-      [
-        // TODO(srawlins): Only report one error. Theoretically change Fasta to
-        // report "Field initializer in factory constructor" as a parse error.
-        error(diag.fieldInitializerFactoryConstructor, 43, 12),
-        error(diag.missingFunctionBody, 56, 1),
-      ],
-    );
+''');
   }
 
   test_enum_fieldFormalParameter() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 enum E {
   v;
   final int x = 0;
   const E();
   factory E._(this.x) => throw 0;
+//            ^^^^^^
+// [diag.fieldInitializerFactoryConstructor] Initializing formal parameters can't be used in factory constructors.
 }
 
 void f() {
   E._(0);
 }
-''',
-      [error(diag.fieldInitializerFactoryConstructor, 60, 6)],
-    );
+''');
   }
 }
diff --git a/pkg/analyzer/test/src/diagnostics/field_initializer_not_assignable_test.dart b/pkg/analyzer/test/src/diagnostics/field_initializer_not_assignable_test.dart
index 102fdd3..01d262e 100644
--- a/pkg/analyzer/test/src/diagnostics/field_initializer_not_assignable_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/field_initializer_not_assignable_test.dart
@@ -17,7 +17,7 @@
 @reflectiveTest
 class FieldInitializerNotAssignableTest extends PubPackageResolutionTest {
   test_class_implicitCallReference() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 class C {
   void call(int p) {}
 }
@@ -29,7 +29,7 @@
   }
 
   test_class_implicitCallReference_genericFunctionInstantiation() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 class C {
   void call<T>(T p) {}
 }
@@ -41,15 +41,14 @@
   }
 
   test_class_unrelated() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   int x;
   A() : x = '';
+//          ^^
+// [diag.fieldInitializerNotAssignable] The initializer type 'String' can't be assigned to the field type 'int'.
 }
-''',
-      [error(diag.fieldInitializerNotAssignable, 31, 2)],
-    );
+''');
   }
 }
 
diff --git a/pkg/analyzer/test/src/diagnostics/field_initializer_outside_constructor_test.dart b/pkg/analyzer/test/src/diagnostics/field_initializer_outside_constructor_test.dart
index 7fd9991..ac92335 100644
--- a/pkg/analyzer/test/src/diagnostics/field_initializer_outside_constructor_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/field_initializer_outside_constructor_test.dart
@@ -2,7 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/src/diagnostic/diagnostic.dart' as diag;
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../dart/resolution/context_collection_resolution.dart';
@@ -16,120 +15,110 @@
 @reflectiveTest
 class FieldInitializerOutsideConstructorTest extends PubPackageResolutionTest {
   test_closure() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   dynamic field = ({this.field}) {};
+//                  ^^^^
+// [diag.fieldInitializerOutsideConstructor] Field formal parameters can only be used in a constructor.
 }
-''',
-      [error(diag.fieldInitializerOutsideConstructor, 30, 4)],
-    );
+''');
   }
 
   test_defaultParameter() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   int x = 0;
   m([this.x = 0]) {}
+//   ^^^^
+// [diag.fieldInitializerOutsideConstructor] Field formal parameters can only be used in a constructor.
 }
-''',
-      [error(diag.fieldInitializerOutsideConstructor, 28, 4)],
-    );
+''');
   }
 
   test_functionTypedFieldFormalParameter() async {
     // TODO(srawlins): Fix the duplicate error messages.
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   int Function()? x;
   m(int this.x()) {}
+//      ^^^^
+// [diag.fieldInitializerOutsideConstructor] Field formal parameters can only be used in a constructor.
 }
-''',
-      [error(diag.fieldInitializerOutsideConstructor, 39, 4)],
-    );
+''');
   }
 
   test_inFunctionTypedParameter() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   int? x;
   A(int p(this.x));
+//        ^^^^
+// [diag.fieldInitializerOutsideConstructor] Field formal parameters can only be used in a constructor.
 }
-''',
-      [error(diag.fieldInitializerOutsideConstructor, 30, 4)],
-    );
+''');
   }
 
   test_localFunction_optionalNamed() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 void f() {
   void foo({this.x}) {}
+//          ^^^^
+// [diag.fieldInitializerOutsideConstructor] Field formal parameters can only be used in a constructor.
   foo(x: 0);
 }
-''',
-      [error(diag.fieldInitializerOutsideConstructor, 23, 4)],
-    );
+''');
   }
 
   test_localFunction_optionalPositional() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 void f() {
   void foo([this.x]) {}
+//          ^^^^
+// [diag.fieldInitializerOutsideConstructor] Field formal parameters can only be used in a constructor.
   foo(0);
 }
-''',
-      [error(diag.fieldInitializerOutsideConstructor, 23, 4)],
-    );
+''');
   }
 
   test_localFunction_requiredNamed() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 void f() {
   void foo({required this.x}) {}
+//                   ^^^^
+// [diag.fieldInitializerOutsideConstructor] Field formal parameters can only be used in a constructor.
   foo(x: 0);
 }
-''',
-      [error(diag.fieldInitializerOutsideConstructor, 32, 4)],
-    );
+''');
   }
 
   test_localFunction_requiredPositional() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 void f() {
   void foo(this.x) {}
+//         ^^^^
+// [diag.fieldInitializerOutsideConstructor] Field formal parameters can only be used in a constructor.
   foo(0);
 }
-''',
-      [error(diag.fieldInitializerOutsideConstructor, 22, 4)],
-    );
+''');
   }
 
   test_method() async {
     // TODO(brianwilkerson): Fix the duplicate error messages.
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   int? x;
   m(this.x) {}
+//  ^^^^
+// [diag.fieldInitializerOutsideConstructor] Field formal parameters can only be used in a constructor.
 }
-''',
-      [error(diag.fieldInitializerOutsideConstructor, 24, 4)],
-    );
+''');
   }
 
   test_topLevelFunction() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 f(this.x(y)) {}
-''',
-      [error(diag.fieldInitializerOutsideConstructor, 2, 4)],
-    );
+//^^^^
+// [diag.fieldInitializerOutsideConstructor] Field formal parameters can only be used in a constructor.
+''');
   }
 }
diff --git a/pkg/analyzer/test/src/diagnostics/field_initializer_redirecting_constructor_test.dart b/pkg/analyzer/test/src/diagnostics/field_initializer_redirecting_constructor_test.dart
index 5095733..945eeba 100644
--- a/pkg/analyzer/test/src/diagnostics/field_initializer_redirecting_constructor_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/field_initializer_redirecting_constructor_test.dart
@@ -2,7 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/src/diagnostic/diagnostic.dart' as diag;
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../dart/resolution/context_collection_resolution.dart';
@@ -17,143 +16,131 @@
 class FieldInitializerRedirectingConstructorTest
     extends PubPackageResolutionTest {
   test_class_primary_afterRedirection() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A() {
   int x;
   A.named() : this();
   this : this.named(), x = 0;
+//       ^^^^
+// [diag.primaryConstructorCannotRedirect] A primary constructor can't be a redirecting constructor.
 }
-''',
-      [error(diag.primaryConstructorCannotRedirect, 52, 4)],
-    );
+''');
   }
 
   test_class_primary_beforeRedirection() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A() {
   int x;
   A.named() : this();
   this : x = 0, this.named();
+//              ^^^^
+// [diag.primaryConstructorCannotRedirect] A primary constructor can't be a redirecting constructor.
 }
-''',
-      [error(diag.primaryConstructorCannotRedirect, 59, 4)],
-    );
+''');
   }
 
   test_class_typeName_afterRedirection() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   int x = 0;
   A.named() {}
   A() : this.named(), x = 42;
+//                    ^^^^^^
+// [diag.fieldInitializerRedirectingConstructor] The redirecting constructor can't have a field initializer.
 }
-''',
-      [error(diag.fieldInitializerRedirectingConstructor, 60, 6)],
-    );
+''');
   }
 
   test_class_typeName_beforeRedirection() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   int x = 0;
   A.named() {}
   A() : x = 42, this.named();
+//      ^^^^^^
+// [diag.fieldInitializerRedirectingConstructor] The redirecting constructor can't have a field initializer.
 }
-''',
-      [error(diag.fieldInitializerRedirectingConstructor, 46, 6)],
-    );
+''');
   }
 
   test_class_typeName_redirectionOnly() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   int x = 0;
   A.named() {}
   A(this.x) : this.named();
+//  ^^^^^^
+// [diag.fieldInitializerRedirectingConstructor] The redirecting constructor can't have a field initializer.
 }
-''',
-      [error(diag.fieldInitializerRedirectingConstructor, 42, 6)],
-    );
+''');
   }
 
   test_enum_primary_afterRedirection() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 enum E() {
   v;
   final int x;
   const E.named() : this();
+//      ^^^^^^^
+// [diag.recursiveConstantConstructor] The constant constructor depends on itself.
   this : this.named(), x = 0;
+//       ^^^^
+// [diag.primaryConstructorCannotRedirect] A primary constructor can't be a redirecting constructor.
 }
-''',
-      [
-        error(diag.recursiveConstantConstructor, 39, 7),
-        error(diag.primaryConstructorCannotRedirect, 68, 4),
-      ],
-    );
+''');
   }
 
   test_enum_primary_beforeRedirection() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 enum E() {
   v;
   final int x;
   const E.named() : this();
+//      ^^^^^^^
+// [diag.recursiveConstantConstructor] The constant constructor depends on itself.
   this : x = 0, this.named();
+//              ^^^^
+// [diag.primaryConstructorCannotRedirect] A primary constructor can't be a redirecting constructor.
 }
-''',
-      [
-        error(diag.recursiveConstantConstructor, 39, 7),
-        error(diag.primaryConstructorCannotRedirect, 75, 4),
-      ],
-    );
+''');
   }
 
   test_enum_typeName_afterRedirection() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 enum E {
   v;
   final int x;
   const E.named() : x = 0;
   const E() : this.named(), x = 42;
+//                          ^^^^^^
+// [diag.fieldInitializerRedirectingConstructor] The redirecting constructor can't have a field initializer.
 }
-''',
-      [error(diag.fieldInitializerRedirectingConstructor, 84, 6)],
-    );
+''');
   }
 
   test_enum_typeName_beforeRedirection() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 enum E {
   v;
   final int x;
   const E.named() : x = 0;
   const E() : x = 42, this.named();
+//            ^^^^^^
+// [diag.fieldInitializerRedirectingConstructor] The redirecting constructor can't have a field initializer.
 }
-''',
-      [error(diag.fieldInitializerRedirectingConstructor, 70, 6)],
-    );
+''');
   }
 
   test_enum_typeName_redirectionOnly() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 enum E {
   v(0);
   final int x;
   const E.named() : x = 0;
   const E(this.x) : this.named();
+//        ^^^^^^
+// [diag.fieldInitializerRedirectingConstructor] The redirecting constructor can't have a field initializer.
 }
-''',
-      [error(diag.fieldInitializerRedirectingConstructor, 69, 6)],
-    );
+''');
   }
 }
diff --git a/pkg/analyzer/test/src/diagnostics/field_initializing_formal_not_assignable_test.dart b/pkg/analyzer/test/src/diagnostics/field_initializing_formal_not_assignable_test.dart
index b41b6db..6dd4280 100644
--- a/pkg/analyzer/test/src/diagnostics/field_initializing_formal_not_assignable_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/field_initializing_formal_not_assignable_test.dart
@@ -2,7 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/src/diagnostic/diagnostic.dart' as diag;
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../dart/resolution/context_collection_resolution.dart';
@@ -17,55 +16,50 @@
 class FieldInitializingFormalNotAssignableTest
     extends PubPackageResolutionTest {
   test_class_dynamic() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   int x;
   A(dynamic this.x) {}
+//  ^^^^^^^^^^^^^^
+// [diag.fieldInitializingFormalNotAssignable] The parameter type 'dynamic' is incompatible with the field type 'int'.
 }
-''',
-      [error(diag.fieldInitializingFormalNotAssignable, 23, 14)],
-    );
+''');
   }
 
   test_class_unrelated() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   int x;
   A(String this.x) {}
+//  ^^^^^^^^^^^^^
+// [diag.fieldInitializingFormalNotAssignable] The parameter type 'String' is incompatible with the field type 'int'.
 }
-''',
-      [error(diag.fieldInitializingFormalNotAssignable, 23, 13)],
-    );
+''');
   }
 
   test_enum_dynamic() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 enum E {
   v(0);
   final int x;
   const E(dynamic this.x);
+//        ^^^^^^^^^^^^^^
+// [diag.fieldInitializingFormalNotAssignable] The parameter type 'dynamic' is incompatible with the field type 'int'.
 }
-''',
-      [error(diag.fieldInitializingFormalNotAssignable, 42, 14)],
-    );
+''');
   }
 
   test_enum_unrelated() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 enum E {
   v('');
+//  ^^
+// [diag.constConstructorParamTypeMismatch] A value of type 'String' can't be assigned to a parameter of type 'int' in a const constructor.
   final int x;
   const E(String this.x);
+//        ^^^^^^^^^^^^^
+// [diag.fieldInitializingFormalNotAssignable] The parameter type 'String' is incompatible with the field type 'int'.
 }
-''',
-      [
-        error(diag.constConstructorParamTypeMismatch, 13, 2),
-        error(diag.fieldInitializingFormalNotAssignable, 43, 13),
-      ],
-    );
+''');
   }
 }
diff --git a/pkg/analyzer/test/src/diagnostics/field_must_be_external_in_struct_test.dart b/pkg/analyzer/test/src/diagnostics/field_must_be_external_in_struct_test.dart
index a2611ce..387d8b7 100644
--- a/pkg/analyzer/test/src/diagnostics/field_must_be_external_in_struct_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/field_must_be_external_in_struct_test.dart
@@ -2,7 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/src/diagnostic/diagnostic.dart' as diag;
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../dart/resolution/context_collection_resolution.dart';
@@ -16,30 +15,28 @@
 @reflectiveTest
 class FieldMustBeExternalInStructTest extends PubPackageResolutionTest {
   test_struct() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'dart:ffi';
 
 final class A extends Struct {
   @Int16()
   int a;
+//    ^
+// [diag.fieldMustBeExternalInStruct] Fields of 'Struct' and 'Union' subclasses must be marked external.
 }
-''',
-      [error(diag.fieldMustBeExternalInStruct, 68, 1)],
-    );
+''');
   }
 
   test_union() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'dart:ffi';
 
 final class A extends Union {
   @Int16()
   int a;
+//    ^
+// [diag.fieldMustBeExternalInStruct] Fields of 'Struct' and 'Union' subclasses must be marked external.
 }
-''',
-      [error(diag.fieldMustBeExternalInStruct, 67, 1)],
-    );
+''');
   }
 }
diff --git a/pkg/analyzer/test/src/diagnostics/final_class_extended_outside_of_library_test.dart b/pkg/analyzer/test/src/diagnostics/final_class_extended_outside_of_library_test.dart
index 82964e9..22a4c33 100644
--- a/pkg/analyzer/test/src/diagnostics/final_class_extended_outside_of_library_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/final_class_extended_outside_of_library_test.dart
@@ -2,7 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/src/diagnostic/diagnostic.dart' as diag;
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../dart/resolution/context_collection_resolution.dart';
@@ -16,7 +15,7 @@
 @reflectiveTest
 class FinalClassExtendedOutsideOfLibraryTest extends PubPackageResolutionTest {
   test_inside() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 final class Foo {}
 final class Bar extends Foo {}
 ''');
@@ -27,13 +26,12 @@
 final class Foo {}
 ''');
 
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'foo.dart';
 final class Bar extends Foo {}
-''',
-      [error(diag.finalClassExtendedOutsideOfLibrary, 43, 3)],
-    );
+//                      ^^^
+// [diag.finalClassExtendedOutsideOfLibrary] The class 'Foo' can't be extended outside of its library because it's a final class.
+''');
   }
 
   test_outside_viaLanguage219AndCore() async {
@@ -51,7 +49,7 @@
     await resolveFile2(a);
     assertNoErrorsInResult();
 
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'a.dart';
 final class B extends A {
   int get key => 0;
@@ -66,13 +64,12 @@
 typedef FooTypedef = Foo;
 ''');
 
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'foo.dart';
 final class Bar extends FooTypedef {}
-''',
-      [error(diag.finalClassExtendedOutsideOfLibrary, 43, 10)],
-    );
+//                      ^^^^^^^^^^
+// [diag.finalClassExtendedOutsideOfLibrary] The class 'Foo' can't be extended outside of its library because it's a final class.
+''');
   }
 
   test_outside_viaTypedef_outside() async {
@@ -80,13 +77,12 @@
 final class Foo {}
 ''');
 
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'foo.dart';
 typedef FooTypedef = Foo;
 final class Bar extends FooTypedef {}
-''',
-      [error(diag.finalClassExtendedOutsideOfLibrary, 69, 10)],
-    );
+//                      ^^^^^^^^^^
+// [diag.finalClassExtendedOutsideOfLibrary] The class 'Foo' can't be extended outside of its library because it's a final class.
+''');
   }
 }
diff --git a/pkg/analyzer/test/src/diagnostics/final_class_implemented_outside_of_library_test.dart b/pkg/analyzer/test/src/diagnostics/final_class_implemented_outside_of_library_test.dart
index 9c305fc..7a7c360 100644
--- a/pkg/analyzer/test/src/diagnostics/final_class_implemented_outside_of_library_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/final_class_implemented_outside_of_library_test.dart
@@ -2,7 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/src/diagnostic/diagnostic.dart' as diag;
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../dart/resolution/context_collection_resolution.dart';
@@ -17,7 +16,7 @@
 class FinalClassImplementedOutsideOfLibraryTest
     extends PubPackageResolutionTest {
   test_class_inside() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 final class Foo {}
 final class Bar implements Foo {}
 ''');
@@ -28,13 +27,12 @@
 final class Foo {}
 ''');
 
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'foo.dart';
 final class Bar implements Foo {}
-''',
-      [error(diag.finalClassImplementedOutsideOfLibrary, 46, 3)],
-    );
+//                         ^^^
+// [diag.finalClassImplementedOutsideOfLibrary] The class 'Foo' can't be implemented outside of its library because it's a final class.
+''');
   }
 
   test_class_outside_viaLanguage219AndCore() async {
@@ -50,16 +48,15 @@
     await resolveFile2(a);
     assertNoErrorsInResult();
 
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'a.dart';
 final class B implements A {
+//                       ^
+// [diag.finalClassImplementedOutsideOfLibrary] The class 'MapEntry' can't be implemented outside of its library because it's a final class.
   int get key => 0;
   int get value => 1;
 }
-''',
-      [error(diag.finalClassImplementedOutsideOfLibrary, 42, 1)],
-    );
+''');
   }
 
   test_class_outside_viaTypedef_inside() async {
@@ -68,13 +65,12 @@
 typedef FooTypedef = Foo;
 ''');
 
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'foo.dart';
 final class Bar implements FooTypedef {}
-''',
-      [error(diag.finalClassImplementedOutsideOfLibrary, 46, 10)],
-    );
+//                         ^^^^^^^^^^
+// [diag.finalClassImplementedOutsideOfLibrary] The class 'Foo' can't be implemented outside of its library because it's a final class.
+''');
   }
 
   test_class_outside_viaTypedef_outside() async {
@@ -82,18 +78,17 @@
 final class Foo {}
 ''');
 
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'foo.dart';
 typedef FooTypedef = Foo;
 final class Bar implements FooTypedef {}
-''',
-      [error(diag.finalClassImplementedOutsideOfLibrary, 72, 10)],
-    );
+//                         ^^^^^^^^^^
+// [diag.finalClassImplementedOutsideOfLibrary] The class 'Foo' can't be implemented outside of its library because it's a final class.
+''');
   }
 
   test_enum_inside() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 final class Foo {}
 enum Bar implements Foo { bar }
 ''');
@@ -104,13 +99,12 @@
 final class Foo {}
 ''');
 
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'foo.dart';
 enum Bar implements Foo { bar }
-''',
-      [error(diag.finalClassImplementedOutsideOfLibrary, 39, 3)],
-    );
+//                  ^^^
+// [diag.finalClassImplementedOutsideOfLibrary] The class 'Foo' can't be implemented outside of its library because it's a final class.
+''');
   }
 
   test_enum_outside_viaTypedef_inside() async {
@@ -119,13 +113,12 @@
 typedef FooTypedef = Foo;
 ''');
 
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'foo.dart';
 enum Bar implements FooTypedef { bar }
-''',
-      [error(diag.finalClassImplementedOutsideOfLibrary, 39, 10)],
-    );
+//                  ^^^^^^^^^^
+// [diag.finalClassImplementedOutsideOfLibrary] The class 'Foo' can't be implemented outside of its library because it's a final class.
+''');
   }
 
   test_enum_outside_viaTypedef_outside() async {
@@ -133,14 +126,13 @@
 final class Foo {}
 ''');
 
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'foo.dart';
 typedef FooTypedef = Foo;
 enum Bar implements FooTypedef { bar }
-''',
-      [error(diag.finalClassImplementedOutsideOfLibrary, 65, 10)],
-    );
+//                  ^^^^^^^^^^
+// [diag.finalClassImplementedOutsideOfLibrary] The class 'Foo' can't be implemented outside of its library because it's a final class.
+''');
   }
 
   test_enum_subtypeOfFinal_outside() async {
@@ -149,7 +141,7 @@
 class Bar implements Foo {}
 ''');
 
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'foo.dart';
 enum Bar2 implements Bar { bar }
 ''');
diff --git a/pkg/analyzer/test/src/diagnostics/final_class_used_as_mixin_constraint_outside_of_library_test.dart b/pkg/analyzer/test/src/diagnostics/final_class_used_as_mixin_constraint_outside_of_library_test.dart
index 12be8e3..9ad3ab2 100644
--- a/pkg/analyzer/test/src/diagnostics/final_class_used_as_mixin_constraint_outside_of_library_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/final_class_used_as_mixin_constraint_outside_of_library_test.dart
@@ -2,7 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/src/diagnostic/diagnostic.dart' as diag;
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../dart/resolution/context_collection_resolution.dart';
@@ -17,7 +16,7 @@
 class FinalClassUsedAsMixinConstraintOutsideOfLibraryTest
     extends PubPackageResolutionTest {
   test_inside() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 final class A {}
 base mixin B on A {}
 ''');
@@ -28,13 +27,12 @@
 final class A {}
 ''');
 
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'a.dart';
 base mixin B on A {}
-''',
-      [error(diag.finalClassUsedAsMixinConstraintOutsideOfLibrary, 33, 1)],
-    );
+//              ^
+// [diag.finalClassUsedAsMixinConstraintOutsideOfLibrary] The class 'A' can't be used as a mixin superclass constraint outside of its library because it's a final class.
+''');
   }
 
   test_outside_multiple() async {
@@ -43,16 +41,14 @@
 final class B {}
 ''');
 
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'a.dart';
 base mixin C on A, B {}
-''',
-      [
-        error(diag.finalClassUsedAsMixinConstraintOutsideOfLibrary, 33, 1),
-        error(diag.finalClassUsedAsMixinConstraintOutsideOfLibrary, 36, 1),
-      ],
-    );
+//              ^
+// [diag.finalClassUsedAsMixinConstraintOutsideOfLibrary] The class 'A' can't be used as a mixin superclass constraint outside of its library because it's a final class.
+//                 ^
+// [diag.finalClassUsedAsMixinConstraintOutsideOfLibrary] The class 'B' can't be used as a mixin superclass constraint outside of its library because it's a final class.
+''');
   }
 
   test_outside_noBase() async {
@@ -62,13 +58,12 @@
 final class A {}
 ''');
 
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'a.dart';
 mixin B on A {}
-''',
-      [error(diag.finalClassUsedAsMixinConstraintOutsideOfLibrary, 28, 1)],
-    );
+//         ^
+// [diag.finalClassUsedAsMixinConstraintOutsideOfLibrary] The class 'A' can't be used as a mixin superclass constraint outside of its library because it's a final class.
+''');
   }
 
   test_outside_viaTypedef_inside() async {
@@ -77,13 +72,12 @@
 typedef ATypedef = A;
 ''');
 
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'a.dart';
 base mixin B on ATypedef {}
-''',
-      [error(diag.finalClassUsedAsMixinConstraintOutsideOfLibrary, 33, 8)],
-    );
+//              ^^^^^^^^
+// [diag.finalClassUsedAsMixinConstraintOutsideOfLibrary] The class 'A' can't be used as a mixin superclass constraint outside of its library because it's a final class.
+''');
   }
 
   test_outside_viaTypedef_outside() async {
@@ -91,13 +85,12 @@
 final class A {}
 ''');
 
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'a.dart';
 typedef ATypedef = A;
 base mixin B on ATypedef {}
-''',
-      [error(diag.finalClassUsedAsMixinConstraintOutsideOfLibrary, 55, 8)],
-    );
+//              ^^^^^^^^
+// [diag.finalClassUsedAsMixinConstraintOutsideOfLibrary] The class 'A' can't be used as a mixin superclass constraint outside of its library because it's a final class.
+''');
   }
 }
diff --git a/pkg/analyzer/test/src/diagnostics/for_in_of_invalid_element_type_test.dart b/pkg/analyzer/test/src/diagnostics/for_in_of_invalid_element_type_test.dart
index 54fd89b..e22beb7 100644
--- a/pkg/analyzer/test/src/diagnostics/for_in_of_invalid_element_type_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/for_in_of_invalid_element_type_test.dart
@@ -2,7 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/src/diagnostic/diagnostic.dart' as diag;
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../dart/resolution/context_collection_resolution.dart';
@@ -16,7 +15,7 @@
 @reflectiveTest
 class ForInOfInvalidElementTypeTest extends PubPackageResolutionTest {
   test_await_declaredVariable_dynamic() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 f(dynamic a) async {
   await for (int i in a) {
     i;
@@ -26,49 +25,46 @@
   }
 
   test_await_declaredVariableWrongType() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 f(Stream<String> stream) async {
   await for (int i in stream) {
+//                    ^^^^^^
+// [diag.forInOfInvalidElementType] The type 'Stream<String>' used in the 'for' loop must implement 'Stream' with a type argument that can be assigned to 'int'.
     i;
   }
 }
-''',
-      [error(diag.forInOfInvalidElementType, 55, 6)],
-    );
+''');
   }
 
   test_await_existingVariableWrongType() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 f(Stream<String> stream) async {
   int i;
   await for (i in stream) {
+//                ^^^^^^
+// [diag.forInOfInvalidElementType] The type 'Stream<String>' used in the 'for' loop must implement 'Stream' with a type argument that can be assigned to 'int'.
     i;
   }
 }
-''',
-      [error(diag.forInOfInvalidElementType, 60, 6)],
-    );
+''');
   }
 
   test_bad_type_bound() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 class Foo<T extends Iterable<int>> {
   void method(T iterable) {
     for (String i in iterable) {
+//                   ^^^^^^^^
+// [diag.forInOfInvalidElementType] The type 'Iterable<int>' used in the 'for' loop must implement 'Iterable' with a type argument that can be assigned to 'String'.
       i;
     }
   }
 }
-''',
-      [error(diag.forInOfInvalidElementType, 86, 8)],
-    );
+''');
   }
 
   test_declaredVariable_dynamic() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 f(dynamic a) {
   for (int i in a) {
     i;
@@ -78,7 +74,7 @@
   }
 
   test_declaredVariable_implicitCallReference() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 class C {
   void call() {}
 }
@@ -91,7 +87,7 @@
   }
 
   test_declaredVariable_implicitCallReference_genericFunctionInstantiation() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 class C {
   void call<T>(T p) {}
 }
@@ -104,7 +100,7 @@
   }
 
   test_declaredVariable_interfaceTypeTypedef_ok() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 typedef S = String;
 f() {
   for (S i in <String>[]) {
@@ -115,7 +111,7 @@
   }
 
   test_declaredVariable_ok() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 f() {
   for (String i in <String>[]) {
     i;
@@ -125,34 +121,32 @@
   }
 
   test_declaredVariable_wrongType() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 f() {
   for (int i in <String>[]) {
+//              ^^^^^^^^^^
+// [diag.forInOfInvalidElementType] The type 'List<String>' used in the 'for' loop must implement 'Iterable' with a type argument that can be assigned to 'int'.
     i;
   }
 }
-''',
-      [error(diag.forInOfInvalidElementType, 22, 10)],
-    );
+''');
   }
 
   test_existingVariableWrongType() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 f() {
   int i;
   for (i in <String>[]) {
+//          ^^^^^^^^^^
+// [diag.forInOfInvalidElementType] The type 'List<String>' used in the 'for' loop must implement 'Iterable' with a type argument that can be assigned to 'int'.
     i;
   }
 }
-''',
-      [error(diag.forInOfInvalidElementType, 27, 10)],
-    );
+''');
   }
 
   test_implicitCallReference() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 class C {
   void call(int a) {}
 }
@@ -166,7 +160,7 @@
   }
 
   test_implicitCallReference_genericFunctionInstantiation() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 class C {
   void call<T>(T p) {}
 }
@@ -180,19 +174,18 @@
   }
 
   test_implicitCallReference_unassignableFunctionType() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 class C {
   void call(int a) {}
 }
 void foo(Iterable<C> iterable) {
   void Function(String) f;
   for (f in iterable) {
+//          ^^^^^^^^
+// [diag.forInOfInvalidElementType] The type 'Iterable<C>' used in the 'for' loop must implement 'Iterable' with a type argument that can be assigned to 'void Function(String)'.
     f;
   }
 }
-''',
-      [error(diag.forInOfInvalidElementType, 106, 8)],
-    );
+''');
   }
 }
diff --git a/pkg/analyzer/test/src/diagnostics/for_in_of_invalid_type_test.dart b/pkg/analyzer/test/src/diagnostics/for_in_of_invalid_type_test.dart
index cf1196d..036e64f 100644
--- a/pkg/analyzer/test/src/diagnostics/for_in_of_invalid_type_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/for_in_of_invalid_type_test.dart
@@ -17,7 +17,7 @@
 @reflectiveTest
 class ForInOfInvalidTypeTest extends PubPackageResolutionTest {
   test_awaitForIn_dynamic() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 f(dynamic e) async {
   await for (var id in e) {
     id;
@@ -27,48 +27,44 @@
   }
 
   test_awaitForIn_interfaceType_notStream() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 f(bool e) async {
   await for (var id in e) {
+//                     ^
+// [diag.forInOfInvalidType] The type 'bool' used in the 'for' loop must implement 'Stream'.
     id;
   }
 }
-''',
-      [error(diag.forInOfInvalidType, 41, 1)],
-    );
+''');
   }
 
   test_awaitForIn_never() async {
-    await assertErrorsInCode(
-      '''
+    // TODO(scheglov): extract for-in resolution and implement
+    //    assertType(findNode.simple('id;'), 'Never');
+    await resolveTestCodeWithDiagnostics(r'''
 f(Never e) async {
   await for (var id in e) {
+// [diag.deadCode][column 14][length 78] Dead code.
     id;
   }
 }
-''',
-      [error(diag.deadCode, 32, 26)],
-    );
-    // TODO(scheglov): extract for-in resolution and implement
-    //    assertType(findNode.simple('id;'), 'Never');
+''');
   }
 
   test_awaitForIn_object() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 f(Object e) async {
   await for (var id in e) {
+//                     ^
+// [diag.forInOfInvalidType] The type 'Object' used in the 'for' loop must implement 'Stream'.
     id;
   }
 }
-''',
-      [error(diag.forInOfInvalidType, 43, 1)],
-    );
+''');
   }
 
   test_awaitForIn_streamOfDynamic() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 f(Stream<dynamic> e) async {
   await for (var id in e) {
     id;
@@ -78,7 +74,7 @@
   }
 
   test_awaitForIn_streamOfDynamicSubclass() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 abstract class MyStream<T> extends Stream<T> {
   factory MyStream() => throw 0;
 }
@@ -91,7 +87,7 @@
   }
 
   test_forIn_dynamic() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 f(dynamic e) {
   for (var id in e) {
     id;
@@ -101,7 +97,7 @@
   }
 
   test_forIn_interfaceType_iterable() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 f(Iterable e) {
   for (var id in e) {
     id;
@@ -111,20 +107,19 @@
   }
 
   test_forIn_interfaceType_notIterable() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 f(bool e) {
   for (var id in e) {
+//               ^
+// [diag.forInOfInvalidType] The type 'bool' used in the 'for' loop must implement 'Iterable'.
     id;
   }
 }
-''',
-      [error(diag.forInOfInvalidType, 29, 1)],
-    );
+''');
   }
 
   test_forIn_interfaceTypeTypedef_iterable() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 typedef L = List<String>;
 f(L e) {
   for (var id in e) {
@@ -135,31 +130,28 @@
   }
 
   test_forIn_never() async {
-    await assertErrorsInCode(
-      '''
+    // TODO(scheglov): extract for-in resolution and implement
+    //    assertType(findNode.simple('id;'), 'Never');
+    await resolveTestCodeWithDiagnostics(r'''
 f(Never e) {
   for (var id in e) {
+// [diag.deadCode][column 8][length 77] Dead code.
     id;
   }
 }
-''',
-      [error(diag.deadCode, 20, 26)],
-    );
-    // TODO(scheglov): extract for-in resolution and implement
-    //    assertType(findNode.simple('id;'), 'Never');
+''');
   }
 
   test_forIn_object() async {
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 f(Object e) async {
   for (var id in e) {
+//               ^
+// [diag.forInOfInvalidType] The type 'Object' used in the 'for' loop must implement 'Iterable'.
     id;
   }
 }
-''',
-      [error(diag.forInOfInvalidType, 37, 1)],
-    );
+''');
   }
 }
 
diff --git a/pkg/analyzer/test/src/diagnostics/for_in_with_const_variable_test.dart b/pkg/analyzer/test/src/diagnostics/for_in_with_const_variable_test.dart
index f7a1593..e5002a1 100644
--- a/pkg/analyzer/test/src/diagnostics/for_in_with_const_variable_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/for_in_with_const_variable_test.dart
@@ -2,7 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/src/diagnostic/diagnostic.dart' as diag;
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../dart/resolution/context_collection_resolution.dart';
@@ -16,15 +15,14 @@
 @reflectiveTest
 class ForInWithConstVariableTest extends PubPackageResolutionTest {
   test_forEach_loopVariable() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 f() {
   for (const x in [0, 1, 2]) {
+//     ^^^^^
+// [diag.forInWithConstVariable] A for-in loop variable can't be a 'const'.
     print(x);
   }
 }
-''',
-      [error(diag.forInWithConstVariable, 13, 5)],
-    );
+''');
   }
 }
diff --git a/pkg/analyzer/test/src/diagnostics/generic_function_type_cannot_be_bound_test.dart b/pkg/analyzer/test/src/diagnostics/generic_function_type_cannot_be_bound_test.dart
index b5a5ba4..edbf4c9 100644
--- a/pkg/analyzer/test/src/diagnostics/generic_function_type_cannot_be_bound_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/generic_function_type_cannot_be_bound_test.dart
@@ -2,7 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/src/diagnostic/diagnostic.dart' as diag;
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../dart/resolution/context_collection_resolution.dart';
@@ -19,14 +18,14 @@
 @reflectiveTest
 class GenericFunctionTypeCannotBeBoundTest extends PubPackageResolutionTest {
   test_class() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class C<T extends S Function<S>(S)> {
 }
 ''');
   }
 
   test_genericFunction() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 late T Function<T extends S Function<S>(S)>(T) fun;
 ''');
   }
@@ -35,30 +34,29 @@
     newFile('$testPackageLibPath/a.dart', '''
 typedef F = S Function<S>(S);
 ''');
-    await assertErrorsInCode(
-      '''
+    await resolveTestCodeWithDiagnostics(r'''
 // @dart=2.12
 import 'a.dart';
 late T Function<T extends F>(T) fun;
-''',
-      [error(diag.genericFunctionTypeCannotBeBound, 57, 1)],
-    );
+//                        ^
+// [diag.genericFunctionTypeCannotBeBound] Generic function types can't be used as type parameter bounds.
+''');
   }
 
   test_genericFunctionTypedef() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 typedef foo = T Function<T extends S Function<S>(S)>(T t);
 ''');
   }
 
   test_parameterOfFunction() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class C<T extends void Function(S Function<S>(S))> {}
 ''');
   }
 
   test_typedef() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 typedef T foo<T extends S Function<S>(S)>(T t);
 ''');
   }
@@ -68,49 +66,45 @@
 class GenericFunctionTypeCannotBeBoundWithoutGenericMetadataTest
     extends PubPackageResolutionTest {
   test_class() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 // @dart=2.12
 class C<T extends S Function<S>(S)> {
+//                ^^^^^^^^^^^^^^^^
+// [diag.genericFunctionTypeCannotBeBound] Generic function types can't be used as type parameter bounds.
 }
-''',
-      [error(diag.genericFunctionTypeCannotBeBound, 32, 16)],
-    );
+''');
   }
 
   test_genericFunction() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 // @dart=2.12
 late T Function<T extends S Function<S>(S)>(T) fun;
-''',
-      [error(diag.genericFunctionTypeCannotBeBound, 40, 16)],
-    );
+//                        ^^^^^^^^^^^^^^^^
+// [diag.genericFunctionTypeCannotBeBound] Generic function types can't be used as type parameter bounds.
+''');
   }
 
   test_genericFunctionTypedef() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 // @dart=2.12
 typedef foo = T Function<T extends S Function<S>(S)>(T t);
-''',
-      [error(diag.genericFunctionTypeCannotBeBound, 49, 16)],
-    );
+//                                 ^^^^^^^^^^^^^^^^
+// [diag.genericFunctionTypeCannotBeBound] Generic function types can't be used as type parameter bounds.
+''');
   }
 
   test_parameterOfFunction() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class C<T extends void Function(S Function<S>(S))> {}
 ''');
   }
 
   test_typedef() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 // @dart=2.12
 typedef T foo<T extends S Function<S>(S)>(T t);
-''',
-      [error(diag.genericFunctionTypeCannotBeBound, 38, 16)],
-    );
+//                      ^^^^^^^^^^^^^^^^
+// [diag.genericFunctionTypeCannotBeBound] Generic function types can't be used as type parameter bounds.
+''');
   }
 }
diff --git a/pkg/analyzer/test/src/diagnostics/generic_struct_subclass_test.dart b/pkg/analyzer/test/src/diagnostics/generic_struct_subclass_test.dart
index 7adf8d3..2ad5bc7 100644
--- a/pkg/analyzer/test/src/diagnostics/generic_struct_subclass_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/generic_struct_subclass_test.dart
@@ -2,7 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/src/diagnostic/diagnostic.dart' as diag;
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../dart/resolution/context_collection_resolution.dart';
@@ -16,35 +15,29 @@
 @reflectiveTest
 class GenericStructSubclassTest extends PubPackageResolutionTest {
   test_genericStruct() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'dart:ffi';
 final class S<T> extends Struct {
+//          ^
+// [diag.genericStructSubclass] The class 'S' can't extend 'Struct' or 'Union' because 'S' is generic.
   external Pointer notEmpty;
 }
-''',
-      [
-        error(diag.genericStructSubclass, 31, 1, messageContains: ["'S'"]),
-      ],
-    );
+''');
   }
 
   test_genericUnion() async {
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'dart:ffi';
 final class S<T> extends Union {
+//          ^
+// [diag.genericStructSubclass] The class 'S' can't extend 'Struct' or 'Union' because 'S' is generic.
   external Pointer notEmpty;
 }
-''',
-      [
-        error(diag.genericStructSubclass, 31, 1, messageContains: ["'S'"]),
-      ],
-    );
+''');
   }
 
   test_validStruct() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'dart:ffi';
 final class S extends Struct {
   external Pointer notEmpty;
diff --git a/pkg/analyzer/test/src/diagnostics/getter_not_subtype_setter_types_test.dart b/pkg/analyzer/test/src/diagnostics/getter_not_subtype_setter_types_test.dart
index c6b997c..1ed3ee8 100644
--- a/pkg/analyzer/test/src/diagnostics/getter_not_subtype_setter_types_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/getter_not_subtype_setter_types_test.dart
@@ -2,7 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/src/diagnostic/diagnostic.dart' as diag;
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../dart/resolution/context_collection_resolution.dart';
@@ -28,7 +27,7 @@
 
 class _GetterNotSubtypeSetterTypesTest extends PubPackageResolutionTest {
   test_class_instance() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 class C {
   num get foo => 0;
   set foo(int v) {}
@@ -37,7 +36,7 @@
   }
 
   test_class_instance_dynamicGetter() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class C {
   get foo => 0;
   set foo(String v) {}
@@ -46,7 +45,7 @@
   }
 
   test_class_instance_dynamicSetter() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class C {
   int get foo => 0;
   set foo(v) {}
@@ -55,7 +54,7 @@
   }
 
   test_class_instance_field() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 class C {
   final num foo = 0;
   set foo(int v) {}
@@ -64,7 +63,7 @@
   }
 
   test_class_instance_interfaces() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   int get foo => 0;
 }
@@ -83,16 +82,15 @@
   int get _foo => 0;
 }
 ''');
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'a.dart';
 
 class B extends A {
   set _foo(String _) {}
+//    ^^^^
+// [diag.unusedElement] The declaration '_foo' isn't referenced.
 }
-''',
-      [error(diag.unusedElement, 44, 4)],
-    );
+''');
   }
 
   test_class_instance_private_interfaces() async {
@@ -106,7 +104,7 @@
   set _foo(String _) {}
 }
 ''');
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'a.dart';
 import 'b.dart';
 
@@ -124,7 +122,7 @@
   set _foo(String _) {}
 }
 ''');
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'a.dart';
 
 class X implements A, B {}
@@ -137,20 +135,19 @@
   set _foo(String _) {}
 }
 ''');
-    await assertErrorsInCode(
-      r'''
+    await resolveTestCodeWithDiagnostics(r'''
 import 'a.dart';
 
 class B extends A {
   int get _foo => 0;
+//        ^^^^
+// [diag.unusedElement] The declaration '_foo' isn't referenced.
 }
-''',
-      [error(diag.unusedElement, 48, 4)],
-    );
+''');
   }
 
   test_class_instance_sameClass() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class C {
   int get foo => 0;
   set foo(String _) {}
@@ -159,7 +156,7 @@
   }
 
   test_class_instance_sameTypes() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class C {
   int get foo => 0;
   set foo(int v) {}
@@ -168,7 +165,7 @@
   }
 
   test_class_instance_superGetter() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   int get foo => 0;
 }
@@ -180,7 +177,7 @@
   }
 
   test_class_instance_superSetter() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 class A {
   set foo(String _) {}
 }
@@ -192,7 +189,7 @@
   }
 
   test_class_static() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 class C {
   static num get foo => 0;
   static set foo(int v) {}
@@ -201,7 +198,7 @@
   }
 
   test_class_static_field() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 class C {
   static final num foo = 0;
   static set foo(int v) {}
@@ -210,7 +207,7 @@
   }
 
   test_class_static_sameTypes() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 class C {
   static int get foo => 0;
   static set foo(int v) {}
@@ -219,7 +216,7 @@
   }
 
   test_enum_instance_mixinGetter_mixinSetter() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 mixin M1 {
   num get foo => 0;
 }
@@ -235,7 +232,7 @@
   }
 
   test_enum_instance_mixinGetter_thisSetter() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 mixin M {
   num get foo => 0;
 }
@@ -248,7 +245,7 @@
   }
 
   test_enum_instance_superGetter_thisSetter_index() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 enum E {
   v;
   set index(String _) {}
@@ -257,7 +254,7 @@
   }
 
   test_enum_instance_thisField_thisSetter() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 enum E {
   v;
   final num foo = 0;
@@ -267,7 +264,7 @@
   }
 
   test_enum_instance_thisGetter_thisSetter() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 enum E {
   v;
   num get foo => 0;
@@ -277,7 +274,7 @@
   }
 
   test_enum_static() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 enum E {
   v;
   static num get foo => 0;
@@ -287,7 +284,7 @@
   }
 
   test_enum_static_field() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 enum E {
   foo;
   static set foo(int v) {}
@@ -296,7 +293,7 @@
   }
 
   test_enum_static_generatedGetter_thisSetter_index() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 enum E {
   v;
   static set values(int _) {}
@@ -305,7 +302,7 @@
   }
 
   test_extension_instance() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 extension E on Object {
   int get foo => 0;
   set foo(String v) {}
@@ -314,7 +311,7 @@
   }
 
   test_extension_static() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 extension E on Object {
   static int get foo => 0;
   static set foo(String v) {}
@@ -323,7 +320,7 @@
   }
 
   test_extension_static_field() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 extension E on Object {
   static final int foo = 0;
   static set foo(String v) {}
@@ -332,7 +329,7 @@
   }
 
   test_extensionType_instance() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 extension type A(int it) {
   int get foo => 0;
   void set foo(String _) {}
@@ -341,7 +338,7 @@
   }
 
   test_extensionType_instance_fromImplements() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 extension type A(int it) {
   void set foo(String _) {}
 }
@@ -353,7 +350,7 @@
   }
 
   test_extensionType_instance_representationField() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 extension type A(int it) {
   void set it(String _) {}
 }
@@ -361,7 +358,7 @@
   }
 
   test_extensionType_static() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 extension type A(int it) {
   static int get foo => 0;
   static set foo(String v) {}
@@ -370,7 +367,7 @@
   }
 
   test_extensionType_static_field() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 extension type A(int it) {
   static final int foo = 0;
   static set foo(String v) {}
@@ -379,35 +376,35 @@
   }
 
   test_topLevel() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 int get foo => 0;
 set foo(String v) {}
 ''');
   }
 
   test_topLevel_dynamicGetter() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 get foo => 0;
 set foo(int v) {}
 ''');
   }
 
   test_topLevel_dynamicSetter() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 int get foo => 0;
 set foo(v) {}
 ''');
   }
 
   test_topLevel_sameTypes() async {
-    await assertNoErrorsInCode(r'''
+    await resolveTestCodeWithDiagnostics(r'''
 int get foo => 0;
 set foo(int v) {}
 ''');
   }
 
   test_topLevel_variable() async {
-    await assertNoErrorsInCode('''
+    await resolveTestCodeWithDiagnostics(r'''
 final int foo = 0;
 set foo(String v) {}
 ''');
diff --git a/pkg/analyzer/test/src/diagnostics/inconsistent_inheritance_getter_and_method_test.dart b/pkg/analyzer/test/src/diagnostics/inconsistent_inheritance_getter_and_method_test.dart
index 7bd0819..0a81864 100644
--- a/pkg/analyzer/test/src/diagnostics/inconsistent_inheritance_getter_and_method_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/inconsistent_inheritance_getter_and_method_test.dart
@@ -16,7 +16,58 @@
 @reflectiveTest
 class InconsistentInheritanceGetterAndMethodTest
     extends PubPackageResolutionTest {
-  test_class_getter_method() async {
+  test_class_implements_getter_implements_method_declaresField() async {
+    await assertErrorsInCode(
+      r'''
+abstract class A {
+  int get foo;
+}
+abstract class B {
+  int foo();
+}
+abstract class C implements A, B {
+  int foo = 0;
+}
+''',
+      [error(diag.inconsistentInheritanceGetterAndMethod, 111, 3)],
+    );
+  }
+
+  test_class_implements_getter_implements_method_declaresGetter() async {
+    await assertErrorsInCode(
+      r'''
+abstract class A {
+  int get foo;
+}
+abstract class B {
+  int foo();
+}
+abstract class C implements A, B {
+  int get foo => 0;
+}
+''',
+      [error(diag.inconsistentInheritanceGetterAndMethod, 115, 3)],
+    );
+  }
+
+  test_class_implements_getter_implements_method_declaresMethod() async {
+    await assertErrorsInCode(
+      r'''
+abstract class A {
+  int get foo;
+}
+abstract class B {
+  int foo();
+}
+abstract class C implements A, B {
+  int foo() => 0;
+}
+''',
+      [error(diag.inconsistentInheritanceGetterAndMethod, 111, 3)],
+    );
+  }
+
+  test_class_implements_getter_implements_method_declaresNoMember() async {
     await assertErrorsInCode(
       r'''
 abstract class A {
@@ -31,7 +82,22 @@
     );
   }
 
-  test_class_getter_method_inconsistentInheritance() async {
+  test_class_implements_method_implements_getter_declaresNoMember() async {
+    await assertErrorsInCode(
+      r'''
+abstract class A {
+  int foo();
+}
+abstract class B {
+  int get foo;
+}
+abstract class C implements A, B {}
+''',
+      [error(diag.inconsistentInheritanceGetterAndMethod, 85, 1)],
+    );
+  }
+
+  test_class_with_getter_implements_method_declaresMethod() async {
     await assertErrorsInCode(
       r'''
 abstract interface class I {
@@ -46,26 +112,11 @@
   String foo() => 'C';
 }
 ''',
-      [error(diag.inconsistentInheritanceGetterAndMethod, 97, 1)],
+      [error(diag.inconsistentInheritanceGetterAndMethod, 130, 3)],
     );
   }
 
-  test_class_method_getter() async {
-    await assertErrorsInCode(
-      r'''
-abstract class A {
-  int foo();
-}
-abstract class B {
-  int get foo;
-}
-abstract class C implements A, B {}
-''',
-      [error(diag.inconsistentInheritanceGetterAndMethod, 85, 1)],
-    );
-  }
-
-  test_class_mixinApp() async {
+  test_classTypeAlias_extends_getter_with_method() async {
     await assertErrorsInCode(
       '''
 class S {
@@ -82,7 +133,7 @@
     );
   }
 
-  test_class_mixinApp2() async {
+  test_classTypeAlias_extends_getter_with_method_with_getter() async {
     await assertErrorsInCode(
       '''
 class S {
@@ -106,7 +157,7 @@
     );
   }
 
-  test_mixin_implements_getter_method() async {
+  test_mixin_implements_getter_implements_method_declaresNoMember() async {
     await assertErrorsInCode(
       r'''
 abstract class A {
@@ -121,7 +172,7 @@
     );
   }
 
-  test_mixin_implements_method_getter() async {
+  test_mixin_implements_method_implements_getter_declaresNoMember() async {
     await assertErrorsInCode(
       r'''
 abstract class A {
@@ -136,7 +187,58 @@
     );
   }
 
-  test_mixin_on_getter_method() async {
+  test_mixin_on_getter_implements_method_declaresField() async {
+    await assertErrorsInCode(
+      r'''
+abstract class A {
+  int get foo;
+}
+abstract class B {
+  int foo();
+}
+mixin M on A implements B {
+  int foo = 0;
+}
+''',
+      [error(diag.inconsistentInheritanceGetterAndMethod, 104, 3)],
+    );
+  }
+
+  test_mixin_on_getter_implements_method_declaresGetter() async {
+    await assertErrorsInCode(
+      r'''
+abstract class A {
+  int get foo;
+}
+abstract class B {
+  int foo();
+}
+mixin M on A implements B {
+  int get foo => 0;
+}
+''',
+      [error(diag.inconsistentInheritanceGetterAndMethod, 108, 3)],
+    );
+  }
+
+  test_mixin_on_getter_implements_method_declaresMethod() async {
+    await assertErrorsInCode(
+      r'''
+abstract class A {
+  int get foo;
+}
+abstract class B {
+  int foo();
+}
+mixin M on A implements B {
+  int foo() => 0;
+}
+''',
+      [error(diag.inconsistentInheritanceGetterAndMethod, 104, 3)],
+    );
+  }
+
+  test_mixin_on_getter_method_declaresNoMember() async {
     await assertErrorsInCode(
       r'''
 abstract class A {
@@ -151,7 +253,7 @@
     );
   }
 
-  test_mixin_on_method_getter() async {
+  test_mixin_on_method_getter_declaresNoMember() async {
     await assertErrorsInCode(
       r'''
 abstract class A {
diff --git a/pkg/analyzer/test/src/diagnostics/non_final_field_in_enum_test.dart b/pkg/analyzer/test/src/diagnostics/non_final_field_in_enum_test.dart
index 634ec96..91d8bb6 100644
--- a/pkg/analyzer/test/src/diagnostics/non_final_field_in_enum_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/non_final_field_in_enum_test.dart
@@ -135,15 +135,12 @@
   }
 
   test_fieldDeclaration_instance_external() async {
-    await assertErrorsInCode(
-      r'''
+    await assertNoErrorsInCode(r'''
 enum E {
   v;
   external int foo;
 }
-''',
-      [error(diag.nonFinalFieldInEnum, 29, 3)],
-    );
+''');
   }
 
   test_fieldDeclaration_instance_external_final() async {
diff --git a/pkg/analyzer/test/src/diagnostics/optional_parameter_in_operator_test.dart b/pkg/analyzer/test/src/diagnostics/optional_parameter_in_operator_test.dart
index 1dd7b1e..79d7b2e 100644
--- a/pkg/analyzer/test/src/diagnostics/optional_parameter_in_operator_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/optional_parameter_in_operator_test.dart
@@ -15,32 +15,43 @@
 
 @reflectiveTest
 class OptionalParameterInOperatorTest extends PubPackageResolutionTest {
-  test_named() async {
+  test_optionalNamed() async {
     await assertErrorsInCode(
       r'''
 class A {
-  operator +({p}) {}
+  int operator +({Object? other}) => 0;
 }
 ''',
-      [error(diag.optionalParameterInOperator, 24, 1)],
+      [error(diag.optionalParameterInOperator, 28, 13)],
     );
   }
 
-  test_positional() async {
+  test_optionalPositional() async {
     await assertErrorsInCode(
       r'''
 class A {
-  operator +([p]) {}
+  int operator +([Object? other]) => 0;
 }
 ''',
-      [error(diag.optionalParameterInOperator, 24, 1)],
+      [error(diag.optionalParameterInOperator, 28, 13)],
     );
   }
 
-  test_single_required_parameter() async {
+  test_requiredNamed() async {
+    await assertErrorsInCode(
+      r'''
+class A {
+  int operator +({required Object other}) => 0;
+}
+''',
+      [error(diag.optionalParameterInOperator, 28, 21)],
+    );
+  }
+
+  test_requiredPositional() async {
     await assertNoErrorsInCode(r'''
 class A {
-  operator +(p) {}
+  int operator +(Object other) => 0;
 }
 ''');
   }
diff --git a/pkg/analyzer/test/src/diagnostics/parser_diagnostics.dart b/pkg/analyzer/test/src/diagnostics/parser_diagnostics.dart
index 55771c4..0ba3e24 100644
--- a/pkg/analyzer/test/src/diagnostics/parser_diagnostics.dart
+++ b/pkg/analyzer/test/src/diagnostics/parser_diagnostics.dart
@@ -10,6 +10,8 @@
 import 'package:analyzer/src/dart/ast/ast.dart';
 import 'package:analyzer/src/test_utilities/find_node.dart';
 import 'package:analyzer_testing/src/analysis_rule/pub_package_resolution.dart';
+import 'package:analyzer_testing/src/expected_diagnostics.dart'
+    as expected_diagnostics;
 import 'package:analyzer_utilities/testing/tree_string_sink.dart';
 import 'package:test/test.dart';
 
@@ -113,6 +115,17 @@
     diagnosticListener.assertErrors(expectedDiagnostics);
   }
 
+  void assertExpectedDiagnostics() {
+    var actual = expected_diagnostics.updateExpectedDiagnostics(
+      content: content,
+      actualDiagnostics: errors,
+    );
+    if (actual != content) {
+      printPrettyDiff(content, actual);
+      fail('See the difference above.');
+    }
+  }
+
   void assertNoErrors() {
     assertErrors(const []);
   }
diff --git a/pkg/analyzer/test/src/diagnostics/test_all.dart b/pkg/analyzer/test/src/diagnostics/test_all.dart
index caf5801..85bb5b6 100644
--- a/pkg/analyzer/test/src/diagnostics/test_all.dart
+++ b/pkg/analyzer/test/src/diagnostics/test_all.dart
@@ -49,6 +49,8 @@
     as augmentation_of_different_declaration_kind;
 import 'augmentation_of_mixin_application_class_test.dart'
     as augmentation_of_mixin_application_class;
+import 'augmentation_return_type_mismatch_test.dart'
+    as augmentation_return_type_mismatch;
 import 'augmentation_type_parameter_bound_test.dart'
     as augmentation_type_parameter_bound;
 import 'augmentation_type_parameter_count_test.dart'
@@ -990,6 +992,7 @@
     augmentation_modifier_missing.main();
     augmentation_of_different_declaration_kind.main();
     augmentation_of_mixin_application_class.main();
+    augmentation_return_type_mismatch.main();
     augmentation_type_parameter_bound.main();
     augmentation_type_parameter_count.main();
     augmentation_type_parameter_name.main();
diff --git a/pkg/analyzer/test/src/diagnostics/use_of_void_result_test.dart b/pkg/analyzer/test/src/diagnostics/use_of_void_result_test.dart
index 6de5aa3..99446bc 100644
--- a/pkg/analyzer/test/src/diagnostics/use_of_void_result_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/use_of_void_result_test.dart
@@ -112,6 +112,27 @@
     );
   }
 
+  test_awaitForIn_streamVoid_declaredVariable_nonVoid() async {
+    await assertErrorsInCode(
+      '''
+void f(Stream<void> values) async {
+  await for (Object? _ in values) {}
+  await for (dynamic _ in values) {}
+}
+''',
+      [error(diag.useOfVoidResult, 62, 6), error(diag.useOfVoidResult, 99, 6)],
+    );
+  }
+
+  test_awaitForIn_streamVoid_declaredVariable_void() async {
+    await assertNoErrorsInCode('''
+void f(Stream<void> values) async {
+  await for (void _ in values) {}
+  await for (var _ in values) {}
+}
+''');
+  }
+
   test_constructorFieldInitializer_toDynamic() async {
     await assertErrorsInCode(
       '''
@@ -150,6 +171,56 @@
     );
   }
 
+  test_forIn_iterableVoid_declaredVariable_nonVoid() async {
+    await assertErrorsInCode(
+      '''
+void f(List<void> values) {
+  for (Object? _ in values) {}
+  for (dynamic _ in values) {}
+}
+''',
+      [error(diag.useOfVoidResult, 48, 6), error(diag.useOfVoidResult, 79, 6)],
+    );
+  }
+
+  test_forIn_iterableVoid_declaredVariable_void() async {
+    await assertNoErrorsInCode('''
+void f(List<void> values) {
+  for (void _ in values) {}
+  for (var _ in values) {}
+}
+''');
+  }
+
+  test_forIn_iterableVoid_existingVariable_nonVoid() async {
+    await assertErrorsInCode(
+      '''
+void f(List<void> values) {
+  Object? object;
+  dynamic anything;
+  for (object in values) {
+    object;
+  }
+  for (anything in values) {
+    anything;
+  }
+}
+''',
+      [error(diag.useOfVoidResult, 83, 6), error(diag.useOfVoidResult, 128, 6)],
+    );
+  }
+
+  test_forIn_iterableVoid_existingVariable_void() async {
+    await assertNoErrorsInCode('''
+void f(List<void> values) {
+  void existing = null;
+  for (existing in values) {
+    existing;
+  }
+}
+''');
+  }
+
   test_implicitReturnValue() async {
     await assertErrorsInCode(
       r'''
@@ -228,6 +299,66 @@
     );
   }
 
+  test_nullAwareElement_list_voidValue() async {
+    await assertErrorsInCode(
+      '''
+void f(void value) {
+  <void>[?value];
+}
+''',
+      [error(diag.useOfVoidResult, 31, 5)],
+    );
+  }
+
+  test_nullAwareElement_set_voidValue() async {
+    await assertErrorsInCode(
+      '''
+void f(void value) {
+  <void>{?value};
+}
+''',
+      [error(diag.useOfVoidResult, 31, 5)],
+    );
+  }
+
+  test_nullAwareMapEntry_nullAwareKey_voidKey() async {
+    await assertErrorsInCode(
+      '''
+void f(void key) {
+  <void, int>{?key: 0};
+}
+''',
+      [error(diag.useOfVoidResult, 34, 3)],
+    );
+  }
+
+  test_nullAwareMapEntry_nullAwareKey_voidValue() async {
+    await assertNoErrorsInCode('''
+void f(int? key, void value) {
+  <int, void>{?key: value};
+}
+''');
+  }
+
+  test_nullAwareMapEntry_nullAwareValue_voidKey() async {
+    await assertNoErrorsInCode('''
+void f(void key, int? value) {
+  <void, int>{key: ?value};
+}
+''');
+  }
+
+  test_nullAwareMapEntry_nullAwareValue_voidValue() async {
+    await assertErrorsInCode(
+      '''
+void f(void value) {
+  <int, void>{0: ?value};
+}
+''',
+      [error(diag.useOfVoidResult, 39, 5)],
+    );
+  }
+
   test_nullCheck() async {
     await assertErrorsInCode(
       r'''
diff --git a/pkg/analyzer/test/src/diagnostics/yield_of_invalid_type_test.dart b/pkg/analyzer/test/src/diagnostics/yield_of_invalid_type_test.dart
index 23d6653..dafb1f7 100644
--- a/pkg/analyzer/test/src/diagnostics/yield_of_invalid_type_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/yield_of_invalid_type_test.dart
@@ -114,6 +114,25 @@
     );
   }
 
+  test_none_asyncStar_to_futureOrNullableStream() async {
+    await assertErrorsInCode(
+      '''
+import 'dart:async';
+
+FutureOr<Stream<int>?> f() async* {
+  yield 3.14;
+  yield '2';
+  yield Future<int>.value(0);
+}
+''',
+      [
+        error(diag.yieldOfInvalidType, 66, 4),
+        error(diag.yieldOfInvalidType, 80, 3),
+        error(diag.yieldOfInvalidType, 93, 20),
+      ],
+    );
+  }
+
   test_none_syncStar_dynamic_to_iterableInt() async {
     await assertNoErrorsInCode('''
 Iterable<int> f(dynamic a) sync* {
@@ -201,6 +220,25 @@
 ''');
   }
 
+  test_none_syncStar_to_futureOrNullableIterable() async {
+    await assertErrorsInCode(
+      '''
+import 'dart:async';
+
+FutureOr<Iterable<int>?> f() sync* {
+  yield 3.14;
+  yield '2';
+  yield Future<int>.value(0);
+}
+''',
+      [
+        error(diag.yieldOfInvalidType, 67, 4),
+        error(diag.yieldOfInvalidType, 81, 3),
+        error(diag.yieldOfInvalidType, 94, 20),
+      ],
+    );
+  }
+
   test_star_asyncStar_dynamic_to_dynamic() async {
     await assertNoErrorsInCode('''
 f() async* {
diff --git a/pkg/analyzer/test/src/summary/elements/class_test.dart b/pkg/analyzer/test/src/summary/elements/class_test.dart
index fefa31f..16cfa3a 100644
--- a/pkg/analyzer/test/src/summary/elements/class_test.dart
+++ b/pkg/analyzer/test/src/summary/elements/class_test.dart
@@ -209,6 +209,7 @@
     var library = await buildLibrary(r'''
 part 'a1.dart';
 part 'a2.dart';
+
 class A {}
 ''');
 
@@ -229,11 +230,11 @@
           partKeywordOffset: 16
           unit: #F2
       classes
-        #F3 class A (nameOffset:38) (firstTokenOffset:32) (offset:38)
+        #F3 class A (nameOffset:39) (firstTokenOffset:33) (offset:39)
           element: <testLibrary>::@class::A
           nextFragment: #F4
           constructors
-            #F5 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:38)
+            #F5 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:39)
               element: <testLibrary>::@class::A::@constructor::new
               typeName: A
     #F1 package:test/a1.dart
@@ -500,6 +501,7 @@
   test_class_cycle_interfaces() async {
     var library = await buildLibrary(r'''
 class A implements B {}
+
 class B implements A {}
 ''');
     checkElementText(library, r'''
@@ -515,10 +517,10 @@
             #F2 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:6)
               element: <testLibrary>::@class::A::@constructor::new
               typeName: A
-        #F3 class B (nameOffset:30) (firstTokenOffset:24) (offset:30)
+        #F3 class B (nameOffset:31) (firstTokenOffset:25) (offset:31)
           element: <testLibrary>::@class::B
           constructors
-            #F4 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:30)
+            #F4 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:31)
               element: <testLibrary>::@class::B::@constructor::new
               typeName: B
   classes
@@ -542,6 +544,7 @@
   test_class_cycle_mixins() async {
     var library = await buildLibrary(r'''
 class A with B {}
+
 class B with A {}
 ''');
     checkElementText(library, r'''
@@ -557,10 +560,10 @@
             #F2 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:6)
               element: <testLibrary>::@class::A::@constructor::new
               typeName: A
-        #F3 class B (nameOffset:24) (firstTokenOffset:18) (offset:24)
+        #F3 class B (nameOffset:25) (firstTokenOffset:19) (offset:25)
           element: <testLibrary>::@class::B
           constructors
-            #F4 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:24)
+            #F4 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:25)
               element: <testLibrary>::@class::B::@constructor::new
               typeName: B
   classes
@@ -584,6 +587,7 @@
   test_class_cycle_supertype() async {
     var library = await buildLibrary(r'''
 class A extends B {}
+
 class B extends A {}
 ''');
     checkElementText(library, r'''
@@ -599,10 +603,10 @@
             #F2 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:6)
               element: <testLibrary>::@class::A::@constructor::new
               typeName: A
-        #F3 hasExtendsClause class B (nameOffset:27) (firstTokenOffset:21) (offset:27)
+        #F3 hasExtendsClause class B (nameOffset:28) (firstTokenOffset:22) (offset:28)
           element: <testLibrary>::@class::B
           constructors
-            #F4 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:27)
+            #F4 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:28)
               element: <testLibrary>::@class::B::@constructor::new
               typeName: B
   classes
@@ -624,11 +628,12 @@
   }
 
   test_class_documented() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 /**
  * Docs
  */
-class C {}''');
+class C {}
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -655,7 +660,7 @@
   }
 
   test_class_documented_mix() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 /**
  * aaa
  */
@@ -774,11 +779,12 @@
   }
 
   test_class_documented_tripleSlash() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 /// first
 /// second
 /// third
-class C {}''');
+class C {}
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -805,14 +811,16 @@
   }
 
   test_class_documented_with_references() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 /**
  * Docs referring to [D] and [E]
  */
 class C {}
 
 class D {}
-class E {}''');
+
+class E {}
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -832,10 +840,10 @@
             #F4 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:59)
               element: <testLibrary>::@class::D::@constructor::new
               typeName: D
-        #F5 class E (nameOffset:70) (firstTokenOffset:64) (offset:70)
+        #F5 class E (nameOffset:71) (firstTokenOffset:65) (offset:71)
           element: <testLibrary>::@class::E
           constructors
-            #F6 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:70)
+            #F6 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:71)
               element: <testLibrary>::@class::E::@constructor::new
               typeName: E
   classes
@@ -865,7 +873,15 @@
   }
 
   test_class_documented_with_windows_line_endings() async {
-    var library = await buildLibrary('/**\r\n * Docs\r\n */\r\nclass C {}');
+    var library = await buildLibrary(
+      r'''
+/**
+ * Docs
+ */
+class C {}
+'''
+          .replaceAll('\n', '\r\n'),
+    );
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -892,12 +908,13 @@
   }
 
   test_class_documented_withLeadingNotDocumentation() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 // Extra comment so doc comment offset != 0
 /**
  * Docs
  */
-class C {}''');
+class C {}
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -924,7 +941,7 @@
   }
 
   test_class_documented_withMetadata() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 /// Comment 1
 /// Comment 2
 @Annotation()
@@ -1228,9 +1245,11 @@
   }
 
   test_class_interfaces() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class C implements D, E {}
+
 class D {}
+
 class E {}
 ''');
     checkElementText(library, r'''
@@ -1246,16 +1265,16 @@
             #F2 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:6)
               element: <testLibrary>::@class::C::@constructor::new
               typeName: C
-        #F3 class D (nameOffset:33) (firstTokenOffset:27) (offset:33)
+        #F3 class D (nameOffset:34) (firstTokenOffset:28) (offset:34)
           element: <testLibrary>::@class::D
           constructors
-            #F4 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:33)
+            #F4 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:34)
               element: <testLibrary>::@class::D::@constructor::new
               typeName: D
-        #F5 class E (nameOffset:44) (firstTokenOffset:38) (offset:44)
+        #F5 class E (nameOffset:46) (firstTokenOffset:40) (offset:46)
           element: <testLibrary>::@class::E
           constructors
-            #F6 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:44)
+            #F6 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:46)
               element: <testLibrary>::@class::E::@constructor::new
               typeName: E
   classes
@@ -1614,10 +1633,13 @@
   }
 
   test_class_interfaces_extensionType() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class A {}
+
 extension type B(int it) {}
+
 class C {}
+
 class D implements A, B, C {}
 ''');
     configuration.withConstructors = false;
@@ -1630,18 +1652,18 @@
       classes
         #F1 class A (nameOffset:6) (firstTokenOffset:0) (offset:6)
           element: <testLibrary>::@class::A
-        #F2 class C (nameOffset:45) (firstTokenOffset:39) (offset:45)
+        #F2 class C (nameOffset:47) (firstTokenOffset:41) (offset:47)
           element: <testLibrary>::@class::C
-        #F3 class D (nameOffset:56) (firstTokenOffset:50) (offset:56)
+        #F3 class D (nameOffset:59) (firstTokenOffset:53) (offset:59)
           element: <testLibrary>::@class::D
       extensionTypes
-        #F4 extension type B (nameOffset:26) (firstTokenOffset:11) (offset:26)
+        #F4 extension type B (nameOffset:27) (firstTokenOffset:12) (offset:27)
           element: <testLibrary>::@extensionType::B
           fields
-            #F5 isFinal isOriginDeclaringFormalParameter it (nameOffset:<null>) (firstTokenOffset:<null>) (offset:26)
+            #F5 isFinal isOriginDeclaringFormalParameter it (nameOffset:<null>) (firstTokenOffset:<null>) (offset:27)
               element: <testLibrary>::@extensionType::B::@field::it
           getters
-            #F6 isCompleteDeclaration isOriginVariable it (nameOffset:<null>) (firstTokenOffset:<null>) (offset:26)
+            #F6 isCompleteDeclaration isOriginVariable it (nameOffset:<null>) (firstTokenOffset:<null>) (offset:27)
               element: <testLibrary>::@extensionType::B::@getter::it
   classes
     isSimplyBounded class A
@@ -1680,9 +1702,11 @@
   }
 
   test_class_interfaces_Function() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class A {}
+
 class B {}
+
 class C implements A, Function, B {}
 ''');
     checkElementText(library, r'''
@@ -1698,16 +1722,16 @@
             #F2 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:6)
               element: <testLibrary>::@class::A::@constructor::new
               typeName: A
-        #F3 class B (nameOffset:17) (firstTokenOffset:11) (offset:17)
+        #F3 class B (nameOffset:18) (firstTokenOffset:12) (offset:18)
           element: <testLibrary>::@class::B
           constructors
-            #F4 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:17)
+            #F4 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:18)
               element: <testLibrary>::@class::B::@constructor::new
               typeName: B
-        #F5 class C (nameOffset:28) (firstTokenOffset:22) (offset:28)
+        #F5 class C (nameOffset:30) (firstTokenOffset:24) (offset:30)
           element: <testLibrary>::@class::C
           constructors
-            #F6 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:28)
+            #F6 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:30)
               element: <testLibrary>::@class::C::@constructor::new
               typeName: C
   classes
@@ -1741,6 +1765,7 @@
   test_class_interfaces_mixin() async {
     var library = await buildLibrary(r'''
 class A implements M {}
+
 mixin M {}
 ''');
 
@@ -1758,7 +1783,7 @@
               element: <testLibrary>::@class::A::@constructor::new
               typeName: A
       mixins
-        #F3 mixin M (nameOffset:30) (firstTokenOffset:24) (offset:30)
+        #F3 mixin M (nameOffset:31) (firstTokenOffset:25) (offset:31)
           element: <testLibrary>::@mixin::M
   classes
     isSimplyBounded class A
@@ -1780,9 +1805,13 @@
   }
 
   test_class_interfaces_unresolved() async {
-    var library = await buildLibrary(
-      'class C implements X, Y, Z {} class X {} class Z {}',
-    );
+    var library = await buildLibrary(r'''
+class C implements X, Y, Z {}
+
+class X {}
+
+class Z {}
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -1796,16 +1825,16 @@
             #F2 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:6)
               element: <testLibrary>::@class::C::@constructor::new
               typeName: C
-        #F3 class X (nameOffset:36) (firstTokenOffset:30) (offset:36)
+        #F3 class X (nameOffset:37) (firstTokenOffset:31) (offset:37)
           element: <testLibrary>::@class::X
           constructors
-            #F4 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:36)
+            #F4 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:37)
               element: <testLibrary>::@class::X::@constructor::new
               typeName: X
-        #F5 class Z (nameOffset:47) (firstTokenOffset:41) (offset:47)
+        #F5 class Z (nameOffset:49) (firstTokenOffset:43) (offset:49)
           element: <testLibrary>::@class::Z
           constructors
-            #F6 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:47)
+            #F6 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:49)
               element: <testLibrary>::@class::Z::@constructor::new
               typeName: Z
   classes
@@ -1837,7 +1866,7 @@
   }
 
   test_class_lazy_all_constructors() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class A {
   A.foo();
 }
@@ -1848,7 +1877,7 @@
   }
 
   test_class_lazy_all_fields() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class A {
   int foo = 0;
 }
@@ -1859,7 +1888,7 @@
   }
 
   test_class_lazy_all_getters() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class A {
   int foo = 0;
 }
@@ -1870,7 +1899,7 @@
   }
 
   test_class_lazy_all_methods() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class A {
   void foo() {}
 }
@@ -1881,7 +1910,7 @@
   }
 
   test_class_lazy_all_setters() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class A {
   int foo = 0;
 }
@@ -1892,7 +1921,7 @@
   }
 
   test_class_lazy_byReference_constructor() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class A {
   A.foo();
 }
@@ -1904,7 +1933,7 @@
   }
 
   test_class_lazy_byReference_field() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class A {
   int foo = 0;
 }
@@ -1916,7 +1945,7 @@
   }
 
   test_class_lazy_byReference_getter() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class A {
   int foo = 0;
 }
@@ -1928,7 +1957,7 @@
   }
 
   test_class_lazy_byReference_method() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class A {
   void foo() {}
 }
@@ -1940,7 +1969,7 @@
   }
 
   test_class_lazy_byReference_setter() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class A {
   int foo = 0;
 }
@@ -1983,11 +2012,15 @@
   }
 
   test_class_mixins() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class C extends D with E, F, G {}
+
 class D {}
+
 class E {}
+
 class F {}
+
 class G {}
 ''');
     checkElementText(library, r'''
@@ -2003,28 +2036,28 @@
             #F2 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:6)
               element: <testLibrary>::@class::C::@constructor::new
               typeName: C
-        #F3 class D (nameOffset:40) (firstTokenOffset:34) (offset:40)
+        #F3 class D (nameOffset:41) (firstTokenOffset:35) (offset:41)
           element: <testLibrary>::@class::D
           constructors
-            #F4 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:40)
+            #F4 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:41)
               element: <testLibrary>::@class::D::@constructor::new
               typeName: D
-        #F5 class E (nameOffset:51) (firstTokenOffset:45) (offset:51)
+        #F5 class E (nameOffset:53) (firstTokenOffset:47) (offset:53)
           element: <testLibrary>::@class::E
           constructors
-            #F6 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:51)
+            #F6 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:53)
               element: <testLibrary>::@class::E::@constructor::new
               typeName: E
-        #F7 class F (nameOffset:62) (firstTokenOffset:56) (offset:62)
+        #F7 class F (nameOffset:65) (firstTokenOffset:59) (offset:65)
           element: <testLibrary>::@class::F
           constructors
-            #F8 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:62)
+            #F8 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:65)
               element: <testLibrary>::@class::F::@constructor::new
               typeName: F
-        #F9 class G (nameOffset:73) (firstTokenOffset:67) (offset:73)
+        #F9 class G (nameOffset:77) (firstTokenOffset:71) (offset:77)
           element: <testLibrary>::@class::G
           constructors
-            #F10 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:73)
+            #F10 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:77)
               element: <testLibrary>::@class::G::@constructor::new
               typeName: G
   classes
@@ -2259,10 +2292,13 @@
   }
 
   test_class_mixins_extensionType() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 mixin A {}
+
 extension type B(int it) {}
+
 mixin C {}
+
 class D extends Object with A, B, C {}
 ''');
     configuration.withConstructors = false;
@@ -2273,21 +2309,21 @@
     #F0 <testLibraryFragment>
       element: <testLibrary>
       classes
-        #F1 hasExtendsClause class D (nameOffset:56) (firstTokenOffset:50) (offset:56)
+        #F1 hasExtendsClause class D (nameOffset:59) (firstTokenOffset:53) (offset:59)
           element: <testLibrary>::@class::D
       extensionTypes
-        #F2 extension type B (nameOffset:26) (firstTokenOffset:11) (offset:26)
+        #F2 extension type B (nameOffset:27) (firstTokenOffset:12) (offset:27)
           element: <testLibrary>::@extensionType::B
           fields
-            #F3 isFinal isOriginDeclaringFormalParameter it (nameOffset:<null>) (firstTokenOffset:<null>) (offset:26)
+            #F3 isFinal isOriginDeclaringFormalParameter it (nameOffset:<null>) (firstTokenOffset:<null>) (offset:27)
               element: <testLibrary>::@extensionType::B::@field::it
           getters
-            #F4 isCompleteDeclaration isOriginVariable it (nameOffset:<null>) (firstTokenOffset:<null>) (offset:26)
+            #F4 isCompleteDeclaration isOriginVariable it (nameOffset:<null>) (firstTokenOffset:<null>) (offset:27)
               element: <testLibrary>::@extensionType::B::@getter::it
       mixins
         #F5 mixin A (nameOffset:6) (firstTokenOffset:0) (offset:6)
           element: <testLibrary>::@mixin::A
-        #F6 mixin C (nameOffset:45) (firstTokenOffset:39) (offset:45)
+        #F6 mixin C (nameOffset:47) (firstTokenOffset:41) (offset:47)
           element: <testLibrary>::@mixin::C
   classes
     isSimplyBounded class D
@@ -2332,10 +2368,13 @@
   }
 
   test_class_mixins_generic() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class Z extends A with B<int>, C<double> {}
+
 class A {}
+
 class B<B1> {}
+
 class C<C1> {}
 ''');
     checkElementText(library, r'''
@@ -2351,28 +2390,28 @@
             #F2 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:6)
               element: <testLibrary>::@class::Z::@constructor::new
               typeName: Z
-        #F3 class A (nameOffset:50) (firstTokenOffset:44) (offset:50)
+        #F3 class A (nameOffset:51) (firstTokenOffset:45) (offset:51)
           element: <testLibrary>::@class::A
           constructors
-            #F4 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:50)
+            #F4 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:51)
               element: <testLibrary>::@class::A::@constructor::new
               typeName: A
-        #F5 class B (nameOffset:61) (firstTokenOffset:55) (offset:61)
+        #F5 class B (nameOffset:63) (firstTokenOffset:57) (offset:63)
           element: <testLibrary>::@class::B
           typeParameters
-            #F6 B1 (nameOffset:63) (firstTokenOffset:63) (offset:63)
+            #F6 B1 (nameOffset:65) (firstTokenOffset:65) (offset:65)
               element: #E0 B1
           constructors
-            #F7 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:61)
+            #F7 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:63)
               element: <testLibrary>::@class::B::@constructor::new
               typeName: B
-        #F8 class C (nameOffset:76) (firstTokenOffset:70) (offset:76)
+        #F8 class C (nameOffset:79) (firstTokenOffset:73) (offset:79)
           element: <testLibrary>::@class::C
           typeParameters
-            #F9 C1 (nameOffset:78) (firstTokenOffset:78) (offset:78)
+            #F9 C1 (nameOffset:81) (firstTokenOffset:81) (offset:81)
               element: #E1 C1
           constructors
-            #F10 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:76)
+            #F10 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:79)
               element: <testLibrary>::@class::C::@constructor::new
               typeName: C
   classes
@@ -2419,10 +2458,13 @@
   }
 
   test_class_mixins_generic_superAfter() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 mixin M<T extends num> {}
+
 mixin M2<T extends num> on M<T> {}
+
 class Z extends S with M2 {}
+
 class S with M<int> {}
 ''');
     checkElementText(library, r'''
@@ -2432,16 +2474,16 @@
     #F0 <testLibraryFragment>
       element: <testLibrary>
       classes
-        #F1 hasExtendsClause class Z (nameOffset:67) (firstTokenOffset:61) (offset:67)
+        #F1 hasExtendsClause class Z (nameOffset:69) (firstTokenOffset:63) (offset:69)
           element: <testLibrary>::@class::Z
           constructors
-            #F2 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:67)
+            #F2 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:69)
               element: <testLibrary>::@class::Z::@constructor::new
               typeName: Z
-        #F3 class S (nameOffset:96) (firstTokenOffset:90) (offset:96)
+        #F3 class S (nameOffset:99) (firstTokenOffset:93) (offset:99)
           element: <testLibrary>::@class::S
           constructors
-            #F4 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:96)
+            #F4 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:99)
               element: <testLibrary>::@class::S::@constructor::new
               typeName: S
       mixins
@@ -2450,10 +2492,10 @@
           typeParameters
             #F6 T (nameOffset:8) (firstTokenOffset:8) (offset:8)
               element: #E0 T
-        #F7 mixin M2 (nameOffset:32) (firstTokenOffset:26) (offset:32)
+        #F7 mixin M2 (nameOffset:33) (firstTokenOffset:27) (offset:33)
           element: <testLibrary>::@mixin::M2
           typeParameters
-            #F8 T (nameOffset:35) (firstTokenOffset:35) (offset:35)
+            #F8 T (nameOffset:36) (firstTokenOffset:36) (offset:36)
               element: #E1 T
   classes
     isSimplyBounded class Z
@@ -2500,8 +2542,9 @@
   }
 
   test_class_mixins_genericMixin_tooManyArguments() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 mixin M<T> {}
+
 class A extends Object with M<int, String> {}
 ''');
     checkElementText(library, r'''
@@ -2511,10 +2554,10 @@
     #F0 <testLibraryFragment>
       element: <testLibrary>
       classes
-        #F1 hasExtendsClause class A (nameOffset:20) (firstTokenOffset:14) (offset:20)
+        #F1 hasExtendsClause class A (nameOffset:21) (firstTokenOffset:15) (offset:21)
           element: <testLibrary>::@class::A
           constructors
-            #F2 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:20)
+            #F2 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:21)
               element: <testLibrary>::@class::A::@constructor::new
               typeName: A
       mixins
@@ -2547,9 +2590,11 @@
   }
 
   test_class_mixins_typeParameter() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 mixin M1 {}
+
 mixin M2 {}
+
 class A<T> extends Object with M1, T<int>, M2 {}
 ''');
     checkElementText(library, r'''
@@ -2559,19 +2604,19 @@
     #F0 <testLibraryFragment>
       element: <testLibrary>
       classes
-        #F1 hasExtendsClause class A (nameOffset:30) (firstTokenOffset:24) (offset:30)
+        #F1 hasExtendsClause class A (nameOffset:32) (firstTokenOffset:26) (offset:32)
           element: <testLibrary>::@class::A
           typeParameters
-            #F2 T (nameOffset:32) (firstTokenOffset:32) (offset:32)
+            #F2 T (nameOffset:34) (firstTokenOffset:34) (offset:34)
               element: #E0 T
           constructors
-            #F3 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:30)
+            #F3 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:32)
               element: <testLibrary>::@class::A::@constructor::new
               typeName: A
       mixins
         #F4 mixin M1 (nameOffset:6) (firstTokenOffset:0) (offset:6)
           element: <testLibrary>::@mixin::M1
-        #F5 mixin M2 (nameOffset:18) (firstTokenOffset:12) (offset:18)
+        #F5 mixin M2 (nameOffset:19) (firstTokenOffset:13) (offset:19)
           element: <testLibrary>::@mixin::M2
   classes
     isSimplyBounded class A
@@ -2603,9 +2648,13 @@
   }
 
   test_class_mixins_unresolved() async {
-    var library = await buildLibrary(
-      'class C extends Object with X, Y, Z {} class X {} class Z {}',
-    );
+    var library = await buildLibrary(r'''
+class C extends Object with X, Y, Z {}
+
+class X {}
+
+class Z {}
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -2619,16 +2668,16 @@
             #F2 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:6)
               element: <testLibrary>::@class::C::@constructor::new
               typeName: C
-        #F3 class X (nameOffset:45) (firstTokenOffset:39) (offset:45)
+        #F3 class X (nameOffset:46) (firstTokenOffset:40) (offset:46)
           element: <testLibrary>::@class::X
           constructors
-            #F4 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:45)
+            #F4 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:46)
               element: <testLibrary>::@class::X::@constructor::new
               typeName: X
-        #F5 class Z (nameOffset:56) (firstTokenOffset:50) (offset:56)
+        #F5 class Z (nameOffset:58) (firstTokenOffset:52) (offset:58)
           element: <testLibrary>::@class::Z
           constructors
-            #F6 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:56)
+            #F6 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:58)
               element: <testLibrary>::@class::Z::@constructor::new
               typeName: Z
   classes
@@ -2661,7 +2710,9 @@
   }
 
   test_class_modifiers_abstract() async {
-    var library = await buildLibrary('abstract class C {}');
+    var library = await buildLibrary(r'''
+abstract class C {}
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -2875,14 +2926,14 @@
     #F0 <testLibraryFragment>
       element: <testLibrary>
       classes
-        #F1 isAbstract isSealed class A (nameOffset:13) (firstTokenOffset:0) (offset:13)
+        #F1 isSealed class A (nameOffset:13) (firstTokenOffset:0) (offset:13)
           element: <testLibrary>::@class::A
           nextFragment: #F2
           constructors
             #F3 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:13)
               element: <testLibrary>::@class::A::@constructor::new
               typeName: A
-        #F2 isAbstract isAugmentation isSealed class A (nameOffset:40) (firstTokenOffset:19) (offset:40)
+        #F2 isAugmentation isSealed class A (nameOffset:40) (firstTokenOffset:19) (offset:40)
           element: <testLibrary>::@class::A
           previousFragment: #F1
   classes
@@ -2897,7 +2948,9 @@
   }
 
   test_class_modifiers_base() async {
-    var library = await buildLibrary('base class C {}');
+    var library = await buildLibrary(r'''
+base class C {}
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -2923,7 +2976,9 @@
   }
 
   test_class_modifiers_final() async {
-    var library = await buildLibrary('final class C {}');
+    var library = await buildLibrary(r'''
+final class C {}
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -2949,7 +3004,9 @@
   }
 
   test_class_modifiers_interface() async {
-    var library = await buildLibrary('interface class C {}');
+    var library = await buildLibrary(r'''
+interface class C {}
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -2975,7 +3032,9 @@
   }
 
   test_class_modifiers_mixin_class() async {
-    var library = await buildLibrary('mixin class C {}');
+    var library = await buildLibrary(r'''
+mixin class C {}
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -3001,7 +3060,9 @@
   }
 
   test_class_modifiers_sealed() async {
-    var library = await buildLibrary('sealed class C {}');
+    var library = await buildLibrary(r'''
+sealed class C {}
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -3009,7 +3070,7 @@
     #F0 <testLibraryFragment>
       element: <testLibrary>
       classes
-        #F1 isAbstract isSealed class C (nameOffset:13) (firstTokenOffset:0) (offset:13)
+        #F1 isSealed class C (nameOffset:13) (firstTokenOffset:0) (offset:13)
           element: <testLibrary>::@class::C
           constructors
             #F2 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:13)
@@ -3027,9 +3088,11 @@
   }
 
   test_class_modifiers_sealed_induced_base_extends_base() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 base class A {}
-sealed class B extends A {}''');
+
+sealed class B extends A {}
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -3043,10 +3106,10 @@
             #F2 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:11)
               element: <testLibrary>::@class::A::@constructor::new
               typeName: A
-        #F3 hasExtendsClause isAbstract isSealed class B (nameOffset:29) (firstTokenOffset:16) (offset:29)
+        #F3 hasExtendsClause isSealed class B (nameOffset:30) (firstTokenOffset:17) (offset:30)
           element: <testLibrary>::@class::B
           constructors
-            #F4 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:29)
+            #F4 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:30)
               element: <testLibrary>::@class::B::@constructor::new
               typeName: B
   classes
@@ -3070,9 +3133,11 @@
   }
 
   test_class_modifiers_sealed_induced_base_implements_base() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 base class A {}
-sealed class B implements A {}''');
+
+sealed class B implements A {}
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -3086,10 +3151,10 @@
             #F2 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:11)
               element: <testLibrary>::@class::A::@constructor::new
               typeName: A
-        #F3 isAbstract isSealed class B (nameOffset:29) (firstTokenOffset:16) (offset:29)
+        #F3 isSealed class B (nameOffset:30) (firstTokenOffset:17) (offset:30)
           element: <testLibrary>::@class::B
           constructors
-            #F4 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:29)
+            #F4 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:30)
               element: <testLibrary>::@class::B::@constructor::new
               typeName: B
   classes
@@ -3113,9 +3178,11 @@
   }
 
   test_class_modifiers_sealed_induced_base_implements_final() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 final class A {}
-sealed class B implements A {}''');
+
+sealed class B implements A {}
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -3129,10 +3196,10 @@
             #F2 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:12)
               element: <testLibrary>::@class::A::@constructor::new
               typeName: A
-        #F3 isAbstract isSealed class B (nameOffset:30) (firstTokenOffset:17) (offset:30)
+        #F3 isSealed class B (nameOffset:31) (firstTokenOffset:18) (offset:31)
           element: <testLibrary>::@class::B
           constructors
-            #F4 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:30)
+            #F4 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:31)
               element: <testLibrary>::@class::B::@constructor::new
               typeName: B
   classes
@@ -3156,9 +3223,11 @@
   }
 
   test_class_modifiers_sealed_induced_final_extends_final() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 final class A {}
-sealed class B extends A {}''');
+
+sealed class B extends A {}
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -3172,10 +3241,10 @@
             #F2 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:12)
               element: <testLibrary>::@class::A::@constructor::new
               typeName: A
-        #F3 hasExtendsClause isAbstract isSealed class B (nameOffset:30) (firstTokenOffset:17) (offset:30)
+        #F3 hasExtendsClause isSealed class B (nameOffset:31) (firstTokenOffset:18) (offset:31)
           element: <testLibrary>::@class::B
           constructors
-            #F4 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:30)
+            #F4 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:31)
               element: <testLibrary>::@class::B::@constructor::new
               typeName: B
   classes
@@ -3199,10 +3268,13 @@
   }
 
   test_class_modifiers_sealed_induced_final_with_base_mixin() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 base mixin A {}
+
 interface class B {}
-sealed class C extends B with A {}''');
+
+sealed class C extends B with A {}
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -3210,16 +3282,16 @@
     #F0 <testLibraryFragment>
       element: <testLibrary>
       classes
-        #F1 isInterface class B (nameOffset:32) (firstTokenOffset:16) (offset:32)
+        #F1 isInterface class B (nameOffset:33) (firstTokenOffset:17) (offset:33)
           element: <testLibrary>::@class::B
           constructors
-            #F2 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:32)
+            #F2 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:33)
               element: <testLibrary>::@class::B::@constructor::new
               typeName: B
-        #F3 hasExtendsClause isAbstract isSealed class C (nameOffset:50) (firstTokenOffset:37) (offset:50)
+        #F3 hasExtendsClause isSealed class C (nameOffset:52) (firstTokenOffset:39) (offset:52)
           element: <testLibrary>::@class::C
           constructors
-            #F4 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:50)
+            #F4 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:52)
               element: <testLibrary>::@class::C::@constructor::new
               typeName: C
       mixins
@@ -3254,9 +3326,11 @@
   }
 
   test_class_modifiers_sealed_induced_interface_extends_interface() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 interface class A {}
-sealed class B extends A {}''');
+
+sealed class B extends A {}
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -3270,10 +3344,10 @@
             #F2 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:16)
               element: <testLibrary>::@class::A::@constructor::new
               typeName: A
-        #F3 hasExtendsClause isAbstract isSealed class B (nameOffset:34) (firstTokenOffset:21) (offset:34)
+        #F3 hasExtendsClause isSealed class B (nameOffset:35) (firstTokenOffset:22) (offset:35)
           element: <testLibrary>::@class::B
           constructors
-            #F4 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:34)
+            #F4 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:35)
               element: <testLibrary>::@class::B::@constructor::new
               typeName: B
   classes
@@ -3297,9 +3371,11 @@
   }
 
   test_class_modifiers_sealed_induced_none_implements_interface() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 interface class A {}
-sealed class B implements A {}''');
+
+sealed class B implements A {}
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -3313,10 +3389,10 @@
             #F2 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:16)
               element: <testLibrary>::@class::A::@constructor::new
               typeName: A
-        #F3 isAbstract isSealed class B (nameOffset:34) (firstTokenOffset:21) (offset:34)
+        #F3 isSealed class B (nameOffset:35) (firstTokenOffset:22) (offset:35)
           element: <testLibrary>::@class::B
           constructors
-            #F4 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:34)
+            #F4 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:35)
               element: <testLibrary>::@class::B::@constructor::new
               typeName: B
   classes
@@ -3387,8 +3463,9 @@
   }
 
   test_class_notSimplyBounded_circularity_via_typeAlias_recordType() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class C<T extends A> {}
+
 typedef A = (C, int);
 ''');
     checkElementText(library, r'''
@@ -3408,7 +3485,7 @@
               element: <testLibrary>::@class::C::@constructor::new
               typeName: C
       typeAliases
-        #F4 A (nameOffset:32) (firstTokenOffset:24) (offset:32)
+        #F4 A (nameOffset:33) (firstTokenOffset:25) (offset:33)
           element: <testLibrary>::@typeAlias::A
   classes
     class C
@@ -3433,8 +3510,9 @@
   test_class_notSimplyBounded_circularity_via_typedef() async {
     // C's type parameter T is not simply bounded because its bound, F, expands
     // to `dynamic F(C)`, which refers to C.
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class C<T extends F> {}
+
 typedef F(C value);
 ''');
     checkElementText(library, r'''
@@ -3454,7 +3532,7 @@
               element: <testLibrary>::@class::C::@constructor::new
               typeName: C
       typeAliases
-        #F4 F (nameOffset:32) (firstTokenOffset:24) (offset:32)
+        #F4 F (nameOffset:33) (firstTokenOffset:25) (offset:33)
           element: <testLibrary>::@typeAlias::F
   classes
     class C
@@ -3479,7 +3557,7 @@
   test_class_notSimplyBounded_circularity_with_typeParameters() async {
     // C's type parameter T is simply bounded because even though it refers to
     // C, it specifies a bound.
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class C<T extends C<dynamic>> {}
 ''');
     checkElementText(library, r'''
@@ -3514,8 +3592,9 @@
   }
 
   test_class_notSimplyBounded_complex_by_cycle_class() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class C<T extends D> {}
+
 class D<T extends C> {}
 ''');
     checkElementText(library, r'''
@@ -3534,13 +3613,13 @@
             #F3 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:6)
               element: <testLibrary>::@class::C::@constructor::new
               typeName: C
-        #F4 class D (nameOffset:30) (firstTokenOffset:24) (offset:30)
+        #F4 class D (nameOffset:31) (firstTokenOffset:25) (offset:31)
           element: <testLibrary>::@class::D
           typeParameters
-            #F5 T (nameOffset:32) (firstTokenOffset:32) (offset:32)
+            #F5 T (nameOffset:33) (firstTokenOffset:33) (offset:33)
               element: #E1 T
           constructors
-            #F6 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:30)
+            #F6 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:31)
               element: <testLibrary>::@class::D::@constructor::new
               typeName: D
   classes
@@ -3570,7 +3649,7 @@
   }
 
   test_class_notSimplyBounded_complex_by_cycle_typedef_functionType() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 typedef C<T extends D> = void Function();
 typedef D<T extends C> = void Function();
 ''');
@@ -3612,7 +3691,7 @@
   }
 
   test_class_notSimplyBounded_complex_by_cycle_typedef_interfaceType() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 typedef C<T extends D> = List<T>;
 typedef D<T extends C> = List<T>;
 ''');
@@ -3654,8 +3733,9 @@
   }
 
   test_class_notSimplyBounded_complex_by_reference_to_cycle() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class C<T extends D> {}
+
 class D<T extends D> {}
 ''');
     checkElementText(library, r'''
@@ -3674,13 +3754,13 @@
             #F3 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:6)
               element: <testLibrary>::@class::C::@constructor::new
               typeName: C
-        #F4 class D (nameOffset:30) (firstTokenOffset:24) (offset:30)
+        #F4 class D (nameOffset:31) (firstTokenOffset:25) (offset:31)
           element: <testLibrary>::@class::D
           typeParameters
-            #F5 T (nameOffset:32) (firstTokenOffset:32) (offset:32)
+            #F5 T (nameOffset:33) (firstTokenOffset:33) (offset:33)
               element: #E1 T
           constructors
-            #F6 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:30)
+            #F6 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:31)
               element: <testLibrary>::@class::D::@constructor::new
               typeName: D
   classes
@@ -3710,8 +3790,9 @@
   }
 
   test_class_notSimplyBounded_complex_by_use_of_typeParameter() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class C<T extends D<T>> {}
+
 class D<T> {}
 ''');
     checkElementText(library, r'''
@@ -3730,13 +3811,13 @@
             #F3 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:6)
               element: <testLibrary>::@class::C::@constructor::new
               typeName: C
-        #F4 class D (nameOffset:33) (firstTokenOffset:27) (offset:33)
+        #F4 class D (nameOffset:34) (firstTokenOffset:28) (offset:34)
           element: <testLibrary>::@class::D
           typeParameters
-            #F5 T (nameOffset:35) (firstTokenOffset:35) (offset:35)
+            #F5 T (nameOffset:36) (firstTokenOffset:36) (offset:36)
               element: #E1 T
           constructors
-            #F6 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:33)
+            #F6 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:34)
               element: <testLibrary>::@class::D::@constructor::new
               typeName: D
   classes
@@ -3767,8 +3848,9 @@
   test_class_notSimplyBounded_dependency_with_typeParameters() async {
     // C's type parameter T is simply bounded because even though it refers to
     // non-simply-bounded type D, it specifies a bound.
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class C<T extends D<dynamic>> {}
+
 class D<T extends D<T>> {}
 ''');
     checkElementText(library, r'''
@@ -3787,13 +3869,13 @@
             #F3 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:6)
               element: <testLibrary>::@class::C::@constructor::new
               typeName: C
-        #F4 class D (nameOffset:39) (firstTokenOffset:33) (offset:39)
+        #F4 class D (nameOffset:40) (firstTokenOffset:34) (offset:40)
           element: <testLibrary>::@class::D
           typeParameters
-            #F5 T (nameOffset:41) (firstTokenOffset:41) (offset:41)
+            #F5 T (nameOffset:42) (firstTokenOffset:42) (offset:42)
               element: #E1 T
           constructors
-            #F6 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:39)
+            #F6 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:40)
               element: <testLibrary>::@class::D::@constructor::new
               typeName: D
   classes
@@ -3823,7 +3905,7 @@
   }
 
   test_class_notSimplyBounded_function_typed_bound_complex_via_formalParameterType() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class C<T extends void Function(T)> {}
 ''');
     checkElementText(library, r'''
@@ -3858,7 +3940,7 @@
   }
 
   test_class_notSimplyBounded_function_typed_bound_complex_via_return_type() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class C<T extends T Function()> {}
 ''');
     checkElementText(library, r'''
@@ -3893,7 +3975,7 @@
   }
 
   test_class_notSimplyBounded_function_typed_bound_simple() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class C<T extends void Function()> {}
 ''');
     checkElementText(library, r'''
@@ -3931,8 +4013,9 @@
     // C's type parameter T has a bound of F, which is a circular typedef.  This
     // is illegal in Dart, but we need to make sure it doesn't lead to a crash
     // or infinite loop.
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class C<T extends F> {}
+
 typedef F(G value);
 typedef G(F value);
 ''');
@@ -3953,9 +4036,9 @@
               element: <testLibrary>::@class::C::@constructor::new
               typeName: C
       typeAliases
-        #F4 F (nameOffset:32) (firstTokenOffset:24) (offset:32)
+        #F4 F (nameOffset:33) (firstTokenOffset:25) (offset:33)
           element: <testLibrary>::@typeAlias::F
-        #F5 G (nameOffset:52) (firstTokenOffset:44) (offset:52)
+        #F5 G (nameOffset:53) (firstTokenOffset:45) (offset:53)
           element: <testLibrary>::@typeAlias::G
   classes
     class C
@@ -3982,7 +4065,7 @@
   }
 
   test_class_notSimplyBounded_self() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class C<T extends C> {}
 ''');
     checkElementText(library, r'''
@@ -4019,7 +4102,7 @@
   test_class_notSimplyBounded_simple_because_non_generic() async {
     // If no type parameters are specified, then the class is simply bounded, so
     // there is no reason to assign it a slot.
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class C {}
 ''');
     checkElementText(library, r'''
@@ -4047,8 +4130,9 @@
   }
 
   test_class_notSimplyBounded_simple_by_lack_of_cycles() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class C<T extends D> {}
+
 class D<T> {}
 ''');
     checkElementText(library, r'''
@@ -4067,13 +4151,13 @@
             #F3 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:6)
               element: <testLibrary>::@class::C::@constructor::new
               typeName: C
-        #F4 class D (nameOffset:30) (firstTokenOffset:24) (offset:30)
+        #F4 class D (nameOffset:31) (firstTokenOffset:25) (offset:31)
           element: <testLibrary>::@class::D
           typeParameters
-            #F5 T (nameOffset:32) (firstTokenOffset:32) (offset:32)
+            #F5 T (nameOffset:33) (firstTokenOffset:33) (offset:33)
               element: #E1 T
           constructors
-            #F6 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:30)
+            #F6 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:31)
               element: <testLibrary>::@class::D::@constructor::new
               typeName: D
   classes
@@ -4104,7 +4188,7 @@
   test_class_notSimplyBounded_simple_by_syntax() async {
     // If no bounds are specified, then the class is simply bounded by syntax
     // alone, so there is no reason to assign it a slot.
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class C<T> {}
 ''');
     checkElementText(library, r'''
@@ -4138,73 +4222,10 @@
   }
 
   test_class_ref_nullability_none() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class C {}
-C c;
-''');
-    checkElementText(library, r'''
-library
-  reference: <testLibrary>
-  fragments
-    #F0 <testLibraryFragment>
-      element: <testLibrary>
-      classes
-        #F1 class C (nameOffset:6) (firstTokenOffset:0) (offset:6)
-          element: <testLibrary>::@class::C
-          constructors
-            #F2 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:6)
-              element: <testLibrary>::@class::C::@constructor::new
-              typeName: C
-      topLevelVariables
-        #F3 isOriginDeclaration isStatic c (nameOffset:13) (firstTokenOffset:13) (offset:13)
-          element: <testLibrary>::@topLevelVariable::c
-      getters
-        #F4 isCompleteDeclaration isOriginVariable isStatic c (nameOffset:<null>) (firstTokenOffset:<null>) (offset:13)
-          element: <testLibrary>::@getter::c
-      setters
-        #F5 isCompleteDeclaration isOriginVariable isStatic c (nameOffset:<null>) (firstTokenOffset:<null>) (offset:13)
-          element: <testLibrary>::@setter::c
-          formalParameters
-            #F6 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:13)
-              element: <testLibrary>::@setter::c::@formalParameter::value
-  classes
-    isSimplyBounded class C
-      reference: <testLibrary>::@class::C
-      firstFragment: #F1
-      constructors
-        isOriginImplicitDefault new
-          reference: <testLibrary>::@class::C::@constructor::new
-          firstFragment: #F2
-  topLevelVariables
-    isOriginDeclaration isStatic c
-      reference: <testLibrary>::@topLevelVariable::c
-      firstFragment: #F3
-      type: C
-      getter: <testLibrary>::@getter::c
-      setter: <testLibrary>::@setter::c
-  getters
-    isOriginVariable isStatic c
-      reference: <testLibrary>::@getter::c
-      firstFragment: #F4
-      returnType: C
-      variable: <testLibrary>::@topLevelVariable::c
-  setters
-    isOriginVariable isStatic c
-      reference: <testLibrary>::@setter::c
-      firstFragment: #F5
-      formalParameters
-        #E0 requiredPositional value
-          firstFragment: #F6
-          type: C
-      returnType: void
-      variable: <testLibrary>::@topLevelVariable::c
-''');
-  }
 
-  test_class_ref_nullability_question() async {
-    var library = await buildLibrary('''
-class C {}
-C? c;
+C c;
 ''');
     checkElementText(library, r'''
 library
@@ -4243,6 +4264,71 @@
     isOriginDeclaration isStatic c
       reference: <testLibrary>::@topLevelVariable::c
       firstFragment: #F3
+      type: C
+      getter: <testLibrary>::@getter::c
+      setter: <testLibrary>::@setter::c
+  getters
+    isOriginVariable isStatic c
+      reference: <testLibrary>::@getter::c
+      firstFragment: #F4
+      returnType: C
+      variable: <testLibrary>::@topLevelVariable::c
+  setters
+    isOriginVariable isStatic c
+      reference: <testLibrary>::@setter::c
+      firstFragment: #F5
+      formalParameters
+        #E0 requiredPositional value
+          firstFragment: #F6
+          type: C
+      returnType: void
+      variable: <testLibrary>::@topLevelVariable::c
+''');
+  }
+
+  test_class_ref_nullability_question() async {
+    var library = await buildLibrary(r'''
+class C {}
+
+C? c;
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  fragments
+    #F0 <testLibraryFragment>
+      element: <testLibrary>
+      classes
+        #F1 class C (nameOffset:6) (firstTokenOffset:0) (offset:6)
+          element: <testLibrary>::@class::C
+          constructors
+            #F2 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:6)
+              element: <testLibrary>::@class::C::@constructor::new
+              typeName: C
+      topLevelVariables
+        #F3 isOriginDeclaration isStatic c (nameOffset:15) (firstTokenOffset:15) (offset:15)
+          element: <testLibrary>::@topLevelVariable::c
+      getters
+        #F4 isCompleteDeclaration isOriginVariable isStatic c (nameOffset:<null>) (firstTokenOffset:<null>) (offset:15)
+          element: <testLibrary>::@getter::c
+      setters
+        #F5 isCompleteDeclaration isOriginVariable isStatic c (nameOffset:<null>) (firstTokenOffset:<null>) (offset:15)
+          element: <testLibrary>::@setter::c
+          formalParameters
+            #F6 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:15)
+              element: <testLibrary>::@setter::c::@formalParameter::value
+  classes
+    isSimplyBounded class C
+      reference: <testLibrary>::@class::C
+      firstFragment: #F1
+      constructors
+        isOriginImplicitDefault new
+          reference: <testLibrary>::@class::C::@constructor::new
+          firstFragment: #F2
+  topLevelVariables
+    isOriginDeclaration isStatic c
+      reference: <testLibrary>::@topLevelVariable::c
+      firstFragment: #F3
       type: C?
       getter: <testLibrary>::@getter::c
       setter: <testLibrary>::@setter::c
@@ -4266,8 +4352,9 @@
   }
 
   test_class_supertype() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class A {}
+
 class B extends A {}
 ''');
     configuration.withConstructors = false;
@@ -4280,7 +4367,7 @@
       classes
         #F1 class A (nameOffset:6) (firstTokenOffset:0) (offset:6)
           element: <testLibrary>::@class::A
-        #F2 hasExtendsClause class B (nameOffset:17) (firstTokenOffset:11) (offset:17)
+        #F2 hasExtendsClause class B (nameOffset:18) (firstTokenOffset:12) (offset:18)
           element: <testLibrary>::@class::B
   classes
     isSimplyBounded class A
@@ -4435,7 +4522,7 @@
   }
 
   test_class_supertype_dynamic() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class A extends dynamic {}
 ''');
     checkElementText(library, r'''
@@ -4463,8 +4550,9 @@
   }
 
   test_class_supertype_extensionType() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 extension type A(int it) {}
+
 class B extends A {}
 ''');
     configuration.withConstructors = false;
@@ -4475,7 +4563,7 @@
     #F0 <testLibraryFragment>
       element: <testLibrary>
       classes
-        #F1 hasExtendsClause class B (nameOffset:34) (firstTokenOffset:28) (offset:34)
+        #F1 hasExtendsClause class B (nameOffset:35) (firstTokenOffset:29) (offset:35)
           element: <testLibrary>::@class::B
       extensionTypes
         #F2 extension type A (nameOffset:15) (firstTokenOffset:0) (offset:15)
@@ -4514,8 +4602,9 @@
   }
 
   test_class_supertype_genericClass() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class C extends D<int, double> {}
+
 class D<T1, T2> {}
 ''');
     checkElementText(library, r'''
@@ -4531,15 +4620,15 @@
             #F2 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:6)
               element: <testLibrary>::@class::C::@constructor::new
               typeName: C
-        #F3 class D (nameOffset:40) (firstTokenOffset:34) (offset:40)
+        #F3 class D (nameOffset:41) (firstTokenOffset:35) (offset:41)
           element: <testLibrary>::@class::D
           typeParameters
-            #F4 T1 (nameOffset:42) (firstTokenOffset:42) (offset:42)
+            #F4 T1 (nameOffset:43) (firstTokenOffset:43) (offset:43)
               element: #E0 T1
-            #F5 T2 (nameOffset:46) (firstTokenOffset:46) (offset:46)
+            #F5 T2 (nameOffset:47) (firstTokenOffset:47) (offset:47)
               element: #E1 T2
           constructors
-            #F6 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:40)
+            #F6 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:41)
               element: <testLibrary>::@class::D::@constructor::new
               typeName: D
   classes
@@ -4570,8 +4659,9 @@
   }
 
   test_class_supertype_genericClass_tooManyArguments() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class A<T> {}
+
 class B extends A<int, String> {}
 ''');
     configuration.withConstructors = false;
@@ -4587,7 +4677,7 @@
           typeParameters
             #F2 T (nameOffset:8) (firstTokenOffset:8) (offset:8)
               element: #E0 T
-        #F3 hasExtendsClause class B (nameOffset:20) (firstTokenOffset:14) (offset:20)
+        #F3 hasExtendsClause class B (nameOffset:21) (firstTokenOffset:15) (offset:21)
           element: <testLibrary>::@class::B
   classes
     isSimplyBounded class A
@@ -4604,8 +4694,9 @@
   }
 
   test_class_supertype_typeArguments_self() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class A<T> {}
+
 class B extends A<B> {}
 ''');
     checkElementText(library, r'''
@@ -4624,10 +4715,10 @@
             #F3 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:6)
               element: <testLibrary>::@class::A::@constructor::new
               typeName: A
-        #F4 hasExtendsClause class B (nameOffset:20) (firstTokenOffset:14) (offset:20)
+        #F4 hasExtendsClause class B (nameOffset:21) (firstTokenOffset:15) (offset:21)
           element: <testLibrary>::@class::B
           constructors
-            #F5 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:20)
+            #F5 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:21)
               element: <testLibrary>::@class::B::@constructor::new
               typeName: B
   classes
@@ -4656,7 +4747,7 @@
   }
 
   test_class_supertype_typeParameter() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class A<T> extends T<int> {}
 ''');
     checkElementText(library, r'''
@@ -4690,7 +4781,9 @@
   }
 
   test_class_supertype_unresolved() async {
-    var library = await buildLibrary('class C extends D {}');
+    var library = await buildLibrary(r'''
+class C extends D {}
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -4716,7 +4809,9 @@
   }
 
   test_class_typeParameters() async {
-    var library = await buildLibrary('class C<T, U> {}');
+    var library = await buildLibrary(r'''
+class C<T, U> {}
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -5313,8 +5408,9 @@
   }
 
   test_class_typeParameters_bound() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class C<T extends Object, U extends D> {}
+
 class D {}
 ''');
     checkElementText(library, r'''
@@ -5335,10 +5431,10 @@
             #F4 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:6)
               element: <testLibrary>::@class::C::@constructor::new
               typeName: C
-        #F5 class D (nameOffset:48) (firstTokenOffset:42) (offset:48)
+        #F5 class D (nameOffset:49) (firstTokenOffset:43) (offset:49)
           element: <testLibrary>::@class::D
           constructors
-            #F6 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:48)
+            #F6 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:49)
               element: <testLibrary>::@class::D::@constructor::new
               typeName: D
   classes
@@ -5367,7 +5463,9 @@
   }
 
   test_class_typeParameters_cycle_1of1() async {
-    var library = await buildLibrary('class C<T extends T> {}');
+    var library = await buildLibrary(r'''
+class C<T extends T> {}
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -5978,7 +6076,9 @@
   }
 
   test_class_typeParameters_f_bound_complex() async {
-    var library = await buildLibrary('class C<T extends List<U>, U> {}');
+    var library = await buildLibrary(r'''
+class C<T extends List<U>, U> {}
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -6015,7 +6115,9 @@
   }
 
   test_class_typeParameters_f_bound_simple() async {
-    var library = await buildLibrary('class C<T extends U, U> {}');
+    var library = await buildLibrary(r'''
+class C<T extends U, U> {}
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -6090,7 +6192,9 @@
   }
 
   test_class_typeParameters_variance_contravariant() async {
-    var library = await buildLibrary('class C<in T> {}');
+    var library = await buildLibrary(r'''
+class C<in T> {}
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -6122,7 +6226,9 @@
   }
 
   test_class_typeParameters_variance_covariant() async {
-    var library = await buildLibrary('class C<out T> {}');
+    var library = await buildLibrary(r'''
+class C<out T> {}
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -6154,7 +6260,9 @@
   }
 
   test_class_typeParameters_variance_invariant() async {
-    var library = await buildLibrary('class C<inout T> {}');
+    var library = await buildLibrary(r'''
+class C<inout T> {}
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -6186,7 +6294,9 @@
   }
 
   test_class_typeParameters_variance_multiple() async {
-    var library = await buildLibrary('class C<inout T, in U, out V> {}');
+    var library = await buildLibrary(r'''
+class C<inout T, in U, out V> {}
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -6226,11 +6336,15 @@
   }
 
   test_classAlias() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class C = D with E, F, G;
+
 class D {}
+
 class E {}
+
 class F {}
+
 class G {}
 ''');
     checkElementText(library, r'''
@@ -6246,28 +6360,28 @@
             #F2 isOriginMixinApplication new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:6)
               element: <testLibrary>::@class::C::@constructor::new
               typeName: C
-        #F3 class D (nameOffset:32) (firstTokenOffset:26) (offset:32)
+        #F3 class D (nameOffset:33) (firstTokenOffset:27) (offset:33)
           element: <testLibrary>::@class::D
           constructors
-            #F4 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:32)
+            #F4 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:33)
               element: <testLibrary>::@class::D::@constructor::new
               typeName: D
-        #F5 class E (nameOffset:43) (firstTokenOffset:37) (offset:43)
+        #F5 class E (nameOffset:45) (firstTokenOffset:39) (offset:45)
           element: <testLibrary>::@class::E
           constructors
-            #F6 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:43)
+            #F6 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:45)
               element: <testLibrary>::@class::E::@constructor::new
               typeName: E
-        #F7 class F (nameOffset:54) (firstTokenOffset:48) (offset:54)
+        #F7 class F (nameOffset:57) (firstTokenOffset:51) (offset:57)
           element: <testLibrary>::@class::F
           constructors
-            #F8 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:54)
+            #F8 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:57)
               element: <testLibrary>::@class::F::@constructor::new
               typeName: F
-        #F9 class G (nameOffset:65) (firstTokenOffset:59) (offset:65)
+        #F9 class G (nameOffset:69) (firstTokenOffset:63) (offset:69)
           element: <testLibrary>::@class::G
           constructors
-            #F10 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:65)
+            #F10 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:69)
               element: <testLibrary>::@class::G::@constructor::new
               typeName: G
   classes
@@ -6323,9 +6437,11 @@
   }
 
   test_classAlias_abstract() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 abstract class C = D with E;
+
 class D {}
+
 class E {}
 ''');
     checkElementText(library, r'''
@@ -6341,16 +6457,16 @@
             #F2 isOriginMixinApplication new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:15)
               element: <testLibrary>::@class::C::@constructor::new
               typeName: C
-        #F3 class D (nameOffset:35) (firstTokenOffset:29) (offset:35)
+        #F3 class D (nameOffset:36) (firstTokenOffset:30) (offset:36)
           element: <testLibrary>::@class::D
           constructors
-            #F4 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:35)
+            #F4 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:36)
               element: <testLibrary>::@class::D::@constructor::new
               typeName: D
-        #F5 class E (nameOffset:46) (firstTokenOffset:40) (offset:46)
+        #F5 class E (nameOffset:48) (firstTokenOffset:42) (offset:48)
           element: <testLibrary>::@class::E
           constructors
-            #F6 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:46)
+            #F6 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:48)
               element: <testLibrary>::@class::E::@constructor::new
               typeName: E
   classes
@@ -6390,8 +6506,9 @@
   }
 
   test_classAlias_base() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 base class C = Object with M;
+
 mixin M {}
 ''');
     checkElementText(library, r'''
@@ -6408,7 +6525,7 @@
               element: <testLibrary>::@class::C::@constructor::new
               typeName: C
       mixins
-        #F3 mixin M (nameOffset:36) (firstTokenOffset:30) (offset:36)
+        #F3 mixin M (nameOffset:37) (firstTokenOffset:31) (offset:37)
           element: <testLibrary>::@mixin::M
   classes
     isBase isMixinApplication isSimplyBounded class C
@@ -6439,9 +6556,11 @@
 
   test_classAlias_constructors_beforeOtherProperties() async {
     // https://github.com/dart-lang/sdk/issues/57035
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 abstract mixin class A {}
+
 mixin M {}
+
 class X = A with M;
 ''');
 
@@ -6450,12 +6569,14 @@
   }
 
   test_classAlias_constructors_chain_backward() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class A {
   A.named();
 }
+
 class C = B with M;
 class B = A with M;
+
 mixin M {}
 ''');
     checkElementText(library, r'''
@@ -6473,20 +6594,20 @@
               typeName: A
               typeNameOffset: 12
               periodOffset: 13
-        #F3 isMixinApplication class C (nameOffset:31) (firstTokenOffset:25) (offset:31)
+        #F3 isMixinApplication class C (nameOffset:32) (firstTokenOffset:26) (offset:32)
           element: <testLibrary>::@class::C
           constructors
-            #F4 isOriginMixinApplication named (nameOffset:<null>) (firstTokenOffset:<null>) (offset:31)
+            #F4 isOriginMixinApplication named (nameOffset:<null>) (firstTokenOffset:<null>) (offset:32)
               element: <testLibrary>::@class::C::@constructor::named
               typeName: C
-        #F5 isMixinApplication class B (nameOffset:51) (firstTokenOffset:45) (offset:51)
+        #F5 isMixinApplication class B (nameOffset:52) (firstTokenOffset:46) (offset:52)
           element: <testLibrary>::@class::B
           constructors
-            #F6 isOriginMixinApplication named (nameOffset:<null>) (firstTokenOffset:<null>) (offset:51)
+            #F6 isOriginMixinApplication named (nameOffset:<null>) (firstTokenOffset:<null>) (offset:52)
               element: <testLibrary>::@class::B::@constructor::named
               typeName: B
       mixins
-        #F7 mixin M (nameOffset:71) (firstTokenOffset:65) (offset:71)
+        #F7 mixin M (nameOffset:73) (firstTokenOffset:67) (offset:73)
           element: <testLibrary>::@mixin::M
   classes
     isSimplyBounded class A
@@ -6552,12 +6673,14 @@
   }
 
   test_classAlias_constructors_chain_forward() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class A {
   A.named();
 }
+
 class B = A with M;
 class C = B with M;
+
 mixin M {}
 ''');
     checkElementText(library, r'''
@@ -6575,20 +6698,20 @@
               typeName: A
               typeNameOffset: 12
               periodOffset: 13
-        #F3 isMixinApplication class B (nameOffset:31) (firstTokenOffset:25) (offset:31)
+        #F3 isMixinApplication class B (nameOffset:32) (firstTokenOffset:26) (offset:32)
           element: <testLibrary>::@class::B
           constructors
-            #F4 isOriginMixinApplication named (nameOffset:<null>) (firstTokenOffset:<null>) (offset:31)
+            #F4 isOriginMixinApplication named (nameOffset:<null>) (firstTokenOffset:<null>) (offset:32)
               element: <testLibrary>::@class::B::@constructor::named
               typeName: B
-        #F5 isMixinApplication class C (nameOffset:51) (firstTokenOffset:45) (offset:51)
+        #F5 isMixinApplication class C (nameOffset:52) (firstTokenOffset:46) (offset:52)
           element: <testLibrary>::@class::C
           constructors
-            #F6 isOriginMixinApplication named (nameOffset:<null>) (firstTokenOffset:<null>) (offset:51)
+            #F6 isOriginMixinApplication named (nameOffset:<null>) (firstTokenOffset:<null>) (offset:52)
               element: <testLibrary>::@class::C::@constructor::named
               typeName: C
       mixins
-        #F7 mixin M (nameOffset:71) (firstTokenOffset:65) (offset:71)
+        #F7 mixin M (nameOffset:73) (firstTokenOffset:67) (offset:73)
           element: <testLibrary>::@mixin::M
   classes
     isSimplyBounded class A
@@ -6654,9 +6777,11 @@
   }
 
   test_classAlias_constructors_default() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class A {}
+
 mixin class M {}
+
 class X = A with M;
 ''');
     checkElementText(library, r'''
@@ -6672,16 +6797,16 @@
             #F2 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:6)
               element: <testLibrary>::@class::A::@constructor::new
               typeName: A
-        #F3 isMixinClass class M (nameOffset:23) (firstTokenOffset:11) (offset:23)
+        #F3 isMixinClass class M (nameOffset:24) (firstTokenOffset:12) (offset:24)
           element: <testLibrary>::@class::M
           constructors
-            #F4 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:23)
+            #F4 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:24)
               element: <testLibrary>::@class::M::@constructor::new
               typeName: M
-        #F5 isMixinApplication class X (nameOffset:34) (firstTokenOffset:28) (offset:34)
+        #F5 isMixinApplication class X (nameOffset:36) (firstTokenOffset:30) (offset:36)
           element: <testLibrary>::@class::X
           constructors
-            #F6 isOriginMixinApplication new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:34)
+            #F6 isOriginMixinApplication new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:36)
               element: <testLibrary>::@class::X::@constructor::new
               typeName: X
   classes
@@ -6721,11 +6846,13 @@
   }
 
   test_classAlias_constructors_dependencies() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class A {
   A(int i);
 }
+
 mixin class M1 {}
+
 mixin class M2 {}
 
 class C2 = C1 with M2;
@@ -6748,35 +6875,35 @@
               formalParameters
                 #F3 requiredPositional isOriginDeclaration i (nameOffset:18) (firstTokenOffset:14) (offset:18)
                   element: <testLibrary>::@class::A::@constructor::new::@formalParameter::i
-        #F4 isMixinClass class M1 (nameOffset:36) (firstTokenOffset:24) (offset:36)
+        #F4 isMixinClass class M1 (nameOffset:37) (firstTokenOffset:25) (offset:37)
           element: <testLibrary>::@class::M1
           constructors
-            #F5 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:36)
+            #F5 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:37)
               element: <testLibrary>::@class::M1::@constructor::new
               typeName: M1
-        #F6 isMixinClass class M2 (nameOffset:54) (firstTokenOffset:42) (offset:54)
+        #F6 isMixinClass class M2 (nameOffset:56) (firstTokenOffset:44) (offset:56)
           element: <testLibrary>::@class::M2
           constructors
-            #F7 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:54)
+            #F7 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:56)
               element: <testLibrary>::@class::M2::@constructor::new
               typeName: M2
-        #F8 isMixinApplication class C2 (nameOffset:67) (firstTokenOffset:61) (offset:67)
+        #F8 isMixinApplication class C2 (nameOffset:69) (firstTokenOffset:63) (offset:69)
           element: <testLibrary>::@class::C2
           constructors
-            #F9 isOriginMixinApplication new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:67)
+            #F9 isOriginMixinApplication new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:69)
               element: <testLibrary>::@class::C2::@constructor::new
               typeName: C2
               formalParameters
-                #F10 requiredPositional isOriginMixinApplicationClassConstructor i (nameOffset:<null>) (firstTokenOffset:<null>) (offset:67)
+                #F10 requiredPositional isOriginMixinApplicationClassConstructor i (nameOffset:<null>) (firstTokenOffset:<null>) (offset:69)
                   element: <testLibrary>::@class::C2::@constructor::new::@formalParameter::i
-        #F11 isMixinApplication class C1 (nameOffset:90) (firstTokenOffset:84) (offset:90)
+        #F11 isMixinApplication class C1 (nameOffset:92) (firstTokenOffset:86) (offset:92)
           element: <testLibrary>::@class::C1
           constructors
-            #F12 isOriginMixinApplication new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:90)
+            #F12 isOriginMixinApplication new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:92)
               element: <testLibrary>::@class::C1::@constructor::new
               typeName: C1
               formalParameters
-                #F13 requiredPositional isOriginMixinApplicationClassConstructor i (nameOffset:<null>) (firstTokenOffset:<null>) (offset:90)
+                #F13 requiredPositional isOriginMixinApplicationClassConstructor i (nameOffset:<null>) (firstTokenOffset:<null>) (offset:92)
                   element: <testLibrary>::@class::C1::@constructor::new::@formalParameter::i
   classes
     isSimplyBounded class A
@@ -6862,7 +6989,7 @@
   }
 
   test_classAlias_constructors_optionalFormalParameters() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class A {
   A.c1(int a);
   A.c2(int a, [int? b, int c = 0]);
@@ -7138,8 +7265,9 @@
 class B = A with M;
 ''');
 
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 import 'a.dart';
+
 const x = B.named();
 ''');
     checkElementText(library, r'''
@@ -7151,27 +7279,27 @@
       libraryImports
         package:test/a.dart
       topLevelVariables
-        #F1 hasImplicitType hasInitializer isConst isOriginDeclaration isStatic x (nameOffset:23) (firstTokenOffset:23) (offset:23)
+        #F1 hasImplicitType hasInitializer isConst isOriginDeclaration isStatic x (nameOffset:24) (firstTokenOffset:24) (offset:24)
           element: <testLibrary>::@topLevelVariable::x
           initializer: expression_0
             InstanceCreationExpression
               constructorName: ConstructorName
                 type: NamedType
-                  name: B @27
+                  name: B @28
                   element: package:test/a.dart::@class::B
                   type: B
-                period: . @28
+                period: . @29
                 name: SimpleIdentifier
-                  token: named @29
+                  token: named @30
                   element: package:test/a.dart::@class::B::@constructor::named
                   staticType: null
                 element: package:test/a.dart::@class::B::@constructor::named
               argumentList: ArgumentList
-                leftParenthesis: ( @34
-                rightParenthesis: ) @35
+                leftParenthesis: ( @35
+                rightParenthesis: ) @36
               staticType: B
       getters
-        #F2 isCompleteDeclaration isOriginVariable isStatic x (nameOffset:<null>) (firstTokenOffset:<null>) (offset:23)
+        #F2 isCompleteDeclaration isOriginVariable isStatic x (nameOffset:<null>) (firstTokenOffset:<null>) (offset:24)
           element: <testLibrary>::@getter::x
   topLevelVariables
     hasImplicitType hasInitializer isConst isOriginDeclaration isStatic isTypeInferredFromInitializer x
@@ -7192,7 +7320,7 @@
   }
 
   test_classAlias_constructors_requiredFormalParameters() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class A<T extends num> {
   A(T x, T y);
 }
@@ -7309,13 +7437,14 @@
   }
 
   test_classAlias_documented() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 /**
  * Docs
  */
 class C = D with E;
 
 class D {}
+
 class E {}
 ''');
     checkElementText(library, r'''
@@ -7337,10 +7466,10 @@
             #F4 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:43)
               element: <testLibrary>::@class::D::@constructor::new
               typeName: D
-        #F5 class E (nameOffset:54) (firstTokenOffset:48) (offset:54)
+        #F5 class E (nameOffset:55) (firstTokenOffset:49) (offset:55)
           element: <testLibrary>::@class::E
           constructors
-            #F6 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:54)
+            #F6 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:55)
               element: <testLibrary>::@class::E::@constructor::new
               typeName: E
   classes
@@ -7381,13 +7510,14 @@
   }
 
   test_classAlias_documented_tripleSlash() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 /// aaa
 /// b
 /// cc
 class C = D with E;
 
 class D {}
+
 class E {}
 ''');
     checkElementText(library, r'''
@@ -7409,10 +7539,10 @@
             #F4 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:48)
               element: <testLibrary>::@class::D::@constructor::new
               typeName: D
-        #F5 class E (nameOffset:59) (firstTokenOffset:53) (offset:59)
+        #F5 class E (nameOffset:60) (firstTokenOffset:54) (offset:60)
           element: <testLibrary>::@class::E
           constructors
-            #F6 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:59)
+            #F6 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:60)
               element: <testLibrary>::@class::E::@constructor::new
               typeName: E
   classes
@@ -7453,7 +7583,7 @@
   }
 
   test_classAlias_documented_withLeadingNonDocumentation() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 // Extra comment so doc comment offset != 0
 /**
  * Docs
@@ -7461,7 +7591,9 @@
 class C = D with E;
 
 class D {}
-class E {}''');
+
+class E {}
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -7481,10 +7613,10 @@
             #F4 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:87)
               element: <testLibrary>::@class::D::@constructor::new
               typeName: D
-        #F5 class E (nameOffset:98) (firstTokenOffset:92) (offset:98)
+        #F5 class E (nameOffset:99) (firstTokenOffset:93) (offset:99)
           element: <testLibrary>::@class::E
           constructors
-            #F6 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:98)
+            #F6 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:99)
               element: <testLibrary>::@class::E::@constructor::new
               typeName: E
   classes
@@ -7525,8 +7657,9 @@
   }
 
   test_classAlias_final() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 final class C = Object with M;
+
 mixin M {}
 ''');
     checkElementText(library, r'''
@@ -7543,7 +7676,7 @@
               element: <testLibrary>::@class::C::@constructor::new
               typeName: C
       mixins
-        #F3 mixin M (nameOffset:37) (firstTokenOffset:31) (offset:37)
+        #F3 mixin M (nameOffset:38) (firstTokenOffset:32) (offset:38)
           element: <testLibrary>::@mixin::M
   classes
     isFinal isMixinApplication isSimplyBounded class C
@@ -7573,10 +7706,13 @@
   }
 
   test_classAlias_generic() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class Z = A with B<int>, C<double>;
+
 class A {}
+
 class B<B1> {}
+
 class C<C1> {}
 ''');
     checkElementText(library, r'''
@@ -7592,28 +7728,28 @@
             #F2 isOriginMixinApplication new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:6)
               element: <testLibrary>::@class::Z::@constructor::new
               typeName: Z
-        #F3 class A (nameOffset:42) (firstTokenOffset:36) (offset:42)
+        #F3 class A (nameOffset:43) (firstTokenOffset:37) (offset:43)
           element: <testLibrary>::@class::A
           constructors
-            #F4 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:42)
+            #F4 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:43)
               element: <testLibrary>::@class::A::@constructor::new
               typeName: A
-        #F5 class B (nameOffset:53) (firstTokenOffset:47) (offset:53)
+        #F5 class B (nameOffset:55) (firstTokenOffset:49) (offset:55)
           element: <testLibrary>::@class::B
           typeParameters
-            #F6 B1 (nameOffset:55) (firstTokenOffset:55) (offset:55)
+            #F6 B1 (nameOffset:57) (firstTokenOffset:57) (offset:57)
               element: #E0 B1
           constructors
-            #F7 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:53)
+            #F7 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:55)
               element: <testLibrary>::@class::B::@constructor::new
               typeName: B
-        #F8 class C (nameOffset:68) (firstTokenOffset:62) (offset:68)
+        #F8 class C (nameOffset:71) (firstTokenOffset:65) (offset:71)
           element: <testLibrary>::@class::C
           typeParameters
-            #F9 C1 (nameOffset:70) (firstTokenOffset:70) (offset:70)
+            #F9 C1 (nameOffset:73) (firstTokenOffset:73) (offset:73)
               element: #E1 C1
           constructors
-            #F10 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:68)
+            #F10 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:71)
               element: <testLibrary>::@class::C::@constructor::new
               typeName: C
   classes
@@ -7667,8 +7803,9 @@
   }
 
   test_classAlias_interface() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 interface class C = Object with M;
+
 mixin M {}
 ''');
     checkElementText(library, r'''
@@ -7685,7 +7822,7 @@
               element: <testLibrary>::@class::C::@constructor::new
               typeName: C
       mixins
-        #F3 mixin M (nameOffset:41) (firstTokenOffset:35) (offset:41)
+        #F3 mixin M (nameOffset:42) (firstTokenOffset:36) (offset:42)
           element: <testLibrary>::@mixin::M
   classes
     isInterface isMixinApplication isSimplyBounded class C
@@ -7720,8 +7857,9 @@
 mixin M {}
 ''');
 
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 import 'a.dart';
+
 class A = E with M;
 ''');
     checkElementText(library, r'''
@@ -7733,10 +7871,10 @@
       libraryImports
         package:test/a.dart
       classes
-        #F1 isMixinApplication class A (nameOffset:23) (firstTokenOffset:17) (offset:23)
+        #F1 isMixinApplication class A (nameOffset:24) (firstTokenOffset:18) (offset:24)
           element: <testLibrary>::@class::A
           constructors
-            #F2 isConst isOriginMixinApplication new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:23)
+            #F2 isConst isOriginMixinApplication new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:24)
               element: <testLibrary>::@class::A::@constructor::new
               typeName: A
   classes
@@ -7761,9 +7899,11 @@
   }
 
   test_classAlias_invalid_extendsMixin() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 mixin M1 {}
+
 mixin M2 {}
+
 class A = M1 with M2;
 ''');
     checkElementText(library, r'''
@@ -7773,16 +7913,16 @@
     #F0 <testLibraryFragment>
       element: <testLibrary>
       classes
-        #F1 isMixinApplication class A (nameOffset:30) (firstTokenOffset:24) (offset:30)
+        #F1 isMixinApplication class A (nameOffset:32) (firstTokenOffset:26) (offset:32)
           element: <testLibrary>::@class::A
           constructors
-            #F2 isConst isOriginMixinApplication new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:30)
+            #F2 isConst isOriginMixinApplication new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:32)
               element: <testLibrary>::@class::A::@constructor::new
               typeName: A
       mixins
         #F3 mixin M1 (nameOffset:6) (firstTokenOffset:0) (offset:6)
           element: <testLibrary>::@mixin::M1
-        #F4 mixin M2 (nameOffset:18) (firstTokenOffset:12) (offset:18)
+        #F4 mixin M2 (nameOffset:19) (firstTokenOffset:13) (offset:19)
           element: <testLibrary>::@mixin::M2
   classes
     isMixinApplication isSimplyBounded class A
@@ -7817,8 +7957,9 @@
   }
 
   test_classAlias_mixin_class() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 mixin class C = Object with M;
+
 mixin M {}
 ''');
     checkElementText(library, r'''
@@ -7835,7 +7976,7 @@
               element: <testLibrary>::@class::C::@constructor::new
               typeName: C
       mixins
-        #F3 mixin M (nameOffset:37) (firstTokenOffset:31) (offset:37)
+        #F3 mixin M (nameOffset:38) (firstTokenOffset:32) (offset:38)
           element: <testLibrary>::@mixin::M
   classes
     isMixinApplication isMixinClass isSimplyBounded class C
@@ -7865,9 +8006,11 @@
   }
 
   test_classAlias_notSimplyBounded_self() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class C<T extends C> = D with E;
+
 class D {}
+
 class E {}
 ''');
     checkElementText(library, r'''
@@ -7886,16 +8029,16 @@
             #F3 isOriginMixinApplication new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:6)
               element: <testLibrary>::@class::C::@constructor::new
               typeName: C
-        #F4 class D (nameOffset:39) (firstTokenOffset:33) (offset:39)
+        #F4 class D (nameOffset:40) (firstTokenOffset:34) (offset:40)
           element: <testLibrary>::@class::D
           constructors
-            #F5 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:39)
+            #F5 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:40)
               element: <testLibrary>::@class::D::@constructor::new
               typeName: D
-        #F6 class E (nameOffset:50) (firstTokenOffset:44) (offset:50)
+        #F6 class E (nameOffset:52) (firstTokenOffset:46) (offset:52)
           element: <testLibrary>::@class::E
           constructors
-            #F7 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:50)
+            #F7 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:52)
               element: <testLibrary>::@class::E::@constructor::new
               typeName: E
   classes
@@ -7941,9 +8084,11 @@
   test_classAlias_notSimplyBounded_simple_no_typeParameter_bound() async {
     // If no bounds are specified, then the class is simply bounded by syntax
     // alone, so there is no reason to assign it a slot.
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class C<T> = D with E;
+
 class D {}
+
 class E {}
 ''');
     checkElementText(library, r'''
@@ -7962,16 +8107,16 @@
             #F3 isOriginMixinApplication new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:6)
               element: <testLibrary>::@class::C::@constructor::new
               typeName: C
-        #F4 class D (nameOffset:29) (firstTokenOffset:23) (offset:29)
+        #F4 class D (nameOffset:30) (firstTokenOffset:24) (offset:30)
           element: <testLibrary>::@class::D
           constructors
-            #F5 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:29)
+            #F5 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:30)
               element: <testLibrary>::@class::D::@constructor::new
               typeName: D
-        #F6 class E (nameOffset:40) (firstTokenOffset:34) (offset:40)
+        #F6 class E (nameOffset:42) (firstTokenOffset:36) (offset:42)
           element: <testLibrary>::@class::E
           constructors
-            #F7 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:40)
+            #F7 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:42)
               element: <testLibrary>::@class::E::@constructor::new
               typeName: E
   classes
@@ -8016,9 +8161,11 @@
   test_classAlias_notSimplyBounded_simple_non_generic() async {
     // If no type parameters are specified, then the class is simply bounded, so
     // there is no reason to assign it a slot.
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class C = D with E;
+
 class D {}
+
 class E {}
 ''');
     checkElementText(library, r'''
@@ -8034,16 +8181,16 @@
             #F2 isOriginMixinApplication new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:6)
               element: <testLibrary>::@class::C::@constructor::new
               typeName: C
-        #F3 class D (nameOffset:26) (firstTokenOffset:20) (offset:26)
+        #F3 class D (nameOffset:27) (firstTokenOffset:21) (offset:27)
           element: <testLibrary>::@class::D
           constructors
-            #F4 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:26)
+            #F4 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:27)
               element: <testLibrary>::@class::D::@constructor::new
               typeName: D
-        #F5 class E (nameOffset:37) (firstTokenOffset:31) (offset:37)
+        #F5 class E (nameOffset:39) (firstTokenOffset:33) (offset:39)
           element: <testLibrary>::@class::E
           constructors
-            #F6 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:37)
+            #F6 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:39)
               element: <testLibrary>::@class::E::@constructor::new
               typeName: E
   classes
@@ -8083,8 +8230,9 @@
   }
 
   test_classAlias_sealed() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 sealed class C = Object with M;
+
 mixin M {}
 ''');
     checkElementText(library, r'''
@@ -8094,14 +8242,14 @@
     #F0 <testLibraryFragment>
       element: <testLibrary>
       classes
-        #F1 isAbstract isMixinApplication isSealed class C (nameOffset:13) (firstTokenOffset:0) (offset:13)
+        #F1 isMixinApplication isSealed class C (nameOffset:13) (firstTokenOffset:0) (offset:13)
           element: <testLibrary>::@class::C
           constructors
             #F2 isConst isOriginMixinApplication new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:13)
               element: <testLibrary>::@class::C::@constructor::new
               typeName: C
       mixins
-        #F3 mixin M (nameOffset:38) (firstTokenOffset:32) (offset:38)
+        #F3 mixin M (nameOffset:39) (firstTokenOffset:33) (offset:39)
           element: <testLibrary>::@mixin::M
   classes
     isAbstract isMixinApplication isSealed isSimplyBounded class C
@@ -8138,9 +8286,11 @@
   const Base.named();
 }
 ''');
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 import "a.dart";
+
 class M {}
+
 class MixinApp = Base with M;
 ''');
     checkElementText(library, r'''
@@ -8152,19 +8302,19 @@
       libraryImports
         package:test/a.dart
       classes
-        #F1 class M (nameOffset:23) (firstTokenOffset:17) (offset:23)
+        #F1 class M (nameOffset:24) (firstTokenOffset:18) (offset:24)
           element: <testLibrary>::@class::M
           constructors
-            #F2 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:23)
+            #F2 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:24)
               element: <testLibrary>::@class::M::@constructor::new
               typeName: M
-        #F3 isMixinApplication class MixinApp (nameOffset:34) (firstTokenOffset:28) (offset:34)
+        #F3 isMixinApplication class MixinApp (nameOffset:36) (firstTokenOffset:30) (offset:36)
           element: <testLibrary>::@class::MixinApp
           constructors
-            #F4 isConst isOriginMixinApplication new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:34)
+            #F4 isConst isOriginMixinApplication new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:36)
               element: <testLibrary>::@class::MixinApp::@constructor::new
               typeName: MixinApp
-            #F5 isConst isOriginMixinApplication named (nameOffset:<null>) (firstTokenOffset:<null>) (offset:34)
+            #F5 isConst isOriginMixinApplication named (nameOffset:<null>) (firstTokenOffset:<null>) (offset:36)
               element: <testLibrary>::@class::MixinApp::@constructor::named
               typeName: MixinApp
   classes
@@ -8212,6 +8362,246 @@
 ''');
   }
 
+  test_classAlias_with_const_constructors_mixinInstanceField() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+class Base {
+  const Base();
+  const Base.named();
+}
+''');
+    var library = await buildLibrary(r'''
+import "a.dart";
+
+mixin class M {
+  int x = 0;
+}
+
+class MixinApp = Base with M;
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  fragments
+    #F0 <testLibraryFragment>
+      element: <testLibrary>
+      libraryImports
+        package:test/a.dart
+      classes
+        #F1 isMixinClass class M (nameOffset:30) (firstTokenOffset:18) (offset:30)
+          element: <testLibrary>::@class::M
+          fields
+            #F2 hasInitializer isOriginDeclaration x (nameOffset:40) (firstTokenOffset:40) (offset:40)
+              element: <testLibrary>::@class::M::@field::x
+          constructors
+            #F3 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:30)
+              element: <testLibrary>::@class::M::@constructor::new
+              typeName: M
+          getters
+            #F4 isCompleteDeclaration isOriginVariable x (nameOffset:<null>) (firstTokenOffset:<null>) (offset:40)
+              element: <testLibrary>::@class::M::@getter::x
+          setters
+            #F5 isCompleteDeclaration isOriginVariable x (nameOffset:<null>) (firstTokenOffset:<null>) (offset:40)
+              element: <testLibrary>::@class::M::@setter::x
+              formalParameters
+                #F6 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:40)
+                  element: <testLibrary>::@class::M::@setter::x::@formalParameter::value
+        #F7 isMixinApplication class MixinApp (nameOffset:56) (firstTokenOffset:50) (offset:56)
+          element: <testLibrary>::@class::MixinApp
+          constructors
+            #F8 isOriginMixinApplication new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:56)
+              element: <testLibrary>::@class::MixinApp::@constructor::new
+              typeName: MixinApp
+            #F9 isOriginMixinApplication named (nameOffset:<null>) (firstTokenOffset:<null>) (offset:56)
+              element: <testLibrary>::@class::MixinApp::@constructor::named
+              typeName: MixinApp
+  classes
+    hasNonFinalField isMixinClass isSimplyBounded class M
+      reference: <testLibrary>::@class::M
+      firstFragment: #F1
+      fields
+        hasInitializer isOriginDeclaration x
+          reference: <testLibrary>::@class::M::@field::x
+          firstFragment: #F2
+          type: int
+          getter: <testLibrary>::@class::M::@getter::x
+          setter: <testLibrary>::@class::M::@setter::x
+      constructors
+        isOriginImplicitDefault new
+          reference: <testLibrary>::@class::M::@constructor::new
+          firstFragment: #F3
+      getters
+        isOriginVariable x
+          reference: <testLibrary>::@class::M::@getter::x
+          firstFragment: #F4
+          returnType: int
+          variable: <testLibrary>::@class::M::@field::x
+      setters
+        isOriginVariable x
+          reference: <testLibrary>::@class::M::@setter::x
+          firstFragment: #F5
+          formalParameters
+            #E0 requiredPositional value
+              firstFragment: #F6
+              type: int
+          returnType: void
+          variable: <testLibrary>::@class::M::@field::x
+    hasNonFinalField isMixinApplication isSimplyBounded class MixinApp
+      reference: <testLibrary>::@class::MixinApp
+      firstFragment: #F7
+      supertype: Base
+      mixins
+        M
+      constructors
+        isOriginMixinApplication new
+          reference: <testLibrary>::@class::MixinApp::@constructor::new
+          firstFragment: #F8
+          constantInitializers
+            SuperConstructorInvocation
+              superKeyword: super @0
+              argumentList: ArgumentList
+                leftParenthesis: ( @0
+                rightParenthesis: ) @0
+              element: package:test/a.dart::@class::Base::@constructor::new
+          superConstructor: package:test/a.dart::@class::Base::@constructor::new
+        isOriginMixinApplication named
+          reference: <testLibrary>::@class::MixinApp::@constructor::named
+          firstFragment: #F9
+          constantInitializers
+            SuperConstructorInvocation
+              superKeyword: super @0
+              period: . @0
+              constructorName: SimpleIdentifier
+                token: named @-1
+                element: package:test/a.dart::@class::Base::@constructor::named
+                staticType: null
+              argumentList: ArgumentList
+                leftParenthesis: ( @0
+                rightParenthesis: ) @0
+              element: package:test/a.dart::@class::Base::@constructor::named
+          superConstructor: package:test/a.dart::@class::Base::@constructor::named
+''');
+  }
+
+  test_classAlias_with_const_constructors_mixinStaticField() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+class Base {
+  const Base();
+  const Base.named();
+}
+''');
+    var library = await buildLibrary(r'''
+import "a.dart";
+
+mixin class M {
+  static int x = 0;
+}
+
+class MixinApp = Base with M;
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  fragments
+    #F0 <testLibraryFragment>
+      element: <testLibrary>
+      libraryImports
+        package:test/a.dart
+      classes
+        #F1 isMixinClass class M (nameOffset:30) (firstTokenOffset:18) (offset:30)
+          element: <testLibrary>::@class::M
+          fields
+            #F2 hasInitializer isOriginDeclaration isStatic x (nameOffset:47) (firstTokenOffset:47) (offset:47)
+              element: <testLibrary>::@class::M::@field::x
+          constructors
+            #F3 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:30)
+              element: <testLibrary>::@class::M::@constructor::new
+              typeName: M
+          getters
+            #F4 isCompleteDeclaration isOriginVariable isStatic x (nameOffset:<null>) (firstTokenOffset:<null>) (offset:47)
+              element: <testLibrary>::@class::M::@getter::x
+          setters
+            #F5 isCompleteDeclaration isOriginVariable isStatic x (nameOffset:<null>) (firstTokenOffset:<null>) (offset:47)
+              element: <testLibrary>::@class::M::@setter::x
+              formalParameters
+                #F6 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:47)
+                  element: <testLibrary>::@class::M::@setter::x::@formalParameter::value
+        #F7 isMixinApplication class MixinApp (nameOffset:63) (firstTokenOffset:57) (offset:63)
+          element: <testLibrary>::@class::MixinApp
+          constructors
+            #F8 isConst isOriginMixinApplication new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:63)
+              element: <testLibrary>::@class::MixinApp::@constructor::new
+              typeName: MixinApp
+            #F9 isConst isOriginMixinApplication named (nameOffset:<null>) (firstTokenOffset:<null>) (offset:63)
+              element: <testLibrary>::@class::MixinApp::@constructor::named
+              typeName: MixinApp
+  classes
+    isMixinClass isSimplyBounded class M
+      reference: <testLibrary>::@class::M
+      firstFragment: #F1
+      fields
+        hasInitializer isOriginDeclaration isStatic x
+          reference: <testLibrary>::@class::M::@field::x
+          firstFragment: #F2
+          type: int
+          getter: <testLibrary>::@class::M::@getter::x
+          setter: <testLibrary>::@class::M::@setter::x
+      constructors
+        isOriginImplicitDefault new
+          reference: <testLibrary>::@class::M::@constructor::new
+          firstFragment: #F3
+      getters
+        isOriginVariable isStatic x
+          reference: <testLibrary>::@class::M::@getter::x
+          firstFragment: #F4
+          returnType: int
+          variable: <testLibrary>::@class::M::@field::x
+      setters
+        isOriginVariable isStatic x
+          reference: <testLibrary>::@class::M::@setter::x
+          firstFragment: #F5
+          formalParameters
+            #E0 requiredPositional value
+              firstFragment: #F6
+              type: int
+          returnType: void
+          variable: <testLibrary>::@class::M::@field::x
+    isMixinApplication isSimplyBounded class MixinApp
+      reference: <testLibrary>::@class::MixinApp
+      firstFragment: #F7
+      supertype: Base
+      mixins
+        M
+      constructors
+        isConst isOriginMixinApplication new
+          reference: <testLibrary>::@class::MixinApp::@constructor::new
+          firstFragment: #F8
+          constantInitializers
+            SuperConstructorInvocation
+              superKeyword: super @0
+              argumentList: ArgumentList
+                leftParenthesis: ( @0
+                rightParenthesis: ) @0
+              element: package:test/a.dart::@class::Base::@constructor::new
+          superConstructor: package:test/a.dart::@class::Base::@constructor::new
+        isConst isOriginMixinApplication named
+          reference: <testLibrary>::@class::MixinApp::@constructor::named
+          firstFragment: #F9
+          constantInitializers
+            SuperConstructorInvocation
+              superKeyword: super @0
+              period: . @0
+              constructorName: SimpleIdentifier
+                token: named @-1
+                element: package:test/a.dart::@class::Base::@constructor::named
+                staticType: null
+              argumentList: ArgumentList
+                leftParenthesis: ( @0
+                rightParenthesis: ) @0
+              element: package:test/a.dart::@class::Base::@constructor::named
+          superConstructor: package:test/a.dart::@class::Base::@constructor::named
+''');
+  }
+
   test_classAlias_with_forwarding_constructors() async {
     newFile('$testPackageLibPath/a.dart', r'''
 class Base {
@@ -8228,9 +8618,11 @@
   factory Base.fact2() = Base.noArgs;
 }
 ''');
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 import "a.dart";
+
 class M {}
+
 class MixinApp = Base with M;
 ''');
     checkElementText(library, r'''
@@ -8242,62 +8634,62 @@
       libraryImports
         package:test/a.dart
       classes
-        #F1 class M (nameOffset:23) (firstTokenOffset:17) (offset:23)
+        #F1 class M (nameOffset:24) (firstTokenOffset:18) (offset:24)
           element: <testLibrary>::@class::M
           constructors
-            #F2 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:23)
+            #F2 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:24)
               element: <testLibrary>::@class::M::@constructor::new
               typeName: M
-        #F3 isMixinApplication class MixinApp (nameOffset:34) (firstTokenOffset:28) (offset:34)
+        #F3 isMixinApplication class MixinApp (nameOffset:36) (firstTokenOffset:30) (offset:36)
           element: <testLibrary>::@class::MixinApp
           constructors
-            #F4 isOriginMixinApplication new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:34)
+            #F4 isOriginMixinApplication new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:36)
               element: <testLibrary>::@class::MixinApp::@constructor::new
               typeName: MixinApp
-            #F5 isOriginMixinApplication noArgs (nameOffset:<null>) (firstTokenOffset:<null>) (offset:34)
+            #F5 isOriginMixinApplication noArgs (nameOffset:<null>) (firstTokenOffset:<null>) (offset:36)
               element: <testLibrary>::@class::MixinApp::@constructor::noArgs
               typeName: MixinApp
-            #F6 isOriginMixinApplication requiredArg (nameOffset:<null>) (firstTokenOffset:<null>) (offset:34)
+            #F6 isOriginMixinApplication requiredArg (nameOffset:<null>) (firstTokenOffset:<null>) (offset:36)
               element: <testLibrary>::@class::MixinApp::@constructor::requiredArg
               typeName: MixinApp
               formalParameters
-                #F7 requiredPositional isOriginMixinApplicationClassConstructor x (nameOffset:<null>) (firstTokenOffset:<null>) (offset:34)
+                #F7 requiredPositional isOriginMixinApplicationClassConstructor x (nameOffset:<null>) (firstTokenOffset:<null>) (offset:36)
                   element: <testLibrary>::@class::MixinApp::@constructor::requiredArg::@formalParameter::x
-            #F8 isOriginMixinApplication positionalArg (nameOffset:<null>) (firstTokenOffset:<null>) (offset:34)
+            #F8 isOriginMixinApplication positionalArg (nameOffset:<null>) (firstTokenOffset:<null>) (offset:36)
               element: <testLibrary>::@class::MixinApp::@constructor::positionalArg
               typeName: MixinApp
               formalParameters
-                #F9 optionalPositional isOriginMixinApplicationClassConstructor x (nameOffset:<null>) (firstTokenOffset:<null>) (offset:34)
+                #F9 optionalPositional isOriginMixinApplicationClassConstructor x (nameOffset:<null>) (firstTokenOffset:<null>) (offset:36)
                   element: <testLibrary>::@class::MixinApp::@constructor::positionalArg::@formalParameter::x
                   initializer: expression_0
                     BooleanLiteral
                       literal: true @127
                       staticType: bool
-            #F10 isOriginMixinApplication positionalArg2 (nameOffset:<null>) (firstTokenOffset:<null>) (offset:34)
+            #F10 isOriginMixinApplication positionalArg2 (nameOffset:<null>) (firstTokenOffset:<null>) (offset:36)
               element: <testLibrary>::@class::MixinApp::@constructor::positionalArg2
               typeName: MixinApp
               formalParameters
-                #F11 optionalPositional isFinal isOriginMixinApplicationClassConstructor x (nameOffset:<null>) (firstTokenOffset:<null>) (offset:34)
+                #F11 optionalPositional isFinal isOriginMixinApplicationClassConstructor x (nameOffset:<null>) (firstTokenOffset:<null>) (offset:36)
                   element: <testLibrary>::@class::MixinApp::@constructor::positionalArg2::@formalParameter::x
                   initializer: expression_1
                     BooleanLiteral
                       literal: true @167
                       staticType: bool
-            #F12 isOriginMixinApplication namedArg (nameOffset:<null>) (firstTokenOffset:<null>) (offset:34)
+            #F12 isOriginMixinApplication namedArg (nameOffset:<null>) (firstTokenOffset:<null>) (offset:36)
               element: <testLibrary>::@class::MixinApp::@constructor::namedArg
               typeName: MixinApp
               formalParameters
-                #F13 optionalNamed isOriginMixinApplicationClassConstructor x (nameOffset:<null>) (firstTokenOffset:<null>) (offset:34)
+                #F13 optionalNamed isOriginMixinApplicationClassConstructor x (nameOffset:<null>) (firstTokenOffset:<null>) (offset:36)
                   element: <testLibrary>::@class::MixinApp::@constructor::namedArg::@formalParameter::x
                   initializer: expression_2
                     IntegerLiteral
                       literal: 42 @200
                       staticType: int
-            #F14 isOriginMixinApplication namedArg2 (nameOffset:<null>) (firstTokenOffset:<null>) (offset:34)
+            #F14 isOriginMixinApplication namedArg2 (nameOffset:<null>) (firstTokenOffset:<null>) (offset:36)
               element: <testLibrary>::@class::MixinApp::@constructor::namedArg2
               typeName: MixinApp
               formalParameters
-                #F15 optionalNamed isFinal isOriginMixinApplicationClassConstructor x (nameOffset:<null>) (firstTokenOffset:<null>) (offset:34)
+                #F15 optionalNamed isFinal isOriginMixinApplicationClassConstructor x (nameOffset:<null>) (firstTokenOffset:<null>) (offset:36)
                   element: <testLibrary>::@class::MixinApp::@constructor::namedArg2::@formalParameter::x
                   initializer: expression_3
                     BooleanLiteral
@@ -8486,11 +8878,13 @@
   }
 
   test_classAlias_with_forwarding_constructors_type_substitution() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class Base<T> {
   Base.ctor(T t, List<T> l);
 }
+
 class M {}
+
 class MixinApp = Base with M;
 ''');
     checkElementText(library, r'''
@@ -8516,22 +8910,22 @@
                   element: <testLibrary>::@class::Base::@constructor::ctor::@formalParameter::t
                 #F5 requiredPositional isOriginDeclaration l (nameOffset:41) (firstTokenOffset:33) (offset:41)
                   element: <testLibrary>::@class::Base::@constructor::ctor::@formalParameter::l
-        #F6 class M (nameOffset:53) (firstTokenOffset:47) (offset:53)
+        #F6 class M (nameOffset:54) (firstTokenOffset:48) (offset:54)
           element: <testLibrary>::@class::M
           constructors
-            #F7 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:53)
+            #F7 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:54)
               element: <testLibrary>::@class::M::@constructor::new
               typeName: M
-        #F8 isMixinApplication class MixinApp (nameOffset:64) (firstTokenOffset:58) (offset:64)
+        #F8 isMixinApplication class MixinApp (nameOffset:66) (firstTokenOffset:60) (offset:66)
           element: <testLibrary>::@class::MixinApp
           constructors
-            #F9 isOriginMixinApplication ctor (nameOffset:<null>) (firstTokenOffset:<null>) (offset:64)
+            #F9 isOriginMixinApplication ctor (nameOffset:<null>) (firstTokenOffset:<null>) (offset:66)
               element: <testLibrary>::@class::MixinApp::@constructor::ctor
               typeName: MixinApp
               formalParameters
-                #F10 requiredPositional isOriginMixinApplicationClassConstructor t (nameOffset:<null>) (firstTokenOffset:<null>) (offset:64)
+                #F10 requiredPositional isOriginMixinApplicationClassConstructor t (nameOffset:<null>) (firstTokenOffset:<null>) (offset:66)
                   element: <testLibrary>::@class::MixinApp::@constructor::ctor::@formalParameter::t
-                #F11 requiredPositional isOriginMixinApplicationClassConstructor l (nameOffset:<null>) (firstTokenOffset:<null>) (offset:64)
+                #F11 requiredPositional isOriginMixinApplicationClassConstructor l (nameOffset:<null>) (firstTokenOffset:<null>) (offset:66)
                   element: <testLibrary>::@class::MixinApp::@constructor::ctor::@formalParameter::l
   classes
     isSimplyBounded class Base
@@ -8603,11 +8997,13 @@
   }
 
   test_classAlias_with_forwarding_constructors_type_substitution_complex() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class Base<T> {
   Base.ctor(T t, List<T> l);
 }
+
 class M {}
+
 class MixinApp<U> = Base<List<U>> with M;
 ''');
     checkElementText(library, r'''
@@ -8633,25 +9029,25 @@
                   element: <testLibrary>::@class::Base::@constructor::ctor::@formalParameter::t
                 #F5 requiredPositional isOriginDeclaration l (nameOffset:41) (firstTokenOffset:33) (offset:41)
                   element: <testLibrary>::@class::Base::@constructor::ctor::@formalParameter::l
-        #F6 class M (nameOffset:53) (firstTokenOffset:47) (offset:53)
+        #F6 class M (nameOffset:54) (firstTokenOffset:48) (offset:54)
           element: <testLibrary>::@class::M
           constructors
-            #F7 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:53)
+            #F7 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:54)
               element: <testLibrary>::@class::M::@constructor::new
               typeName: M
-        #F8 isMixinApplication class MixinApp (nameOffset:64) (firstTokenOffset:58) (offset:64)
+        #F8 isMixinApplication class MixinApp (nameOffset:66) (firstTokenOffset:60) (offset:66)
           element: <testLibrary>::@class::MixinApp
           typeParameters
-            #F9 U (nameOffset:73) (firstTokenOffset:73) (offset:73)
+            #F9 U (nameOffset:75) (firstTokenOffset:75) (offset:75)
               element: #E1 U
           constructors
-            #F10 isOriginMixinApplication ctor (nameOffset:<null>) (firstTokenOffset:<null>) (offset:64)
+            #F10 isOriginMixinApplication ctor (nameOffset:<null>) (firstTokenOffset:<null>) (offset:66)
               element: <testLibrary>::@class::MixinApp::@constructor::ctor
               typeName: MixinApp
               formalParameters
-                #F11 requiredPositional isOriginMixinApplicationClassConstructor t (nameOffset:<null>) (firstTokenOffset:<null>) (offset:64)
+                #F11 requiredPositional isOriginMixinApplicationClassConstructor t (nameOffset:<null>) (firstTokenOffset:<null>) (offset:66)
                   element: <testLibrary>::@class::MixinApp::@constructor::ctor::@formalParameter::t
-                #F12 requiredPositional isOriginMixinApplicationClassConstructor l (nameOffset:<null>) (firstTokenOffset:<null>) (offset:64)
+                #F12 requiredPositional isOriginMixinApplicationClassConstructor l (nameOffset:<null>) (firstTokenOffset:<null>) (offset:66)
                   element: <testLibrary>::@class::MixinApp::@constructor::ctor::@formalParameter::l
   classes
     isSimplyBounded class Base
@@ -8726,15 +9122,18 @@
   }
 
   test_classAlias_with_mixin_members() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class C = D with E;
+
 class D {}
+
 class E {
   int get a => null;
   void set b(int i) {}
   void f() {}
   int x;
-}''');
+}
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -8748,43 +9147,43 @@
             #F2 isOriginMixinApplication new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:6)
               element: <testLibrary>::@class::C::@constructor::new
               typeName: C
-        #F3 class D (nameOffset:26) (firstTokenOffset:20) (offset:26)
+        #F3 class D (nameOffset:27) (firstTokenOffset:21) (offset:27)
           element: <testLibrary>::@class::D
           constructors
-            #F4 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:26)
+            #F4 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:27)
               element: <testLibrary>::@class::D::@constructor::new
               typeName: D
-        #F5 class E (nameOffset:37) (firstTokenOffset:31) (offset:37)
+        #F5 class E (nameOffset:39) (firstTokenOffset:33) (offset:39)
           element: <testLibrary>::@class::E
           fields
-            #F6 isOriginGetterSetter a (nameOffset:<null>) (firstTokenOffset:<null>) (offset:37)
+            #F6 isOriginGetterSetter a (nameOffset:<null>) (firstTokenOffset:<null>) (offset:39)
               element: <testLibrary>::@class::E::@field::a
-            #F7 isOriginGetterSetter b (nameOffset:<null>) (firstTokenOffset:<null>) (offset:37)
+            #F7 isOriginGetterSetter b (nameOffset:<null>) (firstTokenOffset:<null>) (offset:39)
               element: <testLibrary>::@class::E::@field::b
-            #F8 isOriginDeclaration x (nameOffset:105) (firstTokenOffset:105) (offset:105)
+            #F8 isOriginDeclaration x (nameOffset:107) (firstTokenOffset:107) (offset:107)
               element: <testLibrary>::@class::E::@field::x
           constructors
-            #F9 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:37)
+            #F9 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:39)
               element: <testLibrary>::@class::E::@constructor::new
               typeName: E
           getters
-            #F10 isCompleteDeclaration isOriginDeclaration a (nameOffset:51) (firstTokenOffset:43) (offset:51)
+            #F10 isCompleteDeclaration isOriginDeclaration a (nameOffset:53) (firstTokenOffset:45) (offset:53)
               element: <testLibrary>::@class::E::@getter::a
-            #F11 isCompleteDeclaration isOriginVariable x (nameOffset:<null>) (firstTokenOffset:<null>) (offset:105)
+            #F11 isCompleteDeclaration isOriginVariable x (nameOffset:<null>) (firstTokenOffset:<null>) (offset:107)
               element: <testLibrary>::@class::E::@getter::x
           setters
-            #F12 isCompleteDeclaration isOriginDeclaration b (nameOffset:73) (firstTokenOffset:64) (offset:73)
+            #F12 isCompleteDeclaration isOriginDeclaration b (nameOffset:75) (firstTokenOffset:66) (offset:75)
               element: <testLibrary>::@class::E::@setter::b
               formalParameters
-                #F13 requiredPositional isOriginDeclaration i (nameOffset:79) (firstTokenOffset:75) (offset:79)
+                #F13 requiredPositional isOriginDeclaration i (nameOffset:81) (firstTokenOffset:77) (offset:81)
                   element: <testLibrary>::@class::E::@setter::b::@formalParameter::i
-            #F14 isCompleteDeclaration isOriginVariable x (nameOffset:<null>) (firstTokenOffset:<null>) (offset:105)
+            #F14 isCompleteDeclaration isOriginVariable x (nameOffset:<null>) (firstTokenOffset:<null>) (offset:107)
               element: <testLibrary>::@class::E::@setter::x
               formalParameters
-                #F15 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:105)
+                #F15 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:107)
                   element: <testLibrary>::@class::E::@setter::x::@formalParameter::value
           methods
-            #F16 isCompleteDeclaration isOriginDeclaration f (nameOffset:92) (firstTokenOffset:87) (offset:92)
+            #F16 isCompleteDeclaration isOriginDeclaration f (nameOffset:94) (firstTokenOffset:89) (offset:94)
               element: <testLibrary>::@class::E::@method::f
   classes
     hasNonFinalField isMixinApplication isSimplyBounded class C
@@ -8875,7 +9274,11 @@
   }
 
   test_classes() async {
-    var library = await buildLibrary('class C {} class D {}');
+    var library = await buildLibrary(r'''
+class C {}
+
+class D {}
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -8889,10 +9292,10 @@
             #F2 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:6)
               element: <testLibrary>::@class::C::@constructor::new
               typeName: C
-        #F3 class D (nameOffset:17) (firstTokenOffset:11) (offset:17)
+        #F3 class D (nameOffset:18) (firstTokenOffset:12) (offset:18)
           element: <testLibrary>::@class::D
           constructors
-            #F4 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:17)
+            #F4 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:18)
               element: <testLibrary>::@class::D::@constructor::new
               typeName: D
   classes
@@ -8914,7 +9317,7 @@
   }
 
   test_constructor_primary_body_constantInitializers_assertInitializer() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class const A() {
   this : assert(true);
 }
@@ -8954,7 +9357,7 @@
   }
 
   test_constructor_primary_body_constantInitializers_fieldInitializer() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class const A() {
   final int x;
   this : x = 0;
@@ -9015,7 +9418,7 @@
   }
 
   test_constructor_primary_body_constantInitializers_superConstructorInvocation() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class A(int x);
 
 class const B() extends A {
@@ -9083,7 +9486,7 @@
   }
 
   test_constructor_primary_body_documented() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 /// Class docs
 class const A() {
   /// first
@@ -9214,7 +9617,7 @@
   }
 
   test_constructor_primary_body_metadata() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class const A(final int x) {
   @deprecated
   this;
@@ -9331,7 +9734,7 @@
   }
 
   test_constructor_primary_body_noDeclaration() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class A {
   this : assert(true) {}
 }
@@ -9361,7 +9764,7 @@
   }
 
   test_constructor_primary_body_notConst() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class A() {
   this : assert(true) {}
 }
@@ -9393,7 +9796,7 @@
   }
 
   test_constructor_primary_body_primaryInitializerScope() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class const A(final int x) {
   this : assert(x > 0);
 }
@@ -9469,7 +9872,7 @@
   }
 
   test_constructor_primary_const() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class const A(final int foo) {}
 ''');
     checkElementText(library, r'''
@@ -9525,7 +9928,7 @@
   }
 
   test_constructor_primary_declaringFormalParameter_optionalNamed_functionTypedSuffix_final() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class A({final int foo()}) {}
 ''');
     checkElementText(library, r'''
@@ -9581,7 +9984,7 @@
   }
 
   test_constructor_primary_declaringFormalParameter_optionalNamed_private() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class A({final int? _foo}) {}
 ''');
     checkElementText(library, r'''
@@ -9638,7 +10041,7 @@
   }
 
   test_constructor_primary_declaringFormalParameter_optionalNamed_private_noCorrespondingPublic() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class A({final int? _123}) {}
 ''');
     checkElementText(library, r'''
@@ -9694,7 +10097,7 @@
   }
 
   test_constructor_primary_declaringFormalParameter_optionalNamed_simple_final() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class A({final int foo}) {}
 ''');
     checkElementText(library, r'''
@@ -9750,7 +10153,7 @@
   }
 
   test_constructor_primary_declaringFormalParameter_optionalPositional_functionTypedSuffix_final() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class A([final int foo()]) {}
 ''');
     checkElementText(library, r'''
@@ -9806,7 +10209,7 @@
   }
 
   test_constructor_primary_declaringFormalParameter_optionalPositional_simple_final() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class A([final int foo]) {}
 ''');
     checkElementText(library, r'''
@@ -9862,7 +10265,7 @@
   }
 
   test_constructor_primary_declaringFormalParameter_requiredNamed_functionTypedSuffix_final() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class A({required final int foo()}) {}
 ''');
     checkElementText(library, r'''
@@ -9918,7 +10321,7 @@
   }
 
   test_constructor_primary_declaringFormalParameter_requiredNamed_private() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class A({required final int _foo}) {}
 ''');
     checkElementText(library, r'''
@@ -9975,7 +10378,7 @@
   }
 
   test_constructor_primary_declaringFormalParameter_requiredNamed_simple_final() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class A({required final int foo}) {}
 ''');
     checkElementText(library, r'''
@@ -10031,7 +10434,7 @@
   }
 
   test_constructor_primary_declaringFormalParameter_requiredNamed_type_defaultObjectQuestion() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class A({final foo}) {}
 ''');
     checkElementText(library, r'''
@@ -10087,7 +10490,7 @@
   }
 
   test_constructor_primary_declaringFormalParameter_requiredNamed_type_fromDefaultValue() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class A({final foo = 0}) {}
 ''');
     checkElementText(library, r'''
@@ -10150,7 +10553,7 @@
   }
 
   test_constructor_primary_declaringFormalParameter_requiredNamed_type_fromDefaultValue_null() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class A({final foo = null}) {}
 ''');
     checkElementText(library, r'''
@@ -10213,10 +10616,11 @@
   }
 
   test_constructor_primary_declaringFormalParameter_requiredNamed_type_fromField_inferred() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class A {
   int get foo => 0;
 }
+
 class B({required final foo}) implements A {}
 ''');
     checkElementText(library, r'''
@@ -10238,21 +10642,21 @@
           getters
             #F4 isCompleteDeclaration isOriginDeclaration foo (nameOffset:20) (firstTokenOffset:12) (offset:20)
               element: <testLibrary>::@class::A::@getter::foo
-        #F5 class B (nameOffset:38) (firstTokenOffset:32) (offset:38)
+        #F5 class B (nameOffset:39) (firstTokenOffset:33) (offset:39)
           element: <testLibrary>::@class::B
           fields
-            #F6 hasImplicitType isFinal isOriginDeclaringFormalParameter foo (nameOffset:<null>) (firstTokenOffset:<null>) (offset:38)
+            #F6 hasImplicitType isFinal isOriginDeclaringFormalParameter foo (nameOffset:<null>) (firstTokenOffset:<null>) (offset:39)
               element: <testLibrary>::@class::B::@field::foo
           constructors
-            #F7 isCompleteDeclaration isOriginDeclaration isPrimary new (nameOffset:<null>) (firstTokenOffset:38) (offset:38)
+            #F7 isCompleteDeclaration isOriginDeclaration isPrimary new (nameOffset:<null>) (firstTokenOffset:39) (offset:39)
               element: <testLibrary>::@class::B::@constructor::new
               typeName: B
-              typeNameOffset: 38
+              typeNameOffset: 39
               formalParameters
-                #F8 requiredNamed hasImplicitType isDeclaring isFinal isOriginDeclaration this.foo (nameOffset:56) (firstTokenOffset:41) (offset:56)
+                #F8 requiredNamed hasImplicitType isDeclaring isFinal isOriginDeclaration this.foo (nameOffset:57) (firstTokenOffset:42) (offset:57)
                   element: <testLibrary>::@class::B::@constructor::new::@formalParameter::foo
           getters
-            #F9 isCompleteDeclaration isOriginVariable foo (nameOffset:<null>) (firstTokenOffset:<null>) (offset:38)
+            #F9 isCompleteDeclaration isOriginVariable foo (nameOffset:<null>) (firstTokenOffset:<null>) (offset:39)
               element: <testLibrary>::@class::B::@getter::foo
   classes
     isSimplyBounded class A
@@ -10305,10 +10709,11 @@
   }
 
   test_constructor_primary_declaringFormalParameter_requiredNamed_type_fromField_inferred_hasDefaultValue() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class A {
   num get foo => 0;
 }
+
 class B({final foo = 0}) implements A {}
 ''');
     checkElementText(library, r'''
@@ -10330,25 +10735,25 @@
           getters
             #F4 isCompleteDeclaration isOriginDeclaration foo (nameOffset:20) (firstTokenOffset:12) (offset:20)
               element: <testLibrary>::@class::A::@getter::foo
-        #F5 class B (nameOffset:38) (firstTokenOffset:32) (offset:38)
+        #F5 class B (nameOffset:39) (firstTokenOffset:33) (offset:39)
           element: <testLibrary>::@class::B
           fields
-            #F6 hasImplicitType isFinal isOriginDeclaringFormalParameter foo (nameOffset:<null>) (firstTokenOffset:<null>) (offset:38)
+            #F6 hasImplicitType isFinal isOriginDeclaringFormalParameter foo (nameOffset:<null>) (firstTokenOffset:<null>) (offset:39)
               element: <testLibrary>::@class::B::@field::foo
           constructors
-            #F7 isCompleteDeclaration isOriginDeclaration isPrimary new (nameOffset:<null>) (firstTokenOffset:38) (offset:38)
+            #F7 isCompleteDeclaration isOriginDeclaration isPrimary new (nameOffset:<null>) (firstTokenOffset:39) (offset:39)
               element: <testLibrary>::@class::B::@constructor::new
               typeName: B
-              typeNameOffset: 38
+              typeNameOffset: 39
               formalParameters
-                #F8 optionalNamed hasImplicitType isDeclaring isFinal isOriginDeclaration this.foo (nameOffset:47) (firstTokenOffset:41) (offset:47)
+                #F8 optionalNamed hasImplicitType isDeclaring isFinal isOriginDeclaration this.foo (nameOffset:48) (firstTokenOffset:42) (offset:48)
                   element: <testLibrary>::@class::B::@constructor::new::@formalParameter::foo
                   initializer: expression_0
                     IntegerLiteral
-                      literal: 0 @53
+                      literal: 0 @54
                       staticType: int
           getters
-            #F9 isCompleteDeclaration isOriginVariable foo (nameOffset:<null>) (firstTokenOffset:<null>) (offset:38)
+            #F9 isCompleteDeclaration isOriginVariable foo (nameOffset:<null>) (firstTokenOffset:<null>) (offset:39)
               element: <testLibrary>::@class::B::@getter::foo
   classes
     isSimplyBounded class A
@@ -10404,12 +10809,11 @@
   }
 
   test_constructor_primary_declaringFormalParameter_requiredPositional_functionTypedSuffix_final() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class A(
   /// first
   /// second
-  @deprecated
-  final int foo(),
+  @deprecated final int foo(),
 ) {}
 ''');
     checkElementText(library, r'''
@@ -10430,7 +10834,7 @@
               typeName: A
               typeNameOffset: 6
               formalParameters
-                #F4 requiredPositional isDeclaring isFinal isOriginDeclaration this.foo (nameOffset:60) (firstTokenOffset:11) (offset:60)
+                #F4 requiredPositional isDeclaring isFinal isOriginDeclaration this.foo (nameOffset:58) (firstTokenOffset:11) (offset:58)
                   element: <testLibrary>::@class::A::@constructor::new::@formalParameter::foo
                   documentationComment: /// first\n/// second
                   metadata
@@ -10492,7 +10896,7 @@
   }
 
   test_constructor_primary_declaringFormalParameter_requiredPositional_functionTypedSuffix_var() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class A(var int foo()) {}
 ''');
     checkElementText(library, r'''
@@ -10569,8 +10973,7 @@
 class A(
   /// first
   /// second
-  @deprecated
-  final int foo,
+  @deprecated final int foo,
 );
 ''');
     checkElementText(library, r'''
@@ -10591,7 +10994,7 @@
               typeName: A
               typeNameOffset: 6
               formalParameters
-                #F4 requiredPositional isDeclaring isFinal isOriginDeclaration this.foo (nameOffset:60) (firstTokenOffset:11) (offset:60)
+                #F4 requiredPositional isDeclaring isFinal isOriginDeclaration this.foo (nameOffset:58) (firstTokenOffset:11) (offset:58)
                   element: <testLibrary>::@class::A::@constructor::new::@formalParameter::foo
                   documentationComment: /// first\n/// second
                   metadata
@@ -10653,7 +11056,7 @@
   }
 
   test_constructor_primary_declaringFormalParameter_requiredPositional_simple_var() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class A(var int foo) {}
 ''');
     checkElementText(library, r'''
@@ -10726,7 +11129,7 @@
   }
 
   test_constructor_primary_declaringFormalParameter_requiredPositional_type_defaultObjectQuestion() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class A(final foo) {}
 ''');
     checkElementText(library, r'''
@@ -10782,10 +11185,11 @@
   }
 
   test_constructor_primary_declaringFormalParameter_requiredPositional_type_fromField_inferred() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class A {
   int get foo => 0;
 }
+
 class B(final foo) implements A {}
 ''');
     checkElementText(library, r'''
@@ -10807,21 +11211,21 @@
           getters
             #F4 isCompleteDeclaration isOriginDeclaration foo (nameOffset:20) (firstTokenOffset:12) (offset:20)
               element: <testLibrary>::@class::A::@getter::foo
-        #F5 class B (nameOffset:38) (firstTokenOffset:32) (offset:38)
+        #F5 class B (nameOffset:39) (firstTokenOffset:33) (offset:39)
           element: <testLibrary>::@class::B
           fields
-            #F6 hasImplicitType isFinal isOriginDeclaringFormalParameter foo (nameOffset:<null>) (firstTokenOffset:<null>) (offset:38)
+            #F6 hasImplicitType isFinal isOriginDeclaringFormalParameter foo (nameOffset:<null>) (firstTokenOffset:<null>) (offset:39)
               element: <testLibrary>::@class::B::@field::foo
           constructors
-            #F7 isCompleteDeclaration isOriginDeclaration isPrimary new (nameOffset:<null>) (firstTokenOffset:38) (offset:38)
+            #F7 isCompleteDeclaration isOriginDeclaration isPrimary new (nameOffset:<null>) (firstTokenOffset:39) (offset:39)
               element: <testLibrary>::@class::B::@constructor::new
               typeName: B
-              typeNameOffset: 38
+              typeNameOffset: 39
               formalParameters
-                #F8 requiredPositional hasImplicitType isDeclaring isFinal isOriginDeclaration this.foo (nameOffset:46) (firstTokenOffset:40) (offset:46)
+                #F8 requiredPositional hasImplicitType isDeclaring isFinal isOriginDeclaration this.foo (nameOffset:47) (firstTokenOffset:41) (offset:47)
                   element: <testLibrary>::@class::B::@constructor::new::@formalParameter::foo
           getters
-            #F9 isCompleteDeclaration isOriginVariable foo (nameOffset:<null>) (firstTokenOffset:<null>) (offset:38)
+            #F9 isCompleteDeclaration isOriginVariable foo (nameOffset:<null>) (firstTokenOffset:<null>) (offset:39)
               element: <testLibrary>::@class::B::@getter::foo
   classes
     isSimplyBounded class A
@@ -10874,7 +11278,7 @@
   }
 
   test_constructor_primary_declaringFormalParameter_requiredPositional_type_typeParameter() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class A<T>(final T foo) {}
 ''');
     checkElementText(library, r'''
@@ -10936,7 +11340,7 @@
   }
 
   test_constructor_primary_fieldTypeAnnotation_usesClassScope() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class A(int A) {
   A? field;
 }
@@ -11009,7 +11413,7 @@
   }
 
   test_constructor_primary_formalParameter_field_optionalNamed_private() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class A({this._foo}) {
   final int? _foo;
 }
@@ -11124,7 +11528,7 @@
   }
 
   test_constructor_primary_formalParameter_field_requiredNamed_private() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class A({required this._foo}) {
   final int? _foo;
 }
@@ -11182,7 +11586,7 @@
   }
 
   test_constructor_primary_formalParameter_field_requiredPositional() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class A(this.foo) {
   final int foo;
 }
@@ -11239,7 +11643,7 @@
   }
 
   test_constructor_primary_formalParameter_regular_requiredPositional_functionTypedSuffix() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class A(int foo()) {}
 ''');
     checkElementText(library, r'''
@@ -11275,7 +11679,7 @@
   }
 
   test_constructor_primary_formalParameter_regular_requiredPositional_simple() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class A(int foo) {}
 ''');
     checkElementText(library, r'''
@@ -11311,8 +11715,9 @@
   }
 
   test_constructor_primary_formalParameter_super_requiredPositional() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class A(int foo) {}
+
 class B(super.foo) extends A {}
 ''');
     checkElementText(library, r'''
@@ -11332,15 +11737,15 @@
               formalParameters
                 #F3 requiredPositional isOriginDeclaration foo (nameOffset:12) (firstTokenOffset:8) (offset:12)
                   element: <testLibrary>::@class::A::@constructor::new::@formalParameter::foo
-        #F4 hasExtendsClause class B (nameOffset:26) (firstTokenOffset:20) (offset:26)
+        #F4 hasExtendsClause class B (nameOffset:27) (firstTokenOffset:21) (offset:27)
           element: <testLibrary>::@class::B
           constructors
-            #F5 isCompleteDeclaration isOriginDeclaration isPrimary new (nameOffset:<null>) (firstTokenOffset:26) (offset:26)
+            #F5 isCompleteDeclaration isOriginDeclaration isPrimary new (nameOffset:<null>) (firstTokenOffset:27) (offset:27)
               element: <testLibrary>::@class::B::@constructor::new
               typeName: B
-              typeNameOffset: 26
+              typeNameOffset: 27
               formalParameters
-                #F6 requiredPositional hasImplicitType isFinal isOriginDeclaration super.foo (nameOffset:34) (firstTokenOffset:28) (offset:34)
+                #F6 requiredPositional hasImplicitType isFinal isOriginDeclaration super.foo (nameOffset:35) (firstTokenOffset:29) (offset:35)
                   element: <testLibrary>::@class::B::@constructor::new::@formalParameter::foo
   classes
     isSimplyBounded class A
@@ -11372,7 +11777,7 @@
   }
 
   test_constructor_primary_named_formalParameter_super_optionalNamed() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class A {
   A.named({required int a, required double b});
 }
@@ -11461,7 +11866,7 @@
   }
 
   test_constructor_primary_named_formalParameter_super_optionalPositional() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class A {
   A.named(int a, double b);
 }
@@ -11550,7 +11955,7 @@
   }
 
   test_constructor_primary_named_formalParameter_super_requiredNamed() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class A {
   A.named({required int a, required double b});
 }
@@ -11644,7 +12049,7 @@
   }
 
   test_constructor_primary_named_formalParameter_super_requiredPositional() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class A {
   A.named(int a, double b);
 }
@@ -11733,8 +12138,9 @@
   }
 
   test_constructor_primary_scopes() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 const foo = 0;
+
 class A<@foo T>([@foo int x = foo]) {
   static const foo = 1;
 }
@@ -11746,49 +12152,49 @@
     #F0 <testLibraryFragment>
       element: <testLibrary>
       classes
-        #F1 class A (nameOffset:21) (firstTokenOffset:15) (offset:21)
+        #F1 class A (nameOffset:22) (firstTokenOffset:16) (offset:22)
           element: <testLibrary>::@class::A
           typeParameters
-            #F2 T (nameOffset:28) (firstTokenOffset:23) (offset:28)
+            #F2 T (nameOffset:29) (firstTokenOffset:24) (offset:29)
               element: #E0 T
               metadata
                 Annotation
-                  atSign: @ @23
+                  atSign: @ @24
                   name: SimpleIdentifier
-                    token: foo @24
+                    token: foo @25
                     element: <testLibrary>::@getter::foo
                     staticType: null
                   element: <testLibrary>::@getter::foo
           fields
-            #F3 hasImplicitType hasInitializer isConst isOriginDeclaration isStatic foo (nameOffset:68) (firstTokenOffset:68) (offset:68)
+            #F3 hasImplicitType hasInitializer isConst isOriginDeclaration isStatic foo (nameOffset:69) (firstTokenOffset:69) (offset:69)
               element: <testLibrary>::@class::A::@field::foo
               initializer: expression_0
                 IntegerLiteral
-                  literal: 1 @74
+                  literal: 1 @75
                   staticType: int
           constructors
-            #F4 isCompleteDeclaration isOriginDeclaration isPrimary new (nameOffset:<null>) (firstTokenOffset:21) (offset:21)
+            #F4 isCompleteDeclaration isOriginDeclaration isPrimary new (nameOffset:<null>) (firstTokenOffset:22) (offset:22)
               element: <testLibrary>::@class::A::@constructor::new
               typeName: A
-              typeNameOffset: 21
+              typeNameOffset: 22
               formalParameters
-                #F5 optionalPositional isOriginDeclaration x (nameOffset:41) (firstTokenOffset:32) (offset:41)
+                #F5 optionalPositional isOriginDeclaration x (nameOffset:42) (firstTokenOffset:33) (offset:42)
                   element: <testLibrary>::@class::A::@constructor::new::@formalParameter::x
                   metadata
                     Annotation
-                      atSign: @ @32
+                      atSign: @ @33
                       name: SimpleIdentifier
-                        token: foo @33
+                        token: foo @34
                         element: <testLibrary>::@class::A::@getter::foo
                         staticType: null
                       element: <testLibrary>::@class::A::@getter::foo
                   initializer: expression_1
                     SimpleIdentifier
-                      token: foo @45
+                      token: foo @46
                       element: <testLibrary>::@class::A::@getter::foo
                       staticType: int
           getters
-            #F6 isCompleteDeclaration isOriginVariable isStatic foo (nameOffset:<null>) (firstTokenOffset:<null>) (offset:68)
+            #F6 isCompleteDeclaration isOriginVariable isStatic foo (nameOffset:<null>) (firstTokenOffset:<null>) (offset:69)
               element: <testLibrary>::@class::A::@getter::foo
       topLevelVariables
         #F7 hasImplicitType hasInitializer isConst isOriginDeclaration isStatic foo (nameOffset:6) (firstTokenOffset:6) (offset:6)
@@ -11809,9 +12215,9 @@
           firstFragment: #F2
           metadata
             Annotation
-              atSign: @ @23
+              atSign: @ @24
               name: SimpleIdentifier
-                token: foo @24
+                token: foo @25
                 element: <testLibrary>::@getter::foo
                 staticType: null
               element: <testLibrary>::@getter::foo
@@ -11834,9 +12240,9 @@
               type: int
               metadata
                 Annotation
-                  atSign: @ @32
+                  atSign: @ @33
                   name: SimpleIdentifier
-                    token: foo @33
+                    token: foo @34
                     element: <testLibrary>::@class::A::@getter::foo
                     staticType: null
                   element: <testLibrary>::@class::A::@getter::foo
@@ -11868,7 +12274,7 @@
   }
 
   test_constructor_primary_typeParameters() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class A<T extends U, U extends num>(T t, U u);
 ''');
     checkElementText(library, r'''
@@ -11921,7 +12327,7 @@
   }
 
   test_constructor_primary_unnamed_formalParameter_super_optionalNamed() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class A {
   A({required int a, required double b});
 }
@@ -12006,7 +12412,7 @@
   }
 
   test_constructor_primary_unnamed_formalParameter_super_optionalPositional() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class A {
   A(int a, double b);
 }
@@ -12091,7 +12497,7 @@
   }
 
   test_constructor_primary_unnamed_formalParameter_super_requiredNamed() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class A {
   A({required int a, required double b});
 }
@@ -12181,7 +12587,7 @@
   }
 
   test_constructor_primary_unnamed_formalParameter_super_requiredPositional() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class A {
   A(int a, double b);
 }
@@ -17604,11 +18010,11 @@
   test_constructor_secondary_augmentation_chain_isCompleteDeclaration_factory() async {
     var library = await buildLibrary(r'''
 class A {
-  factory A() => throw 0;
+  factory A();
 }
 
 augment class A {
-  augment factory A() {}
+  augment factory A() => throw 0;
 }
 
 augment class A {
@@ -17626,30 +18032,34 @@
           element: <testLibrary>::@class::A
           nextFragment: #F2
           constructors
-            #F3 isCompleteDeclaration isFactory isOriginDeclaration new (nameOffset:<null>) (firstTokenOffset:12) (offset:20)
+            #F3 isFactory isOriginDeclaration new (nameOffset:<null>) (firstTokenOffset:12) (offset:20)
               element: <testLibrary>::@class::A::@constructor::new
               factoryKeywordOffset: 12
               typeName: A
               typeNameOffset: 20
-        #F2 isAugmentation class A (nameOffset:53) (firstTokenOffset:39) (offset:53)
+              nextFragment: #F4
+        #F2 isAugmentation class A (nameOffset:42) (firstTokenOffset:28) (offset:42)
           element: <testLibrary>::@class::A
           previousFragment: #F1
-          nextFragment: #F4
+          nextFragment: #F5
           constructors
-            #F5 isCompleteDeclaration isFactory isOriginDeclaration new (nameOffset:<null>) (firstTokenOffset:67) (offset:75)
-              element: <testLibrary>::@class::A::@constructor::new#1
-              factoryKeywordOffset: 67
+            #F4 isAugmentation isCompleteDeclaration isFactory isOriginDeclaration new (nameOffset:<null>) (firstTokenOffset:48) (offset:64)
+              element: <testLibrary>::@class::A::@constructor::new
+              factoryKeywordOffset: 56
               typeName: A
-              typeNameOffset: 75
-        #F4 isAugmentation class A (nameOffset:99) (firstTokenOffset:85) (offset:99)
+              typeNameOffset: 64
+              nextFragment: #F6
+              previousFragment: #F3
+        #F5 isAugmentation class A (nameOffset:97) (firstTokenOffset:83) (offset:97)
           element: <testLibrary>::@class::A
           previousFragment: #F2
           constructors
-            #F6 isFactory isOriginDeclaration new (nameOffset:<null>) (firstTokenOffset:113) (offset:121)
-              element: <testLibrary>::@class::A::@constructor::new#2
-              factoryKeywordOffset: 113
+            #F6 isAugmentation isFactory isOriginDeclaration new (nameOffset:<null>) (firstTokenOffset:103) (offset:119)
+              element: <testLibrary>::@class::A::@constructor::new
+              factoryKeywordOffset: 111
               typeName: A
-              typeNameOffset: 121
+              typeNameOffset: 119
+              previousFragment: #F4
   classes
     isSimplyBounded class A
       reference: <testLibrary>::@class::A
@@ -17658,12 +18068,6 @@
         isFactory isOriginDeclaration new
           reference: <testLibrary>::@class::A::@constructor::new
           firstFragment: #F3
-        isFactory isOriginDeclaration new
-          reference: <testLibrary>::@class::A::@constructor::new#1
-          firstFragment: #F5
-        isFactory isOriginDeclaration new
-          reference: <testLibrary>::@class::A::@constructor::new#2
-          firstFragment: #F6
 ''');
   }
 
@@ -18417,7 +18821,11 @@
   }
 
   test_constructor_secondary_const() async {
-    var library = await buildLibrary('class C { const C(); }');
+    var library = await buildLibrary(r'''
+class C {
+  const C();
+}
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -18428,10 +18836,10 @@
         #F1 class C (nameOffset:6) (firstTokenOffset:0) (offset:6)
           element: <testLibrary>::@class::C
           constructors
-            #F2 isConst isOriginDeclaration new (nameOffset:<null>) (firstTokenOffset:10) (offset:16)
+            #F2 isConst isOriginDeclaration new (nameOffset:<null>) (firstTokenOffset:12) (offset:18)
               element: <testLibrary>::@class::C::@constructor::new
               typeName: C
-              typeNameOffset: 16
+              typeNameOffset: 18
   classes
     isSimplyBounded class C
       reference: <testLibrary>::@class::C
@@ -18444,7 +18852,11 @@
   }
 
   test_constructor_secondary_const_external() async {
-    var library = await buildLibrary('class C { external const C(); }');
+    var library = await buildLibrary(r'''
+class C {
+  external const C();
+}
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -18455,10 +18867,10 @@
         #F1 class C (nameOffset:6) (firstTokenOffset:0) (offset:6)
           element: <testLibrary>::@class::C
           constructors
-            #F2 isCompleteDeclaration isConst isExternal isOriginDeclaration new (nameOffset:<null>) (firstTokenOffset:10) (offset:25)
+            #F2 isCompleteDeclaration isConst isExternal isOriginDeclaration new (nameOffset:<null>) (firstTokenOffset:12) (offset:27)
               element: <testLibrary>::@class::C::@constructor::new
               typeName: C
-              typeNameOffset: 25
+              typeNameOffset: 27
   classes
     isSimplyBounded class C
       reference: <testLibrary>::@class::C
@@ -18471,13 +18883,14 @@
   }
 
   test_constructor_secondary_documented() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class C {
   /**
    * Docs
    */
   C();
-}''');
+}
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -18506,7 +18919,11 @@
   }
 
   test_constructor_secondary_explicit_named() async {
-    var library = await buildLibrary('class C { C.foo(); }');
+    var library = await buildLibrary(r'''
+class C {
+  C.foo();
+}
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -18517,11 +18934,11 @@
         #F1 class C (nameOffset:6) (firstTokenOffset:0) (offset:6)
           element: <testLibrary>::@class::C
           constructors
-            #F2 isOriginDeclaration foo (nameOffset:12) (firstTokenOffset:10) (offset:12)
+            #F2 isOriginDeclaration foo (nameOffset:14) (firstTokenOffset:12) (offset:14)
               element: <testLibrary>::@class::C::@constructor::foo
               typeName: C
-              typeNameOffset: 10
-              periodOffset: 11
+              typeNameOffset: 12
+              periodOffset: 13
   classes
     isSimplyBounded class C
       reference: <testLibrary>::@class::C
@@ -18534,7 +18951,11 @@
   }
 
   test_constructor_secondary_explicit_typeParameters() async {
-    var library = await buildLibrary('class C<T, U> { C(); }');
+    var library = await buildLibrary(r'''
+class C<T, U> {
+  C();
+}
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -18550,10 +18971,10 @@
             #F3 U (nameOffset:11) (firstTokenOffset:11) (offset:11)
               element: #E1 U
           constructors
-            #F4 isOriginDeclaration new (nameOffset:<null>) (firstTokenOffset:16) (offset:16)
+            #F4 isOriginDeclaration new (nameOffset:<null>) (firstTokenOffset:18) (offset:18)
               element: <testLibrary>::@class::C::@constructor::new
               typeName: C
-              typeNameOffset: 16
+              typeNameOffset: 18
   classes
     isSimplyBounded class C
       reference: <testLibrary>::@class::C
@@ -18571,7 +18992,11 @@
   }
 
   test_constructor_secondary_explicit_unnamed() async {
-    var library = await buildLibrary('class C { C(); }');
+    var library = await buildLibrary(r'''
+class C {
+  C();
+}
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -18582,10 +19007,10 @@
         #F1 class C (nameOffset:6) (firstTokenOffset:0) (offset:6)
           element: <testLibrary>::@class::C
           constructors
-            #F2 isOriginDeclaration new (nameOffset:<null>) (firstTokenOffset:10) (offset:10)
+            #F2 isOriginDeclaration new (nameOffset:<null>) (firstTokenOffset:12) (offset:12)
               element: <testLibrary>::@class::C::@constructor::new
               typeName: C
-              typeNameOffset: 10
+              typeNameOffset: 12
   classes
     isSimplyBounded class C
       reference: <testLibrary>::@class::C
@@ -18598,7 +19023,11 @@
   }
 
   test_constructor_secondary_external() async {
-    var library = await buildLibrary('class C { external C(); }');
+    var library = await buildLibrary(r'''
+class C {
+  external C();
+}
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -18609,10 +19038,10 @@
         #F1 class C (nameOffset:6) (firstTokenOffset:0) (offset:6)
           element: <testLibrary>::@class::C
           constructors
-            #F2 isCompleteDeclaration isExternal isOriginDeclaration new (nameOffset:<null>) (firstTokenOffset:10) (offset:19)
+            #F2 isCompleteDeclaration isExternal isOriginDeclaration new (nameOffset:<null>) (firstTokenOffset:12) (offset:21)
               element: <testLibrary>::@class::C::@constructor::new
               typeName: C
-              typeNameOffset: 19
+              typeNameOffset: 21
   classes
     isSimplyBounded class C
       reference: <testLibrary>::@class::C
@@ -18625,7 +19054,11 @@
   }
 
   test_constructor_secondary_factory() async {
-    var library = await buildLibrary('class C { factory C() => throw 0; }');
+    var library = await buildLibrary(r'''
+class C {
+  factory C() => throw 0;
+}
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -18636,11 +19069,11 @@
         #F1 class C (nameOffset:6) (firstTokenOffset:0) (offset:6)
           element: <testLibrary>::@class::C
           constructors
-            #F2 isCompleteDeclaration isFactory isOriginDeclaration new (nameOffset:<null>) (firstTokenOffset:10) (offset:18)
+            #F2 isCompleteDeclaration isFactory isOriginDeclaration new (nameOffset:<null>) (firstTokenOffset:12) (offset:20)
               element: <testLibrary>::@class::C::@constructor::new
-              factoryKeywordOffset: 10
+              factoryKeywordOffset: 12
               typeName: C
-              typeNameOffset: 18
+              typeNameOffset: 20
   classes
     isSimplyBounded class C
       reference: <testLibrary>::@class::C
@@ -18717,7 +19150,7 @@
   test_constructor_secondary_factoryHead_unnamed() async {
     var library = await buildLibrary(r'''
 class C {
-  factory () => throw 0;
+  factory() => throw 0;
 }
 ''');
     checkElementText(library, r'''
@@ -18748,7 +19181,7 @@
   test_constructor_secondary_factoryHead_unnamed_const() async {
     var library = await buildLibrary(r'''
 class C {
-  const factory () = C;
+  const factory() = C;
 }
 ''');
     checkElementText(library, r'''
@@ -18778,7 +19211,12 @@
   }
 
   test_constructor_secondary_formalParameter_field_optionalNamed_noDefault() async {
-    var library = await buildLibrary('class C { int x; C({this.x}); }');
+    var library = await buildLibrary(r'''
+class C {
+  int x;
+  C({this.x});
+}
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -18789,24 +19227,24 @@
         #F1 class C (nameOffset:6) (firstTokenOffset:0) (offset:6)
           element: <testLibrary>::@class::C
           fields
-            #F2 isOriginDeclaration x (nameOffset:14) (firstTokenOffset:14) (offset:14)
+            #F2 isOriginDeclaration x (nameOffset:16) (firstTokenOffset:16) (offset:16)
               element: <testLibrary>::@class::C::@field::x
           constructors
-            #F3 isCompleteDeclaration isOriginDeclaration new (nameOffset:<null>) (firstTokenOffset:17) (offset:17)
+            #F3 isCompleteDeclaration isOriginDeclaration new (nameOffset:<null>) (firstTokenOffset:21) (offset:21)
               element: <testLibrary>::@class::C::@constructor::new
               typeName: C
-              typeNameOffset: 17
+              typeNameOffset: 21
               formalParameters
-                #F4 optionalNamed hasImplicitType isFinal isOriginDeclaration this.x (nameOffset:25) (firstTokenOffset:20) (offset:25)
+                #F4 optionalNamed hasImplicitType isFinal isOriginDeclaration this.x (nameOffset:29) (firstTokenOffset:24) (offset:29)
                   element: <testLibrary>::@class::C::@constructor::new::@formalParameter::x
           getters
-            #F5 isCompleteDeclaration isOriginVariable x (nameOffset:<null>) (firstTokenOffset:<null>) (offset:14)
+            #F5 isCompleteDeclaration isOriginVariable x (nameOffset:<null>) (firstTokenOffset:<null>) (offset:16)
               element: <testLibrary>::@class::C::@getter::x
           setters
-            #F6 isCompleteDeclaration isOriginVariable x (nameOffset:<null>) (firstTokenOffset:<null>) (offset:14)
+            #F6 isCompleteDeclaration isOriginVariable x (nameOffset:<null>) (firstTokenOffset:<null>) (offset:16)
               element: <testLibrary>::@class::C::@setter::x
               formalParameters
-                #F7 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:14)
+                #F7 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:16)
                   element: <testLibrary>::@class::C::@setter::x::@formalParameter::value
   classes
     hasNonFinalField isSimplyBounded class C
@@ -18848,7 +19286,12 @@
   }
 
   test_constructor_secondary_formalParameter_field_optionalNamed_withDefault() async {
-    var library = await buildLibrary('class C { int x; C({this.x: 42}); }');
+    var library = await buildLibrary(r'''
+class C {
+  int x;
+  C({this.x: 42});
+}
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -18859,28 +19302,28 @@
         #F1 class C (nameOffset:6) (firstTokenOffset:0) (offset:6)
           element: <testLibrary>::@class::C
           fields
-            #F2 isOriginDeclaration x (nameOffset:14) (firstTokenOffset:14) (offset:14)
+            #F2 isOriginDeclaration x (nameOffset:16) (firstTokenOffset:16) (offset:16)
               element: <testLibrary>::@class::C::@field::x
           constructors
-            #F3 isCompleteDeclaration isOriginDeclaration new (nameOffset:<null>) (firstTokenOffset:17) (offset:17)
+            #F3 isCompleteDeclaration isOriginDeclaration new (nameOffset:<null>) (firstTokenOffset:21) (offset:21)
               element: <testLibrary>::@class::C::@constructor::new
               typeName: C
-              typeNameOffset: 17
+              typeNameOffset: 21
               formalParameters
-                #F4 optionalNamed hasImplicitType isFinal isOriginDeclaration this.x (nameOffset:25) (firstTokenOffset:20) (offset:25)
+                #F4 optionalNamed hasImplicitType isFinal isOriginDeclaration this.x (nameOffset:29) (firstTokenOffset:24) (offset:29)
                   element: <testLibrary>::@class::C::@constructor::new::@formalParameter::x
                   initializer: expression_0
                     IntegerLiteral
-                      literal: 42 @28
+                      literal: 42 @32
                       staticType: int
           getters
-            #F5 isCompleteDeclaration isOriginVariable x (nameOffset:<null>) (firstTokenOffset:<null>) (offset:14)
+            #F5 isCompleteDeclaration isOriginVariable x (nameOffset:<null>) (firstTokenOffset:<null>) (offset:16)
               element: <testLibrary>::@class::C::@getter::x
           setters
-            #F6 isCompleteDeclaration isOriginVariable x (nameOffset:<null>) (firstTokenOffset:<null>) (offset:14)
+            #F6 isCompleteDeclaration isOriginVariable x (nameOffset:<null>) (firstTokenOffset:<null>) (offset:16)
               element: <testLibrary>::@class::C::@setter::x
               formalParameters
-                #F7 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:14)
+                #F7 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:16)
                   element: <testLibrary>::@class::C::@setter::x::@formalParameter::value
   classes
     hasNonFinalField isSimplyBounded class C
@@ -18925,7 +19368,12 @@
   }
 
   test_constructor_secondary_formalParameter_field_optionalPositional_noDefault() async {
-    var library = await buildLibrary('class C { int x; C([this.x]); }');
+    var library = await buildLibrary(r'''
+class C {
+  int x;
+  C([this.x]);
+}
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -18936,24 +19384,24 @@
         #F1 class C (nameOffset:6) (firstTokenOffset:0) (offset:6)
           element: <testLibrary>::@class::C
           fields
-            #F2 isOriginDeclaration x (nameOffset:14) (firstTokenOffset:14) (offset:14)
+            #F2 isOriginDeclaration x (nameOffset:16) (firstTokenOffset:16) (offset:16)
               element: <testLibrary>::@class::C::@field::x
           constructors
-            #F3 isCompleteDeclaration isOriginDeclaration new (nameOffset:<null>) (firstTokenOffset:17) (offset:17)
+            #F3 isCompleteDeclaration isOriginDeclaration new (nameOffset:<null>) (firstTokenOffset:21) (offset:21)
               element: <testLibrary>::@class::C::@constructor::new
               typeName: C
-              typeNameOffset: 17
+              typeNameOffset: 21
               formalParameters
-                #F4 optionalPositional hasImplicitType isFinal isOriginDeclaration this.x (nameOffset:25) (firstTokenOffset:20) (offset:25)
+                #F4 optionalPositional hasImplicitType isFinal isOriginDeclaration this.x (nameOffset:29) (firstTokenOffset:24) (offset:29)
                   element: <testLibrary>::@class::C::@constructor::new::@formalParameter::x
           getters
-            #F5 isCompleteDeclaration isOriginVariable x (nameOffset:<null>) (firstTokenOffset:<null>) (offset:14)
+            #F5 isCompleteDeclaration isOriginVariable x (nameOffset:<null>) (firstTokenOffset:<null>) (offset:16)
               element: <testLibrary>::@class::C::@getter::x
           setters
-            #F6 isCompleteDeclaration isOriginVariable x (nameOffset:<null>) (firstTokenOffset:<null>) (offset:14)
+            #F6 isCompleteDeclaration isOriginVariable x (nameOffset:<null>) (firstTokenOffset:<null>) (offset:16)
               element: <testLibrary>::@class::C::@setter::x
               formalParameters
-                #F7 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:14)
+                #F7 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:16)
                   element: <testLibrary>::@class::C::@setter::x::@formalParameter::value
   classes
     hasNonFinalField isSimplyBounded class C
@@ -18995,7 +19443,12 @@
   }
 
   test_constructor_secondary_formalParameter_field_optionalPositional_withDefault() async {
-    var library = await buildLibrary('class C { int x; C([this.x = 42]); }');
+    var library = await buildLibrary(r'''
+class C {
+  int x;
+  C([this.x = 42]);
+}
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -19006,28 +19459,28 @@
         #F1 class C (nameOffset:6) (firstTokenOffset:0) (offset:6)
           element: <testLibrary>::@class::C
           fields
-            #F2 isOriginDeclaration x (nameOffset:14) (firstTokenOffset:14) (offset:14)
+            #F2 isOriginDeclaration x (nameOffset:16) (firstTokenOffset:16) (offset:16)
               element: <testLibrary>::@class::C::@field::x
           constructors
-            #F3 isCompleteDeclaration isOriginDeclaration new (nameOffset:<null>) (firstTokenOffset:17) (offset:17)
+            #F3 isCompleteDeclaration isOriginDeclaration new (nameOffset:<null>) (firstTokenOffset:21) (offset:21)
               element: <testLibrary>::@class::C::@constructor::new
               typeName: C
-              typeNameOffset: 17
+              typeNameOffset: 21
               formalParameters
-                #F4 optionalPositional hasImplicitType isFinal isOriginDeclaration this.x (nameOffset:25) (firstTokenOffset:20) (offset:25)
+                #F4 optionalPositional hasImplicitType isFinal isOriginDeclaration this.x (nameOffset:29) (firstTokenOffset:24) (offset:29)
                   element: <testLibrary>::@class::C::@constructor::new::@formalParameter::x
                   initializer: expression_0
                     IntegerLiteral
-                      literal: 42 @29
+                      literal: 42 @33
                       staticType: int
           getters
-            #F5 isCompleteDeclaration isOriginVariable x (nameOffset:<null>) (firstTokenOffset:<null>) (offset:14)
+            #F5 isCompleteDeclaration isOriginVariable x (nameOffset:<null>) (firstTokenOffset:<null>) (offset:16)
               element: <testLibrary>::@class::C::@getter::x
           setters
-            #F6 isCompleteDeclaration isOriginVariable x (nameOffset:<null>) (firstTokenOffset:<null>) (offset:14)
+            #F6 isCompleteDeclaration isOriginVariable x (nameOffset:<null>) (firstTokenOffset:<null>) (offset:16)
               element: <testLibrary>::@class::C::@setter::x
               formalParameters
-                #F7 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:14)
+                #F7 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:16)
                   element: <testLibrary>::@class::C::@setter::x::@formalParameter::value
   classes
     hasNonFinalField isSimplyBounded class C
@@ -19072,9 +19525,12 @@
   }
 
   test_constructor_secondary_formalParameter_field_requiredPositional_fieldDynamic_formalDynamic() async {
-    var library = await buildLibrary(
-      'class C { dynamic x; C(dynamic this.x); }',
-    );
+    var library = await buildLibrary(r'''
+class C {
+  dynamic x;
+  C(dynamic this.x);
+}
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -19085,24 +19541,24 @@
         #F1 class C (nameOffset:6) (firstTokenOffset:0) (offset:6)
           element: <testLibrary>::@class::C
           fields
-            #F2 isOriginDeclaration x (nameOffset:18) (firstTokenOffset:18) (offset:18)
+            #F2 isOriginDeclaration x (nameOffset:20) (firstTokenOffset:20) (offset:20)
               element: <testLibrary>::@class::C::@field::x
           constructors
-            #F3 isCompleteDeclaration isOriginDeclaration new (nameOffset:<null>) (firstTokenOffset:21) (offset:21)
+            #F3 isCompleteDeclaration isOriginDeclaration new (nameOffset:<null>) (firstTokenOffset:25) (offset:25)
               element: <testLibrary>::@class::C::@constructor::new
               typeName: C
-              typeNameOffset: 21
+              typeNameOffset: 25
               formalParameters
-                #F4 requiredPositional isFinal isOriginDeclaration this.x (nameOffset:36) (firstTokenOffset:23) (offset:36)
+                #F4 requiredPositional isFinal isOriginDeclaration this.x (nameOffset:40) (firstTokenOffset:27) (offset:40)
                   element: <testLibrary>::@class::C::@constructor::new::@formalParameter::x
           getters
-            #F5 isCompleteDeclaration isOriginVariable x (nameOffset:<null>) (firstTokenOffset:<null>) (offset:18)
+            #F5 isCompleteDeclaration isOriginVariable x (nameOffset:<null>) (firstTokenOffset:<null>) (offset:20)
               element: <testLibrary>::@class::C::@getter::x
           setters
-            #F6 isCompleteDeclaration isOriginVariable x (nameOffset:<null>) (firstTokenOffset:<null>) (offset:18)
+            #F6 isCompleteDeclaration isOriginVariable x (nameOffset:<null>) (firstTokenOffset:<null>) (offset:20)
               element: <testLibrary>::@class::C::@setter::x
               formalParameters
-                #F7 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:18)
+                #F7 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:20)
                   element: <testLibrary>::@class::C::@setter::x::@formalParameter::value
   classes
     hasNonFinalField isSimplyBounded class C
@@ -19144,7 +19600,12 @@
   }
 
   test_constructor_secondary_formalParameter_field_requiredPositional_fieldDynamic_formalImplicitType() async {
-    var library = await buildLibrary('class C { dynamic x; C(this.x); }');
+    var library = await buildLibrary(r'''
+class C {
+  dynamic x;
+  C(this.x);
+}
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -19155,24 +19616,24 @@
         #F1 class C (nameOffset:6) (firstTokenOffset:0) (offset:6)
           element: <testLibrary>::@class::C
           fields
-            #F2 isOriginDeclaration x (nameOffset:18) (firstTokenOffset:18) (offset:18)
+            #F2 isOriginDeclaration x (nameOffset:20) (firstTokenOffset:20) (offset:20)
               element: <testLibrary>::@class::C::@field::x
           constructors
-            #F3 isCompleteDeclaration isOriginDeclaration new (nameOffset:<null>) (firstTokenOffset:21) (offset:21)
+            #F3 isCompleteDeclaration isOriginDeclaration new (nameOffset:<null>) (firstTokenOffset:25) (offset:25)
               element: <testLibrary>::@class::C::@constructor::new
               typeName: C
-              typeNameOffset: 21
+              typeNameOffset: 25
               formalParameters
-                #F4 requiredPositional hasImplicitType isFinal isOriginDeclaration this.x (nameOffset:28) (firstTokenOffset:23) (offset:28)
+                #F4 requiredPositional hasImplicitType isFinal isOriginDeclaration this.x (nameOffset:32) (firstTokenOffset:27) (offset:32)
                   element: <testLibrary>::@class::C::@constructor::new::@formalParameter::x
           getters
-            #F5 isCompleteDeclaration isOriginVariable x (nameOffset:<null>) (firstTokenOffset:<null>) (offset:18)
+            #F5 isCompleteDeclaration isOriginVariable x (nameOffset:<null>) (firstTokenOffset:<null>) (offset:20)
               element: <testLibrary>::@class::C::@getter::x
           setters
-            #F6 isCompleteDeclaration isOriginVariable x (nameOffset:<null>) (firstTokenOffset:<null>) (offset:18)
+            #F6 isCompleteDeclaration isOriginVariable x (nameOffset:<null>) (firstTokenOffset:<null>) (offset:20)
               element: <testLibrary>::@class::C::@setter::x
               formalParameters
-                #F7 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:18)
+                #F7 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:20)
                   element: <testLibrary>::@class::C::@setter::x::@formalParameter::value
   classes
     hasNonFinalField isSimplyBounded class C
@@ -19214,7 +19675,12 @@
   }
 
   test_constructor_secondary_formalParameter_field_requiredPositional_fieldDynamic_formalTyped() async {
-    var library = await buildLibrary('class C { dynamic x; C(int this.x); }');
+    var library = await buildLibrary(r'''
+class C {
+  dynamic x;
+  C(int this.x);
+}
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -19225,24 +19691,24 @@
         #F1 class C (nameOffset:6) (firstTokenOffset:0) (offset:6)
           element: <testLibrary>::@class::C
           fields
-            #F2 isOriginDeclaration x (nameOffset:18) (firstTokenOffset:18) (offset:18)
+            #F2 isOriginDeclaration x (nameOffset:20) (firstTokenOffset:20) (offset:20)
               element: <testLibrary>::@class::C::@field::x
           constructors
-            #F3 isCompleteDeclaration isOriginDeclaration new (nameOffset:<null>) (firstTokenOffset:21) (offset:21)
+            #F3 isCompleteDeclaration isOriginDeclaration new (nameOffset:<null>) (firstTokenOffset:25) (offset:25)
               element: <testLibrary>::@class::C::@constructor::new
               typeName: C
-              typeNameOffset: 21
+              typeNameOffset: 25
               formalParameters
-                #F4 requiredPositional isFinal isOriginDeclaration this.x (nameOffset:32) (firstTokenOffset:23) (offset:32)
+                #F4 requiredPositional isFinal isOriginDeclaration this.x (nameOffset:36) (firstTokenOffset:27) (offset:36)
                   element: <testLibrary>::@class::C::@constructor::new::@formalParameter::x
           getters
-            #F5 isCompleteDeclaration isOriginVariable x (nameOffset:<null>) (firstTokenOffset:<null>) (offset:18)
+            #F5 isCompleteDeclaration isOriginVariable x (nameOffset:<null>) (firstTokenOffset:<null>) (offset:20)
               element: <testLibrary>::@class::C::@getter::x
           setters
-            #F6 isCompleteDeclaration isOriginVariable x (nameOffset:<null>) (firstTokenOffset:<null>) (offset:18)
+            #F6 isCompleteDeclaration isOriginVariable x (nameOffset:<null>) (firstTokenOffset:<null>) (offset:20)
               element: <testLibrary>::@class::C::@setter::x
               formalParameters
-                #F7 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:18)
+                #F7 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:20)
                   element: <testLibrary>::@class::C::@setter::x::@formalParameter::value
   classes
     hasNonFinalField isSimplyBounded class C
@@ -19284,7 +19750,12 @@
   }
 
   test_constructor_secondary_formalParameter_field_requiredPositional_fieldImplicitType_formalDynamic() async {
-    var library = await buildLibrary('class C { var x; C(dynamic this.x); }');
+    var library = await buildLibrary(r'''
+class C {
+  var x;
+  C(dynamic this.x);
+}
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -19295,24 +19766,24 @@
         #F1 class C (nameOffset:6) (firstTokenOffset:0) (offset:6)
           element: <testLibrary>::@class::C
           fields
-            #F2 hasImplicitType isOriginDeclaration x (nameOffset:14) (firstTokenOffset:14) (offset:14)
+            #F2 hasImplicitType isOriginDeclaration x (nameOffset:16) (firstTokenOffset:16) (offset:16)
               element: <testLibrary>::@class::C::@field::x
           constructors
-            #F3 isCompleteDeclaration isOriginDeclaration new (nameOffset:<null>) (firstTokenOffset:17) (offset:17)
+            #F3 isCompleteDeclaration isOriginDeclaration new (nameOffset:<null>) (firstTokenOffset:21) (offset:21)
               element: <testLibrary>::@class::C::@constructor::new
               typeName: C
-              typeNameOffset: 17
+              typeNameOffset: 21
               formalParameters
-                #F4 requiredPositional isFinal isOriginDeclaration this.x (nameOffset:32) (firstTokenOffset:19) (offset:32)
+                #F4 requiredPositional isFinal isOriginDeclaration this.x (nameOffset:36) (firstTokenOffset:23) (offset:36)
                   element: <testLibrary>::@class::C::@constructor::new::@formalParameter::x
           getters
-            #F5 isCompleteDeclaration isOriginVariable x (nameOffset:<null>) (firstTokenOffset:<null>) (offset:14)
+            #F5 isCompleteDeclaration isOriginVariable x (nameOffset:<null>) (firstTokenOffset:<null>) (offset:16)
               element: <testLibrary>::@class::C::@getter::x
           setters
-            #F6 isCompleteDeclaration isOriginVariable x (nameOffset:<null>) (firstTokenOffset:<null>) (offset:14)
+            #F6 isCompleteDeclaration isOriginVariable x (nameOffset:<null>) (firstTokenOffset:<null>) (offset:16)
               element: <testLibrary>::@class::C::@setter::x
               formalParameters
-                #F7 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:14)
+                #F7 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:16)
                   element: <testLibrary>::@class::C::@setter::x::@formalParameter::value
   classes
     hasNonFinalField isSimplyBounded class C
@@ -19354,7 +19825,12 @@
   }
 
   test_constructor_secondary_formalParameter_field_requiredPositional_fieldImplicitType_formalImplicitType() async {
-    var library = await buildLibrary('class C { var x; C(this.x); }');
+    var library = await buildLibrary(r'''
+class C {
+  var x;
+  C(this.x);
+}
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -19365,24 +19841,24 @@
         #F1 class C (nameOffset:6) (firstTokenOffset:0) (offset:6)
           element: <testLibrary>::@class::C
           fields
-            #F2 hasImplicitType isOriginDeclaration x (nameOffset:14) (firstTokenOffset:14) (offset:14)
+            #F2 hasImplicitType isOriginDeclaration x (nameOffset:16) (firstTokenOffset:16) (offset:16)
               element: <testLibrary>::@class::C::@field::x
           constructors
-            #F3 isCompleteDeclaration isOriginDeclaration new (nameOffset:<null>) (firstTokenOffset:17) (offset:17)
+            #F3 isCompleteDeclaration isOriginDeclaration new (nameOffset:<null>) (firstTokenOffset:21) (offset:21)
               element: <testLibrary>::@class::C::@constructor::new
               typeName: C
-              typeNameOffset: 17
+              typeNameOffset: 21
               formalParameters
-                #F4 requiredPositional hasImplicitType isFinal isOriginDeclaration this.x (nameOffset:24) (firstTokenOffset:19) (offset:24)
+                #F4 requiredPositional hasImplicitType isFinal isOriginDeclaration this.x (nameOffset:28) (firstTokenOffset:23) (offset:28)
                   element: <testLibrary>::@class::C::@constructor::new::@formalParameter::x
           getters
-            #F5 isCompleteDeclaration isOriginVariable x (nameOffset:<null>) (firstTokenOffset:<null>) (offset:14)
+            #F5 isCompleteDeclaration isOriginVariable x (nameOffset:<null>) (firstTokenOffset:<null>) (offset:16)
               element: <testLibrary>::@class::C::@getter::x
           setters
-            #F6 isCompleteDeclaration isOriginVariable x (nameOffset:<null>) (firstTokenOffset:<null>) (offset:14)
+            #F6 isCompleteDeclaration isOriginVariable x (nameOffset:<null>) (firstTokenOffset:<null>) (offset:16)
               element: <testLibrary>::@class::C::@setter::x
               formalParameters
-                #F7 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:14)
+                #F7 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:16)
                   element: <testLibrary>::@class::C::@setter::x::@formalParameter::value
   classes
     hasNonFinalField isSimplyBounded class C
@@ -19424,7 +19900,12 @@
   }
 
   test_constructor_secondary_formalParameter_field_requiredPositional_fieldImplicitType_formalTyped() async {
-    var library = await buildLibrary('class C { var x; C(int this.x); }');
+    var library = await buildLibrary(r'''
+class C {
+  var x;
+  C(int this.x);
+}
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -19435,24 +19916,24 @@
         #F1 class C (nameOffset:6) (firstTokenOffset:0) (offset:6)
           element: <testLibrary>::@class::C
           fields
-            #F2 hasImplicitType isOriginDeclaration x (nameOffset:14) (firstTokenOffset:14) (offset:14)
+            #F2 hasImplicitType isOriginDeclaration x (nameOffset:16) (firstTokenOffset:16) (offset:16)
               element: <testLibrary>::@class::C::@field::x
           constructors
-            #F3 isCompleteDeclaration isOriginDeclaration new (nameOffset:<null>) (firstTokenOffset:17) (offset:17)
+            #F3 isCompleteDeclaration isOriginDeclaration new (nameOffset:<null>) (firstTokenOffset:21) (offset:21)
               element: <testLibrary>::@class::C::@constructor::new
               typeName: C
-              typeNameOffset: 17
+              typeNameOffset: 21
               formalParameters
-                #F4 requiredPositional isFinal isOriginDeclaration this.x (nameOffset:28) (firstTokenOffset:19) (offset:28)
+                #F4 requiredPositional isFinal isOriginDeclaration this.x (nameOffset:32) (firstTokenOffset:23) (offset:32)
                   element: <testLibrary>::@class::C::@constructor::new::@formalParameter::x
           getters
-            #F5 isCompleteDeclaration isOriginVariable x (nameOffset:<null>) (firstTokenOffset:<null>) (offset:14)
+            #F5 isCompleteDeclaration isOriginVariable x (nameOffset:<null>) (firstTokenOffset:<null>) (offset:16)
               element: <testLibrary>::@class::C::@getter::x
           setters
-            #F6 isCompleteDeclaration isOriginVariable x (nameOffset:<null>) (firstTokenOffset:<null>) (offset:14)
+            #F6 isCompleteDeclaration isOriginVariable x (nameOffset:<null>) (firstTokenOffset:<null>) (offset:16)
               element: <testLibrary>::@class::C::@setter::x
               formalParameters
-                #F7 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:14)
+                #F7 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:16)
                   element: <testLibrary>::@class::C::@setter::x::@formalParameter::value
   classes
     hasNonFinalField isSimplyBounded class C
@@ -19494,7 +19975,12 @@
   }
 
   test_constructor_secondary_formalParameter_field_requiredPositional_fieldTyped_formalDynamic() async {
-    var library = await buildLibrary('class C { num x; C(dynamic this.x); }');
+    var library = await buildLibrary(r'''
+class C {
+  num x;
+  C(dynamic this.x);
+}
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -19505,24 +19991,24 @@
         #F1 class C (nameOffset:6) (firstTokenOffset:0) (offset:6)
           element: <testLibrary>::@class::C
           fields
-            #F2 isOriginDeclaration x (nameOffset:14) (firstTokenOffset:14) (offset:14)
+            #F2 isOriginDeclaration x (nameOffset:16) (firstTokenOffset:16) (offset:16)
               element: <testLibrary>::@class::C::@field::x
           constructors
-            #F3 isCompleteDeclaration isOriginDeclaration new (nameOffset:<null>) (firstTokenOffset:17) (offset:17)
+            #F3 isCompleteDeclaration isOriginDeclaration new (nameOffset:<null>) (firstTokenOffset:21) (offset:21)
               element: <testLibrary>::@class::C::@constructor::new
               typeName: C
-              typeNameOffset: 17
+              typeNameOffset: 21
               formalParameters
-                #F4 requiredPositional isFinal isOriginDeclaration this.x (nameOffset:32) (firstTokenOffset:19) (offset:32)
+                #F4 requiredPositional isFinal isOriginDeclaration this.x (nameOffset:36) (firstTokenOffset:23) (offset:36)
                   element: <testLibrary>::@class::C::@constructor::new::@formalParameter::x
           getters
-            #F5 isCompleteDeclaration isOriginVariable x (nameOffset:<null>) (firstTokenOffset:<null>) (offset:14)
+            #F5 isCompleteDeclaration isOriginVariable x (nameOffset:<null>) (firstTokenOffset:<null>) (offset:16)
               element: <testLibrary>::@class::C::@getter::x
           setters
-            #F6 isCompleteDeclaration isOriginVariable x (nameOffset:<null>) (firstTokenOffset:<null>) (offset:14)
+            #F6 isCompleteDeclaration isOriginVariable x (nameOffset:<null>) (firstTokenOffset:<null>) (offset:16)
               element: <testLibrary>::@class::C::@setter::x
               formalParameters
-                #F7 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:14)
+                #F7 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:16)
                   element: <testLibrary>::@class::C::@setter::x::@formalParameter::value
   classes
     hasNonFinalField isSimplyBounded class C
@@ -19564,7 +20050,12 @@
   }
 
   test_constructor_secondary_formalParameter_field_requiredPositional_fieldTyped_formalImplicitType() async {
-    var library = await buildLibrary('class C { num x; C(this.x); }');
+    var library = await buildLibrary(r'''
+class C {
+  num x;
+  C(this.x);
+}
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -19575,24 +20066,24 @@
         #F1 class C (nameOffset:6) (firstTokenOffset:0) (offset:6)
           element: <testLibrary>::@class::C
           fields
-            #F2 isOriginDeclaration x (nameOffset:14) (firstTokenOffset:14) (offset:14)
+            #F2 isOriginDeclaration x (nameOffset:16) (firstTokenOffset:16) (offset:16)
               element: <testLibrary>::@class::C::@field::x
           constructors
-            #F3 isCompleteDeclaration isOriginDeclaration new (nameOffset:<null>) (firstTokenOffset:17) (offset:17)
+            #F3 isCompleteDeclaration isOriginDeclaration new (nameOffset:<null>) (firstTokenOffset:21) (offset:21)
               element: <testLibrary>::@class::C::@constructor::new
               typeName: C
-              typeNameOffset: 17
+              typeNameOffset: 21
               formalParameters
-                #F4 requiredPositional hasImplicitType isFinal isOriginDeclaration this.x (nameOffset:24) (firstTokenOffset:19) (offset:24)
+                #F4 requiredPositional hasImplicitType isFinal isOriginDeclaration this.x (nameOffset:28) (firstTokenOffset:23) (offset:28)
                   element: <testLibrary>::@class::C::@constructor::new::@formalParameter::x
           getters
-            #F5 isCompleteDeclaration isOriginVariable x (nameOffset:<null>) (firstTokenOffset:<null>) (offset:14)
+            #F5 isCompleteDeclaration isOriginVariable x (nameOffset:<null>) (firstTokenOffset:<null>) (offset:16)
               element: <testLibrary>::@class::C::@getter::x
           setters
-            #F6 isCompleteDeclaration isOriginVariable x (nameOffset:<null>) (firstTokenOffset:<null>) (offset:14)
+            #F6 isCompleteDeclaration isOriginVariable x (nameOffset:<null>) (firstTokenOffset:<null>) (offset:16)
               element: <testLibrary>::@class::C::@setter::x
               formalParameters
-                #F7 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:14)
+                #F7 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:16)
                   element: <testLibrary>::@class::C::@setter::x::@formalParameter::value
   classes
     hasNonFinalField isSimplyBounded class C
@@ -19634,7 +20125,12 @@
   }
 
   test_constructor_secondary_formalParameter_field_requiredPositional_fieldTyped_formalTyped() async {
-    var library = await buildLibrary('class C { num x; C(int this.x); }');
+    var library = await buildLibrary(r'''
+class C {
+  num x;
+  C(int this.x);
+}
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -19645,24 +20141,24 @@
         #F1 class C (nameOffset:6) (firstTokenOffset:0) (offset:6)
           element: <testLibrary>::@class::C
           fields
-            #F2 isOriginDeclaration x (nameOffset:14) (firstTokenOffset:14) (offset:14)
+            #F2 isOriginDeclaration x (nameOffset:16) (firstTokenOffset:16) (offset:16)
               element: <testLibrary>::@class::C::@field::x
           constructors
-            #F3 isCompleteDeclaration isOriginDeclaration new (nameOffset:<null>) (firstTokenOffset:17) (offset:17)
+            #F3 isCompleteDeclaration isOriginDeclaration new (nameOffset:<null>) (firstTokenOffset:21) (offset:21)
               element: <testLibrary>::@class::C::@constructor::new
               typeName: C
-              typeNameOffset: 17
+              typeNameOffset: 21
               formalParameters
-                #F4 requiredPositional isFinal isOriginDeclaration this.x (nameOffset:28) (firstTokenOffset:19) (offset:28)
+                #F4 requiredPositional isFinal isOriginDeclaration this.x (nameOffset:32) (firstTokenOffset:23) (offset:32)
                   element: <testLibrary>::@class::C::@constructor::new::@formalParameter::x
           getters
-            #F5 isCompleteDeclaration isOriginVariable x (nameOffset:<null>) (firstTokenOffset:<null>) (offset:14)
+            #F5 isCompleteDeclaration isOriginVariable x (nameOffset:<null>) (firstTokenOffset:<null>) (offset:16)
               element: <testLibrary>::@class::C::@getter::x
           setters
-            #F6 isCompleteDeclaration isOriginVariable x (nameOffset:<null>) (firstTokenOffset:<null>) (offset:14)
+            #F6 isCompleteDeclaration isOriginVariable x (nameOffset:<null>) (firstTokenOffset:<null>) (offset:16)
               element: <testLibrary>::@class::C::@setter::x
               formalParameters
-                #F7 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:14)
+                #F7 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:16)
                   element: <testLibrary>::@class::C::@setter::x::@formalParameter::value
   classes
     hasNonFinalField isSimplyBounded class C
@@ -19961,7 +20457,13 @@
 
   test_constructor_secondary_formalParameter_field_requiredPositional_multipleMatchingFields() async {
     // This is a compile-time error but it should still analyze consistently.
-    var library = await buildLibrary('class C { C(this.x); int x; String x; }');
+    var library = await buildLibrary(r'''
+class C {
+  C(this.x);
+  int x;
+  String x;
+}
+''');
 
     checkElementText(library, r'''
 library
@@ -19973,33 +20475,33 @@
         #F1 class C (nameOffset:6) (firstTokenOffset:0) (offset:6)
           element: <testLibrary>::@class::C
           fields
-            #F2 isOriginDeclaration x (nameOffset:25) (firstTokenOffset:25) (offset:25)
+            #F2 isOriginDeclaration x (nameOffset:29) (firstTokenOffset:29) (offset:29)
               element: <testLibrary>::@class::C::@field::x
-            #F3 isOriginDeclaration x (nameOffset:35) (firstTokenOffset:35) (offset:35)
+            #F3 isOriginDeclaration x (nameOffset:41) (firstTokenOffset:41) (offset:41)
               element: <testLibrary>::@class::C::@field::x#1
           constructors
-            #F4 isCompleteDeclaration isOriginDeclaration new (nameOffset:<null>) (firstTokenOffset:10) (offset:10)
+            #F4 isCompleteDeclaration isOriginDeclaration new (nameOffset:<null>) (firstTokenOffset:12) (offset:12)
               element: <testLibrary>::@class::C::@constructor::new
               typeName: C
-              typeNameOffset: 10
+              typeNameOffset: 12
               formalParameters
-                #F5 requiredPositional hasImplicitType isFinal isOriginDeclaration this.x (nameOffset:17) (firstTokenOffset:12) (offset:17)
+                #F5 requiredPositional hasImplicitType isFinal isOriginDeclaration this.x (nameOffset:19) (firstTokenOffset:14) (offset:19)
                   element: <testLibrary>::@class::C::@constructor::new::@formalParameter::x
           getters
-            #F6 isCompleteDeclaration isOriginVariable x (nameOffset:<null>) (firstTokenOffset:<null>) (offset:25)
+            #F6 isCompleteDeclaration isOriginVariable x (nameOffset:<null>) (firstTokenOffset:<null>) (offset:29)
               element: <testLibrary>::@class::C::@getter::x
-            #F7 isCompleteDeclaration isOriginVariable x (nameOffset:<null>) (firstTokenOffset:<null>) (offset:35)
+            #F7 isCompleteDeclaration isOriginVariable x (nameOffset:<null>) (firstTokenOffset:<null>) (offset:41)
               element: <testLibrary>::@class::C::@getter::x#1
           setters
-            #F8 isCompleteDeclaration isOriginVariable x (nameOffset:<null>) (firstTokenOffset:<null>) (offset:25)
+            #F8 isCompleteDeclaration isOriginVariable x (nameOffset:<null>) (firstTokenOffset:<null>) (offset:29)
               element: <testLibrary>::@class::C::@setter::x
               formalParameters
-                #F9 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:25)
+                #F9 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:29)
                   element: <testLibrary>::@class::C::@setter::x::@formalParameter::value
-            #F10 isCompleteDeclaration isOriginVariable x (nameOffset:<null>) (firstTokenOffset:<null>) (offset:35)
+            #F10 isCompleteDeclaration isOriginVariable x (nameOffset:<null>) (firstTokenOffset:<null>) (offset:41)
               element: <testLibrary>::@class::C::@setter::x#1
               formalParameters
-                #F11 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:35)
+                #F11 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:41)
                   element: <testLibrary>::@class::C::@setter::x#1::@formalParameter::value
   classes
     hasNonFinalField isSimplyBounded class C
@@ -20062,7 +20564,11 @@
 
   test_constructor_secondary_formalParameter_field_requiredPositional_noMatchingField() async {
     // This is a compile-time error but it should still analyze consistently.
-    var library = await buildLibrary('class C { C(this.x); }');
+    var library = await buildLibrary(r'''
+class C {
+  C(this.x);
+}
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -20073,12 +20579,12 @@
         #F1 class C (nameOffset:6) (firstTokenOffset:0) (offset:6)
           element: <testLibrary>::@class::C
           constructors
-            #F2 isCompleteDeclaration isOriginDeclaration new (nameOffset:<null>) (firstTokenOffset:10) (offset:10)
+            #F2 isCompleteDeclaration isOriginDeclaration new (nameOffset:<null>) (firstTokenOffset:12) (offset:12)
               element: <testLibrary>::@class::C::@constructor::new
               typeName: C
-              typeNameOffset: 10
+              typeNameOffset: 12
               formalParameters
-                #F3 requiredPositional hasImplicitType isFinal isOriginDeclaration this.x (nameOffset:17) (firstTokenOffset:12) (offset:17)
+                #F3 requiredPositional hasImplicitType isFinal isOriginDeclaration this.x (nameOffset:19) (firstTokenOffset:14) (offset:19)
                   element: <testLibrary>::@class::C::@constructor::new::@formalParameter::x
   classes
     isSimplyBounded class C
@@ -20097,7 +20603,12 @@
   }
 
   test_constructor_secondary_formalParameter_field_requiredPositional_private() async {
-    var library = await buildLibrary('class C { int? _x; C({this._x}); }');
+    var library = await buildLibrary(r'''
+class C {
+  int? _x;
+  C({this._x});
+}
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -20108,24 +20619,24 @@
         #F1 class C (nameOffset:6) (firstTokenOffset:0) (offset:6)
           element: <testLibrary>::@class::C
           fields
-            #F2 isOriginDeclaration _x (nameOffset:15) (firstTokenOffset:15) (offset:15)
+            #F2 isOriginDeclaration _x (nameOffset:17) (firstTokenOffset:17) (offset:17)
               element: <testLibrary>::@class::C::@field::_x
           constructors
-            #F3 isCompleteDeclaration isOriginDeclaration new (nameOffset:<null>) (firstTokenOffset:19) (offset:19)
+            #F3 isCompleteDeclaration isOriginDeclaration new (nameOffset:<null>) (firstTokenOffset:23) (offset:23)
               element: <testLibrary>::@class::C::@constructor::new
               typeName: C
-              typeNameOffset: 19
+              typeNameOffset: 23
               formalParameters
-                #F4 optionalNamed hasImplicitType isFinal isOriginDeclaration this.x (nameOffset:27) (firstTokenOffset:22) (offset:27)
+                #F4 optionalNamed hasImplicitType isFinal isOriginDeclaration this.x (nameOffset:31) (firstTokenOffset:26) (offset:31)
                   element: <testLibrary>::@class::C::@constructor::new::@formalParameter::x
           getters
-            #F5 isCompleteDeclaration isOriginVariable _x (nameOffset:<null>) (firstTokenOffset:<null>) (offset:15)
+            #F5 isCompleteDeclaration isOriginVariable _x (nameOffset:<null>) (firstTokenOffset:<null>) (offset:17)
               element: <testLibrary>::@class::C::@getter::_x
           setters
-            #F6 isCompleteDeclaration isOriginVariable _x (nameOffset:<null>) (firstTokenOffset:<null>) (offset:15)
+            #F6 isCompleteDeclaration isOriginVariable _x (nameOffset:<null>) (firstTokenOffset:<null>) (offset:17)
               element: <testLibrary>::@class::C::@setter::_x
               formalParameters
-                #F7 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:15)
+                #F7 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:17)
                   element: <testLibrary>::@class::C::@setter::_x::@formalParameter::value
   classes
     hasNonFinalField isSimplyBounded class C
@@ -20172,7 +20683,12 @@
   }
 
   test_constructor_secondary_formalParameter_field_requiredPositional_private_noCorrespondingPublic() async {
-    var library = await buildLibrary('class C { int? _123; C({this._123}); }');
+    var library = await buildLibrary(r'''
+class C {
+  int? _123;
+  C({this._123});
+}
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -20183,24 +20699,24 @@
         #F1 class C (nameOffset:6) (firstTokenOffset:0) (offset:6)
           element: <testLibrary>::@class::C
           fields
-            #F2 isOriginDeclaration _123 (nameOffset:15) (firstTokenOffset:15) (offset:15)
+            #F2 isOriginDeclaration _123 (nameOffset:17) (firstTokenOffset:17) (offset:17)
               element: <testLibrary>::@class::C::@field::_123
           constructors
-            #F3 isCompleteDeclaration isOriginDeclaration new (nameOffset:<null>) (firstTokenOffset:21) (offset:21)
+            #F3 isCompleteDeclaration isOriginDeclaration new (nameOffset:<null>) (firstTokenOffset:25) (offset:25)
               element: <testLibrary>::@class::C::@constructor::new
               typeName: C
-              typeNameOffset: 21
+              typeNameOffset: 25
               formalParameters
-                #F4 optionalNamed hasImplicitType isFinal isOriginDeclaration this._123 (nameOffset:29) (firstTokenOffset:24) (offset:29)
+                #F4 optionalNamed hasImplicitType isFinal isOriginDeclaration this._123 (nameOffset:33) (firstTokenOffset:28) (offset:33)
                   element: <testLibrary>::@class::C::@constructor::new::@formalParameter::_123
           getters
-            #F5 isCompleteDeclaration isOriginVariable _123 (nameOffset:<null>) (firstTokenOffset:<null>) (offset:15)
+            #F5 isCompleteDeclaration isOriginVariable _123 (nameOffset:<null>) (firstTokenOffset:<null>) (offset:17)
               element: <testLibrary>::@class::C::@getter::_123
           setters
-            #F6 isCompleteDeclaration isOriginVariable _123 (nameOffset:<null>) (firstTokenOffset:<null>) (offset:15)
+            #F6 isCompleteDeclaration isOriginVariable _123 (nameOffset:<null>) (firstTokenOffset:<null>) (offset:17)
               element: <testLibrary>::@class::C::@setter::_123
               formalParameters
-                #F7 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:15)
+                #F7 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:17)
                   element: <testLibrary>::@class::C::@setter::_123::@formalParameter::value
   classes
     hasNonFinalField isSimplyBounded class C
@@ -20246,7 +20762,7 @@
   }
 
   test_constructor_secondary_formalParameter_super_optionalNamed() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class A {
   A({required int a, required double b});
 }
@@ -20333,7 +20849,7 @@
   }
 
   test_constructor_secondary_formalParameter_super_optionalNamed_defaultValue() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class A {
   A({int a = 0});
 }
@@ -20407,7 +20923,7 @@
   }
 
   test_constructor_secondary_formalParameter_super_optionalNamed_unresolved() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class A {
   A({required int a});
 }
@@ -20473,7 +20989,7 @@
   }
 
   test_constructor_secondary_formalParameter_super_optionalNamed_unresolved2() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class A {
   A(int a);
 }
@@ -20539,7 +21055,7 @@
   }
 
   test_constructor_secondary_formalParameter_super_optionalPositional() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class A {
   A(int a, double b);
 }
@@ -20626,7 +21142,7 @@
   }
 
   test_constructor_secondary_formalParameter_super_requiredNamed() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class A {
   A({required int a, required double b});
 }
@@ -20718,7 +21234,7 @@
   }
 
   test_constructor_secondary_formalParameter_super_requiredNamed_defaultValue() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class A {
   A({int a = 0});
 }
@@ -20792,7 +21308,7 @@
   }
 
   test_constructor_secondary_formalParameter_super_requiredPositional() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class A {
   A(int a, double b);
 }
@@ -20879,7 +21395,7 @@
   }
 
   test_constructor_secondary_formalParameter_super_requiredPositional_explicitType_functionTypedSuffix() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class A {
   A(Object? a);
 }
@@ -20959,7 +21475,7 @@
   }
 
   test_constructor_secondary_formalParameter_super_requiredPositional_explicitType_interface() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class A {
   A(num a);
 }
@@ -21025,7 +21541,7 @@
   }
 
   test_constructor_secondary_formalParameter_super_requiredPositional_explicitType_interface_nullable() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class A {
   A(num? a);
 }
@@ -21093,7 +21609,7 @@
   test_constructor_secondary_formalParameter_super_requiredPositional_inferenceOrder() async {
     // It is important that `B` is declared after `C`, so that we check that
     // inference happens in order - first `B`, then `C`.
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 abstract class A {
   A(int a);
 }
@@ -21189,7 +21705,7 @@
   test_constructor_secondary_formalParameter_super_requiredPositional_inferenceOrder_generic() async {
     // It is important that `C` is declared before `B`, so that we check that
     // inference happens in order - first `B`, then `C`.
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class A {
   A(int a);
 }
@@ -21293,7 +21809,7 @@
   }
 
   test_constructor_secondary_formalParameter_super_requiredPositional_invalid_topFunction() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 void f(super.a) {}
 ''');
     checkElementText(library, r'''
@@ -21322,7 +21838,7 @@
   }
 
   test_constructor_secondary_formalParameter_super_requiredPositional_unresolved() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class A {}
 
 class B extends A {
@@ -21378,7 +21894,7 @@
   }
 
   test_constructor_secondary_formalParameter_super_requiredPositional_unresolved2() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class A {
   A({required int a})
 }
@@ -21444,7 +21960,11 @@
   }
 
   test_constructor_secondary_formalParameters() async {
-    var library = await buildLibrary('class C { C(x, int y); }');
+    var library = await buildLibrary(r'''
+class C {
+  C(x, int y);
+}
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -21455,14 +21975,14 @@
         #F1 class C (nameOffset:6) (firstTokenOffset:0) (offset:6)
           element: <testLibrary>::@class::C
           constructors
-            #F2 isOriginDeclaration new (nameOffset:<null>) (firstTokenOffset:10) (offset:10)
+            #F2 isOriginDeclaration new (nameOffset:<null>) (firstTokenOffset:12) (offset:12)
               element: <testLibrary>::@class::C::@constructor::new
               typeName: C
-              typeNameOffset: 10
+              typeNameOffset: 12
               formalParameters
-                #F3 requiredPositional hasImplicitType isOriginDeclaration x (nameOffset:12) (firstTokenOffset:12) (offset:12)
+                #F3 requiredPositional hasImplicitType isOriginDeclaration x (nameOffset:14) (firstTokenOffset:14) (offset:14)
                   element: <testLibrary>::@class::C::@constructor::new::@formalParameter::x
-                #F4 requiredPositional isOriginDeclaration y (nameOffset:19) (firstTokenOffset:15) (offset:19)
+                #F4 requiredPositional isOriginDeclaration y (nameOffset:21) (firstTokenOffset:17) (offset:21)
                   element: <testLibrary>::@class::C::@constructor::new::@formalParameter::y
   classes
     isSimplyBounded class C
@@ -21483,7 +22003,9 @@
   }
 
   test_constructor_secondary_implicit_typeParameters() async {
-    var library = await buildLibrary('class C<T, U> {}');
+    var library = await buildLibrary(r'''
+class C<T, U> {}
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -21519,7 +22041,7 @@
   }
 
   test_constructor_secondary_initializers_assertInvocation() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class C {
   const C(int x) : assert(x >= 42);
 }
@@ -21574,7 +22096,7 @@
   }
 
   test_constructor_secondary_initializers_assertInvocation_message() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class C {
   const C(int x) : assert(x >= 42, 'foo');
 }
@@ -21632,7 +22154,7 @@
   }
 
   test_constructor_secondary_initializers_field() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class C {
   final x;
   const C() : x = 42;
@@ -21692,11 +22214,12 @@
   }
 
   test_constructor_secondary_initializers_field_notConst() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class C {
   final x;
   const C() : x = foo();
 }
+
 int foo() => 42;
 ''');
     // It is OK to keep non-constant initializers.
@@ -21721,7 +22244,7 @@
             #F4 isCompleteDeclaration isOriginVariable x (nameOffset:<null>) (firstTokenOffset:<null>) (offset:18)
               element: <testLibrary>::@class::C::@getter::x
       functions
-        #F5 isCompleteDeclaration isOriginDeclaration isStatic foo (nameOffset:52) (firstTokenOffset:48) (offset:52)
+        #F5 isCompleteDeclaration isOriginDeclaration isStatic foo (nameOffset:53) (firstTokenOffset:49) (offset:53)
           element: <testLibrary>::@function::foo
   classes
     isSimplyBounded class C
@@ -21769,7 +22292,7 @@
   }
 
   test_constructor_secondary_initializers_field_optionalPositionalFormalParameter() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class A {
   final int _f;
   const A([int f = 0]) : _f = f;
@@ -21844,7 +22367,7 @@
   }
 
   test_constructor_secondary_initializers_field_recordLiteral() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class C {
   final Object x;
   const C(int a) : x = (0, a);
@@ -22069,7 +22592,7 @@
   }
 
   test_constructor_secondary_initializers_field_withFormalParameter() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class C {
   final x;
   const C(int p) : x = 1 + p;
@@ -22145,14 +22668,14 @@
   }
 
   test_constructor_secondary_initializers_genericFunctionType() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class A<T> {
   const A();
 }
+
 class B {
   const B(dynamic x);
-  const B.f()
-   : this(A<Function()>());
+  const B.f() : this(A<Function()>());
 }
 ''');
     checkElementText(library, r'''
@@ -22172,21 +22695,21 @@
               element: <testLibrary>::@class::A::@constructor::new
               typeName: A
               typeNameOffset: 21
-        #F4 class B (nameOffset:34) (firstTokenOffset:28) (offset:34)
+        #F4 class B (nameOffset:35) (firstTokenOffset:29) (offset:35)
           element: <testLibrary>::@class::B
           constructors
-            #F5 isConst isOriginDeclaration new (nameOffset:<null>) (firstTokenOffset:40) (offset:46)
+            #F5 isConst isOriginDeclaration new (nameOffset:<null>) (firstTokenOffset:41) (offset:47)
               element: <testLibrary>::@class::B::@constructor::new
               typeName: B
-              typeNameOffset: 46
+              typeNameOffset: 47
               formalParameters
-                #F6 requiredPositional isOriginDeclaration x (nameOffset:56) (firstTokenOffset:48) (offset:56)
+                #F6 requiredPositional isOriginDeclaration x (nameOffset:57) (firstTokenOffset:49) (offset:57)
                   element: <testLibrary>::@class::B::@constructor::new::@formalParameter::x
-            #F7 isCompleteDeclaration isConst isOriginDeclaration f (nameOffset:70) (firstTokenOffset:62) (offset:70)
+            #F7 isCompleteDeclaration isConst isOriginDeclaration f (nameOffset:71) (firstTokenOffset:63) (offset:71)
               element: <testLibrary>::@class::B::@constructor::f
               typeName: B
-              typeNameOffset: 68
-              periodOffset: 69
+              typeNameOffset: 69
+              periodOffset: 70
   classes
     isSimplyBounded class A
       reference: <testLibrary>::@class::A
@@ -22214,48 +22737,49 @@
           firstFragment: #F7
           constantInitializers
             RedirectingConstructorInvocation
-              thisKeyword: this @79
+              thisKeyword: this @77
               argumentList: ArgumentList
-                leftParenthesis: ( @83
+                leftParenthesis: ( @81
                 arguments
                   InstanceCreationExpression
                     constructorName: ConstructorName
                       type: NamedType
-                        name: A @84
+                        name: A @82
                         typeArguments: TypeArgumentList
-                          leftBracket: < @85
+                          leftBracket: < @83
                           arguments
                             GenericFunctionType
-                              functionKeyword: Function @86
+                              functionKeyword: Function @84
                               parameters: FormalParameterList
-                                leftParenthesis: ( @94
-                                rightParenthesis: ) @95
+                                leftParenthesis: ( @92
+                                rightParenthesis: ) @93
                               declaredFragment: GenericFunctionTypeElement
                                 parameters
                                 returnType: dynamic
                                 type: dynamic Function()
                               type: dynamic Function()
-                          rightBracket: > @96
+                          rightBracket: > @94
                         element: <testLibrary>::@class::A
                         type: A<dynamic Function()>
                       element: ConstructorMember
                         baseElement: <testLibrary>::@class::A::@constructor::new
                         substitution: {T: dynamic Function()}
                     argumentList: ArgumentList
-                      leftParenthesis: ( @97
-                      rightParenthesis: ) @98
+                      leftParenthesis: ( @95
+                      rightParenthesis: ) @96
                     staticType: A<dynamic Function()>
-                rightParenthesis: ) @99
+                rightParenthesis: ) @97
               element: <testLibrary>::@class::B::@constructor::new
           redirectedConstructor: <testLibrary>::@class::B::@constructor::new
 ''');
   }
 
   test_constructor_secondary_initializers_superInvocation_argumentContextType() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class A {
   const A(List<String> values);
 }
+
 class B extends A {
   const B() : super(const []);
 }
@@ -22277,13 +22801,13 @@
               formalParameters
                 #F3 requiredPositional isOriginDeclaration values (nameOffset:33) (firstTokenOffset:20) (offset:33)
                   element: <testLibrary>::@class::A::@constructor::new::@formalParameter::values
-        #F4 hasExtendsClause class B (nameOffset:50) (firstTokenOffset:44) (offset:50)
+        #F4 hasExtendsClause class B (nameOffset:51) (firstTokenOffset:45) (offset:51)
           element: <testLibrary>::@class::B
           constructors
-            #F5 isCompleteDeclaration isConst isOriginDeclaration new (nameOffset:<null>) (firstTokenOffset:66) (offset:72)
+            #F5 isCompleteDeclaration isConst isOriginDeclaration new (nameOffset:<null>) (firstTokenOffset:67) (offset:73)
               element: <testLibrary>::@class::B::@constructor::new
               typeName: B
-              typeNameOffset: 72
+              typeNameOffset: 73
   classes
     isSimplyBounded class A
       reference: <testLibrary>::@class::A
@@ -22306,26 +22830,27 @@
           firstFragment: #F5
           constantInitializers
             SuperConstructorInvocation
-              superKeyword: super @78
+              superKeyword: super @79
               argumentList: ArgumentList
-                leftParenthesis: ( @83
+                leftParenthesis: ( @84
                 arguments
                   ListLiteral
-                    constKeyword: const @84
-                    leftBracket: [ @90
-                    rightBracket: ] @91
+                    constKeyword: const @85
+                    leftBracket: [ @91
+                    rightBracket: ] @92
                     staticType: List<String>
-                rightParenthesis: ) @92
+                rightParenthesis: ) @93
               element: <testLibrary>::@class::A::@constructor::new
           superConstructor: <testLibrary>::@class::A::@constructor::new
 ''');
   }
 
   test_constructor_secondary_initializers_superInvocation_named() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class A {
   const A.aaa(int p);
 }
+
 class C extends A {
   const C() : super.aaa(42);
 }
@@ -22348,13 +22873,13 @@
               formalParameters
                 #F3 requiredPositional isOriginDeclaration p (nameOffset:28) (firstTokenOffset:24) (offset:28)
                   element: <testLibrary>::@class::A::@constructor::aaa::@formalParameter::p
-        #F4 hasExtendsClause class C (nameOffset:40) (firstTokenOffset:34) (offset:40)
+        #F4 hasExtendsClause class C (nameOffset:41) (firstTokenOffset:35) (offset:41)
           element: <testLibrary>::@class::C
           constructors
-            #F5 isCompleteDeclaration isConst isOriginDeclaration new (nameOffset:<null>) (firstTokenOffset:56) (offset:62)
+            #F5 isCompleteDeclaration isConst isOriginDeclaration new (nameOffset:<null>) (firstTokenOffset:57) (offset:63)
               element: <testLibrary>::@class::C::@constructor::new
               typeName: C
-              typeNameOffset: 62
+              typeNameOffset: 63
   classes
     isSimplyBounded class A
       reference: <testLibrary>::@class::A
@@ -22377,29 +22902,30 @@
           firstFragment: #F5
           constantInitializers
             SuperConstructorInvocation
-              superKeyword: super @68
-              period: . @73
+              superKeyword: super @69
+              period: . @74
               constructorName: SimpleIdentifier
-                token: aaa @74
+                token: aaa @75
                 element: <testLibrary>::@class::A::@constructor::aaa
                 staticType: null
               argumentList: ArgumentList
-                leftParenthesis: ( @77
+                leftParenthesis: ( @78
                 arguments
                   IntegerLiteral
-                    literal: 42 @78
+                    literal: 42 @79
                     staticType: int
-                rightParenthesis: ) @80
+                rightParenthesis: ) @81
               element: <testLibrary>::@class::A::@constructor::aaa
           superConstructor: <testLibrary>::@class::A::@constructor::aaa
 ''');
   }
 
   test_constructor_secondary_initializers_superInvocation_named_underscore() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class A {
   const A._();
 }
+
 class B extends A {
   const B() : super._();
 }
@@ -22419,13 +22945,13 @@
               typeName: A
               typeNameOffset: 18
               periodOffset: 19
-        #F3 hasExtendsClause class B (nameOffset:33) (firstTokenOffset:27) (offset:33)
+        #F3 hasExtendsClause class B (nameOffset:34) (firstTokenOffset:28) (offset:34)
           element: <testLibrary>::@class::B
           constructors
-            #F4 isCompleteDeclaration isConst isOriginDeclaration new (nameOffset:<null>) (firstTokenOffset:49) (offset:55)
+            #F4 isCompleteDeclaration isConst isOriginDeclaration new (nameOffset:<null>) (firstTokenOffset:50) (offset:56)
               element: <testLibrary>::@class::B::@constructor::new
               typeName: B
-              typeNameOffset: 55
+              typeNameOffset: 56
   classes
     isSimplyBounded class A
       reference: <testLibrary>::@class::A
@@ -22444,25 +22970,26 @@
           firstFragment: #F4
           constantInitializers
             SuperConstructorInvocation
-              superKeyword: super @61
-              period: . @66
+              superKeyword: super @62
+              period: . @67
               constructorName: SimpleIdentifier
-                token: _ @67
+                token: _ @68
                 element: <testLibrary>::@class::A::@constructor::_
                 staticType: null
               argumentList: ArgumentList
-                leftParenthesis: ( @68
-                rightParenthesis: ) @69
+                leftParenthesis: ( @69
+                rightParenthesis: ) @70
               element: <testLibrary>::@class::A::@constructor::_
           superConstructor: <testLibrary>::@class::A::@constructor::_
 ''');
   }
 
   test_constructor_secondary_initializers_superInvocation_namedExpression() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class A {
   const A.aaa(a, {int b});
 }
+
 class C extends A {
   const C() : super.aaa(1, b: 2);
 }
@@ -22487,13 +23014,13 @@
                   element: <testLibrary>::@class::A::@constructor::aaa::@formalParameter::a
                 #F4 optionalNamed isOriginDeclaration b (nameOffset:32) (firstTokenOffset:28) (offset:32)
                   element: <testLibrary>::@class::A::@constructor::aaa::@formalParameter::b
-        #F5 hasExtendsClause class C (nameOffset:45) (firstTokenOffset:39) (offset:45)
+        #F5 hasExtendsClause class C (nameOffset:46) (firstTokenOffset:40) (offset:46)
           element: <testLibrary>::@class::C
           constructors
-            #F6 isCompleteDeclaration isConst isOriginDeclaration new (nameOffset:<null>) (firstTokenOffset:61) (offset:67)
+            #F6 isCompleteDeclaration isConst isOriginDeclaration new (nameOffset:<null>) (firstTokenOffset:62) (offset:68)
               element: <testLibrary>::@class::C::@constructor::new
               typeName: C
-              typeNameOffset: 67
+              typeNameOffset: 68
   classes
     isSimplyBounded class A
       reference: <testLibrary>::@class::A
@@ -22519,35 +23046,36 @@
           firstFragment: #F6
           constantInitializers
             SuperConstructorInvocation
-              superKeyword: super @73
-              period: . @78
+              superKeyword: super @74
+              period: . @79
               constructorName: SimpleIdentifier
-                token: aaa @79
+                token: aaa @80
                 element: <testLibrary>::@class::A::@constructor::aaa
                 staticType: null
               argumentList: ArgumentList
-                leftParenthesis: ( @82
+                leftParenthesis: ( @83
                 arguments
                   IntegerLiteral
-                    literal: 1 @83
+                    literal: 1 @84
                     staticType: int
                   NamedArgument
-                    name: b @86
-                    colon: : @87
+                    name: b @87
+                    colon: : @88
                     argumentExpression: IntegerLiteral
-                      literal: 2 @89
+                      literal: 2 @90
                       staticType: int
-                rightParenthesis: ) @90
+                rightParenthesis: ) @91
               element: <testLibrary>::@class::A::@constructor::aaa
           superConstructor: <testLibrary>::@class::A::@constructor::aaa
 ''');
   }
 
   test_constructor_secondary_initializers_superInvocation_unnamed() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class A {
   const A(int p);
 }
+
 class C extends A {
   const C.ccc() : super(42);
 }
@@ -22569,14 +23097,14 @@
               formalParameters
                 #F3 requiredPositional isOriginDeclaration p (nameOffset:24) (firstTokenOffset:20) (offset:24)
                   element: <testLibrary>::@class::A::@constructor::new::@formalParameter::p
-        #F4 hasExtendsClause class C (nameOffset:36) (firstTokenOffset:30) (offset:36)
+        #F4 hasExtendsClause class C (nameOffset:37) (firstTokenOffset:31) (offset:37)
           element: <testLibrary>::@class::C
           constructors
-            #F5 isCompleteDeclaration isConst isOriginDeclaration ccc (nameOffset:60) (firstTokenOffset:52) (offset:60)
+            #F5 isCompleteDeclaration isConst isOriginDeclaration ccc (nameOffset:61) (firstTokenOffset:53) (offset:61)
               element: <testLibrary>::@class::C::@constructor::ccc
               typeName: C
-              typeNameOffset: 58
-              periodOffset: 59
+              typeNameOffset: 59
+              periodOffset: 60
   classes
     isSimplyBounded class A
       reference: <testLibrary>::@class::A
@@ -22599,21 +23127,21 @@
           firstFragment: #F5
           constantInitializers
             SuperConstructorInvocation
-              superKeyword: super @68
+              superKeyword: super @69
               argumentList: ArgumentList
-                leftParenthesis: ( @73
+                leftParenthesis: ( @74
                 arguments
                   IntegerLiteral
-                    literal: 42 @74
+                    literal: 42 @75
                     staticType: int
-                rightParenthesis: ) @76
+                rightParenthesis: ) @77
               element: <testLibrary>::@class::A::@constructor::new
           superConstructor: <testLibrary>::@class::A::@constructor::new
 ''');
   }
 
   test_constructor_secondary_initializers_thisInvocation_argumentContextType() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class A {
   const A(List<String> values);
   const A.empty() : this(const []);
@@ -22674,7 +23202,7 @@
   }
 
   test_constructor_secondary_initializers_thisInvocation_named() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class C {
   const C() : this.named(1, 'bbb');
   const C.named(int a, String b);
@@ -22745,7 +23273,7 @@
   }
 
   test_constructor_secondary_initializers_thisInvocation_namedExpression() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class C {
   const C() : this.named(1, b: 2);
   const C.named(a, {int b});
@@ -22820,7 +23348,7 @@
   }
 
   test_constructor_secondary_initializers_thisInvocation_unnamed() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class C {
   const C.named() : this(1, 'bbb');
   const C(int a, String b);
@@ -22886,7 +23414,7 @@
   }
 
   test_constructor_secondary_named() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class C {
   C.foo();
 }
@@ -22983,7 +23511,7 @@
   test_constructor_secondary_newHead_unnamed() async {
     var library = await buildLibrary(r'''
 class C {
-  new ();
+  new();
 }
 ''');
     checkElementText(library, r'''
@@ -23014,7 +23542,7 @@
   test_constructor_secondary_newHead_unnamed_const() async {
     var library = await buildLibrary(r'''
 class C {
-  const new ();
+  const new();
 }
 ''');
     checkElementText(library, r'''
@@ -23043,11 +23571,12 @@
   }
 
   test_constructor_secondary_redirected_factory_named() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class C {
   factory C() = D.named;
   C._();
 }
+
 class D extends C {
   D.named() : super._();
 }
@@ -23072,14 +23601,14 @@
               typeName: C
               typeNameOffset: 37
               periodOffset: 38
-        #F4 hasExtendsClause class D (nameOffset:52) (firstTokenOffset:46) (offset:52)
+        #F4 hasExtendsClause class D (nameOffset:53) (firstTokenOffset:47) (offset:53)
           element: <testLibrary>::@class::D
           constructors
-            #F5 isCompleteDeclaration isOriginDeclaration named (nameOffset:70) (firstTokenOffset:68) (offset:70)
+            #F5 isCompleteDeclaration isOriginDeclaration named (nameOffset:71) (firstTokenOffset:69) (offset:71)
               element: <testLibrary>::@class::D::@constructor::named
               typeName: D
-              typeNameOffset: 68
-              periodOffset: 69
+              typeNameOffset: 69
+              periodOffset: 70
   classes
     isSimplyBounded class C
       reference: <testLibrary>::@class::C
@@ -23105,11 +23634,12 @@
   }
 
   test_constructor_secondary_redirected_factory_named_generic() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class C<T, U> {
   factory C() = D<U, T>.named;
   C._();
 }
+
 class D<T, U> extends C<U, T> {
   D.named() : super._();
 }
@@ -23139,19 +23669,19 @@
               typeName: C
               typeNameOffset: 49
               periodOffset: 50
-        #F6 hasExtendsClause class D (nameOffset:64) (firstTokenOffset:58) (offset:64)
+        #F6 hasExtendsClause class D (nameOffset:65) (firstTokenOffset:59) (offset:65)
           element: <testLibrary>::@class::D
           typeParameters
-            #F7 T (nameOffset:66) (firstTokenOffset:66) (offset:66)
+            #F7 T (nameOffset:67) (firstTokenOffset:67) (offset:67)
               element: #E2 T
-            #F8 U (nameOffset:69) (firstTokenOffset:69) (offset:69)
+            #F8 U (nameOffset:70) (firstTokenOffset:70) (offset:70)
               element: #E3 U
           constructors
-            #F9 isCompleteDeclaration isOriginDeclaration named (nameOffset:94) (firstTokenOffset:92) (offset:94)
+            #F9 isCompleteDeclaration isOriginDeclaration named (nameOffset:95) (firstTokenOffset:93) (offset:95)
               element: <testLibrary>::@class::D::@constructor::named
               typeName: D
-              typeNameOffset: 92
-              periodOffset: 93
+              typeNameOffset: 93
+              periodOffset: 94
   classes
     isSimplyBounded class C
       reference: <testLibrary>::@class::C
@@ -23191,7 +23721,7 @@
   }
 
   test_constructor_secondary_redirected_factory_named_generic_inference() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class A<T, U> implements B<T, U> {
   A.named();
 }
@@ -23267,12 +23797,14 @@
   }
 
   test_constructor_secondary_redirected_factory_named_generic_viaTypeAlias() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 typedef A<T, U> = C<T, U>;
+
 class B<T, U> {
   factory B() = A<U, T>.named;
   B._();
 }
+
 class C<T, U> extends A<U, T> {
   C.named() : super._();
 }
@@ -23284,37 +23816,37 @@
     #F0 <testLibraryFragment>
       element: <testLibrary>
       classes
-        #F1 class B (nameOffset:33) (firstTokenOffset:27) (offset:33)
+        #F1 class B (nameOffset:34) (firstTokenOffset:28) (offset:34)
           element: <testLibrary>::@class::B
           typeParameters
-            #F2 T (nameOffset:35) (firstTokenOffset:35) (offset:35)
+            #F2 T (nameOffset:36) (firstTokenOffset:36) (offset:36)
               element: #E0 T
-            #F3 U (nameOffset:38) (firstTokenOffset:38) (offset:38)
+            #F3 U (nameOffset:39) (firstTokenOffset:39) (offset:39)
               element: #E1 U
           constructors
-            #F4 isCompleteDeclaration isFactory isOriginDeclaration new (nameOffset:<null>) (firstTokenOffset:45) (offset:53)
+            #F4 isCompleteDeclaration isFactory isOriginDeclaration new (nameOffset:<null>) (firstTokenOffset:46) (offset:54)
               element: <testLibrary>::@class::B::@constructor::new
-              factoryKeywordOffset: 45
+              factoryKeywordOffset: 46
               typeName: B
-              typeNameOffset: 53
-            #F5 isOriginDeclaration _ (nameOffset:78) (firstTokenOffset:76) (offset:78)
+              typeNameOffset: 54
+            #F5 isOriginDeclaration _ (nameOffset:79) (firstTokenOffset:77) (offset:79)
               element: <testLibrary>::@class::B::@constructor::_
               typeName: B
-              typeNameOffset: 76
-              periodOffset: 77
-        #F6 hasExtendsClause class C (nameOffset:91) (firstTokenOffset:85) (offset:91)
+              typeNameOffset: 77
+              periodOffset: 78
+        #F6 hasExtendsClause class C (nameOffset:93) (firstTokenOffset:87) (offset:93)
           element: <testLibrary>::@class::C
           typeParameters
-            #F7 T (nameOffset:93) (firstTokenOffset:93) (offset:93)
+            #F7 T (nameOffset:95) (firstTokenOffset:95) (offset:95)
               element: #E2 T
-            #F8 U (nameOffset:96) (firstTokenOffset:96) (offset:96)
+            #F8 U (nameOffset:98) (firstTokenOffset:98) (offset:98)
               element: #E3 U
           constructors
-            #F9 isCompleteDeclaration isOriginDeclaration named (nameOffset:121) (firstTokenOffset:119) (offset:121)
+            #F9 isCompleteDeclaration isOriginDeclaration named (nameOffset:123) (firstTokenOffset:121) (offset:123)
               element: <testLibrary>::@class::C::@constructor::named
               typeName: C
-              typeNameOffset: 119
-              periodOffset: 120
+              typeNameOffset: 121
+              periodOffset: 122
       typeAliases
         #F10 A (nameOffset:8) (firstTokenOffset:0) (offset:8)
           element: <testLibrary>::@typeAlias::A
@@ -23368,14 +23900,15 @@
   }
 
   test_constructor_secondary_redirected_factory_named_imported() async {
-    newFile('$testPackageLibPath/foo.dart', '''
+    newFile('$testPackageLibPath/foo.dart', r'''
 import 'test.dart';
 class D extends C {
   D.named() : super._();
 }
 ''');
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 import 'foo.dart';
+
 class C {
   factory C() = D.named;
   C._();
@@ -23390,19 +23923,19 @@
       libraryImports
         package:test/foo.dart
       classes
-        #F1 class C (nameOffset:25) (firstTokenOffset:19) (offset:25)
+        #F1 class C (nameOffset:26) (firstTokenOffset:20) (offset:26)
           element: <testLibrary>::@class::C
           constructors
-            #F2 isCompleteDeclaration isFactory isOriginDeclaration new (nameOffset:<null>) (firstTokenOffset:31) (offset:39)
+            #F2 isCompleteDeclaration isFactory isOriginDeclaration new (nameOffset:<null>) (firstTokenOffset:32) (offset:40)
               element: <testLibrary>::@class::C::@constructor::new
-              factoryKeywordOffset: 31
+              factoryKeywordOffset: 32
               typeName: C
-              typeNameOffset: 39
-            #F3 isOriginDeclaration _ (nameOffset:58) (firstTokenOffset:56) (offset:58)
+              typeNameOffset: 40
+            #F3 isOriginDeclaration _ (nameOffset:59) (firstTokenOffset:57) (offset:59)
               element: <testLibrary>::@class::C::@constructor::_
               typeName: C
-              typeNameOffset: 56
-              periodOffset: 57
+              typeNameOffset: 57
+              periodOffset: 58
   classes
     isSimplyBounded class C
       reference: <testLibrary>::@class::C
@@ -23419,14 +23952,15 @@
   }
 
   test_constructor_secondary_redirected_factory_named_imported_generic() async {
-    newFile('$testPackageLibPath/foo.dart', '''
+    newFile('$testPackageLibPath/foo.dart', r'''
 import 'test.dart';
 class D<T, U> extends C<U, T> {
   D.named() : super._();
 }
 ''');
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 import 'foo.dart';
+
 class C<T, U> {
   factory C() = D<U, T>.named;
   C._();
@@ -23441,24 +23975,24 @@
       libraryImports
         package:test/foo.dart
       classes
-        #F1 class C (nameOffset:25) (firstTokenOffset:19) (offset:25)
+        #F1 class C (nameOffset:26) (firstTokenOffset:20) (offset:26)
           element: <testLibrary>::@class::C
           typeParameters
-            #F2 T (nameOffset:27) (firstTokenOffset:27) (offset:27)
+            #F2 T (nameOffset:28) (firstTokenOffset:28) (offset:28)
               element: #E0 T
-            #F3 U (nameOffset:30) (firstTokenOffset:30) (offset:30)
+            #F3 U (nameOffset:31) (firstTokenOffset:31) (offset:31)
               element: #E1 U
           constructors
-            #F4 isCompleteDeclaration isFactory isOriginDeclaration new (nameOffset:<null>) (firstTokenOffset:37) (offset:45)
+            #F4 isCompleteDeclaration isFactory isOriginDeclaration new (nameOffset:<null>) (firstTokenOffset:38) (offset:46)
               element: <testLibrary>::@class::C::@constructor::new
-              factoryKeywordOffset: 37
+              factoryKeywordOffset: 38
               typeName: C
-              typeNameOffset: 45
-            #F5 isOriginDeclaration _ (nameOffset:70) (firstTokenOffset:68) (offset:70)
+              typeNameOffset: 46
+            #F5 isOriginDeclaration _ (nameOffset:71) (firstTokenOffset:69) (offset:71)
               element: <testLibrary>::@class::C::@constructor::_
               typeName: C
-              typeNameOffset: 68
-              periodOffset: 69
+              typeNameOffset: 69
+              periodOffset: 70
   classes
     isSimplyBounded class C
       reference: <testLibrary>::@class::C
@@ -23482,14 +24016,15 @@
   }
 
   test_constructor_secondary_redirected_factory_named_prefixed() async {
-    newFile('$testPackageLibPath/foo.dart', '''
+    newFile('$testPackageLibPath/foo.dart', r'''
 import 'test.dart';
 class D extends C {
   D.named() : super._();
 }
 ''');
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 import 'foo.dart' as foo;
+
 class C {
   factory C() = foo.D.named;
   C._();
@@ -23507,19 +24042,19 @@
         <testLibraryFragment>::@prefix::foo
           fragments: @21
       classes
-        #F1 class C (nameOffset:32) (firstTokenOffset:26) (offset:32)
+        #F1 class C (nameOffset:33) (firstTokenOffset:27) (offset:33)
           element: <testLibrary>::@class::C
           constructors
-            #F2 isCompleteDeclaration isFactory isOriginDeclaration new (nameOffset:<null>) (firstTokenOffset:38) (offset:46)
+            #F2 isCompleteDeclaration isFactory isOriginDeclaration new (nameOffset:<null>) (firstTokenOffset:39) (offset:47)
               element: <testLibrary>::@class::C::@constructor::new
-              factoryKeywordOffset: 38
+              factoryKeywordOffset: 39
               typeName: C
-              typeNameOffset: 46
-            #F3 isOriginDeclaration _ (nameOffset:69) (firstTokenOffset:67) (offset:69)
+              typeNameOffset: 47
+            #F3 isOriginDeclaration _ (nameOffset:70) (firstTokenOffset:68) (offset:70)
               element: <testLibrary>::@class::C::@constructor::_
               typeName: C
-              typeNameOffset: 67
-              periodOffset: 68
+              typeNameOffset: 68
+              periodOffset: 69
   classes
     isSimplyBounded class C
       reference: <testLibrary>::@class::C
@@ -23536,14 +24071,15 @@
   }
 
   test_constructor_secondary_redirected_factory_named_prefixed_generic() async {
-    newFile('$testPackageLibPath/foo.dart', '''
+    newFile('$testPackageLibPath/foo.dart', r'''
 import 'test.dart';
 class D<T, U> extends C<U, T> {
   D.named() : super._();
 }
 ''');
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 import 'foo.dart' as foo;
+
 class C<T, U> {
   factory C() = foo.D<U, T>.named;
   C._();
@@ -23561,24 +24097,24 @@
         <testLibraryFragment>::@prefix::foo
           fragments: @21
       classes
-        #F1 class C (nameOffset:32) (firstTokenOffset:26) (offset:32)
+        #F1 class C (nameOffset:33) (firstTokenOffset:27) (offset:33)
           element: <testLibrary>::@class::C
           typeParameters
-            #F2 T (nameOffset:34) (firstTokenOffset:34) (offset:34)
+            #F2 T (nameOffset:35) (firstTokenOffset:35) (offset:35)
               element: #E0 T
-            #F3 U (nameOffset:37) (firstTokenOffset:37) (offset:37)
+            #F3 U (nameOffset:38) (firstTokenOffset:38) (offset:38)
               element: #E1 U
           constructors
-            #F4 isCompleteDeclaration isFactory isOriginDeclaration new (nameOffset:<null>) (firstTokenOffset:44) (offset:52)
+            #F4 isCompleteDeclaration isFactory isOriginDeclaration new (nameOffset:<null>) (firstTokenOffset:45) (offset:53)
               element: <testLibrary>::@class::C::@constructor::new
-              factoryKeywordOffset: 44
+              factoryKeywordOffset: 45
               typeName: C
-              typeNameOffset: 52
-            #F5 isOriginDeclaration _ (nameOffset:81) (firstTokenOffset:79) (offset:81)
+              typeNameOffset: 53
+            #F5 isOriginDeclaration _ (nameOffset:82) (firstTokenOffset:80) (offset:82)
               element: <testLibrary>::@class::C::@constructor::_
               typeName: C
-              typeNameOffset: 79
-              periodOffset: 80
+              typeNameOffset: 80
+              periodOffset: 81
   classes
     isSimplyBounded class C
       reference: <testLibrary>::@class::C
@@ -23602,7 +24138,7 @@
   }
 
   test_constructor_secondary_redirected_factory_named_unresolved_class() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class C<E> {
   factory C() = D.named<E>;
 }
@@ -23640,8 +24176,9 @@
   }
 
   test_constructor_secondary_redirected_factory_named_unresolved_constructor() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class D {}
+
 class C<E> {
   factory C() = D.named<E>;
 }
@@ -23659,17 +24196,17 @@
             #F2 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:6)
               element: <testLibrary>::@class::D::@constructor::new
               typeName: D
-        #F3 class C (nameOffset:17) (firstTokenOffset:11) (offset:17)
+        #F3 class C (nameOffset:18) (firstTokenOffset:12) (offset:18)
           element: <testLibrary>::@class::C
           typeParameters
-            #F4 E (nameOffset:19) (firstTokenOffset:19) (offset:19)
+            #F4 E (nameOffset:20) (firstTokenOffset:20) (offset:20)
               element: #E0 E
           constructors
-            #F5 isCompleteDeclaration isFactory isOriginDeclaration new (nameOffset:<null>) (firstTokenOffset:26) (offset:34)
+            #F5 isCompleteDeclaration isFactory isOriginDeclaration new (nameOffset:<null>) (firstTokenOffset:27) (offset:35)
               element: <testLibrary>::@class::C::@constructor::new
-              factoryKeywordOffset: 26
+              factoryKeywordOffset: 27
               typeName: C
-              typeNameOffset: 34
+              typeNameOffset: 35
   classes
     isSimplyBounded class D
       reference: <testLibrary>::@class::D
@@ -23692,11 +24229,12 @@
   }
 
   test_constructor_secondary_redirected_factory_unnamed() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class C {
   factory C() = D;
   C._();
 }
+
 class D extends C {
   D() : super._();
 }
@@ -23721,13 +24259,13 @@
               typeName: C
               typeNameOffset: 31
               periodOffset: 32
-        #F4 hasExtendsClause class D (nameOffset:46) (firstTokenOffset:40) (offset:46)
+        #F4 hasExtendsClause class D (nameOffset:47) (firstTokenOffset:41) (offset:47)
           element: <testLibrary>::@class::D
           constructors
-            #F5 isCompleteDeclaration isOriginDeclaration new (nameOffset:<null>) (firstTokenOffset:62) (offset:62)
+            #F5 isCompleteDeclaration isOriginDeclaration new (nameOffset:<null>) (firstTokenOffset:63) (offset:63)
               element: <testLibrary>::@class::D::@constructor::new
               typeName: D
-              typeNameOffset: 62
+              typeNameOffset: 63
   classes
     isSimplyBounded class C
       reference: <testLibrary>::@class::C
@@ -23753,11 +24291,12 @@
   }
 
   test_constructor_secondary_redirected_factory_unnamed_generic() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class C<T, U> {
   factory C() = D<U, T>;
   C._();
 }
+
 class D<T, U> extends C<U, T> {
   D() : super._();
 }
@@ -23787,18 +24326,18 @@
               typeName: C
               typeNameOffset: 43
               periodOffset: 44
-        #F6 hasExtendsClause class D (nameOffset:58) (firstTokenOffset:52) (offset:58)
+        #F6 hasExtendsClause class D (nameOffset:59) (firstTokenOffset:53) (offset:59)
           element: <testLibrary>::@class::D
           typeParameters
-            #F7 T (nameOffset:60) (firstTokenOffset:60) (offset:60)
+            #F7 T (nameOffset:61) (firstTokenOffset:61) (offset:61)
               element: #E2 T
-            #F8 U (nameOffset:63) (firstTokenOffset:63) (offset:63)
+            #F8 U (nameOffset:64) (firstTokenOffset:64) (offset:64)
               element: #E3 U
           constructors
-            #F9 isCompleteDeclaration isOriginDeclaration new (nameOffset:<null>) (firstTokenOffset:86) (offset:86)
+            #F9 isCompleteDeclaration isOriginDeclaration new (nameOffset:<null>) (firstTokenOffset:87) (offset:87)
               element: <testLibrary>::@class::D::@constructor::new
               typeName: D
-              typeNameOffset: 86
+              typeNameOffset: 87
   classes
     isSimplyBounded class C
       reference: <testLibrary>::@class::C
@@ -23838,7 +24377,7 @@
   }
 
   test_constructor_secondary_redirected_factory_unnamed_generic_inference() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class A<T, U> implements B<T, U> {
   A();
 }
@@ -23913,7 +24452,7 @@
   }
 
   test_constructor_secondary_redirected_factory_unnamed_generic_inference_self() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class A<T> {
   A();
   factory A.redirected() = A;
@@ -23963,12 +24502,14 @@
   }
 
   test_constructor_secondary_redirected_factory_unnamed_generic_viaTypeAlias() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 typedef A<T, U> = C<T, U>;
+
 class B<T, U> {
   factory B() = A<U, T>;
   B_();
 }
+
 class C<T, U> extends B<U, T> {
   C() : super._();
 }
@@ -23980,34 +24521,34 @@
     #F0 <testLibraryFragment>
       element: <testLibrary>
       classes
-        #F1 class B (nameOffset:33) (firstTokenOffset:27) (offset:33)
+        #F1 class B (nameOffset:34) (firstTokenOffset:28) (offset:34)
           element: <testLibrary>::@class::B
           typeParameters
-            #F2 T (nameOffset:35) (firstTokenOffset:35) (offset:35)
+            #F2 T (nameOffset:36) (firstTokenOffset:36) (offset:36)
               element: #E0 T
-            #F3 U (nameOffset:38) (firstTokenOffset:38) (offset:38)
+            #F3 U (nameOffset:39) (firstTokenOffset:39) (offset:39)
               element: #E1 U
           constructors
-            #F4 isCompleteDeclaration isFactory isOriginDeclaration new (nameOffset:<null>) (firstTokenOffset:45) (offset:53)
+            #F4 isCompleteDeclaration isFactory isOriginDeclaration new (nameOffset:<null>) (firstTokenOffset:46) (offset:54)
               element: <testLibrary>::@class::B::@constructor::new
-              factoryKeywordOffset: 45
+              factoryKeywordOffset: 46
               typeName: B
-              typeNameOffset: 53
+              typeNameOffset: 54
           methods
-            #F5 hasImplicitReturnType isAbstract isOriginDeclaration B_ (nameOffset:70) (firstTokenOffset:70) (offset:70)
+            #F5 hasImplicitReturnType isAbstract isOriginDeclaration B_ (nameOffset:71) (firstTokenOffset:71) (offset:71)
               element: <testLibrary>::@class::B::@method::B_
-        #F6 hasExtendsClause class C (nameOffset:84) (firstTokenOffset:78) (offset:84)
+        #F6 hasExtendsClause class C (nameOffset:86) (firstTokenOffset:80) (offset:86)
           element: <testLibrary>::@class::C
           typeParameters
-            #F7 T (nameOffset:86) (firstTokenOffset:86) (offset:86)
+            #F7 T (nameOffset:88) (firstTokenOffset:88) (offset:88)
               element: #E2 T
-            #F8 U (nameOffset:89) (firstTokenOffset:89) (offset:89)
+            #F8 U (nameOffset:91) (firstTokenOffset:91) (offset:91)
               element: #E3 U
           constructors
-            #F9 isCompleteDeclaration isOriginDeclaration new (nameOffset:<null>) (firstTokenOffset:112) (offset:112)
+            #F9 isCompleteDeclaration isOriginDeclaration new (nameOffset:<null>) (firstTokenOffset:114) (offset:114)
               element: <testLibrary>::@class::C::@constructor::new
               typeName: C
-              typeNameOffset: 112
+              typeNameOffset: 114
       typeAliases
         #F10 A (nameOffset:8) (firstTokenOffset:0) (offset:8)
           element: <testLibrary>::@typeAlias::A
@@ -24064,14 +24605,15 @@
   }
 
   test_constructor_secondary_redirected_factory_unnamed_imported() async {
-    newFile('$testPackageLibPath/foo.dart', '''
+    newFile('$testPackageLibPath/foo.dart', r'''
 import 'test.dart';
 class D extends C {
   D() : super._();
 }
 ''');
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 import 'foo.dart';
+
 class C {
   factory C() = D;
   C._();
@@ -24086,19 +24628,19 @@
       libraryImports
         package:test/foo.dart
       classes
-        #F1 class C (nameOffset:25) (firstTokenOffset:19) (offset:25)
+        #F1 class C (nameOffset:26) (firstTokenOffset:20) (offset:26)
           element: <testLibrary>::@class::C
           constructors
-            #F2 isCompleteDeclaration isFactory isOriginDeclaration new (nameOffset:<null>) (firstTokenOffset:31) (offset:39)
+            #F2 isCompleteDeclaration isFactory isOriginDeclaration new (nameOffset:<null>) (firstTokenOffset:32) (offset:40)
               element: <testLibrary>::@class::C::@constructor::new
-              factoryKeywordOffset: 31
+              factoryKeywordOffset: 32
               typeName: C
-              typeNameOffset: 39
-            #F3 isOriginDeclaration _ (nameOffset:52) (firstTokenOffset:50) (offset:52)
+              typeNameOffset: 40
+            #F3 isOriginDeclaration _ (nameOffset:53) (firstTokenOffset:51) (offset:53)
               element: <testLibrary>::@class::C::@constructor::_
               typeName: C
-              typeNameOffset: 50
-              periodOffset: 51
+              typeNameOffset: 51
+              periodOffset: 52
   classes
     isSimplyBounded class C
       reference: <testLibrary>::@class::C
@@ -24115,14 +24657,15 @@
   }
 
   test_constructor_secondary_redirected_factory_unnamed_imported_generic() async {
-    newFile('$testPackageLibPath/foo.dart', '''
+    newFile('$testPackageLibPath/foo.dart', r'''
 import 'test.dart';
 class D<T, U> extends C<U, T> {
   D() : super._();
 }
 ''');
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 import 'foo.dart';
+
 class C<T, U> {
   factory C() = D<U, T>;
   C._();
@@ -24137,24 +24680,24 @@
       libraryImports
         package:test/foo.dart
       classes
-        #F1 class C (nameOffset:25) (firstTokenOffset:19) (offset:25)
+        #F1 class C (nameOffset:26) (firstTokenOffset:20) (offset:26)
           element: <testLibrary>::@class::C
           typeParameters
-            #F2 T (nameOffset:27) (firstTokenOffset:27) (offset:27)
+            #F2 T (nameOffset:28) (firstTokenOffset:28) (offset:28)
               element: #E0 T
-            #F3 U (nameOffset:30) (firstTokenOffset:30) (offset:30)
+            #F3 U (nameOffset:31) (firstTokenOffset:31) (offset:31)
               element: #E1 U
           constructors
-            #F4 isCompleteDeclaration isFactory isOriginDeclaration new (nameOffset:<null>) (firstTokenOffset:37) (offset:45)
+            #F4 isCompleteDeclaration isFactory isOriginDeclaration new (nameOffset:<null>) (firstTokenOffset:38) (offset:46)
               element: <testLibrary>::@class::C::@constructor::new
-              factoryKeywordOffset: 37
+              factoryKeywordOffset: 38
               typeName: C
-              typeNameOffset: 45
-            #F5 isOriginDeclaration _ (nameOffset:64) (firstTokenOffset:62) (offset:64)
+              typeNameOffset: 46
+            #F5 isOriginDeclaration _ (nameOffset:65) (firstTokenOffset:63) (offset:65)
               element: <testLibrary>::@class::C::@constructor::_
               typeName: C
-              typeNameOffset: 62
-              periodOffset: 63
+              typeNameOffset: 63
+              periodOffset: 64
   classes
     isSimplyBounded class C
       reference: <testLibrary>::@class::C
@@ -24178,15 +24721,16 @@
   }
 
   test_constructor_secondary_redirected_factory_unnamed_imported_viaTypeAlias() async {
-    newFile('$testPackageLibPath/foo.dart', '''
+    newFile('$testPackageLibPath/foo.dart', r'''
 import 'test.dart';
 typedef A = B;
 class B extends C {
   B() : super._();
 }
 ''');
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 import 'foo.dart';
+
 class C {
   factory C() = A;
   C._();
@@ -24201,19 +24745,19 @@
       libraryImports
         package:test/foo.dart
       classes
-        #F1 class C (nameOffset:25) (firstTokenOffset:19) (offset:25)
+        #F1 class C (nameOffset:26) (firstTokenOffset:20) (offset:26)
           element: <testLibrary>::@class::C
           constructors
-            #F2 isCompleteDeclaration isFactory isOriginDeclaration new (nameOffset:<null>) (firstTokenOffset:31) (offset:39)
+            #F2 isCompleteDeclaration isFactory isOriginDeclaration new (nameOffset:<null>) (firstTokenOffset:32) (offset:40)
               element: <testLibrary>::@class::C::@constructor::new
-              factoryKeywordOffset: 31
+              factoryKeywordOffset: 32
               typeName: C
-              typeNameOffset: 39
-            #F3 isOriginDeclaration _ (nameOffset:52) (firstTokenOffset:50) (offset:52)
+              typeNameOffset: 40
+            #F3 isOriginDeclaration _ (nameOffset:53) (firstTokenOffset:51) (offset:53)
               element: <testLibrary>::@class::C::@constructor::_
               typeName: C
-              typeNameOffset: 50
-              periodOffset: 51
+              typeNameOffset: 51
+              periodOffset: 52
   classes
     isSimplyBounded class C
       reference: <testLibrary>::@class::C
@@ -24230,14 +24774,15 @@
   }
 
   test_constructor_secondary_redirected_factory_unnamed_prefixed() async {
-    newFile('$testPackageLibPath/foo.dart', '''
+    newFile('$testPackageLibPath/foo.dart', r'''
 import 'test.dart';
 class D extends C {
   D() : super._();
 }
 ''');
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 import 'foo.dart' as foo;
+
 class C {
   factory C() = foo.D;
   C._();
@@ -24255,19 +24800,19 @@
         <testLibraryFragment>::@prefix::foo
           fragments: @21
       classes
-        #F1 class C (nameOffset:32) (firstTokenOffset:26) (offset:32)
+        #F1 class C (nameOffset:33) (firstTokenOffset:27) (offset:33)
           element: <testLibrary>::@class::C
           constructors
-            #F2 isCompleteDeclaration isFactory isOriginDeclaration new (nameOffset:<null>) (firstTokenOffset:38) (offset:46)
+            #F2 isCompleteDeclaration isFactory isOriginDeclaration new (nameOffset:<null>) (firstTokenOffset:39) (offset:47)
               element: <testLibrary>::@class::C::@constructor::new
-              factoryKeywordOffset: 38
+              factoryKeywordOffset: 39
               typeName: C
-              typeNameOffset: 46
-            #F3 isOriginDeclaration _ (nameOffset:63) (firstTokenOffset:61) (offset:63)
+              typeNameOffset: 47
+            #F3 isOriginDeclaration _ (nameOffset:64) (firstTokenOffset:62) (offset:64)
               element: <testLibrary>::@class::C::@constructor::_
               typeName: C
-              typeNameOffset: 61
-              periodOffset: 62
+              typeNameOffset: 62
+              periodOffset: 63
   classes
     isSimplyBounded class C
       reference: <testLibrary>::@class::C
@@ -24284,14 +24829,15 @@
   }
 
   test_constructor_secondary_redirected_factory_unnamed_prefixed_generic() async {
-    newFile('$testPackageLibPath/foo.dart', '''
+    newFile('$testPackageLibPath/foo.dart', r'''
 import 'test.dart';
 class D<T, U> extends C<U, T> {
   D() : super._();
 }
 ''');
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 import 'foo.dart' as foo;
+
 class C<T, U> {
   factory C() = foo.D<U, T>;
   C._();
@@ -24309,24 +24855,24 @@
         <testLibraryFragment>::@prefix::foo
           fragments: @21
       classes
-        #F1 class C (nameOffset:32) (firstTokenOffset:26) (offset:32)
+        #F1 class C (nameOffset:33) (firstTokenOffset:27) (offset:33)
           element: <testLibrary>::@class::C
           typeParameters
-            #F2 T (nameOffset:34) (firstTokenOffset:34) (offset:34)
+            #F2 T (nameOffset:35) (firstTokenOffset:35) (offset:35)
               element: #E0 T
-            #F3 U (nameOffset:37) (firstTokenOffset:37) (offset:37)
+            #F3 U (nameOffset:38) (firstTokenOffset:38) (offset:38)
               element: #E1 U
           constructors
-            #F4 isCompleteDeclaration isFactory isOriginDeclaration new (nameOffset:<null>) (firstTokenOffset:44) (offset:52)
+            #F4 isCompleteDeclaration isFactory isOriginDeclaration new (nameOffset:<null>) (firstTokenOffset:45) (offset:53)
               element: <testLibrary>::@class::C::@constructor::new
-              factoryKeywordOffset: 44
+              factoryKeywordOffset: 45
               typeName: C
-              typeNameOffset: 52
-            #F5 isOriginDeclaration _ (nameOffset:75) (firstTokenOffset:73) (offset:75)
+              typeNameOffset: 53
+            #F5 isOriginDeclaration _ (nameOffset:76) (firstTokenOffset:74) (offset:76)
               element: <testLibrary>::@class::C::@constructor::_
               typeName: C
-              typeNameOffset: 73
-              periodOffset: 74
+              typeNameOffset: 74
+              periodOffset: 75
   classes
     isSimplyBounded class C
       reference: <testLibrary>::@class::C
@@ -24350,15 +24896,16 @@
   }
 
   test_constructor_secondary_redirected_factory_unnamed_prefixed_viaTypeAlias() async {
-    newFile('$testPackageLibPath/foo.dart', '''
+    newFile('$testPackageLibPath/foo.dart', r'''
 import 'test.dart';
 typedef A = B;
 class B extends C {
   B() : super._();
 }
 ''');
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 import 'foo.dart' as foo;
+
 class C {
   factory C() = foo.A;
   C._();
@@ -24376,19 +24923,19 @@
         <testLibraryFragment>::@prefix::foo
           fragments: @21
       classes
-        #F1 class C (nameOffset:32) (firstTokenOffset:26) (offset:32)
+        #F1 class C (nameOffset:33) (firstTokenOffset:27) (offset:33)
           element: <testLibrary>::@class::C
           constructors
-            #F2 isCompleteDeclaration isFactory isOriginDeclaration new (nameOffset:<null>) (firstTokenOffset:38) (offset:46)
+            #F2 isCompleteDeclaration isFactory isOriginDeclaration new (nameOffset:<null>) (firstTokenOffset:39) (offset:47)
               element: <testLibrary>::@class::C::@constructor::new
-              factoryKeywordOffset: 38
+              factoryKeywordOffset: 39
               typeName: C
-              typeNameOffset: 46
-            #F3 isOriginDeclaration _ (nameOffset:63) (firstTokenOffset:61) (offset:63)
+              typeNameOffset: 47
+            #F3 isOriginDeclaration _ (nameOffset:64) (firstTokenOffset:62) (offset:64)
               element: <testLibrary>::@class::C::@constructor::_
               typeName: C
-              typeNameOffset: 61
-              periodOffset: 62
+              typeNameOffset: 62
+              periodOffset: 63
   classes
     isSimplyBounded class C
       reference: <testLibrary>::@class::C
@@ -24405,7 +24952,7 @@
   }
 
   test_constructor_secondary_redirected_factory_unnamed_unresolved() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class C<E> {
   factory C() = D<E>;
 }
@@ -24443,12 +24990,14 @@
   }
 
   test_constructor_secondary_redirected_factory_unnamed_viaTypeAlias() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 typedef A = C;
+
 class B {
   factory B() = A;
   B._();
 }
+
 class C extends B {
   C() : super._();
 }
@@ -24460,26 +25009,26 @@
     #F0 <testLibraryFragment>
       element: <testLibrary>
       classes
-        #F1 class B (nameOffset:21) (firstTokenOffset:15) (offset:21)
+        #F1 class B (nameOffset:22) (firstTokenOffset:16) (offset:22)
           element: <testLibrary>::@class::B
           constructors
-            #F2 isCompleteDeclaration isFactory isOriginDeclaration new (nameOffset:<null>) (firstTokenOffset:27) (offset:35)
+            #F2 isCompleteDeclaration isFactory isOriginDeclaration new (nameOffset:<null>) (firstTokenOffset:28) (offset:36)
               element: <testLibrary>::@class::B::@constructor::new
-              factoryKeywordOffset: 27
+              factoryKeywordOffset: 28
               typeName: B
-              typeNameOffset: 35
-            #F3 isOriginDeclaration _ (nameOffset:48) (firstTokenOffset:46) (offset:48)
+              typeNameOffset: 36
+            #F3 isOriginDeclaration _ (nameOffset:49) (firstTokenOffset:47) (offset:49)
               element: <testLibrary>::@class::B::@constructor::_
               typeName: B
-              typeNameOffset: 46
-              periodOffset: 47
-        #F4 hasExtendsClause class C (nameOffset:61) (firstTokenOffset:55) (offset:61)
+              typeNameOffset: 47
+              periodOffset: 48
+        #F4 hasExtendsClause class C (nameOffset:63) (firstTokenOffset:57) (offset:63)
           element: <testLibrary>::@class::C
           constructors
-            #F5 isCompleteDeclaration isOriginDeclaration new (nameOffset:<null>) (firstTokenOffset:77) (offset:77)
+            #F5 isCompleteDeclaration isOriginDeclaration new (nameOffset:<null>) (firstTokenOffset:79) (offset:79)
               element: <testLibrary>::@class::C::@constructor::new
               typeName: C
-              typeNameOffset: 77
+              typeNameOffset: 79
       typeAliases
         #F6 A (nameOffset:8) (firstTokenOffset:0) (offset:8)
           element: <testLibrary>::@typeAlias::A
@@ -24513,7 +25062,7 @@
   }
 
   test_constructor_secondary_redirected_thisInvocation_named() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class C {
   const C.named();
   const C() : this.named();
@@ -24566,7 +25115,7 @@
   }
 
   test_constructor_secondary_redirected_thisInvocation_named_generic() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class C<T> {
   const C.named();
   const C() : this.named();
@@ -24625,7 +25174,7 @@
   }
 
   test_constructor_secondary_redirected_thisInvocation_named_notConst() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class C {
   C.named();
   C() : this.named();
@@ -24666,7 +25215,7 @@
   }
 
   test_constructor_secondary_redirected_thisInvocation_unnamed() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class C {
   const C();
   const C.named() : this();
@@ -24714,7 +25263,7 @@
   }
 
   test_constructor_secondary_redirected_thisInvocation_unnamed_generic() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class C<T> {
   const C();
   const C.named() : this();
@@ -24768,7 +25317,7 @@
   }
 
   test_constructor_secondary_redirected_thisInvocation_unnamed_notConst() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class C {
   C();
   C.named() : this();
@@ -24909,7 +25458,9 @@
   test_constructor_secondary_superConstructor_generic01() async {
     var library = await buildLibrary(r'''
 class A {}
+
 class B<U> extends A {}
+
 class C extends B<int> {}
 ''');
 
@@ -24923,10 +25474,10 @@
     #F0 <testLibraryFragment>
       element: <testLibrary>
       classes
-        #F1 hasExtendsClause class C (nameOffset:41) (firstTokenOffset:35) (offset:41)
+        #F1 hasExtendsClause class C (nameOffset:43) (firstTokenOffset:37) (offset:43)
           element: <testLibrary>::@class::C
           constructors
-            #F2 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:41)
+            #F2 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:43)
               element: <testLibrary>::@class::C::@constructor::new
               typeName: C
   classes
@@ -24948,7 +25499,9 @@
   test_constructor_secondary_superConstructor_generic11() async {
     var library = await buildLibrary(r'''
 class A<T> {}
+
 class B<U> extends A<String> {}
+
 class C extends B<int> {}
 ''');
 
@@ -24962,10 +25515,10 @@
     #F0 <testLibraryFragment>
       element: <testLibrary>
       classes
-        #F1 hasExtendsClause class C (nameOffset:52) (firstTokenOffset:46) (offset:52)
+        #F1 hasExtendsClause class C (nameOffset:54) (firstTokenOffset:48) (offset:54)
           element: <testLibrary>::@class::C
           constructors
-            #F2 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:52)
+            #F2 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:54)
               element: <testLibrary>::@class::C::@constructor::new
               typeName: C
   classes
@@ -24988,10 +25541,11 @@
   }
 
   test_constructor_secondary_superConstructor_generic_named() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class A<T> {
   A.named(T a);
 }
+
 class B extends A<int> {
   B() : super.named(0);
 }
@@ -25017,13 +25571,13 @@
               formalParameters
                 #F4 requiredPositional isOriginDeclaration a (nameOffset:25) (firstTokenOffset:23) (offset:25)
                   element: <testLibrary>::@class::A::@constructor::named::@formalParameter::a
-        #F5 hasExtendsClause class B (nameOffset:37) (firstTokenOffset:31) (offset:37)
+        #F5 hasExtendsClause class B (nameOffset:38) (firstTokenOffset:32) (offset:38)
           element: <testLibrary>::@class::B
           constructors
-            #F6 isCompleteDeclaration isOriginDeclaration new (nameOffset:<null>) (firstTokenOffset:58) (offset:58)
+            #F6 isCompleteDeclaration isOriginDeclaration new (nameOffset:<null>) (firstTokenOffset:59) (offset:59)
               element: <testLibrary>::@class::B::@constructor::new
               typeName: B
-              typeNameOffset: 58
+              typeNameOffset: 59
   classes
     isSimplyBounded class A
       reference: <testLibrary>::@class::A
@@ -25054,10 +25608,11 @@
   }
 
   test_constructor_secondary_superConstructor_notGeneric_named() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class A {
   A.named();
 }
+
 class B extends A {
   B() : super.named();
 }
@@ -25077,13 +25632,13 @@
               typeName: A
               typeNameOffset: 12
               periodOffset: 13
-        #F3 hasExtendsClause class B (nameOffset:31) (firstTokenOffset:25) (offset:31)
+        #F3 hasExtendsClause class B (nameOffset:32) (firstTokenOffset:26) (offset:32)
           element: <testLibrary>::@class::B
           constructors
-            #F4 isCompleteDeclaration isOriginDeclaration new (nameOffset:<null>) (firstTokenOffset:47) (offset:47)
+            #F4 isCompleteDeclaration isOriginDeclaration new (nameOffset:<null>) (firstTokenOffset:48) (offset:48)
               element: <testLibrary>::@class::B::@constructor::new
               typeName: B
-              typeNameOffset: 47
+              typeNameOffset: 48
   classes
     isSimplyBounded class A
       reference: <testLibrary>::@class::A
@@ -25105,8 +25660,9 @@
   }
 
   test_constructor_secondary_superConstructor_notGeneric_unnamed_explicit() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class A {}
+
 class B extends A {
   B() : super();
 }
@@ -25124,13 +25680,13 @@
             #F2 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:6)
               element: <testLibrary>::@class::A::@constructor::new
               typeName: A
-        #F3 hasExtendsClause class B (nameOffset:17) (firstTokenOffset:11) (offset:17)
+        #F3 hasExtendsClause class B (nameOffset:18) (firstTokenOffset:12) (offset:18)
           element: <testLibrary>::@class::B
           constructors
-            #F4 isCompleteDeclaration isOriginDeclaration new (nameOffset:<null>) (firstTokenOffset:33) (offset:33)
+            #F4 isCompleteDeclaration isOriginDeclaration new (nameOffset:<null>) (firstTokenOffset:34) (offset:34)
               element: <testLibrary>::@class::B::@constructor::new
               typeName: B
-              typeNameOffset: 33
+              typeNameOffset: 34
   classes
     isSimplyBounded class A
       reference: <testLibrary>::@class::A
@@ -25152,8 +25708,9 @@
   }
 
   test_constructor_secondary_superConstructor_notGeneric_unnamed_implicit() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class A {}
+
 class B extends A {
   B();
 }
@@ -25171,13 +25728,13 @@
             #F2 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:6)
               element: <testLibrary>::@class::A::@constructor::new
               typeName: A
-        #F3 hasExtendsClause class B (nameOffset:17) (firstTokenOffset:11) (offset:17)
+        #F3 hasExtendsClause class B (nameOffset:18) (firstTokenOffset:12) (offset:18)
           element: <testLibrary>::@class::B
           constructors
-            #F4 isOriginDeclaration new (nameOffset:<null>) (firstTokenOffset:33) (offset:33)
+            #F4 isOriginDeclaration new (nameOffset:<null>) (firstTokenOffset:34) (offset:34)
               element: <testLibrary>::@class::B::@constructor::new
               typeName: B
-              typeNameOffset: 33
+              typeNameOffset: 34
   classes
     isSimplyBounded class A
       reference: <testLibrary>::@class::A
@@ -25199,8 +25756,9 @@
   }
 
   test_constructor_secondary_superConstructor_notGeneric_unnamed_implicit2() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class A {}
+
 class B extends A {}
 ''');
     checkElementText(library, r'''
@@ -25216,10 +25774,10 @@
             #F2 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:6)
               element: <testLibrary>::@class::A::@constructor::new
               typeName: A
-        #F3 hasExtendsClause class B (nameOffset:17) (firstTokenOffset:11) (offset:17)
+        #F3 hasExtendsClause class B (nameOffset:18) (firstTokenOffset:12) (offset:18)
           element: <testLibrary>::@class::B
           constructors
-            #F4 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:17)
+            #F4 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:18)
               element: <testLibrary>::@class::B::@constructor::new
               typeName: B
   classes
@@ -25243,7 +25801,7 @@
   }
 
   test_constructor_secondary_unnamed() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class C {
   C();
 }
@@ -25275,7 +25833,9 @@
   }
 
   test_constructor_secondary_unnamed_implicit() async {
-    var library = await buildLibrary('class C {}');
+    var library = await buildLibrary(r'''
+class C {}
+''');
     configuration.withDisplayName = true;
     checkElementText(library, r'''
 library
@@ -25302,7 +25862,7 @@
   }
 
   test_constructor_secondary_unnamed_new() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class C {
   C.new();
 }
@@ -25335,11 +25895,12 @@
   }
 
   test_constructor_secondary_withCycles_const() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class C {
   final x;
   const C() : x = const D();
 }
+
 class D {
   final x;
   const D() : x = const C();
@@ -25365,18 +25926,18 @@
           getters
             #F4 isCompleteDeclaration isOriginVariable x (nameOffset:<null>) (firstTokenOffset:<null>) (offset:18)
               element: <testLibrary>::@class::C::@getter::x
-        #F5 class D (nameOffset:58) (firstTokenOffset:52) (offset:58)
+        #F5 class D (nameOffset:59) (firstTokenOffset:53) (offset:59)
           element: <testLibrary>::@class::D
           fields
-            #F6 hasImplicitType isFinal isOriginDeclaration x (nameOffset:70) (firstTokenOffset:70) (offset:70)
+            #F6 hasImplicitType isFinal isOriginDeclaration x (nameOffset:71) (firstTokenOffset:71) (offset:71)
               element: <testLibrary>::@class::D::@field::x
           constructors
-            #F7 isCompleteDeclaration isConst isOriginDeclaration new (nameOffset:<null>) (firstTokenOffset:75) (offset:81)
+            #F7 isCompleteDeclaration isConst isOriginDeclaration new (nameOffset:<null>) (firstTokenOffset:76) (offset:82)
               element: <testLibrary>::@class::D::@constructor::new
               typeName: D
-              typeNameOffset: 81
+              typeNameOffset: 82
           getters
-            #F8 isCompleteDeclaration isOriginVariable x (nameOffset:<null>) (firstTokenOffset:<null>) (offset:70)
+            #F8 isCompleteDeclaration isOriginVariable x (nameOffset:<null>) (firstTokenOffset:<null>) (offset:71)
               element: <testLibrary>::@class::D::@getter::x
   classes
     isSimplyBounded class C
@@ -25433,21 +25994,21 @@
           constantInitializers
             ConstructorFieldInitializer
               fieldName: SimpleIdentifier
-                token: x @87
+                token: x @88
                 element: <testLibrary>::@class::D::@field::x
                 staticType: null
-              equals: = @89
+              equals: = @90
               expression: InstanceCreationExpression
-                keyword: const @91
+                keyword: const @92
                 constructorName: ConstructorName
                   type: NamedType
-                    name: C @97
+                    name: C @98
                     element: <testLibrary>::@class::C
                     type: C
                   element: <testLibrary>::@class::C::@constructor::new
                 argumentList: ArgumentList
-                  leftParenthesis: ( @98
-                  rightParenthesis: ) @99
+                  leftParenthesis: ( @99
+                  rightParenthesis: ) @100
                 staticType: C
       getters
         isOriginVariable x
@@ -25459,11 +26020,12 @@
   }
 
   test_constructor_secondary_withCycles_nonConst() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class C {
   final x;
   C() : x = new D();
 }
+
 class D {
   final x;
   D() : x = new C();
@@ -25489,18 +26051,18 @@
           getters
             #F4 isCompleteDeclaration isOriginVariable x (nameOffset:<null>) (firstTokenOffset:<null>) (offset:18)
               element: <testLibrary>::@class::C::@getter::x
-        #F5 class D (nameOffset:50) (firstTokenOffset:44) (offset:50)
+        #F5 class D (nameOffset:51) (firstTokenOffset:45) (offset:51)
           element: <testLibrary>::@class::D
           fields
-            #F6 hasImplicitType isFinal isOriginDeclaration x (nameOffset:62) (firstTokenOffset:62) (offset:62)
+            #F6 hasImplicitType isFinal isOriginDeclaration x (nameOffset:63) (firstTokenOffset:63) (offset:63)
               element: <testLibrary>::@class::D::@field::x
           constructors
-            #F7 isCompleteDeclaration isOriginDeclaration new (nameOffset:<null>) (firstTokenOffset:67) (offset:67)
+            #F7 isCompleteDeclaration isOriginDeclaration new (nameOffset:<null>) (firstTokenOffset:68) (offset:68)
               element: <testLibrary>::@class::D::@constructor::new
               typeName: D
-              typeNameOffset: 67
+              typeNameOffset: 68
           getters
-            #F8 isCompleteDeclaration isOriginVariable x (nameOffset:<null>) (firstTokenOffset:<null>) (offset:62)
+            #F8 isCompleteDeclaration isOriginVariable x (nameOffset:<null>) (firstTokenOffset:<null>) (offset:63)
               element: <testLibrary>::@class::D::@getter::x
   classes
     isSimplyBounded class C
@@ -25545,7 +26107,7 @@
   }
 
   test_field_abstract() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 abstract class C {
   abstract int i;
 }
@@ -26810,7 +27372,6 @@
 augment class A {
   augment int foo = 2;
 }
-
 ''');
 
     checkElementText(library, r'''
@@ -27550,7 +28111,11 @@
   }
 
   test_field_const() async {
-    var library = await buildLibrary('class C { static const int i = 0; }');
+    var library = await buildLibrary(r'''
+class C {
+  static const int i = 0;
+}
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -27561,18 +28126,18 @@
         #F1 class C (nameOffset:6) (firstTokenOffset:0) (offset:6)
           element: <testLibrary>::@class::C
           fields
-            #F2 hasInitializer isConst isOriginDeclaration isStatic i (nameOffset:27) (firstTokenOffset:27) (offset:27)
+            #F2 hasInitializer isConst isOriginDeclaration isStatic i (nameOffset:29) (firstTokenOffset:29) (offset:29)
               element: <testLibrary>::@class::C::@field::i
               initializer: expression_0
                 IntegerLiteral
-                  literal: 0 @31
+                  literal: 0 @33
                   staticType: int
           constructors
             #F3 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:6)
               element: <testLibrary>::@class::C::@constructor::new
               typeName: C
           getters
-            #F4 isCompleteDeclaration isOriginVariable isStatic i (nameOffset:<null>) (firstTokenOffset:<null>) (offset:27)
+            #F4 isCompleteDeclaration isOriginVariable isStatic i (nameOffset:<null>) (firstTokenOffset:<null>) (offset:29)
               element: <testLibrary>::@class::C::@getter::i
   classes
     isSimplyBounded class C
@@ -27601,9 +28166,11 @@
   }
 
   test_field_const_late() async {
-    var library = await buildLibrary(
-      'class C { static late const int i = 0; }',
-    );
+    var library = await buildLibrary(r'''
+class C {
+  static late const int i = 0;
+}
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -27614,18 +28181,18 @@
         #F1 class C (nameOffset:6) (firstTokenOffset:0) (offset:6)
           element: <testLibrary>::@class::C
           fields
-            #F2 hasInitializer isConst isLate isOriginDeclaration isStatic i (nameOffset:32) (firstTokenOffset:32) (offset:32)
+            #F2 hasInitializer isConst isLate isOriginDeclaration isStatic i (nameOffset:34) (firstTokenOffset:34) (offset:34)
               element: <testLibrary>::@class::C::@field::i
               initializer: expression_0
                 IntegerLiteral
-                  literal: 0 @36
+                  literal: 0 @38
                   staticType: int
           constructors
             #F3 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:6)
               element: <testLibrary>::@class::C::@constructor::new
               typeName: C
           getters
-            #F4 isCompleteDeclaration isOriginVariable isStatic i (nameOffset:<null>) (firstTokenOffset:<null>) (offset:32)
+            #F4 isCompleteDeclaration isOriginVariable isStatic i (nameOffset:<null>) (firstTokenOffset:<null>) (offset:34)
               element: <testLibrary>::@class::C::@getter::i
   classes
     isSimplyBounded class C
@@ -27654,10 +28221,11 @@
   }
 
   test_field_covariant() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class C {
   covariant int x;
-}''');
+}
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -27718,13 +28286,14 @@
   }
 
   test_field_documented() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class C {
   /**
    * Docs
    */
   var x;
-}''');
+}
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -27787,7 +28356,7 @@
   }
 
   test_field_duplicate_getter() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class C {
   int foo = 0;
   int get foo => 0;
@@ -27867,7 +28436,7 @@
   }
 
   test_field_duplicate_setter() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class C {
   int foo = 0;
   set foo(int _) {}
@@ -27954,7 +28523,7 @@
   }
 
   test_field_external() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 abstract class C {
   external int i;
 }
@@ -28019,7 +28588,7 @@
   }
 
   test_field_final_hasInitializer_hasConstConstructor() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class C {
   final x = 42;
   const C();
@@ -28076,10 +28645,11 @@
   }
 
   test_field_final_hasInitializer_hasConstConstructor_genericFunctionType() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class A<T> {
   const A();
 }
+
 class B {
   final f = const A<int Function(double a)>();
   const B();
@@ -28102,38 +28672,38 @@
               element: <testLibrary>::@class::A::@constructor::new
               typeName: A
               typeNameOffset: 21
-        #F4 class B (nameOffset:34) (firstTokenOffset:28) (offset:34)
+        #F4 class B (nameOffset:35) (firstTokenOffset:29) (offset:35)
           element: <testLibrary>::@class::B
           fields
-            #F5 hasImplicitType hasInitializer isFinal isOriginDeclaration f (nameOffset:46) (firstTokenOffset:46) (offset:46)
+            #F5 hasImplicitType hasInitializer isFinal isOriginDeclaration f (nameOffset:47) (firstTokenOffset:47) (offset:47)
               element: <testLibrary>::@class::B::@field::f
               initializer: expression_0
                 InstanceCreationExpression
-                  keyword: const @50
+                  keyword: const @51
                   constructorName: ConstructorName
                     type: NamedType
-                      name: A @56
+                      name: A @57
                       typeArguments: TypeArgumentList
-                        leftBracket: < @57
+                        leftBracket: < @58
                         arguments
                           GenericFunctionType
                             returnType: NamedType
-                              name: int @58
+                              name: int @59
                               element: dart:core::@class::int
                               type: int
-                            functionKeyword: Function @62
+                            functionKeyword: Function @63
                             parameters: FormalParameterList
-                              leftParenthesis: ( @70
+                              leftParenthesis: ( @71
                               parameter: RegularFormalParameter
                                 type: NamedType
-                                  name: double @71
+                                  name: double @72
                                   element: dart:core::@class::double
                                   type: double
-                                name: a @78
-                                declaredFragment: <testLibraryFragment> a@78
+                                name: a @79
+                                declaredFragment: <testLibraryFragment> a@79
                                   element: isPublic
                                     type: double
-                              rightParenthesis: ) @79
+                              rightParenthesis: ) @80
                             declaredFragment: GenericFunctionTypeElement
                               parameters
                                 a
@@ -28143,23 +28713,23 @@
                               returnType: int
                               type: int Function(double)
                             type: int Function(double)
-                        rightBracket: > @80
+                        rightBracket: > @81
                       element: <testLibrary>::@class::A
                       type: A<int Function(double)>
                     element: ConstructorMember
                       baseElement: <testLibrary>::@class::A::@constructor::new
                       substitution: {T: int Function(double)}
                   argumentList: ArgumentList
-                    leftParenthesis: ( @81
-                    rightParenthesis: ) @82
+                    leftParenthesis: ( @82
+                    rightParenthesis: ) @83
                   staticType: A<int Function(double)>
           constructors
-            #F6 isConst isOriginDeclaration new (nameOffset:<null>) (firstTokenOffset:87) (offset:93)
+            #F6 isConst isOriginDeclaration new (nameOffset:<null>) (firstTokenOffset:88) (offset:94)
               element: <testLibrary>::@class::B::@constructor::new
               typeName: B
-              typeNameOffset: 93
+              typeNameOffset: 94
           getters
-            #F7 isCompleteDeclaration isOriginVariable f (nameOffset:<null>) (firstTokenOffset:<null>) (offset:46)
+            #F7 isCompleteDeclaration isOriginVariable f (nameOffset:<null>) (firstTokenOffset:<null>) (offset:47)
               element: <testLibrary>::@class::B::@getter::f
   classes
     isSimplyBounded class A
@@ -28198,7 +28768,7 @@
   }
 
   test_field_final_hasInitializer_noConstConstructor() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class C {
   final x = 42;
 }
@@ -28322,10 +28892,16 @@
   }
 
   test_field_formalParameter_inferredType_implicit() async {
-    var library = await buildLibrary(
-      'class C extends D { var v; C(this.v); }'
-      ' abstract class D { int get v; }',
-    );
+    var library = await buildLibrary(r'''
+class C extends D {
+  var v;
+  C(this.v);
+}
+
+abstract class D {
+  int get v;
+}
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -28336,36 +28912,36 @@
         #F1 hasExtendsClause class C (nameOffset:6) (firstTokenOffset:0) (offset:6)
           element: <testLibrary>::@class::C
           fields
-            #F2 hasImplicitType isOriginDeclaration v (nameOffset:24) (firstTokenOffset:24) (offset:24)
+            #F2 hasImplicitType isOriginDeclaration v (nameOffset:26) (firstTokenOffset:26) (offset:26)
               element: <testLibrary>::@class::C::@field::v
           constructors
-            #F3 isCompleteDeclaration isOriginDeclaration new (nameOffset:<null>) (firstTokenOffset:27) (offset:27)
+            #F3 isCompleteDeclaration isOriginDeclaration new (nameOffset:<null>) (firstTokenOffset:31) (offset:31)
               element: <testLibrary>::@class::C::@constructor::new
               typeName: C
-              typeNameOffset: 27
+              typeNameOffset: 31
               formalParameters
-                #F4 requiredPositional hasImplicitType isFinal isOriginDeclaration this.v (nameOffset:34) (firstTokenOffset:29) (offset:34)
+                #F4 requiredPositional hasImplicitType isFinal isOriginDeclaration this.v (nameOffset:38) (firstTokenOffset:33) (offset:38)
                   element: <testLibrary>::@class::C::@constructor::new::@formalParameter::v
           getters
-            #F5 isCompleteDeclaration isOriginVariable v (nameOffset:<null>) (firstTokenOffset:<null>) (offset:24)
+            #F5 isCompleteDeclaration isOriginVariable v (nameOffset:<null>) (firstTokenOffset:<null>) (offset:26)
               element: <testLibrary>::@class::C::@getter::v
           setters
-            #F6 isCompleteDeclaration isOriginVariable v (nameOffset:<null>) (firstTokenOffset:<null>) (offset:24)
+            #F6 isCompleteDeclaration isOriginVariable v (nameOffset:<null>) (firstTokenOffset:<null>) (offset:26)
               element: <testLibrary>::@class::C::@setter::v
               formalParameters
-                #F7 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:24)
+                #F7 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:26)
                   element: <testLibrary>::@class::C::@setter::v::@formalParameter::value
-        #F8 isAbstract class D (nameOffset:55) (firstTokenOffset:40) (offset:55)
+        #F8 isAbstract class D (nameOffset:60) (firstTokenOffset:45) (offset:60)
           element: <testLibrary>::@class::D
           fields
-            #F9 isOriginGetterSetter v (nameOffset:<null>) (firstTokenOffset:<null>) (offset:55)
+            #F9 isOriginGetterSetter v (nameOffset:<null>) (firstTokenOffset:<null>) (offset:60)
               element: <testLibrary>::@class::D::@field::v
           constructors
-            #F10 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:55)
+            #F10 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:60)
               element: <testLibrary>::@class::D::@constructor::new
               typeName: D
           getters
-            #F11 isAbstract isOriginDeclaration v (nameOffset:67) (firstTokenOffset:59) (offset:67)
+            #F11 isAbstract isOriginDeclaration v (nameOffset:74) (firstTokenOffset:66) (offset:74)
               element: <testLibrary>::@class::D::@getter::v
   classes
     hasNonFinalField isSimplyBounded class C
@@ -28428,7 +29004,11 @@
   }
 
   test_field_implicit_type() async {
-    var library = await buildLibrary('class C { var x; }');
+    var library = await buildLibrary(r'''
+class C {
+  var x;
+}
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -28439,20 +29019,20 @@
         #F1 class C (nameOffset:6) (firstTokenOffset:0) (offset:6)
           element: <testLibrary>::@class::C
           fields
-            #F2 hasImplicitType isOriginDeclaration x (nameOffset:14) (firstTokenOffset:14) (offset:14)
+            #F2 hasImplicitType isOriginDeclaration x (nameOffset:16) (firstTokenOffset:16) (offset:16)
               element: <testLibrary>::@class::C::@field::x
           constructors
             #F3 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:6)
               element: <testLibrary>::@class::C::@constructor::new
               typeName: C
           getters
-            #F4 isCompleteDeclaration isOriginVariable x (nameOffset:<null>) (firstTokenOffset:<null>) (offset:14)
+            #F4 isCompleteDeclaration isOriginVariable x (nameOffset:<null>) (firstTokenOffset:<null>) (offset:16)
               element: <testLibrary>::@class::C::@getter::x
           setters
-            #F5 isCompleteDeclaration isOriginVariable x (nameOffset:<null>) (firstTokenOffset:<null>) (offset:14)
+            #F5 isCompleteDeclaration isOriginVariable x (nameOffset:<null>) (firstTokenOffset:<null>) (offset:16)
               element: <testLibrary>::@class::C::@setter::x
               formalParameters
-                #F6 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:14)
+                #F6 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:16)
                   element: <testLibrary>::@class::C::@setter::x::@formalParameter::value
   classes
     hasNonFinalField isSimplyBounded class C
@@ -28489,7 +29069,11 @@
   }
 
   test_field_implicit_type_late() async {
-    var library = await buildLibrary('class C { late var x; }');
+    var library = await buildLibrary(r'''
+class C {
+  late var x;
+}
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -28500,20 +29084,20 @@
         #F1 class C (nameOffset:6) (firstTokenOffset:0) (offset:6)
           element: <testLibrary>::@class::C
           fields
-            #F2 hasImplicitType isLate isOriginDeclaration x (nameOffset:19) (firstTokenOffset:19) (offset:19)
+            #F2 hasImplicitType isLate isOriginDeclaration x (nameOffset:21) (firstTokenOffset:21) (offset:21)
               element: <testLibrary>::@class::C::@field::x
           constructors
             #F3 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:6)
               element: <testLibrary>::@class::C::@constructor::new
               typeName: C
           getters
-            #F4 isCompleteDeclaration isOriginVariable x (nameOffset:<null>) (firstTokenOffset:<null>) (offset:19)
+            #F4 isCompleteDeclaration isOriginVariable x (nameOffset:<null>) (firstTokenOffset:<null>) (offset:21)
               element: <testLibrary>::@class::C::@getter::x
           setters
-            #F5 isCompleteDeclaration isOriginVariable x (nameOffset:<null>) (firstTokenOffset:<null>) (offset:19)
+            #F5 isCompleteDeclaration isOriginVariable x (nameOffset:<null>) (firstTokenOffset:<null>) (offset:21)
               element: <testLibrary>::@class::C::@setter::x
               formalParameters
-                #F6 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:19)
+                #F6 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:21)
                   element: <testLibrary>::@class::C::@setter::x::@formalParameter::value
   classes
     hasNonFinalField isSimplyBounded class C
@@ -28550,7 +29134,11 @@
   }
 
   test_field_inferred_type_nonStatic_explicit_initialized() async {
-    var library = await buildLibrary('class C { num v = 0; }');
+    var library = await buildLibrary(r'''
+class C {
+  num v = 0;
+}
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -28561,20 +29149,20 @@
         #F1 class C (nameOffset:6) (firstTokenOffset:0) (offset:6)
           element: <testLibrary>::@class::C
           fields
-            #F2 hasInitializer isOriginDeclaration v (nameOffset:14) (firstTokenOffset:14) (offset:14)
+            #F2 hasInitializer isOriginDeclaration v (nameOffset:16) (firstTokenOffset:16) (offset:16)
               element: <testLibrary>::@class::C::@field::v
           constructors
             #F3 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:6)
               element: <testLibrary>::@class::C::@constructor::new
               typeName: C
           getters
-            #F4 isCompleteDeclaration isOriginVariable v (nameOffset:<null>) (firstTokenOffset:<null>) (offset:14)
+            #F4 isCompleteDeclaration isOriginVariable v (nameOffset:<null>) (firstTokenOffset:<null>) (offset:16)
               element: <testLibrary>::@class::C::@getter::v
           setters
-            #F5 isCompleteDeclaration isOriginVariable v (nameOffset:<null>) (firstTokenOffset:<null>) (offset:14)
+            #F5 isCompleteDeclaration isOriginVariable v (nameOffset:<null>) (firstTokenOffset:<null>) (offset:16)
               element: <testLibrary>::@class::C::@setter::v
               formalParameters
-                #F6 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:14)
+                #F6 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:16)
                   element: <testLibrary>::@class::C::@setter::v::@formalParameter::value
   classes
     hasNonFinalField isSimplyBounded class C
@@ -28611,7 +29199,11 @@
   }
 
   test_field_inferred_type_nonStatic_implicit_initialized() async {
-    var library = await buildLibrary('class C { var v = 0; }');
+    var library = await buildLibrary(r'''
+class C {
+  var v = 0;
+}
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -28622,20 +29214,20 @@
         #F1 class C (nameOffset:6) (firstTokenOffset:0) (offset:6)
           element: <testLibrary>::@class::C
           fields
-            #F2 hasImplicitType hasInitializer isOriginDeclaration v (nameOffset:14) (firstTokenOffset:14) (offset:14)
+            #F2 hasImplicitType hasInitializer isOriginDeclaration v (nameOffset:16) (firstTokenOffset:16) (offset:16)
               element: <testLibrary>::@class::C::@field::v
           constructors
             #F3 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:6)
               element: <testLibrary>::@class::C::@constructor::new
               typeName: C
           getters
-            #F4 isCompleteDeclaration isOriginVariable v (nameOffset:<null>) (firstTokenOffset:<null>) (offset:14)
+            #F4 isCompleteDeclaration isOriginVariable v (nameOffset:<null>) (firstTokenOffset:<null>) (offset:16)
               element: <testLibrary>::@class::C::@getter::v
           setters
-            #F5 isCompleteDeclaration isOriginVariable v (nameOffset:<null>) (firstTokenOffset:<null>) (offset:14)
+            #F5 isCompleteDeclaration isOriginVariable v (nameOffset:<null>) (firstTokenOffset:<null>) (offset:16)
               element: <testLibrary>::@class::C::@setter::v
               formalParameters
-                #F6 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:14)
+                #F6 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:16)
                   element: <testLibrary>::@class::C::@setter::v::@formalParameter::value
   classes
     hasNonFinalField isSimplyBounded class C
@@ -28672,9 +29264,15 @@
   }
 
   test_field_inferred_type_nonStatic_implicit_uninitialized() async {
-    var library = await buildLibrary(
-      'class C extends D { var v; } abstract class D { int get v; }',
-    );
+    var library = await buildLibrary(r'''
+class C extends D {
+  var v;
+}
+
+abstract class D {
+  int get v;
+}
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -28685,32 +29283,32 @@
         #F1 hasExtendsClause class C (nameOffset:6) (firstTokenOffset:0) (offset:6)
           element: <testLibrary>::@class::C
           fields
-            #F2 hasImplicitType isOriginDeclaration v (nameOffset:24) (firstTokenOffset:24) (offset:24)
+            #F2 hasImplicitType isOriginDeclaration v (nameOffset:26) (firstTokenOffset:26) (offset:26)
               element: <testLibrary>::@class::C::@field::v
           constructors
             #F3 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:6)
               element: <testLibrary>::@class::C::@constructor::new
               typeName: C
           getters
-            #F4 isCompleteDeclaration isOriginVariable v (nameOffset:<null>) (firstTokenOffset:<null>) (offset:24)
+            #F4 isCompleteDeclaration isOriginVariable v (nameOffset:<null>) (firstTokenOffset:<null>) (offset:26)
               element: <testLibrary>::@class::C::@getter::v
           setters
-            #F5 isCompleteDeclaration isOriginVariable v (nameOffset:<null>) (firstTokenOffset:<null>) (offset:24)
+            #F5 isCompleteDeclaration isOriginVariable v (nameOffset:<null>) (firstTokenOffset:<null>) (offset:26)
               element: <testLibrary>::@class::C::@setter::v
               formalParameters
-                #F6 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:24)
+                #F6 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:26)
                   element: <testLibrary>::@class::C::@setter::v::@formalParameter::value
-        #F7 isAbstract class D (nameOffset:44) (firstTokenOffset:29) (offset:44)
+        #F7 isAbstract class D (nameOffset:47) (firstTokenOffset:32) (offset:47)
           element: <testLibrary>::@class::D
           fields
-            #F8 isOriginGetterSetter v (nameOffset:<null>) (firstTokenOffset:<null>) (offset:44)
+            #F8 isOriginGetterSetter v (nameOffset:<null>) (firstTokenOffset:<null>) (offset:47)
               element: <testLibrary>::@class::D::@field::v
           constructors
-            #F9 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:44)
+            #F9 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:47)
               element: <testLibrary>::@class::D::@constructor::new
               typeName: D
           getters
-            #F10 isAbstract isOriginDeclaration v (nameOffset:56) (firstTokenOffset:48) (offset:56)
+            #F10 isAbstract isOriginDeclaration v (nameOffset:61) (firstTokenOffset:53) (offset:61)
               element: <testLibrary>::@class::D::@getter::v
   classes
     hasNonFinalField isSimplyBounded class C
@@ -28770,10 +29368,12 @@
   test_field_inferred_type_nonStatic_inherited_resolveInitializer() async {
     var library = await buildLibrary(r'''
 const a = 0;
+
 abstract class A {
   const A();
   List<int> get f;
 }
+
 class B extends A {
   const B();
   final f = [a];
@@ -28786,41 +29386,41 @@
     #F0 <testLibraryFragment>
       element: <testLibrary>
       classes
-        #F1 isAbstract class A (nameOffset:28) (firstTokenOffset:13) (offset:28)
+        #F1 isAbstract class A (nameOffset:29) (firstTokenOffset:14) (offset:29)
           element: <testLibrary>::@class::A
           fields
-            #F2 isOriginGetterSetter f (nameOffset:<null>) (firstTokenOffset:<null>) (offset:28)
+            #F2 isOriginGetterSetter f (nameOffset:<null>) (firstTokenOffset:<null>) (offset:29)
               element: <testLibrary>::@class::A::@field::f
           constructors
-            #F3 isConst isOriginDeclaration new (nameOffset:<null>) (firstTokenOffset:34) (offset:40)
+            #F3 isConst isOriginDeclaration new (nameOffset:<null>) (firstTokenOffset:35) (offset:41)
               element: <testLibrary>::@class::A::@constructor::new
               typeName: A
-              typeNameOffset: 40
+              typeNameOffset: 41
           getters
-            #F4 isAbstract isOriginDeclaration f (nameOffset:61) (firstTokenOffset:47) (offset:61)
+            #F4 isAbstract isOriginDeclaration f (nameOffset:62) (firstTokenOffset:48) (offset:62)
               element: <testLibrary>::@class::A::@getter::f
-        #F5 hasExtendsClause class B (nameOffset:72) (firstTokenOffset:66) (offset:72)
+        #F5 hasExtendsClause class B (nameOffset:74) (firstTokenOffset:68) (offset:74)
           element: <testLibrary>::@class::B
           fields
-            #F6 hasImplicitType hasInitializer isFinal isOriginDeclaration f (nameOffset:107) (firstTokenOffset:107) (offset:107)
+            #F6 hasImplicitType hasInitializer isFinal isOriginDeclaration f (nameOffset:109) (firstTokenOffset:109) (offset:109)
               element: <testLibrary>::@class::B::@field::f
               initializer: expression_0
                 ListLiteral
-                  leftBracket: [ @111
+                  leftBracket: [ @113
                   elements
                     SimpleIdentifier
-                      token: a @112
+                      token: a @114
                       element: <testLibrary>::@getter::a
                       staticType: int
-                  rightBracket: ] @113
+                  rightBracket: ] @115
                   staticType: List<int>
           constructors
-            #F7 isConst isOriginDeclaration new (nameOffset:<null>) (firstTokenOffset:88) (offset:94)
+            #F7 isConst isOriginDeclaration new (nameOffset:<null>) (firstTokenOffset:90) (offset:96)
               element: <testLibrary>::@class::B::@constructor::new
               typeName: B
-              typeNameOffset: 94
+              typeNameOffset: 96
           getters
-            #F8 isCompleteDeclaration isOriginVariable f (nameOffset:<null>) (firstTokenOffset:<null>) (offset:107)
+            #F8 isCompleteDeclaration isOriginVariable f (nameOffset:<null>) (firstTokenOffset:<null>) (offset:109)
               element: <testLibrary>::@class::B::@getter::f
       topLevelVariables
         #F9 hasImplicitType hasInitializer isConst isOriginDeclaration isStatic a (nameOffset:6) (firstTokenOffset:6) (offset:6)
@@ -28895,7 +29495,11 @@
   }
 
   test_field_inferred_type_static_implicit_initialized() async {
-    var library = await buildLibrary('class C { static var v = 0; }');
+    var library = await buildLibrary(r'''
+class C {
+  static var v = 0;
+}
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -28906,20 +29510,20 @@
         #F1 class C (nameOffset:6) (firstTokenOffset:0) (offset:6)
           element: <testLibrary>::@class::C
           fields
-            #F2 hasImplicitType hasInitializer isOriginDeclaration isStatic v (nameOffset:21) (firstTokenOffset:21) (offset:21)
+            #F2 hasImplicitType hasInitializer isOriginDeclaration isStatic v (nameOffset:23) (firstTokenOffset:23) (offset:23)
               element: <testLibrary>::@class::C::@field::v
           constructors
             #F3 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:6)
               element: <testLibrary>::@class::C::@constructor::new
               typeName: C
           getters
-            #F4 isCompleteDeclaration isOriginVariable isStatic v (nameOffset:<null>) (firstTokenOffset:<null>) (offset:21)
+            #F4 isCompleteDeclaration isOriginVariable isStatic v (nameOffset:<null>) (firstTokenOffset:<null>) (offset:23)
               element: <testLibrary>::@class::C::@getter::v
           setters
-            #F5 isCompleteDeclaration isOriginVariable isStatic v (nameOffset:<null>) (firstTokenOffset:<null>) (offset:21)
+            #F5 isCompleteDeclaration isOriginVariable isStatic v (nameOffset:<null>) (firstTokenOffset:<null>) (offset:23)
               element: <testLibrary>::@class::C::@setter::v
               formalParameters
-                #F6 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:21)
+                #F6 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:23)
                   element: <testLibrary>::@class::C::@setter::v::@formalParameter::value
   classes
     isSimplyBounded class C
@@ -28956,11 +29560,12 @@
   }
 
   test_field_inheritedContextType_double() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 abstract class A {
   const A();
   double get foo;
 }
+
 class B extends A {
   const B();
   final foo = 2;
@@ -28986,22 +29591,22 @@
           getters
             #F4 isAbstract isOriginDeclaration foo (nameOffset:45) (firstTokenOffset:34) (offset:45)
               element: <testLibrary>::@class::A::@getter::foo
-        #F5 hasExtendsClause class B (nameOffset:58) (firstTokenOffset:52) (offset:58)
+        #F5 hasExtendsClause class B (nameOffset:59) (firstTokenOffset:53) (offset:59)
           element: <testLibrary>::@class::B
           fields
-            #F6 hasImplicitType hasInitializer isFinal isOriginDeclaration foo (nameOffset:93) (firstTokenOffset:93) (offset:93)
+            #F6 hasImplicitType hasInitializer isFinal isOriginDeclaration foo (nameOffset:94) (firstTokenOffset:94) (offset:94)
               element: <testLibrary>::@class::B::@field::foo
               initializer: expression_0
                 IntegerLiteral
-                  literal: 2 @99
+                  literal: 2 @100
                   staticType: double
           constructors
-            #F7 isConst isOriginDeclaration new (nameOffset:<null>) (firstTokenOffset:74) (offset:80)
+            #F7 isConst isOriginDeclaration new (nameOffset:<null>) (firstTokenOffset:75) (offset:81)
               element: <testLibrary>::@class::B::@constructor::new
               typeName: B
-              typeNameOffset: 80
+              typeNameOffset: 81
           getters
-            #F8 isCompleteDeclaration isOriginVariable foo (nameOffset:<null>) (firstTokenOffset:<null>) (offset:93)
+            #F8 isCompleteDeclaration isOriginVariable foo (nameOffset:<null>) (firstTokenOffset:<null>) (offset:94)
               element: <testLibrary>::@class::B::@getter::foo
   classes
     isAbstract isSimplyBounded class A
@@ -29171,6 +29776,7 @@
 
     var library = await buildLibrary(r'''
 part 'a.dart';
+
 class A {
   final int? _foo;
   A(this._foo);
@@ -29545,6 +30151,7 @@
 /// Implicitly implements `_foo` as a getter that forwards to [noSuchMethod].
 enum E implements B {
   v;
+
   dynamic noSuchMethod(Invocation invocation) {}
 }
 ''');
@@ -29867,7 +30474,7 @@
   }
 
   test_field_missingName() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 abstract class C {
   Object a,;
 }
@@ -29961,7 +30568,7 @@
   }
 
   test_field_ofGeneric_refEnclosingTypeParameter_false() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class C<T> {
   late int foo;
 }
@@ -30025,7 +30632,7 @@
   }
 
   test_field_ofGeneric_refEnclosingTypeParameter_true() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class C<T> {
   late T foo;
 }
@@ -30089,10 +30696,11 @@
   }
 
   test_field_propagatedType_const_noDep() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class C {
   static const x = 0;
-}''');
+}
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -30143,12 +30751,16 @@
   }
 
   test_field_propagatedType_final_dep_inLib() async {
-    newFile('$testPackageLibPath/a.dart', 'final a = 1;');
-    var library = await buildLibrary('''
+    newFile('$testPackageLibPath/a.dart', r'''
+final a = 1;
+''');
+    var library = await buildLibrary(r'''
 import "a.dart";
+
 class C {
   final b = a / 2;
-}''');
+}
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -30158,17 +30770,17 @@
       libraryImports
         package:test/a.dart
       classes
-        #F1 class C (nameOffset:23) (firstTokenOffset:17) (offset:23)
+        #F1 class C (nameOffset:24) (firstTokenOffset:18) (offset:24)
           element: <testLibrary>::@class::C
           fields
-            #F2 hasImplicitType hasInitializer isFinal isOriginDeclaration b (nameOffset:35) (firstTokenOffset:35) (offset:35)
+            #F2 hasImplicitType hasInitializer isFinal isOriginDeclaration b (nameOffset:36) (firstTokenOffset:36) (offset:36)
               element: <testLibrary>::@class::C::@field::b
           constructors
-            #F3 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:23)
+            #F3 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:24)
               element: <testLibrary>::@class::C::@constructor::new
               typeName: C
           getters
-            #F4 isCompleteDeclaration isOriginVariable b (nameOffset:<null>) (firstTokenOffset:<null>) (offset:35)
+            #F4 isCompleteDeclaration isOriginVariable b (nameOffset:<null>) (firstTokenOffset:<null>) (offset:36)
               element: <testLibrary>::@class::C::@getter::b
   classes
     isSimplyBounded class C
@@ -30194,13 +30806,19 @@
   }
 
   test_field_propagatedType_final_dep_inPart() async {
-    newFile('$testPackageLibPath/a.dart', 'part of lib; final a = 1;');
-    var library = await buildLibrary('''
+    newFile('$testPackageLibPath/a.dart', r'''
+part of lib;
+final a = 1;
+''');
+    var library = await buildLibrary(r'''
 library lib;
+
 part "a.dart";
+
 class C {
   final b = a / 2;
-}''');
+}
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -30212,20 +30830,20 @@
       parts
         part_0
           uri: package:test/a.dart
-          partKeywordOffset: 13
+          partKeywordOffset: 14
           unit: #F1
       classes
-        #F2 class C (nameOffset:34) (firstTokenOffset:28) (offset:34)
+        #F2 class C (nameOffset:36) (firstTokenOffset:30) (offset:36)
           element: <testLibrary>::@class::C
           fields
-            #F3 hasImplicitType hasInitializer isFinal isOriginDeclaration b (nameOffset:46) (firstTokenOffset:46) (offset:46)
+            #F3 hasImplicitType hasInitializer isFinal isOriginDeclaration b (nameOffset:48) (firstTokenOffset:48) (offset:48)
               element: <testLibrary>::@class::C::@field::b
           constructors
-            #F4 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:34)
+            #F4 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:36)
               element: <testLibrary>::@class::C::@constructor::new
               typeName: C
           getters
-            #F5 isCompleteDeclaration isOriginVariable b (nameOffset:<null>) (firstTokenOffset:<null>) (offset:46)
+            #F5 isCompleteDeclaration isOriginVariable b (nameOffset:<null>) (firstTokenOffset:<null>) (offset:48)
               element: <testLibrary>::@class::C::@getter::b
     #F1 package:test/a.dart
       element: <testLibrary>
@@ -30273,10 +30891,11 @@
   }
 
   test_field_propagatedType_final_noDep_instance() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class C {
   final x = 0;
-}''');
+}
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -30320,10 +30939,11 @@
   }
 
   test_field_propagatedType_final_noDep_static() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class C {
   static final x = 0;
-}''');
+}
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -30367,7 +30987,11 @@
   }
 
   test_field_static() async {
-    var library = await buildLibrary('class C { static int i; }');
+    var library = await buildLibrary(r'''
+class C {
+  static int i;
+}
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -30378,20 +31002,20 @@
         #F1 class C (nameOffset:6) (firstTokenOffset:0) (offset:6)
           element: <testLibrary>::@class::C
           fields
-            #F2 isOriginDeclaration isStatic i (nameOffset:21) (firstTokenOffset:21) (offset:21)
+            #F2 isOriginDeclaration isStatic i (nameOffset:23) (firstTokenOffset:23) (offset:23)
               element: <testLibrary>::@class::C::@field::i
           constructors
             #F3 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:6)
               element: <testLibrary>::@class::C::@constructor::new
               typeName: C
           getters
-            #F4 isCompleteDeclaration isOriginVariable isStatic i (nameOffset:<null>) (firstTokenOffset:<null>) (offset:21)
+            #F4 isCompleteDeclaration isOriginVariable isStatic i (nameOffset:<null>) (firstTokenOffset:<null>) (offset:23)
               element: <testLibrary>::@class::C::@getter::i
           setters
-            #F5 isCompleteDeclaration isOriginVariable isStatic i (nameOffset:<null>) (firstTokenOffset:<null>) (offset:21)
+            #F5 isCompleteDeclaration isOriginVariable isStatic i (nameOffset:<null>) (firstTokenOffset:<null>) (offset:23)
               element: <testLibrary>::@class::C::@setter::i
               formalParameters
-                #F6 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:21)
+                #F6 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:23)
                   element: <testLibrary>::@class::C::@setter::i::@formalParameter::value
   classes
     isSimplyBounded class C
@@ -31078,7 +31702,7 @@
   }
 
   test_field_static_final_hasConstConstructor() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class C {
   static final f = 0;
   const C();
@@ -31128,7 +31752,11 @@
   }
 
   test_field_static_final_untyped() async {
-    var library = await buildLibrary('class C { static final x = 0; }');
+    var library = await buildLibrary(r'''
+class C {
+  static final x = 0;
+}
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -31139,14 +31767,14 @@
         #F1 class C (nameOffset:6) (firstTokenOffset:0) (offset:6)
           element: <testLibrary>::@class::C
           fields
-            #F2 hasImplicitType hasInitializer isFinal isOriginDeclaration isStatic x (nameOffset:23) (firstTokenOffset:23) (offset:23)
+            #F2 hasImplicitType hasInitializer isFinal isOriginDeclaration isStatic x (nameOffset:25) (firstTokenOffset:25) (offset:25)
               element: <testLibrary>::@class::C::@field::x
           constructors
             #F3 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:6)
               element: <testLibrary>::@class::C::@constructor::new
               typeName: C
           getters
-            #F4 isCompleteDeclaration isOriginVariable isStatic x (nameOffset:<null>) (firstTokenOffset:<null>) (offset:23)
+            #F4 isCompleteDeclaration isOriginVariable isStatic x (nameOffset:<null>) (firstTokenOffset:<null>) (offset:25)
               element: <testLibrary>::@class::C::@getter::x
   classes
     isSimplyBounded class C
@@ -31172,7 +31800,11 @@
   }
 
   test_field_static_late() async {
-    var library = await buildLibrary('class C { static late int i; }');
+    var library = await buildLibrary(r'''
+class C {
+  static late int i;
+}
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -31183,20 +31815,20 @@
         #F1 class C (nameOffset:6) (firstTokenOffset:0) (offset:6)
           element: <testLibrary>::@class::C
           fields
-            #F2 isLate isOriginDeclaration isStatic i (nameOffset:26) (firstTokenOffset:26) (offset:26)
+            #F2 isLate isOriginDeclaration isStatic i (nameOffset:28) (firstTokenOffset:28) (offset:28)
               element: <testLibrary>::@class::C::@field::i
           constructors
             #F3 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:6)
               element: <testLibrary>::@class::C::@constructor::new
               typeName: C
           getters
-            #F4 isCompleteDeclaration isOriginVariable isStatic i (nameOffset:<null>) (firstTokenOffset:<null>) (offset:26)
+            #F4 isCompleteDeclaration isOriginVariable isStatic i (nameOffset:<null>) (firstTokenOffset:<null>) (offset:28)
               element: <testLibrary>::@class::C::@getter::i
           setters
-            #F5 isCompleteDeclaration isOriginVariable isStatic i (nameOffset:<null>) (firstTokenOffset:<null>) (offset:26)
+            #F5 isCompleteDeclaration isOriginVariable isStatic i (nameOffset:<null>) (firstTokenOffset:<null>) (offset:28)
               element: <testLibrary>::@class::C::@setter::i
               formalParameters
-                #F6 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:26)
+                #F6 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:28)
                   element: <testLibrary>::@class::C::@setter::i::@formalParameter::value
   classes
     isSimplyBounded class C
@@ -31233,7 +31865,7 @@
   }
 
   test_field_static_typeParameter() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class A<T> {
   static T? foo;
 }
@@ -31588,7 +32220,11 @@
   }
 
   test_field_typed() async {
-    var library = await buildLibrary('class C { int x = 0; }');
+    var library = await buildLibrary(r'''
+class C {
+  int x = 0;
+}
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -31599,20 +32235,20 @@
         #F1 class C (nameOffset:6) (firstTokenOffset:0) (offset:6)
           element: <testLibrary>::@class::C
           fields
-            #F2 hasInitializer isOriginDeclaration x (nameOffset:14) (firstTokenOffset:14) (offset:14)
+            #F2 hasInitializer isOriginDeclaration x (nameOffset:16) (firstTokenOffset:16) (offset:16)
               element: <testLibrary>::@class::C::@field::x
           constructors
             #F3 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:6)
               element: <testLibrary>::@class::C::@constructor::new
               typeName: C
           getters
-            #F4 isCompleteDeclaration isOriginVariable x (nameOffset:<null>) (firstTokenOffset:<null>) (offset:14)
+            #F4 isCompleteDeclaration isOriginVariable x (nameOffset:<null>) (firstTokenOffset:<null>) (offset:16)
               element: <testLibrary>::@class::C::@getter::x
           setters
-            #F5 isCompleteDeclaration isOriginVariable x (nameOffset:<null>) (firstTokenOffset:<null>) (offset:14)
+            #F5 isCompleteDeclaration isOriginVariable x (nameOffset:<null>) (firstTokenOffset:<null>) (offset:16)
               element: <testLibrary>::@class::C::@setter::x
               formalParameters
-                #F6 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:14)
+                #F6 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:16)
                   element: <testLibrary>::@class::C::@setter::x::@formalParameter::value
   classes
     hasNonFinalField isSimplyBounded class C
@@ -31649,7 +32285,11 @@
   }
 
   test_field_untyped() async {
-    var library = await buildLibrary('class C { var x = 0; }');
+    var library = await buildLibrary(r'''
+class C {
+  var x = 0;
+}
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -31660,20 +32300,20 @@
         #F1 class C (nameOffset:6) (firstTokenOffset:0) (offset:6)
           element: <testLibrary>::@class::C
           fields
-            #F2 hasImplicitType hasInitializer isOriginDeclaration x (nameOffset:14) (firstTokenOffset:14) (offset:14)
+            #F2 hasImplicitType hasInitializer isOriginDeclaration x (nameOffset:16) (firstTokenOffset:16) (offset:16)
               element: <testLibrary>::@class::C::@field::x
           constructors
             #F3 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:6)
               element: <testLibrary>::@class::C::@constructor::new
               typeName: C
           getters
-            #F4 isCompleteDeclaration isOriginVariable x (nameOffset:<null>) (firstTokenOffset:<null>) (offset:14)
+            #F4 isCompleteDeclaration isOriginVariable x (nameOffset:<null>) (firstTokenOffset:<null>) (offset:16)
               element: <testLibrary>::@class::C::@getter::x
           setters
-            #F5 isCompleteDeclaration isOriginVariable x (nameOffset:<null>) (firstTokenOffset:<null>) (offset:14)
+            #F5 isCompleteDeclaration isOriginVariable x (nameOffset:<null>) (firstTokenOffset:<null>) (offset:16)
               element: <testLibrary>::@class::C::@setter::x
               formalParameters
-                #F6 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:14)
+                #F6 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:16)
                   element: <testLibrary>::@class::C::@setter::x::@formalParameter::value
   classes
     hasNonFinalField isSimplyBounded class C
@@ -31710,7 +32350,12 @@
   }
 
   test_fields() async {
-    var library = await buildLibrary('class C { int i; int j; }');
+    var library = await buildLibrary(r'''
+class C {
+  int i;
+  int j;
+}
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -31721,29 +32366,29 @@
         #F1 class C (nameOffset:6) (firstTokenOffset:0) (offset:6)
           element: <testLibrary>::@class::C
           fields
-            #F2 isOriginDeclaration i (nameOffset:14) (firstTokenOffset:14) (offset:14)
+            #F2 isOriginDeclaration i (nameOffset:16) (firstTokenOffset:16) (offset:16)
               element: <testLibrary>::@class::C::@field::i
-            #F3 isOriginDeclaration j (nameOffset:21) (firstTokenOffset:21) (offset:21)
+            #F3 isOriginDeclaration j (nameOffset:25) (firstTokenOffset:25) (offset:25)
               element: <testLibrary>::@class::C::@field::j
           constructors
             #F4 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:6)
               element: <testLibrary>::@class::C::@constructor::new
               typeName: C
           getters
-            #F5 isCompleteDeclaration isOriginVariable i (nameOffset:<null>) (firstTokenOffset:<null>) (offset:14)
+            #F5 isCompleteDeclaration isOriginVariable i (nameOffset:<null>) (firstTokenOffset:<null>) (offset:16)
               element: <testLibrary>::@class::C::@getter::i
-            #F6 isCompleteDeclaration isOriginVariable j (nameOffset:<null>) (firstTokenOffset:<null>) (offset:21)
+            #F6 isCompleteDeclaration isOriginVariable j (nameOffset:<null>) (firstTokenOffset:<null>) (offset:25)
               element: <testLibrary>::@class::C::@getter::j
           setters
-            #F7 isCompleteDeclaration isOriginVariable i (nameOffset:<null>) (firstTokenOffset:<null>) (offset:14)
+            #F7 isCompleteDeclaration isOriginVariable i (nameOffset:<null>) (firstTokenOffset:<null>) (offset:16)
               element: <testLibrary>::@class::C::@setter::i
               formalParameters
-                #F8 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:14)
+                #F8 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:16)
                   element: <testLibrary>::@class::C::@setter::i::@formalParameter::value
-            #F9 isCompleteDeclaration isOriginVariable j (nameOffset:<null>) (firstTokenOffset:<null>) (offset:21)
+            #F9 isCompleteDeclaration isOriginVariable j (nameOffset:<null>) (firstTokenOffset:<null>) (offset:25)
               element: <testLibrary>::@class::C::@setter::j
               formalParameters
-                #F10 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:21)
+                #F10 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:25)
                   element: <testLibrary>::@class::C::@setter::j::@formalParameter::value
   classes
     hasNonFinalField isSimplyBounded class C
@@ -31800,7 +32445,7 @@
   }
 
   test_fields_late() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class C {
   late int foo;
 }
@@ -31865,7 +32510,7 @@
   }
 
   test_fields_late_final() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class C {
   late final int foo;
 }
@@ -31930,7 +32575,7 @@
   }
 
   test_fields_late_final_initialized() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class C {
   late final int foo = 0;
 }
@@ -31978,7 +32623,7 @@
   }
 
   test_fields_late_inference_usingSuper_methodInvocation() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class A {
   int foo() => 0;
 }
@@ -32070,7 +32715,7 @@
   }
 
   test_fields_late_inference_usingSuper_propertyAccess() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class A {
   int get foo => 0;
 }
@@ -32172,7 +32817,11 @@
   }
 
   test_getter_abstract() async {
-    var library = await buildLibrary('abstract class C { int get x; }');
+    var library = await buildLibrary(r'''
+abstract class C {
+  int get x;
+}
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -32190,7 +32839,7 @@
               element: <testLibrary>::@class::C::@constructor::new
               typeName: C
           getters
-            #F4 isAbstract isOriginDeclaration x (nameOffset:27) (firstTokenOffset:19) (offset:27)
+            #F4 isAbstract isOriginDeclaration x (nameOffset:29) (firstTokenOffset:21) (offset:29)
               element: <testLibrary>::@class::C::@getter::x
   classes
     isAbstract isSimplyBounded class C
@@ -32742,6 +33391,61 @@
 ''');
   }
 
+  test_getter_augmentation_chain_returnType_int_String() async {
+    var library = await buildLibrary(r'''
+class A {
+  int get foo => 0;
+}
+
+augment class A {
+  augment String get foo => '';
+}
+''');
+
+    configuration.withConstructors = false;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  fragments
+    #F0 <testLibraryFragment>
+      element: <testLibrary>
+      classes
+        #F1 class A (nameOffset:6) (firstTokenOffset:0) (offset:6)
+          element: <testLibrary>::@class::A
+          nextFragment: #F2
+          fields
+            #F3 isOriginGetterSetter foo (nameOffset:<null>) (firstTokenOffset:<null>) (offset:6)
+              element: <testLibrary>::@class::A::@field::foo
+          getters
+            #F4 isCompleteDeclaration isOriginDeclaration foo (nameOffset:20) (firstTokenOffset:12) (offset:20)
+              element: <testLibrary>::@class::A::@getter::foo
+              nextFragment: #F5
+        #F2 isAugmentation class A (nameOffset:47) (firstTokenOffset:33) (offset:47)
+          element: <testLibrary>::@class::A
+          previousFragment: #F1
+          getters
+            #F5 isAugmentation isCompleteDeclaration isOriginDeclaration foo (nameOffset:72) (firstTokenOffset:53) (offset:72)
+              element: <testLibrary>::@class::A::@getter::foo
+              previousFragment: #F4
+  classes
+    isSimplyBounded class A
+      reference: <testLibrary>::@class::A
+      firstFragment: #F1
+      fields
+        isOriginGetterSetter foo
+          reference: <testLibrary>::@class::A::@field::foo
+          firstFragment: #F3
+          type: int
+          getter: <testLibrary>::@class::A::@getter::foo
+      getters
+        isOriginDeclaration foo
+          reference: <testLibrary>::@class::A::@getter::foo
+          firstFragment: #F4
+          returnType: int
+          variable: <testLibrary>::@class::A::@field::foo
+''');
+  }
+
   test_getter_augmentation_chain_twoInSameDeclaration() async {
     var library = await buildLibrary(r'''
 class A {
@@ -33309,7 +34013,11 @@
   }
 
   test_getter_external() async {
-    var library = await buildLibrary('class C { external int get x; }');
+    var library = await buildLibrary(r'''
+class C {
+  external int get x;
+}
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -33327,7 +34035,7 @@
               element: <testLibrary>::@class::C::@constructor::new
               typeName: C
           getters
-            #F4 isCompleteDeclaration isExternal isOriginDeclaration x (nameOffset:27) (firstTokenOffset:10) (offset:27)
+            #F4 isCompleteDeclaration isExternal isOriginDeclaration x (nameOffset:29) (firstTokenOffset:12) (offset:29)
               element: <testLibrary>::@class::C::@getter::x
   classes
     isSimplyBounded class C
@@ -33353,7 +34061,11 @@
   }
 
   test_getter_implicit_return_type() async {
-    var library = await buildLibrary('class C { get x => null; }');
+    var library = await buildLibrary(r'''
+class C {
+  get x => null;
+}
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -33371,7 +34083,7 @@
               element: <testLibrary>::@class::C::@constructor::new
               typeName: C
           getters
-            #F4 hasImplicitReturnType isCompleteDeclaration isOriginDeclaration x (nameOffset:14) (firstTokenOffset:10) (offset:14)
+            #F4 hasImplicitReturnType isCompleteDeclaration isOriginDeclaration x (nameOffset:16) (firstTokenOffset:12) (offset:16)
               element: <testLibrary>::@class::C::@getter::x
   classes
     isSimplyBounded class C
@@ -33547,9 +34259,9 @@
   }
 
   test_getter_missingName() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class A {
-  get () => 0;
+  get() => 0;
 }
 ''');
     checkElementText(library, r'''
@@ -33585,7 +34297,7 @@
   }
 
   test_getter_native() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class C {
   int get x() native;
 }
@@ -33633,7 +34345,7 @@
   }
 
   test_getter_ofGeneric_refEnclosingTypeParameter_false() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class C<T> {
   int get foo {}
 }
@@ -33680,7 +34392,7 @@
   }
 
   test_getter_ofGeneric_refEnclosingTypeParameter_true() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class C<T> {
   T get foo {}
 }
@@ -33727,7 +34439,11 @@
   }
 
   test_getter_static() async {
-    var library = await buildLibrary('class C { static int get x => null; }');
+    var library = await buildLibrary(r'''
+class C {
+  static int get x => null;
+}
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -33745,7 +34461,7 @@
               element: <testLibrary>::@class::C::@constructor::new
               typeName: C
           getters
-            #F4 isCompleteDeclaration isOriginDeclaration isStatic x (nameOffset:25) (firstTokenOffset:10) (offset:25)
+            #F4 isCompleteDeclaration isOriginDeclaration isStatic x (nameOffset:27) (firstTokenOffset:12) (offset:27)
               element: <testLibrary>::@class::C::@getter::x
   classes
     isSimplyBounded class C
@@ -34345,9 +35061,12 @@
   }
 
   test_getters() async {
-    var library = await buildLibrary(
-      'class C { int get x => null; get y => null; }',
-    );
+    var library = await buildLibrary(r'''
+class C {
+  int get x => null;
+  get y => null;
+}
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -34367,9 +35086,9 @@
               element: <testLibrary>::@class::C::@constructor::new
               typeName: C
           getters
-            #F5 isCompleteDeclaration isOriginDeclaration x (nameOffset:18) (firstTokenOffset:10) (offset:18)
+            #F5 isCompleteDeclaration isOriginDeclaration x (nameOffset:20) (firstTokenOffset:12) (offset:20)
               element: <testLibrary>::@class::C::@getter::x
-            #F6 hasImplicitReturnType isCompleteDeclaration isOriginDeclaration y (nameOffset:33) (firstTokenOffset:29) (offset:33)
+            #F6 hasImplicitReturnType isCompleteDeclaration isOriginDeclaration y (nameOffset:37) (firstTokenOffset:33) (offset:37)
               element: <testLibrary>::@class::C::@getter::y
   classes
     isSimplyBounded class C
@@ -34405,11 +35124,12 @@
   }
 
   test_implicitConstructor_named_const() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class C {
   final Object x;
   const C.named(this.x);
 }
+
 const x = C.named(42);
 ''');
     checkElementText(library, r'''
@@ -34437,31 +35157,31 @@
             #F5 isCompleteDeclaration isOriginVariable x (nameOffset:<null>) (firstTokenOffset:<null>) (offset:25)
               element: <testLibrary>::@class::C::@getter::x
       topLevelVariables
-        #F6 hasImplicitType hasInitializer isConst isOriginDeclaration isStatic x (nameOffset:61) (firstTokenOffset:61) (offset:61)
+        #F6 hasImplicitType hasInitializer isConst isOriginDeclaration isStatic x (nameOffset:62) (firstTokenOffset:62) (offset:62)
           element: <testLibrary>::@topLevelVariable::x
           initializer: expression_0
             InstanceCreationExpression
               constructorName: ConstructorName
                 type: NamedType
-                  name: C @65
+                  name: C @66
                   element: <testLibrary>::@class::C
                   type: C
-                period: . @66
+                period: . @67
                 name: SimpleIdentifier
-                  token: named @67
+                  token: named @68
                   element: <testLibrary>::@class::C::@constructor::named
                   staticType: null
                 element: <testLibrary>::@class::C::@constructor::named
               argumentList: ArgumentList
-                leftParenthesis: ( @72
+                leftParenthesis: ( @73
                 arguments
                   IntegerLiteral
-                    literal: 42 @73
+                    literal: 42 @74
                     staticType: int
-                rightParenthesis: ) @75
+                rightParenthesis: ) @76
               staticType: C
       getters
-        #F7 isCompleteDeclaration isOriginVariable isStatic x (nameOffset:<null>) (firstTokenOffset:<null>) (offset:61)
+        #F7 isCompleteDeclaration isOriginVariable isStatic x (nameOffset:<null>) (firstTokenOffset:<null>) (offset:62)
           element: <testLibrary>::@getter::x
   classes
     isSimplyBounded class C
@@ -34507,7 +35227,7 @@
   }
 
   test_implicitField_getterFirst() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class C {
   int get x => 0;
   void set x(int value) {}
@@ -34573,7 +35293,7 @@
   }
 
   test_implicitField_setterFirst() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class C {
   void set x(int value) {}
   int get x => 0;
@@ -34665,7 +35385,11 @@
   }
 
   test_method_abstract() async {
-    var library = await buildLibrary('abstract class C { f(); }');
+    var library = await buildLibrary(r'''
+abstract class C {
+  f();
+}
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -34680,7 +35404,7 @@
               element: <testLibrary>::@class::C::@constructor::new
               typeName: C
           methods
-            #F3 hasImplicitReturnType isAbstract isOriginDeclaration f (nameOffset:19) (firstTokenOffset:19) (offset:19)
+            #F3 hasImplicitReturnType isAbstract isOriginDeclaration f (nameOffset:21) (firstTokenOffset:21) (offset:21)
               element: <testLibrary>::@class::C::@method::f
   classes
     isAbstract isSimplyBounded class C
@@ -34701,6 +35425,7 @@
   test_method_async() async {
     var library = await buildLibrary(r'''
 import 'dart:async';
+
 class C {
   Future f() async {}
 }
@@ -34714,14 +35439,14 @@
       libraryImports
         dart:async
       classes
-        #F1 class C (nameOffset:27) (firstTokenOffset:21) (offset:27)
+        #F1 class C (nameOffset:28) (firstTokenOffset:22) (offset:28)
           element: <testLibrary>::@class::C
           constructors
-            #F2 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:27)
+            #F2 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:28)
               element: <testLibrary>::@class::C::@constructor::new
               typeName: C
           methods
-            #F3 isAsynchronous isCompleteDeclaration isOriginDeclaration f (nameOffset:40) (firstTokenOffset:33) (offset:40) async
+            #F3 isAsynchronous isCompleteDeclaration isOriginDeclaration f (nameOffset:41) (firstTokenOffset:34) (offset:41) async
               element: <testLibrary>::@class::C::@method::f
   classes
     isSimplyBounded class C
@@ -34742,6 +35467,7 @@
   test_method_asyncStar() async {
     var library = await buildLibrary(r'''
 import 'dart:async';
+
 class C {
   Stream f() async* {}
 }
@@ -34755,14 +35481,14 @@
       libraryImports
         dart:async
       classes
-        #F1 class C (nameOffset:27) (firstTokenOffset:21) (offset:27)
+        #F1 class C (nameOffset:28) (firstTokenOffset:22) (offset:28)
           element: <testLibrary>::@class::C
           constructors
-            #F2 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:27)
+            #F2 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:28)
               element: <testLibrary>::@class::C::@constructor::new
               typeName: C
           methods
-            #F3 isAsynchronous isCompleteDeclaration isGenerator isOriginDeclaration f (nameOffset:40) (firstTokenOffset:33) (offset:40) async*
+            #F3 isAsynchronous isCompleteDeclaration isGenerator isOriginDeclaration f (nameOffset:41) (firstTokenOffset:34) (offset:41) async*
               element: <testLibrary>::@class::C::@method::f
   classes
     isSimplyBounded class C
@@ -38445,6 +39171,51 @@
 ''');
   }
 
+  test_method_augmentation_chain_returnType_void_int() async {
+    var library = await buildLibrary(r'''
+class A {
+  void foo() {}
+}
+
+augment class A {
+  augment int foo() => 0;
+}
+''');
+
+    configuration.withConstructors = false;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  fragments
+    #F0 <testLibraryFragment>
+      element: <testLibrary>
+      classes
+        #F1 class A (nameOffset:6) (firstTokenOffset:0) (offset:6)
+          element: <testLibrary>::@class::A
+          nextFragment: #F2
+          methods
+            #F3 isCompleteDeclaration isOriginDeclaration foo (nameOffset:17) (firstTokenOffset:12) (offset:17)
+              element: <testLibrary>::@class::A::@method::foo
+              nextFragment: #F4
+        #F2 isAugmentation class A (nameOffset:43) (firstTokenOffset:29) (offset:43)
+          element: <testLibrary>::@class::A
+          previousFragment: #F1
+          methods
+            #F4 isAugmentation isCompleteDeclaration isOriginDeclaration foo (nameOffset:61) (firstTokenOffset:49) (offset:61)
+              element: <testLibrary>::@class::A::@method::foo
+              previousFragment: #F3
+  classes
+    isSimplyBounded class A
+      reference: <testLibrary>::@class::A
+      firstFragment: #F1
+      methods
+        isOriginDeclaration foo
+          reference: <testLibrary>::@class::A::@method::foo
+          firstFragment: #F3
+          returnType: void
+''');
+  }
+
   test_method_augmentation_chain_twoDeclarations() async {
     var library = await buildLibrary(r'''
 class A {
@@ -39893,13 +40664,14 @@
   }
 
   test_method_documented() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class C {
   /**
    * Docs
    */
   f() {}
-}''');
+}
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -39935,7 +40707,11 @@
   }
 
   test_method_external() async {
-    var library = await buildLibrary('class C { external f(); }');
+    var library = await buildLibrary(r'''
+class C {
+  external f();
+}
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -39950,7 +40726,7 @@
               element: <testLibrary>::@class::C::@constructor::new
               typeName: C
           methods
-            #F3 hasImplicitReturnType isCompleteDeclaration isExternal isOriginDeclaration f (nameOffset:19) (firstTokenOffset:10) (offset:19)
+            #F3 hasImplicitReturnType isCompleteDeclaration isExternal isOriginDeclaration f (nameOffset:21) (firstTokenOffset:12) (offset:21)
               element: <testLibrary>::@class::C::@method::f
   classes
     isSimplyBounded class C
@@ -39969,10 +40745,15 @@
   }
 
   test_method_formalParameter_regular_requiredPositional_inferredType_nonStatic_implicit() async {
-    var library = await buildLibrary(
-      'class C extends D { void f(value) {} }'
-      ' abstract class D { void f(int value); }',
-    );
+    var library = await buildLibrary(r'''
+class C extends D {
+  void f(value) {}
+}
+
+abstract class D {
+  void f(int value);
+}
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -39987,22 +40768,22 @@
               element: <testLibrary>::@class::C::@constructor::new
               typeName: C
           methods
-            #F3 isCompleteDeclaration isOriginDeclaration f (nameOffset:25) (firstTokenOffset:20) (offset:25)
+            #F3 isCompleteDeclaration isOriginDeclaration f (nameOffset:27) (firstTokenOffset:22) (offset:27)
               element: <testLibrary>::@class::C::@method::f
               formalParameters
-                #F4 requiredPositional hasImplicitType isOriginDeclaration value (nameOffset:27) (firstTokenOffset:27) (offset:27)
+                #F4 requiredPositional hasImplicitType isOriginDeclaration value (nameOffset:29) (firstTokenOffset:29) (offset:29)
                   element: <testLibrary>::@class::C::@method::f::@formalParameter::value
-        #F5 isAbstract class D (nameOffset:54) (firstTokenOffset:39) (offset:54)
+        #F5 isAbstract class D (nameOffset:57) (firstTokenOffset:42) (offset:57)
           element: <testLibrary>::@class::D
           constructors
-            #F6 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:54)
+            #F6 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:57)
               element: <testLibrary>::@class::D::@constructor::new
               typeName: D
           methods
-            #F7 isAbstract isOriginDeclaration f (nameOffset:63) (firstTokenOffset:58) (offset:63)
+            #F7 isAbstract isOriginDeclaration f (nameOffset:68) (firstTokenOffset:63) (offset:68)
               element: <testLibrary>::@class::D::@method::f
               formalParameters
-                #F8 requiredPositional isOriginDeclaration value (nameOffset:69) (firstTokenOffset:65) (offset:69)
+                #F8 requiredPositional isOriginDeclaration value (nameOffset:74) (firstTokenOffset:70) (offset:74)
                   element: <testLibrary>::@class::D::@method::f::@formalParameter::value
   classes
     isSimplyBounded class C
@@ -40043,7 +40824,11 @@
   }
 
   test_method_formalParameters() async {
-    var library = await buildLibrary('class C { f(x, y) {} }');
+    var library = await buildLibrary(r'''
+class C {
+  f(x, y) {}
+}
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -40058,12 +40843,12 @@
               element: <testLibrary>::@class::C::@constructor::new
               typeName: C
           methods
-            #F3 hasImplicitReturnType isCompleteDeclaration isOriginDeclaration f (nameOffset:10) (firstTokenOffset:10) (offset:10)
+            #F3 hasImplicitReturnType isCompleteDeclaration isOriginDeclaration f (nameOffset:12) (firstTokenOffset:12) (offset:12)
               element: <testLibrary>::@class::C::@method::f
               formalParameters
-                #F4 requiredPositional hasImplicitType isOriginDeclaration x (nameOffset:12) (firstTokenOffset:12) (offset:12)
+                #F4 requiredPositional hasImplicitType isOriginDeclaration x (nameOffset:14) (firstTokenOffset:14) (offset:14)
                   element: <testLibrary>::@class::C::@method::f::@formalParameter::x
-                #F5 requiredPositional hasImplicitType isOriginDeclaration y (nameOffset:15) (firstTokenOffset:15) (offset:15)
+                #F5 requiredPositional hasImplicitType isOriginDeclaration y (nameOffset:17) (firstTokenOffset:17) (offset:17)
                   element: <testLibrary>::@class::C::@method::f::@formalParameter::y
   classes
     isSimplyBounded class C
@@ -40089,7 +40874,7 @@
   }
 
   test_method_hasImplicitReturnType_false() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class C {
   int m() => 0;
 }
@@ -40100,7 +40885,7 @@
   }
 
   test_method_hasImplicitReturnType_true() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class C {
   m() => 0;
 }
@@ -40111,10 +40896,11 @@
   }
 
   test_method_inferred_type_nonStatic_implicit_return() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class C extends D {
   f() => null;
 }
+
 abstract class D {
   int f();
 }
@@ -40135,14 +40921,14 @@
           methods
             #F3 hasImplicitReturnType isCompleteDeclaration isOriginDeclaration f (nameOffset:22) (firstTokenOffset:22) (offset:22)
               element: <testLibrary>::@class::C::@method::f
-        #F4 isAbstract class D (nameOffset:52) (firstTokenOffset:37) (offset:52)
+        #F4 isAbstract class D (nameOffset:53) (firstTokenOffset:38) (offset:53)
           element: <testLibrary>::@class::D
           constructors
-            #F5 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:52)
+            #F5 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:53)
               element: <testLibrary>::@class::D::@constructor::new
               typeName: D
           methods
-            #F6 isAbstract isOriginDeclaration f (nameOffset:62) (firstTokenOffset:58) (offset:62)
+            #F6 isAbstract isOriginDeclaration f (nameOffset:63) (firstTokenOffset:59) (offset:63)
               element: <testLibrary>::@class::D::@method::f
   classes
     isSimplyBounded class C
@@ -40215,7 +41001,7 @@
   }
 
   test_method_missingName() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class A {
   () {}
 }
@@ -40255,6 +41041,7 @@
   test_method_namedAsSupertype() async {
     var library = await buildLibrary(r'''
 class A {}
+
 class B extends A {
   void A() {}
 }
@@ -40272,14 +41059,14 @@
             #F2 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:6)
               element: <testLibrary>::@class::A::@constructor::new
               typeName: A
-        #F3 hasExtendsClause class B (nameOffset:17) (firstTokenOffset:11) (offset:17)
+        #F3 hasExtendsClause class B (nameOffset:18) (firstTokenOffset:12) (offset:18)
           element: <testLibrary>::@class::B
           constructors
-            #F4 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:17)
+            #F4 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:18)
               element: <testLibrary>::@class::B::@constructor::new
               typeName: B
           methods
-            #F5 isCompleteDeclaration isOriginDeclaration A (nameOffset:38) (firstTokenOffset:33) (offset:38)
+            #F5 isCompleteDeclaration isOriginDeclaration A (nameOffset:39) (firstTokenOffset:34) (offset:39)
               element: <testLibrary>::@class::B::@method::A
   classes
     isSimplyBounded class A
@@ -40307,7 +41094,7 @@
   }
 
   test_method_native() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class C {
   int m() native;
 }
@@ -40345,7 +41132,7 @@
   }
 
   test_method_ofGeneric_refEnclosingTypeParameter_false_hide() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class C<T> {
   void foo<T>(T _) {}
 }
@@ -40395,7 +41182,7 @@
   }
 
   test_method_ofGeneric_refEnclosingTypeParameter_true_formalParameter() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class C<T> {
   void foo(T _) {}
 }
@@ -40439,7 +41226,7 @@
   }
 
   test_method_ofGeneric_refEnclosingTypeParameter_true_formalParameter2() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class C<T> {
   void foo(void Function(T) _) {}
 }
@@ -40483,7 +41270,7 @@
   }
 
   test_method_ofGeneric_refEnclosingTypeParameter_true_inferred() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class A<U> {
   U foo() {}
 }
@@ -40544,7 +41331,7 @@
   }
 
   test_method_ofGeneric_refEnclosingTypeParameter_true_returnType() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class C<T> {
   T foo() {}
 }
@@ -40581,7 +41368,7 @@
   }
 
   test_method_ofGeneric_refEnclosingTypeParameter_true_typeAlias() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 typedef MyInt<U> = int;
 
 class C<T> {
@@ -40637,7 +41424,7 @@
   }
 
   test_method_ofGeneric_refEnclosingTypeParameter_true_typeParameter() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class C<T> {
   void foo<U extends T>() {}
 }
@@ -40681,7 +41468,11 @@
   }
 
   test_method_static() async {
-    var library = await buildLibrary('class C { static f() {} }');
+    var library = await buildLibrary(r'''
+class C {
+  static f() {}
+}
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -40696,7 +41487,7 @@
               element: <testLibrary>::@class::C::@constructor::new
               typeName: C
           methods
-            #F3 hasImplicitReturnType isCompleteDeclaration isOriginDeclaration isStatic f (nameOffset:17) (firstTokenOffset:10) (offset:17)
+            #F3 hasImplicitReturnType isCompleteDeclaration isOriginDeclaration isStatic f (nameOffset:19) (firstTokenOffset:12) (offset:19)
               element: <testLibrary>::@class::C::@method::f
   classes
     isSimplyBounded class C
@@ -41308,7 +42099,7 @@
   }
 
   test_method_static_typeParameter() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class A<T> {
   static T? foo() => null;
 }
@@ -41392,7 +42183,11 @@
   }
 
   test_method_typeParameter() async {
-    var library = await buildLibrary('class C { T f<T, U>(U u) => null; }');
+    var library = await buildLibrary(r'''
+class C {
+  T f<T, U>(U u) => null;
+}
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -41407,15 +42202,15 @@
               element: <testLibrary>::@class::C::@constructor::new
               typeName: C
           methods
-            #F3 isCompleteDeclaration isOriginDeclaration f (nameOffset:12) (firstTokenOffset:10) (offset:12)
+            #F3 isCompleteDeclaration isOriginDeclaration f (nameOffset:14) (firstTokenOffset:12) (offset:14)
               element: <testLibrary>::@class::C::@method::f
               typeParameters
-                #F4 T (nameOffset:14) (firstTokenOffset:14) (offset:14)
+                #F4 T (nameOffset:16) (firstTokenOffset:16) (offset:16)
                   element: #E0 T
-                #F5 U (nameOffset:17) (firstTokenOffset:17) (offset:17)
+                #F5 U (nameOffset:19) (firstTokenOffset:19) (offset:19)
                   element: #E1 U
               formalParameters
-                #F6 requiredPositional isOriginDeclaration u (nameOffset:22) (firstTokenOffset:20) (offset:22)
+                #F6 requiredPositional isOriginDeclaration u (nameOffset:24) (firstTokenOffset:22) (offset:24)
                   element: <testLibrary>::@class::C::@method::f::@formalParameter::u
   classes
     isSimplyBounded class C
@@ -41443,7 +42238,7 @@
   }
 
   test_method_typeParameter_inGenericClass() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class C<T, U> {
   V f<V, W>(T t, U u, W w) => null;
 }
@@ -41518,7 +42313,11 @@
   }
 
   test_method_typeParameter_with_formalParameter_regular_requiredPositional_functionTypedSuffix() async {
-    var library = await buildLibrary('class C { void f<T, U>(T x(U u)) {} }');
+    var library = await buildLibrary(r'''
+class C {
+  void f<T, U>(T x(U u)) {}
+}
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -41533,19 +42332,19 @@
               element: <testLibrary>::@class::C::@constructor::new
               typeName: C
           methods
-            #F3 isCompleteDeclaration isOriginDeclaration f (nameOffset:15) (firstTokenOffset:10) (offset:15)
+            #F3 isCompleteDeclaration isOriginDeclaration f (nameOffset:17) (firstTokenOffset:12) (offset:17)
               element: <testLibrary>::@class::C::@method::f
               typeParameters
-                #F4 T (nameOffset:17) (firstTokenOffset:17) (offset:17)
+                #F4 T (nameOffset:19) (firstTokenOffset:19) (offset:19)
                   element: #E0 T
-                #F5 U (nameOffset:20) (firstTokenOffset:20) (offset:20)
+                #F5 U (nameOffset:22) (firstTokenOffset:22) (offset:22)
                   element: #E1 U
               formalParameters
-                #F6 requiredPositional isOriginDeclaration x (nameOffset:25) (firstTokenOffset:23) (offset:25)
+                #F6 requiredPositional isOriginDeclaration x (nameOffset:27) (firstTokenOffset:25) (offset:27)
                   element: <testLibrary>::@class::C::@method::f::@formalParameter::x
                   parameters
-                    #F7 requiredPositional isOriginDeclaration u (nameOffset:29) (firstTokenOffset:27) (offset:29)
-                      element: u@29
+                    #F7 requiredPositional isOriginDeclaration u (nameOffset:31) (firstTokenOffset:29) (offset:31)
+                      element: u@31
   classes
     isSimplyBounded class C
       reference: <testLibrary>::@class::C
@@ -41576,7 +42375,12 @@
   }
 
   test_methods() async {
-    var library = await buildLibrary('class C { f() {} g() {} }');
+    var library = await buildLibrary(r'''
+class C {
+  f() {}
+  g() {}
+}
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -41591,9 +42395,9 @@
               element: <testLibrary>::@class::C::@constructor::new
               typeName: C
           methods
-            #F3 hasImplicitReturnType isCompleteDeclaration isOriginDeclaration f (nameOffset:10) (firstTokenOffset:10) (offset:10)
+            #F3 hasImplicitReturnType isCompleteDeclaration isOriginDeclaration f (nameOffset:12) (firstTokenOffset:12) (offset:12)
               element: <testLibrary>::@class::C::@method::f
-            #F4 hasImplicitReturnType isCompleteDeclaration isOriginDeclaration g (nameOffset:17) (firstTokenOffset:17) (offset:17)
+            #F4 hasImplicitReturnType isCompleteDeclaration isOriginDeclaration g (nameOffset:21) (firstTokenOffset:21) (offset:21)
               element: <testLibrary>::@class::C::@method::g
   classes
     isSimplyBounded class C
@@ -41616,9 +42420,11 @@
   }
 
   test_operator() async {
-    var library = await buildLibrary(
-      'class C { C operator+(C other) => null; }',
-    );
+    var library = await buildLibrary(r'''
+class C {
+  C operator +(C other) => null;
+}
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -41633,10 +42439,10 @@
               element: <testLibrary>::@class::C::@constructor::new
               typeName: C
           methods
-            #F3 isCompleteDeclaration isOriginDeclaration + (nameOffset:20) (firstTokenOffset:10) (offset:20)
+            #F3 isCompleteDeclaration isOriginDeclaration + (nameOffset:23) (firstTokenOffset:12) (offset:23)
               element: <testLibrary>::@class::C::@method::+
               formalParameters
-                #F4 requiredPositional isOriginDeclaration other (nameOffset:24) (firstTokenOffset:22) (offset:24)
+                #F4 requiredPositional isOriginDeclaration other (nameOffset:27) (firstTokenOffset:25) (offset:27)
                   element: <testLibrary>::@class::C::@method::+::@formalParameter::other
   classes
     isSimplyBounded class C
@@ -41659,9 +42465,9 @@
   }
 
   test_operator_equal() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class C {
-  bool operator==(Object other) => false;
+  bool operator ==(Object other) => false;
 }
 ''');
     checkElementText(library, r'''
@@ -41678,10 +42484,10 @@
               element: <testLibrary>::@class::C::@constructor::new
               typeName: C
           methods
-            #F3 isCompleteDeclaration isOriginDeclaration == (nameOffset:25) (firstTokenOffset:12) (offset:25)
+            #F3 isCompleteDeclaration isOriginDeclaration == (nameOffset:26) (firstTokenOffset:12) (offset:26)
               element: <testLibrary>::@class::C::@method::==
               formalParameters
-                #F4 requiredPositional isOriginDeclaration other (nameOffset:35) (firstTokenOffset:28) (offset:35)
+                #F4 requiredPositional isOriginDeclaration other (nameOffset:36) (firstTokenOffset:29) (offset:36)
                   element: <testLibrary>::@class::C::@method::==::@formalParameter::other
   classes
     isSimplyBounded class C
@@ -41704,9 +42510,11 @@
   }
 
   test_operator_external() async {
-    var library = await buildLibrary(
-      'class C { external C operator+(C other); }',
-    );
+    var library = await buildLibrary(r'''
+class C {
+  external C operator +(C other);
+}
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -41721,10 +42529,10 @@
               element: <testLibrary>::@class::C::@constructor::new
               typeName: C
           methods
-            #F3 isCompleteDeclaration isExternal isOriginDeclaration + (nameOffset:29) (firstTokenOffset:10) (offset:29)
+            #F3 isCompleteDeclaration isExternal isOriginDeclaration + (nameOffset:32) (firstTokenOffset:12) (offset:32)
               element: <testLibrary>::@class::C::@method::+
               formalParameters
-                #F4 requiredPositional isOriginDeclaration other (nameOffset:33) (firstTokenOffset:31) (offset:33)
+                #F4 requiredPositional isOriginDeclaration other (nameOffset:36) (firstTokenOffset:34) (offset:36)
                   element: <testLibrary>::@class::C::@method::+::@formalParameter::other
   classes
     isSimplyBounded class C
@@ -41747,9 +42555,9 @@
   }
 
   test_operator_greater_equal() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class C {
-  bool operator>=(C other) => false;
+  bool operator >=(C other) => false;
 }
 ''');
     checkElementText(library, r'''
@@ -41766,10 +42574,10 @@
               element: <testLibrary>::@class::C::@constructor::new
               typeName: C
           methods
-            #F3 isCompleteDeclaration isOriginDeclaration >= (nameOffset:25) (firstTokenOffset:12) (offset:25)
+            #F3 isCompleteDeclaration isOriginDeclaration >= (nameOffset:26) (firstTokenOffset:12) (offset:26)
               element: <testLibrary>::@class::C::@method::>=
               formalParameters
-                #F4 requiredPositional isOriginDeclaration other (nameOffset:30) (firstTokenOffset:28) (offset:30)
+                #F4 requiredPositional isOriginDeclaration other (nameOffset:31) (firstTokenOffset:29) (offset:31)
                   element: <testLibrary>::@class::C::@method::>=::@formalParameter::other
   classes
     isSimplyBounded class C
@@ -41792,9 +42600,11 @@
   }
 
   test_operator_index() async {
-    var library = await buildLibrary(
-      'class C { bool operator[](int i) => null; }',
-    );
+    var library = await buildLibrary(r'''
+class C {
+  bool operator [](int i) => null;
+}
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -41809,10 +42619,10 @@
               element: <testLibrary>::@class::C::@constructor::new
               typeName: C
           methods
-            #F3 isCompleteDeclaration isOriginDeclaration [] (nameOffset:23) (firstTokenOffset:10) (offset:23)
+            #F3 isCompleteDeclaration isOriginDeclaration [] (nameOffset:26) (firstTokenOffset:12) (offset:26)
               element: <testLibrary>::@class::C::@method::[]
               formalParameters
-                #F4 requiredPositional isOriginDeclaration i (nameOffset:30) (firstTokenOffset:26) (offset:30)
+                #F4 requiredPositional isOriginDeclaration i (nameOffset:33) (firstTokenOffset:29) (offset:33)
                   element: <testLibrary>::@class::C::@method::[]::@formalParameter::i
   classes
     isSimplyBounded class C
@@ -41835,9 +42645,9 @@
   }
 
   test_operator_index_set() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class C {
-  void operator[]=(int i, bool v) {}
+  void operator []=(int i, bool v) {}
 }
 ''');
     checkElementText(library, r'''
@@ -41854,12 +42664,12 @@
               element: <testLibrary>::@class::C::@constructor::new
               typeName: C
           methods
-            #F3 isCompleteDeclaration isOriginDeclaration []= (nameOffset:25) (firstTokenOffset:12) (offset:25)
+            #F3 isCompleteDeclaration isOriginDeclaration []= (nameOffset:26) (firstTokenOffset:12) (offset:26)
               element: <testLibrary>::@class::C::@method::[]=
               formalParameters
-                #F4 requiredPositional isOriginDeclaration i (nameOffset:33) (firstTokenOffset:29) (offset:33)
+                #F4 requiredPositional isOriginDeclaration i (nameOffset:34) (firstTokenOffset:30) (offset:34)
                   element: <testLibrary>::@class::C::@method::[]=::@formalParameter::i
-                #F5 requiredPositional isOriginDeclaration v (nameOffset:41) (firstTokenOffset:36) (offset:41)
+                #F5 requiredPositional isOriginDeclaration v (nameOffset:42) (firstTokenOffset:37) (offset:42)
                   element: <testLibrary>::@class::C::@method::[]=::@formalParameter::v
   classes
     isSimplyBounded class C
@@ -41885,9 +42695,9 @@
   }
 
   test_operator_less_equal() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class C {
-  bool operator<=(C other) => false;
+  bool operator <=(C other) => false;
 }
 ''');
     checkElementText(library, r'''
@@ -41904,10 +42714,10 @@
               element: <testLibrary>::@class::C::@constructor::new
               typeName: C
           methods
-            #F3 isCompleteDeclaration isOriginDeclaration <= (nameOffset:25) (firstTokenOffset:12) (offset:25)
+            #F3 isCompleteDeclaration isOriginDeclaration <= (nameOffset:26) (firstTokenOffset:12) (offset:26)
               element: <testLibrary>::@class::C::@method::<=
               formalParameters
-                #F4 requiredPositional isOriginDeclaration other (nameOffset:30) (firstTokenOffset:28) (offset:30)
+                #F4 requiredPositional isOriginDeclaration other (nameOffset:31) (firstTokenOffset:29) (offset:31)
                   element: <testLibrary>::@class::C::@method::<=::@formalParameter::other
   classes
     isSimplyBounded class C
@@ -41930,7 +42740,7 @@
   }
 
   test_operator_minus() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class A {
   int operator -(int other) => 0;
 }
@@ -41975,7 +42785,7 @@
   }
 
   test_operator_minus_unary() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class A {
   int operator -() => 0;
 }
@@ -42013,7 +42823,7 @@
   }
 
   test_primaryInitializerScope_fieldInitializer_instance() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class A(int foo) {
   var bar = foo;
 }
@@ -42086,7 +42896,7 @@
   }
 
   test_primaryInitializerScope_fieldInitializer_instance_declaringFormal() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class A(final int foo) {
   var bar = foo;
 }
@@ -42175,7 +42985,7 @@
   }
 
   test_primaryInitializerScope_fieldInitializer_instance_late() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class A(int foo) {
   late var bar = foo;
 }
@@ -42248,7 +43058,7 @@
   }
 
   test_primaryInitializerScope_fieldInitializer_instance_typePromotion() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class A(int? foo) {
   var bar = foo != null ? foo : 0;
 }
@@ -42321,7 +43131,7 @@
   }
 
   test_primaryInitializerScope_fieldInitializer_static() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class A(int foo) {
   static var bar = foo;
 }
@@ -42394,9 +43204,11 @@
   }
 
   test_setter_abstract() async {
-    var library = await buildLibrary(
-      'abstract class C { void set x(int value); }',
-    );
+    var library = await buildLibrary(r'''
+abstract class C {
+  void set x(int value);
+}
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -42414,10 +43226,10 @@
               element: <testLibrary>::@class::C::@constructor::new
               typeName: C
           setters
-            #F4 isAbstract isOriginDeclaration x (nameOffset:28) (firstTokenOffset:19) (offset:28)
+            #F4 isAbstract isOriginDeclaration x (nameOffset:30) (firstTokenOffset:21) (offset:30)
               element: <testLibrary>::@class::C::@setter::x
               formalParameters
-                #F5 requiredPositional isOriginDeclaration value (nameOffset:34) (firstTokenOffset:30) (offset:34)
+                #F5 requiredPositional isOriginDeclaration value (nameOffset:36) (firstTokenOffset:32) (offset:36)
                   element: <testLibrary>::@class::C::@setter::x::@formalParameter::value
   classes
     isAbstract isSimplyBounded class C
@@ -43401,9 +44213,11 @@
   }
 
   test_setter_covariant() async {
-    var library = await buildLibrary(
-      'class C { void set x(covariant int value); }',
-    );
+    var library = await buildLibrary(r'''
+class C {
+  void set x(covariant int value);
+}
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -43421,10 +44235,10 @@
               element: <testLibrary>::@class::C::@constructor::new
               typeName: C
           setters
-            #F4 isAbstract isOriginDeclaration x (nameOffset:19) (firstTokenOffset:10) (offset:19)
+            #F4 isAbstract isOriginDeclaration x (nameOffset:21) (firstTokenOffset:12) (offset:21)
               element: <testLibrary>::@class::C::@setter::x
               formalParameters
-                #F5 requiredPositional isExplicitlyCovariant isOriginDeclaration value (nameOffset:35) (firstTokenOffset:21) (offset:35)
+                #F5 requiredPositional isExplicitlyCovariant isOriginDeclaration value (nameOffset:37) (firstTokenOffset:23) (offset:37)
                   element: <testLibrary>::@class::C::@setter::x::@formalParameter::value
   classes
     isSimplyBounded class C
@@ -43454,9 +44268,11 @@
   }
 
   test_setter_external() async {
-    var library = await buildLibrary(
-      'class C { external void set x(int value); }',
-    );
+    var library = await buildLibrary(r'''
+class C {
+  external void set x(int value);
+}
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -43474,10 +44290,10 @@
               element: <testLibrary>::@class::C::@constructor::new
               typeName: C
           setters
-            #F4 isCompleteDeclaration isExternal isOriginDeclaration x (nameOffset:28) (firstTokenOffset:10) (offset:28)
+            #F4 isCompleteDeclaration isExternal isOriginDeclaration x (nameOffset:30) (firstTokenOffset:12) (offset:30)
               element: <testLibrary>::@class::C::@setter::x
               formalParameters
-                #F5 requiredPositional isOriginDeclaration value (nameOffset:34) (firstTokenOffset:30) (offset:34)
+                #F5 requiredPositional isOriginDeclaration value (nameOffset:36) (firstTokenOffset:32) (offset:36)
                   element: <testLibrary>::@class::C::@setter::x::@formalParameter::value
   classes
     isSimplyBounded class C
@@ -43507,7 +44323,11 @@
   }
 
   test_setter_formalParameter_regular_requiredPositional_implicitType() async {
-    var library = await buildLibrary('class C { void set x(value) {} }');
+    var library = await buildLibrary(r'''
+class C {
+  void set x(value) {}
+}
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -43525,10 +44345,10 @@
               element: <testLibrary>::@class::C::@constructor::new
               typeName: C
           setters
-            #F4 isCompleteDeclaration isOriginDeclaration x (nameOffset:19) (firstTokenOffset:10) (offset:19)
+            #F4 isCompleteDeclaration isOriginDeclaration x (nameOffset:21) (firstTokenOffset:12) (offset:21)
               element: <testLibrary>::@class::C::@setter::x
               formalParameters
-                #F5 requiredPositional hasImplicitType isOriginDeclaration value (nameOffset:21) (firstTokenOffset:21) (offset:21)
+                #F5 requiredPositional hasImplicitType isOriginDeclaration value (nameOffset:23) (firstTokenOffset:23) (offset:23)
                   element: <testLibrary>::@class::C::@setter::x::@formalParameter::value
   classes
     isSimplyBounded class C
@@ -43558,10 +44378,15 @@
   }
 
   test_setter_formalParameter_regular_requiredPositional_inferredType_nonStatic_implicit() async {
-    var library = await buildLibrary(
-      'class C extends D { void set f(value) {} }'
-      ' abstract class D { void set f(int value); }',
-    );
+    var library = await buildLibrary(r'''
+class C extends D {
+  void set f(value) {}
+}
+
+abstract class D {
+  void set f(int value);
+}
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -43579,25 +44404,25 @@
               element: <testLibrary>::@class::C::@constructor::new
               typeName: C
           setters
-            #F4 isCompleteDeclaration isOriginDeclaration f (nameOffset:29) (firstTokenOffset:20) (offset:29)
+            #F4 isCompleteDeclaration isOriginDeclaration f (nameOffset:31) (firstTokenOffset:22) (offset:31)
               element: <testLibrary>::@class::C::@setter::f
               formalParameters
-                #F5 requiredPositional hasImplicitType isOriginDeclaration value (nameOffset:31) (firstTokenOffset:31) (offset:31)
+                #F5 requiredPositional hasImplicitType isOriginDeclaration value (nameOffset:33) (firstTokenOffset:33) (offset:33)
                   element: <testLibrary>::@class::C::@setter::f::@formalParameter::value
-        #F6 isAbstract class D (nameOffset:58) (firstTokenOffset:43) (offset:58)
+        #F6 isAbstract class D (nameOffset:61) (firstTokenOffset:46) (offset:61)
           element: <testLibrary>::@class::D
           fields
-            #F7 isOriginGetterSetter f (nameOffset:<null>) (firstTokenOffset:<null>) (offset:58)
+            #F7 isOriginGetterSetter f (nameOffset:<null>) (firstTokenOffset:<null>) (offset:61)
               element: <testLibrary>::@class::D::@field::f
           constructors
-            #F8 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:58)
+            #F8 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:61)
               element: <testLibrary>::@class::D::@constructor::new
               typeName: D
           setters
-            #F9 isAbstract isOriginDeclaration f (nameOffset:71) (firstTokenOffset:62) (offset:71)
+            #F9 isAbstract isOriginDeclaration f (nameOffset:76) (firstTokenOffset:67) (offset:76)
               element: <testLibrary>::@class::D::@setter::f
               formalParameters
-                #F10 requiredPositional isOriginDeclaration value (nameOffset:77) (firstTokenOffset:73) (offset:77)
+                #F10 requiredPositional isOriginDeclaration value (nameOffset:82) (firstTokenOffset:78) (offset:82)
                   element: <testLibrary>::@class::D::@setter::f::@formalParameter::value
   classes
     isSimplyBounded class C
@@ -43652,7 +44477,11 @@
   }
 
   test_setter_implicit_return_type() async {
-    var library = await buildLibrary('class C { set x(int value) {} }');
+    var library = await buildLibrary(r'''
+class C {
+  set x(int value) {}
+}
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -43670,10 +44499,10 @@
               element: <testLibrary>::@class::C::@constructor::new
               typeName: C
           setters
-            #F4 hasImplicitReturnType isCompleteDeclaration isOriginDeclaration x (nameOffset:14) (firstTokenOffset:10) (offset:14)
+            #F4 hasImplicitReturnType isCompleteDeclaration isOriginDeclaration x (nameOffset:16) (firstTokenOffset:12) (offset:16)
               element: <testLibrary>::@class::C::@setter::x
               formalParameters
-                #F5 requiredPositional isOriginDeclaration value (nameOffset:20) (firstTokenOffset:16) (offset:20)
+                #F5 requiredPositional isOriginDeclaration value (nameOffset:22) (firstTokenOffset:18) (offset:22)
                   element: <testLibrary>::@class::C::@setter::x::@formalParameter::value
   classes
     isSimplyBounded class C
@@ -43703,15 +44532,17 @@
   }
 
   test_setter_inferred_type_conflictingInheritance() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class A {
   int t;
 }
+
 class B extends A {
   double t;
 }
-class C extends A implements B {
-}
+
+class C extends A implements B {}
+
 class D extends C {
   void set t(p) {}
 }
@@ -43741,44 +44572,44 @@
               formalParameters
                 #F6 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:16)
                   element: <testLibrary>::@class::A::@setter::t::@formalParameter::value
-        #F7 hasExtendsClause class B (nameOffset:27) (firstTokenOffset:21) (offset:27)
+        #F7 hasExtendsClause class B (nameOffset:28) (firstTokenOffset:22) (offset:28)
           element: <testLibrary>::@class::B
           fields
-            #F8 isOriginDeclaration t (nameOffset:50) (firstTokenOffset:50) (offset:50)
+            #F8 isOriginDeclaration t (nameOffset:51) (firstTokenOffset:51) (offset:51)
               element: <testLibrary>::@class::B::@field::t
           constructors
-            #F9 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:27)
+            #F9 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:28)
               element: <testLibrary>::@class::B::@constructor::new
               typeName: B
           getters
-            #F10 isCompleteDeclaration isOriginVariable t (nameOffset:<null>) (firstTokenOffset:<null>) (offset:50)
+            #F10 isCompleteDeclaration isOriginVariable t (nameOffset:<null>) (firstTokenOffset:<null>) (offset:51)
               element: <testLibrary>::@class::B::@getter::t
           setters
-            #F11 isCompleteDeclaration isOriginVariable t (nameOffset:<null>) (firstTokenOffset:<null>) (offset:50)
+            #F11 isCompleteDeclaration isOriginVariable t (nameOffset:<null>) (firstTokenOffset:<null>) (offset:51)
               element: <testLibrary>::@class::B::@setter::t
               formalParameters
-                #F12 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:50)
+                #F12 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:51)
                   element: <testLibrary>::@class::B::@setter::t::@formalParameter::value
-        #F13 hasExtendsClause class C (nameOffset:61) (firstTokenOffset:55) (offset:61)
+        #F13 hasExtendsClause class C (nameOffset:63) (firstTokenOffset:57) (offset:63)
           element: <testLibrary>::@class::C
           constructors
-            #F14 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:61)
+            #F14 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:63)
               element: <testLibrary>::@class::C::@constructor::new
               typeName: C
-        #F15 hasExtendsClause class D (nameOffset:96) (firstTokenOffset:90) (offset:96)
+        #F15 hasExtendsClause class D (nameOffset:98) (firstTokenOffset:92) (offset:98)
           element: <testLibrary>::@class::D
           fields
-            #F16 isOriginGetterSetter t (nameOffset:<null>) (firstTokenOffset:<null>) (offset:96)
+            #F16 isOriginGetterSetter t (nameOffset:<null>) (firstTokenOffset:<null>) (offset:98)
               element: <testLibrary>::@class::D::@field::t
           constructors
-            #F17 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:96)
+            #F17 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:98)
               element: <testLibrary>::@class::D::@constructor::new
               typeName: D
           setters
-            #F18 isCompleteDeclaration isOriginDeclaration t (nameOffset:121) (firstTokenOffset:112) (offset:121)
+            #F18 isCompleteDeclaration isOriginDeclaration t (nameOffset:123) (firstTokenOffset:114) (offset:123)
               element: <testLibrary>::@class::D::@setter::t
               formalParameters
-                #F19 requiredPositional hasImplicitType isOriginDeclaration p (nameOffset:123) (firstTokenOffset:123) (offset:123)
+                #F19 requiredPositional hasImplicitType isOriginDeclaration p (nameOffset:125) (firstTokenOffset:125) (offset:125)
                   element: <testLibrary>::@class::D::@setter::t::@formalParameter::p
   classes
     hasNonFinalField isSimplyBounded class A
@@ -43883,7 +44714,7 @@
   }
 
   test_setter_inferred_type_static_implicit_return() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class C {
   static set f(int value) {}
 }
@@ -43938,7 +44769,7 @@
   }
 
   test_setter_invalid_formalParameter_field_requiredPositional() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class C {
   int foo;
   void set bar(this.foo) {}
@@ -44026,7 +44857,7 @@
   }
 
   test_setter_invalid_formalParameter_field_requiredPositional_sameName() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class C {
   set x(this.x) {}
 }
@@ -44082,7 +44913,11 @@
   }
 
   test_setter_invalid_formalParameter_regular_optionalNamed() async {
-    var library = await buildLibrary('class C { void set x({a}) {} }');
+    var library = await buildLibrary(r'''
+class C {
+  void set x({a}) {}
+}
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -44100,10 +44935,10 @@
               element: <testLibrary>::@class::C::@constructor::new
               typeName: C
           setters
-            #F4 isCompleteDeclaration isOriginDeclaration x (nameOffset:19) (firstTokenOffset:10) (offset:19)
+            #F4 isCompleteDeclaration isOriginDeclaration x (nameOffset:21) (firstTokenOffset:12) (offset:21)
               element: <testLibrary>::@class::C::@setter::x
               formalParameters
-                #F5 optionalNamed hasImplicitType isOriginDeclaration a (nameOffset:22) (firstTokenOffset:22) (offset:22)
+                #F5 optionalNamed hasImplicitType isOriginDeclaration a (nameOffset:24) (firstTokenOffset:24) (offset:24)
                   element: <testLibrary>::@class::C::@setter::x::@formalParameter::a
   classes
     isSimplyBounded class C
@@ -44133,7 +44968,11 @@
   }
 
   test_setter_invalid_formalParameter_regular_optionalPositional() async {
-    var library = await buildLibrary('class C { void set x([a]) {} }');
+    var library = await buildLibrary(r'''
+class C {
+  void set x([a]) {}
+}
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -44151,10 +44990,10 @@
               element: <testLibrary>::@class::C::@constructor::new
               typeName: C
           setters
-            #F4 isCompleteDeclaration isOriginDeclaration x (nameOffset:19) (firstTokenOffset:10) (offset:19)
+            #F4 isCompleteDeclaration isOriginDeclaration x (nameOffset:21) (firstTokenOffset:12) (offset:21)
               element: <testLibrary>::@class::C::@setter::x
               formalParameters
-                #F5 optionalPositional hasImplicitType isOriginDeclaration a (nameOffset:22) (firstTokenOffset:22) (offset:22)
+                #F5 optionalPositional hasImplicitType isOriginDeclaration a (nameOffset:24) (firstTokenOffset:24) (offset:24)
                   element: <testLibrary>::@class::C::@setter::x::@formalParameter::a
   classes
     isSimplyBounded class C
@@ -44184,7 +45023,11 @@
   }
 
   test_setter_invalid_formalParameters_none() async {
-    var library = await buildLibrary('class C { void set x() {} }');
+    var library = await buildLibrary(r'''
+class C {
+  void set x() {}
+}
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -44202,10 +45045,10 @@
               element: <testLibrary>::@class::C::@constructor::new
               typeName: C
           setters
-            #F4 isCompleteDeclaration isOriginDeclaration x (nameOffset:19) (firstTokenOffset:10) (offset:19)
+            #F4 isCompleteDeclaration isOriginDeclaration x (nameOffset:21) (firstTokenOffset:12) (offset:21)
               element: <testLibrary>::@class::C::@setter::x
               formalParameters
-                #F5 requiredPositional hasImplicitType isOriginDeclaration <null-name> (nameOffset:<null>) (firstTokenOffset:21) (offset:21)
+                #F5 requiredPositional hasImplicitType isOriginDeclaration <null-name> (nameOffset:<null>) (firstTokenOffset:23) (offset:23)
                   element: <testLibrary>::@class::C::@setter::x::@formalParameter::<null-name>
   classes
     isSimplyBounded class C
@@ -44235,7 +45078,11 @@
   }
 
   test_setter_invalid_formalParameters_tooMany() async {
-    var library = await buildLibrary('class C { void set x(a, b) {} }');
+    var library = await buildLibrary(r'''
+class C {
+  void set x(a, b) {}
+}
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -44253,10 +45100,10 @@
               element: <testLibrary>::@class::C::@constructor::new
               typeName: C
           setters
-            #F4 isCompleteDeclaration isOriginDeclaration x (nameOffset:19) (firstTokenOffset:10) (offset:19)
+            #F4 isCompleteDeclaration isOriginDeclaration x (nameOffset:21) (firstTokenOffset:12) (offset:21)
               element: <testLibrary>::@class::C::@setter::x
               formalParameters
-                #F5 requiredPositional hasImplicitType isOriginDeclaration a (nameOffset:21) (firstTokenOffset:21) (offset:21)
+                #F5 requiredPositional hasImplicitType isOriginDeclaration a (nameOffset:23) (firstTokenOffset:23) (offset:23)
                   element: <testLibrary>::@class::C::@setter::x::@formalParameter::a
   classes
     isSimplyBounded class C
@@ -44400,9 +45247,9 @@
   }
 
   test_setter_missingName() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class A {
-  set (int _) {}
+  set(int _) {}
 }
 ''');
     checkElementText(library, r'''
@@ -44422,7 +45269,7 @@
             #F3 hasImplicitReturnType isCompleteDeclaration isOriginDeclaration set (nameOffset:12) (firstTokenOffset:12) (offset:12)
               element: <testLibrary>::@class::A::@method::set
               formalParameters
-                #F4 requiredPositional isOriginDeclaration _ (nameOffset:21) (firstTokenOffset:17) (offset:21)
+                #F4 requiredPositional isOriginDeclaration _ (nameOffset:20) (firstTokenOffset:16) (offset:20)
                   element: <testLibrary>::@class::A::@method::set::@formalParameter::_
   classes
     isSimplyBounded class A
@@ -44445,7 +45292,7 @@
   }
 
   test_setter_native() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class C {
   void set x(int value) native;
 }
@@ -44500,7 +45347,7 @@
   }
 
   test_setter_ofGeneric_refEnclosingTypeParameter_false() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class C<T> {
   set foo(int _) {}
 }
@@ -44554,7 +45401,7 @@
   }
 
   test_setter_ofGeneric_refEnclosingTypeParameter_true() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class C<T> {
   set foo(T _) {}
 }
@@ -44608,9 +45455,11 @@
   }
 
   test_setter_static() async {
-    var library = await buildLibrary(
-      'class C { static void set x(int value) {} }',
-    );
+    var library = await buildLibrary(r'''
+class C {
+  static void set x(int value) {}
+}
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -44628,10 +45477,10 @@
               element: <testLibrary>::@class::C::@constructor::new
               typeName: C
           setters
-            #F4 isCompleteDeclaration isOriginDeclaration isStatic x (nameOffset:26) (firstTokenOffset:10) (offset:26)
+            #F4 isCompleteDeclaration isOriginDeclaration isStatic x (nameOffset:28) (firstTokenOffset:12) (offset:28)
               element: <testLibrary>::@class::C::@setter::x
               formalParameters
-                #F5 requiredPositional isOriginDeclaration value (nameOffset:32) (firstTokenOffset:28) (offset:32)
+                #F5 requiredPositional isOriginDeclaration value (nameOffset:34) (firstTokenOffset:30) (offset:34)
                   element: <testLibrary>::@class::C::@setter::x::@formalParameter::value
   classes
     isSimplyBounded class C
@@ -45299,7 +46148,7 @@
   }
 
   test_setters() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class C {
   void set x(int value) {}
   set y(value) {}
@@ -45376,10 +46225,11 @@
   }
 
   test_unused_typeParameter() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class C<T> {
   void f() {}
 }
+
 C<int> c;
 var v = c.f;
 ''');
@@ -45403,25 +46253,25 @@
             #F4 isCompleteDeclaration isOriginDeclaration f (nameOffset:20) (firstTokenOffset:15) (offset:20)
               element: <testLibrary>::@class::C::@method::f
       topLevelVariables
-        #F5 isOriginDeclaration isStatic c (nameOffset:36) (firstTokenOffset:36) (offset:36)
+        #F5 isOriginDeclaration isStatic c (nameOffset:37) (firstTokenOffset:37) (offset:37)
           element: <testLibrary>::@topLevelVariable::c
-        #F6 hasImplicitType hasInitializer isOriginDeclaration isStatic v (nameOffset:43) (firstTokenOffset:43) (offset:43)
+        #F6 hasImplicitType hasInitializer isOriginDeclaration isStatic v (nameOffset:44) (firstTokenOffset:44) (offset:44)
           element: <testLibrary>::@topLevelVariable::v
       getters
-        #F7 isCompleteDeclaration isOriginVariable isStatic c (nameOffset:<null>) (firstTokenOffset:<null>) (offset:36)
+        #F7 isCompleteDeclaration isOriginVariable isStatic c (nameOffset:<null>) (firstTokenOffset:<null>) (offset:37)
           element: <testLibrary>::@getter::c
-        #F8 isCompleteDeclaration isOriginVariable isStatic v (nameOffset:<null>) (firstTokenOffset:<null>) (offset:43)
+        #F8 isCompleteDeclaration isOriginVariable isStatic v (nameOffset:<null>) (firstTokenOffset:<null>) (offset:44)
           element: <testLibrary>::@getter::v
       setters
-        #F9 isCompleteDeclaration isOriginVariable isStatic c (nameOffset:<null>) (firstTokenOffset:<null>) (offset:36)
+        #F9 isCompleteDeclaration isOriginVariable isStatic c (nameOffset:<null>) (firstTokenOffset:<null>) (offset:37)
           element: <testLibrary>::@setter::c
           formalParameters
-            #F10 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:36)
+            #F10 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:37)
               element: <testLibrary>::@setter::c::@formalParameter::value
-        #F11 isCompleteDeclaration isOriginVariable isStatic v (nameOffset:<null>) (firstTokenOffset:<null>) (offset:43)
+        #F11 isCompleteDeclaration isOriginVariable isStatic v (nameOffset:<null>) (firstTokenOffset:<null>) (offset:44)
           element: <testLibrary>::@setter::v
           formalParameters
-            #F12 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:43)
+            #F12 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:44)
               element: <testLibrary>::@setter::v::@formalParameter::value
   classes
     isSimplyBounded class C
diff --git a/pkg/analyzer/test/src/summary/elements/const_test.dart b/pkg/analyzer/test/src/summary/elements/const_test.dart
index 1ab44a5..23fa304 100644
--- a/pkg/analyzer/test/src/summary/elements/const_test.dart
+++ b/pkg/analyzer/test/src/summary/elements/const_test.dart
@@ -20,7 +20,7 @@
 
 abstract class ConstElementTest extends ElementsBaseTest {
   test_const_asExpression() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 const num a = 0;
 const b = a as int;
 ''');
@@ -165,7 +165,9 @@
 
   test_const_cascadeExpression() async {
     var library = await buildLibrary(r'''
-const a = 0..isEven..abs();
+const a = 0
+  ..isEven
+  ..abs();
 ''');
     checkElementText(library, r'''
 library
@@ -183,21 +185,21 @@
                 staticType: int
               cascadeSections
                 PropertyAccess
-                  operator: .. @11
+                  operator: .. @14
                   propertyName: SimpleIdentifier
-                    token: isEven @13
+                    token: isEven @16
                     element: dart:core::@class::int::@getter::isEven
                     staticType: bool
                   staticType: bool
                 MethodInvocation
-                  operator: .. @19
+                  operator: .. @25
                   methodName: SimpleIdentifier
-                    token: abs @21
+                    token: abs @27
                     element: dart:core::@class::int::@method::abs
                     staticType: int Function()
                   argumentList: ArgumentList
-                    leftParenthesis: ( @24
-                    rightParenthesis: ) @25
+                    leftParenthesis: ( @30
+                    rightParenthesis: ) @31
                   staticInvokeType: int Function()
                   staticType: int
               staticType: int
@@ -339,12 +341,13 @@
   }
 
   test_const_constructor_inferred_args() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class C<T> {
   final T t;
   const C(this.t);
   const C.named(this.t);
 }
+
 const Object x = const C(0);
 const Object y = const C.named(0);
 ''');
@@ -383,40 +386,40 @@
             #F8 isCompleteDeclaration isOriginVariable t (nameOffset:<null>) (firstTokenOffset:<null>) (offset:23)
               element: <testLibrary>::@class::C::@getter::t
       topLevelVariables
-        #F9 hasInitializer isConst isOriginDeclaration isStatic x (nameOffset:85) (firstTokenOffset:85) (offset:85)
+        #F9 hasInitializer isConst isOriginDeclaration isStatic x (nameOffset:86) (firstTokenOffset:86) (offset:86)
           element: <testLibrary>::@topLevelVariable::x
           initializer: expression_0
             InstanceCreationExpression
-              keyword: const @89
+              keyword: const @90
               constructorName: ConstructorName
                 type: NamedType
-                  name: C @95
+                  name: C @96
                   element: <testLibrary>::@class::C
                   type: C<int>
                 element: ConstructorMember
                   baseElement: <testLibrary>::@class::C::@constructor::new
                   substitution: {T: int}
               argumentList: ArgumentList
-                leftParenthesis: ( @96
+                leftParenthesis: ( @97
                 arguments
                   IntegerLiteral
-                    literal: 0 @97
+                    literal: 0 @98
                     staticType: int
-                rightParenthesis: ) @98
+                rightParenthesis: ) @99
               staticType: C<int>
-        #F10 hasInitializer isConst isOriginDeclaration isStatic y (nameOffset:114) (firstTokenOffset:114) (offset:114)
+        #F10 hasInitializer isConst isOriginDeclaration isStatic y (nameOffset:115) (firstTokenOffset:115) (offset:115)
           element: <testLibrary>::@topLevelVariable::y
           initializer: expression_1
             InstanceCreationExpression
-              keyword: const @118
+              keyword: const @119
               constructorName: ConstructorName
                 type: NamedType
-                  name: C @124
+                  name: C @125
                   element: <testLibrary>::@class::C
                   type: C<int>
-                period: . @125
+                period: . @126
                 name: SimpleIdentifier
-                  token: named @126
+                  token: named @127
                   element: ConstructorMember
                     baseElement: <testLibrary>::@class::C::@constructor::named
                     substitution: {T: dynamic}
@@ -425,17 +428,17 @@
                   baseElement: <testLibrary>::@class::C::@constructor::named
                   substitution: {T: int}
               argumentList: ArgumentList
-                leftParenthesis: ( @131
+                leftParenthesis: ( @132
                 arguments
                   IntegerLiteral
-                    literal: 0 @132
+                    literal: 0 @133
                     staticType: int
-                rightParenthesis: ) @133
+                rightParenthesis: ) @134
               staticType: C<int>
       getters
-        #F11 isCompleteDeclaration isOriginVariable isStatic x (nameOffset:<null>) (firstTokenOffset:<null>) (offset:85)
+        #F11 isCompleteDeclaration isOriginVariable isStatic x (nameOffset:<null>) (firstTokenOffset:<null>) (offset:86)
           element: <testLibrary>::@getter::x
-        #F12 isCompleteDeclaration isOriginVariable isStatic y (nameOffset:<null>) (firstTokenOffset:<null>) (offset:114)
+        #F12 isCompleteDeclaration isOriginVariable isStatic y (nameOffset:<null>) (firstTokenOffset:<null>) (offset:115)
           element: <testLibrary>::@getter::y
   classes
     isSimplyBounded class C
@@ -517,6 +520,7 @@
 class A {
   A.named();
 }
+
 const v = A.named;
 ''');
     checkElementText(library, r'''
@@ -535,24 +539,24 @@
               typeNameOffset: 12
               periodOffset: 13
       topLevelVariables
-        #F3 hasImplicitType hasInitializer isConst isOriginDeclaration isStatic v (nameOffset:31) (firstTokenOffset:31) (offset:31)
+        #F3 hasImplicitType hasInitializer isConst isOriginDeclaration isStatic v (nameOffset:32) (firstTokenOffset:32) (offset:32)
           element: <testLibrary>::@topLevelVariable::v
           initializer: expression_0
             ConstructorReference
               constructorName: ConstructorName
                 type: NamedType
-                  name: A @35
+                  name: A @36
                   element: <testLibrary>::@class::A
                   type: null
-                period: . @36
+                period: . @37
                 name: SimpleIdentifier
-                  token: named @37
+                  token: named @38
                   element: <testLibrary>::@class::A::@constructor::named
                   staticType: null
                 element: <testLibrary>::@class::A::@constructor::named
               staticType: A Function()
       getters
-        #F4 isCompleteDeclaration isOriginVariable isStatic v (nameOffset:<null>) (firstTokenOffset:<null>) (offset:31)
+        #F4 isCompleteDeclaration isOriginVariable isStatic v (nameOffset:<null>) (firstTokenOffset:<null>) (offset:32)
           element: <testLibrary>::@getter::v
   classes
     isSimplyBounded class A
@@ -942,12 +946,12 @@
   }
 
   test_const_functionExpression_typeArgumentTypes() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 void f<T>(T a) {}
 
 const void Function(int) v = f;
 ''');
-    checkElementText(library, '''
+    checkElementText(library, r'''
 library
   reference: <testLibrary>
   fragments
@@ -1180,7 +1184,7 @@
   }
 
   test_const_inference_downward_list() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class P<T> {
   const P();
 }
@@ -1193,10 +1197,7 @@
   const P2();
 }
 
-const List<P> values = [
-  P1(),
-  P2<int>(),
-];
+const List<P> values = [P1(), P2<int>()];
 ''');
     checkElementText(library, r'''
 library
@@ -1245,38 +1246,38 @@
                 InstanceCreationExpression
                   constructorName: ConstructorName
                     type: NamedType
-                      name: P1 @144
+                      name: P1 @141
                       element: <testLibrary>::@class::P1
                       type: P1<dynamic>
                     element: ConstructorMember
                       baseElement: <testLibrary>::@class::P1::@constructor::new
                       substitution: {T: dynamic}
                   argumentList: ArgumentList
-                    leftParenthesis: ( @146
-                    rightParenthesis: ) @147
+                    leftParenthesis: ( @143
+                    rightParenthesis: ) @144
                   staticType: P1<dynamic>
                 InstanceCreationExpression
                   constructorName: ConstructorName
                     type: NamedType
-                      name: P2 @152
+                      name: P2 @147
                       typeArguments: TypeArgumentList
-                        leftBracket: < @154
+                        leftBracket: < @149
                         arguments
                           NamedType
-                            name: int @155
+                            name: int @150
                             element: dart:core::@class::int
                             type: int
-                        rightBracket: > @158
+                        rightBracket: > @153
                       element: <testLibrary>::@class::P2
                       type: P2<int>
                     element: ConstructorMember
                       baseElement: <testLibrary>::@class::P2::@constructor::new
                       substitution: {T: int}
                   argumentList: ArgumentList
-                    leftParenthesis: ( @159
-                    rightParenthesis: ) @160
+                    leftParenthesis: ( @154
+                    rightParenthesis: ) @155
                   staticType: P2<int>
-              rightBracket: ] @163
+              rightBracket: ] @156
               staticType: List<P<dynamic>>
       getters
         #F11 isCompleteDeclaration isOriginVariable isStatic values (nameOffset:<null>) (firstTokenOffset:<null>) (offset:131)
@@ -1343,6 +1344,7 @@
 class C {
   static const f = 1 + foo();
 }
+
 int foo() => 42;
 ''');
     checkElementText(library, r'''
@@ -1384,7 +1386,7 @@
             #F4 isCompleteDeclaration isOriginVariable isStatic f (nameOffset:<null>) (firstTokenOffset:<null>) (offset:25)
               element: <testLibrary>::@class::C::@getter::f
       functions
-        #F5 isCompleteDeclaration isOriginDeclaration isStatic foo (nameOffset:46) (firstTokenOffset:42) (offset:46)
+        #F5 isCompleteDeclaration isOriginDeclaration isStatic foo (nameOffset:47) (firstTokenOffset:43) (offset:47)
           element: <testLibrary>::@function::foo
   classes
     isSimplyBounded class C
@@ -1422,6 +1424,7 @@
 class C {
   final f = 1 + foo();
 }
+
 int foo() => 42;
 ''');
     checkElementText(library, r'''
@@ -1444,7 +1447,7 @@
             #F4 isCompleteDeclaration isOriginVariable f (nameOffset:<null>) (firstTokenOffset:<null>) (offset:18)
               element: <testLibrary>::@class::C::@getter::f
       functions
-        #F5 isCompleteDeclaration isOriginDeclaration isStatic foo (nameOffset:39) (firstTokenOffset:35) (offset:39)
+        #F5 isCompleteDeclaration isOriginDeclaration isStatic foo (nameOffset:40) (firstTokenOffset:36) (offset:40)
           element: <testLibrary>::@function::foo
   classes
     isSimplyBounded class C
@@ -1475,8 +1478,10 @@
   }
 
   test_const_invalid_functionExpression() async {
-    var library = await buildLibrary('''
-const v = () { return 0; };
+    var library = await buildLibrary(r'''
+const v = () {
+  return 0;
+};
 ''');
     checkElementText(library, r'''
 library
@@ -1514,8 +1519,8 @@
   }
 
   test_const_invalid_functionExpression_assertInitializer() async {
-    var library = await buildLibrary('''
-class A  {
+    var library = await buildLibrary(r'''
+class A {
   const A() : assert((() => true)());
 }
 ''');
@@ -1529,10 +1534,10 @@
         #F1 class A (nameOffset:6) (firstTokenOffset:0) (offset:6)
           element: <testLibrary>::@class::A
           constructors
-            #F2 isCompleteDeclaration isConst isOriginDeclaration new (nameOffset:<null>) (firstTokenOffset:13) (offset:19)
+            #F2 isCompleteDeclaration isConst isOriginDeclaration new (nameOffset:<null>) (firstTokenOffset:12) (offset:18)
               element: <testLibrary>::@class::A::@constructor::new
               typeName: A
-              typeNameOffset: 19
+              typeNameOffset: 18
   classes
     isSimplyBounded class A
       reference: <testLibrary>::@class::A
@@ -1543,19 +1548,19 @@
           firstFragment: #F2
           constantInitializers
             AssertInitializer
-              assertKeyword: assert @25
-              leftParenthesis: ( @31
+              assertKeyword: assert @24
+              leftParenthesis: ( @30
               condition: SimpleIdentifier
                 token: _notSerializableExpression @-1
                 element: <null>
                 staticType: null
-              rightParenthesis: ) @46
+              rightParenthesis: ) @45
 ''');
   }
 
   test_const_invalid_functionExpression_assertInitializer_message() async {
-    var library = await buildLibrary('''
-class A  {
+    var library = await buildLibrary(r'''
+class A {
   const A() : assert(b, () => 0);
 }
 ''');
@@ -1569,10 +1574,10 @@
         #F1 class A (nameOffset:6) (firstTokenOffset:0) (offset:6)
           element: <testLibrary>::@class::A
           constructors
-            #F2 isCompleteDeclaration isConst isOriginDeclaration new (nameOffset:<null>) (firstTokenOffset:13) (offset:19)
+            #F2 isCompleteDeclaration isConst isOriginDeclaration new (nameOffset:<null>) (firstTokenOffset:12) (offset:18)
               element: <testLibrary>::@class::A::@constructor::new
               typeName: A
-              typeNameOffset: 19
+              typeNameOffset: 18
   classes
     isSimplyBounded class A
       reference: <testLibrary>::@class::A
@@ -1583,23 +1588,23 @@
           firstFragment: #F2
           constantInitializers
             AssertInitializer
-              assertKeyword: assert @25
-              leftParenthesis: ( @31
+              assertKeyword: assert @24
+              leftParenthesis: ( @30
               condition: SimpleIdentifier
-                token: b @32
+                token: b @31
                 element: <null>
                 staticType: InvalidType
-              comma: , @33
+              comma: , @32
               message: SimpleIdentifier
                 token: _notSerializableExpression @-1
                 element: <null>
                 staticType: null
-              rightParenthesis: ) @42
+              rightParenthesis: ) @41
 ''');
   }
 
   test_const_invalid_functionExpression_constructorFieldInitializer() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class A {
   final Object? foo;
   const A() : foo = (() => 0);
@@ -1660,8 +1665,12 @@
   }
 
   test_const_invalid_functionExpression_nested() async {
-    var library = await buildLibrary('''
-const v = () { return 0; } + 2;
+    var library = await buildLibrary(r'''
+const v =
+    () {
+      return 0;
+    } +
+    2;
 ''');
     checkElementText(library, r'''
 library
@@ -1699,7 +1708,7 @@
   }
 
   test_const_invalid_functionExpression_redirectingConstructorInvocation() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class A {
   const A(Object a, Object b);
   const A.named() : this(0, () => 0);
@@ -1767,10 +1776,11 @@
   }
 
   test_const_invalid_functionExpression_superConstructorInvocation() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class A {
   const A(Object a, Object b);
 }
+
 class B extends A {
   const B() : super(0, () => 0);
 }
@@ -1794,13 +1804,13 @@
                   element: <testLibrary>::@class::A::@constructor::new::@formalParameter::a
                 #F4 requiredPositional isOriginDeclaration b (nameOffset:37) (firstTokenOffset:30) (offset:37)
                   element: <testLibrary>::@class::A::@constructor::new::@formalParameter::b
-        #F5 hasExtendsClause class B (nameOffset:49) (firstTokenOffset:43) (offset:49)
+        #F5 hasExtendsClause class B (nameOffset:50) (firstTokenOffset:44) (offset:50)
           element: <testLibrary>::@class::B
           constructors
-            #F6 isCompleteDeclaration isConst isOriginDeclaration new (nameOffset:<null>) (firstTokenOffset:65) (offset:71)
+            #F6 isCompleteDeclaration isConst isOriginDeclaration new (nameOffset:<null>) (firstTokenOffset:66) (offset:72)
               element: <testLibrary>::@class::B::@constructor::new
               typeName: B
-              typeNameOffset: 71
+              typeNameOffset: 72
   classes
     isSimplyBounded class A
       reference: <testLibrary>::@class::A
@@ -1826,18 +1836,18 @@
           firstFragment: #F6
           constantInitializers
             SuperConstructorInvocation
-              superKeyword: super @77
+              superKeyword: super @78
               argumentList: ArgumentList
-                leftParenthesis: ( @82
+                leftParenthesis: ( @83
                 arguments
                   IntegerLiteral
-                    literal: 0 @83
+                    literal: 0 @84
                     staticType: int
                   SimpleIdentifier
                     token: _notSerializableExpression @-1
                     element: <null>
                     staticType: null
-                rightParenthesis: ) @93
+                rightParenthesis: ) @94
               element: <testLibrary>::@class::A::@constructor::new
           superConstructor: <testLibrary>::@class::A::@constructor::new
 ''');
@@ -1906,7 +1916,7 @@
   }
 
   test_const_invalid_patternAssignment() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 const v = (a,) = (0,);
 ''');
     checkElementText(library, r'''
@@ -2008,7 +2018,11 @@
 
   test_const_invalid_topLevel_switchExpression() async {
     var library = await buildLibrary(r'''
-const a = 0 + switch (true) {_ => 1};
+const a =
+    0 +
+    switch (true) {
+      _ => 1,
+    };
 ''');
     checkElementText(library, r'''
 library
@@ -2119,6 +2133,7 @@
 class C<K, V> {
   const C.named(K k, V v);
 }
+
 const V = const C<int, String>.named(1, '222');
 ''');
     checkElementText(library, r'''
@@ -2147,31 +2162,31 @@
                 #F6 requiredPositional isOriginDeclaration v (nameOffset:39) (firstTokenOffset:37) (offset:39)
                   element: <testLibrary>::@class::C::@constructor::named::@formalParameter::v
       topLevelVariables
-        #F7 hasImplicitType hasInitializer isConst isOriginDeclaration isStatic V (nameOffset:51) (firstTokenOffset:51) (offset:51)
+        #F7 hasImplicitType hasInitializer isConst isOriginDeclaration isStatic V (nameOffset:52) (firstTokenOffset:52) (offset:52)
           element: <testLibrary>::@topLevelVariable::V
           initializer: expression_0
             InstanceCreationExpression
-              keyword: const @55
+              keyword: const @56
               constructorName: ConstructorName
                 type: NamedType
-                  name: C @61
+                  name: C @62
                   typeArguments: TypeArgumentList
-                    leftBracket: < @62
+                    leftBracket: < @63
                     arguments
                       NamedType
-                        name: int @63
+                        name: int @64
                         element: dart:core::@class::int
                         type: int
                       NamedType
-                        name: String @68
+                        name: String @69
                         element: dart:core::@class::String
                         type: String
-                    rightBracket: > @74
+                    rightBracket: > @75
                   element: <testLibrary>::@class::C
                   type: C<int, String>
-                period: . @75
+                period: . @76
                 name: SimpleIdentifier
-                  token: named @76
+                  token: named @77
                   element: ConstructorMember
                     baseElement: <testLibrary>::@class::C::@constructor::named
                     substitution: {K: int, V: String}
@@ -2180,17 +2195,17 @@
                   baseElement: <testLibrary>::@class::C::@constructor::named
                   substitution: {K: int, V: String}
               argumentList: ArgumentList
-                leftParenthesis: ( @81
+                leftParenthesis: ( @82
                 arguments
                   IntegerLiteral
-                    literal: 1 @82
+                    literal: 1 @83
                     staticType: int
                   SimpleStringLiteral
-                    literal: '222' @85
-                rightParenthesis: ) @90
+                    literal: '222' @86
+                rightParenthesis: ) @91
               staticType: C<int, String>
       getters
-        #F8 isCompleteDeclaration isOriginVariable isStatic V (nameOffset:<null>) (firstTokenOffset:<null>) (offset:51)
+        #F8 isCompleteDeclaration isOriginVariable isStatic V (nameOffset:<null>) (firstTokenOffset:<null>) (offset:52)
           element: <testLibrary>::@getter::V
   classes
     isSimplyBounded class C
@@ -2238,6 +2253,7 @@
 ''');
     var library = await buildLibrary(r'''
 import 'a.dart';
+
 const V = const C<int, String>.named(1, '222');
 ''');
     checkElementText(library, r'''
@@ -2249,31 +2265,31 @@
       libraryImports
         package:test/a.dart
       topLevelVariables
-        #F1 hasImplicitType hasInitializer isConst isOriginDeclaration isStatic V (nameOffset:23) (firstTokenOffset:23) (offset:23)
+        #F1 hasImplicitType hasInitializer isConst isOriginDeclaration isStatic V (nameOffset:24) (firstTokenOffset:24) (offset:24)
           element: <testLibrary>::@topLevelVariable::V
           initializer: expression_0
             InstanceCreationExpression
-              keyword: const @27
+              keyword: const @28
               constructorName: ConstructorName
                 type: NamedType
-                  name: C @33
+                  name: C @34
                   typeArguments: TypeArgumentList
-                    leftBracket: < @34
+                    leftBracket: < @35
                     arguments
                       NamedType
-                        name: int @35
+                        name: int @36
                         element: dart:core::@class::int
                         type: int
                       NamedType
-                        name: String @40
+                        name: String @41
                         element: dart:core::@class::String
                         type: String
-                    rightBracket: > @46
+                    rightBracket: > @47
                   element: package:test/a.dart::@class::C
                   type: C<int, String>
-                period: . @47
+                period: . @48
                 name: SimpleIdentifier
-                  token: named @48
+                  token: named @49
                   element: ConstructorMember
                     baseElement: package:test/a.dart::@class::C::@constructor::named
                     substitution: {K: int, V: String}
@@ -2282,17 +2298,17 @@
                   baseElement: package:test/a.dart::@class::C::@constructor::named
                   substitution: {K: int, V: String}
               argumentList: ArgumentList
-                leftParenthesis: ( @53
+                leftParenthesis: ( @54
                 arguments
                   IntegerLiteral
-                    literal: 1 @54
+                    literal: 1 @55
                     staticType: int
                   SimpleStringLiteral
-                    literal: '222' @57
-                rightParenthesis: ) @62
+                    literal: '222' @58
+                rightParenthesis: ) @63
               staticType: C<int, String>
       getters
-        #F2 isCompleteDeclaration isOriginVariable isStatic V (nameOffset:<null>) (firstTokenOffset:<null>) (offset:23)
+        #F2 isCompleteDeclaration isOriginVariable isStatic V (nameOffset:<null>) (firstTokenOffset:<null>) (offset:24)
           element: <testLibrary>::@getter::V
   topLevelVariables
     hasImplicitType hasInitializer isConst isOriginDeclaration isStatic isTypeInferredFromInitializer V
@@ -2320,6 +2336,7 @@
 ''');
     var library = await buildLibrary(r'''
 import 'a.dart' as p;
+
 const V = const p.C<int, String>.named(1, '222');
 ''');
     checkElementText(library, r'''
@@ -2334,35 +2351,35 @@
         <testLibraryFragment>::@prefix::p
           fragments: @19
       topLevelVariables
-        #F1 hasImplicitType hasInitializer isConst isOriginDeclaration isStatic V (nameOffset:28) (firstTokenOffset:28) (offset:28)
+        #F1 hasImplicitType hasInitializer isConst isOriginDeclaration isStatic V (nameOffset:29) (firstTokenOffset:29) (offset:29)
           element: <testLibrary>::@topLevelVariable::V
           initializer: expression_0
             InstanceCreationExpression
-              keyword: const @32
+              keyword: const @33
               constructorName: ConstructorName
                 type: NamedType
                   importPrefix: ImportPrefixReference
-                    name: p @38
-                    period: . @39
+                    name: p @39
+                    period: . @40
                     element: <testLibraryFragment>::@prefix::p
-                  name: C @40
+                  name: C @41
                   typeArguments: TypeArgumentList
-                    leftBracket: < @41
+                    leftBracket: < @42
                     arguments
                       NamedType
-                        name: int @42
+                        name: int @43
                         element: dart:core::@class::int
                         type: int
                       NamedType
-                        name: String @47
+                        name: String @48
                         element: dart:core::@class::String
                         type: String
-                    rightBracket: > @53
+                    rightBracket: > @54
                   element: package:test/a.dart::@class::C
                   type: C<int, String>
-                period: . @54
+                period: . @55
                 name: SimpleIdentifier
-                  token: named @55
+                  token: named @56
                   element: ConstructorMember
                     baseElement: package:test/a.dart::@class::C::@constructor::named
                     substitution: {K: int, V: String}
@@ -2371,17 +2388,17 @@
                   baseElement: package:test/a.dart::@class::C::@constructor::named
                   substitution: {K: int, V: String}
               argumentList: ArgumentList
-                leftParenthesis: ( @60
+                leftParenthesis: ( @61
                 arguments
                   IntegerLiteral
-                    literal: 1 @61
+                    literal: 1 @62
                     staticType: int
                   SimpleStringLiteral
-                    literal: '222' @64
-                rightParenthesis: ) @69
+                    literal: '222' @65
+                rightParenthesis: ) @70
               staticType: C<int, String>
       getters
-        #F2 isCompleteDeclaration isOriginVariable isStatic V (nameOffset:<null>) (firstTokenOffset:<null>) (offset:28)
+        #F2 isCompleteDeclaration isOriginVariable isStatic V (nameOffset:<null>) (firstTokenOffset:<null>) (offset:29)
           element: <testLibrary>::@getter::V
   topLevelVariables
     hasImplicitType hasInitializer isConst isOriginDeclaration isStatic isTypeInferredFromInitializer V
@@ -2406,6 +2423,7 @@
 class C<K, V> {
   const C();
 }
+
 const V = const C();
 ''');
     checkElementText(library, r'''
@@ -2428,25 +2446,25 @@
               typeName: C
               typeNameOffset: 24
       topLevelVariables
-        #F5 hasImplicitType hasInitializer isConst isOriginDeclaration isStatic V (nameOffset:37) (firstTokenOffset:37) (offset:37)
+        #F5 hasImplicitType hasInitializer isConst isOriginDeclaration isStatic V (nameOffset:38) (firstTokenOffset:38) (offset:38)
           element: <testLibrary>::@topLevelVariable::V
           initializer: expression_0
             InstanceCreationExpression
-              keyword: const @41
+              keyword: const @42
               constructorName: ConstructorName
                 type: NamedType
-                  name: C @47
+                  name: C @48
                   element: <testLibrary>::@class::C
                   type: C<dynamic, dynamic>
                 element: ConstructorMember
                   baseElement: <testLibrary>::@class::C::@constructor::new
                   substitution: {K: dynamic, V: dynamic}
               argumentList: ArgumentList
-                leftParenthesis: ( @48
-                rightParenthesis: ) @49
+                leftParenthesis: ( @49
+                rightParenthesis: ) @50
               staticType: C<dynamic, dynamic>
       getters
-        #F6 isCompleteDeclaration isOriginVariable isStatic V (nameOffset:<null>) (firstTokenOffset:<null>) (offset:37)
+        #F6 isCompleteDeclaration isOriginVariable isStatic V (nameOffset:<null>) (firstTokenOffset:<null>) (offset:38)
           element: <testLibrary>::@getter::V
   classes
     isSimplyBounded class C
@@ -2485,6 +2503,7 @@
   final T t;
   const A(this.t);
 }
+
 const Object a = const A(0);
 ''');
     checkElementText(library, r'''
@@ -2514,29 +2533,29 @@
             #F6 isCompleteDeclaration isOriginVariable t (nameOffset:<null>) (firstTokenOffset:<null>) (offset:23)
               element: <testLibrary>::@class::A::@getter::t
       topLevelVariables
-        #F7 hasInitializer isConst isOriginDeclaration isStatic a (nameOffset:60) (firstTokenOffset:60) (offset:60)
+        #F7 hasInitializer isConst isOriginDeclaration isStatic a (nameOffset:61) (firstTokenOffset:61) (offset:61)
           element: <testLibrary>::@topLevelVariable::a
           initializer: expression_0
             InstanceCreationExpression
-              keyword: const @64
+              keyword: const @65
               constructorName: ConstructorName
                 type: NamedType
-                  name: A @70
+                  name: A @71
                   element: <testLibrary>::@class::A
                   type: A<int>
                 element: ConstructorMember
                   baseElement: <testLibrary>::@class::A::@constructor::new
                   substitution: {T: int}
               argumentList: ArgumentList
-                leftParenthesis: ( @71
+                leftParenthesis: ( @72
                 arguments
                   IntegerLiteral
-                    literal: 0 @72
+                    literal: 0 @73
                     staticType: int
-                rightParenthesis: ) @73
+                rightParenthesis: ) @74
               staticType: A<int>
       getters
-        #F8 isCompleteDeclaration isOriginVariable isStatic a (nameOffset:<null>) (firstTokenOffset:<null>) (offset:60)
+        #F8 isCompleteDeclaration isOriginVariable isStatic a (nameOffset:<null>) (firstTokenOffset:<null>) (offset:61)
           element: <testLibrary>::@getter::a
   classes
     isSimplyBounded class A
@@ -2589,6 +2608,7 @@
 class C<K, V> {
   const C();
 }
+
 const V = const C<int, String>();
 ''');
     checkElementText(library, r'''
@@ -2611,37 +2631,37 @@
               typeName: C
               typeNameOffset: 24
       topLevelVariables
-        #F5 hasImplicitType hasInitializer isConst isOriginDeclaration isStatic V (nameOffset:37) (firstTokenOffset:37) (offset:37)
+        #F5 hasImplicitType hasInitializer isConst isOriginDeclaration isStatic V (nameOffset:38) (firstTokenOffset:38) (offset:38)
           element: <testLibrary>::@topLevelVariable::V
           initializer: expression_0
             InstanceCreationExpression
-              keyword: const @41
+              keyword: const @42
               constructorName: ConstructorName
                 type: NamedType
-                  name: C @47
+                  name: C @48
                   typeArguments: TypeArgumentList
-                    leftBracket: < @48
+                    leftBracket: < @49
                     arguments
                       NamedType
-                        name: int @49
+                        name: int @50
                         element: dart:core::@class::int
                         type: int
                       NamedType
-                        name: String @54
+                        name: String @55
                         element: dart:core::@class::String
                         type: String
-                    rightBracket: > @60
+                    rightBracket: > @61
                   element: <testLibrary>::@class::C
                   type: C<int, String>
                 element: ConstructorMember
                   baseElement: <testLibrary>::@class::C::@constructor::new
                   substitution: {K: int, V: String}
               argumentList: ArgumentList
-                leftParenthesis: ( @61
-                rightParenthesis: ) @62
+                leftParenthesis: ( @62
+                rightParenthesis: ) @63
               staticType: C<int, String>
       getters
-        #F6 isCompleteDeclaration isOriginVariable isStatic V (nameOffset:<null>) (firstTokenOffset:<null>) (offset:37)
+        #F6 isCompleteDeclaration isOriginVariable isStatic V (nameOffset:<null>) (firstTokenOffset:<null>) (offset:38)
           element: <testLibrary>::@getter::V
   classes
     isSimplyBounded class C
@@ -2682,6 +2702,7 @@
 ''');
     var library = await buildLibrary(r'''
 import 'a.dart';
+
 const V = const C<int, String>();
 ''');
     checkElementText(library, r'''
@@ -2693,37 +2714,37 @@
       libraryImports
         package:test/a.dart
       topLevelVariables
-        #F1 hasImplicitType hasInitializer isConst isOriginDeclaration isStatic V (nameOffset:23) (firstTokenOffset:23) (offset:23)
+        #F1 hasImplicitType hasInitializer isConst isOriginDeclaration isStatic V (nameOffset:24) (firstTokenOffset:24) (offset:24)
           element: <testLibrary>::@topLevelVariable::V
           initializer: expression_0
             InstanceCreationExpression
-              keyword: const @27
+              keyword: const @28
               constructorName: ConstructorName
                 type: NamedType
-                  name: C @33
+                  name: C @34
                   typeArguments: TypeArgumentList
-                    leftBracket: < @34
+                    leftBracket: < @35
                     arguments
                       NamedType
-                        name: int @35
+                        name: int @36
                         element: dart:core::@class::int
                         type: int
                       NamedType
-                        name: String @40
+                        name: String @41
                         element: dart:core::@class::String
                         type: String
-                    rightBracket: > @46
+                    rightBracket: > @47
                   element: package:test/a.dart::@class::C
                   type: C<int, String>
                 element: ConstructorMember
                   baseElement: package:test/a.dart::@class::C::@constructor::new
                   substitution: {K: int, V: String}
               argumentList: ArgumentList
-                leftParenthesis: ( @47
-                rightParenthesis: ) @48
+                leftParenthesis: ( @48
+                rightParenthesis: ) @49
               staticType: C<int, String>
       getters
-        #F2 isCompleteDeclaration isOriginVariable isStatic V (nameOffset:<null>) (firstTokenOffset:<null>) (offset:23)
+        #F2 isCompleteDeclaration isOriginVariable isStatic V (nameOffset:<null>) (firstTokenOffset:<null>) (offset:24)
           element: <testLibrary>::@getter::V
   topLevelVariables
     hasImplicitType hasInitializer isConst isOriginDeclaration isStatic isTypeInferredFromInitializer V
@@ -2751,6 +2772,7 @@
 ''');
     var library = await buildLibrary(r'''
 import 'a.dart' as p;
+
 const V = const p.C<int, String>();
 ''');
     checkElementText(library, r'''
@@ -2765,41 +2787,41 @@
         <testLibraryFragment>::@prefix::p
           fragments: @19
       topLevelVariables
-        #F1 hasImplicitType hasInitializer isConst isOriginDeclaration isStatic V (nameOffset:28) (firstTokenOffset:28) (offset:28)
+        #F1 hasImplicitType hasInitializer isConst isOriginDeclaration isStatic V (nameOffset:29) (firstTokenOffset:29) (offset:29)
           element: <testLibrary>::@topLevelVariable::V
           initializer: expression_0
             InstanceCreationExpression
-              keyword: const @32
+              keyword: const @33
               constructorName: ConstructorName
                 type: NamedType
                   importPrefix: ImportPrefixReference
-                    name: p @38
-                    period: . @39
+                    name: p @39
+                    period: . @40
                     element: <testLibraryFragment>::@prefix::p
-                  name: C @40
+                  name: C @41
                   typeArguments: TypeArgumentList
-                    leftBracket: < @41
+                    leftBracket: < @42
                     arguments
                       NamedType
-                        name: int @42
+                        name: int @43
                         element: dart:core::@class::int
                         type: int
                       NamedType
-                        name: String @47
+                        name: String @48
                         element: dart:core::@class::String
                         type: String
-                    rightBracket: > @53
+                    rightBracket: > @54
                   element: package:test/a.dart::@class::C
                   type: C<int, String>
                 element: ConstructorMember
                   baseElement: package:test/a.dart::@class::C::@constructor::new
                   substitution: {K: int, V: String}
               argumentList: ArgumentList
-                leftParenthesis: ( @54
-                rightParenthesis: ) @55
+                leftParenthesis: ( @55
+                rightParenthesis: ) @56
               staticType: C<int, String>
       getters
-        #F2 isCompleteDeclaration isOriginVariable isStatic V (nameOffset:<null>) (firstTokenOffset:<null>) (offset:28)
+        #F2 isCompleteDeclaration isOriginVariable isStatic V (nameOffset:<null>) (firstTokenOffset:<null>) (offset:29)
           element: <testLibrary>::@getter::V
   topLevelVariables
     hasImplicitType hasInitializer isConst isOriginDeclaration isStatic isTypeInferredFromInitializer V
@@ -2824,6 +2846,7 @@
 class C {
   const C.named(bool a, int b, int c, {String d, double e});
 }
+
 const V = const C.named(true, 1, 2, d: 'ccc', e: 3.4);
 ''');
     checkElementText(library, r'''
@@ -2853,49 +2876,49 @@
                 #F7 optionalNamed isOriginDeclaration e (nameOffset:66) (firstTokenOffset:59) (offset:66)
                   element: <testLibrary>::@class::C::@constructor::named::@formalParameter::e
       topLevelVariables
-        #F8 hasImplicitType hasInitializer isConst isOriginDeclaration isStatic V (nameOffset:79) (firstTokenOffset:79) (offset:79)
+        #F8 hasImplicitType hasInitializer isConst isOriginDeclaration isStatic V (nameOffset:80) (firstTokenOffset:80) (offset:80)
           element: <testLibrary>::@topLevelVariable::V
           initializer: expression_0
             InstanceCreationExpression
-              keyword: const @83
+              keyword: const @84
               constructorName: ConstructorName
                 type: NamedType
-                  name: C @89
+                  name: C @90
                   element: <testLibrary>::@class::C
                   type: C
-                period: . @90
+                period: . @91
                 name: SimpleIdentifier
-                  token: named @91
+                  token: named @92
                   element: <testLibrary>::@class::C::@constructor::named
                   staticType: null
                 element: <testLibrary>::@class::C::@constructor::named
               argumentList: ArgumentList
-                leftParenthesis: ( @96
+                leftParenthesis: ( @97
                 arguments
                   BooleanLiteral
-                    literal: true @97
+                    literal: true @98
                     staticType: bool
                   IntegerLiteral
-                    literal: 1 @103
+                    literal: 1 @104
                     staticType: int
                   IntegerLiteral
-                    literal: 2 @106
+                    literal: 2 @107
                     staticType: int
                   NamedArgument
-                    name: d @109
-                    colon: : @110
+                    name: d @110
+                    colon: : @111
                     argumentExpression: SimpleStringLiteral
-                      literal: 'ccc' @112
+                      literal: 'ccc' @113
                   NamedArgument
-                    name: e @119
-                    colon: : @120
+                    name: e @120
+                    colon: : @121
                     argumentExpression: DoubleLiteral
-                      literal: 3.4 @122
+                      literal: 3.4 @123
                       staticType: double
-                rightParenthesis: ) @125
+                rightParenthesis: ) @126
               staticType: C
       getters
-        #F9 isCompleteDeclaration isOriginVariable isStatic V (nameOffset:<null>) (firstTokenOffset:<null>) (offset:79)
+        #F9 isCompleteDeclaration isOriginVariable isStatic V (nameOffset:<null>) (firstTokenOffset:<null>) (offset:80)
           element: <testLibrary>::@getter::V
   classes
     isSimplyBounded class C
@@ -2947,6 +2970,7 @@
 ''');
     var library = await buildLibrary(r'''
 import 'a.dart';
+
 const V = const C.named();
 ''');
     checkElementText(library, r'''
@@ -2958,28 +2982,28 @@
       libraryImports
         package:test/a.dart
       topLevelVariables
-        #F1 hasImplicitType hasInitializer isConst isOriginDeclaration isStatic V (nameOffset:23) (firstTokenOffset:23) (offset:23)
+        #F1 hasImplicitType hasInitializer isConst isOriginDeclaration isStatic V (nameOffset:24) (firstTokenOffset:24) (offset:24)
           element: <testLibrary>::@topLevelVariable::V
           initializer: expression_0
             InstanceCreationExpression
-              keyword: const @27
+              keyword: const @28
               constructorName: ConstructorName
                 type: NamedType
-                  name: C @33
+                  name: C @34
                   element: package:test/a.dart::@class::C
                   type: C
-                period: . @34
+                period: . @35
                 name: SimpleIdentifier
-                  token: named @35
+                  token: named @36
                   element: package:test/a.dart::@class::C::@constructor::named
                   staticType: null
                 element: package:test/a.dart::@class::C::@constructor::named
               argumentList: ArgumentList
-                leftParenthesis: ( @40
-                rightParenthesis: ) @41
+                leftParenthesis: ( @41
+                rightParenthesis: ) @42
               staticType: C
       getters
-        #F2 isCompleteDeclaration isOriginVariable isStatic V (nameOffset:<null>) (firstTokenOffset:<null>) (offset:23)
+        #F2 isCompleteDeclaration isOriginVariable isStatic V (nameOffset:<null>) (firstTokenOffset:<null>) (offset:24)
           element: <testLibrary>::@getter::V
   topLevelVariables
     hasImplicitType hasInitializer isConst isOriginDeclaration isStatic isTypeInferredFromInitializer V
@@ -3007,6 +3031,7 @@
 ''');
     var library = await buildLibrary(r'''
 import 'a.dart' as p;
+
 const V = const p.C.named();
 ''');
     checkElementText(library, r'''
@@ -3021,32 +3046,32 @@
         <testLibraryFragment>::@prefix::p
           fragments: @19
       topLevelVariables
-        #F1 hasImplicitType hasInitializer isConst isOriginDeclaration isStatic V (nameOffset:28) (firstTokenOffset:28) (offset:28)
+        #F1 hasImplicitType hasInitializer isConst isOriginDeclaration isStatic V (nameOffset:29) (firstTokenOffset:29) (offset:29)
           element: <testLibrary>::@topLevelVariable::V
           initializer: expression_0
             InstanceCreationExpression
-              keyword: const @32
+              keyword: const @33
               constructorName: ConstructorName
                 type: NamedType
                   importPrefix: ImportPrefixReference
-                    name: p @38
-                    period: . @39
+                    name: p @39
+                    period: . @40
                     element: <testLibraryFragment>::@prefix::p
-                  name: C @40
+                  name: C @41
                   element: package:test/a.dart::@class::C
                   type: C
-                period: . @41
+                period: . @42
                 name: SimpleIdentifier
-                  token: named @42
+                  token: named @43
                   element: package:test/a.dart::@class::C::@constructor::named
                   staticType: null
                 element: package:test/a.dart::@class::C::@constructor::named
               argumentList: ArgumentList
-                leftParenthesis: ( @47
-                rightParenthesis: ) @48
+                leftParenthesis: ( @48
+                rightParenthesis: ) @49
               staticType: C
       getters
-        #F2 isCompleteDeclaration isOriginVariable isStatic V (nameOffset:<null>) (firstTokenOffset:<null>) (offset:28)
+        #F2 isCompleteDeclaration isOriginVariable isStatic V (nameOffset:<null>) (firstTokenOffset:<null>) (offset:29)
           element: <testLibrary>::@getter::V
   topLevelVariables
     hasImplicitType hasInitializer isConst isOriginDeclaration isStatic isTypeInferredFromInitializer V
@@ -3069,6 +3094,7 @@
   test_const_invokeConstructor_named_unresolved() async {
     var library = await buildLibrary(r'''
 class C {}
+
 const V = const C.named();
 ''');
     checkElementText(library, r'''
@@ -3085,28 +3111,28 @@
               element: <testLibrary>::@class::C::@constructor::new
               typeName: C
       topLevelVariables
-        #F3 hasImplicitType hasInitializer isConst isOriginDeclaration isStatic V (nameOffset:17) (firstTokenOffset:17) (offset:17)
+        #F3 hasImplicitType hasInitializer isConst isOriginDeclaration isStatic V (nameOffset:18) (firstTokenOffset:18) (offset:18)
           element: <testLibrary>::@topLevelVariable::V
           initializer: expression_0
             InstanceCreationExpression
-              keyword: const @21
+              keyword: const @22
               constructorName: ConstructorName
                 type: NamedType
-                  name: C @27
+                  name: C @28
                   element: <testLibrary>::@class::C
                   type: C
-                period: . @28
+                period: . @29
                 name: SimpleIdentifier
-                  token: named @29
+                  token: named @30
                   element: <null>
                   staticType: null
                 element: <null>
               argumentList: ArgumentList
-                leftParenthesis: ( @34
-                rightParenthesis: ) @35
+                leftParenthesis: ( @35
+                rightParenthesis: ) @36
               staticType: C
       getters
-        #F4 isCompleteDeclaration isOriginVariable isStatic V (nameOffset:<null>) (firstTokenOffset:<null>) (offset:17)
+        #F4 isCompleteDeclaration isOriginVariable isStatic V (nameOffset:<null>) (firstTokenOffset:<null>) (offset:18)
           element: <testLibrary>::@getter::V
   classes
     isSimplyBounded class C
@@ -3192,6 +3218,7 @@
 ''');
     var library = await buildLibrary(r'''
 import 'a.dart' as p;
+
 const V = const p.C.named();
 ''');
     checkElementText(library, r'''
@@ -3206,32 +3233,32 @@
         <testLibraryFragment>::@prefix::p
           fragments: @19
       topLevelVariables
-        #F1 hasImplicitType hasInitializer isConst isOriginDeclaration isStatic V (nameOffset:28) (firstTokenOffset:28) (offset:28)
+        #F1 hasImplicitType hasInitializer isConst isOriginDeclaration isStatic V (nameOffset:29) (firstTokenOffset:29) (offset:29)
           element: <testLibrary>::@topLevelVariable::V
           initializer: expression_0
             InstanceCreationExpression
-              keyword: const @32
+              keyword: const @33
               constructorName: ConstructorName
                 type: NamedType
                   importPrefix: ImportPrefixReference
-                    name: p @38
-                    period: . @39
+                    name: p @39
+                    period: . @40
                     element: <testLibraryFragment>::@prefix::p
-                  name: C @40
+                  name: C @41
                   element: package:test/a.dart::@class::C
                   type: C
-                period: . @41
+                period: . @42
                 name: SimpleIdentifier
-                  token: named @42
+                  token: named @43
                   element: <null>
                   staticType: null
                 element: <null>
               argumentList: ArgumentList
-                leftParenthesis: ( @47
-                rightParenthesis: ) @48
+                leftParenthesis: ( @48
+                rightParenthesis: ) @49
               staticType: C
       getters
-        #F2 isCompleteDeclaration isOriginVariable isStatic V (nameOffset:<null>) (firstTokenOffset:<null>) (offset:28)
+        #F2 isCompleteDeclaration isOriginVariable isStatic V (nameOffset:<null>) (firstTokenOffset:<null>) (offset:29)
           element: <testLibrary>::@getter::V
   topLevelVariables
     hasImplicitType hasInitializer isConst isOriginDeclaration isStatic isTypeInferredFromInitializer V
@@ -3252,9 +3279,11 @@
   }
 
   test_const_invokeConstructor_named_unresolved4() async {
-    newFile('$testPackageLibPath/a.dart', '');
+    newFile('$testPackageLibPath/a.dart', r'''
+''');
     var library = await buildLibrary(r'''
 import 'a.dart' as p;
+
 const V = const p.C.named();
 ''');
     checkElementText(library, r'''
@@ -3269,32 +3298,32 @@
         <testLibraryFragment>::@prefix::p
           fragments: @19
       topLevelVariables
-        #F1 hasImplicitType hasInitializer isConst isOriginDeclaration isStatic V (nameOffset:28) (firstTokenOffset:28) (offset:28)
+        #F1 hasImplicitType hasInitializer isConst isOriginDeclaration isStatic V (nameOffset:29) (firstTokenOffset:29) (offset:29)
           element: <testLibrary>::@topLevelVariable::V
           initializer: expression_0
             InstanceCreationExpression
-              keyword: const @32
+              keyword: const @33
               constructorName: ConstructorName
                 type: NamedType
                   importPrefix: ImportPrefixReference
-                    name: p @38
-                    period: . @39
+                    name: p @39
+                    period: . @40
                     element: <testLibraryFragment>::@prefix::p
-                  name: C @40
+                  name: C @41
                   element: <null>
                   type: InvalidType
-                period: . @41
+                period: . @42
                 name: SimpleIdentifier
-                  token: named @42
+                  token: named @43
                   element: <null>
                   staticType: null
                 element: <null>
               argumentList: ArgumentList
-                leftParenthesis: ( @47
-                rightParenthesis: ) @48
+                leftParenthesis: ( @48
+                rightParenthesis: ) @49
               staticType: InvalidType
       getters
-        #F2 isCompleteDeclaration isOriginVariable isStatic V (nameOffset:<null>) (firstTokenOffset:<null>) (offset:28)
+        #F2 isCompleteDeclaration isOriginVariable isStatic V (nameOffset:<null>) (firstTokenOffset:<null>) (offset:29)
           element: <testLibrary>::@getter::V
   topLevelVariables
     hasImplicitType hasInitializer isConst isOriginDeclaration isStatic isTypeInferredFromInitializer V
@@ -3373,6 +3402,7 @@
   test_const_invokeConstructor_named_unresolved6() async {
     var library = await buildLibrary(r'''
 class C<T> {}
+
 const V = const C.named();
 ''');
     checkElementText(library, r'''
@@ -3392,28 +3422,28 @@
               element: <testLibrary>::@class::C::@constructor::new
               typeName: C
       topLevelVariables
-        #F4 hasImplicitType hasInitializer isConst isOriginDeclaration isStatic V (nameOffset:20) (firstTokenOffset:20) (offset:20)
+        #F4 hasImplicitType hasInitializer isConst isOriginDeclaration isStatic V (nameOffset:21) (firstTokenOffset:21) (offset:21)
           element: <testLibrary>::@topLevelVariable::V
           initializer: expression_0
             InstanceCreationExpression
-              keyword: const @24
+              keyword: const @25
               constructorName: ConstructorName
                 type: NamedType
-                  name: C @30
+                  name: C @31
                   element: <testLibrary>::@class::C
                   type: C<dynamic>
-                period: . @31
+                period: . @32
                 name: SimpleIdentifier
-                  token: named @32
+                  token: named @33
                   element: <null>
                   staticType: null
                 element: <null>
               argumentList: ArgumentList
-                leftParenthesis: ( @37
-                rightParenthesis: ) @38
+                leftParenthesis: ( @38
+                rightParenthesis: ) @39
               staticType: C<dynamic>
       getters
-        #F5 isCompleteDeclaration isOriginVariable isStatic V (nameOffset:<null>) (firstTokenOffset:<null>) (offset:20)
+        #F5 isCompleteDeclaration isOriginVariable isStatic V (nameOffset:<null>) (firstTokenOffset:<null>) (offset:21)
           element: <testLibrary>::@getter::V
   classes
     isSimplyBounded class C
@@ -3449,6 +3479,7 @@
 class C {
   const C();
 }
+
 const V = const C();
 ''');
     checkElementText(library, r'''
@@ -3466,23 +3497,23 @@
               typeName: C
               typeNameOffset: 18
       topLevelVariables
-        #F3 hasImplicitType hasInitializer isConst isOriginDeclaration isStatic V (nameOffset:31) (firstTokenOffset:31) (offset:31)
+        #F3 hasImplicitType hasInitializer isConst isOriginDeclaration isStatic V (nameOffset:32) (firstTokenOffset:32) (offset:32)
           element: <testLibrary>::@topLevelVariable::V
           initializer: expression_0
             InstanceCreationExpression
-              keyword: const @35
+              keyword: const @36
               constructorName: ConstructorName
                 type: NamedType
-                  name: C @41
+                  name: C @42
                   element: <testLibrary>::@class::C
                   type: C
                 element: <testLibrary>::@class::C::@constructor::new
               argumentList: ArgumentList
-                leftParenthesis: ( @42
-                rightParenthesis: ) @43
+                leftParenthesis: ( @43
+                rightParenthesis: ) @44
               staticType: C
       getters
-        #F4 isCompleteDeclaration isOriginVariable isStatic V (nameOffset:<null>) (firstTokenOffset:<null>) (offset:31)
+        #F4 isCompleteDeclaration isOriginVariable isStatic V (nameOffset:<null>) (firstTokenOffset:<null>) (offset:32)
           element: <testLibrary>::@getter::V
   classes
     isSimplyBounded class C
@@ -3518,6 +3549,7 @@
 ''');
     var library = await buildLibrary(r'''
 import 'a.dart';
+
 const V = const C();
 ''');
     checkElementText(library, r'''
@@ -3529,23 +3561,23 @@
       libraryImports
         package:test/a.dart
       topLevelVariables
-        #F1 hasImplicitType hasInitializer isConst isOriginDeclaration isStatic V (nameOffset:23) (firstTokenOffset:23) (offset:23)
+        #F1 hasImplicitType hasInitializer isConst isOriginDeclaration isStatic V (nameOffset:24) (firstTokenOffset:24) (offset:24)
           element: <testLibrary>::@topLevelVariable::V
           initializer: expression_0
             InstanceCreationExpression
-              keyword: const @27
+              keyword: const @28
               constructorName: ConstructorName
                 type: NamedType
-                  name: C @33
+                  name: C @34
                   element: package:test/a.dart::@class::C
                   type: C
                 element: package:test/a.dart::@class::C::@constructor::new
               argumentList: ArgumentList
-                leftParenthesis: ( @34
-                rightParenthesis: ) @35
+                leftParenthesis: ( @35
+                rightParenthesis: ) @36
               staticType: C
       getters
-        #F2 isCompleteDeclaration isOriginVariable isStatic V (nameOffset:<null>) (firstTokenOffset:<null>) (offset:23)
+        #F2 isCompleteDeclaration isOriginVariable isStatic V (nameOffset:<null>) (firstTokenOffset:<null>) (offset:24)
           element: <testLibrary>::@getter::V
   topLevelVariables
     hasImplicitType hasInitializer isConst isOriginDeclaration isStatic isTypeInferredFromInitializer V
@@ -3573,6 +3605,7 @@
 ''');
     var library = await buildLibrary(r'''
 import 'a.dart' as p;
+
 const V = const p.C();
 ''');
     checkElementText(library, r'''
@@ -3587,27 +3620,27 @@
         <testLibraryFragment>::@prefix::p
           fragments: @19
       topLevelVariables
-        #F1 hasImplicitType hasInitializer isConst isOriginDeclaration isStatic V (nameOffset:28) (firstTokenOffset:28) (offset:28)
+        #F1 hasImplicitType hasInitializer isConst isOriginDeclaration isStatic V (nameOffset:29) (firstTokenOffset:29) (offset:29)
           element: <testLibrary>::@topLevelVariable::V
           initializer: expression_0
             InstanceCreationExpression
-              keyword: const @32
+              keyword: const @33
               constructorName: ConstructorName
                 type: NamedType
                   importPrefix: ImportPrefixReference
-                    name: p @38
-                    period: . @39
+                    name: p @39
+                    period: . @40
                     element: <testLibraryFragment>::@prefix::p
-                  name: C @40
+                  name: C @41
                   element: package:test/a.dart::@class::C
                   type: C
                 element: package:test/a.dart::@class::C::@constructor::new
               argumentList: ArgumentList
-                leftParenthesis: ( @41
-                rightParenthesis: ) @42
+                leftParenthesis: ( @42
+                rightParenthesis: ) @43
               staticType: C
       getters
-        #F2 isCompleteDeclaration isOriginVariable isStatic V (nameOffset:<null>) (firstTokenOffset:<null>) (offset:28)
+        #F2 isCompleteDeclaration isOriginVariable isStatic V (nameOffset:<null>) (firstTokenOffset:<null>) (offset:29)
           element: <testLibrary>::@getter::V
   topLevelVariables
     hasImplicitType hasInitializer isConst isOriginDeclaration isStatic isTypeInferredFromInitializer V
@@ -3675,9 +3708,11 @@
   }
 
   test_const_invokeConstructor_unnamed_unresolved2() async {
-    newFile('$testPackageLibPath/a.dart', '');
+    newFile('$testPackageLibPath/a.dart', r'''
+''');
     var library = await buildLibrary(r'''
 import 'a.dart' as p;
+
 const V = const p.C();
 ''');
     checkElementText(library, r'''
@@ -3692,27 +3727,27 @@
         <testLibraryFragment>::@prefix::p
           fragments: @19
       topLevelVariables
-        #F1 hasImplicitType hasInitializer isConst isOriginDeclaration isStatic V (nameOffset:28) (firstTokenOffset:28) (offset:28)
+        #F1 hasImplicitType hasInitializer isConst isOriginDeclaration isStatic V (nameOffset:29) (firstTokenOffset:29) (offset:29)
           element: <testLibrary>::@topLevelVariable::V
           initializer: expression_0
             InstanceCreationExpression
-              keyword: const @32
+              keyword: const @33
               constructorName: ConstructorName
                 type: NamedType
                   importPrefix: ImportPrefixReference
-                    name: p @38
-                    period: . @39
+                    name: p @39
+                    period: . @40
                     element: <testLibraryFragment>::@prefix::p
-                  name: C @40
+                  name: C @41
                   element: <null>
                   type: InvalidType
                 element: <null>
               argumentList: ArgumentList
-                leftParenthesis: ( @41
-                rightParenthesis: ) @42
+                leftParenthesis: ( @42
+                rightParenthesis: ) @43
               staticType: InvalidType
       getters
-        #F2 isCompleteDeclaration isOriginVariable isStatic V (nameOffset:<null>) (firstTokenOffset:<null>) (offset:28)
+        #F2 isCompleteDeclaration isOriginVariable isStatic V (nameOffset:<null>) (firstTokenOffset:<null>) (offset:29)
           element: <testLibrary>::@getter::V
   topLevelVariables
     hasImplicitType hasInitializer isConst isOriginDeclaration isStatic isTypeInferredFromInitializer V
@@ -3784,7 +3819,7 @@
   }
 
   test_const_isExpression() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 const a = 0;
 const b = a is int;
 ''');
@@ -3856,6 +3891,7 @@
 class C {
   static const String F = '';
 }
+
 const int v = C.F.length;
 ''');
     checkElementText(library, r'''
@@ -3881,30 +3917,30 @@
             #F4 isCompleteDeclaration isOriginVariable isStatic F (nameOffset:<null>) (firstTokenOffset:<null>) (offset:32)
               element: <testLibrary>::@class::C::@getter::F
       topLevelVariables
-        #F5 hasInitializer isConst isOriginDeclaration isStatic v (nameOffset:52) (firstTokenOffset:52) (offset:52)
+        #F5 hasInitializer isConst isOriginDeclaration isStatic v (nameOffset:53) (firstTokenOffset:53) (offset:53)
           element: <testLibrary>::@topLevelVariable::v
           initializer: expression_1
             PropertyAccess
               target: PrefixedIdentifier
                 prefix: SimpleIdentifier
-                  token: C @56
+                  token: C @57
                   element: <testLibrary>::@class::C
                   staticType: null
-                period: . @57
+                period: . @58
                 identifier: SimpleIdentifier
-                  token: F @58
+                  token: F @59
                   element: <testLibrary>::@class::C::@getter::F
                   staticType: String
                 element: <testLibrary>::@class::C::@getter::F
                 staticType: String
-              operator: . @59
+              operator: . @60
               propertyName: SimpleIdentifier
-                token: length @60
+                token: length @61
                 element: dart:core::@class::String::@getter::length
                 staticType: int
               staticType: int
       getters
-        #F6 isCompleteDeclaration isOriginVariable isStatic v (nameOffset:<null>) (firstTokenOffset:<null>) (offset:52)
+        #F6 isCompleteDeclaration isOriginVariable isStatic v (nameOffset:<null>) (firstTokenOffset:<null>) (offset:53)
           element: <testLibrary>::@getter::v
   classes
     isSimplyBounded class C
@@ -3955,6 +3991,7 @@
 ''');
     var library = await buildLibrary(r'''
 import 'a.dart';
+
 const int v = C.F.length;
 ''');
     checkElementText(library, r'''
@@ -3966,30 +4003,30 @@
       libraryImports
         package:test/a.dart
       topLevelVariables
-        #F1 hasInitializer isConst isOriginDeclaration isStatic v (nameOffset:27) (firstTokenOffset:27) (offset:27)
+        #F1 hasInitializer isConst isOriginDeclaration isStatic v (nameOffset:28) (firstTokenOffset:28) (offset:28)
           element: <testLibrary>::@topLevelVariable::v
           initializer: expression_0
             PropertyAccess
               target: PrefixedIdentifier
                 prefix: SimpleIdentifier
-                  token: C @31
+                  token: C @32
                   element: package:test/a.dart::@class::C
                   staticType: null
-                period: . @32
+                period: . @33
                 identifier: SimpleIdentifier
-                  token: F @33
+                  token: F @34
                   element: package:test/a.dart::@class::C::@getter::F
                   staticType: String
                 element: package:test/a.dart::@class::C::@getter::F
                 staticType: String
-              operator: . @34
+              operator: . @35
               propertyName: SimpleIdentifier
-                token: length @35
+                token: length @36
                 element: dart:core::@class::String::@getter::length
                 staticType: int
               staticType: int
       getters
-        #F2 isCompleteDeclaration isOriginVariable isStatic v (nameOffset:<null>) (firstTokenOffset:<null>) (offset:27)
+        #F2 isCompleteDeclaration isOriginVariable isStatic v (nameOffset:<null>) (firstTokenOffset:<null>) (offset:28)
           element: <testLibrary>::@getter::v
   topLevelVariables
     hasInitializer isConst isOriginDeclaration isStatic v
@@ -4017,6 +4054,7 @@
 ''');
     var library = await buildLibrary(r'''
 import 'a.dart' as p;
+
 const int v = p.C.F.length;
 ''');
     checkElementText(library, r'''
@@ -4031,37 +4069,37 @@
         <testLibraryFragment>::@prefix::p
           fragments: @19
       topLevelVariables
-        #F1 hasInitializer isConst isOriginDeclaration isStatic v (nameOffset:32) (firstTokenOffset:32) (offset:32)
+        #F1 hasInitializer isConst isOriginDeclaration isStatic v (nameOffset:33) (firstTokenOffset:33) (offset:33)
           element: <testLibrary>::@topLevelVariable::v
           initializer: expression_0
             PropertyAccess
               target: PropertyAccess
                 target: PrefixedIdentifier
                   prefix: SimpleIdentifier
-                    token: p @36
+                    token: p @37
                     element: <testLibraryFragment>::@prefix::p
                     staticType: null
-                  period: . @37
+                  period: . @38
                   identifier: SimpleIdentifier
-                    token: C @38
+                    token: C @39
                     element: package:test/a.dart::@class::C
                     staticType: null
                   element: package:test/a.dart::@class::C
                   staticType: null
-                operator: . @39
+                operator: . @40
                 propertyName: SimpleIdentifier
-                  token: F @40
+                  token: F @41
                   element: package:test/a.dart::@class::C::@getter::F
                   staticType: String
                 staticType: String
-              operator: . @41
+              operator: . @42
               propertyName: SimpleIdentifier
-                token: length @42
+                token: length @43
                 element: dart:core::@class::String::@getter::length
                 staticType: int
               staticType: int
       getters
-        #F2 isCompleteDeclaration isOriginVariable isStatic v (nameOffset:<null>) (firstTokenOffset:<null>) (offset:32)
+        #F2 isCompleteDeclaration isOriginVariable isStatic v (nameOffset:<null>) (firstTokenOffset:<null>) (offset:33)
           element: <testLibrary>::@getter::v
   topLevelVariables
     hasInitializer isConst isOriginDeclaration isStatic v
@@ -4199,6 +4237,7 @@
 ''');
     var library = await buildLibrary(r'''
 import 'a.dart';
+
 const v = S.length;
 ''');
     checkElementText(library, r'''
@@ -4210,23 +4249,23 @@
       libraryImports
         package:test/a.dart
       topLevelVariables
-        #F1 hasImplicitType hasInitializer isConst isOriginDeclaration isStatic v (nameOffset:23) (firstTokenOffset:23) (offset:23)
+        #F1 hasImplicitType hasInitializer isConst isOriginDeclaration isStatic v (nameOffset:24) (firstTokenOffset:24) (offset:24)
           element: <testLibrary>::@topLevelVariable::v
           initializer: expression_0
             PrefixedIdentifier
               prefix: SimpleIdentifier
-                token: S @27
+                token: S @28
                 element: package:test/a.dart::@getter::S
                 staticType: String
-              period: . @28
+              period: . @29
               identifier: SimpleIdentifier
-                token: length @29
+                token: length @30
                 element: dart:core::@class::String::@getter::length
                 staticType: int
               element: dart:core::@class::String::@getter::length
               staticType: int
       getters
-        #F2 isCompleteDeclaration isOriginVariable isStatic v (nameOffset:<null>) (firstTokenOffset:<null>) (offset:23)
+        #F2 isCompleteDeclaration isOriginVariable isStatic v (nameOffset:<null>) (firstTokenOffset:<null>) (offset:24)
           element: <testLibrary>::@getter::v
   topLevelVariables
     hasImplicitType hasInitializer isConst isOriginDeclaration isStatic isTypeInferredFromInitializer v
@@ -4252,6 +4291,7 @@
 ''');
     var library = await buildLibrary(r'''
 import 'a.dart' as p;
+
 const v = p.S.length;
 ''');
     checkElementText(library, r'''
@@ -4266,30 +4306,30 @@
         <testLibraryFragment>::@prefix::p
           fragments: @19
       topLevelVariables
-        #F1 hasImplicitType hasInitializer isConst isOriginDeclaration isStatic v (nameOffset:28) (firstTokenOffset:28) (offset:28)
+        #F1 hasImplicitType hasInitializer isConst isOriginDeclaration isStatic v (nameOffset:29) (firstTokenOffset:29) (offset:29)
           element: <testLibrary>::@topLevelVariable::v
           initializer: expression_0
             PropertyAccess
               target: PrefixedIdentifier
                 prefix: SimpleIdentifier
-                  token: p @32
+                  token: p @33
                   element: <testLibraryFragment>::@prefix::p
                   staticType: null
-                period: . @33
+                period: . @34
                 identifier: SimpleIdentifier
-                  token: S @34
+                  token: S @35
                   element: package:test/a.dart::@getter::S
                   staticType: String
                 element: package:test/a.dart::@getter::S
                 staticType: String
-              operator: . @35
+              operator: . @36
               propertyName: SimpleIdentifier
-                token: length @36
+                token: length @37
                 element: dart:core::@class::String::@getter::length
                 staticType: int
               staticType: int
       getters
-        #F2 isCompleteDeclaration isOriginVariable isStatic v (nameOffset:<null>) (firstTokenOffset:<null>) (offset:28)
+        #F2 isCompleteDeclaration isOriginVariable isStatic v (nameOffset:<null>) (firstTokenOffset:<null>) (offset:29)
           element: <testLibrary>::@getter::v
   topLevelVariables
     hasImplicitType hasInitializer isConst isOriginDeclaration isStatic isTypeInferredFromInitializer v
@@ -4314,6 +4354,7 @@
 class C {
   static int length() => 42;
 }
+
 const v = C.length;
 ''');
     checkElementText(library, r'''
@@ -4333,23 +4374,23 @@
             #F3 isCompleteDeclaration isOriginDeclaration isStatic length (nameOffset:23) (firstTokenOffset:12) (offset:23)
               element: <testLibrary>::@class::C::@method::length
       topLevelVariables
-        #F4 hasImplicitType hasInitializer isConst isOriginDeclaration isStatic v (nameOffset:47) (firstTokenOffset:47) (offset:47)
+        #F4 hasImplicitType hasInitializer isConst isOriginDeclaration isStatic v (nameOffset:48) (firstTokenOffset:48) (offset:48)
           element: <testLibrary>::@topLevelVariable::v
           initializer: expression_0
             PrefixedIdentifier
               prefix: SimpleIdentifier
-                token: C @51
+                token: C @52
                 element: <testLibrary>::@class::C
                 staticType: null
-              period: . @52
+              period: . @53
               identifier: SimpleIdentifier
-                token: length @53
+                token: length @54
                 element: <testLibrary>::@class::C::@method::length
                 staticType: int Function()
               element: <testLibrary>::@class::C::@method::length
               staticType: int Function()
       getters
-        #F5 isCompleteDeclaration isOriginVariable isStatic v (nameOffset:<null>) (firstTokenOffset:<null>) (offset:47)
+        #F5 isCompleteDeclaration isOriginVariable isStatic v (nameOffset:<null>) (firstTokenOffset:<null>) (offset:48)
           element: <testLibrary>::@getter::v
   classes
     isSimplyBounded class C
@@ -4383,7 +4424,7 @@
   }
 
   test_const_list_if() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 const Object x = const <int>[if (true) 1];
 ''');
     checkElementText(library, r'''
@@ -4442,7 +4483,7 @@
   }
 
   test_const_list_if_else() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 const Object x = const <int>[if (true) 1 else 2];
 ''');
     checkElementText(library, r'''
@@ -4508,7 +4549,7 @@
     // The summary needs to contain enough information so that when the constant
     // is resynthesized, the constant value can get the type that was computed
     // by type inference.
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 const Object x = const [1];
 ''');
     checkElementText(library, r'''
@@ -4552,8 +4593,10 @@
   }
 
   test_const_list_spread() async {
-    var library = await buildLibrary('''
-const Object x = const <int>[...<int>[1]];
+    var library = await buildLibrary(r'''
+const Object x = const <int>[
+  ...<int>[1],
+];
 ''');
     checkElementText(library, r'''
 library
@@ -4578,24 +4621,24 @@
               leftBracket: [ @28
               elements
                 SpreadElement
-                  spreadOperator: ... @29
+                  spreadOperator: ... @32
                   expression: ListLiteral
                     typeArguments: TypeArgumentList
-                      leftBracket: < @32
+                      leftBracket: < @35
                       arguments
                         NamedType
-                          name: int @33
+                          name: int @36
                           element: dart:core::@class::int
                           type: int
-                      rightBracket: > @36
-                    leftBracket: [ @37
+                      rightBracket: > @39
+                    leftBracket: [ @40
                     elements
                       IntegerLiteral
-                        literal: 1 @38
+                        literal: 1 @41
                         staticType: int
-                    rightBracket: ] @39
+                    rightBracket: ] @42
                     staticType: List<int>
-              rightBracket: ] @40
+              rightBracket: ] @45
               staticType: List<int>
       getters
         #F2 isCompleteDeclaration isOriginVariable isStatic x (nameOffset:<null>) (firstTokenOffset:<null>) (offset:13)
@@ -4619,8 +4662,10 @@
   }
 
   test_const_list_spread_null_aware() async {
-    var library = await buildLibrary('''
-const Object x = const <int>[...?<int>[1]];
+    var library = await buildLibrary(r'''
+const Object x = const <int>[
+  ...?<int>[1],
+];
 ''');
     checkElementText(library, r'''
 library
@@ -4645,24 +4690,24 @@
               leftBracket: [ @28
               elements
                 SpreadElement
-                  spreadOperator: ...? @29
+                  spreadOperator: ...? @32
                   expression: ListLiteral
                     typeArguments: TypeArgumentList
-                      leftBracket: < @33
+                      leftBracket: < @36
                       arguments
                         NamedType
-                          name: int @34
+                          name: int @37
                           element: dart:core::@class::int
                           type: int
-                      rightBracket: > @37
-                    leftBracket: [ @38
+                      rightBracket: > @40
+                    leftBracket: [ @41
                     elements
                       IntegerLiteral
-                        literal: 1 @39
+                        literal: 1 @42
                         staticType: int
-                    rightBracket: ] @40
+                    rightBracket: ] @43
                     staticType: List<int>
-              rightBracket: ] @41
+              rightBracket: ] @46
               staticType: List<int>
       getters
         #F2 isCompleteDeclaration isOriginVariable isStatic x (nameOffset:<null>) (firstTokenOffset:<null>) (offset:13)
@@ -4686,7 +4731,7 @@
   }
 
   test_const_map_if() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 const Object x = const <int, int>{if (true) 1: 2};
 ''');
     checkElementText(library, r'''
@@ -4758,7 +4803,7 @@
     // The summary needs to contain enough information so that when the constant
     // is resynthesized, the constant value can get the type that was computed
     // by type inference.
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 const Object x = const {1: 1.0};
 ''');
     checkElementText(library, r'''
@@ -4808,8 +4853,10 @@
   }
 
   test_const_map_spread() async {
-    var library = await buildLibrary('''
-const Object x = const <int, int>{...<int, int>{1: 2}};
+    var library = await buildLibrary(r'''
+const Object x = const <int, int>{
+  ...<int, int>{1: 2},
+};
 ''');
     checkElementText(library, r'''
 library
@@ -4838,34 +4885,34 @@
               leftBracket: { @33
               elements
                 SpreadElement
-                  spreadOperator: ... @34
+                  spreadOperator: ... @37
                   expression: SetOrMapLiteral
                     typeArguments: TypeArgumentList
-                      leftBracket: < @37
+                      leftBracket: < @40
                       arguments
                         NamedType
-                          name: int @38
+                          name: int @41
                           element: dart:core::@class::int
                           type: int
                         NamedType
-                          name: int @43
+                          name: int @46
                           element: dart:core::@class::int
                           type: int
-                      rightBracket: > @46
-                    leftBracket: { @47
+                      rightBracket: > @49
+                    leftBracket: { @50
                     elements
                       MapLiteralEntry
                         key: IntegerLiteral
-                          literal: 1 @48
+                          literal: 1 @51
                           staticType: int
-                        separator: : @49
+                        separator: : @52
                         value: IntegerLiteral
-                          literal: 2 @51
+                          literal: 2 @54
                           staticType: int
-                    rightBracket: } @52
+                    rightBracket: } @55
                     isMap: true
                     staticType: Map<int, int>
-              rightBracket: } @53
+              rightBracket: } @58
               isMap: true
               staticType: Map<int, int>
       getters
@@ -4890,8 +4937,10 @@
   }
 
   test_const_map_spread_null_aware() async {
-    var library = await buildLibrary('''
-const Object x = const <int, int>{...?<int, int>{1: 2}};
+    var library = await buildLibrary(r'''
+const Object x = const <int, int>{
+  ...?<int, int>{1: 2},
+};
 ''');
     checkElementText(library, r'''
 library
@@ -4920,34 +4969,34 @@
               leftBracket: { @33
               elements
                 SpreadElement
-                  spreadOperator: ...? @34
+                  spreadOperator: ...? @37
                   expression: SetOrMapLiteral
                     typeArguments: TypeArgumentList
-                      leftBracket: < @38
+                      leftBracket: < @41
                       arguments
                         NamedType
-                          name: int @39
+                          name: int @42
                           element: dart:core::@class::int
                           type: int
                         NamedType
-                          name: int @44
+                          name: int @47
                           element: dart:core::@class::int
                           type: int
-                      rightBracket: > @47
-                    leftBracket: { @48
+                      rightBracket: > @50
+                    leftBracket: { @51
                     elements
                       MapLiteralEntry
                         key: IntegerLiteral
-                          literal: 1 @49
+                          literal: 1 @52
                           staticType: int
-                        separator: : @50
+                        separator: : @53
                         value: IntegerLiteral
-                          literal: 2 @52
+                          literal: 2 @55
                           staticType: int
-                    rightBracket: } @53
+                    rightBracket: } @56
                     isMap: true
                     staticType: Map<int, int>
-              rightBracket: } @54
+              rightBracket: } @59
               isMap: true
               staticType: Map<int, int>
       getters
@@ -5058,6 +5107,7 @@
   final x;
   const C({this.x: foo});
 }
+
 int foo() => 42;
 ''');
     checkElementText(library, r'''
@@ -5089,7 +5139,7 @@
             #F5 isCompleteDeclaration isOriginVariable x (nameOffset:<null>) (firstTokenOffset:<null>) (offset:18)
               element: <testLibrary>::@class::C::@getter::x
       functions
-        #F6 isCompleteDeclaration isOriginDeclaration isStatic foo (nameOffset:53) (firstTokenOffset:49) (offset:53)
+        #F6 isCompleteDeclaration isOriginDeclaration isStatic foo (nameOffset:54) (firstTokenOffset:50) (offset:54)
           element: <testLibrary>::@function::foo
   classes
     isSimplyBounded class C
@@ -5652,8 +5702,9 @@
 }
 const a = const Object();
 ''');
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 import 'a.dart';
+
 const b = -a;
 ''');
     checkElementText(library, r'''
@@ -5665,19 +5716,19 @@
       libraryImports
         package:test/a.dart
       topLevelVariables
-        #F1 hasImplicitType hasInitializer isConst isOriginDeclaration isStatic b (nameOffset:23) (firstTokenOffset:23) (offset:23)
+        #F1 hasImplicitType hasInitializer isConst isOriginDeclaration isStatic b (nameOffset:24) (firstTokenOffset:24) (offset:24)
           element: <testLibrary>::@topLevelVariable::b
           initializer: expression_0
             PrefixExpression
-              operator: - @27
+              operator: - @28
               operand: SimpleIdentifier
-                token: a @28
+                token: a @29
                 element: package:test/a.dart::@getter::a
                 staticType: Object
               element: package:test/a.dart::@extension::E::@method::unary-
               staticType: int
       getters
-        #F2 isCompleteDeclaration isOriginVariable isStatic b (nameOffset:<null>) (firstTokenOffset:<null>) (offset:23)
+        #F2 isCompleteDeclaration isOriginVariable isStatic b (nameOffset:<null>) (firstTokenOffset:<null>) (offset:24)
           element: <testLibrary>::@getter::b
   topLevelVariables
     hasImplicitType hasInitializer isConst isOriginDeclaration isStatic isTypeInferredFromInitializer b
@@ -5767,7 +5818,7 @@
   }
 
   void test_const_recordLiteral() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 const a = 0;
 const b = (a, a: a);
 ''');
@@ -5840,7 +5891,7 @@
   }
 
   void test_const_recordLiteral_explicitConst() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 const a = 0;
 const b = const (a, a: a);
 ''');
@@ -5918,6 +5969,7 @@
 class C {
   static const int F = 42;
 }
+
 const V = C.F;
 ''');
     checkElementText(library, r'''
@@ -5944,23 +5996,23 @@
             #F4 isCompleteDeclaration isOriginVariable isStatic F (nameOffset:<null>) (firstTokenOffset:<null>) (offset:29)
               element: <testLibrary>::@class::C::@getter::F
       topLevelVariables
-        #F5 hasImplicitType hasInitializer isConst isOriginDeclaration isStatic V (nameOffset:45) (firstTokenOffset:45) (offset:45)
+        #F5 hasImplicitType hasInitializer isConst isOriginDeclaration isStatic V (nameOffset:46) (firstTokenOffset:46) (offset:46)
           element: <testLibrary>::@topLevelVariable::V
           initializer: expression_1
             PrefixedIdentifier
               prefix: SimpleIdentifier
-                token: C @49
+                token: C @50
                 element: <testLibrary>::@class::C
                 staticType: null
-              period: . @50
+              period: . @51
               identifier: SimpleIdentifier
-                token: F @51
+                token: F @52
                 element: <testLibrary>::@class::C::@getter::F
                 staticType: int
               element: <testLibrary>::@class::C::@getter::F
               staticType: int
       getters
-        #F6 isCompleteDeclaration isOriginVariable isStatic V (nameOffset:<null>) (firstTokenOffset:<null>) (offset:45)
+        #F6 isCompleteDeclaration isOriginVariable isStatic V (nameOffset:<null>) (firstTokenOffset:<null>) (offset:46)
           element: <testLibrary>::@getter::V
   classes
     isSimplyBounded class C
@@ -6011,6 +6063,7 @@
 ''');
     var library = await buildLibrary(r'''
 import 'a.dart';
+
 const V = C.F;
 ''');
     checkElementText(library, r'''
@@ -6022,23 +6075,23 @@
       libraryImports
         package:test/a.dart
       topLevelVariables
-        #F1 hasImplicitType hasInitializer isConst isOriginDeclaration isStatic V (nameOffset:23) (firstTokenOffset:23) (offset:23)
+        #F1 hasImplicitType hasInitializer isConst isOriginDeclaration isStatic V (nameOffset:24) (firstTokenOffset:24) (offset:24)
           element: <testLibrary>::@topLevelVariable::V
           initializer: expression_0
             PrefixedIdentifier
               prefix: SimpleIdentifier
-                token: C @27
+                token: C @28
                 element: package:test/a.dart::@class::C
                 staticType: null
-              period: . @28
+              period: . @29
               identifier: SimpleIdentifier
-                token: F @29
+                token: F @30
                 element: package:test/a.dart::@class::C::@getter::F
                 staticType: int
               element: package:test/a.dart::@class::C::@getter::F
               staticType: int
       getters
-        #F2 isCompleteDeclaration isOriginVariable isStatic V (nameOffset:<null>) (firstTokenOffset:<null>) (offset:23)
+        #F2 isCompleteDeclaration isOriginVariable isStatic V (nameOffset:<null>) (firstTokenOffset:<null>) (offset:24)
           element: <testLibrary>::@getter::V
   topLevelVariables
     hasImplicitType hasInitializer isConst isOriginDeclaration isStatic isTypeInferredFromInitializer V
@@ -6066,6 +6119,7 @@
 ''');
     var library = await buildLibrary(r'''
 import 'a.dart' as p;
+
 const V = p.C.F;
 ''');
     checkElementText(library, r'''
@@ -6080,30 +6134,30 @@
         <testLibraryFragment>::@prefix::p
           fragments: @19
       topLevelVariables
-        #F1 hasImplicitType hasInitializer isConst isOriginDeclaration isStatic V (nameOffset:28) (firstTokenOffset:28) (offset:28)
+        #F1 hasImplicitType hasInitializer isConst isOriginDeclaration isStatic V (nameOffset:29) (firstTokenOffset:29) (offset:29)
           element: <testLibrary>::@topLevelVariable::V
           initializer: expression_0
             PropertyAccess
               target: PrefixedIdentifier
                 prefix: SimpleIdentifier
-                  token: p @32
+                  token: p @33
                   element: <testLibraryFragment>::@prefix::p
                   staticType: null
-                period: . @33
+                period: . @34
                 identifier: SimpleIdentifier
-                  token: C @34
+                  token: C @35
                   element: package:test/a.dart::@class::C
                   staticType: null
                 element: package:test/a.dart::@class::C
                 staticType: null
-              operator: . @35
+              operator: . @36
               propertyName: SimpleIdentifier
-                token: F @36
+                token: F @37
                 element: package:test/a.dart::@class::C::@getter::F
                 staticType: int
               staticType: int
       getters
-        #F2 isCompleteDeclaration isOriginVariable isStatic V (nameOffset:<null>) (firstTokenOffset:<null>) (offset:28)
+        #F2 isCompleteDeclaration isOriginVariable isStatic V (nameOffset:<null>) (firstTokenOffset:<null>) (offset:29)
           element: <testLibrary>::@getter::V
   topLevelVariables
     hasImplicitType hasInitializer isConst isOriginDeclaration isStatic isTypeInferredFromInitializer V
@@ -6128,6 +6182,7 @@
 class C {
   static int m(int a, String b) => 42;
 }
+
 const V = C.m;
 ''');
     checkElementText(library, r'''
@@ -6152,23 +6207,23 @@
                 #F5 requiredPositional isOriginDeclaration b (nameOffset:39) (firstTokenOffset:32) (offset:39)
                   element: <testLibrary>::@class::C::@method::m::@formalParameter::b
       topLevelVariables
-        #F6 hasImplicitType hasInitializer isConst isOriginDeclaration isStatic V (nameOffset:57) (firstTokenOffset:57) (offset:57)
+        #F6 hasImplicitType hasInitializer isConst isOriginDeclaration isStatic V (nameOffset:58) (firstTokenOffset:58) (offset:58)
           element: <testLibrary>::@topLevelVariable::V
           initializer: expression_0
             PrefixedIdentifier
               prefix: SimpleIdentifier
-                token: C @61
+                token: C @62
                 element: <testLibrary>::@class::C
                 staticType: null
-              period: . @62
+              period: . @63
               identifier: SimpleIdentifier
-                token: m @63
+                token: m @64
                 element: <testLibrary>::@class::C::@method::m
                 staticType: int Function(int, String)
               element: <testLibrary>::@class::C::@method::m
               staticType: int Function(int, String)
       getters
-        #F7 isCompleteDeclaration isOriginVariable isStatic V (nameOffset:<null>) (firstTokenOffset:<null>) (offset:57)
+        #F7 isCompleteDeclaration isOriginVariable isStatic V (nameOffset:<null>) (firstTokenOffset:<null>) (offset:58)
           element: <testLibrary>::@getter::V
   classes
     isSimplyBounded class C
@@ -6216,6 +6271,7 @@
 ''');
     var library = await buildLibrary(r'''
 import 'a.dart';
+
 const V = C.m;
 ''');
     checkElementText(library, r'''
@@ -6227,23 +6283,23 @@
       libraryImports
         package:test/a.dart
       topLevelVariables
-        #F1 hasImplicitType hasInitializer isConst isOriginDeclaration isStatic V (nameOffset:23) (firstTokenOffset:23) (offset:23)
+        #F1 hasImplicitType hasInitializer isConst isOriginDeclaration isStatic V (nameOffset:24) (firstTokenOffset:24) (offset:24)
           element: <testLibrary>::@topLevelVariable::V
           initializer: expression_0
             PrefixedIdentifier
               prefix: SimpleIdentifier
-                token: C @27
+                token: C @28
                 element: package:test/a.dart::@class::C
                 staticType: null
-              period: . @28
+              period: . @29
               identifier: SimpleIdentifier
-                token: m @29
+                token: m @30
                 element: package:test/a.dart::@class::C::@method::m
                 staticType: int Function(int, String)
               element: package:test/a.dart::@class::C::@method::m
               staticType: int Function(int, String)
       getters
-        #F2 isCompleteDeclaration isOriginVariable isStatic V (nameOffset:<null>) (firstTokenOffset:<null>) (offset:23)
+        #F2 isCompleteDeclaration isOriginVariable isStatic V (nameOffset:<null>) (firstTokenOffset:<null>) (offset:24)
           element: <testLibrary>::@getter::V
   topLevelVariables
     hasImplicitType hasInitializer isConst isOriginDeclaration isStatic isTypeInferredFromInitializer V
@@ -6271,6 +6327,7 @@
 ''');
     var library = await buildLibrary(r'''
 import 'a.dart' as p;
+
 const V = p.C.m;
 ''');
     checkElementText(library, r'''
@@ -6285,30 +6342,30 @@
         <testLibraryFragment>::@prefix::p
           fragments: @19
       topLevelVariables
-        #F1 hasImplicitType hasInitializer isConst isOriginDeclaration isStatic V (nameOffset:28) (firstTokenOffset:28) (offset:28)
+        #F1 hasImplicitType hasInitializer isConst isOriginDeclaration isStatic V (nameOffset:29) (firstTokenOffset:29) (offset:29)
           element: <testLibrary>::@topLevelVariable::V
           initializer: expression_0
             PropertyAccess
               target: PrefixedIdentifier
                 prefix: SimpleIdentifier
-                  token: p @32
+                  token: p @33
                   element: <testLibraryFragment>::@prefix::p
                   staticType: null
-                period: . @33
+                period: . @34
                 identifier: SimpleIdentifier
-                  token: C @34
+                  token: C @35
                   element: package:test/a.dart::@class::C
                   staticType: null
                 element: package:test/a.dart::@class::C
                 staticType: null
-              operator: . @35
+              operator: . @36
               propertyName: SimpleIdentifier
-                token: m @36
+                token: m @37
                 element: package:test/a.dart::@class::C::@method::m
                 staticType: int Function(int, String)
               staticType: int Function(int, String)
       getters
-        #F2 isCompleteDeclaration isOriginVariable isStatic V (nameOffset:<null>) (firstTokenOffset:<null>) (offset:28)
+        #F2 isCompleteDeclaration isOriginVariable isStatic V (nameOffset:<null>) (firstTokenOffset:<null>) (offset:29)
           element: <testLibrary>::@getter::V
   topLevelVariables
     hasImplicitType hasInitializer isConst isOriginDeclaration isStatic isTypeInferredFromInitializer V
@@ -6329,11 +6386,13 @@
   }
 
   test_const_reference_staticMethod_ofExtension() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class A {}
+
 extension E on A {
   static void f() {}
 }
+
 const x = E.f;
 ''');
     checkElementText(library, r'''
@@ -6350,29 +6409,29 @@
               element: <testLibrary>::@class::A::@constructor::new
               typeName: A
       extensions
-        #F3 extension E (nameOffset:21) (firstTokenOffset:11) (offset:21)
+        #F3 extension E (nameOffset:22) (firstTokenOffset:12) (offset:22)
           element: <testLibrary>::@extension::E
           methods
-            #F4 isCompleteDeclaration isOriginDeclaration isStatic f (nameOffset:44) (firstTokenOffset:32) (offset:44)
+            #F4 isCompleteDeclaration isOriginDeclaration isStatic f (nameOffset:45) (firstTokenOffset:33) (offset:45)
               element: <testLibrary>::@extension::E::@method::f
       topLevelVariables
-        #F5 hasImplicitType hasInitializer isConst isOriginDeclaration isStatic x (nameOffset:59) (firstTokenOffset:59) (offset:59)
+        #F5 hasImplicitType hasInitializer isConst isOriginDeclaration isStatic x (nameOffset:61) (firstTokenOffset:61) (offset:61)
           element: <testLibrary>::@topLevelVariable::x
           initializer: expression_0
             PrefixedIdentifier
               prefix: SimpleIdentifier
-                token: E @63
+                token: E @65
                 element: <testLibrary>::@extension::E
                 staticType: null
-              period: . @64
+              period: . @66
               identifier: SimpleIdentifier
-                token: f @65
+                token: f @67
                 element: <testLibrary>::@extension::E::@method::f
                 staticType: void Function()
               element: <testLibrary>::@extension::E::@method::f
               staticType: void Function()
       getters
-        #F6 isCompleteDeclaration isOriginVariable isStatic x (nameOffset:<null>) (firstTokenOffset:<null>) (offset:59)
+        #F6 isCompleteDeclaration isOriginVariable isStatic x (nameOffset:<null>) (firstTokenOffset:<null>) (offset:61)
           element: <testLibrary>::@getter::x
   classes
     isSimplyBounded class A
@@ -6530,6 +6589,7 @@
 ''');
     var library = await buildLibrary(r'''
 import 'a.dart';
+
 const V = foo;
 ''');
     checkElementText(library, r'''
@@ -6541,15 +6601,15 @@
       libraryImports
         package:test/a.dart
       topLevelVariables
-        #F1 hasImplicitType hasInitializer isConst isOriginDeclaration isStatic V (nameOffset:23) (firstTokenOffset:23) (offset:23)
+        #F1 hasImplicitType hasInitializer isConst isOriginDeclaration isStatic V (nameOffset:24) (firstTokenOffset:24) (offset:24)
           element: <testLibrary>::@topLevelVariable::V
           initializer: expression_0
             SimpleIdentifier
-              token: foo @27
+              token: foo @28
               element: package:test/a.dart::@function::foo
               staticType: dynamic Function()
       getters
-        #F2 isCompleteDeclaration isOriginVariable isStatic V (nameOffset:<null>) (firstTokenOffset:<null>) (offset:23)
+        #F2 isCompleteDeclaration isOriginVariable isStatic V (nameOffset:<null>) (firstTokenOffset:<null>) (offset:24)
           element: <testLibrary>::@getter::V
   topLevelVariables
     hasImplicitType hasInitializer isConst isOriginDeclaration isStatic isTypeInferredFromInitializer V
@@ -6575,6 +6635,7 @@
 ''');
     var library = await buildLibrary(r'''
 import 'a.dart' as p;
+
 const V = p.foo;
 ''');
     checkElementText(library, r'''
@@ -6589,23 +6650,23 @@
         <testLibraryFragment>::@prefix::p
           fragments: @19
       topLevelVariables
-        #F1 hasImplicitType hasInitializer isConst isOriginDeclaration isStatic V (nameOffset:28) (firstTokenOffset:28) (offset:28)
+        #F1 hasImplicitType hasInitializer isConst isOriginDeclaration isStatic V (nameOffset:29) (firstTokenOffset:29) (offset:29)
           element: <testLibrary>::@topLevelVariable::V
           initializer: expression_0
             PrefixedIdentifier
               prefix: SimpleIdentifier
-                token: p @32
+                token: p @33
                 element: <testLibraryFragment>::@prefix::p
                 staticType: null
-              period: . @33
+              period: . @34
               identifier: SimpleIdentifier
-                token: foo @34
+                token: foo @35
                 element: package:test/a.dart::@function::foo
                 staticType: dynamic Function()
               element: package:test/a.dart::@function::foo
               staticType: dynamic Function()
       getters
-        #F2 isCompleteDeclaration isOriginVariable isStatic V (nameOffset:<null>) (firstTokenOffset:<null>) (offset:28)
+        #F2 isCompleteDeclaration isOriginVariable isStatic V (nameOffset:<null>) (firstTokenOffset:<null>) (offset:29)
           element: <testLibrary>::@getter::V
   topLevelVariables
     hasImplicitType hasInitializer isConst isOriginDeclaration isStatic isTypeInferredFromInitializer V
@@ -6700,6 +6761,7 @@
 ''');
     var library = await buildLibrary(r'''
 import 'a.dart';
+
 const B = A + 2;
 ''');
     checkElementText(library, r'''
@@ -6711,23 +6773,23 @@
       libraryImports
         package:test/a.dart
       topLevelVariables
-        #F1 hasImplicitType hasInitializer isConst isOriginDeclaration isStatic B (nameOffset:23) (firstTokenOffset:23) (offset:23)
+        #F1 hasImplicitType hasInitializer isConst isOriginDeclaration isStatic B (nameOffset:24) (firstTokenOffset:24) (offset:24)
           element: <testLibrary>::@topLevelVariable::B
           initializer: expression_0
             BinaryExpression
               leftOperand: SimpleIdentifier
-                token: A @27
+                token: A @28
                 element: package:test/a.dart::@getter::A
                 staticType: int
-              operator: + @29
+              operator: + @30
               rightOperand: IntegerLiteral
-                literal: 2 @31
+                literal: 2 @32
                 staticType: int
               element: dart:core::@class::num::@method::+
               staticInvokeType: num Function(num)
               staticType: int
       getters
-        #F2 isCompleteDeclaration isOriginVariable isStatic B (nameOffset:<null>) (firstTokenOffset:<null>) (offset:23)
+        #F2 isCompleteDeclaration isOriginVariable isStatic B (nameOffset:<null>) (firstTokenOffset:<null>) (offset:24)
           element: <testLibrary>::@getter::B
   topLevelVariables
     hasImplicitType hasInitializer isConst isOriginDeclaration isStatic isTypeInferredFromInitializer B
@@ -6753,6 +6815,7 @@
 ''');
     var library = await buildLibrary(r'''
 import 'a.dart' as p;
+
 const B = p.A + 2;
 ''');
     checkElementText(library, r'''
@@ -6767,31 +6830,31 @@
         <testLibraryFragment>::@prefix::p
           fragments: @19
       topLevelVariables
-        #F1 hasImplicitType hasInitializer isConst isOriginDeclaration isStatic B (nameOffset:28) (firstTokenOffset:28) (offset:28)
+        #F1 hasImplicitType hasInitializer isConst isOriginDeclaration isStatic B (nameOffset:29) (firstTokenOffset:29) (offset:29)
           element: <testLibrary>::@topLevelVariable::B
           initializer: expression_0
             BinaryExpression
               leftOperand: PrefixedIdentifier
                 prefix: SimpleIdentifier
-                  token: p @32
+                  token: p @33
                   element: <testLibraryFragment>::@prefix::p
                   staticType: null
-                period: . @33
+                period: . @34
                 identifier: SimpleIdentifier
-                  token: A @34
+                  token: A @35
                   element: package:test/a.dart::@getter::A
                   staticType: int
                 element: package:test/a.dart::@getter::A
                 staticType: int
-              operator: + @36
+              operator: + @37
               rightOperand: IntegerLiteral
-                literal: 2 @38
+                literal: 2 @39
                 staticType: int
               element: dart:core::@class::num::@method::+
               staticInvokeType: num Function(num)
               staticType: int
       getters
-        #F2 isCompleteDeclaration isOriginVariable isStatic B (nameOffset:<null>) (firstTokenOffset:<null>) (offset:28)
+        #F2 isCompleteDeclaration isOriginVariable isStatic B (nameOffset:<null>) (firstTokenOffset:<null>) (offset:29)
           element: <testLibrary>::@getter::B
   topLevelVariables
     hasImplicitType hasInitializer isConst isOriginDeclaration isStatic isTypeInferredFromInitializer B
@@ -6814,8 +6877,11 @@
   test_const_reference_type() async {
     var library = await buildLibrary(r'''
 class C {}
+
 class D<T> {}
-enum E {a, b, c}
+
+enum E { a, b, c }
+
 typedef F(int a, String b);
 const vDynamic = dynamic;
 const vNull = Null;
@@ -6838,20 +6904,20 @@
             #F2 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:6)
               element: <testLibrary>::@class::C::@constructor::new
               typeName: C
-        #F3 class D (nameOffset:17) (firstTokenOffset:11) (offset:17)
+        #F3 class D (nameOffset:18) (firstTokenOffset:12) (offset:18)
           element: <testLibrary>::@class::D
           typeParameters
-            #F4 T (nameOffset:19) (firstTokenOffset:19) (offset:19)
+            #F4 T (nameOffset:20) (firstTokenOffset:20) (offset:20)
               element: #E0 T
           constructors
-            #F5 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:17)
+            #F5 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:18)
               element: <testLibrary>::@class::D::@constructor::new
               typeName: D
       enums
-        #F6 enum E (nameOffset:30) (firstTokenOffset:25) (offset:30)
+        #F6 enum E (nameOffset:32) (firstTokenOffset:27) (offset:32)
           element: <testLibrary>::@enum::E
           fields
-            #F7 hasImplicitType hasInitializer isConst isEnumConstant isOriginDeclaration isStatic a (nameOffset:33) (firstTokenOffset:33) (offset:33)
+            #F7 hasImplicitType hasInitializer isConst isEnumConstant isOriginDeclaration isStatic a (nameOffset:36) (firstTokenOffset:36) (offset:36)
               element: <testLibrary>::@enum::E::@field::a
               initializer: expression_0
                 InstanceCreationExpression
@@ -6865,7 +6931,7 @@
                     leftParenthesis: ( @0
                     rightParenthesis: ) @0
                   staticType: E
-            #F8 hasImplicitType hasInitializer isConst isEnumConstant isOriginDeclaration isStatic b (nameOffset:36) (firstTokenOffset:36) (offset:36)
+            #F8 hasImplicitType hasInitializer isConst isEnumConstant isOriginDeclaration isStatic b (nameOffset:39) (firstTokenOffset:39) (offset:39)
               element: <testLibrary>::@enum::E::@field::b
               initializer: expression_1
                 InstanceCreationExpression
@@ -6879,7 +6945,7 @@
                     leftParenthesis: ( @0
                     rightParenthesis: ) @0
                   staticType: E
-            #F9 hasImplicitType hasInitializer isConst isEnumConstant isOriginDeclaration isStatic c (nameOffset:39) (firstTokenOffset:39) (offset:39)
+            #F9 hasImplicitType hasInitializer isConst isEnumConstant isOriginDeclaration isStatic c (nameOffset:42) (firstTokenOffset:42) (offset:42)
               element: <testLibrary>::@enum::E::@field::c
               initializer: expression_2
                 InstanceCreationExpression
@@ -6893,7 +6959,7 @@
                     leftParenthesis: ( @0
                     rightParenthesis: ) @0
                   staticType: E
-            #F10 isConst isOriginEnumValues isStatic values (nameOffset:<null>) (firstTokenOffset:<null>) (offset:30)
+            #F10 isConst isOriginEnumValues isStatic values (nameOffset:<null>) (firstTokenOffset:<null>) (offset:32)
               element: <testLibrary>::@enum::E::@field::values
               initializer: expression_3
                 ListLiteral
@@ -6914,100 +6980,100 @@
                   rightBracket: ] @0
                   staticType: List<E>
           constructors
-            #F11 isConst isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:30)
+            #F11 isConst isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:32)
               element: <testLibrary>::@enum::E::@constructor::new
               typeName: E
           getters
-            #F12 isCompleteDeclaration isOriginVariable isStatic a (nameOffset:<null>) (firstTokenOffset:<null>) (offset:33)
+            #F12 isCompleteDeclaration isOriginVariable isStatic a (nameOffset:<null>) (firstTokenOffset:<null>) (offset:36)
               element: <testLibrary>::@enum::E::@getter::a
-            #F13 isCompleteDeclaration isOriginVariable isStatic b (nameOffset:<null>) (firstTokenOffset:<null>) (offset:36)
+            #F13 isCompleteDeclaration isOriginVariable isStatic b (nameOffset:<null>) (firstTokenOffset:<null>) (offset:39)
               element: <testLibrary>::@enum::E::@getter::b
-            #F14 isCompleteDeclaration isOriginVariable isStatic c (nameOffset:<null>) (firstTokenOffset:<null>) (offset:39)
+            #F14 isCompleteDeclaration isOriginVariable isStatic c (nameOffset:<null>) (firstTokenOffset:<null>) (offset:42)
               element: <testLibrary>::@enum::E::@getter::c
-            #F15 isCompleteDeclaration isOriginVariable isStatic values (nameOffset:<null>) (firstTokenOffset:<null>) (offset:30)
+            #F15 isCompleteDeclaration isOriginVariable isStatic values (nameOffset:<null>) (firstTokenOffset:<null>) (offset:32)
               element: <testLibrary>::@enum::E::@getter::values
       typeAliases
-        #F16 F (nameOffset:50) (firstTokenOffset:42) (offset:50)
+        #F16 F (nameOffset:55) (firstTokenOffset:47) (offset:55)
           element: <testLibrary>::@typeAlias::F
       topLevelVariables
-        #F17 hasImplicitType hasInitializer isConst isOriginDeclaration isStatic vDynamic (nameOffset:76) (firstTokenOffset:76) (offset:76)
+        #F17 hasImplicitType hasInitializer isConst isOriginDeclaration isStatic vDynamic (nameOffset:81) (firstTokenOffset:81) (offset:81)
           element: <testLibrary>::@topLevelVariable::vDynamic
           initializer: expression_4
             TypeLiteral
               type: NamedType
-                name: dynamic @87
+                name: dynamic @92
                 element: dynamic
                 type: dynamic
               staticType: Type
-        #F18 hasImplicitType hasInitializer isConst isOriginDeclaration isStatic vNull (nameOffset:102) (firstTokenOffset:102) (offset:102)
+        #F18 hasImplicitType hasInitializer isConst isOriginDeclaration isStatic vNull (nameOffset:107) (firstTokenOffset:107) (offset:107)
           element: <testLibrary>::@topLevelVariable::vNull
           initializer: expression_5
             TypeLiteral
               type: NamedType
-                name: Null @110
+                name: Null @115
                 element: dart:core::@class::Null
                 type: Null
               staticType: Type
-        #F19 hasImplicitType hasInitializer isConst isOriginDeclaration isStatic vObject (nameOffset:122) (firstTokenOffset:122) (offset:122)
+        #F19 hasImplicitType hasInitializer isConst isOriginDeclaration isStatic vObject (nameOffset:127) (firstTokenOffset:127) (offset:127)
           element: <testLibrary>::@topLevelVariable::vObject
           initializer: expression_6
             TypeLiteral
               type: NamedType
-                name: Object @132
+                name: Object @137
                 element: dart:core::@class::Object
                 type: Object
               staticType: Type
-        #F20 hasImplicitType hasInitializer isConst isOriginDeclaration isStatic vClass (nameOffset:146) (firstTokenOffset:146) (offset:146)
+        #F20 hasImplicitType hasInitializer isConst isOriginDeclaration isStatic vClass (nameOffset:151) (firstTokenOffset:151) (offset:151)
           element: <testLibrary>::@topLevelVariable::vClass
           initializer: expression_7
             TypeLiteral
               type: NamedType
-                name: C @155
+                name: C @160
                 element: <testLibrary>::@class::C
                 type: C
               staticType: Type
-        #F21 hasImplicitType hasInitializer isConst isOriginDeclaration isStatic vGenericClass (nameOffset:164) (firstTokenOffset:164) (offset:164)
+        #F21 hasImplicitType hasInitializer isConst isOriginDeclaration isStatic vGenericClass (nameOffset:169) (firstTokenOffset:169) (offset:169)
           element: <testLibrary>::@topLevelVariable::vGenericClass
           initializer: expression_8
             TypeLiteral
               type: NamedType
-                name: D @180
+                name: D @185
                 element: <testLibrary>::@class::D
                 type: D<dynamic>
               staticType: Type
-        #F22 hasImplicitType hasInitializer isConst isOriginDeclaration isStatic vEnum (nameOffset:189) (firstTokenOffset:189) (offset:189)
+        #F22 hasImplicitType hasInitializer isConst isOriginDeclaration isStatic vEnum (nameOffset:194) (firstTokenOffset:194) (offset:194)
           element: <testLibrary>::@topLevelVariable::vEnum
           initializer: expression_9
             TypeLiteral
               type: NamedType
-                name: E @197
+                name: E @202
                 element: <testLibrary>::@enum::E
                 type: E
               staticType: Type
-        #F23 hasImplicitType hasInitializer isConst isOriginDeclaration isStatic vFunctionTypeAlias (nameOffset:206) (firstTokenOffset:206) (offset:206)
+        #F23 hasImplicitType hasInitializer isConst isOriginDeclaration isStatic vFunctionTypeAlias (nameOffset:211) (firstTokenOffset:211) (offset:211)
           element: <testLibrary>::@topLevelVariable::vFunctionTypeAlias
           initializer: expression_10
             TypeLiteral
               type: NamedType
-                name: F @227
+                name: F @232
                 element: <testLibrary>::@typeAlias::F
                 type: dynamic Function(int, String)
                   alias: <testLibrary>::@typeAlias::F
               staticType: Type
       getters
-        #F24 isCompleteDeclaration isOriginVariable isStatic vDynamic (nameOffset:<null>) (firstTokenOffset:<null>) (offset:76)
+        #F24 isCompleteDeclaration isOriginVariable isStatic vDynamic (nameOffset:<null>) (firstTokenOffset:<null>) (offset:81)
           element: <testLibrary>::@getter::vDynamic
-        #F25 isCompleteDeclaration isOriginVariable isStatic vNull (nameOffset:<null>) (firstTokenOffset:<null>) (offset:102)
+        #F25 isCompleteDeclaration isOriginVariable isStatic vNull (nameOffset:<null>) (firstTokenOffset:<null>) (offset:107)
           element: <testLibrary>::@getter::vNull
-        #F26 isCompleteDeclaration isOriginVariable isStatic vObject (nameOffset:<null>) (firstTokenOffset:<null>) (offset:122)
+        #F26 isCompleteDeclaration isOriginVariable isStatic vObject (nameOffset:<null>) (firstTokenOffset:<null>) (offset:127)
           element: <testLibrary>::@getter::vObject
-        #F27 isCompleteDeclaration isOriginVariable isStatic vClass (nameOffset:<null>) (firstTokenOffset:<null>) (offset:146)
+        #F27 isCompleteDeclaration isOriginVariable isStatic vClass (nameOffset:<null>) (firstTokenOffset:<null>) (offset:151)
           element: <testLibrary>::@getter::vClass
-        #F28 isCompleteDeclaration isOriginVariable isStatic vGenericClass (nameOffset:<null>) (firstTokenOffset:<null>) (offset:164)
+        #F28 isCompleteDeclaration isOriginVariable isStatic vGenericClass (nameOffset:<null>) (firstTokenOffset:<null>) (offset:169)
           element: <testLibrary>::@getter::vGenericClass
-        #F29 isCompleteDeclaration isOriginVariable isStatic vEnum (nameOffset:<null>) (firstTokenOffset:<null>) (offset:189)
+        #F29 isCompleteDeclaration isOriginVariable isStatic vEnum (nameOffset:<null>) (firstTokenOffset:<null>) (offset:194)
           element: <testLibrary>::@getter::vEnum
-        #F30 isCompleteDeclaration isOriginVariable isStatic vFunctionTypeAlias (nameOffset:<null>) (firstTokenOffset:<null>) (offset:206)
+        #F30 isCompleteDeclaration isOriginVariable isStatic vFunctionTypeAlias (nameOffset:<null>) (firstTokenOffset:<null>) (offset:211)
           element: <testLibrary>::@getter::vFunctionTypeAlias
   classes
     isSimplyBounded class C
@@ -7195,6 +7261,7 @@
   test_const_reference_type_functionType() async {
     var library = await buildLibrary(r'''
 typedef F();
+
 class C {
   final f = <F>[];
 }
@@ -7206,17 +7273,17 @@
     #F0 <testLibraryFragment>
       element: <testLibrary>
       classes
-        #F1 class C (nameOffset:19) (firstTokenOffset:13) (offset:19)
+        #F1 class C (nameOffset:20) (firstTokenOffset:14) (offset:20)
           element: <testLibrary>::@class::C
           fields
-            #F2 hasImplicitType hasInitializer isFinal isOriginDeclaration f (nameOffset:31) (firstTokenOffset:31) (offset:31)
+            #F2 hasImplicitType hasInitializer isFinal isOriginDeclaration f (nameOffset:32) (firstTokenOffset:32) (offset:32)
               element: <testLibrary>::@class::C::@field::f
           constructors
-            #F3 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:19)
+            #F3 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:20)
               element: <testLibrary>::@class::C::@constructor::new
               typeName: C
           getters
-            #F4 isCompleteDeclaration isOriginVariable f (nameOffset:<null>) (firstTokenOffset:<null>) (offset:31)
+            #F4 isCompleteDeclaration isOriginVariable f (nameOffset:<null>) (firstTokenOffset:<null>) (offset:32)
               element: <testLibrary>::@class::C::@getter::f
       typeAliases
         #F5 F (nameOffset:8) (firstTokenOffset:0) (offset:8)
@@ -7257,6 +7324,7 @@
 ''');
     var library = await buildLibrary(r'''
 import 'a.dart';
+
 const vClass = C;
 const vEnum = E;
 const vFunctionTypeAlias = F;
@@ -7270,40 +7338,40 @@
       libraryImports
         package:test/a.dart
       topLevelVariables
-        #F1 hasImplicitType hasInitializer isConst isOriginDeclaration isStatic vClass (nameOffset:23) (firstTokenOffset:23) (offset:23)
+        #F1 hasImplicitType hasInitializer isConst isOriginDeclaration isStatic vClass (nameOffset:24) (firstTokenOffset:24) (offset:24)
           element: <testLibrary>::@topLevelVariable::vClass
           initializer: expression_0
             TypeLiteral
               type: NamedType
-                name: C @32
+                name: C @33
                 element: package:test/a.dart::@class::C
                 type: C
               staticType: Type
-        #F2 hasImplicitType hasInitializer isConst isOriginDeclaration isStatic vEnum (nameOffset:41) (firstTokenOffset:41) (offset:41)
+        #F2 hasImplicitType hasInitializer isConst isOriginDeclaration isStatic vEnum (nameOffset:42) (firstTokenOffset:42) (offset:42)
           element: <testLibrary>::@topLevelVariable::vEnum
           initializer: expression_1
             TypeLiteral
               type: NamedType
-                name: E @49
+                name: E @50
                 element: package:test/a.dart::@enum::E
                 type: E
               staticType: Type
-        #F3 hasImplicitType hasInitializer isConst isOriginDeclaration isStatic vFunctionTypeAlias (nameOffset:58) (firstTokenOffset:58) (offset:58)
+        #F3 hasImplicitType hasInitializer isConst isOriginDeclaration isStatic vFunctionTypeAlias (nameOffset:59) (firstTokenOffset:59) (offset:59)
           element: <testLibrary>::@topLevelVariable::vFunctionTypeAlias
           initializer: expression_2
             TypeLiteral
               type: NamedType
-                name: F @79
+                name: F @80
                 element: package:test/a.dart::@typeAlias::F
                 type: dynamic Function(int, String)
                   alias: package:test/a.dart::@typeAlias::F
               staticType: Type
       getters
-        #F4 isCompleteDeclaration isOriginVariable isStatic vClass (nameOffset:<null>) (firstTokenOffset:<null>) (offset:23)
+        #F4 isCompleteDeclaration isOriginVariable isStatic vClass (nameOffset:<null>) (firstTokenOffset:<null>) (offset:24)
           element: <testLibrary>::@getter::vClass
-        #F5 isCompleteDeclaration isOriginVariable isStatic vEnum (nameOffset:<null>) (firstTokenOffset:<null>) (offset:41)
+        #F5 isCompleteDeclaration isOriginVariable isStatic vEnum (nameOffset:<null>) (firstTokenOffset:<null>) (offset:42)
           element: <testLibrary>::@getter::vEnum
-        #F6 isCompleteDeclaration isOriginVariable isStatic vFunctionTypeAlias (nameOffset:<null>) (firstTokenOffset:<null>) (offset:58)
+        #F6 isCompleteDeclaration isOriginVariable isStatic vFunctionTypeAlias (nameOffset:<null>) (firstTokenOffset:<null>) (offset:59)
           element: <testLibrary>::@getter::vFunctionTypeAlias
   topLevelVariables
     hasImplicitType hasInitializer isConst isOriginDeclaration isStatic isTypeInferredFromInitializer vClass
@@ -7357,6 +7425,7 @@
 ''');
     var library = await buildLibrary(r'''
 import 'a.dart' as p;
+
 const vClass = p.C;
 const vEnum = p.E;
 const vFunctionTypeAlias = p.F;
@@ -7373,52 +7442,52 @@
         <testLibraryFragment>::@prefix::p
           fragments: @19
       topLevelVariables
-        #F1 hasImplicitType hasInitializer isConst isOriginDeclaration isStatic vClass (nameOffset:28) (firstTokenOffset:28) (offset:28)
+        #F1 hasImplicitType hasInitializer isConst isOriginDeclaration isStatic vClass (nameOffset:29) (firstTokenOffset:29) (offset:29)
           element: <testLibrary>::@topLevelVariable::vClass
           initializer: expression_0
             TypeLiteral
               type: NamedType
                 importPrefix: ImportPrefixReference
-                  name: p @37
-                  period: . @38
+                  name: p @38
+                  period: . @39
                   element: <testLibraryFragment>::@prefix::p
-                name: C @39
+                name: C @40
                 element: package:test/a.dart::@class::C
                 type: C
               staticType: Type
-        #F2 hasImplicitType hasInitializer isConst isOriginDeclaration isStatic vEnum (nameOffset:48) (firstTokenOffset:48) (offset:48)
+        #F2 hasImplicitType hasInitializer isConst isOriginDeclaration isStatic vEnum (nameOffset:49) (firstTokenOffset:49) (offset:49)
           element: <testLibrary>::@topLevelVariable::vEnum
           initializer: expression_1
             TypeLiteral
               type: NamedType
                 importPrefix: ImportPrefixReference
-                  name: p @56
-                  period: . @57
+                  name: p @57
+                  period: . @58
                   element: <testLibraryFragment>::@prefix::p
-                name: E @58
+                name: E @59
                 element: package:test/a.dart::@enum::E
                 type: E
               staticType: Type
-        #F3 hasImplicitType hasInitializer isConst isOriginDeclaration isStatic vFunctionTypeAlias (nameOffset:67) (firstTokenOffset:67) (offset:67)
+        #F3 hasImplicitType hasInitializer isConst isOriginDeclaration isStatic vFunctionTypeAlias (nameOffset:68) (firstTokenOffset:68) (offset:68)
           element: <testLibrary>::@topLevelVariable::vFunctionTypeAlias
           initializer: expression_2
             TypeLiteral
               type: NamedType
                 importPrefix: ImportPrefixReference
-                  name: p @88
-                  period: . @89
+                  name: p @89
+                  period: . @90
                   element: <testLibraryFragment>::@prefix::p
-                name: F @90
+                name: F @91
                 element: package:test/a.dart::@typeAlias::F
                 type: dynamic Function(int, String)
                   alias: package:test/a.dart::@typeAlias::F
               staticType: Type
       getters
-        #F4 isCompleteDeclaration isOriginVariable isStatic vClass (nameOffset:<null>) (firstTokenOffset:<null>) (offset:28)
+        #F4 isCompleteDeclaration isOriginVariable isStatic vClass (nameOffset:<null>) (firstTokenOffset:<null>) (offset:29)
           element: <testLibrary>::@getter::vClass
-        #F5 isCompleteDeclaration isOriginVariable isStatic vEnum (nameOffset:<null>) (firstTokenOffset:<null>) (offset:48)
+        #F5 isCompleteDeclaration isOriginVariable isStatic vEnum (nameOffset:<null>) (firstTokenOffset:<null>) (offset:49)
           element: <testLibrary>::@getter::vEnum
-        #F6 isCompleteDeclaration isOriginVariable isStatic vFunctionTypeAlias (nameOffset:<null>) (firstTokenOffset:<null>) (offset:67)
+        #F6 isCompleteDeclaration isOriginVariable isStatic vFunctionTypeAlias (nameOffset:<null>) (firstTokenOffset:<null>) (offset:68)
           element: <testLibrary>::@getter::vFunctionTypeAlias
   topLevelVariables
     hasImplicitType hasInitializer isConst isOriginDeclaration isStatic isTypeInferredFromInitializer vClass
@@ -7560,6 +7629,7 @@
   test_const_reference_unresolved_prefix1() async {
     var library = await buildLibrary(r'''
 class C {}
+
 const V = C.foo;
 ''');
     checkElementText(library, r'''
@@ -7576,23 +7646,23 @@
               element: <testLibrary>::@class::C::@constructor::new
               typeName: C
       topLevelVariables
-        #F3 hasImplicitType hasInitializer isConst isOriginDeclaration isStatic V (nameOffset:17) (firstTokenOffset:17) (offset:17)
+        #F3 hasImplicitType hasInitializer isConst isOriginDeclaration isStatic V (nameOffset:18) (firstTokenOffset:18) (offset:18)
           element: <testLibrary>::@topLevelVariable::V
           initializer: expression_0
             PrefixedIdentifier
               prefix: SimpleIdentifier
-                token: C @21
+                token: C @22
                 element: <testLibrary>::@class::C
                 staticType: null
-              period: . @22
+              period: . @23
               identifier: SimpleIdentifier
-                token: foo @23
+                token: foo @24
                 element: <null>
                 staticType: InvalidType
               element: <null>
               staticType: InvalidType
       getters
-        #F4 isCompleteDeclaration isOriginVariable isStatic V (nameOffset:<null>) (firstTokenOffset:<null>) (offset:17)
+        #F4 isCompleteDeclaration isOriginVariable isStatic V (nameOffset:<null>) (firstTokenOffset:<null>) (offset:18)
           element: <testLibrary>::@getter::V
   classes
     isSimplyBounded class C
@@ -7621,11 +7691,12 @@
   }
 
   test_const_reference_unresolved_prefix2() async {
-    newFile('$testPackageLibPath/foo.dart', '''
+    newFile('$testPackageLibPath/foo.dart', r'''
 class C {}
 ''');
     var library = await buildLibrary(r'''
 import 'foo.dart' as p;
+
 const V = p.C.foo;
 ''');
     checkElementText(library, r'''
@@ -7640,30 +7711,30 @@
         <testLibraryFragment>::@prefix::p
           fragments: @21
       topLevelVariables
-        #F1 hasImplicitType hasInitializer isConst isOriginDeclaration isStatic V (nameOffset:30) (firstTokenOffset:30) (offset:30)
+        #F1 hasImplicitType hasInitializer isConst isOriginDeclaration isStatic V (nameOffset:31) (firstTokenOffset:31) (offset:31)
           element: <testLibrary>::@topLevelVariable::V
           initializer: expression_0
             PropertyAccess
               target: PrefixedIdentifier
                 prefix: SimpleIdentifier
-                  token: p @34
+                  token: p @35
                   element: <testLibraryFragment>::@prefix::p
                   staticType: null
-                period: . @35
+                period: . @36
                 identifier: SimpleIdentifier
-                  token: C @36
+                  token: C @37
                   element: package:test/foo.dart::@class::C
                   staticType: null
                 element: package:test/foo.dart::@class::C
                 staticType: null
-              operator: . @37
+              operator: . @38
               propertyName: SimpleIdentifier
-                token: foo @38
+                token: foo @39
                 element: <null>
                 staticType: InvalidType
               staticType: InvalidType
       getters
-        #F2 isCompleteDeclaration isOriginVariable isStatic V (nameOffset:<null>) (firstTokenOffset:<null>) (offset:30)
+        #F2 isCompleteDeclaration isOriginVariable isStatic V (nameOffset:<null>) (firstTokenOffset:<null>) (offset:31)
           element: <testLibrary>::@getter::V
   topLevelVariables
     hasImplicitType hasInitializer isConst isOriginDeclaration isStatic isTypeInferredFromInitializer V
@@ -7684,7 +7755,7 @@
   }
 
   test_const_set_if() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 const Object x = const <int>{if (true) 1};
 ''');
     checkElementText(library, r'''
@@ -7747,7 +7818,7 @@
     // The summary needs to contain enough information so that when the constant
     // is resynthesized, the constant value can get the type that was computed
     // by type inference.
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 const Object x = const {1};
 ''');
     checkElementText(library, r'''
@@ -7792,8 +7863,10 @@
   }
 
   test_const_set_spread() async {
-    var library = await buildLibrary('''
-const Object x = const <int>{...<int>{1}};
+    var library = await buildLibrary(r'''
+const Object x = const <int>{
+  ...<int>{1},
+};
 ''');
     checkElementText(library, r'''
 library
@@ -7818,25 +7891,25 @@
               leftBracket: { @28
               elements
                 SpreadElement
-                  spreadOperator: ... @29
+                  spreadOperator: ... @32
                   expression: SetOrMapLiteral
                     typeArguments: TypeArgumentList
-                      leftBracket: < @32
+                      leftBracket: < @35
                       arguments
                         NamedType
-                          name: int @33
+                          name: int @36
                           element: dart:core::@class::int
                           type: int
-                      rightBracket: > @36
-                    leftBracket: { @37
+                      rightBracket: > @39
+                    leftBracket: { @40
                     elements
                       IntegerLiteral
-                        literal: 1 @38
+                        literal: 1 @41
                         staticType: int
-                    rightBracket: } @39
+                    rightBracket: } @42
                     isMap: false
                     staticType: Set<int>
-              rightBracket: } @40
+              rightBracket: } @45
               isMap: false
               staticType: Set<int>
       getters
@@ -7861,8 +7934,10 @@
   }
 
   test_const_set_spread_null_aware() async {
-    var library = await buildLibrary('''
-const Object x = const <int>{...?<int>{1}};
+    var library = await buildLibrary(r'''
+const Object x = const <int>{
+  ...?<int>{1},
+};
 ''');
     checkElementText(library, r'''
 library
@@ -7887,25 +7962,25 @@
               leftBracket: { @28
               elements
                 SpreadElement
-                  spreadOperator: ...? @29
+                  spreadOperator: ...? @32
                   expression: SetOrMapLiteral
                     typeArguments: TypeArgumentList
-                      leftBracket: < @33
+                      leftBracket: < @36
                       arguments
                         NamedType
-                          name: int @34
+                          name: int @37
                           element: dart:core::@class::int
                           type: int
-                      rightBracket: > @37
-                    leftBracket: { @38
+                      rightBracket: > @40
+                    leftBracket: { @41
                     elements
                       IntegerLiteral
-                        literal: 1 @39
+                        literal: 1 @42
                         staticType: int
-                    rightBracket: } @40
+                    rightBracket: } @43
                     isMap: false
                     staticType: Set<int>
-              rightBracket: } @41
+              rightBracket: } @46
               isMap: false
               staticType: Set<int>
       getters
@@ -8663,7 +8738,9 @@
 const vIntLong3 = 0x8000000000000000;
 const vDouble = 2.3;
 const vString = 'abc';
-const vStringConcat = 'aaa' 'bbb';
+const vStringConcat =
+    'aaa'
+    'bbb';
 const vStringInterpolation = 'aaa ${true} ${42} bbb';
 const vSymbol = #aaa.bbb.ccc;
 ''');
@@ -8743,45 +8820,45 @@
             AdjacentStrings
               strings
                 SimpleStringLiteral
-                  literal: 'aaa' @299
+                  literal: 'aaa' @303
                 SimpleStringLiteral
-                  literal: 'bbb' @305
+                  literal: 'bbb' @313
               staticType: String
               stringValue: aaabbb
-        #F12 hasImplicitType hasInitializer isConst isOriginDeclaration isStatic vStringInterpolation (nameOffset:318) (firstTokenOffset:318) (offset:318)
+        #F12 hasImplicitType hasInitializer isConst isOriginDeclaration isStatic vStringInterpolation (nameOffset:326) (firstTokenOffset:326) (offset:326)
           element: <testLibrary>::@topLevelVariable::vStringInterpolation
           initializer: expression_11
             StringInterpolation
               elements
                 InterpolationString
-                  contents: 'aaa  @341
-                InterpolationExpression
-                  leftBracket: ${ @346
-                  expression: BooleanLiteral
-                    literal: true @348
-                    staticType: bool
-                  rightBracket: } @352
-                InterpolationString
-                  contents:   @353
+                  contents: 'aaa  @349
                 InterpolationExpression
                   leftBracket: ${ @354
-                  expression: IntegerLiteral
-                    literal: 42 @356
-                    staticType: int
-                  rightBracket: } @358
+                  expression: BooleanLiteral
+                    literal: true @356
+                    staticType: bool
+                  rightBracket: } @360
                 InterpolationString
-                  contents:  bbb' @359
+                  contents:   @361
+                InterpolationExpression
+                  leftBracket: ${ @362
+                  expression: IntegerLiteral
+                    literal: 42 @364
+                    staticType: int
+                  rightBracket: } @366
+                InterpolationString
+                  contents:  bbb' @367
               staticType: String
               stringValue: null
-        #F13 hasImplicitType hasInitializer isConst isOriginDeclaration isStatic vSymbol (nameOffset:372) (firstTokenOffset:372) (offset:372)
+        #F13 hasImplicitType hasInitializer isConst isOriginDeclaration isStatic vSymbol (nameOffset:380) (firstTokenOffset:380) (offset:380)
           element: <testLibrary>::@topLevelVariable::vSymbol
           initializer: expression_12
             SymbolLiteral
-              poundSign: # @382
+              poundSign: # @390
               components
-                aaa @383
-                bbb @387
-                ccc @391
+                aaa @391
+                bbb @395
+                ccc @399
       getters
         #F14 isCompleteDeclaration isOriginVariable isStatic vNull (nameOffset:<null>) (firstTokenOffset:<null>) (offset:6)
           element: <testLibrary>::@getter::vNull
@@ -8805,9 +8882,9 @@
           element: <testLibrary>::@getter::vString
         #F24 isCompleteDeclaration isOriginVariable isStatic vStringConcat (nameOffset:<null>) (firstTokenOffset:<null>) (offset:283)
           element: <testLibrary>::@getter::vStringConcat
-        #F25 isCompleteDeclaration isOriginVariable isStatic vStringInterpolation (nameOffset:<null>) (firstTokenOffset:<null>) (offset:318)
+        #F25 isCompleteDeclaration isOriginVariable isStatic vStringInterpolation (nameOffset:<null>) (firstTokenOffset:<null>) (offset:326)
           element: <testLibrary>::@getter::vStringInterpolation
-        #F26 isCompleteDeclaration isOriginVariable isStatic vSymbol (nameOffset:<null>) (firstTokenOffset:<null>) (offset:372)
+        #F26 isCompleteDeclaration isOriginVariable isStatic vSymbol (nameOffset:<null>) (firstTokenOffset:<null>) (offset:380)
           element: <testLibrary>::@getter::vSymbol
   topLevelVariables
     hasImplicitType hasInitializer isConst isOriginDeclaration isStatic isTypeInferredFromInitializer vNull
@@ -9134,9 +9211,7 @@
     var library = await buildLibrary(r'''
 const String? a = '';
 
-const List<int?> b = [
-  a?.length,
-];
+const List<int?> b = [a?.length];
 ''');
     checkElementText(library, r'''
 library
@@ -9158,16 +9233,16 @@
               elements
                 PropertyAccess
                   target: SimpleIdentifier
-                    token: a @48
+                    token: a @45
                     element: <testLibrary>::@getter::a
                     staticType: String?
-                  operator: ?. @49
+                  operator: ?. @46
                   propertyName: SimpleIdentifier
-                    token: length @51
+                    token: length @48
                     element: dart:core::@class::String::@getter::length
                     staticType: int
                   staticType: int?
-              rightBracket: ] @59
+              rightBracket: ] @54
               staticType: List<int?>
       getters
         #F3 isCompleteDeclaration isOriginVariable isStatic a (nameOffset:<null>) (firstTokenOffset:<null>) (offset:14)
@@ -9838,9 +9913,12 @@
   }
 
   test_const_topLevel_typedList_imported() async {
-    newFile('$testPackageLibPath/a.dart', 'class C {}');
+    newFile('$testPackageLibPath/a.dart', r'''
+class C {}
+''');
     var library = await buildLibrary(r'''
 import 'a.dart';
+
 const v = const <C>[];
 ''');
     checkElementText(library, r'''
@@ -9852,24 +9930,24 @@
       libraryImports
         package:test/a.dart
       topLevelVariables
-        #F1 hasImplicitType hasInitializer isConst isOriginDeclaration isStatic v (nameOffset:23) (firstTokenOffset:23) (offset:23)
+        #F1 hasImplicitType hasInitializer isConst isOriginDeclaration isStatic v (nameOffset:24) (firstTokenOffset:24) (offset:24)
           element: <testLibrary>::@topLevelVariable::v
           initializer: expression_0
             ListLiteral
-              constKeyword: const @27
+              constKeyword: const @28
               typeArguments: TypeArgumentList
-                leftBracket: < @33
+                leftBracket: < @34
                 arguments
                   NamedType
-                    name: C @34
+                    name: C @35
                     element: package:test/a.dart::@class::C
                     type: C
-                rightBracket: > @35
-              leftBracket: [ @36
-              rightBracket: ] @37
+                rightBracket: > @36
+              leftBracket: [ @37
+              rightBracket: ] @38
               staticType: List<C>
       getters
-        #F2 isCompleteDeclaration isOriginVariable isStatic v (nameOffset:<null>) (firstTokenOffset:<null>) (offset:23)
+        #F2 isCompleteDeclaration isOriginVariable isStatic v (nameOffset:<null>) (firstTokenOffset:<null>) (offset:24)
           element: <testLibrary>::@getter::v
   topLevelVariables
     hasImplicitType hasInitializer isConst isOriginDeclaration isStatic isTypeInferredFromInitializer v
@@ -9890,9 +9968,12 @@
   }
 
   test_const_topLevel_typedList_importedWithPrefix() async {
-    newFile('$testPackageLibPath/a.dart', 'class C {}');
+    newFile('$testPackageLibPath/a.dart', r'''
+class C {}
+''');
     var library = await buildLibrary(r'''
 import 'a.dart' as p;
+
 const v = const <p.C>[];
 ''');
     checkElementText(library, r'''
@@ -9907,28 +9988,28 @@
         <testLibraryFragment>::@prefix::p
           fragments: @19
       topLevelVariables
-        #F1 hasImplicitType hasInitializer isConst isOriginDeclaration isStatic v (nameOffset:28) (firstTokenOffset:28) (offset:28)
+        #F1 hasImplicitType hasInitializer isConst isOriginDeclaration isStatic v (nameOffset:29) (firstTokenOffset:29) (offset:29)
           element: <testLibrary>::@topLevelVariable::v
           initializer: expression_0
             ListLiteral
-              constKeyword: const @32
+              constKeyword: const @33
               typeArguments: TypeArgumentList
-                leftBracket: < @38
+                leftBracket: < @39
                 arguments
                   NamedType
                     importPrefix: ImportPrefixReference
-                      name: p @39
-                      period: . @40
+                      name: p @40
+                      period: . @41
                       element: <testLibraryFragment>::@prefix::p
-                    name: C @41
+                    name: C @42
                     element: package:test/a.dart::@class::C
                     type: C
-                rightBracket: > @42
-              leftBracket: [ @43
-              rightBracket: ] @44
+                rightBracket: > @43
+              leftBracket: [ @44
+              rightBracket: ] @45
               staticType: List<C>
       getters
-        #F2 isCompleteDeclaration isOriginVariable isStatic v (nameOffset:<null>) (firstTokenOffset:<null>) (offset:28)
+        #F2 isCompleteDeclaration isOriginVariable isStatic v (nameOffset:<null>) (firstTokenOffset:<null>) (offset:29)
           element: <testLibrary>::@getter::v
   topLevelVariables
     hasImplicitType hasInitializer isConst isOriginDeclaration isStatic isTypeInferredFromInitializer v
@@ -10515,8 +10596,9 @@
   }
 
   test_constExpr_pushReference_enum_field() async {
-    var library = await buildLibrary('''
-enum E {a, b, c}
+    var library = await buildLibrary(r'''
+enum E { a, b, c }
+
 final vValue = E.a;
 final vValues = E.values;
 final vIndex = E.a.index;
@@ -10531,7 +10613,7 @@
         #F1 enum E (nameOffset:5) (firstTokenOffset:0) (offset:5)
           element: <testLibrary>::@enum::E
           fields
-            #F2 hasImplicitType hasInitializer isConst isEnumConstant isOriginDeclaration isStatic a (nameOffset:8) (firstTokenOffset:8) (offset:8)
+            #F2 hasImplicitType hasInitializer isConst isEnumConstant isOriginDeclaration isStatic a (nameOffset:9) (firstTokenOffset:9) (offset:9)
               element: <testLibrary>::@enum::E::@field::a
               initializer: expression_0
                 InstanceCreationExpression
@@ -10545,7 +10627,7 @@
                     leftParenthesis: ( @0
                     rightParenthesis: ) @0
                   staticType: E
-            #F3 hasImplicitType hasInitializer isConst isEnumConstant isOriginDeclaration isStatic b (nameOffset:11) (firstTokenOffset:11) (offset:11)
+            #F3 hasImplicitType hasInitializer isConst isEnumConstant isOriginDeclaration isStatic b (nameOffset:12) (firstTokenOffset:12) (offset:12)
               element: <testLibrary>::@enum::E::@field::b
               initializer: expression_1
                 InstanceCreationExpression
@@ -10559,7 +10641,7 @@
                     leftParenthesis: ( @0
                     rightParenthesis: ) @0
                   staticType: E
-            #F4 hasImplicitType hasInitializer isConst isEnumConstant isOriginDeclaration isStatic c (nameOffset:14) (firstTokenOffset:14) (offset:14)
+            #F4 hasImplicitType hasInitializer isConst isEnumConstant isOriginDeclaration isStatic c (nameOffset:15) (firstTokenOffset:15) (offset:15)
               element: <testLibrary>::@enum::E::@field::c
               initializer: expression_2
                 InstanceCreationExpression
@@ -10598,27 +10680,27 @@
               element: <testLibrary>::@enum::E::@constructor::new
               typeName: E
           getters
-            #F7 isCompleteDeclaration isOriginVariable isStatic a (nameOffset:<null>) (firstTokenOffset:<null>) (offset:8)
+            #F7 isCompleteDeclaration isOriginVariable isStatic a (nameOffset:<null>) (firstTokenOffset:<null>) (offset:9)
               element: <testLibrary>::@enum::E::@getter::a
-            #F8 isCompleteDeclaration isOriginVariable isStatic b (nameOffset:<null>) (firstTokenOffset:<null>) (offset:11)
+            #F8 isCompleteDeclaration isOriginVariable isStatic b (nameOffset:<null>) (firstTokenOffset:<null>) (offset:12)
               element: <testLibrary>::@enum::E::@getter::b
-            #F9 isCompleteDeclaration isOriginVariable isStatic c (nameOffset:<null>) (firstTokenOffset:<null>) (offset:14)
+            #F9 isCompleteDeclaration isOriginVariable isStatic c (nameOffset:<null>) (firstTokenOffset:<null>) (offset:15)
               element: <testLibrary>::@enum::E::@getter::c
             #F10 isCompleteDeclaration isOriginVariable isStatic values (nameOffset:<null>) (firstTokenOffset:<null>) (offset:5)
               element: <testLibrary>::@enum::E::@getter::values
       topLevelVariables
-        #F11 hasImplicitType hasInitializer isFinal isOriginDeclaration isStatic vValue (nameOffset:23) (firstTokenOffset:23) (offset:23)
+        #F11 hasImplicitType hasInitializer isFinal isOriginDeclaration isStatic vValue (nameOffset:26) (firstTokenOffset:26) (offset:26)
           element: <testLibrary>::@topLevelVariable::vValue
-        #F12 hasImplicitType hasInitializer isFinal isOriginDeclaration isStatic vValues (nameOffset:43) (firstTokenOffset:43) (offset:43)
+        #F12 hasImplicitType hasInitializer isFinal isOriginDeclaration isStatic vValues (nameOffset:46) (firstTokenOffset:46) (offset:46)
           element: <testLibrary>::@topLevelVariable::vValues
-        #F13 hasImplicitType hasInitializer isFinal isOriginDeclaration isStatic vIndex (nameOffset:69) (firstTokenOffset:69) (offset:69)
+        #F13 hasImplicitType hasInitializer isFinal isOriginDeclaration isStatic vIndex (nameOffset:72) (firstTokenOffset:72) (offset:72)
           element: <testLibrary>::@topLevelVariable::vIndex
       getters
-        #F14 isCompleteDeclaration isOriginVariable isStatic vValue (nameOffset:<null>) (firstTokenOffset:<null>) (offset:23)
+        #F14 isCompleteDeclaration isOriginVariable isStatic vValue (nameOffset:<null>) (firstTokenOffset:<null>) (offset:26)
           element: <testLibrary>::@getter::vValue
-        #F15 isCompleteDeclaration isOriginVariable isStatic vValues (nameOffset:<null>) (firstTokenOffset:<null>) (offset:43)
+        #F15 isCompleteDeclaration isOriginVariable isStatic vValues (nameOffset:<null>) (firstTokenOffset:<null>) (offset:46)
           element: <testLibrary>::@getter::vValues
-        #F16 isCompleteDeclaration isOriginVariable isStatic vIndex (nameOffset:<null>) (firstTokenOffset:<null>) (offset:69)
+        #F16 isCompleteDeclaration isOriginVariable isStatic vIndex (nameOffset:<null>) (firstTokenOffset:<null>) (offset:72)
           element: <testLibrary>::@getter::vIndex
   enums
     isSimplyBounded enum E
@@ -10720,8 +10802,9 @@
   }
 
   test_constExpr_pushReference_enum_method() async {
-    var library = await buildLibrary('''
-enum E {a}
+    var library = await buildLibrary(r'''
+enum E { a }
+
 final vToString = E.a.toString();
 ''');
     checkElementText(library, r'''
@@ -10734,7 +10817,7 @@
         #F1 enum E (nameOffset:5) (firstTokenOffset:0) (offset:5)
           element: <testLibrary>::@enum::E
           fields
-            #F2 hasImplicitType hasInitializer isConst isEnumConstant isOriginDeclaration isStatic a (nameOffset:8) (firstTokenOffset:8) (offset:8)
+            #F2 hasImplicitType hasInitializer isConst isEnumConstant isOriginDeclaration isStatic a (nameOffset:9) (firstTokenOffset:9) (offset:9)
               element: <testLibrary>::@enum::E::@field::a
               initializer: expression_0
                 InstanceCreationExpression
@@ -10765,15 +10848,15 @@
               element: <testLibrary>::@enum::E::@constructor::new
               typeName: E
           getters
-            #F5 isCompleteDeclaration isOriginVariable isStatic a (nameOffset:<null>) (firstTokenOffset:<null>) (offset:8)
+            #F5 isCompleteDeclaration isOriginVariable isStatic a (nameOffset:<null>) (firstTokenOffset:<null>) (offset:9)
               element: <testLibrary>::@enum::E::@getter::a
             #F6 isCompleteDeclaration isOriginVariable isStatic values (nameOffset:<null>) (firstTokenOffset:<null>) (offset:5)
               element: <testLibrary>::@enum::E::@getter::values
       topLevelVariables
-        #F7 hasImplicitType hasInitializer isFinal isOriginDeclaration isStatic vToString (nameOffset:17) (firstTokenOffset:17) (offset:17)
+        #F7 hasImplicitType hasInitializer isFinal isOriginDeclaration isStatic vToString (nameOffset:20) (firstTokenOffset:20) (offset:20)
           element: <testLibrary>::@topLevelVariable::vToString
       getters
-        #F8 isCompleteDeclaration isOriginVariable isStatic vToString (nameOffset:<null>) (firstTokenOffset:<null>) (offset:17)
+        #F8 isCompleteDeclaration isOriginVariable isStatic vToString (nameOffset:<null>) (firstTokenOffset:<null>) (offset:20)
           element: <testLibrary>::@getter::vToString
   enums
     isSimplyBounded enum E
@@ -10829,7 +10912,7 @@
   }
 
   test_constExpr_pushReference_field_simpleIdentifier() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class C {
   static const a = b;
   static const b = null;
@@ -10907,7 +10990,7 @@
   }
 
   test_constExpr_pushReference_staticMethod_simpleIdentifier() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class C {
   static const a = m;
   static m() {}
diff --git a/pkg/analyzer/test/src/summary/elements/default_value_test.dart b/pkg/analyzer/test/src/summary/elements/default_value_test.dart
index 0497134..8bee6c8 100644
--- a/pkg/analyzer/test/src/summary/elements/default_value_test.dart
+++ b/pkg/analyzer/test/src/summary/elements/default_value_test.dart
@@ -17,7 +17,7 @@
 
 abstract class DefaultValueElementTest extends ElementsBaseTest {
   test_defaultValue_eliminateTypeParameters() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class A<T> {
   const X({List<T> a = const []});
 }
@@ -77,7 +77,7 @@
   }
 
   test_defaultValue_genericFunction() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 typedef void F<T>(T v);
 
 void defaultF<T>(T v) {}
@@ -195,10 +195,11 @@
   }
 
   test_defaultValue_genericFunctionType() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class A<T> {
   const A();
 }
+
 class B {
   void foo({a: const A<Function()>()}) {}
 }
@@ -220,46 +221,46 @@
               element: <testLibrary>::@class::A::@constructor::new
               typeName: A
               typeNameOffset: 21
-        #F4 class B (nameOffset:34) (firstTokenOffset:28) (offset:34)
+        #F4 class B (nameOffset:35) (firstTokenOffset:29) (offset:35)
           element: <testLibrary>::@class::B
           constructors
-            #F5 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:34)
+            #F5 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:35)
               element: <testLibrary>::@class::B::@constructor::new
               typeName: B
           methods
-            #F6 isCompleteDeclaration isOriginDeclaration foo (nameOffset:45) (firstTokenOffset:40) (offset:45)
+            #F6 isCompleteDeclaration isOriginDeclaration foo (nameOffset:46) (firstTokenOffset:41) (offset:46)
               element: <testLibrary>::@class::B::@method::foo
               formalParameters
-                #F7 optionalNamed hasImplicitType isOriginDeclaration a (nameOffset:50) (firstTokenOffset:50) (offset:50)
+                #F7 optionalNamed hasImplicitType isOriginDeclaration a (nameOffset:51) (firstTokenOffset:51) (offset:51)
                   element: <testLibrary>::@class::B::@method::foo::@formalParameter::a
                   initializer: expression_0
                     InstanceCreationExpression
-                      keyword: const @53
+                      keyword: const @54
                       constructorName: ConstructorName
                         type: NamedType
-                          name: A @59
+                          name: A @60
                           typeArguments: TypeArgumentList
-                            leftBracket: < @60
+                            leftBracket: < @61
                             arguments
                               GenericFunctionType
-                                functionKeyword: Function @61
+                                functionKeyword: Function @62
                                 parameters: FormalParameterList
-                                  leftParenthesis: ( @69
-                                  rightParenthesis: ) @70
+                                  leftParenthesis: ( @70
+                                  rightParenthesis: ) @71
                                 declaredFragment: GenericFunctionTypeElement
                                   parameters
                                   returnType: dynamic
                                   type: dynamic Function()
                                 type: dynamic Function()
-                            rightBracket: > @71
+                            rightBracket: > @72
                           element: <testLibrary>::@class::A
                           type: A<dynamic Function()>
                         element: ConstructorMember
                           baseElement: <testLibrary>::@class::A::@constructor::new
                           substitution: {T: dynamic Function()}
                       argumentList: ArgumentList
-                        leftParenthesis: ( @72
-                        rightParenthesis: ) @73
+                        leftParenthesis: ( @73
+                        rightParenthesis: ) @74
                       staticType: A<dynamic Function()>
   classes
     isSimplyBounded class A
@@ -295,7 +296,7 @@
   }
 
   test_defaultValue_inFunctionTypedFormalParameter() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 void f( g({a: 0 is int}) ) {}
 ''');
     checkElementText(library, r'''
@@ -344,7 +345,7 @@
   }
 
   test_defaultValue_methodMember() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 void f([Comparator<T> compare = Comparable.compare]) {}
 ''');
     checkElementText(library, r'''
@@ -391,7 +392,7 @@
   }
 
   test_defaultValue_recordLiteral_named() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 void f({({int f1, bool f2}) x = (f1: 1, f2: true)}) {}
 ''');
     checkElementText(library, r'''
@@ -440,7 +441,7 @@
   }
 
   test_defaultValue_recordLiteral_named_const() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 void f({({int f1, bool f2}) x = const (f1: 1, f2: true)}) {}
 ''');
     checkElementText(library, r'''
@@ -490,7 +491,7 @@
   }
 
   test_defaultValue_recordLiteral_positional() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 void f({(int, bool) x = (1, true)}) {}
 ''');
     checkElementText(library, r'''
@@ -533,7 +534,7 @@
   }
 
   void test_defaultValue_recordLiteral_positional_const() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 void f({(int, bool) x = const (1, true)}) {}
 ''');
     checkElementText(library, r'''
@@ -577,8 +578,9 @@
   }
 
   test_defaultValue_refersToExtension_method_inside() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class A {}
+
 extension E on A {
   static void f() {}
   static void g([Object p = f]) {}
@@ -598,19 +600,19 @@
               element: <testLibrary>::@class::A::@constructor::new
               typeName: A
       extensions
-        #F3 extension E (nameOffset:21) (firstTokenOffset:11) (offset:21)
+        #F3 extension E (nameOffset:22) (firstTokenOffset:12) (offset:22)
           element: <testLibrary>::@extension::E
           methods
-            #F4 isCompleteDeclaration isOriginDeclaration isStatic f (nameOffset:44) (firstTokenOffset:32) (offset:44)
+            #F4 isCompleteDeclaration isOriginDeclaration isStatic f (nameOffset:45) (firstTokenOffset:33) (offset:45)
               element: <testLibrary>::@extension::E::@method::f
-            #F5 isCompleteDeclaration isOriginDeclaration isStatic g (nameOffset:65) (firstTokenOffset:53) (offset:65)
+            #F5 isCompleteDeclaration isOriginDeclaration isStatic g (nameOffset:66) (firstTokenOffset:54) (offset:66)
               element: <testLibrary>::@extension::E::@method::g
               formalParameters
-                #F6 optionalPositional isOriginDeclaration p (nameOffset:75) (firstTokenOffset:68) (offset:75)
+                #F6 optionalPositional isOriginDeclaration p (nameOffset:76) (firstTokenOffset:69) (offset:76)
                   element: <testLibrary>::@extension::E::@method::g::@formalParameter::p
                   initializer: expression_0
                     SimpleIdentifier
-                      token: f @79
+                      token: f @80
                       element: <testLibrary>::@extension::E::@method::f
                       staticType: void Function()
   classes
@@ -647,10 +649,11 @@
   }
 
   test_defaultValue_refersToGenericClass() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class B<T1, T2> {
   const B();
 }
+
 class C {
   void foo([B<int, double> b = const B()]) {}
 }
@@ -674,32 +677,32 @@
               element: <testLibrary>::@class::B::@constructor::new
               typeName: B
               typeNameOffset: 26
-        #F5 class C (nameOffset:39) (firstTokenOffset:33) (offset:39)
+        #F5 class C (nameOffset:40) (firstTokenOffset:34) (offset:40)
           element: <testLibrary>::@class::C
           constructors
-            #F6 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:39)
+            #F6 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:40)
               element: <testLibrary>::@class::C::@constructor::new
               typeName: C
           methods
-            #F7 isCompleteDeclaration isOriginDeclaration foo (nameOffset:50) (firstTokenOffset:45) (offset:50)
+            #F7 isCompleteDeclaration isOriginDeclaration foo (nameOffset:51) (firstTokenOffset:46) (offset:51)
               element: <testLibrary>::@class::C::@method::foo
               formalParameters
-                #F8 optionalPositional isOriginDeclaration b (nameOffset:70) (firstTokenOffset:55) (offset:70)
+                #F8 optionalPositional isOriginDeclaration b (nameOffset:71) (firstTokenOffset:56) (offset:71)
                   element: <testLibrary>::@class::C::@method::foo::@formalParameter::b
                   initializer: expression_0
                     InstanceCreationExpression
-                      keyword: const @74
+                      keyword: const @75
                       constructorName: ConstructorName
                         type: NamedType
-                          name: B @80
+                          name: B @81
                           element: <testLibrary>::@class::B
                           type: B<int, double>
                         element: ConstructorMember
                           baseElement: <testLibrary>::@class::B::@constructor::new
                           substitution: {T1: int, T2: double}
                       argumentList: ArgumentList
-                        leftParenthesis: ( @81
-                        rightParenthesis: ) @82
+                        leftParenthesis: ( @82
+                        rightParenthesis: ) @83
                       staticType: B<int, double>
   classes
     isSimplyBounded class B
@@ -737,10 +740,11 @@
   }
 
   test_defaultValue_refersToGenericClass_constructor() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class B<T> {
   const B();
 }
+
 class C<T> {
   const C([B<T> b = const B()]);
 }
@@ -762,33 +766,33 @@
               element: <testLibrary>::@class::B::@constructor::new
               typeName: B
               typeNameOffset: 21
-        #F4 class C (nameOffset:34) (firstTokenOffset:28) (offset:34)
+        #F4 class C (nameOffset:35) (firstTokenOffset:29) (offset:35)
           element: <testLibrary>::@class::C
           typeParameters
-            #F5 T (nameOffset:36) (firstTokenOffset:36) (offset:36)
+            #F5 T (nameOffset:37) (firstTokenOffset:37) (offset:37)
               element: #E1 T
           constructors
-            #F6 isConst isOriginDeclaration new (nameOffset:<null>) (firstTokenOffset:43) (offset:49)
+            #F6 isConst isOriginDeclaration new (nameOffset:<null>) (firstTokenOffset:44) (offset:50)
               element: <testLibrary>::@class::C::@constructor::new
               typeName: C
-              typeNameOffset: 49
+              typeNameOffset: 50
               formalParameters
-                #F7 optionalPositional isOriginDeclaration b (nameOffset:57) (firstTokenOffset:52) (offset:57)
+                #F7 optionalPositional isOriginDeclaration b (nameOffset:58) (firstTokenOffset:53) (offset:58)
                   element: <testLibrary>::@class::C::@constructor::new::@formalParameter::b
                   initializer: expression_0
                     InstanceCreationExpression
-                      keyword: const @61
+                      keyword: const @62
                       constructorName: ConstructorName
                         type: NamedType
-                          name: B @67
+                          name: B @68
                           element: <testLibrary>::@class::B
                           type: B<Never>
                         element: ConstructorMember
                           baseElement: <testLibrary>::@class::B::@constructor::new
                           substitution: {T: Never}
                       argumentList: ArgumentList
-                        leftParenthesis: ( @68
-                        rightParenthesis: ) @69
+                        leftParenthesis: ( @69
+                        rightParenthesis: ) @70
                       staticType: B<Never>
   classes
     isSimplyBounded class B
@@ -822,11 +826,13 @@
   }
 
   test_defaultValue_refersToGenericClass_constructor2() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 abstract class A<T> {}
+
 class B<T> implements A<T> {
   const B();
 }
+
 class C<T> implements A<Iterable<T>> {
   const C([A<T> a = const B()]);
 }
@@ -847,43 +853,43 @@
             #F3 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:15)
               element: <testLibrary>::@class::A::@constructor::new
               typeName: A
-        #F4 class B (nameOffset:29) (firstTokenOffset:23) (offset:29)
+        #F4 class B (nameOffset:30) (firstTokenOffset:24) (offset:30)
           element: <testLibrary>::@class::B
           typeParameters
-            #F5 T (nameOffset:31) (firstTokenOffset:31) (offset:31)
+            #F5 T (nameOffset:32) (firstTokenOffset:32) (offset:32)
               element: #E1 T
           constructors
-            #F6 isConst isOriginDeclaration new (nameOffset:<null>) (firstTokenOffset:54) (offset:60)
+            #F6 isConst isOriginDeclaration new (nameOffset:<null>) (firstTokenOffset:55) (offset:61)
               element: <testLibrary>::@class::B::@constructor::new
               typeName: B
-              typeNameOffset: 60
-        #F7 class C (nameOffset:73) (firstTokenOffset:67) (offset:73)
+              typeNameOffset: 61
+        #F7 class C (nameOffset:75) (firstTokenOffset:69) (offset:75)
           element: <testLibrary>::@class::C
           typeParameters
-            #F8 T (nameOffset:75) (firstTokenOffset:75) (offset:75)
+            #F8 T (nameOffset:77) (firstTokenOffset:77) (offset:77)
               element: #E2 T
           constructors
-            #F9 isConst isOriginDeclaration new (nameOffset:<null>) (firstTokenOffset:108) (offset:114)
+            #F9 isConst isOriginDeclaration new (nameOffset:<null>) (firstTokenOffset:110) (offset:116)
               element: <testLibrary>::@class::C::@constructor::new
               typeName: C
-              typeNameOffset: 114
+              typeNameOffset: 116
               formalParameters
-                #F10 optionalPositional isOriginDeclaration a (nameOffset:122) (firstTokenOffset:117) (offset:122)
+                #F10 optionalPositional isOriginDeclaration a (nameOffset:124) (firstTokenOffset:119) (offset:124)
                   element: <testLibrary>::@class::C::@constructor::new::@formalParameter::a
                   initializer: expression_0
                     InstanceCreationExpression
-                      keyword: const @126
+                      keyword: const @128
                       constructorName: ConstructorName
                         type: NamedType
-                          name: B @132
+                          name: B @134
                           element: <testLibrary>::@class::B
                           type: B<Never>
                         element: ConstructorMember
                           baseElement: <testLibrary>::@class::B::@constructor::new
                           substitution: {T: Never}
                       argumentList: ArgumentList
-                        leftParenthesis: ( @133
-                        rightParenthesis: ) @134
+                        leftParenthesis: ( @135
+                        rightParenthesis: ) @136
                       staticType: B<Never>
   classes
     isAbstract isSimplyBounded class A
@@ -931,10 +937,11 @@
   }
 
   test_defaultValue_refersToGenericClass_functionG() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class B<T> {
   const B();
 }
+
 void foo<T>([B<T> b = const B()]) {}
 ''');
     checkElementText(library, r'''
@@ -955,28 +962,28 @@
               typeName: B
               typeNameOffset: 21
       functions
-        #F4 isCompleteDeclaration isOriginDeclaration isStatic foo (nameOffset:33) (firstTokenOffset:28) (offset:33)
+        #F4 isCompleteDeclaration isOriginDeclaration isStatic foo (nameOffset:34) (firstTokenOffset:29) (offset:34)
           element: <testLibrary>::@function::foo
           typeParameters
-            #F5 T (nameOffset:37) (firstTokenOffset:37) (offset:37)
+            #F5 T (nameOffset:38) (firstTokenOffset:38) (offset:38)
               element: #E1 T
           formalParameters
-            #F6 optionalPositional isOriginDeclaration b (nameOffset:46) (firstTokenOffset:41) (offset:46)
+            #F6 optionalPositional isOriginDeclaration b (nameOffset:47) (firstTokenOffset:42) (offset:47)
               element: <testLibrary>::@function::foo::@formalParameter::b
               initializer: expression_0
                 InstanceCreationExpression
-                  keyword: const @50
+                  keyword: const @51
                   constructorName: ConstructorName
                     type: NamedType
-                      name: B @56
+                      name: B @57
                       element: <testLibrary>::@class::B
                       type: B<Never>
                     element: ConstructorMember
                       baseElement: <testLibrary>::@class::B::@constructor::new
                       substitution: {T: Never}
                   argumentList: ArgumentList
-                    leftParenthesis: ( @57
-                    rightParenthesis: ) @58
+                    leftParenthesis: ( @58
+                    rightParenthesis: ) @59
                   staticType: B<Never>
   classes
     isSimplyBounded class B
@@ -1008,10 +1015,11 @@
   }
 
   test_defaultValue_refersToGenericClass_methodG() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class B<T> {
   const B();
 }
+
 class C {
   void foo<T>([B<T> b = const B()]) {}
 }
@@ -1033,35 +1041,35 @@
               element: <testLibrary>::@class::B::@constructor::new
               typeName: B
               typeNameOffset: 21
-        #F4 class C (nameOffset:34) (firstTokenOffset:28) (offset:34)
+        #F4 class C (nameOffset:35) (firstTokenOffset:29) (offset:35)
           element: <testLibrary>::@class::C
           constructors
-            #F5 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:34)
+            #F5 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:35)
               element: <testLibrary>::@class::C::@constructor::new
               typeName: C
           methods
-            #F6 isCompleteDeclaration isOriginDeclaration foo (nameOffset:45) (firstTokenOffset:40) (offset:45)
+            #F6 isCompleteDeclaration isOriginDeclaration foo (nameOffset:46) (firstTokenOffset:41) (offset:46)
               element: <testLibrary>::@class::C::@method::foo
               typeParameters
-                #F7 T (nameOffset:49) (firstTokenOffset:49) (offset:49)
+                #F7 T (nameOffset:50) (firstTokenOffset:50) (offset:50)
                   element: #E1 T
               formalParameters
-                #F8 optionalPositional isOriginDeclaration b (nameOffset:58) (firstTokenOffset:53) (offset:58)
+                #F8 optionalPositional isOriginDeclaration b (nameOffset:59) (firstTokenOffset:54) (offset:59)
                   element: <testLibrary>::@class::C::@method::foo::@formalParameter::b
                   initializer: expression_0
                     InstanceCreationExpression
-                      keyword: const @62
+                      keyword: const @63
                       constructorName: ConstructorName
                         type: NamedType
-                          name: B @68
+                          name: B @69
                           element: <testLibrary>::@class::B
                           type: B<Never>
                         element: ConstructorMember
                           baseElement: <testLibrary>::@class::B::@constructor::new
                           substitution: {T: Never}
                       argumentList: ArgumentList
-                        leftParenthesis: ( @69
-                        rightParenthesis: ) @70
+                        leftParenthesis: ( @70
+                        rightParenthesis: ) @71
                       staticType: B<Never>
   classes
     isSimplyBounded class B
@@ -1100,10 +1108,11 @@
   }
 
   test_defaultValue_refersToGenericClass_methodG_classG() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class B<T1, T2> {
   const B();
 }
+
 class C<E1> {
   void foo<E2>([B<E1, E2> b = const B()]) {}
 }
@@ -1127,38 +1136,38 @@
               element: <testLibrary>::@class::B::@constructor::new
               typeName: B
               typeNameOffset: 26
-        #F5 class C (nameOffset:39) (firstTokenOffset:33) (offset:39)
+        #F5 class C (nameOffset:40) (firstTokenOffset:34) (offset:40)
           element: <testLibrary>::@class::C
           typeParameters
-            #F6 E1 (nameOffset:41) (firstTokenOffset:41) (offset:41)
+            #F6 E1 (nameOffset:42) (firstTokenOffset:42) (offset:42)
               element: #E2 E1
           constructors
-            #F7 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:39)
+            #F7 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:40)
               element: <testLibrary>::@class::C::@constructor::new
               typeName: C
           methods
-            #F8 isCompleteDeclaration isOriginDeclaration foo (nameOffset:54) (firstTokenOffset:49) (offset:54)
+            #F8 isCompleteDeclaration isOriginDeclaration foo (nameOffset:55) (firstTokenOffset:50) (offset:55)
               element: <testLibrary>::@class::C::@method::foo
               typeParameters
-                #F9 E2 (nameOffset:58) (firstTokenOffset:58) (offset:58)
+                #F9 E2 (nameOffset:59) (firstTokenOffset:59) (offset:59)
                   element: #E3 E2
               formalParameters
-                #F10 optionalPositional isOriginDeclaration b (nameOffset:73) (firstTokenOffset:63) (offset:73)
+                #F10 optionalPositional isOriginDeclaration b (nameOffset:74) (firstTokenOffset:64) (offset:74)
                   element: <testLibrary>::@class::C::@method::foo::@formalParameter::b
                   initializer: expression_0
                     InstanceCreationExpression
-                      keyword: const @77
+                      keyword: const @78
                       constructorName: ConstructorName
                         type: NamedType
-                          name: B @83
+                          name: B @84
                           element: <testLibrary>::@class::B
                           type: B<Never, Never>
                         element: ConstructorMember
                           baseElement: <testLibrary>::@class::B::@constructor::new
                           substitution: {T1: Never, T2: Never}
                       argumentList: ArgumentList
-                        leftParenthesis: ( @84
-                        rightParenthesis: ) @85
+                        leftParenthesis: ( @85
+                        rightParenthesis: ) @86
                       staticType: B<Never, Never>
   classes
     isSimplyBounded class B
@@ -1202,10 +1211,11 @@
   }
 
   test_defaultValue_refersToGenericClass_methodNG() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class B<T> {
   const B();
 }
+
 class C<T> {
   void foo([B<T> b = const B()]) {}
 }
@@ -1227,35 +1237,35 @@
               element: <testLibrary>::@class::B::@constructor::new
               typeName: B
               typeNameOffset: 21
-        #F4 class C (nameOffset:34) (firstTokenOffset:28) (offset:34)
+        #F4 class C (nameOffset:35) (firstTokenOffset:29) (offset:35)
           element: <testLibrary>::@class::C
           typeParameters
-            #F5 T (nameOffset:36) (firstTokenOffset:36) (offset:36)
+            #F5 T (nameOffset:37) (firstTokenOffset:37) (offset:37)
               element: #E1 T
           constructors
-            #F6 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:34)
+            #F6 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:35)
               element: <testLibrary>::@class::C::@constructor::new
               typeName: C
           methods
-            #F7 isCompleteDeclaration isOriginDeclaration foo (nameOffset:48) (firstTokenOffset:43) (offset:48)
+            #F7 isCompleteDeclaration isOriginDeclaration foo (nameOffset:49) (firstTokenOffset:44) (offset:49)
               element: <testLibrary>::@class::C::@method::foo
               formalParameters
-                #F8 optionalPositional isOriginDeclaration b (nameOffset:58) (firstTokenOffset:53) (offset:58)
+                #F8 optionalPositional isOriginDeclaration b (nameOffset:59) (firstTokenOffset:54) (offset:59)
                   element: <testLibrary>::@class::C::@method::foo::@formalParameter::b
                   initializer: expression_0
                     InstanceCreationExpression
-                      keyword: const @62
+                      keyword: const @63
                       constructorName: ConstructorName
                         type: NamedType
-                          name: B @68
+                          name: B @69
                           element: <testLibrary>::@class::B
                           type: B<Never>
                         element: ConstructorMember
                           baseElement: <testLibrary>::@class::B::@constructor::new
                           substitution: {T: Never}
                       argumentList: ArgumentList
-                        leftParenthesis: ( @69
-                        rightParenthesis: ) @70
+                        leftParenthesis: ( @70
+                        rightParenthesis: ) @71
                       staticType: B<Never>
   classes
     isSimplyBounded class B
diff --git a/pkg/analyzer/test/src/summary/elements/duplicate_declaration_test.dart b/pkg/analyzer/test/src/summary/elements/duplicate_declaration_test.dart
index b2158a7..73ab2f6 100644
--- a/pkg/analyzer/test/src/summary/elements/duplicate_declaration_test.dart
+++ b/pkg/analyzer/test/src/summary/elements/duplicate_declaration_test.dart
@@ -411,9 +411,12 @@
   test_duplicateDeclaration_classTypeAlias() async {
     var library = await buildLibrary(r'''
 class A {}
+
 class B {}
+
 class X = A with M;
 class X = B with M;
+
 mixin M {}
 ''');
     checkElementText(library, r'''
@@ -429,26 +432,26 @@
             #F2 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:6)
               element: <testLibrary>::@class::A::@constructor::new
               typeName: A
-        #F3 class B (nameOffset:17) (firstTokenOffset:11) (offset:17)
+        #F3 class B (nameOffset:18) (firstTokenOffset:12) (offset:18)
           element: <testLibrary>::@class::B
           constructors
-            #F4 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:17)
+            #F4 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:18)
               element: <testLibrary>::@class::B::@constructor::new
               typeName: B
-        #F5 isMixinApplication class X (nameOffset:28) (firstTokenOffset:22) (offset:28)
+        #F5 isMixinApplication class X (nameOffset:30) (firstTokenOffset:24) (offset:30)
           element: <testLibrary>::@class::X
           constructors
-            #F6 isOriginMixinApplication new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:28)
+            #F6 isOriginMixinApplication new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:30)
               element: <testLibrary>::@class::X::@constructor::new
               typeName: X
-        #F7 isMixinApplication class X (nameOffset:48) (firstTokenOffset:42) (offset:48)
+        #F7 isMixinApplication class X (nameOffset:50) (firstTokenOffset:44) (offset:50)
           element: <testLibrary>::@class::X#1
           constructors
-            #F8 isOriginMixinApplication new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:48)
+            #F8 isOriginMixinApplication new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:50)
               element: <testLibrary>::@class::X#1::@constructor::new
               typeName: X
       mixins
-        #F9 mixin M (nameOffset:68) (firstTokenOffset:62) (offset:68)
+        #F9 mixin M (nameOffset:71) (firstTokenOffset:65) (offset:71)
           element: <testLibrary>::@mixin::M
   classes
     isSimplyBounded class A
@@ -512,8 +515,9 @@
 
   test_duplicateDeclaration_enum() async {
     var library = await buildLibrary(r'''
-enum E {a, b}
-enum E {c, d, e}
+enum E { a, b }
+
+enum E { c, d, e }
 ''');
 
     checkElementText(library, r'''
@@ -526,7 +530,7 @@
         #F1 enum E (nameOffset:5) (firstTokenOffset:0) (offset:5)
           element: <testLibrary>::@enum::E
           fields
-            #F2 hasImplicitType hasInitializer isConst isEnumConstant isOriginDeclaration isStatic a (nameOffset:8) (firstTokenOffset:8) (offset:8)
+            #F2 hasImplicitType hasInitializer isConst isEnumConstant isOriginDeclaration isStatic a (nameOffset:9) (firstTokenOffset:9) (offset:9)
               element: <testLibrary>::@enum::E::@field::a
               initializer: expression_0
                 InstanceCreationExpression
@@ -540,7 +544,7 @@
                     leftParenthesis: ( @0
                     rightParenthesis: ) @0
                   staticType: E
-            #F3 hasImplicitType hasInitializer isConst isEnumConstant isOriginDeclaration isStatic b (nameOffset:11) (firstTokenOffset:11) (offset:11)
+            #F3 hasImplicitType hasInitializer isConst isEnumConstant isOriginDeclaration isStatic b (nameOffset:12) (firstTokenOffset:12) (offset:12)
               element: <testLibrary>::@enum::E::@field::b
               initializer: expression_1
                 InstanceCreationExpression
@@ -575,16 +579,16 @@
               element: <testLibrary>::@enum::E::@constructor::new
               typeName: E
           getters
-            #F6 isCompleteDeclaration isOriginVariable isStatic a (nameOffset:<null>) (firstTokenOffset:<null>) (offset:8)
+            #F6 isCompleteDeclaration isOriginVariable isStatic a (nameOffset:<null>) (firstTokenOffset:<null>) (offset:9)
               element: <testLibrary>::@enum::E::@getter::a
-            #F7 isCompleteDeclaration isOriginVariable isStatic b (nameOffset:<null>) (firstTokenOffset:<null>) (offset:11)
+            #F7 isCompleteDeclaration isOriginVariable isStatic b (nameOffset:<null>) (firstTokenOffset:<null>) (offset:12)
               element: <testLibrary>::@enum::E::@getter::b
             #F8 isCompleteDeclaration isOriginVariable isStatic values (nameOffset:<null>) (firstTokenOffset:<null>) (offset:5)
               element: <testLibrary>::@enum::E::@getter::values
-        #F9 enum E (nameOffset:19) (firstTokenOffset:14) (offset:19)
+        #F9 enum E (nameOffset:22) (firstTokenOffset:17) (offset:22)
           element: <testLibrary>::@enum::E#1
           fields
-            #F10 hasImplicitType hasInitializer isConst isEnumConstant isOriginDeclaration isStatic c (nameOffset:22) (firstTokenOffset:22) (offset:22)
+            #F10 hasImplicitType hasInitializer isConst isEnumConstant isOriginDeclaration isStatic c (nameOffset:26) (firstTokenOffset:26) (offset:26)
               element: <testLibrary>::@enum::E#1::@field::c
               initializer: expression_3
                 InstanceCreationExpression
@@ -598,7 +602,7 @@
                     leftParenthesis: ( @0
                     rightParenthesis: ) @0
                   staticType: E
-            #F11 hasImplicitType hasInitializer isConst isEnumConstant isOriginDeclaration isStatic d (nameOffset:25) (firstTokenOffset:25) (offset:25)
+            #F11 hasImplicitType hasInitializer isConst isEnumConstant isOriginDeclaration isStatic d (nameOffset:29) (firstTokenOffset:29) (offset:29)
               element: <testLibrary>::@enum::E#1::@field::d
               initializer: expression_4
                 InstanceCreationExpression
@@ -612,7 +616,7 @@
                     leftParenthesis: ( @0
                     rightParenthesis: ) @0
                   staticType: E
-            #F12 hasImplicitType hasInitializer isConst isEnumConstant isOriginDeclaration isStatic e (nameOffset:28) (firstTokenOffset:28) (offset:28)
+            #F12 hasImplicitType hasInitializer isConst isEnumConstant isOriginDeclaration isStatic e (nameOffset:32) (firstTokenOffset:32) (offset:32)
               element: <testLibrary>::@enum::E#1::@field::e
               initializer: expression_5
                 InstanceCreationExpression
@@ -626,7 +630,7 @@
                     leftParenthesis: ( @0
                     rightParenthesis: ) @0
                   staticType: E
-            #F13 isConst isOriginEnumValues isStatic values (nameOffset:<null>) (firstTokenOffset:<null>) (offset:19)
+            #F13 isConst isOriginEnumValues isStatic values (nameOffset:<null>) (firstTokenOffset:<null>) (offset:22)
               element: <testLibrary>::@enum::E#1::@field::values
               initializer: expression_6
                 ListLiteral
@@ -647,17 +651,17 @@
                   rightBracket: ] @0
                   staticType: List<E>
           constructors
-            #F14 isConst isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:19)
+            #F14 isConst isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:22)
               element: <testLibrary>::@enum::E#1::@constructor::new
               typeName: E
           getters
-            #F15 isCompleteDeclaration isOriginVariable isStatic c (nameOffset:<null>) (firstTokenOffset:<null>) (offset:22)
+            #F15 isCompleteDeclaration isOriginVariable isStatic c (nameOffset:<null>) (firstTokenOffset:<null>) (offset:26)
               element: <testLibrary>::@enum::E#1::@getter::c
-            #F16 isCompleteDeclaration isOriginVariable isStatic d (nameOffset:<null>) (firstTokenOffset:<null>) (offset:25)
+            #F16 isCompleteDeclaration isOriginVariable isStatic d (nameOffset:<null>) (firstTokenOffset:<null>) (offset:29)
               element: <testLibrary>::@enum::E#1::@getter::d
-            #F17 isCompleteDeclaration isOriginVariable isStatic e (nameOffset:<null>) (firstTokenOffset:<null>) (offset:28)
+            #F17 isCompleteDeclaration isOriginVariable isStatic e (nameOffset:<null>) (firstTokenOffset:<null>) (offset:32)
               element: <testLibrary>::@enum::E#1::@getter::e
-            #F18 isCompleteDeclaration isOriginVariable isStatic values (nameOffset:<null>) (firstTokenOffset:<null>) (offset:19)
+            #F18 isCompleteDeclaration isOriginVariable isStatic values (nameOffset:<null>) (firstTokenOffset:<null>) (offset:22)
               element: <testLibrary>::@enum::E#1::@getter::values
   enums
     isSimplyBounded enum E
@@ -779,9 +783,11 @@
   test_duplicateDeclaration_extension() async {
     var library = await buildLibrary(r'''
 extension E on int {}
+
 extension E on int {
   static var x;
 }
+
 extension E on int {
   static var y = 0;
 }
@@ -796,33 +802,33 @@
       extensions
         #F1 extension E (nameOffset:10) (firstTokenOffset:0) (offset:10)
           element: <testLibrary>::@extension::E
-        #F2 extension E (nameOffset:32) (firstTokenOffset:22) (offset:32)
+        #F2 extension E (nameOffset:33) (firstTokenOffset:23) (offset:33)
           element: <testLibrary>::@extension::E#1
           fields
-            #F3 hasImplicitType isOriginDeclaration isStatic x (nameOffset:56) (firstTokenOffset:56) (offset:56)
+            #F3 hasImplicitType isOriginDeclaration isStatic x (nameOffset:57) (firstTokenOffset:57) (offset:57)
               element: <testLibrary>::@extension::E#1::@field::x
           getters
-            #F4 isCompleteDeclaration isOriginVariable isStatic x (nameOffset:<null>) (firstTokenOffset:<null>) (offset:56)
+            #F4 isCompleteDeclaration isOriginVariable isStatic x (nameOffset:<null>) (firstTokenOffset:<null>) (offset:57)
               element: <testLibrary>::@extension::E#1::@getter::x
           setters
-            #F5 isCompleteDeclaration isOriginVariable isStatic x (nameOffset:<null>) (firstTokenOffset:<null>) (offset:56)
+            #F5 isCompleteDeclaration isOriginVariable isStatic x (nameOffset:<null>) (firstTokenOffset:<null>) (offset:57)
               element: <testLibrary>::@extension::E#1::@setter::x
               formalParameters
-                #F6 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:56)
+                #F6 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:57)
                   element: <testLibrary>::@extension::E#1::@setter::x::@formalParameter::value
-        #F7 extension E (nameOffset:71) (firstTokenOffset:61) (offset:71)
+        #F7 extension E (nameOffset:73) (firstTokenOffset:63) (offset:73)
           element: <testLibrary>::@extension::E#2
           fields
-            #F8 hasImplicitType hasInitializer isOriginDeclaration isStatic y (nameOffset:95) (firstTokenOffset:95) (offset:95)
+            #F8 hasImplicitType hasInitializer isOriginDeclaration isStatic y (nameOffset:97) (firstTokenOffset:97) (offset:97)
               element: <testLibrary>::@extension::E#2::@field::y
           getters
-            #F9 isCompleteDeclaration isOriginVariable isStatic y (nameOffset:<null>) (firstTokenOffset:<null>) (offset:95)
+            #F9 isCompleteDeclaration isOriginVariable isStatic y (nameOffset:<null>) (firstTokenOffset:<null>) (offset:97)
               element: <testLibrary>::@extension::E#2::@getter::y
           setters
-            #F10 isCompleteDeclaration isOriginVariable isStatic y (nameOffset:<null>) (firstTokenOffset:<null>) (offset:95)
+            #F10 isCompleteDeclaration isOriginVariable isStatic y (nameOffset:<null>) (firstTokenOffset:<null>) (offset:97)
               element: <testLibrary>::@extension::E#2::@setter::y
               formalParameters
-                #F11 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:95)
+                #F11 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:97)
                   element: <testLibrary>::@extension::E#2::@setter::y::@formalParameter::value
   extensions
     extension E
@@ -892,6 +898,7 @@
   test_duplicateDeclaration_extensionType() async {
     var library = await buildLibrary(r'''
 extension type E(int it) {}
+
 extension type E(double it) {}
 ''');
 
@@ -918,21 +925,21 @@
           getters
             #F5 isCompleteDeclaration isOriginVariable it (nameOffset:<null>) (firstTokenOffset:<null>) (offset:15)
               element: <testLibrary>::@extensionType::E::@getter::it
-        #F6 extension type E (nameOffset:43) (firstTokenOffset:28) (offset:43)
+        #F6 extension type E (nameOffset:44) (firstTokenOffset:29) (offset:44)
           element: <testLibrary>::@extensionType::E#1
           fields
-            #F7 isFinal isOriginDeclaringFormalParameter it (nameOffset:<null>) (firstTokenOffset:<null>) (offset:43)
+            #F7 isFinal isOriginDeclaringFormalParameter it (nameOffset:<null>) (firstTokenOffset:<null>) (offset:44)
               element: <testLibrary>::@extensionType::E#1::@field::it
           constructors
-            #F8 isCompleteDeclaration isOriginDeclaration isPrimary new (nameOffset:<null>) (firstTokenOffset:43) (offset:43)
+            #F8 isCompleteDeclaration isOriginDeclaration isPrimary new (nameOffset:<null>) (firstTokenOffset:44) (offset:44)
               element: <testLibrary>::@extensionType::E#1::@constructor::new
               typeName: E
-              typeNameOffset: 43
+              typeNameOffset: 44
               formalParameters
-                #F9 requiredPositional isDeclaring isFinal isOriginDeclaration this.it (nameOffset:52) (firstTokenOffset:45) (offset:52)
+                #F9 requiredPositional isDeclaring isFinal isOriginDeclaration this.it (nameOffset:53) (firstTokenOffset:46) (offset:53)
                   element: <testLibrary>::@extensionType::E#1::@constructor::new::@formalParameter::it
           getters
-            #F10 isCompleteDeclaration isOriginVariable it (nameOffset:<null>) (firstTokenOffset:<null>) (offset:43)
+            #F10 isCompleteDeclaration isOriginVariable it (nameOffset:<null>) (firstTokenOffset:<null>) (offset:44)
               element: <testLibrary>::@extensionType::E#1::@getter::it
   extensionTypes
     isSimplyBounded extension type E
@@ -1122,9 +1129,11 @@
   test_duplicateDeclaration_mixin() async {
     var library = await buildLibrary(r'''
 mixin A {}
+
 mixin A {
   var x;
 }
+
 mixin A {
   var y = 0;
 }
@@ -1139,33 +1148,33 @@
       mixins
         #F1 mixin A (nameOffset:6) (firstTokenOffset:0) (offset:6)
           element: <testLibrary>::@mixin::A
-        #F2 mixin A (nameOffset:17) (firstTokenOffset:11) (offset:17)
+        #F2 mixin A (nameOffset:18) (firstTokenOffset:12) (offset:18)
           element: <testLibrary>::@mixin::A#1
           fields
-            #F3 hasImplicitType isOriginDeclaration x (nameOffset:27) (firstTokenOffset:27) (offset:27)
+            #F3 hasImplicitType isOriginDeclaration x (nameOffset:28) (firstTokenOffset:28) (offset:28)
               element: <testLibrary>::@mixin::A#1::@field::x
           getters
-            #F4 isCompleteDeclaration isOriginVariable x (nameOffset:<null>) (firstTokenOffset:<null>) (offset:27)
+            #F4 isCompleteDeclaration isOriginVariable x (nameOffset:<null>) (firstTokenOffset:<null>) (offset:28)
               element: <testLibrary>::@mixin::A#1::@getter::x
           setters
-            #F5 isCompleteDeclaration isOriginVariable x (nameOffset:<null>) (firstTokenOffset:<null>) (offset:27)
+            #F5 isCompleteDeclaration isOriginVariable x (nameOffset:<null>) (firstTokenOffset:<null>) (offset:28)
               element: <testLibrary>::@mixin::A#1::@setter::x
               formalParameters
-                #F6 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:27)
+                #F6 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:28)
                   element: <testLibrary>::@mixin::A#1::@setter::x::@formalParameter::value
-        #F7 mixin A (nameOffset:38) (firstTokenOffset:32) (offset:38)
+        #F7 mixin A (nameOffset:40) (firstTokenOffset:34) (offset:40)
           element: <testLibrary>::@mixin::A#2
           fields
-            #F8 hasImplicitType hasInitializer isOriginDeclaration y (nameOffset:48) (firstTokenOffset:48) (offset:48)
+            #F8 hasImplicitType hasInitializer isOriginDeclaration y (nameOffset:50) (firstTokenOffset:50) (offset:50)
               element: <testLibrary>::@mixin::A#2::@field::y
           getters
-            #F9 isCompleteDeclaration isOriginVariable y (nameOffset:<null>) (firstTokenOffset:<null>) (offset:48)
+            #F9 isCompleteDeclaration isOriginVariable y (nameOffset:<null>) (firstTokenOffset:<null>) (offset:50)
               element: <testLibrary>::@mixin::A#2::@getter::y
           setters
-            #F10 isCompleteDeclaration isOriginVariable y (nameOffset:<null>) (firstTokenOffset:<null>) (offset:48)
+            #F10 isCompleteDeclaration isOriginVariable y (nameOffset:<null>) (firstTokenOffset:<null>) (offset:50)
               element: <testLibrary>::@mixin::A#2::@setter::y
               formalParameters
-                #F11 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:48)
+                #F11 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:50)
                   element: <testLibrary>::@mixin::A#2::@setter::y::@formalParameter::value
   mixins
     isSimplyBounded mixin A
diff --git a/pkg/analyzer/test/src/summary/elements/enum_test.dart b/pkg/analyzer/test/src/summary/elements/enum_test.dart
index 2d96b56..3a0e555 100644
--- a/pkg/analyzer/test/src/summary/elements/enum_test.dart
+++ b/pkg/analyzer/test/src/summary/elements/enum_test.dart
@@ -21,6 +21,7 @@
     var library = await buildLibrary(r'''
 enum E {
   v(#foo.bar);
+
   const E(Object _);
 }
 ''');
@@ -67,12 +68,12 @@
                   rightBracket: ] @0
                   staticType: List<E>
           constructors
-            #F4 isConst isOriginDeclaration new (nameOffset:<null>) (firstTokenOffset:26) (offset:32)
+            #F4 isConst isOriginDeclaration new (nameOffset:<null>) (firstTokenOffset:27) (offset:33)
               element: <testLibrary>::@enum::E::@constructor::new
               typeName: E
-              typeNameOffset: 32
+              typeNameOffset: 33
               formalParameters
-                #F5 requiredPositional isOriginDeclaration _ (nameOffset:41) (firstTokenOffset:34) (offset:41)
+                #F5 requiredPositional isOriginDeclaration _ (nameOffset:42) (firstTokenOffset:35) (offset:42)
                   element: <testLibrary>::@enum::E::@constructor::new::@formalParameter::_
           getters
             #F6 isCompleteDeclaration isOriginVariable isStatic v (nameOffset:<null>) (firstTokenOffset:<null>) (offset:11)
@@ -1125,15 +1126,17 @@
   }
 
   test_constant_documented() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 enum E {
   /**
    * aaa
    */
   a,
+
   /// bbb
-  b
-}''');
+  b,
+}
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -1159,7 +1162,7 @@
                     leftParenthesis: ( @0
                     rightParenthesis: ) @0
                   staticType: E
-            #F3 hasImplicitType hasInitializer isConst isEnumConstant isOriginDeclaration isStatic b (nameOffset:47) (firstTokenOffset:37) (offset:47)
+            #F3 hasImplicitType hasInitializer isConst isEnumConstant isOriginDeclaration isStatic b (nameOffset:48) (firstTokenOffset:38) (offset:48)
               element: <testLibrary>::@enum::E::@field::b
               documentationComment: /// bbb
               initializer: expression_1
@@ -1197,7 +1200,7 @@
           getters
             #F6 isCompleteDeclaration isOriginVariable isStatic a (nameOffset:<null>) (firstTokenOffset:<null>) (offset:32)
               element: <testLibrary>::@enum::E::@getter::a
-            #F7 isCompleteDeclaration isOriginVariable isStatic b (nameOffset:<null>) (firstTokenOffset:<null>) (offset:47)
+            #F7 isCompleteDeclaration isOriginVariable isStatic b (nameOffset:<null>) (firstTokenOffset:<null>) (offset:48)
               element: <testLibrary>::@enum::E::@getter::b
             #F8 isCompleteDeclaration isOriginVariable isStatic values (nameOffset:<null>) (firstTokenOffset:<null>) (offset:5)
               element: <testLibrary>::@enum::E::@getter::values
@@ -1258,13 +1261,14 @@
   }
 
   test_constant_documented_withMetadata() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 enum E {
   /**
    * aaa
    */
   @annotation
   a,
+
   /// bbb
   @annotation
   b,
@@ -1305,14 +1309,14 @@
                     leftParenthesis: ( @0
                     rightParenthesis: ) @0
                   staticType: E
-            #F3 hasImplicitType hasInitializer isConst isEnumConstant isOriginDeclaration isStatic b (nameOffset:75) (firstTokenOffset:51) (offset:75)
+            #F3 hasImplicitType hasInitializer isConst isEnumConstant isOriginDeclaration isStatic b (nameOffset:76) (firstTokenOffset:52) (offset:76)
               element: <testLibrary>::@enum::E::@field::b
               documentationComment: /// bbb
               metadata
                 Annotation
-                  atSign: @ @61
+                  atSign: @ @62
                   name: SimpleIdentifier
-                    token: annotation @62
+                    token: annotation @63
                     element: <testLibrary>::@getter::annotation
                     staticType: null
                   element: <testLibrary>::@getter::annotation
@@ -1351,19 +1355,19 @@
           getters
             #F6 isCompleteDeclaration isOriginVariable isStatic a (nameOffset:<null>) (firstTokenOffset:<null>) (offset:46)
               element: <testLibrary>::@enum::E::@getter::a
-            #F7 isCompleteDeclaration isOriginVariable isStatic b (nameOffset:<null>) (firstTokenOffset:<null>) (offset:75)
+            #F7 isCompleteDeclaration isOriginVariable isStatic b (nameOffset:<null>) (firstTokenOffset:<null>) (offset:76)
               element: <testLibrary>::@enum::E::@getter::b
             #F8 isCompleteDeclaration isOriginVariable isStatic values (nameOffset:<null>) (firstTokenOffset:<null>) (offset:5)
               element: <testLibrary>::@enum::E::@getter::values
       topLevelVariables
-        #F9 hasInitializer isConst isOriginDeclaration isStatic annotation (nameOffset:91) (firstTokenOffset:91) (offset:91)
+        #F9 hasInitializer isConst isOriginDeclaration isStatic annotation (nameOffset:92) (firstTokenOffset:92) (offset:92)
           element: <testLibrary>::@topLevelVariable::annotation
           initializer: expression_3
             IntegerLiteral
-              literal: 0 @104
+              literal: 0 @105
               staticType: int
       getters
-        #F10 isCompleteDeclaration isOriginVariable isStatic annotation (nameOffset:<null>) (firstTokenOffset:<null>) (offset:91)
+        #F10 isCompleteDeclaration isOriginVariable isStatic annotation (nameOffset:<null>) (firstTokenOffset:<null>) (offset:92)
           element: <testLibrary>::@getter::annotation
   enums
     isSimplyBounded enum E
@@ -1394,9 +1398,9 @@
           documentationComment: /// bbb
           metadata
             Annotation
-              atSign: @ @61
+              atSign: @ @62
               name: SimpleIdentifier
-                token: annotation @62
+                token: annotation @63
                 element: <testLibrary>::@getter::annotation
                 staticType: null
               element: <testLibrary>::@getter::annotation
@@ -1455,7 +1459,9 @@
   test_constant_inference() async {
     var library = await buildLibrary(r'''
 enum E<T> {
-  int(1), string('2');
+  int(1),
+  string('2');
+
   const E(T a);
 }
 ''');
@@ -1492,7 +1498,7 @@
                         staticType: int
                     rightParenthesis: ) @19
                   staticType: E<int>
-            #F4 hasImplicitType hasInitializer isConst isEnumConstant isOriginDeclaration isStatic string (nameOffset:22) (firstTokenOffset:22) (offset:22)
+            #F4 hasImplicitType hasInitializer isConst isEnumConstant isOriginDeclaration isStatic string (nameOffset:24) (firstTokenOffset:24) (offset:24)
               element: <testLibrary>::@enum::E::@field::string
               initializer: expression_1
                 InstanceCreationExpression
@@ -1505,11 +1511,11 @@
                       baseElement: <testLibrary>::@enum::E::@constructor::new
                       substitution: {T: String}
                   argumentList: ArgumentList
-                    leftParenthesis: ( @28
+                    leftParenthesis: ( @30
                     arguments
                       SimpleStringLiteral
-                        literal: '2' @29
-                    rightParenthesis: ) @32
+                        literal: '2' @31
+                    rightParenthesis: ) @34
                   staticType: E<String>
             #F5 isConst isOriginEnumValues isStatic values (nameOffset:<null>) (firstTokenOffset:<null>) (offset:5)
               element: <testLibrary>::@enum::E::@field::values
@@ -1528,17 +1534,17 @@
                   rightBracket: ] @0
                   staticType: List<E<dynamic>>
           constructors
-            #F6 isConst isOriginDeclaration new (nameOffset:<null>) (firstTokenOffset:37) (offset:43)
+            #F6 isConst isOriginDeclaration new (nameOffset:<null>) (firstTokenOffset:40) (offset:46)
               element: <testLibrary>::@enum::E::@constructor::new
               typeName: E
-              typeNameOffset: 43
+              typeNameOffset: 46
               formalParameters
-                #F7 requiredPositional isOriginDeclaration a (nameOffset:47) (firstTokenOffset:45) (offset:47)
+                #F7 requiredPositional isOriginDeclaration a (nameOffset:50) (firstTokenOffset:48) (offset:50)
                   element: <testLibrary>::@enum::E::@constructor::new::@formalParameter::a
           getters
             #F8 isCompleteDeclaration isOriginVariable isStatic int (nameOffset:<null>) (firstTokenOffset:<null>) (offset:14)
               element: <testLibrary>::@enum::E::@getter::int
-            #F9 isCompleteDeclaration isOriginVariable isStatic string (nameOffset:<null>) (firstTokenOffset:<null>) (offset:22)
+            #F9 isCompleteDeclaration isOriginVariable isStatic string (nameOffset:<null>) (firstTokenOffset:<null>) (offset:24)
               element: <testLibrary>::@enum::E::@getter::string
             #F10 isCompleteDeclaration isOriginVariable isStatic values (nameOffset:<null>) (firstTokenOffset:<null>) (offset:5)
               element: <testLibrary>::@enum::E::@getter::values
@@ -1604,7 +1610,14 @@
   }
 
   test_constant_metadata() async {
-    var library = await buildLibrary('const a = 42; enum E { @a v }');
+    var library = await buildLibrary(r'''
+const a = 42;
+
+enum E {
+  @a
+  v,
+}
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -1612,16 +1625,16 @@
     #F0 <testLibraryFragment>
       element: <testLibrary>
       enums
-        #F1 enum E (nameOffset:19) (firstTokenOffset:14) (offset:19)
+        #F1 enum E (nameOffset:20) (firstTokenOffset:15) (offset:20)
           element: <testLibrary>::@enum::E
           fields
-            #F2 hasImplicitType hasInitializer isConst isEnumConstant isOriginDeclaration isStatic v (nameOffset:26) (firstTokenOffset:23) (offset:26)
+            #F2 hasImplicitType hasInitializer isConst isEnumConstant isOriginDeclaration isStatic v (nameOffset:31) (firstTokenOffset:26) (offset:31)
               element: <testLibrary>::@enum::E::@field::v
               metadata
                 Annotation
-                  atSign: @ @23
+                  atSign: @ @26
                   name: SimpleIdentifier
-                    token: a @24
+                    token: a @27
                     element: <testLibrary>::@getter::a
                     staticType: null
                   element: <testLibrary>::@getter::a
@@ -1637,7 +1650,7 @@
                     leftParenthesis: ( @0
                     rightParenthesis: ) @0
                   staticType: E
-            #F3 isConst isOriginEnumValues isStatic values (nameOffset:<null>) (firstTokenOffset:<null>) (offset:19)
+            #F3 isConst isOriginEnumValues isStatic values (nameOffset:<null>) (firstTokenOffset:<null>) (offset:20)
               element: <testLibrary>::@enum::E::@field::values
               initializer: expression_1
                 ListLiteral
@@ -1650,13 +1663,13 @@
                   rightBracket: ] @0
                   staticType: List<E>
           constructors
-            #F4 isConst isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:19)
+            #F4 isConst isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:20)
               element: <testLibrary>::@enum::E::@constructor::new
               typeName: E
           getters
-            #F5 isCompleteDeclaration isOriginVariable isStatic v (nameOffset:<null>) (firstTokenOffset:<null>) (offset:26)
+            #F5 isCompleteDeclaration isOriginVariable isStatic v (nameOffset:<null>) (firstTokenOffset:<null>) (offset:31)
               element: <testLibrary>::@enum::E::@getter::v
-            #F6 isCompleteDeclaration isOriginVariable isStatic values (nameOffset:<null>) (firstTokenOffset:<null>) (offset:19)
+            #F6 isCompleteDeclaration isOriginVariable isStatic values (nameOffset:<null>) (firstTokenOffset:<null>) (offset:20)
               element: <testLibrary>::@enum::E::@getter::values
       topLevelVariables
         #F7 hasImplicitType hasInitializer isConst isOriginDeclaration isStatic a (nameOffset:6) (firstTokenOffset:6) (offset:6)
@@ -1679,9 +1692,9 @@
           firstFragment: #F2
           metadata
             Annotation
-              atSign: @ @23
+              atSign: @ @26
               name: SimpleIdentifier
-                token: a @24
+                token: a @27
                 element: <testLibrary>::@getter::a
                 staticType: null
               element: <testLibrary>::@getter::a
@@ -1733,16 +1746,18 @@
   }
 
   test_constant_metadata_instanceCreation() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class A {
   final dynamic value;
   const A(this.value);
 }
 
 enum E {
-  @A(100) a,
+  @A(100)
+  a,
   b,
-  @A(300) c,
+  @A(300)
+  c,
 }
 ''');
     checkElementText(library, r'''
@@ -1772,7 +1787,7 @@
         #F6 enum E (nameOffset:64) (firstTokenOffset:59) (offset:64)
           element: <testLibrary>::@enum::E
           fields
-            #F7 hasImplicitType hasInitializer isConst isEnumConstant isOriginDeclaration isStatic a (nameOffset:78) (firstTokenOffset:70) (offset:78)
+            #F7 hasImplicitType hasInitializer isConst isEnumConstant isOriginDeclaration isStatic a (nameOffset:80) (firstTokenOffset:70) (offset:80)
               element: <testLibrary>::@enum::E::@field::a
               metadata
                 Annotation
@@ -1801,7 +1816,7 @@
                     leftParenthesis: ( @0
                     rightParenthesis: ) @0
                   staticType: E
-            #F8 hasImplicitType hasInitializer isConst isEnumConstant isOriginDeclaration isStatic b (nameOffset:83) (firstTokenOffset:83) (offset:83)
+            #F8 hasImplicitType hasInitializer isConst isEnumConstant isOriginDeclaration isStatic b (nameOffset:85) (firstTokenOffset:85) (offset:85)
               element: <testLibrary>::@enum::E::@field::b
               initializer: expression_1
                 InstanceCreationExpression
@@ -1815,22 +1830,22 @@
                     leftParenthesis: ( @0
                     rightParenthesis: ) @0
                   staticType: E
-            #F9 hasImplicitType hasInitializer isConst isEnumConstant isOriginDeclaration isStatic c (nameOffset:96) (firstTokenOffset:88) (offset:96)
+            #F9 hasImplicitType hasInitializer isConst isEnumConstant isOriginDeclaration isStatic c (nameOffset:100) (firstTokenOffset:90) (offset:100)
               element: <testLibrary>::@enum::E::@field::c
               metadata
                 Annotation
-                  atSign: @ @88
+                  atSign: @ @90
                   name: SimpleIdentifier
-                    token: A @89
+                    token: A @91
                     element: <testLibrary>::@class::A
                     staticType: null
                   arguments: ArgumentList
-                    leftParenthesis: ( @90
+                    leftParenthesis: ( @92
                     arguments
                       IntegerLiteral
-                        literal: 300 @91
+                        literal: 300 @93
                         staticType: int
-                    rightParenthesis: ) @94
+                    rightParenthesis: ) @96
                   element: <testLibrary>::@class::A::@constructor::new
               initializer: expression_2
                 InstanceCreationExpression
@@ -1869,11 +1884,11 @@
               element: <testLibrary>::@enum::E::@constructor::new
               typeName: E
           getters
-            #F12 isCompleteDeclaration isOriginVariable isStatic a (nameOffset:<null>) (firstTokenOffset:<null>) (offset:78)
+            #F12 isCompleteDeclaration isOriginVariable isStatic a (nameOffset:<null>) (firstTokenOffset:<null>) (offset:80)
               element: <testLibrary>::@enum::E::@getter::a
-            #F13 isCompleteDeclaration isOriginVariable isStatic b (nameOffset:<null>) (firstTokenOffset:<null>) (offset:83)
+            #F13 isCompleteDeclaration isOriginVariable isStatic b (nameOffset:<null>) (firstTokenOffset:<null>) (offset:85)
               element: <testLibrary>::@enum::E::@getter::b
-            #F14 isCompleteDeclaration isOriginVariable isStatic c (nameOffset:<null>) (firstTokenOffset:<null>) (offset:96)
+            #F14 isCompleteDeclaration isOriginVariable isStatic c (nameOffset:<null>) (firstTokenOffset:<null>) (offset:100)
               element: <testLibrary>::@enum::E::@getter::c
             #F15 isCompleteDeclaration isOriginVariable isStatic values (nameOffset:<null>) (firstTokenOffset:<null>) (offset:64)
               element: <testLibrary>::@enum::E::@getter::values
@@ -1944,18 +1959,18 @@
           firstFragment: #F9
           metadata
             Annotation
-              atSign: @ @88
+              atSign: @ @90
               name: SimpleIdentifier
-                token: A @89
+                token: A @91
                 element: <testLibrary>::@class::A
                 staticType: null
               arguments: ArgumentList
-                leftParenthesis: ( @90
+                leftParenthesis: ( @92
                 arguments
                   IntegerLiteral
-                    literal: 300 @91
+                    literal: 300 @93
                     staticType: int
-                rightParenthesis: ) @94
+                rightParenthesis: ) @96
               element: <testLibrary>::@class::A::@constructor::new
           type: E
           constantInitializer
@@ -2003,7 +2018,7 @@
     var library = await buildLibrary(r'''
 enum E {
   @v
-  v
+  v,
 }
 ''');
     checkElementText(library, r'''
@@ -2110,7 +2125,9 @@
 
   test_constant_missingName() async {
     var library = await buildLibrary(r'''
-enum E {v,,}
+enum E {
+  v,,
+}
 ''');
     checkElementText(library, r'''
 library
@@ -2122,7 +2139,7 @@
         #F1 enum E (nameOffset:5) (firstTokenOffset:0) (offset:5)
           element: <testLibrary>::@enum::E
           fields
-            #F2 hasImplicitType hasInitializer isConst isEnumConstant isOriginDeclaration isStatic v (nameOffset:8) (firstTokenOffset:8) (offset:8)
+            #F2 hasImplicitType hasInitializer isConst isEnumConstant isOriginDeclaration isStatic v (nameOffset:11) (firstTokenOffset:11) (offset:11)
               element: <testLibrary>::@enum::E::@field::v
               initializer: expression_0
                 InstanceCreationExpression
@@ -2136,7 +2153,7 @@
                     leftParenthesis: ( @0
                     rightParenthesis: ) @0
                   staticType: E
-            #F3 hasImplicitType hasInitializer isConst isEnumConstant isOriginDeclaration isStatic <null-name> (nameOffset:<null>) (firstTokenOffset:10) (offset:10)
+            #F3 hasImplicitType hasInitializer isConst isEnumConstant isOriginDeclaration isStatic <null-name> (nameOffset:<null>) (firstTokenOffset:13) (offset:13)
               element: <testLibrary>::@enum::E::@field::#0
               initializer: expression_1
                 InstanceCreationExpression
@@ -2171,9 +2188,9 @@
               element: <testLibrary>::@enum::E::@constructor::new
               typeName: E
           getters
-            #F6 isCompleteDeclaration isOriginVariable isStatic v (nameOffset:<null>) (firstTokenOffset:<null>) (offset:8)
+            #F6 isCompleteDeclaration isOriginVariable isStatic v (nameOffset:<null>) (firstTokenOffset:<null>) (offset:11)
               element: <testLibrary>::@enum::E::@getter::v
-            #F7 isCompleteDeclaration isOriginVariable isStatic <null-name> (nameOffset:<null>) (firstTokenOffset:<null>) (offset:10)
+            #F7 isCompleteDeclaration isOriginVariable isStatic <null-name> (nameOffset:<null>) (firstTokenOffset:<null>) (offset:13)
               element: <testLibrary>::@enum::E::@getter::#1
             #F8 isCompleteDeclaration isOriginVariable isStatic values (nameOffset:<null>) (firstTokenOffset:<null>) (offset:5)
               element: <testLibrary>::@enum::E::@getter::values
@@ -2234,9 +2251,7 @@
   /// Test that a constant named `_name` renames the synthetic `name` field.
   test_constant_name() async {
     var library = await buildLibrary(r'''
-enum E {
-  _name;
-}
+enum E { _name }
 ''');
     checkElementText(library, r'''
 library
@@ -2248,7 +2263,7 @@
         #F1 enum E (nameOffset:5) (firstTokenOffset:0) (offset:5)
           element: <testLibrary>::@enum::E
           fields
-            #F2 hasImplicitType hasInitializer isConst isEnumConstant isOriginDeclaration isStatic _name (nameOffset:11) (firstTokenOffset:11) (offset:11)
+            #F2 hasImplicitType hasInitializer isConst isEnumConstant isOriginDeclaration isStatic _name (nameOffset:9) (firstTokenOffset:9) (offset:9)
               element: <testLibrary>::@enum::E::@field::_name
               initializer: expression_0
                 InstanceCreationExpression
@@ -2279,7 +2294,7 @@
               element: <testLibrary>::@enum::E::@constructor::new
               typeName: E
           getters
-            #F5 isCompleteDeclaration isOriginVariable isStatic _name (nameOffset:<null>) (firstTokenOffset:<null>) (offset:11)
+            #F5 isCompleteDeclaration isOriginVariable isStatic _name (nameOffset:<null>) (firstTokenOffset:<null>) (offset:9)
               element: <testLibrary>::@enum::E::@getter::_name
             #F6 isCompleteDeclaration isOriginVariable isStatic values (nameOffset:<null>) (firstTokenOffset:<null>) (offset:5)
               element: <testLibrary>::@enum::E::@getter::values
@@ -2328,6 +2343,7 @@
     var library = await buildLibrary(r'''
 enum E<T> {
   v<double>(42);
+
   const E(T a);
 }
 ''');
@@ -2385,12 +2401,12 @@
                   rightBracket: ] @0
                   staticType: List<E<dynamic>>
           constructors
-            #F5 isConst isOriginDeclaration new (nameOffset:<null>) (firstTokenOffset:31) (offset:37)
+            #F5 isConst isOriginDeclaration new (nameOffset:<null>) (firstTokenOffset:32) (offset:38)
               element: <testLibrary>::@enum::E::@constructor::new
               typeName: E
-              typeNameOffset: 37
+              typeNameOffset: 38
               formalParameters
-                #F6 requiredPositional isOriginDeclaration a (nameOffset:41) (firstTokenOffset:39) (offset:41)
+                #F6 requiredPositional isOriginDeclaration a (nameOffset:42) (firstTokenOffset:40) (offset:42)
                   element: <testLibrary>::@enum::E::@constructor::new::@formalParameter::a
           getters
             #F7 isCompleteDeclaration isOriginVariable isStatic v (nameOffset:<null>) (firstTokenOffset:<null>) (offset:14)
@@ -2446,10 +2462,8 @@
   }
 
   test_constant_underscore() async {
-    var library = await buildLibrary('''
-enum E {
-  _
-}
+    var library = await buildLibrary(r'''
+enum E { _ }
 ''');
     checkElementText(library, r'''
 library
@@ -2461,7 +2475,7 @@
         #F1 enum E (nameOffset:5) (firstTokenOffset:0) (offset:5)
           element: <testLibrary>::@enum::E
           fields
-            #F2 hasImplicitType hasInitializer isConst isEnumConstant isOriginDeclaration isStatic _ (nameOffset:11) (firstTokenOffset:11) (offset:11)
+            #F2 hasImplicitType hasInitializer isConst isEnumConstant isOriginDeclaration isStatic _ (nameOffset:9) (firstTokenOffset:9) (offset:9)
               element: <testLibrary>::@enum::E::@field::_
               initializer: expression_0
                 InstanceCreationExpression
@@ -2492,7 +2506,7 @@
               element: <testLibrary>::@enum::E::@constructor::new
               typeName: E
           getters
-            #F5 isCompleteDeclaration isOriginVariable isStatic _ (nameOffset:<null>) (firstTokenOffset:<null>) (offset:11)
+            #F5 isCompleteDeclaration isOriginVariable isStatic _ (nameOffset:<null>) (firstTokenOffset:<null>) (offset:9)
               element: <testLibrary>::@enum::E::@getter::_
             #F6 isCompleteDeclaration isOriginVariable isStatic values (nameOffset:<null>) (firstTokenOffset:<null>) (offset:5)
               element: <testLibrary>::@enum::E::@getter::values
@@ -2541,6 +2555,7 @@
     var library = await buildLibrary(r'''
 enum E() {
   v;
+
   this : assert(true);
 }
 ''');
@@ -2585,7 +2600,7 @@
               element: <testLibrary>::@enum::E::@constructor::new
               typeName: E
               typeNameOffset: 5
-              thisKeywordOffset: 18
+              thisKeywordOffset: 19
           getters
             #F5 isCompleteDeclaration isOriginVariable isStatic v (nameOffset:<null>) (firstTokenOffset:<null>) (offset:13)
               element: <testLibrary>::@enum::E::@getter::v
@@ -2619,12 +2634,12 @@
           firstFragment: #F4
           constantInitializers
             AssertInitializer
-              assertKeyword: assert @25
-              leftParenthesis: ( @31
+              assertKeyword: assert @26
+              leftParenthesis: ( @32
               condition: BooleanLiteral
-                literal: true @32
+                literal: true @33
                 staticType: bool
-              rightParenthesis: ) @36
+              rightParenthesis: ) @37
           superConstructor: dart:core::@class::Enum::@constructor::new
       getters
         isOriginVariable isStatic v
@@ -2644,6 +2659,7 @@
     var library = await buildLibrary(r'''
 enum E() {
   v;
+
   final int x;
   this : x = 0;
 }
@@ -2684,20 +2700,20 @@
                       staticType: E
                   rightBracket: ] @0
                   staticType: List<E>
-            #F4 isFinal isOriginDeclaration x (nameOffset:28) (firstTokenOffset:28) (offset:28)
+            #F4 isFinal isOriginDeclaration x (nameOffset:29) (firstTokenOffset:29) (offset:29)
               element: <testLibrary>::@enum::E::@field::x
           constructors
             #F5 isCompleteDeclaration isConst isOriginDeclaration isPrimary new (nameOffset:<null>) (firstTokenOffset:5) (offset:5)
               element: <testLibrary>::@enum::E::@constructor::new
               typeName: E
               typeNameOffset: 5
-              thisKeywordOffset: 33
+              thisKeywordOffset: 34
           getters
             #F6 isCompleteDeclaration isOriginVariable isStatic v (nameOffset:<null>) (firstTokenOffset:<null>) (offset:13)
               element: <testLibrary>::@enum::E::@getter::v
             #F7 isCompleteDeclaration isOriginVariable isStatic values (nameOffset:<null>) (firstTokenOffset:<null>) (offset:5)
               element: <testLibrary>::@enum::E::@getter::values
-            #F8 isCompleteDeclaration isOriginVariable x (nameOffset:<null>) (firstTokenOffset:<null>) (offset:28)
+            #F8 isCompleteDeclaration isOriginVariable x (nameOffset:<null>) (firstTokenOffset:<null>) (offset:29)
               element: <testLibrary>::@enum::E::@getter::x
   enums
     isSimplyBounded enum E
@@ -2733,12 +2749,12 @@
           constantInitializers
             ConstructorFieldInitializer
               fieldName: SimpleIdentifier
-                token: x @40
+                token: x @41
                 element: <testLibrary>::@enum::E::@field::x
                 staticType: null
-              equals: = @42
+              equals: = @43
               expression: IntegerLiteral
-                literal: 0 @44
+                literal: 0 @45
                 staticType: int
           superConstructor: dart:core::@class::Enum::@constructor::new
       getters
@@ -2764,6 +2780,7 @@
     var library = await buildLibrary(r'''
 enum E() {
   v;
+
   final int y;
   @Deprecated('0')
   this : y = 0;
@@ -2807,34 +2824,34 @@
                       staticType: E
                   rightBracket: ] @0
                   staticType: List<E>
-            #F4 isFinal isOriginDeclaration y (nameOffset:28) (firstTokenOffset:28) (offset:28)
+            #F4 isFinal isOriginDeclaration y (nameOffset:29) (firstTokenOffset:29) (offset:29)
               element: <testLibrary>::@enum::E::@field::y
           constructors
             #F5 isCompleteDeclaration isConst isOriginDeclaration isPrimary new (nameOffset:<null>) (firstTokenOffset:5) (offset:5)
               element: <testLibrary>::@enum::E::@constructor::new
               metadata
                 Annotation
-                  atSign: @ @33
+                  atSign: @ @34
                   name: SimpleIdentifier
-                    token: Deprecated @34
+                    token: Deprecated @35
                     element: dart:core::@class::Deprecated
                     staticType: null
                   arguments: ArgumentList
-                    leftParenthesis: ( @44
+                    leftParenthesis: ( @45
                     arguments
                       SimpleStringLiteral
-                        literal: '0' @45
-                    rightParenthesis: ) @48
+                        literal: '0' @46
+                    rightParenthesis: ) @49
                   element: dart:core::@class::Deprecated::@constructor::new
               typeName: E
               typeNameOffset: 5
-              thisKeywordOffset: 52
+              thisKeywordOffset: 53
           getters
             #F6 isCompleteDeclaration isOriginVariable isStatic v (nameOffset:<null>) (firstTokenOffset:<null>) (offset:13)
               element: <testLibrary>::@enum::E::@getter::v
             #F7 isCompleteDeclaration isOriginVariable isStatic values (nameOffset:<null>) (firstTokenOffset:<null>) (offset:5)
               element: <testLibrary>::@enum::E::@getter::values
-            #F8 isCompleteDeclaration isOriginVariable y (nameOffset:<null>) (firstTokenOffset:<null>) (offset:28)
+            #F8 isCompleteDeclaration isOriginVariable y (nameOffset:<null>) (firstTokenOffset:<null>) (offset:29)
               element: <testLibrary>::@enum::E::@getter::y
   enums
     isSimplyBounded enum E
@@ -2869,27 +2886,27 @@
           firstFragment: #F5
           metadata
             Annotation
-              atSign: @ @33
+              atSign: @ @34
               name: SimpleIdentifier
-                token: Deprecated @34
+                token: Deprecated @35
                 element: dart:core::@class::Deprecated
                 staticType: null
               arguments: ArgumentList
-                leftParenthesis: ( @44
+                leftParenthesis: ( @45
                 arguments
                   SimpleStringLiteral
-                    literal: '0' @45
-                rightParenthesis: ) @48
+                    literal: '0' @46
+                rightParenthesis: ) @49
               element: dart:core::@class::Deprecated::@constructor::new
           constantInitializers
             ConstructorFieldInitializer
               fieldName: SimpleIdentifier
-                token: y @59
+                token: y @60
                 element: <testLibrary>::@enum::E::@field::y
                 staticType: null
-              equals: = @61
+              equals: = @62
               expression: IntegerLiteral
-                literal: 0 @63
+                literal: 0 @64
                 staticType: int
           superConstructor: dart:core::@class::Enum::@constructor::new
       getters
@@ -2915,6 +2932,7 @@
     var library = await buildLibrary(r'''
 enum E(int x) {
   v(0);
+
   @deprecated
   this;
 }
@@ -2964,15 +2982,15 @@
               element: <testLibrary>::@enum::E::@constructor::new
               metadata
                 Annotation
-                  atSign: @ @26
+                  atSign: @ @27
                   name: SimpleIdentifier
-                    token: deprecated @27
+                    token: deprecated @28
                     element: dart:core::@getter::deprecated
                     staticType: null
                   element: dart:core::@getter::deprecated
               typeName: E
               typeNameOffset: 5
-              thisKeywordOffset: 40
+              thisKeywordOffset: 41
               formalParameters
                 #F5 requiredPositional isOriginDeclaration x (nameOffset:11) (firstTokenOffset:7) (offset:11)
                   element: <testLibrary>::@enum::E::@constructor::new::@formalParameter::x
@@ -3009,9 +3027,9 @@
           firstFragment: #F4
           metadata
             Annotation
-              atSign: @ @26
+              atSign: @ @27
               name: SimpleIdentifier
-                token: deprecated @27
+                token: deprecated @28
                 element: dart:core::@getter::deprecated
                 staticType: null
               element: dart:core::@getter::deprecated
@@ -3038,6 +3056,7 @@
     var library = await buildLibrary(r'''
 enum E.named() {
   v.named();
+
   this : assert(true);
 }
 ''');
@@ -3088,7 +3107,7 @@
               typeName: E
               typeNameOffset: 5
               periodOffset: 6
-              thisKeywordOffset: 32
+              thisKeywordOffset: 33
           getters
             #F5 isCompleteDeclaration isOriginVariable isStatic v (nameOffset:<null>) (firstTokenOffset:<null>) (offset:19)
               element: <testLibrary>::@enum::E::@getter::v
@@ -3122,12 +3141,12 @@
           firstFragment: #F4
           constantInitializers
             AssertInitializer
-              assertKeyword: assert @39
-              leftParenthesis: ( @45
+              assertKeyword: assert @40
+              leftParenthesis: ( @46
               condition: BooleanLiteral
-                literal: true @46
+                literal: true @47
                 staticType: bool
-              rightParenthesis: ) @50
+              rightParenthesis: ) @51
           superConstructor: dart:core::@class::Enum::@constructor::new
       getters
         isOriginVariable isStatic v
@@ -3147,6 +3166,7 @@
     var library = await buildLibrary(r'''
 enum E {
   v;
+
   this : assert(true);
 }
 ''');
@@ -3240,6 +3260,7 @@
     var library = await buildLibrary(r'''
 enum E() {
   v;
+
   this : assert(true);
 }
 ''');
@@ -3284,7 +3305,7 @@
               element: <testLibrary>::@enum::E::@constructor::new
               typeName: E
               typeNameOffset: 5
-              thisKeywordOffset: 18
+              thisKeywordOffset: 19
           getters
             #F5 isCompleteDeclaration isOriginVariable isStatic v (nameOffset:<null>) (firstTokenOffset:<null>) (offset:13)
               element: <testLibrary>::@enum::E::@getter::v
@@ -3318,12 +3339,12 @@
           firstFragment: #F4
           constantInitializers
             AssertInitializer
-              assertKeyword: assert @25
-              leftParenthesis: ( @31
+              assertKeyword: assert @26
+              leftParenthesis: ( @32
               condition: BooleanLiteral
-                literal: true @32
+                literal: true @33
                 staticType: bool
-              rightParenthesis: ) @36
+              rightParenthesis: ) @37
           superConstructor: dart:core::@class::Enum::@constructor::new
       getters
         isOriginVariable isStatic v
@@ -3343,6 +3364,7 @@
     var library = await buildLibrary(r'''
 enum E(int x) {
   v(1);
+
   this : assert(x > 0);
 }
 ''');
@@ -3391,7 +3413,7 @@
               element: <testLibrary>::@enum::E::@constructor::new
               typeName: E
               typeNameOffset: 5
-              thisKeywordOffset: 26
+              thisKeywordOffset: 27
               formalParameters
                 #F5 requiredPositional isOriginDeclaration x (nameOffset:11) (firstTokenOffset:7) (offset:11)
                   element: <testLibrary>::@enum::E::@constructor::new::@formalParameter::x
@@ -3432,21 +3454,21 @@
               type: int
           constantInitializers
             AssertInitializer
-              assertKeyword: assert @33
-              leftParenthesis: ( @39
+              assertKeyword: assert @34
+              leftParenthesis: ( @40
               condition: BinaryExpression
                 leftOperand: SimpleIdentifier
-                  token: x @40
+                  token: x @41
                   element: <testLibrary>::@enum::E::@constructor::new::@formalParameter::x
                   staticType: int
-                operator: > @42
+                operator: > @43
                 rightOperand: IntegerLiteral
-                  literal: 0 @44
+                  literal: 0 @45
                   staticType: int
                 element: dart:core::@class::num::@method::>
                 staticInvokeType: bool Function(num)
                 staticType: bool
-              rightParenthesis: ) @45
+              rightParenthesis: ) @46
           superConstructor: dart:core::@class::Enum::@constructor::new
       getters
         isOriginVariable isStatic v
@@ -3463,8 +3485,10 @@
   }
 
   test_constructor_primary_declaringFormalParameter_optionalNamed_simple_final() async {
-    var library = await buildLibrary('''
-enum A({final int? foo}) {v(foo: 0)}
+    var library = await buildLibrary(r'''
+enum A({final int? foo}) {
+  v(foo: 0)
+}
 ''');
     checkElementText(library, r'''
 library
@@ -3476,7 +3500,7 @@
         #F1 enum A (nameOffset:5) (firstTokenOffset:0) (offset:5)
           element: <testLibrary>::@enum::A
           fields
-            #F2 hasImplicitType hasInitializer isConst isEnumConstant isOriginDeclaration isStatic v (nameOffset:26) (firstTokenOffset:26) (offset:26)
+            #F2 hasImplicitType hasInitializer isConst isEnumConstant isOriginDeclaration isStatic v (nameOffset:29) (firstTokenOffset:29) (offset:29)
               element: <testLibrary>::@enum::A::@field::v
               initializer: expression_0
                 InstanceCreationExpression
@@ -3487,15 +3511,15 @@
                       type: A
                     element: <testLibrary>::@enum::A::@constructor::new
                   argumentList: ArgumentList
-                    leftParenthesis: ( @27
+                    leftParenthesis: ( @30
                     arguments
                       NamedArgument
-                        name: foo @28
-                        colon: : @31
+                        name: foo @31
+                        colon: : @34
                         argumentExpression: IntegerLiteral
-                          literal: 0 @33
+                          literal: 0 @36
                           staticType: int
-                    rightParenthesis: ) @34
+                    rightParenthesis: ) @37
                   staticType: A
             #F3 isConst isOriginEnumValues isStatic values (nameOffset:<null>) (firstTokenOffset:<null>) (offset:5)
               element: <testLibrary>::@enum::A::@field::values
@@ -3520,7 +3544,7 @@
                 #F6 optionalNamed isDeclaring isFinal isOriginDeclaration this.foo (nameOffset:19) (firstTokenOffset:8) (offset:19)
                   element: <testLibrary>::@enum::A::@constructor::new::@formalParameter::foo
           getters
-            #F7 isCompleteDeclaration isOriginVariable isStatic v (nameOffset:<null>) (firstTokenOffset:<null>) (offset:26)
+            #F7 isCompleteDeclaration isOriginVariable isStatic v (nameOffset:<null>) (firstTokenOffset:<null>) (offset:29)
               element: <testLibrary>::@enum::A::@getter::v
             #F8 isCompleteDeclaration isOriginVariable isStatic values (nameOffset:<null>) (firstTokenOffset:<null>) (offset:5)
               element: <testLibrary>::@enum::A::@getter::values
@@ -3584,8 +3608,10 @@
   }
 
   test_constructor_primary_declaringFormalParameter_optionalPositional_simple_final() async {
-    var library = await buildLibrary('''
-enum A([final int? foo]) {v(0)}
+    var library = await buildLibrary(r'''
+enum A([final int? foo]) {
+  v(0)
+}
 ''');
     checkElementText(library, r'''
 library
@@ -3597,7 +3623,7 @@
         #F1 enum A (nameOffset:5) (firstTokenOffset:0) (offset:5)
           element: <testLibrary>::@enum::A
           fields
-            #F2 hasImplicitType hasInitializer isConst isEnumConstant isOriginDeclaration isStatic v (nameOffset:26) (firstTokenOffset:26) (offset:26)
+            #F2 hasImplicitType hasInitializer isConst isEnumConstant isOriginDeclaration isStatic v (nameOffset:29) (firstTokenOffset:29) (offset:29)
               element: <testLibrary>::@enum::A::@field::v
               initializer: expression_0
                 InstanceCreationExpression
@@ -3608,12 +3634,12 @@
                       type: A
                     element: <testLibrary>::@enum::A::@constructor::new
                   argumentList: ArgumentList
-                    leftParenthesis: ( @27
+                    leftParenthesis: ( @30
                     arguments
                       IntegerLiteral
-                        literal: 0 @28
+                        literal: 0 @31
                         staticType: int
-                    rightParenthesis: ) @29
+                    rightParenthesis: ) @32
                   staticType: A
             #F3 isConst isOriginEnumValues isStatic values (nameOffset:<null>) (firstTokenOffset:<null>) (offset:5)
               element: <testLibrary>::@enum::A::@field::values
@@ -3638,7 +3664,7 @@
                 #F6 optionalPositional isDeclaring isFinal isOriginDeclaration this.foo (nameOffset:19) (firstTokenOffset:8) (offset:19)
                   element: <testLibrary>::@enum::A::@constructor::new::@formalParameter::foo
           getters
-            #F7 isCompleteDeclaration isOriginVariable isStatic v (nameOffset:<null>) (firstTokenOffset:<null>) (offset:26)
+            #F7 isCompleteDeclaration isOriginVariable isStatic v (nameOffset:<null>) (firstTokenOffset:<null>) (offset:29)
               element: <testLibrary>::@enum::A::@getter::v
             #F8 isCompleteDeclaration isOriginVariable isStatic values (nameOffset:<null>) (firstTokenOffset:<null>) (offset:5)
               element: <testLibrary>::@enum::A::@getter::values
@@ -3702,8 +3728,10 @@
   }
 
   test_constructor_primary_declaringFormalParameter_requiredNamed_simple_final() async {
-    var library = await buildLibrary('''
-enum A({required final int foo}) {v(foo: 0)}
+    var library = await buildLibrary(r'''
+enum A({required final int foo}) {
+  v(foo: 0)
+}
 ''');
     checkElementText(library, r'''
 library
@@ -3715,7 +3743,7 @@
         #F1 enum A (nameOffset:5) (firstTokenOffset:0) (offset:5)
           element: <testLibrary>::@enum::A
           fields
-            #F2 hasImplicitType hasInitializer isConst isEnumConstant isOriginDeclaration isStatic v (nameOffset:34) (firstTokenOffset:34) (offset:34)
+            #F2 hasImplicitType hasInitializer isConst isEnumConstant isOriginDeclaration isStatic v (nameOffset:37) (firstTokenOffset:37) (offset:37)
               element: <testLibrary>::@enum::A::@field::v
               initializer: expression_0
                 InstanceCreationExpression
@@ -3726,15 +3754,15 @@
                       type: A
                     element: <testLibrary>::@enum::A::@constructor::new
                   argumentList: ArgumentList
-                    leftParenthesis: ( @35
+                    leftParenthesis: ( @38
                     arguments
                       NamedArgument
-                        name: foo @36
-                        colon: : @39
+                        name: foo @39
+                        colon: : @42
                         argumentExpression: IntegerLiteral
-                          literal: 0 @41
+                          literal: 0 @44
                           staticType: int
-                    rightParenthesis: ) @42
+                    rightParenthesis: ) @45
                   staticType: A
             #F3 isConst isOriginEnumValues isStatic values (nameOffset:<null>) (firstTokenOffset:<null>) (offset:5)
               element: <testLibrary>::@enum::A::@field::values
@@ -3759,7 +3787,7 @@
                 #F6 requiredNamed isDeclaring isFinal isOriginDeclaration this.foo (nameOffset:27) (firstTokenOffset:8) (offset:27)
                   element: <testLibrary>::@enum::A::@constructor::new::@formalParameter::foo
           getters
-            #F7 isCompleteDeclaration isOriginVariable isStatic v (nameOffset:<null>) (firstTokenOffset:<null>) (offset:34)
+            #F7 isCompleteDeclaration isOriginVariable isStatic v (nameOffset:<null>) (firstTokenOffset:<null>) (offset:37)
               element: <testLibrary>::@enum::A::@getter::v
             #F8 isCompleteDeclaration isOriginVariable isStatic values (nameOffset:<null>) (firstTokenOffset:<null>) (offset:5)
               element: <testLibrary>::@enum::A::@getter::values
@@ -3827,8 +3855,7 @@
 enum A(
   /// first
   /// second
-  @deprecated
-  final void foo(),
+  @deprecated final void foo(),
 ) {
   v();
 }
@@ -3843,7 +3870,7 @@
         #F1 enum A (nameOffset:5) (firstTokenOffset:0) (offset:5)
           element: <testLibrary>::@enum::A
           fields
-            #F2 hasImplicitType hasInitializer isConst isEnumConstant isOriginDeclaration isStatic v (nameOffset:73) (firstTokenOffset:73) (offset:73)
+            #F2 hasImplicitType hasInitializer isConst isEnumConstant isOriginDeclaration isStatic v (nameOffset:71) (firstTokenOffset:71) (offset:71)
               element: <testLibrary>::@enum::A::@field::v
               initializer: expression_0
                 InstanceCreationExpression
@@ -3854,8 +3881,8 @@
                       type: A
                     element: <testLibrary>::@enum::A::@constructor::new
                   argumentList: ArgumentList
-                    leftParenthesis: ( @74
-                    rightParenthesis: ) @75
+                    leftParenthesis: ( @72
+                    rightParenthesis: ) @73
                   staticType: A
             #F3 isConst isOriginEnumValues isStatic values (nameOffset:<null>) (firstTokenOffset:<null>) (offset:5)
               element: <testLibrary>::@enum::A::@field::values
@@ -3877,7 +3904,7 @@
               typeName: A
               typeNameOffset: 5
               formalParameters
-                #F6 requiredPositional isDeclaring isFinal isOriginDeclaration this.foo (nameOffset:60) (firstTokenOffset:10) (offset:60)
+                #F6 requiredPositional isDeclaring isFinal isOriginDeclaration this.foo (nameOffset:58) (firstTokenOffset:10) (offset:58)
                   element: <testLibrary>::@enum::A::@constructor::new::@formalParameter::foo
                   documentationComment: /// first\n/// second
                   metadata
@@ -3889,7 +3916,7 @@
                         staticType: null
                       element: dart:core::@getter::deprecated
           getters
-            #F7 isCompleteDeclaration isOriginVariable isStatic v (nameOffset:<null>) (firstTokenOffset:<null>) (offset:73)
+            #F7 isCompleteDeclaration isOriginVariable isStatic v (nameOffset:<null>) (firstTokenOffset:<null>) (offset:71)
               element: <testLibrary>::@enum::A::@getter::v
             #F8 isCompleteDeclaration isOriginVariable isStatic values (nameOffset:<null>) (firstTokenOffset:<null>) (offset:5)
               element: <testLibrary>::@enum::A::@getter::values
@@ -3975,8 +4002,7 @@
 enum A(
   /// first
   /// second
-  @deprecated
-  final int foo,
+  @deprecated final int foo,
 ) {
   v(0)
 }
@@ -3991,7 +4017,7 @@
         #F1 enum A (nameOffset:5) (firstTokenOffset:0) (offset:5)
           element: <testLibrary>::@enum::A
           fields
-            #F2 hasImplicitType hasInitializer isConst isEnumConstant isOriginDeclaration isStatic v (nameOffset:70) (firstTokenOffset:70) (offset:70)
+            #F2 hasImplicitType hasInitializer isConst isEnumConstant isOriginDeclaration isStatic v (nameOffset:68) (firstTokenOffset:68) (offset:68)
               element: <testLibrary>::@enum::A::@field::v
               initializer: expression_0
                 InstanceCreationExpression
@@ -4002,12 +4028,12 @@
                       type: A
                     element: <testLibrary>::@enum::A::@constructor::new
                   argumentList: ArgumentList
-                    leftParenthesis: ( @71
+                    leftParenthesis: ( @69
                     arguments
                       IntegerLiteral
-                        literal: 0 @72
+                        literal: 0 @70
                         staticType: int
-                    rightParenthesis: ) @73
+                    rightParenthesis: ) @71
                   staticType: A
             #F3 isConst isOriginEnumValues isStatic values (nameOffset:<null>) (firstTokenOffset:<null>) (offset:5)
               element: <testLibrary>::@enum::A::@field::values
@@ -4029,7 +4055,7 @@
               typeName: A
               typeNameOffset: 5
               formalParameters
-                #F6 requiredPositional isDeclaring isFinal isOriginDeclaration this.foo (nameOffset:59) (firstTokenOffset:10) (offset:59)
+                #F6 requiredPositional isDeclaring isFinal isOriginDeclaration this.foo (nameOffset:57) (firstTokenOffset:10) (offset:57)
                   element: <testLibrary>::@enum::A::@constructor::new::@formalParameter::foo
                   documentationComment: /// first\n/// second
                   metadata
@@ -4041,7 +4067,7 @@
                         staticType: null
                       element: dart:core::@getter::deprecated
           getters
-            #F7 isCompleteDeclaration isOriginVariable isStatic v (nameOffset:<null>) (firstTokenOffset:<null>) (offset:70)
+            #F7 isCompleteDeclaration isOriginVariable isStatic v (nameOffset:<null>) (firstTokenOffset:<null>) (offset:68)
               element: <testLibrary>::@enum::A::@getter::v
             #F8 isCompleteDeclaration isOriginVariable isStatic values (nameOffset:<null>) (firstTokenOffset:<null>) (offset:5)
               element: <testLibrary>::@enum::A::@getter::values
@@ -4123,8 +4149,10 @@
   }
 
   test_constructor_primary_declaringFormalParameter_requiredPositional_simple_var() async {
-    var library = await buildLibrary('''
-enum A(var int foo) {v(0)}
+    var library = await buildLibrary(r'''
+enum A(var int foo) {
+  v(0)
+}
 ''');
     checkElementText(library, r'''
 library
@@ -4136,7 +4164,7 @@
         #F1 enum A (nameOffset:5) (firstTokenOffset:0) (offset:5)
           element: <testLibrary>::@enum::A
           fields
-            #F2 hasImplicitType hasInitializer isConst isEnumConstant isOriginDeclaration isStatic v (nameOffset:21) (firstTokenOffset:21) (offset:21)
+            #F2 hasImplicitType hasInitializer isConst isEnumConstant isOriginDeclaration isStatic v (nameOffset:24) (firstTokenOffset:24) (offset:24)
               element: <testLibrary>::@enum::A::@field::v
               initializer: expression_0
                 InstanceCreationExpression
@@ -4147,12 +4175,12 @@
                       type: A
                     element: <testLibrary>::@enum::A::@constructor::new
                   argumentList: ArgumentList
-                    leftParenthesis: ( @22
+                    leftParenthesis: ( @25
                     arguments
                       IntegerLiteral
-                        literal: 0 @23
+                        literal: 0 @26
                         staticType: int
-                    rightParenthesis: ) @24
+                    rightParenthesis: ) @27
                   staticType: A
             #F3 isConst isOriginEnumValues isStatic values (nameOffset:<null>) (firstTokenOffset:<null>) (offset:5)
               element: <testLibrary>::@enum::A::@field::values
@@ -4177,7 +4205,7 @@
                 #F6 requiredPositional isDeclaring isFinal isOriginDeclaration this.foo (nameOffset:15) (firstTokenOffset:7) (offset:15)
                   element: <testLibrary>::@enum::A::@constructor::new::@formalParameter::foo
           getters
-            #F7 isCompleteDeclaration isOriginVariable isStatic v (nameOffset:<null>) (firstTokenOffset:<null>) (offset:21)
+            #F7 isCompleteDeclaration isOriginVariable isStatic v (nameOffset:<null>) (firstTokenOffset:<null>) (offset:24)
               element: <testLibrary>::@enum::A::@getter::v
             #F8 isCompleteDeclaration isOriginVariable isStatic values (nameOffset:<null>) (firstTokenOffset:<null>) (offset:5)
               element: <testLibrary>::@enum::A::@getter::values
@@ -4258,11 +4286,14 @@
   }
 
   test_constructor_primary_declaringFormalParameter_requiredPositional_type_fromField_inferred() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class A {
   int get foo => 0;
 }
-enum B(final foo) implements A {v(0)}
+
+enum B(final foo) implements A {
+  v(0)
+}
 ''');
     checkElementText(library, r'''
 library
@@ -4284,10 +4315,10 @@
             #F4 isCompleteDeclaration isOriginDeclaration foo (nameOffset:20) (firstTokenOffset:12) (offset:20)
               element: <testLibrary>::@class::A::@getter::foo
       enums
-        #F5 enum B (nameOffset:37) (firstTokenOffset:32) (offset:37)
+        #F5 enum B (nameOffset:38) (firstTokenOffset:33) (offset:38)
           element: <testLibrary>::@enum::B
           fields
-            #F6 hasImplicitType hasInitializer isConst isEnumConstant isOriginDeclaration isStatic v (nameOffset:64) (firstTokenOffset:64) (offset:64)
+            #F6 hasImplicitType hasInitializer isConst isEnumConstant isOriginDeclaration isStatic v (nameOffset:68) (firstTokenOffset:68) (offset:68)
               element: <testLibrary>::@enum::B::@field::v
               initializer: expression_0
                 InstanceCreationExpression
@@ -4298,14 +4329,14 @@
                       type: B
                     element: <testLibrary>::@enum::B::@constructor::new
                   argumentList: ArgumentList
-                    leftParenthesis: ( @65
+                    leftParenthesis: ( @69
                     arguments
                       IntegerLiteral
-                        literal: 0 @66
+                        literal: 0 @70
                         staticType: int
-                    rightParenthesis: ) @67
+                    rightParenthesis: ) @71
                   staticType: B
-            #F7 isConst isOriginEnumValues isStatic values (nameOffset:<null>) (firstTokenOffset:<null>) (offset:37)
+            #F7 isConst isOriginEnumValues isStatic values (nameOffset:<null>) (firstTokenOffset:<null>) (offset:38)
               element: <testLibrary>::@enum::B::@field::values
               initializer: expression_1
                 ListLiteral
@@ -4317,22 +4348,22 @@
                       staticType: B
                   rightBracket: ] @0
                   staticType: List<B>
-            #F8 hasImplicitType isFinal isOriginDeclaringFormalParameter foo (nameOffset:<null>) (firstTokenOffset:<null>) (offset:37)
+            #F8 hasImplicitType isFinal isOriginDeclaringFormalParameter foo (nameOffset:<null>) (firstTokenOffset:<null>) (offset:38)
               element: <testLibrary>::@enum::B::@field::foo
           constructors
-            #F9 isCompleteDeclaration isConst isOriginDeclaration isPrimary new (nameOffset:<null>) (firstTokenOffset:37) (offset:37)
+            #F9 isCompleteDeclaration isConst isOriginDeclaration isPrimary new (nameOffset:<null>) (firstTokenOffset:38) (offset:38)
               element: <testLibrary>::@enum::B::@constructor::new
               typeName: B
-              typeNameOffset: 37
+              typeNameOffset: 38
               formalParameters
-                #F10 requiredPositional hasImplicitType isDeclaring isFinal isOriginDeclaration this.foo (nameOffset:45) (firstTokenOffset:39) (offset:45)
+                #F10 requiredPositional hasImplicitType isDeclaring isFinal isOriginDeclaration this.foo (nameOffset:46) (firstTokenOffset:40) (offset:46)
                   element: <testLibrary>::@enum::B::@constructor::new::@formalParameter::foo
           getters
-            #F11 isCompleteDeclaration isOriginVariable isStatic v (nameOffset:<null>) (firstTokenOffset:<null>) (offset:64)
+            #F11 isCompleteDeclaration isOriginVariable isStatic v (nameOffset:<null>) (firstTokenOffset:<null>) (offset:68)
               element: <testLibrary>::@enum::B::@getter::v
-            #F12 isCompleteDeclaration isOriginVariable isStatic values (nameOffset:<null>) (firstTokenOffset:<null>) (offset:37)
+            #F12 isCompleteDeclaration isOriginVariable isStatic values (nameOffset:<null>) (firstTokenOffset:<null>) (offset:38)
               element: <testLibrary>::@enum::B::@getter::values
-            #F13 isCompleteDeclaration isOriginVariable foo (nameOffset:<null>) (firstTokenOffset:<null>) (offset:37)
+            #F13 isCompleteDeclaration isOriginVariable foo (nameOffset:<null>) (firstTokenOffset:<null>) (offset:38)
               element: <testLibrary>::@enum::B::@getter::foo
   classes
     isSimplyBounded class A
@@ -4414,8 +4445,10 @@
   }
 
   test_constructor_primary_declaringFormalParameter_requiredPositional_type_typeParameter() async {
-    var library = await buildLibrary('''
-enum A<T>(final T foo) {v(0)}
+    var library = await buildLibrary(r'''
+enum A<T>(final T foo) {
+  v(0)
+}
 ''');
     checkElementText(library, r'''
 library
@@ -4430,7 +4463,7 @@
             #F2 T (nameOffset:7) (firstTokenOffset:7) (offset:7)
               element: #E0 T
           fields
-            #F3 hasImplicitType hasInitializer isConst isEnumConstant isOriginDeclaration isStatic v (nameOffset:24) (firstTokenOffset:24) (offset:24)
+            #F3 hasImplicitType hasInitializer isConst isEnumConstant isOriginDeclaration isStatic v (nameOffset:27) (firstTokenOffset:27) (offset:27)
               element: <testLibrary>::@enum::A::@field::v
               initializer: expression_0
                 InstanceCreationExpression
@@ -4443,12 +4476,12 @@
                       baseElement: <testLibrary>::@enum::A::@constructor::new
                       substitution: {T: int}
                   argumentList: ArgumentList
-                    leftParenthesis: ( @25
+                    leftParenthesis: ( @28
                     arguments
                       IntegerLiteral
-                        literal: 0 @26
+                        literal: 0 @29
                         staticType: int
-                    rightParenthesis: ) @27
+                    rightParenthesis: ) @30
                   staticType: A<int>
             #F4 isConst isOriginEnumValues isStatic values (nameOffset:<null>) (firstTokenOffset:<null>) (offset:5)
               element: <testLibrary>::@enum::A::@field::values
@@ -4473,7 +4506,7 @@
                 #F7 requiredPositional isDeclaring isFinal isOriginDeclaration this.foo (nameOffset:18) (firstTokenOffset:10) (offset:18)
                   element: <testLibrary>::@enum::A::@constructor::new::@formalParameter::foo
           getters
-            #F8 isCompleteDeclaration isOriginVariable isStatic v (nameOffset:<null>) (firstTokenOffset:<null>) (offset:24)
+            #F8 isCompleteDeclaration isOriginVariable isStatic v (nameOffset:<null>) (firstTokenOffset:<null>) (offset:27)
               element: <testLibrary>::@enum::A::@getter::v
             #F9 isCompleteDeclaration isOriginVariable isStatic values (nameOffset:<null>) (firstTokenOffset:<null>) (offset:5)
               element: <testLibrary>::@enum::A::@getter::values
@@ -4540,9 +4573,10 @@
   }
 
   test_constructor_primary_formalParameter_field_requiredPositional() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 enum A(this.foo) {
   v(0);
+
   final int foo;
 }
 ''');
@@ -4586,7 +4620,7 @@
                       staticType: A
                   rightBracket: ] @0
                   staticType: List<A>
-            #F4 isFinal isOriginDeclaration foo (nameOffset:39) (firstTokenOffset:39) (offset:39)
+            #F4 isFinal isOriginDeclaration foo (nameOffset:40) (firstTokenOffset:40) (offset:40)
               element: <testLibrary>::@enum::A::@field::foo
           constructors
             #F5 isCompleteDeclaration isConst isOriginDeclaration isPrimary new (nameOffset:<null>) (firstTokenOffset:5) (offset:5)
@@ -4601,7 +4635,7 @@
               element: <testLibrary>::@enum::A::@getter::v
             #F8 isCompleteDeclaration isOriginVariable isStatic values (nameOffset:<null>) (firstTokenOffset:<null>) (offset:5)
               element: <testLibrary>::@enum::A::@getter::values
-            #F9 isCompleteDeclaration isOriginVariable foo (nameOffset:<null>) (firstTokenOffset:<null>) (offset:39)
+            #F9 isCompleteDeclaration isOriginVariable foo (nameOffset:<null>) (firstTokenOffset:<null>) (offset:40)
               element: <testLibrary>::@enum::A::@getter::foo
   enums
     isSimplyBounded enum A
@@ -4660,8 +4694,10 @@
   }
 
   test_constructor_primary_formalParameter_regular_requiredPositional_functionTypedSuffix() async {
-    var library = await buildLibrary('''
-enum A(int foo()) {v(0)}
+    var library = await buildLibrary(r'''
+enum A(int foo()) {
+  v(0)
+}
 ''');
     checkElementText(library, r'''
 library
@@ -4673,7 +4709,7 @@
         #F1 enum A (nameOffset:5) (firstTokenOffset:0) (offset:5)
           element: <testLibrary>::@enum::A
           fields
-            #F2 hasImplicitType hasInitializer isConst isEnumConstant isOriginDeclaration isStatic v (nameOffset:19) (firstTokenOffset:19) (offset:19)
+            #F2 hasImplicitType hasInitializer isConst isEnumConstant isOriginDeclaration isStatic v (nameOffset:22) (firstTokenOffset:22) (offset:22)
               element: <testLibrary>::@enum::A::@field::v
               initializer: expression_0
                 InstanceCreationExpression
@@ -4684,12 +4720,12 @@
                       type: A
                     element: <testLibrary>::@enum::A::@constructor::new
                   argumentList: ArgumentList
-                    leftParenthesis: ( @20
+                    leftParenthesis: ( @23
                     arguments
                       IntegerLiteral
-                        literal: 0 @21
+                        literal: 0 @24
                         staticType: int
-                    rightParenthesis: ) @22
+                    rightParenthesis: ) @25
                   staticType: A
             #F3 isConst isOriginEnumValues isStatic values (nameOffset:<null>) (firstTokenOffset:<null>) (offset:5)
               element: <testLibrary>::@enum::A::@field::values
@@ -4712,7 +4748,7 @@
                 #F5 requiredPositional isOriginDeclaration foo (nameOffset:11) (firstTokenOffset:7) (offset:11)
                   element: <testLibrary>::@enum::A::@constructor::new::@formalParameter::foo
           getters
-            #F6 isCompleteDeclaration isOriginVariable isStatic v (nameOffset:<null>) (firstTokenOffset:<null>) (offset:19)
+            #F6 isCompleteDeclaration isOriginVariable isStatic v (nameOffset:<null>) (firstTokenOffset:<null>) (offset:22)
               element: <testLibrary>::@enum::A::@getter::v
             #F7 isCompleteDeclaration isOriginVariable isStatic values (nameOffset:<null>) (firstTokenOffset:<null>) (offset:5)
               element: <testLibrary>::@enum::A::@getter::values
@@ -4762,8 +4798,10 @@
   }
 
   test_constructor_primary_formalParameter_regular_requiredPositional_simple() async {
-    var library = await buildLibrary('''
-enum A(int foo) {v(0)}
+    var library = await buildLibrary(r'''
+enum A(int foo) {
+  v(0)
+}
 ''');
     checkElementText(library, r'''
 library
@@ -4775,7 +4813,7 @@
         #F1 enum A (nameOffset:5) (firstTokenOffset:0) (offset:5)
           element: <testLibrary>::@enum::A
           fields
-            #F2 hasImplicitType hasInitializer isConst isEnumConstant isOriginDeclaration isStatic v (nameOffset:17) (firstTokenOffset:17) (offset:17)
+            #F2 hasImplicitType hasInitializer isConst isEnumConstant isOriginDeclaration isStatic v (nameOffset:20) (firstTokenOffset:20) (offset:20)
               element: <testLibrary>::@enum::A::@field::v
               initializer: expression_0
                 InstanceCreationExpression
@@ -4786,12 +4824,12 @@
                       type: A
                     element: <testLibrary>::@enum::A::@constructor::new
                   argumentList: ArgumentList
-                    leftParenthesis: ( @18
+                    leftParenthesis: ( @21
                     arguments
                       IntegerLiteral
-                        literal: 0 @19
+                        literal: 0 @22
                         staticType: int
-                    rightParenthesis: ) @20
+                    rightParenthesis: ) @23
                   staticType: A
             #F3 isConst isOriginEnumValues isStatic values (nameOffset:<null>) (firstTokenOffset:<null>) (offset:5)
               element: <testLibrary>::@enum::A::@field::values
@@ -4814,7 +4852,7 @@
                 #F5 requiredPositional isOriginDeclaration foo (nameOffset:11) (firstTokenOffset:7) (offset:11)
                   element: <testLibrary>::@enum::A::@constructor::new::@formalParameter::foo
           getters
-            #F6 isCompleteDeclaration isOriginVariable isStatic v (nameOffset:<null>) (firstTokenOffset:<null>) (offset:17)
+            #F6 isCompleteDeclaration isOriginVariable isStatic v (nameOffset:<null>) (firstTokenOffset:<null>) (offset:20)
               element: <testLibrary>::@enum::A::@getter::v
             #F7 isCompleteDeclaration isOriginVariable isStatic values (nameOffset:<null>) (firstTokenOffset:<null>) (offset:5)
               element: <testLibrary>::@enum::A::@getter::values
@@ -4864,8 +4902,10 @@
   }
 
   test_constructor_primary_named_const() async {
-    var library = await buildLibrary('''
-enum const A.named() {v.named()}
+    var library = await buildLibrary(r'''
+enum const A.named() {
+  v.named()
+}
 ''');
     checkElementText(library, r'''
 library
@@ -4877,7 +4917,7 @@
         #F1 enum A (nameOffset:11) (firstTokenOffset:0) (offset:11)
           element: <testLibrary>::@enum::A
           fields
-            #F2 hasImplicitType hasInitializer isConst isEnumConstant isOriginDeclaration isStatic v (nameOffset:22) (firstTokenOffset:22) (offset:22)
+            #F2 hasImplicitType hasInitializer isConst isEnumConstant isOriginDeclaration isStatic v (nameOffset:25) (firstTokenOffset:25) (offset:25)
               element: <testLibrary>::@enum::A::@field::v
               initializer: expression_0
                 InstanceCreationExpression
@@ -4893,8 +4933,8 @@
                       staticType: null
                     element: <testLibrary>::@enum::A::@constructor::named
                   argumentList: ArgumentList
-                    leftParenthesis: ( @29
-                    rightParenthesis: ) @30
+                    leftParenthesis: ( @32
+                    rightParenthesis: ) @33
                   staticType: A
             #F3 isConst isOriginEnumValues isStatic values (nameOffset:<null>) (firstTokenOffset:<null>) (offset:11)
               element: <testLibrary>::@enum::A::@field::values
@@ -4915,7 +4955,7 @@
               typeNameOffset: 11
               periodOffset: 12
           getters
-            #F5 isCompleteDeclaration isOriginVariable isStatic v (nameOffset:<null>) (firstTokenOffset:<null>) (offset:22)
+            #F5 isCompleteDeclaration isOriginVariable isStatic v (nameOffset:<null>) (firstTokenOffset:<null>) (offset:25)
               element: <testLibrary>::@enum::A::@getter::v
             #F6 isCompleteDeclaration isOriginVariable isStatic values (nameOffset:<null>) (firstTokenOffset:<null>) (offset:11)
               element: <testLibrary>::@enum::A::@getter::values
@@ -4961,8 +5001,10 @@
   }
 
   test_constructor_primary_named_notConst() async {
-    var library = await buildLibrary('''
-enum A.named() {v.named()}
+    var library = await buildLibrary(r'''
+enum A.named() {
+  v.named()
+}
 ''');
     checkElementText(library, r'''
 library
@@ -4974,7 +5016,7 @@
         #F1 enum A (nameOffset:5) (firstTokenOffset:0) (offset:5)
           element: <testLibrary>::@enum::A
           fields
-            #F2 hasImplicitType hasInitializer isConst isEnumConstant isOriginDeclaration isStatic v (nameOffset:16) (firstTokenOffset:16) (offset:16)
+            #F2 hasImplicitType hasInitializer isConst isEnumConstant isOriginDeclaration isStatic v (nameOffset:19) (firstTokenOffset:19) (offset:19)
               element: <testLibrary>::@enum::A::@field::v
               initializer: expression_0
                 InstanceCreationExpression
@@ -4990,8 +5032,8 @@
                       staticType: null
                     element: <testLibrary>::@enum::A::@constructor::named
                   argumentList: ArgumentList
-                    leftParenthesis: ( @23
-                    rightParenthesis: ) @24
+                    leftParenthesis: ( @26
+                    rightParenthesis: ) @27
                   staticType: A
             #F3 isConst isOriginEnumValues isStatic values (nameOffset:<null>) (firstTokenOffset:<null>) (offset:5)
               element: <testLibrary>::@enum::A::@field::values
@@ -5012,7 +5054,7 @@
               typeNameOffset: 5
               periodOffset: 6
           getters
-            #F5 isCompleteDeclaration isOriginVariable isStatic v (nameOffset:<null>) (firstTokenOffset:<null>) (offset:16)
+            #F5 isCompleteDeclaration isOriginVariable isStatic v (nameOffset:<null>) (firstTokenOffset:<null>) (offset:19)
               element: <testLibrary>::@enum::A::@getter::v
             #F6 isCompleteDeclaration isOriginVariable isStatic values (nameOffset:<null>) (firstTokenOffset:<null>) (offset:5)
               element: <testLibrary>::@enum::A::@getter::values
@@ -5058,10 +5100,12 @@
   }
 
   test_constructor_primary_scopes() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 const foo = 0;
+
 enum E<@foo T>([@foo int x = foo]) {
   v;
+
   static const foo = 1;
 }
 ''');
@@ -5072,21 +5116,21 @@
     #F0 <testLibraryFragment>
       element: <testLibrary>
       enums
-        #F1 enum E (nameOffset:20) (firstTokenOffset:15) (offset:20)
+        #F1 enum E (nameOffset:21) (firstTokenOffset:16) (offset:21)
           element: <testLibrary>::@enum::E
           typeParameters
-            #F2 T (nameOffset:27) (firstTokenOffset:22) (offset:27)
+            #F2 T (nameOffset:28) (firstTokenOffset:23) (offset:28)
               element: #E0 T
               metadata
                 Annotation
-                  atSign: @ @22
+                  atSign: @ @23
                   name: SimpleIdentifier
-                    token: foo @23
+                    token: foo @24
                     element: <testLibrary>::@getter::foo
                     staticType: null
                   element: <testLibrary>::@getter::foo
           fields
-            #F3 hasImplicitType hasInitializer isConst isEnumConstant isOriginDeclaration isStatic v (nameOffset:54) (firstTokenOffset:54) (offset:54)
+            #F3 hasImplicitType hasInitializer isConst isEnumConstant isOriginDeclaration isStatic v (nameOffset:55) (firstTokenOffset:55) (offset:55)
               element: <testLibrary>::@enum::E::@field::v
               initializer: expression_0
                 InstanceCreationExpression
@@ -5102,7 +5146,7 @@
                     leftParenthesis: ( @0
                     rightParenthesis: ) @0
                   staticType: E<dynamic>
-            #F4 isConst isOriginEnumValues isStatic values (nameOffset:<null>) (firstTokenOffset:<null>) (offset:20)
+            #F4 isConst isOriginEnumValues isStatic values (nameOffset:<null>) (firstTokenOffset:<null>) (offset:21)
               element: <testLibrary>::@enum::E::@field::values
               initializer: expression_1
                 ListLiteral
@@ -5114,39 +5158,39 @@
                       staticType: E<dynamic>
                   rightBracket: ] @0
                   staticType: List<E<dynamic>>
-            #F5 hasImplicitType hasInitializer isConst isOriginDeclaration isStatic foo (nameOffset:72) (firstTokenOffset:72) (offset:72)
+            #F5 hasImplicitType hasInitializer isConst isOriginDeclaration isStatic foo (nameOffset:74) (firstTokenOffset:74) (offset:74)
               element: <testLibrary>::@enum::E::@field::foo
               initializer: expression_2
                 IntegerLiteral
-                  literal: 1 @78
+                  literal: 1 @80
                   staticType: int
           constructors
-            #F6 isCompleteDeclaration isConst isOriginDeclaration isPrimary new (nameOffset:<null>) (firstTokenOffset:20) (offset:20)
+            #F6 isCompleteDeclaration isConst isOriginDeclaration isPrimary new (nameOffset:<null>) (firstTokenOffset:21) (offset:21)
               element: <testLibrary>::@enum::E::@constructor::new
               typeName: E
-              typeNameOffset: 20
+              typeNameOffset: 21
               formalParameters
-                #F7 optionalPositional isOriginDeclaration x (nameOffset:40) (firstTokenOffset:31) (offset:40)
+                #F7 optionalPositional isOriginDeclaration x (nameOffset:41) (firstTokenOffset:32) (offset:41)
                   element: <testLibrary>::@enum::E::@constructor::new::@formalParameter::x
                   metadata
                     Annotation
-                      atSign: @ @31
+                      atSign: @ @32
                       name: SimpleIdentifier
-                        token: foo @32
+                        token: foo @33
                         element: <testLibrary>::@enum::E::@getter::foo
                         staticType: null
                       element: <testLibrary>::@enum::E::@getter::foo
                   initializer: expression_3
                     SimpleIdentifier
-                      token: foo @44
+                      token: foo @45
                       element: <testLibrary>::@enum::E::@getter::foo
                       staticType: int
           getters
-            #F8 isCompleteDeclaration isOriginVariable isStatic v (nameOffset:<null>) (firstTokenOffset:<null>) (offset:54)
+            #F8 isCompleteDeclaration isOriginVariable isStatic v (nameOffset:<null>) (firstTokenOffset:<null>) (offset:55)
               element: <testLibrary>::@enum::E::@getter::v
-            #F9 isCompleteDeclaration isOriginVariable isStatic values (nameOffset:<null>) (firstTokenOffset:<null>) (offset:20)
+            #F9 isCompleteDeclaration isOriginVariable isStatic values (nameOffset:<null>) (firstTokenOffset:<null>) (offset:21)
               element: <testLibrary>::@enum::E::@getter::values
-            #F10 isCompleteDeclaration isOriginVariable isStatic foo (nameOffset:<null>) (firstTokenOffset:<null>) (offset:72)
+            #F10 isCompleteDeclaration isOriginVariable isStatic foo (nameOffset:<null>) (firstTokenOffset:<null>) (offset:74)
               element: <testLibrary>::@enum::E::@getter::foo
       topLevelVariables
         #F11 hasImplicitType hasInitializer isConst isOriginDeclaration isStatic foo (nameOffset:6) (firstTokenOffset:6) (offset:6)
@@ -5167,9 +5211,9 @@
           firstFragment: #F2
           metadata
             Annotation
-              atSign: @ @22
+              atSign: @ @23
               name: SimpleIdentifier
-                token: foo @23
+                token: foo @24
                 element: <testLibrary>::@getter::foo
                 staticType: null
               element: <testLibrary>::@getter::foo
@@ -5209,9 +5253,9 @@
               type: int
               metadata
                 Annotation
-                  atSign: @ @31
+                  atSign: @ @32
                   name: SimpleIdentifier
-                    token: foo @32
+                    token: foo @33
                     element: <testLibrary>::@enum::E::@getter::foo
                     staticType: null
                   element: <testLibrary>::@enum::E::@getter::foo
@@ -5254,7 +5298,7 @@
   }
 
   test_constructor_primary_typeParameters() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 enum A<T extends U, U extends num>(T t, U u) {
   v(0, 0);
 }
@@ -5380,8 +5424,10 @@
   }
 
   test_constructor_primary_unnamed_const() async {
-    var library = await buildLibrary('''
-enum const A() {v}
+    var library = await buildLibrary(r'''
+enum const A() {
+  v
+}
 ''');
     checkElementText(library, r'''
 library
@@ -5393,7 +5439,7 @@
         #F1 enum A (nameOffset:11) (firstTokenOffset:0) (offset:11)
           element: <testLibrary>::@enum::A
           fields
-            #F2 hasImplicitType hasInitializer isConst isEnumConstant isOriginDeclaration isStatic v (nameOffset:16) (firstTokenOffset:16) (offset:16)
+            #F2 hasImplicitType hasInitializer isConst isEnumConstant isOriginDeclaration isStatic v (nameOffset:19) (firstTokenOffset:19) (offset:19)
               element: <testLibrary>::@enum::A::@field::v
               initializer: expression_0
                 InstanceCreationExpression
@@ -5425,7 +5471,7 @@
               typeName: A
               typeNameOffset: 11
           getters
-            #F5 isCompleteDeclaration isOriginVariable isStatic v (nameOffset:<null>) (firstTokenOffset:<null>) (offset:16)
+            #F5 isCompleteDeclaration isOriginVariable isStatic v (nameOffset:<null>) (firstTokenOffset:<null>) (offset:19)
               element: <testLibrary>::@enum::A::@getter::v
             #F6 isCompleteDeclaration isOriginVariable isStatic values (nameOffset:<null>) (firstTokenOffset:<null>) (offset:11)
               element: <testLibrary>::@enum::A::@getter::values
@@ -5471,8 +5517,10 @@
   }
 
   test_constructor_primary_unnamed_notConst() async {
-    var library = await buildLibrary('''
-enum A() {v}
+    var library = await buildLibrary(r'''
+enum A() {
+  v
+}
 ''');
     checkElementText(library, r'''
 library
@@ -5484,7 +5532,7 @@
         #F1 enum A (nameOffset:5) (firstTokenOffset:0) (offset:5)
           element: <testLibrary>::@enum::A
           fields
-            #F2 hasImplicitType hasInitializer isConst isEnumConstant isOriginDeclaration isStatic v (nameOffset:10) (firstTokenOffset:10) (offset:10)
+            #F2 hasImplicitType hasInitializer isConst isEnumConstant isOriginDeclaration isStatic v (nameOffset:13) (firstTokenOffset:13) (offset:13)
               element: <testLibrary>::@enum::A::@field::v
               initializer: expression_0
                 InstanceCreationExpression
@@ -5516,7 +5564,7 @@
               typeName: A
               typeNameOffset: 5
           getters
-            #F5 isCompleteDeclaration isOriginVariable isStatic v (nameOffset:<null>) (firstTokenOffset:<null>) (offset:10)
+            #F5 isCompleteDeclaration isOriginVariable isStatic v (nameOffset:<null>) (firstTokenOffset:<null>) (offset:13)
               element: <testLibrary>::@enum::A::@getter::v
             #F6 isCompleteDeclaration isOriginVariable isStatic values (nameOffset:<null>) (firstTokenOffset:<null>) (offset:5)
               element: <testLibrary>::@enum::A::@getter::values
@@ -6400,268 +6448,21 @@
 ''');
   }
 
-  test_constructor_secondary_augmentation_chain_named() async {
-    var library = await buildLibrary(r'''
-enum A {
-  v.named();
-  const A.named();
-}
-
-augment enum A {;
-  augment const A.named();
-}
-''');
-    checkElementText(library, r'''
-library
-  reference: <testLibrary>
-  fragments
-    #F0 <testLibraryFragment>
-      element: <testLibrary>
-      enums
-        #F1 enum A (nameOffset:5) (firstTokenOffset:0) (offset:5)
-          element: <testLibrary>::@enum::A
-          nextFragment: #F2
-          fields
-            #F3 hasImplicitType hasInitializer isConst isEnumConstant isOriginDeclaration isStatic v (nameOffset:11) (firstTokenOffset:11) (offset:11)
-              element: <testLibrary>::@enum::A::@field::v
-              initializer: expression_0
-                InstanceCreationExpression
-                  constructorName: ConstructorName
-                    type: NamedType
-                      name: A @-1
-                      element: <testLibrary>::@enum::A
-                      type: A
-                    period: . @0
-                    name: SimpleIdentifier
-                      token: named @-1
-                      element: <testLibrary>::@enum::A::@constructor::named
-                      staticType: null
-                    element: <testLibrary>::@enum::A::@constructor::named
-                  argumentList: ArgumentList
-                    leftParenthesis: ( @18
-                    rightParenthesis: ) @19
-                  staticType: A
-            #F4 isConst isOriginEnumValues isStatic values (nameOffset:<null>) (firstTokenOffset:<null>) (offset:5)
-              element: <testLibrary>::@enum::A::@field::values
-              initializer: expression_1
-                ListLiteral
-                  leftBracket: [ @0
-                  elements
-                    SimpleIdentifier
-                      token: v @-1
-                      element: <testLibrary>::@enum::A::@getter::v
-                      staticType: A
-                  rightBracket: ] @0
-                  staticType: List<A>
-          constructors
-            #F5 isConst isOriginDeclaration named (nameOffset:32) (firstTokenOffset:24) (offset:32)
-              element: <testLibrary>::@enum::A::@constructor::named
-              typeName: A
-              typeNameOffset: 30
-              periodOffset: 31
-              nextFragment: #F6
-          getters
-            #F7 isCompleteDeclaration isOriginVariable isStatic v (nameOffset:<null>) (firstTokenOffset:<null>) (offset:11)
-              element: <testLibrary>::@enum::A::@getter::v
-            #F8 isCompleteDeclaration isOriginVariable isStatic values (nameOffset:<null>) (firstTokenOffset:<null>) (offset:5)
-              element: <testLibrary>::@enum::A::@getter::values
-        #F2 isAugmentation enum A (nameOffset:57) (firstTokenOffset:44) (offset:57)
-          element: <testLibrary>::@enum::A
-          previousFragment: #F1
-          constructors
-            #F6 isAugmentation isConst isOriginDeclaration named (nameOffset:80) (firstTokenOffset:64) (offset:80)
-              element: <testLibrary>::@enum::A::@constructor::named
-              typeName: A
-              typeNameOffset: 78
-              periodOffset: 79
-              previousFragment: #F5
-  enums
-    isSimplyBounded enum A
-      reference: <testLibrary>::@enum::A
-      firstFragment: #F1
-      supertype: Enum
-      fields
-        hasImplicitType hasInitializer isConst isEnumConstant isOriginDeclaration isStatic isTypeInferredFromInitializer v
-          reference: <testLibrary>::@enum::A::@field::v
-          firstFragment: #F3
-          type: A
-          constantInitializer
-            fragment: #F3
-            expression: expression_0
-          getter: <testLibrary>::@enum::A::@getter::v
-        isConst isOriginEnumValues isStatic values
-          reference: <testLibrary>::@enum::A::@field::values
-          firstFragment: #F4
-          type: List<A>
-          constantInitializer
-            fragment: #F4
-            expression: expression_1
-          getter: <testLibrary>::@enum::A::@getter::values
-      constructors
-        isConst isOriginDeclaration named
-          reference: <testLibrary>::@enum::A::@constructor::named
-          firstFragment: #F5
-          superConstructor: dart:core::@class::Enum::@constructor::new
-      getters
-        isOriginVariable isStatic v
-          reference: <testLibrary>::@enum::A::@getter::v
-          firstFragment: #F7
-          returnType: A
-          variable: <testLibrary>::@enum::A::@field::v
-        isOriginVariable isStatic values
-          reference: <testLibrary>::@enum::A::@getter::values
-          firstFragment: #F8
-          returnType: List<A>
-          variable: <testLibrary>::@enum::A::@field::values
-''');
-  }
-
-  test_constructor_secondary_augmentation_chain_twoDeclarations() async {
-    var library = await buildLibrary(r'''
-enum A {
-  v.named();
-  const A.named();
-}
-
-augment enum A {;
-  augment const A.named();
-}
-
-augment enum A {;
-  augment const A.named();
-}
-''');
-
-    configuration.withConstantInitializers = false;
-    checkElementText(library, r'''
-library
-  reference: <testLibrary>
-  fragments
-    #F0 <testLibraryFragment>
-      element: <testLibrary>
-      enums
-        #F1 enum A (nameOffset:5) (firstTokenOffset:0) (offset:5)
-          element: <testLibrary>::@enum::A
-          nextFragment: #F2
-          fields
-            #F3 hasImplicitType hasInitializer isConst isEnumConstant isOriginDeclaration isStatic v (nameOffset:11) (firstTokenOffset:11) (offset:11)
-              element: <testLibrary>::@enum::A::@field::v
-              initializer: expression_0
-                InstanceCreationExpression
-                  constructorName: ConstructorName
-                    type: NamedType
-                      name: A @-1
-                      element: <testLibrary>::@enum::A
-                      type: A
-                    period: . @0
-                    name: SimpleIdentifier
-                      token: named @-1
-                      element: <testLibrary>::@enum::A::@constructor::named
-                      staticType: null
-                    element: <testLibrary>::@enum::A::@constructor::named
-                  argumentList: ArgumentList
-                    leftParenthesis: ( @18
-                    rightParenthesis: ) @19
-                  staticType: A
-            #F4 isConst isOriginEnumValues isStatic values (nameOffset:<null>) (firstTokenOffset:<null>) (offset:5)
-              element: <testLibrary>::@enum::A::@field::values
-              initializer: expression_1
-                ListLiteral
-                  leftBracket: [ @0
-                  elements
-                    SimpleIdentifier
-                      token: v @-1
-                      element: <testLibrary>::@enum::A::@getter::v
-                      staticType: A
-                  rightBracket: ] @0
-                  staticType: List<A>
-          constructors
-            #F5 isConst isOriginDeclaration named (nameOffset:32) (firstTokenOffset:24) (offset:32)
-              element: <testLibrary>::@enum::A::@constructor::named
-              typeName: A
-              typeNameOffset: 30
-              periodOffset: 31
-              nextFragment: #F6
-          getters
-            #F7 isCompleteDeclaration isOriginVariable isStatic v (nameOffset:<null>) (firstTokenOffset:<null>) (offset:11)
-              element: <testLibrary>::@enum::A::@getter::v
-            #F8 isCompleteDeclaration isOriginVariable isStatic values (nameOffset:<null>) (firstTokenOffset:<null>) (offset:5)
-              element: <testLibrary>::@enum::A::@getter::values
-        #F2 isAugmentation enum A (nameOffset:57) (firstTokenOffset:44) (offset:57)
-          element: <testLibrary>::@enum::A
-          previousFragment: #F1
-          nextFragment: #F9
-          constructors
-            #F6 isAugmentation isConst isOriginDeclaration named (nameOffset:80) (firstTokenOffset:64) (offset:80)
-              element: <testLibrary>::@enum::A::@constructor::named
-              typeName: A
-              typeNameOffset: 78
-              periodOffset: 79
-              nextFragment: #F10
-              previousFragment: #F5
-        #F9 isAugmentation enum A (nameOffset:105) (firstTokenOffset:92) (offset:105)
-          element: <testLibrary>::@enum::A
-          previousFragment: #F2
-          constructors
-            #F10 isAugmentation isConst isOriginDeclaration named (nameOffset:128) (firstTokenOffset:112) (offset:128)
-              element: <testLibrary>::@enum::A::@constructor::named
-              typeName: A
-              typeNameOffset: 126
-              periodOffset: 127
-              previousFragment: #F6
-  enums
-    isSimplyBounded enum A
-      reference: <testLibrary>::@enum::A
-      firstFragment: #F1
-      supertype: Enum
-      fields
-        hasImplicitType hasInitializer isConst isEnumConstant isOriginDeclaration isStatic isTypeInferredFromInitializer v
-          reference: <testLibrary>::@enum::A::@field::v
-          firstFragment: #F3
-          type: A
-          constantInitializer
-            fragment: #F3
-            expression: expression_0
-          getter: <testLibrary>::@enum::A::@getter::v
-        isConst isOriginEnumValues isStatic values
-          reference: <testLibrary>::@enum::A::@field::values
-          firstFragment: #F4
-          type: List<A>
-          constantInitializer
-            fragment: #F4
-            expression: expression_1
-          getter: <testLibrary>::@enum::A::@getter::values
-      constructors
-        isConst isOriginDeclaration named
-          reference: <testLibrary>::@enum::A::@constructor::named
-          firstFragment: #F5
-          superConstructor: dart:core::@class::Enum::@constructor::new
-      getters
-        isOriginVariable isStatic v
-          reference: <testLibrary>::@enum::A::@getter::v
-          firstFragment: #F7
-          returnType: A
-          variable: <testLibrary>::@enum::A::@field::v
-        isOriginVariable isStatic values
-          reference: <testLibrary>::@enum::A::@getter::values
-          firstFragment: #F8
-          returnType: List<A>
-          variable: <testLibrary>::@enum::A::@field::values
-''');
-  }
-
-  test_constructor_secondary_augmentation_chain_unnamed() async {
+  test_constructor_secondary_augmentation_chain_isCompleteDeclaration_factory() async {
     var library = await buildLibrary(r'''
 enum A {
   v;
-  const A();
+  factory A();
 }
 
 augment enum A {;
-  augment const A();
+  augment factory A() => v;
+}
+
+augment enum A {;
+  augment factory A();
 }
 ''');
-
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -6700,25 +6501,39 @@
                   rightBracket: ] @0
                   staticType: List<A>
           constructors
-            #F5 isConst isOriginDeclaration new (nameOffset:<null>) (firstTokenOffset:16) (offset:22)
+            #F5 isFactory isOriginDeclaration new (nameOffset:<null>) (firstTokenOffset:16) (offset:24)
               element: <testLibrary>::@enum::A::@constructor::new
+              factoryKeywordOffset: 16
               typeName: A
-              typeNameOffset: 22
+              typeNameOffset: 24
               nextFragment: #F6
           getters
             #F7 isCompleteDeclaration isOriginVariable isStatic v (nameOffset:<null>) (firstTokenOffset:<null>) (offset:11)
               element: <testLibrary>::@enum::A::@getter::v
             #F8 isCompleteDeclaration isOriginVariable isStatic values (nameOffset:<null>) (firstTokenOffset:<null>) (offset:5)
               element: <testLibrary>::@enum::A::@getter::values
-        #F2 isAugmentation enum A (nameOffset:43) (firstTokenOffset:30) (offset:43)
+        #F2 isAugmentation enum A (nameOffset:45) (firstTokenOffset:32) (offset:45)
           element: <testLibrary>::@enum::A
           previousFragment: #F1
+          nextFragment: #F9
           constructors
-            #F6 isAugmentation isConst isOriginDeclaration new (nameOffset:<null>) (firstTokenOffset:50) (offset:64)
+            #F6 isAugmentation isCompleteDeclaration isFactory isOriginDeclaration new (nameOffset:<null>) (firstTokenOffset:52) (offset:68)
               element: <testLibrary>::@enum::A::@constructor::new
+              factoryKeywordOffset: 60
               typeName: A
-              typeNameOffset: 64
+              typeNameOffset: 68
+              nextFragment: #F10
               previousFragment: #F5
+        #F9 isAugmentation enum A (nameOffset:94) (firstTokenOffset:81) (offset:94)
+          element: <testLibrary>::@enum::A
+          previousFragment: #F2
+          constructors
+            #F10 isAugmentation isFactory isOriginDeclaration new (nameOffset:<null>) (firstTokenOffset:101) (offset:117)
+              element: <testLibrary>::@enum::A::@constructor::new
+              factoryKeywordOffset: 109
+              typeName: A
+              typeNameOffset: 117
+              previousFragment: #F6
   enums
     isSimplyBounded enum A
       reference: <testLibrary>::@enum::A
@@ -6742,10 +6557,9 @@
             expression: expression_1
           getter: <testLibrary>::@enum::A::@getter::values
       constructors
-        isConst isOriginDeclaration new
+        isFactory isOriginDeclaration new
           reference: <testLibrary>::@enum::A::@constructor::new
           firstFragment: #F5
-          superConstructor: dart:core::@class::Enum::@constructor::new
       getters
         isOriginVariable isStatic v
           reference: <testLibrary>::@enum::A::@getter::v
@@ -6764,6 +6578,7 @@
     var library = await buildLibrary(r'''
 enum E {
   v;
+
   factory E() => v;
 }
 ''');
@@ -6804,11 +6619,11 @@
                   rightBracket: ] @0
                   staticType: List<E>
           constructors
-            #F4 isCompleteDeclaration isFactory isOriginDeclaration new (nameOffset:<null>) (firstTokenOffset:16) (offset:24)
+            #F4 isCompleteDeclaration isFactory isOriginDeclaration new (nameOffset:<null>) (firstTokenOffset:17) (offset:25)
               element: <testLibrary>::@enum::E::@constructor::new
-              factoryKeywordOffset: 16
+              factoryKeywordOffset: 17
               typeName: E
-              typeNameOffset: 24
+              typeNameOffset: 25
           getters
             #F5 isCompleteDeclaration isOriginVariable isStatic v (nameOffset:<null>) (firstTokenOffset:<null>) (offset:11)
               element: <testLibrary>::@enum::E::@getter::v
@@ -6858,6 +6673,7 @@
     var library = await buildLibrary(r'''
 enum E {
   v;
+
   factory E.named() => v;
 }
 ''');
@@ -6898,12 +6714,12 @@
                   rightBracket: ] @0
                   staticType: List<E>
           constructors
-            #F4 isCompleteDeclaration isFactory isOriginDeclaration named (nameOffset:26) (firstTokenOffset:16) (offset:26)
+            #F4 isCompleteDeclaration isFactory isOriginDeclaration named (nameOffset:27) (firstTokenOffset:17) (offset:27)
               element: <testLibrary>::@enum::E::@constructor::named
-              factoryKeywordOffset: 16
+              factoryKeywordOffset: 17
               typeName: E
-              typeNameOffset: 24
-              periodOffset: 25
+              typeNameOffset: 25
+              periodOffset: 26
             #F5 isConst isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:5)
               element: <testLibrary>::@enum::E::@constructor::new
               typeName: E
@@ -6960,6 +6776,7 @@
     var library = await buildLibrary(r'''
 enum E {
   v;
+
   factory named() => v;
 }
 ''');
@@ -7000,9 +6817,9 @@
                   rightBracket: ] @0
                   staticType: List<E>
           constructors
-            #F4 isCompleteDeclaration isFactory isOriginDeclaration named (nameOffset:24) (firstTokenOffset:16) (offset:24)
+            #F4 isCompleteDeclaration isFactory isOriginDeclaration named (nameOffset:25) (firstTokenOffset:17) (offset:25)
               element: <testLibrary>::@enum::E::@constructor::named
-              factoryKeywordOffset: 16
+              factoryKeywordOffset: 17
               typeName: null
             #F5 isConst isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:5)
               element: <testLibrary>::@enum::E::@constructor::new
@@ -7060,8 +6877,9 @@
     var library = await buildLibrary(r'''
 enum E {
   v.named();
+
   const E.named();
-  factory () => v;
+  factory() => v;
 }
 ''');
     checkElementText(library, r'''
@@ -7106,14 +6924,14 @@
                   rightBracket: ] @0
                   staticType: List<E>
           constructors
-            #F4 isConst isOriginDeclaration named (nameOffset:32) (firstTokenOffset:24) (offset:32)
+            #F4 isConst isOriginDeclaration named (nameOffset:33) (firstTokenOffset:25) (offset:33)
               element: <testLibrary>::@enum::E::@constructor::named
               typeName: E
-              typeNameOffset: 30
-              periodOffset: 31
-            #F5 isCompleteDeclaration isFactory isOriginDeclaration new (nameOffset:<null>) (firstTokenOffset:43) (offset:43)
+              typeNameOffset: 31
+              periodOffset: 32
+            #F5 isCompleteDeclaration isFactory isOriginDeclaration new (nameOffset:<null>) (firstTokenOffset:44) (offset:44)
               element: <testLibrary>::@enum::E::@constructor::new
-              factoryKeywordOffset: 43
+              factoryKeywordOffset: 44
               typeName: null
           getters
             #F6 isCompleteDeclaration isOriginVariable isStatic v (nameOffset:<null>) (firstTokenOffset:<null>) (offset:11)
@@ -7168,6 +6986,7 @@
     var library = await buildLibrary(r'''
 enum E {
   v;
+
   final int x;
   const E({this.x = 1 + 2});
 }
@@ -7208,24 +7027,24 @@
                       staticType: E
                   rightBracket: ] @0
                   staticType: List<E>
-            #F4 isFinal isOriginDeclaration x (nameOffset:26) (firstTokenOffset:26) (offset:26)
+            #F4 isFinal isOriginDeclaration x (nameOffset:27) (firstTokenOffset:27) (offset:27)
               element: <testLibrary>::@enum::E::@field::x
           constructors
-            #F5 isCompleteDeclaration isConst isOriginDeclaration new (nameOffset:<null>) (firstTokenOffset:31) (offset:37)
+            #F5 isCompleteDeclaration isConst isOriginDeclaration new (nameOffset:<null>) (firstTokenOffset:32) (offset:38)
               element: <testLibrary>::@enum::E::@constructor::new
               typeName: E
-              typeNameOffset: 37
+              typeNameOffset: 38
               formalParameters
-                #F6 optionalNamed hasImplicitType isFinal isOriginDeclaration this.x (nameOffset:45) (firstTokenOffset:40) (offset:45)
+                #F6 optionalNamed hasImplicitType isFinal isOriginDeclaration this.x (nameOffset:46) (firstTokenOffset:41) (offset:46)
                   element: <testLibrary>::@enum::E::@constructor::new::@formalParameter::x
                   initializer: expression_2
                     BinaryExpression
                       leftOperand: IntegerLiteral
-                        literal: 1 @49
+                        literal: 1 @50
                         staticType: int
-                      operator: + @51
+                      operator: + @52
                       rightOperand: IntegerLiteral
-                        literal: 2 @53
+                        literal: 2 @54
                         staticType: int
                       element: dart:core::@class::num::@method::+
                       staticInvokeType: num Function(num)
@@ -7235,7 +7054,7 @@
               element: <testLibrary>::@enum::E::@getter::v
             #F8 isCompleteDeclaration isOriginVariable isStatic values (nameOffset:<null>) (firstTokenOffset:<null>) (offset:5)
               element: <testLibrary>::@enum::E::@getter::values
-            #F9 isCompleteDeclaration isOriginVariable x (nameOffset:<null>) (firstTokenOffset:<null>) (offset:26)
+            #F9 isCompleteDeclaration isOriginVariable x (nameOffset:<null>) (firstTokenOffset:<null>) (offset:27)
               element: <testLibrary>::@enum::E::@getter::x
   enums
     isSimplyBounded enum E
@@ -7300,6 +7119,7 @@
     var library = await buildLibrary(r'''
 enum E {
   v;
+
   final x;
   E(this.x);
 }
@@ -7340,22 +7160,22 @@
                       staticType: E
                   rightBracket: ] @0
                   staticType: List<E>
-            #F4 hasImplicitType isFinal isOriginDeclaration x (nameOffset:22) (firstTokenOffset:22) (offset:22)
+            #F4 hasImplicitType isFinal isOriginDeclaration x (nameOffset:23) (firstTokenOffset:23) (offset:23)
               element: <testLibrary>::@enum::E::@field::x
           constructors
-            #F5 isCompleteDeclaration isConst isOriginDeclaration new (nameOffset:<null>) (firstTokenOffset:27) (offset:27)
+            #F5 isCompleteDeclaration isConst isOriginDeclaration new (nameOffset:<null>) (firstTokenOffset:28) (offset:28)
               element: <testLibrary>::@enum::E::@constructor::new
               typeName: E
-              typeNameOffset: 27
+              typeNameOffset: 28
               formalParameters
-                #F6 requiredPositional hasImplicitType isFinal isOriginDeclaration this.x (nameOffset:34) (firstTokenOffset:29) (offset:34)
+                #F6 requiredPositional hasImplicitType isFinal isOriginDeclaration this.x (nameOffset:35) (firstTokenOffset:30) (offset:35)
                   element: <testLibrary>::@enum::E::@constructor::new::@formalParameter::x
           getters
             #F7 isCompleteDeclaration isOriginVariable isStatic v (nameOffset:<null>) (firstTokenOffset:<null>) (offset:11)
               element: <testLibrary>::@enum::E::@getter::v
             #F8 isCompleteDeclaration isOriginVariable isStatic values (nameOffset:<null>) (firstTokenOffset:<null>) (offset:5)
               element: <testLibrary>::@enum::E::@getter::values
-            #F9 isCompleteDeclaration isOriginVariable x (nameOffset:<null>) (firstTokenOffset:<null>) (offset:22)
+            #F9 isCompleteDeclaration isOriginVariable x (nameOffset:<null>) (firstTokenOffset:<null>) (offset:23)
               element: <testLibrary>::@enum::E::@getter::x
   enums
     isSimplyBounded enum E
@@ -7417,6 +7237,7 @@
     var library = await buildLibrary(r'''
 enum E {
   v;
+
   final x;
   E(int this.x);
 }
@@ -7457,22 +7278,22 @@
                       staticType: E
                   rightBracket: ] @0
                   staticType: List<E>
-            #F4 hasImplicitType isFinal isOriginDeclaration x (nameOffset:22) (firstTokenOffset:22) (offset:22)
+            #F4 hasImplicitType isFinal isOriginDeclaration x (nameOffset:23) (firstTokenOffset:23) (offset:23)
               element: <testLibrary>::@enum::E::@field::x
           constructors
-            #F5 isCompleteDeclaration isConst isOriginDeclaration new (nameOffset:<null>) (firstTokenOffset:27) (offset:27)
+            #F5 isCompleteDeclaration isConst isOriginDeclaration new (nameOffset:<null>) (firstTokenOffset:28) (offset:28)
               element: <testLibrary>::@enum::E::@constructor::new
               typeName: E
-              typeNameOffset: 27
+              typeNameOffset: 28
               formalParameters
-                #F6 requiredPositional isFinal isOriginDeclaration this.x (nameOffset:38) (firstTokenOffset:29) (offset:38)
+                #F6 requiredPositional isFinal isOriginDeclaration this.x (nameOffset:39) (firstTokenOffset:30) (offset:39)
                   element: <testLibrary>::@enum::E::@constructor::new::@formalParameter::x
           getters
             #F7 isCompleteDeclaration isOriginVariable isStatic v (nameOffset:<null>) (firstTokenOffset:<null>) (offset:11)
               element: <testLibrary>::@enum::E::@getter::v
             #F8 isCompleteDeclaration isOriginVariable isStatic values (nameOffset:<null>) (firstTokenOffset:<null>) (offset:5)
               element: <testLibrary>::@enum::E::@getter::values
-            #F9 isCompleteDeclaration isOriginVariable x (nameOffset:<null>) (firstTokenOffset:<null>) (offset:22)
+            #F9 isCompleteDeclaration isOriginVariable x (nameOffset:<null>) (firstTokenOffset:<null>) (offset:23)
               element: <testLibrary>::@enum::E::@getter::x
   enums
     isSimplyBounded enum E
@@ -7531,9 +7352,10 @@
   }
 
   test_constructor_secondary_formalParameter_field_requiredPositional_fieldTyped_formalTyped() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 enum E {
   v;
+
   final num x;
   const E(int this.x);
 }
@@ -7574,22 +7396,22 @@
                       staticType: E
                   rightBracket: ] @0
                   staticType: List<E>
-            #F4 isFinal isOriginDeclaration x (nameOffset:26) (firstTokenOffset:26) (offset:26)
+            #F4 isFinal isOriginDeclaration x (nameOffset:27) (firstTokenOffset:27) (offset:27)
               element: <testLibrary>::@enum::E::@field::x
           constructors
-            #F5 isCompleteDeclaration isConst isOriginDeclaration new (nameOffset:<null>) (firstTokenOffset:31) (offset:37)
+            #F5 isCompleteDeclaration isConst isOriginDeclaration new (nameOffset:<null>) (firstTokenOffset:32) (offset:38)
               element: <testLibrary>::@enum::E::@constructor::new
               typeName: E
-              typeNameOffset: 37
+              typeNameOffset: 38
               formalParameters
-                #F6 requiredPositional isFinal isOriginDeclaration this.x (nameOffset:48) (firstTokenOffset:39) (offset:48)
+                #F6 requiredPositional isFinal isOriginDeclaration this.x (nameOffset:49) (firstTokenOffset:40) (offset:49)
                   element: <testLibrary>::@enum::E::@constructor::new::@formalParameter::x
           getters
             #F7 isCompleteDeclaration isOriginVariable isStatic v (nameOffset:<null>) (firstTokenOffset:<null>) (offset:11)
               element: <testLibrary>::@enum::E::@getter::v
             #F8 isCompleteDeclaration isOriginVariable isStatic values (nameOffset:<null>) (firstTokenOffset:<null>) (offset:5)
               element: <testLibrary>::@enum::E::@getter::values
-            #F9 isCompleteDeclaration isOriginVariable x (nameOffset:<null>) (firstTokenOffset:<null>) (offset:26)
+            #F9 isCompleteDeclaration isOriginVariable x (nameOffset:<null>) (firstTokenOffset:<null>) (offset:27)
               element: <testLibrary>::@enum::E::@getter::x
   enums
     isSimplyBounded enum E
@@ -7651,6 +7473,7 @@
     var library = await buildLibrary(r'''
 enum E {
   v;
+
   final x;
   const E(int this.x(double a));
 }
@@ -7691,25 +7514,25 @@
                       staticType: E
                   rightBracket: ] @0
                   staticType: List<E>
-            #F4 hasImplicitType isFinal isOriginDeclaration x (nameOffset:22) (firstTokenOffset:22) (offset:22)
+            #F4 hasImplicitType isFinal isOriginDeclaration x (nameOffset:23) (firstTokenOffset:23) (offset:23)
               element: <testLibrary>::@enum::E::@field::x
           constructors
-            #F5 isCompleteDeclaration isConst isOriginDeclaration new (nameOffset:<null>) (firstTokenOffset:27) (offset:33)
+            #F5 isCompleteDeclaration isConst isOriginDeclaration new (nameOffset:<null>) (firstTokenOffset:28) (offset:34)
               element: <testLibrary>::@enum::E::@constructor::new
               typeName: E
-              typeNameOffset: 33
+              typeNameOffset: 34
               formalParameters
-                #F6 requiredPositional isFinal isOriginDeclaration this.x (nameOffset:44) (firstTokenOffset:35) (offset:44)
+                #F6 requiredPositional isFinal isOriginDeclaration this.x (nameOffset:45) (firstTokenOffset:36) (offset:45)
                   element: <testLibrary>::@enum::E::@constructor::new::@formalParameter::x
                   parameters
-                    #F7 requiredPositional isOriginDeclaration a (nameOffset:53) (firstTokenOffset:46) (offset:53)
-                      element: a@53
+                    #F7 requiredPositional isOriginDeclaration a (nameOffset:54) (firstTokenOffset:47) (offset:54)
+                      element: a@54
           getters
             #F8 isCompleteDeclaration isOriginVariable isStatic v (nameOffset:<null>) (firstTokenOffset:<null>) (offset:11)
               element: <testLibrary>::@enum::E::@getter::v
             #F9 isCompleteDeclaration isOriginVariable isStatic values (nameOffset:<null>) (firstTokenOffset:<null>) (offset:5)
               element: <testLibrary>::@enum::E::@getter::values
-            #F10 isCompleteDeclaration isOriginVariable x (nameOffset:<null>) (firstTokenOffset:<null>) (offset:22)
+            #F10 isCompleteDeclaration isOriginVariable x (nameOffset:<null>) (firstTokenOffset:<null>) (offset:23)
               element: <testLibrary>::@enum::E::@getter::x
   enums
     isSimplyBounded enum E
@@ -7772,9 +7595,10 @@
   }
 
   test_constructor_secondary_formalParameter_field_requiredPositional_multipleMatchingFields() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 enum E {
   v;
+
   final int x;
   final String x;
   const E(this.x);
@@ -7817,26 +7641,26 @@
                       staticType: E
                   rightBracket: ] @0
                   staticType: List<E>
-            #F4 isFinal isOriginDeclaration x (nameOffset:26) (firstTokenOffset:26) (offset:26)
+            #F4 isFinal isOriginDeclaration x (nameOffset:27) (firstTokenOffset:27) (offset:27)
               element: <testLibrary>::@enum::E::@field::x
-            #F5 isFinal isOriginDeclaration x (nameOffset:44) (firstTokenOffset:44) (offset:44)
+            #F5 isFinal isOriginDeclaration x (nameOffset:45) (firstTokenOffset:45) (offset:45)
               element: <testLibrary>::@enum::E::@field::x#1
           constructors
-            #F6 isCompleteDeclaration isConst isOriginDeclaration new (nameOffset:<null>) (firstTokenOffset:49) (offset:55)
+            #F6 isCompleteDeclaration isConst isOriginDeclaration new (nameOffset:<null>) (firstTokenOffset:50) (offset:56)
               element: <testLibrary>::@enum::E::@constructor::new
               typeName: E
-              typeNameOffset: 55
+              typeNameOffset: 56
               formalParameters
-                #F7 requiredPositional hasImplicitType isFinal isOriginDeclaration this.x (nameOffset:62) (firstTokenOffset:57) (offset:62)
+                #F7 requiredPositional hasImplicitType isFinal isOriginDeclaration this.x (nameOffset:63) (firstTokenOffset:58) (offset:63)
                   element: <testLibrary>::@enum::E::@constructor::new::@formalParameter::x
           getters
             #F8 isCompleteDeclaration isOriginVariable isStatic v (nameOffset:<null>) (firstTokenOffset:<null>) (offset:11)
               element: <testLibrary>::@enum::E::@getter::v
             #F9 isCompleteDeclaration isOriginVariable isStatic values (nameOffset:<null>) (firstTokenOffset:<null>) (offset:5)
               element: <testLibrary>::@enum::E::@getter::values
-            #F10 isCompleteDeclaration isOriginVariable x (nameOffset:<null>) (firstTokenOffset:<null>) (offset:26)
+            #F10 isCompleteDeclaration isOriginVariable x (nameOffset:<null>) (firstTokenOffset:<null>) (offset:27)
               element: <testLibrary>::@enum::E::@getter::x
-            #F11 isCompleteDeclaration isOriginVariable x (nameOffset:<null>) (firstTokenOffset:<null>) (offset:44)
+            #F11 isCompleteDeclaration isOriginVariable x (nameOffset:<null>) (firstTokenOffset:<null>) (offset:45)
               element: <testLibrary>::@enum::E::@getter::x#1
   enums
     isSimplyBounded enum E
@@ -7905,9 +7729,10 @@
   }
 
   test_constructor_secondary_formalParameter_field_requiredPositional_noMatchingField() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 enum E {
   v;
+
   const E(this.x);
 }
 ''');
@@ -7948,12 +7773,12 @@
                   rightBracket: ] @0
                   staticType: List<E>
           constructors
-            #F4 isCompleteDeclaration isConst isOriginDeclaration new (nameOffset:<null>) (firstTokenOffset:16) (offset:22)
+            #F4 isCompleteDeclaration isConst isOriginDeclaration new (nameOffset:<null>) (firstTokenOffset:17) (offset:23)
               element: <testLibrary>::@enum::E::@constructor::new
               typeName: E
-              typeNameOffset: 22
+              typeNameOffset: 23
               formalParameters
-                #F5 requiredPositional hasImplicitType isFinal isOriginDeclaration this.x (nameOffset:29) (firstTokenOffset:24) (offset:29)
+                #F5 requiredPositional hasImplicitType isFinal isOriginDeclaration this.x (nameOffset:30) (firstTokenOffset:25) (offset:30)
                   element: <testLibrary>::@enum::E::@constructor::new::@formalParameter::x
           getters
             #F6 isCompleteDeclaration isOriginVariable isStatic v (nameOffset:<null>) (firstTokenOffset:<null>) (offset:11)
@@ -8010,6 +7835,7 @@
     var library = await buildLibrary(r'''
 enum E<T> {
   v;
+
   final int x;
   const E(T? a) : assert(a is T), x = 0;
 }
@@ -8055,22 +7881,22 @@
                       staticType: E<dynamic>
                   rightBracket: ] @0
                   staticType: List<E<dynamic>>
-            #F5 isFinal isOriginDeclaration x (nameOffset:29) (firstTokenOffset:29) (offset:29)
+            #F5 isFinal isOriginDeclaration x (nameOffset:30) (firstTokenOffset:30) (offset:30)
               element: <testLibrary>::@enum::E::@field::x
           constructors
-            #F6 isCompleteDeclaration isConst isOriginDeclaration new (nameOffset:<null>) (firstTokenOffset:34) (offset:40)
+            #F6 isCompleteDeclaration isConst isOriginDeclaration new (nameOffset:<null>) (firstTokenOffset:35) (offset:41)
               element: <testLibrary>::@enum::E::@constructor::new
               typeName: E
-              typeNameOffset: 40
+              typeNameOffset: 41
               formalParameters
-                #F7 requiredPositional isOriginDeclaration a (nameOffset:45) (firstTokenOffset:42) (offset:45)
+                #F7 requiredPositional isOriginDeclaration a (nameOffset:46) (firstTokenOffset:43) (offset:46)
                   element: <testLibrary>::@enum::E::@constructor::new::@formalParameter::a
           getters
             #F8 isCompleteDeclaration isOriginVariable isStatic v (nameOffset:<null>) (firstTokenOffset:<null>) (offset:14)
               element: <testLibrary>::@enum::E::@getter::v
             #F9 isCompleteDeclaration isOriginVariable isStatic values (nameOffset:<null>) (firstTokenOffset:<null>) (offset:5)
               element: <testLibrary>::@enum::E::@getter::values
-            #F10 isCompleteDeclaration isOriginVariable x (nameOffset:<null>) (firstTokenOffset:<null>) (offset:29)
+            #F10 isCompleteDeclaration isOriginVariable x (nameOffset:<null>) (firstTokenOffset:<null>) (offset:30)
               element: <testLibrary>::@enum::E::@getter::x
   enums
     isSimplyBounded enum E
@@ -8112,28 +7938,28 @@
               type: T?
           constantInitializers
             AssertInitializer
-              assertKeyword: assert @50
-              leftParenthesis: ( @56
+              assertKeyword: assert @51
+              leftParenthesis: ( @57
               condition: IsExpression
                 expression: SimpleIdentifier
-                  token: a @57
+                  token: a @58
                   element: <testLibrary>::@enum::E::@constructor::new::@formalParameter::a
                   staticType: T?
-                isOperator: is @59
+                isOperator: is @60
                 type: NamedType
-                  name: T @62
+                  name: T @63
                   element: #E0 T
                   type: T
                 staticType: bool
-              rightParenthesis: ) @63
+              rightParenthesis: ) @64
             ConstructorFieldInitializer
               fieldName: SimpleIdentifier
-                token: x @66
+                token: x @67
                 element: <testLibrary>::@enum::E::@field::x
                 staticType: null
-              equals: = @68
+              equals: = @69
               expression: IntegerLiteral
-                literal: 0 @70
+                literal: 0 @71
                 staticType: int
           superConstructor: dart:core::@class::Enum::@constructor::new
       getters
@@ -8158,8 +7984,10 @@
   test_constructor_secondary_metadata() async {
     var library = await buildLibrary(r'''
 const a = 42;
+
 enum E {
   v;
+
   @a
   const E();
 }
@@ -8171,10 +7999,10 @@
     #F0 <testLibraryFragment>
       element: <testLibrary>
       enums
-        #F1 enum E (nameOffset:19) (firstTokenOffset:14) (offset:19)
+        #F1 enum E (nameOffset:20) (firstTokenOffset:15) (offset:20)
           element: <testLibrary>::@enum::E
           fields
-            #F2 hasImplicitType hasInitializer isConst isEnumConstant isOriginDeclaration isStatic v (nameOffset:25) (firstTokenOffset:25) (offset:25)
+            #F2 hasImplicitType hasInitializer isConst isEnumConstant isOriginDeclaration isStatic v (nameOffset:26) (firstTokenOffset:26) (offset:26)
               element: <testLibrary>::@enum::E::@field::v
               initializer: expression_0
                 InstanceCreationExpression
@@ -8188,7 +8016,7 @@
                     leftParenthesis: ( @0
                     rightParenthesis: ) @0
                   staticType: E
-            #F3 isConst isOriginEnumValues isStatic values (nameOffset:<null>) (firstTokenOffset:<null>) (offset:19)
+            #F3 isConst isOriginEnumValues isStatic values (nameOffset:<null>) (firstTokenOffset:<null>) (offset:20)
               element: <testLibrary>::@enum::E::@field::values
               initializer: expression_1
                 ListLiteral
@@ -8201,22 +8029,22 @@
                   rightBracket: ] @0
                   staticType: List<E>
           constructors
-            #F4 isConst isOriginDeclaration new (nameOffset:<null>) (firstTokenOffset:30) (offset:41)
+            #F4 isConst isOriginDeclaration new (nameOffset:<null>) (firstTokenOffset:32) (offset:43)
               element: <testLibrary>::@enum::E::@constructor::new
               metadata
                 Annotation
-                  atSign: @ @30
+                  atSign: @ @32
                   name: SimpleIdentifier
-                    token: a @31
+                    token: a @33
                     element: <testLibrary>::@getter::a
                     staticType: null
                   element: <testLibrary>::@getter::a
               typeName: E
-              typeNameOffset: 41
+              typeNameOffset: 43
           getters
-            #F5 isCompleteDeclaration isOriginVariable isStatic v (nameOffset:<null>) (firstTokenOffset:<null>) (offset:25)
+            #F5 isCompleteDeclaration isOriginVariable isStatic v (nameOffset:<null>) (firstTokenOffset:<null>) (offset:26)
               element: <testLibrary>::@enum::E::@getter::v
-            #F6 isCompleteDeclaration isOriginVariable isStatic values (nameOffset:<null>) (firstTokenOffset:<null>) (offset:19)
+            #F6 isCompleteDeclaration isOriginVariable isStatic values (nameOffset:<null>) (firstTokenOffset:<null>) (offset:20)
               element: <testLibrary>::@enum::E::@getter::values
       topLevelVariables
         #F7 hasImplicitType hasInitializer isConst isOriginDeclaration isStatic a (nameOffset:6) (firstTokenOffset:6) (offset:6)
@@ -8256,9 +8084,9 @@
           firstFragment: #F4
           metadata
             Annotation
-              atSign: @ @30
+              atSign: @ @32
               name: SimpleIdentifier
-                token: a @31
+                token: a @33
                 element: <testLibrary>::@getter::a
                 staticType: null
               element: <testLibrary>::@getter::a
@@ -8296,6 +8124,7 @@
     var library = await buildLibrary(r'''
 enum E {
   v.named(42);
+
   const E.named(int a);
 }
 ''');
@@ -8345,13 +8174,13 @@
                   rightBracket: ] @0
                   staticType: List<E>
           constructors
-            #F4 isConst isOriginDeclaration named (nameOffset:34) (firstTokenOffset:26) (offset:34)
+            #F4 isConst isOriginDeclaration named (nameOffset:35) (firstTokenOffset:27) (offset:35)
               element: <testLibrary>::@enum::E::@constructor::named
               typeName: E
-              typeNameOffset: 32
-              periodOffset: 33
+              typeNameOffset: 33
+              periodOffset: 34
               formalParameters
-                #F5 requiredPositional isOriginDeclaration a (nameOffset:44) (firstTokenOffset:40) (offset:44)
+                #F5 requiredPositional isOriginDeclaration a (nameOffset:45) (firstTokenOffset:41) (offset:45)
                   element: <testLibrary>::@enum::E::@constructor::named::@formalParameter::a
           getters
             #F6 isCompleteDeclaration isOriginVariable isStatic v (nameOffset:<null>) (firstTokenOffset:<null>) (offset:11)
@@ -8407,6 +8236,7 @@
     var library = await buildLibrary(r'''
 enum E {
   v.named();
+
   new named();
 }
 ''');
@@ -8452,9 +8282,9 @@
                   rightBracket: ] @0
                   staticType: List<E>
           constructors
-            #F4 isConst isOriginDeclaration named (nameOffset:28) (firstTokenOffset:24) (offset:28)
+            #F4 isConst isOriginDeclaration named (nameOffset:29) (firstTokenOffset:25) (offset:29)
               element: <testLibrary>::@enum::E::@constructor::named
-              newKeywordOffset: 24
+              newKeywordOffset: 25
               typeName: null
           getters
             #F5 isCompleteDeclaration isOriginVariable isStatic v (nameOffset:<null>) (firstTokenOffset:<null>) (offset:11)
@@ -8506,6 +8336,7 @@
     var library = await buildLibrary(r'''
 enum E {
   v.named();
+
   const new named();
 }
 ''');
@@ -8551,9 +8382,9 @@
                   rightBracket: ] @0
                   staticType: List<E>
           constructors
-            #F4 isConst isOriginDeclaration named (nameOffset:34) (firstTokenOffset:24) (offset:34)
+            #F4 isConst isOriginDeclaration named (nameOffset:35) (firstTokenOffset:25) (offset:35)
               element: <testLibrary>::@enum::E::@constructor::named
-              newKeywordOffset: 30
+              newKeywordOffset: 31
               typeName: null
           getters
             #F5 isCompleteDeclaration isOriginVariable isStatic v (nameOffset:<null>) (firstTokenOffset:<null>) (offset:11)
@@ -8605,7 +8436,8 @@
     var library = await buildLibrary(r'''
 enum E {
   v;
-  new ();
+
+  new();
 }
 ''');
     checkElementText(library, r'''
@@ -8645,9 +8477,9 @@
                   rightBracket: ] @0
                   staticType: List<E>
           constructors
-            #F4 isConst isOriginDeclaration new (nameOffset:<null>) (firstTokenOffset:16) (offset:16)
+            #F4 isConst isOriginDeclaration new (nameOffset:<null>) (firstTokenOffset:17) (offset:17)
               element: <testLibrary>::@enum::E::@constructor::new
-              newKeywordOffset: 16
+              newKeywordOffset: 17
               typeName: null
           getters
             #F5 isCompleteDeclaration isOriginVariable isStatic v (nameOffset:<null>) (firstTokenOffset:<null>) (offset:11)
@@ -8699,7 +8531,8 @@
     var library = await buildLibrary(r'''
 enum E {
   v;
-  const new ();
+
+  const new();
 }
 ''');
     checkElementText(library, r'''
@@ -8739,9 +8572,9 @@
                   rightBracket: ] @0
                   staticType: List<E>
           constructors
-            #F4 isConst isOriginDeclaration new (nameOffset:<null>) (firstTokenOffset:16) (offset:16)
+            #F4 isConst isOriginDeclaration new (nameOffset:<null>) (firstTokenOffset:17) (offset:17)
               element: <testLibrary>::@enum::E::@constructor::new
-              newKeywordOffset: 22
+              newKeywordOffset: 23
               typeName: null
           getters
             #F5 isCompleteDeclaration isOriginVariable isStatic v (nameOffset:<null>) (firstTokenOffset:<null>) (offset:11)
@@ -8794,6 +8627,7 @@
 // @dart = 3.10
 enum E {
   v.named();
+
   E.named();
 }
 ''');
@@ -8839,11 +8673,11 @@
                   rightBracket: ] @0
                   staticType: List<E>
           constructors
-            #F4 isOriginDeclaration named (nameOffset:42) (firstTokenOffset:40) (offset:42)
+            #F4 isOriginDeclaration named (nameOffset:43) (firstTokenOffset:41) (offset:43)
               element: <testLibrary>::@enum::E::@constructor::named
               typeName: E
-              typeNameOffset: 40
-              periodOffset: 41
+              typeNameOffset: 41
+              periodOffset: 42
           getters
             #F5 isCompleteDeclaration isOriginVariable isStatic v (nameOffset:<null>) (firstTokenOffset:<null>) (offset:27)
               element: <testLibrary>::@enum::E::@getter::v
@@ -8895,6 +8729,7 @@
 // @dart = 3.10
 enum E {
   v;
+
   E();
 }
 ''');
@@ -8935,10 +8770,10 @@
                   rightBracket: ] @0
                   staticType: List<E>
           constructors
-            #F4 isOriginDeclaration new (nameOffset:<null>) (firstTokenOffset:32) (offset:32)
+            #F4 isOriginDeclaration new (nameOffset:<null>) (firstTokenOffset:33) (offset:33)
               element: <testLibrary>::@enum::E::@constructor::new
               typeName: E
-              typeNameOffset: 32
+              typeNameOffset: 33
           getters
             #F5 isCompleteDeclaration isOriginVariable isStatic v (nameOffset:<null>) (firstTokenOffset:<null>) (offset:27)
               element: <testLibrary>::@enum::E::@getter::v
@@ -8989,6 +8824,7 @@
     var library = await buildLibrary(r'''
 enum E {
   v(42);
+
   const E(int a);
 }
 ''');
@@ -9033,12 +8869,12 @@
                   rightBracket: ] @0
                   staticType: List<E>
           constructors
-            #F4 isConst isOriginDeclaration new (nameOffset:<null>) (firstTokenOffset:20) (offset:26)
+            #F4 isConst isOriginDeclaration new (nameOffset:<null>) (firstTokenOffset:21) (offset:27)
               element: <testLibrary>::@enum::E::@constructor::new
               typeName: E
-              typeNameOffset: 26
+              typeNameOffset: 27
               formalParameters
-                #F5 requiredPositional isOriginDeclaration a (nameOffset:32) (firstTokenOffset:28) (offset:32)
+                #F5 requiredPositional isOriginDeclaration a (nameOffset:33) (firstTokenOffset:29) (offset:33)
                   element: <testLibrary>::@enum::E::@constructor::new::@formalParameter::a
           getters
             #F6 isCompleteDeclaration isOriginVariable isStatic v (nameOffset:<null>) (firstTokenOffset:<null>) (offset:11)
@@ -9104,7 +8940,6 @@
 augment enum A {;
   void foo3() {}
 }
-
 ''');
 
     configuration.withConstantInitializers = false;
@@ -9382,9 +9217,8 @@
     var library = await buildLibrary(r'''
 part 'a1.dart';
 part 'a2.dart';
-enum A {
-  v
-}
+
+enum A { v }
 ''');
 
     configuration
@@ -9407,11 +9241,11 @@
           partKeywordOffset: 16
           unit: #F2
       enums
-        #F3 enum A (nameOffset:37) (firstTokenOffset:32) (offset:37)
+        #F3 enum A (nameOffset:38) (firstTokenOffset:33) (offset:38)
           element: <testLibrary>::@enum::A
           nextFragment: #F4
           fields
-            #F5 hasImplicitType hasInitializer isConst isEnumConstant isOriginDeclaration isStatic v (nameOffset:43) (firstTokenOffset:43) (offset:43)
+            #F5 hasImplicitType hasInitializer isConst isEnumConstant isOriginDeclaration isStatic v (nameOffset:42) (firstTokenOffset:42) (offset:42)
               element: <testLibrary>::@enum::A::@field::v
               initializer: expression_0
                 InstanceCreationExpression
@@ -9425,7 +9259,7 @@
                     leftParenthesis: ( @0
                     rightParenthesis: ) @0
                   staticType: A
-            #F6 isConst isOriginEnumValues isStatic values (nameOffset:<null>) (firstTokenOffset:<null>) (offset:37)
+            #F6 isConst isOriginEnumValues isStatic values (nameOffset:<null>) (firstTokenOffset:<null>) (offset:38)
               element: <testLibrary>::@enum::A::@field::values
               initializer: expression_1
                 ListLiteral
@@ -9438,13 +9272,13 @@
                   rightBracket: ] @0
                   staticType: List<A>
           constructors
-            #F7 isConst isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:37)
+            #F7 isConst isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:38)
               element: <testLibrary>::@enum::A::@constructor::new
               typeName: A
           getters
-            #F8 isCompleteDeclaration isOriginVariable isStatic v (nameOffset:<null>) (firstTokenOffset:<null>) (offset:43)
+            #F8 isCompleteDeclaration isOriginVariable isStatic v (nameOffset:<null>) (firstTokenOffset:<null>) (offset:42)
               element: <testLibrary>::@enum::A::@getter::v
-            #F9 isCompleteDeclaration isOriginVariable isStatic values (nameOffset:<null>) (firstTokenOffset:<null>) (offset:37)
+            #F9 isCompleteDeclaration isOriginVariable isStatic values (nameOffset:<null>) (firstTokenOffset:<null>) (offset:38)
               element: <testLibrary>::@enum::A::@getter::values
     #F1 package:test/a1.dart
       element: <testLibrary>
@@ -9798,10 +9632,8 @@
   }
 
   test_enum_codeRange() async {
-    var library = await buildLibrary('''
-enum E {
-  aaa, bbb, ccc
-}
+    var library = await buildLibrary(r'''
+enum E { aaa, bbb, ccc }
 ''');
     configuration.withCodeRanges = true;
     checkElementText(library, r'''
@@ -9814,7 +9646,7 @@
         #F1 enum E (nameOffset:5) (firstTokenOffset:0) (offset:5)
           element: <testLibrary>::@enum::E
           fields
-            #F2 hasImplicitType hasInitializer isConst isEnumConstant isOriginDeclaration isStatic aaa (nameOffset:11) (firstTokenOffset:11) (offset:11)
+            #F2 hasImplicitType hasInitializer isConst isEnumConstant isOriginDeclaration isStatic aaa (nameOffset:9) (firstTokenOffset:9) (offset:9)
               element: <testLibrary>::@enum::E::@field::aaa
               initializer: expression_0
                 InstanceCreationExpression
@@ -9828,7 +9660,7 @@
                     leftParenthesis: ( @0
                     rightParenthesis: ) @0
                   staticType: E
-            #F3 hasImplicitType hasInitializer isConst isEnumConstant isOriginDeclaration isStatic bbb (nameOffset:16) (firstTokenOffset:16) (offset:16)
+            #F3 hasImplicitType hasInitializer isConst isEnumConstant isOriginDeclaration isStatic bbb (nameOffset:14) (firstTokenOffset:14) (offset:14)
               element: <testLibrary>::@enum::E::@field::bbb
               initializer: expression_1
                 InstanceCreationExpression
@@ -9842,7 +9674,7 @@
                     leftParenthesis: ( @0
                     rightParenthesis: ) @0
                   staticType: E
-            #F4 hasImplicitType hasInitializer isConst isEnumConstant isOriginDeclaration isStatic ccc (nameOffset:21) (firstTokenOffset:21) (offset:21)
+            #F4 hasImplicitType hasInitializer isConst isEnumConstant isOriginDeclaration isStatic ccc (nameOffset:19) (firstTokenOffset:19) (offset:19)
               element: <testLibrary>::@enum::E::@field::ccc
               initializer: expression_2
                 InstanceCreationExpression
@@ -9881,11 +9713,11 @@
               element: <testLibrary>::@enum::E::@constructor::new
               typeName: E
           getters
-            #F7 isCompleteDeclaration isOriginVariable isStatic aaa (nameOffset:<null>) (firstTokenOffset:<null>) (offset:11)
+            #F7 isCompleteDeclaration isOriginVariable isStatic aaa (nameOffset:<null>) (firstTokenOffset:<null>) (offset:9)
               element: <testLibrary>::@enum::E::@getter::aaa
-            #F8 isCompleteDeclaration isOriginVariable isStatic bbb (nameOffset:<null>) (firstTokenOffset:<null>) (offset:16)
+            #F8 isCompleteDeclaration isOriginVariable isStatic bbb (nameOffset:<null>) (firstTokenOffset:<null>) (offset:14)
               element: <testLibrary>::@enum::E::@getter::bbb
-            #F9 isCompleteDeclaration isOriginVariable isStatic ccc (nameOffset:<null>) (firstTokenOffset:<null>) (offset:21)
+            #F9 isCompleteDeclaration isOriginVariable isStatic ccc (nameOffset:<null>) (firstTokenOffset:<null>) (offset:19)
               element: <testLibrary>::@enum::E::@getter::ccc
             #F10 isCompleteDeclaration isOriginVariable isStatic values (nameOffset:<null>) (firstTokenOffset:<null>) (offset:5)
               element: <testLibrary>::@enum::E::@getter::values
@@ -9957,12 +9789,13 @@
   }
 
   test_enum_documented() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 // Extra comment so doc comment offset != 0
 /**
  * Docs
  */
-enum E { v }''');
+enum E { v }
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -10164,8 +9997,8 @@
   }
 
   test_enum_error_extendsEnum() async {
-    var library = await buildLibrary('''
-enum E {a, b, c}
+    var library = await buildLibrary(r'''
+enum E { a, b, c }
 
 class M {}
 
@@ -10190,50 +10023,50 @@
     #F0 <testLibraryFragment>
       element: <testLibrary>
       classes
-        #F1 class M (nameOffset:24) (firstTokenOffset:18) (offset:24)
+        #F1 class M (nameOffset:26) (firstTokenOffset:20) (offset:26)
           element: <testLibrary>::@class::M
           constructors
-            #F2 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:24)
+            #F2 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:26)
               element: <testLibrary>::@class::M::@constructor::new
               typeName: M
-        #F3 hasExtendsClause class A (nameOffset:36) (firstTokenOffset:30) (offset:36)
+        #F3 hasExtendsClause class A (nameOffset:38) (firstTokenOffset:32) (offset:38)
           element: <testLibrary>::@class::A
           constructors
-            #F4 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:36)
+            #F4 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:38)
               element: <testLibrary>::@class::A::@constructor::new
               typeName: A
           methods
-            #F5 hasImplicitReturnType isCompleteDeclaration isOriginDeclaration foo (nameOffset:52) (firstTokenOffset:52) (offset:52)
+            #F5 hasImplicitReturnType isCompleteDeclaration isOriginDeclaration foo (nameOffset:54) (firstTokenOffset:54) (offset:54)
               element: <testLibrary>::@class::A::@method::foo
-        #F6 class B (nameOffset:70) (firstTokenOffset:64) (offset:70)
+        #F6 class B (nameOffset:72) (firstTokenOffset:66) (offset:72)
           element: <testLibrary>::@class::B
           constructors
-            #F7 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:70)
+            #F7 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:72)
               element: <testLibrary>::@class::B::@constructor::new
               typeName: B
           methods
-            #F8 hasImplicitReturnType isCompleteDeclaration isOriginDeclaration foo (nameOffset:92) (firstTokenOffset:92) (offset:92)
+            #F8 hasImplicitReturnType isCompleteDeclaration isOriginDeclaration foo (nameOffset:94) (firstTokenOffset:94) (offset:94)
               element: <testLibrary>::@class::B::@method::foo
-        #F9 hasExtendsClause class C (nameOffset:110) (firstTokenOffset:104) (offset:110)
+        #F9 hasExtendsClause class C (nameOffset:112) (firstTokenOffset:106) (offset:112)
           element: <testLibrary>::@class::C
           constructors
-            #F10 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:110)
+            #F10 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:112)
               element: <testLibrary>::@class::C::@constructor::new
               typeName: C
           methods
-            #F11 hasImplicitReturnType isCompleteDeclaration isOriginDeclaration foo (nameOffset:141) (firstTokenOffset:141) (offset:141)
+            #F11 hasImplicitReturnType isCompleteDeclaration isOriginDeclaration foo (nameOffset:143) (firstTokenOffset:143) (offset:143)
               element: <testLibrary>::@class::C::@method::foo
-        #F12 isMixinApplication class D (nameOffset:159) (firstTokenOffset:153) (offset:159)
+        #F12 isMixinApplication class D (nameOffset:161) (firstTokenOffset:155) (offset:161)
           element: <testLibrary>::@class::D
           constructors
-            #F13 isConst isOriginMixinApplication new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:159)
+            #F13 isConst isOriginMixinApplication new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:161)
               element: <testLibrary>::@class::D::@constructor::new
               typeName: D
       enums
         #F14 enum E (nameOffset:5) (firstTokenOffset:0) (offset:5)
           element: <testLibrary>::@enum::E
           fields
-            #F15 hasImplicitType hasInitializer isConst isEnumConstant isOriginDeclaration isStatic a (nameOffset:8) (firstTokenOffset:8) (offset:8)
+            #F15 hasImplicitType hasInitializer isConst isEnumConstant isOriginDeclaration isStatic a (nameOffset:9) (firstTokenOffset:9) (offset:9)
               element: <testLibrary>::@enum::E::@field::a
               initializer: expression_0
                 InstanceCreationExpression
@@ -10247,7 +10080,7 @@
                     leftParenthesis: ( @0
                     rightParenthesis: ) @0
                   staticType: E
-            #F16 hasImplicitType hasInitializer isConst isEnumConstant isOriginDeclaration isStatic b (nameOffset:11) (firstTokenOffset:11) (offset:11)
+            #F16 hasImplicitType hasInitializer isConst isEnumConstant isOriginDeclaration isStatic b (nameOffset:12) (firstTokenOffset:12) (offset:12)
               element: <testLibrary>::@enum::E::@field::b
               initializer: expression_1
                 InstanceCreationExpression
@@ -10261,7 +10094,7 @@
                     leftParenthesis: ( @0
                     rightParenthesis: ) @0
                   staticType: E
-            #F17 hasImplicitType hasInitializer isConst isEnumConstant isOriginDeclaration isStatic c (nameOffset:14) (firstTokenOffset:14) (offset:14)
+            #F17 hasImplicitType hasInitializer isConst isEnumConstant isOriginDeclaration isStatic c (nameOffset:15) (firstTokenOffset:15) (offset:15)
               element: <testLibrary>::@enum::E::@field::c
               initializer: expression_2
                 InstanceCreationExpression
@@ -10300,11 +10133,11 @@
               element: <testLibrary>::@enum::E::@constructor::new
               typeName: E
           getters
-            #F20 isCompleteDeclaration isOriginVariable isStatic a (nameOffset:<null>) (firstTokenOffset:<null>) (offset:8)
+            #F20 isCompleteDeclaration isOriginVariable isStatic a (nameOffset:<null>) (firstTokenOffset:<null>) (offset:9)
               element: <testLibrary>::@enum::E::@getter::a
-            #F21 isCompleteDeclaration isOriginVariable isStatic b (nameOffset:<null>) (firstTokenOffset:<null>) (offset:11)
+            #F21 isCompleteDeclaration isOriginVariable isStatic b (nameOffset:<null>) (firstTokenOffset:<null>) (offset:12)
               element: <testLibrary>::@enum::E::@getter::b
-            #F22 isCompleteDeclaration isOriginVariable isStatic c (nameOffset:<null>) (firstTokenOffset:<null>) (offset:14)
+            #F22 isCompleteDeclaration isOriginVariable isStatic c (nameOffset:<null>) (firstTokenOffset:<null>) (offset:15)
               element: <testLibrary>::@enum::E::@getter::c
             #F23 isCompleteDeclaration isOriginVariable isStatic values (nameOffset:<null>) (firstTokenOffset:<null>) (offset:5)
               element: <testLibrary>::@enum::E::@getter::values
@@ -10444,9 +10277,8 @@
   test_enum_interfaces() async {
     var library = await buildLibrary(r'''
 class I {}
-enum E implements I {
-  v;
-}
+
+enum E implements I { v }
 ''');
     checkElementText(library, r'''
 library
@@ -10462,10 +10294,10 @@
               element: <testLibrary>::@class::I::@constructor::new
               typeName: I
       enums
-        #F3 enum E (nameOffset:16) (firstTokenOffset:11) (offset:16)
+        #F3 enum E (nameOffset:17) (firstTokenOffset:12) (offset:17)
           element: <testLibrary>::@enum::E
           fields
-            #F4 hasImplicitType hasInitializer isConst isEnumConstant isOriginDeclaration isStatic v (nameOffset:35) (firstTokenOffset:35) (offset:35)
+            #F4 hasImplicitType hasInitializer isConst isEnumConstant isOriginDeclaration isStatic v (nameOffset:34) (firstTokenOffset:34) (offset:34)
               element: <testLibrary>::@enum::E::@field::v
               initializer: expression_0
                 InstanceCreationExpression
@@ -10479,7 +10311,7 @@
                     leftParenthesis: ( @0
                     rightParenthesis: ) @0
                   staticType: E
-            #F5 isConst isOriginEnumValues isStatic values (nameOffset:<null>) (firstTokenOffset:<null>) (offset:16)
+            #F5 isConst isOriginEnumValues isStatic values (nameOffset:<null>) (firstTokenOffset:<null>) (offset:17)
               element: <testLibrary>::@enum::E::@field::values
               initializer: expression_1
                 ListLiteral
@@ -10492,13 +10324,13 @@
                   rightBracket: ] @0
                   staticType: List<E>
           constructors
-            #F6 isConst isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:16)
+            #F6 isConst isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:17)
               element: <testLibrary>::@enum::E::@constructor::new
               typeName: E
           getters
-            #F7 isCompleteDeclaration isOriginVariable isStatic v (nameOffset:<null>) (firstTokenOffset:<null>) (offset:35)
+            #F7 isCompleteDeclaration isOriginVariable isStatic v (nameOffset:<null>) (firstTokenOffset:<null>) (offset:34)
               element: <testLibrary>::@enum::E::@getter::v
-            #F8 isCompleteDeclaration isOriginVariable isStatic values (nameOffset:<null>) (firstTokenOffset:<null>) (offset:16)
+            #F8 isCompleteDeclaration isOriginVariable isStatic values (nameOffset:<null>) (firstTokenOffset:<null>) (offset:17)
               element: <testLibrary>::@enum::E::@getter::values
   classes
     isSimplyBounded class I
@@ -11161,8 +10993,11 @@
   test_enum_interfaces_extensionType() async {
     var library = await buildLibrary(r'''
 class A {}
+
 extension type B(int it) {}
+
 class C {}
+
 enum E implements A, B, C { v }
 ''');
     configuration
@@ -11177,13 +11012,13 @@
       classes
         #F1 class A (nameOffset:6) (firstTokenOffset:0) (offset:6)
           element: <testLibrary>::@class::A
-        #F2 class C (nameOffset:45) (firstTokenOffset:39) (offset:45)
+        #F2 class C (nameOffset:47) (firstTokenOffset:41) (offset:47)
           element: <testLibrary>::@class::C
       enums
-        #F3 enum E (nameOffset:55) (firstTokenOffset:50) (offset:55)
+        #F3 enum E (nameOffset:58) (firstTokenOffset:53) (offset:58)
           element: <testLibrary>::@enum::E
           fields
-            #F4 hasImplicitType hasInitializer isConst isEnumConstant isOriginDeclaration isStatic v (nameOffset:78) (firstTokenOffset:78) (offset:78)
+            #F4 hasImplicitType hasInitializer isConst isEnumConstant isOriginDeclaration isStatic v (nameOffset:81) (firstTokenOffset:81) (offset:81)
               element: <testLibrary>::@enum::E::@field::v
               initializer: expression_0
                 InstanceCreationExpression
@@ -11197,7 +11032,7 @@
                     leftParenthesis: ( @0
                     rightParenthesis: ) @0
                   staticType: E
-            #F5 isConst isOriginEnumValues isStatic values (nameOffset:<null>) (firstTokenOffset:<null>) (offset:55)
+            #F5 isConst isOriginEnumValues isStatic values (nameOffset:<null>) (firstTokenOffset:<null>) (offset:58)
               element: <testLibrary>::@enum::E::@field::values
               initializer: expression_1
                 ListLiteral
@@ -11210,18 +11045,18 @@
                   rightBracket: ] @0
                   staticType: List<E>
           getters
-            #F6 isCompleteDeclaration isOriginVariable isStatic v (nameOffset:<null>) (firstTokenOffset:<null>) (offset:78)
+            #F6 isCompleteDeclaration isOriginVariable isStatic v (nameOffset:<null>) (firstTokenOffset:<null>) (offset:81)
               element: <testLibrary>::@enum::E::@getter::v
-            #F7 isCompleteDeclaration isOriginVariable isStatic values (nameOffset:<null>) (firstTokenOffset:<null>) (offset:55)
+            #F7 isCompleteDeclaration isOriginVariable isStatic values (nameOffset:<null>) (firstTokenOffset:<null>) (offset:58)
               element: <testLibrary>::@enum::E::@getter::values
       extensionTypes
-        #F8 extension type B (nameOffset:26) (firstTokenOffset:11) (offset:26)
+        #F8 extension type B (nameOffset:27) (firstTokenOffset:12) (offset:27)
           element: <testLibrary>::@extensionType::B
           fields
-            #F9 isFinal isOriginDeclaringFormalParameter it (nameOffset:<null>) (firstTokenOffset:<null>) (offset:26)
+            #F9 isFinal isOriginDeclaringFormalParameter it (nameOffset:<null>) (firstTokenOffset:<null>) (offset:27)
               element: <testLibrary>::@extensionType::B::@field::it
           getters
-            #F10 isCompleteDeclaration isOriginVariable it (nameOffset:<null>) (firstTokenOffset:<null>) (offset:26)
+            #F10 isCompleteDeclaration isOriginVariable it (nameOffset:<null>) (firstTokenOffset:<null>) (offset:27)
               element: <testLibrary>::@extensionType::B::@getter::it
   classes
     isSimplyBounded class A
@@ -11292,9 +11127,8 @@
   test_enum_interfaces_generic() async {
     var library = await buildLibrary(r'''
 class I<T> {}
-enum E<U> implements I<U> {
-  v;
-}
+
+enum E<U> implements I<U> { v }
 ''');
     checkElementText(library, r'''
 library
@@ -11313,13 +11147,13 @@
               element: <testLibrary>::@class::I::@constructor::new
               typeName: I
       enums
-        #F4 enum E (nameOffset:19) (firstTokenOffset:14) (offset:19)
+        #F4 enum E (nameOffset:20) (firstTokenOffset:15) (offset:20)
           element: <testLibrary>::@enum::E
           typeParameters
-            #F5 U (nameOffset:21) (firstTokenOffset:21) (offset:21)
+            #F5 U (nameOffset:22) (firstTokenOffset:22) (offset:22)
               element: #E1 U
           fields
-            #F6 hasImplicitType hasInitializer isConst isEnumConstant isOriginDeclaration isStatic v (nameOffset:44) (firstTokenOffset:44) (offset:44)
+            #F6 hasImplicitType hasInitializer isConst isEnumConstant isOriginDeclaration isStatic v (nameOffset:43) (firstTokenOffset:43) (offset:43)
               element: <testLibrary>::@enum::E::@field::v
               initializer: expression_0
                 InstanceCreationExpression
@@ -11335,7 +11169,7 @@
                     leftParenthesis: ( @0
                     rightParenthesis: ) @0
                   staticType: E<dynamic>
-            #F7 isConst isOriginEnumValues isStatic values (nameOffset:<null>) (firstTokenOffset:<null>) (offset:19)
+            #F7 isConst isOriginEnumValues isStatic values (nameOffset:<null>) (firstTokenOffset:<null>) (offset:20)
               element: <testLibrary>::@enum::E::@field::values
               initializer: expression_1
                 ListLiteral
@@ -11348,13 +11182,13 @@
                   rightBracket: ] @0
                   staticType: List<E<dynamic>>
           constructors
-            #F8 isConst isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:19)
+            #F8 isConst isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:20)
               element: <testLibrary>::@enum::E::@constructor::new
               typeName: E
           getters
-            #F9 isCompleteDeclaration isOriginVariable isStatic v (nameOffset:<null>) (firstTokenOffset:<null>) (offset:44)
+            #F9 isCompleteDeclaration isOriginVariable isStatic v (nameOffset:<null>) (firstTokenOffset:<null>) (offset:43)
               element: <testLibrary>::@enum::E::@getter::v
-            #F10 isCompleteDeclaration isOriginVariable isStatic values (nameOffset:<null>) (firstTokenOffset:<null>) (offset:19)
+            #F10 isCompleteDeclaration isOriginVariable isStatic values (nameOffset:<null>) (firstTokenOffset:<null>) (offset:20)
               element: <testLibrary>::@enum::E::@getter::values
   classes
     isSimplyBounded class I
@@ -11414,12 +11248,12 @@
   }
 
   test_enum_interfaces_unresolved() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class X {}
+
 class Z {}
-enum E implements X, Y, Z {
-  v
-}
+
+enum E implements X, Y, Z { v }
 ''');
     checkElementText(library, r'''
 library
@@ -11434,14 +11268,14 @@
             #F2 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:6)
               element: <testLibrary>::@class::X::@constructor::new
               typeName: X
-        #F3 class Z (nameOffset:17) (firstTokenOffset:11) (offset:17)
+        #F3 class Z (nameOffset:18) (firstTokenOffset:12) (offset:18)
           element: <testLibrary>::@class::Z
           constructors
-            #F4 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:17)
+            #F4 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:18)
               element: <testLibrary>::@class::Z::@constructor::new
               typeName: Z
       enums
-        #F5 enum E (nameOffset:27) (firstTokenOffset:22) (offset:27)
+        #F5 enum E (nameOffset:29) (firstTokenOffset:24) (offset:29)
           element: <testLibrary>::@enum::E
           fields
             #F6 hasImplicitType hasInitializer isConst isEnumConstant isOriginDeclaration isStatic v (nameOffset:52) (firstTokenOffset:52) (offset:52)
@@ -11458,7 +11292,7 @@
                     leftParenthesis: ( @0
                     rightParenthesis: ) @0
                   staticType: E
-            #F7 isConst isOriginEnumValues isStatic values (nameOffset:<null>) (firstTokenOffset:<null>) (offset:27)
+            #F7 isConst isOriginEnumValues isStatic values (nameOffset:<null>) (firstTokenOffset:<null>) (offset:29)
               element: <testLibrary>::@enum::E::@field::values
               initializer: expression_1
                 ListLiteral
@@ -11471,13 +11305,13 @@
                   rightBracket: ] @0
                   staticType: List<E>
           constructors
-            #F8 isConst isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:27)
+            #F8 isConst isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:29)
               element: <testLibrary>::@enum::E::@constructor::new
               typeName: E
           getters
             #F9 isCompleteDeclaration isOriginVariable isStatic v (nameOffset:<null>) (firstTokenOffset:<null>) (offset:52)
               element: <testLibrary>::@enum::E::@getter::v
-            #F10 isCompleteDeclaration isOriginVariable isStatic values (nameOffset:<null>) (firstTokenOffset:<null>) (offset:27)
+            #F10 isCompleteDeclaration isOriginVariable isStatic values (nameOffset:<null>) (firstTokenOffset:<null>) (offset:29)
               element: <testLibrary>::@enum::E::@getter::values
   classes
     isSimplyBounded class X
@@ -11539,9 +11373,10 @@
   }
 
   test_enum_lazy_all_constructors() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 enum E {
   v.foo();
+
   const E.foo();
 }
 ''');
@@ -11551,9 +11386,10 @@
   }
 
   test_enum_lazy_all_fields() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 enum E {
   v;
+
   final foo = 42;
 }
 ''');
@@ -11563,9 +11399,10 @@
   }
 
   test_enum_lazy_all_getters() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 enum E {
   v;
+
   int get foo => 0;
 }
 ''');
@@ -11575,9 +11412,10 @@
   }
 
   test_enum_lazy_all_methods() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 enum E {
   v;
+
   void foo() {}
 }
 ''');
@@ -11587,9 +11425,10 @@
   }
 
   test_enum_lazy_all_setters() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 enum E {
   v;
+
   set foo(int _) {}
 }
 ''');
@@ -11599,9 +11438,10 @@
   }
 
   test_enum_lazy_byReference_constructor() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 enum E {
   v.foo();
+
   const E.foo();
 }
 ''');
@@ -11612,9 +11452,10 @@
   }
 
   test_enum_lazy_byReference_field() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 enum E {
   v;
+
   final foo = 42;
 }
 ''');
@@ -11625,9 +11466,10 @@
   }
 
   test_enum_lazy_byReference_getter() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 enum E {
   v;
+
   int get foo => 0;
 }
 ''');
@@ -11638,9 +11480,10 @@
   }
 
   test_enum_lazy_byReference_method() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 enum E {
   v;
+
   void foo() {}
 }
 ''');
@@ -11651,9 +11494,10 @@
   }
 
   test_enum_lazy_byReference_setter() async {
-    var library = await buildLibrary('''
-enum E{
+    var library = await buildLibrary(r'''
+enum E {
   v;
+
   set foo(int _) {}
 }
 ''');
@@ -11664,7 +11508,12 @@
   }
 
   test_enum_metadata() async {
-    var library = await buildLibrary('const a = 42; @a enum E { v }');
+    var library = await buildLibrary(r'''
+const a = 42;
+
+@a
+enum E { v }
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -11672,10 +11521,10 @@
     #F0 <testLibraryFragment>
       element: <testLibrary>
       enums
-        #F1 enum E (nameOffset:22) (firstTokenOffset:14) (offset:22)
+        #F1 enum E (nameOffset:23) (firstTokenOffset:15) (offset:23)
           element: <testLibrary>::@enum::E
           fields
-            #F2 hasImplicitType hasInitializer isConst isEnumConstant isOriginDeclaration isStatic v (nameOffset:26) (firstTokenOffset:26) (offset:26)
+            #F2 hasImplicitType hasInitializer isConst isEnumConstant isOriginDeclaration isStatic v (nameOffset:27) (firstTokenOffset:27) (offset:27)
               element: <testLibrary>::@enum::E::@field::v
               initializer: expression_0
                 InstanceCreationExpression
@@ -11689,7 +11538,7 @@
                     leftParenthesis: ( @0
                     rightParenthesis: ) @0
                   staticType: E
-            #F3 isConst isOriginEnumValues isStatic values (nameOffset:<null>) (firstTokenOffset:<null>) (offset:22)
+            #F3 isConst isOriginEnumValues isStatic values (nameOffset:<null>) (firstTokenOffset:<null>) (offset:23)
               element: <testLibrary>::@enum::E::@field::values
               initializer: expression_1
                 ListLiteral
@@ -11702,13 +11551,13 @@
                   rightBracket: ] @0
                   staticType: List<E>
           constructors
-            #F4 isConst isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:22)
+            #F4 isConst isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:23)
               element: <testLibrary>::@enum::E::@constructor::new
               typeName: E
           getters
-            #F5 isCompleteDeclaration isOriginVariable isStatic v (nameOffset:<null>) (firstTokenOffset:<null>) (offset:26)
+            #F5 isCompleteDeclaration isOriginVariable isStatic v (nameOffset:<null>) (firstTokenOffset:<null>) (offset:27)
               element: <testLibrary>::@enum::E::@getter::v
-            #F6 isCompleteDeclaration isOriginVariable isStatic values (nameOffset:<null>) (firstTokenOffset:<null>) (offset:22)
+            #F6 isCompleteDeclaration isOriginVariable isStatic values (nameOffset:<null>) (firstTokenOffset:<null>) (offset:23)
               element: <testLibrary>::@enum::E::@getter::values
       topLevelVariables
         #F7 hasImplicitType hasInitializer isConst isOriginDeclaration isStatic a (nameOffset:6) (firstTokenOffset:6) (offset:6)
@@ -11783,6 +11632,7 @@
 @foo
 enum E<@foo T> {
   v;
+
   static const foo = 1;
   @foo
   void bar() {}
@@ -11837,11 +11687,11 @@
                       staticType: E<dynamic>
                   rightBracket: ] @0
                   staticType: List<E<dynamic>>
-            #F5 hasImplicitType hasInitializer isConst isOriginDeclaration isStatic foo (nameOffset:58) (firstTokenOffset:58) (offset:58)
+            #F5 hasImplicitType hasInitializer isConst isOriginDeclaration isStatic foo (nameOffset:59) (firstTokenOffset:59) (offset:59)
               element: <testLibrary>::@enum::E::@field::foo
               initializer: expression_2
                 IntegerLiteral
-                  literal: 1 @64
+                  literal: 1 @65
                   staticType: int
           constructors
             #F6 isConst isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:26)
@@ -11852,16 +11702,16 @@
               element: <testLibrary>::@enum::E::@getter::v
             #F8 isCompleteDeclaration isOriginVariable isStatic values (nameOffset:<null>) (firstTokenOffset:<null>) (offset:26)
               element: <testLibrary>::@enum::E::@getter::values
-            #F9 isCompleteDeclaration isOriginVariable isStatic foo (nameOffset:<null>) (firstTokenOffset:<null>) (offset:58)
+            #F9 isCompleteDeclaration isOriginVariable isStatic foo (nameOffset:<null>) (firstTokenOffset:<null>) (offset:59)
               element: <testLibrary>::@enum::E::@getter::foo
           methods
-            #F10 isCompleteDeclaration isOriginDeclaration bar (nameOffset:81) (firstTokenOffset:69) (offset:81)
+            #F10 isCompleteDeclaration isOriginDeclaration bar (nameOffset:82) (firstTokenOffset:70) (offset:82)
               element: <testLibrary>::@enum::E::@method::bar
               metadata
                 Annotation
-                  atSign: @ @69
+                  atSign: @ @70
                   name: SimpleIdentifier
-                    token: foo @70
+                    token: foo @71
                     element: <testLibrary>::@enum::E::@getter::foo
                     staticType: null
                   element: <testLibrary>::@enum::E::@getter::foo
@@ -11943,9 +11793,9 @@
           firstFragment: #F10
           metadata
             Annotation
-              atSign: @ @69
+              atSign: @ @70
               name: SimpleIdentifier
-                token: foo @70
+                token: foo @71
                 element: <testLibrary>::@enum::E::@getter::foo
                 staticType: null
               element: <testLibrary>::@enum::E::@getter::foo
@@ -11970,7 +11820,9 @@
 
   test_enum_missingName() async {
     var library = await buildLibrary(r'''
-enum {v}
+enum {
+  v
+}
 ''');
     checkElementText(library, r'''
 library
@@ -11982,7 +11834,7 @@
         #F1 enum <null-name> (nameOffset:<null>) (firstTokenOffset:0) (offset:0)
           element: <testLibrary>::@enum::#0
           fields
-            #F2 hasImplicitType hasInitializer isConst isEnumConstant isOriginDeclaration isStatic v (nameOffset:6) (firstTokenOffset:6) (offset:6)
+            #F2 hasImplicitType hasInitializer isConst isEnumConstant isOriginDeclaration isStatic v (nameOffset:9) (firstTokenOffset:9) (offset:9)
               element: <testLibrary>::@enum::#0::@field::v
               initializer: expression_0
                 InstanceCreationExpression
@@ -12013,7 +11865,7 @@
               element: <testLibrary>::@enum::#0::@constructor::new
               typeName: null
           getters
-            #F5 isCompleteDeclaration isOriginVariable isStatic v (nameOffset:<null>) (firstTokenOffset:<null>) (offset:6)
+            #F5 isCompleteDeclaration isOriginVariable isStatic v (nameOffset:<null>) (firstTokenOffset:<null>) (offset:9)
               element: <testLibrary>::@enum::#0::@getter::v
             #F6 isCompleteDeclaration isOriginVariable isStatic values (nameOffset:<null>) (firstTokenOffset:<null>) (offset:0)
               element: <testLibrary>::@enum::#0::@getter::values
@@ -12061,9 +11913,8 @@
   test_enum_mixins() async {
     var library = await buildLibrary(r'''
 mixin M {}
-enum E with M {
-  v;
-}
+
+enum E with M { v }
 ''');
     checkElementText(library, r'''
 library
@@ -12072,10 +11923,10 @@
     #F0 <testLibraryFragment>
       element: <testLibrary>
       enums
-        #F1 enum E (nameOffset:16) (firstTokenOffset:11) (offset:16)
+        #F1 enum E (nameOffset:17) (firstTokenOffset:12) (offset:17)
           element: <testLibrary>::@enum::E
           fields
-            #F2 hasImplicitType hasInitializer isConst isEnumConstant isOriginDeclaration isStatic v (nameOffset:29) (firstTokenOffset:29) (offset:29)
+            #F2 hasImplicitType hasInitializer isConst isEnumConstant isOriginDeclaration isStatic v (nameOffset:28) (firstTokenOffset:28) (offset:28)
               element: <testLibrary>::@enum::E::@field::v
               initializer: expression_0
                 InstanceCreationExpression
@@ -12089,7 +11940,7 @@
                     leftParenthesis: ( @0
                     rightParenthesis: ) @0
                   staticType: E
-            #F3 isConst isOriginEnumValues isStatic values (nameOffset:<null>) (firstTokenOffset:<null>) (offset:16)
+            #F3 isConst isOriginEnumValues isStatic values (nameOffset:<null>) (firstTokenOffset:<null>) (offset:17)
               element: <testLibrary>::@enum::E::@field::values
               initializer: expression_1
                 ListLiteral
@@ -12102,13 +11953,13 @@
                   rightBracket: ] @0
                   staticType: List<E>
           constructors
-            #F4 isConst isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:16)
+            #F4 isConst isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:17)
               element: <testLibrary>::@enum::E::@constructor::new
               typeName: E
           getters
-            #F5 isCompleteDeclaration isOriginVariable isStatic v (nameOffset:<null>) (firstTokenOffset:<null>) (offset:29)
+            #F5 isCompleteDeclaration isOriginVariable isStatic v (nameOffset:<null>) (firstTokenOffset:<null>) (offset:28)
               element: <testLibrary>::@enum::E::@getter::v
-            #F6 isCompleteDeclaration isOriginVariable isStatic values (nameOffset:<null>) (firstTokenOffset:<null>) (offset:16)
+            #F6 isCompleteDeclaration isOriginVariable isStatic values (nameOffset:<null>) (firstTokenOffset:<null>) (offset:17)
               element: <testLibrary>::@enum::E::@getter::values
       mixins
         #F7 mixin M (nameOffset:6) (firstTokenOffset:0) (offset:6)
@@ -12466,8 +12317,11 @@
   test_enum_mixins_extensionType() async {
     var library = await buildLibrary(r'''
 class A {}
+
 extension type B(int it) {}
+
 class C {}
+
 enum E with A, B, C { v }
 ''');
     configuration
@@ -12482,13 +12336,13 @@
       classes
         #F1 class A (nameOffset:6) (firstTokenOffset:0) (offset:6)
           element: <testLibrary>::@class::A
-        #F2 class C (nameOffset:45) (firstTokenOffset:39) (offset:45)
+        #F2 class C (nameOffset:47) (firstTokenOffset:41) (offset:47)
           element: <testLibrary>::@class::C
       enums
-        #F3 enum E (nameOffset:55) (firstTokenOffset:50) (offset:55)
+        #F3 enum E (nameOffset:58) (firstTokenOffset:53) (offset:58)
           element: <testLibrary>::@enum::E
           fields
-            #F4 hasImplicitType hasInitializer isConst isEnumConstant isOriginDeclaration isStatic v (nameOffset:72) (firstTokenOffset:72) (offset:72)
+            #F4 hasImplicitType hasInitializer isConst isEnumConstant isOriginDeclaration isStatic v (nameOffset:75) (firstTokenOffset:75) (offset:75)
               element: <testLibrary>::@enum::E::@field::v
               initializer: expression_0
                 InstanceCreationExpression
@@ -12502,7 +12356,7 @@
                     leftParenthesis: ( @0
                     rightParenthesis: ) @0
                   staticType: E
-            #F5 isConst isOriginEnumValues isStatic values (nameOffset:<null>) (firstTokenOffset:<null>) (offset:55)
+            #F5 isConst isOriginEnumValues isStatic values (nameOffset:<null>) (firstTokenOffset:<null>) (offset:58)
               element: <testLibrary>::@enum::E::@field::values
               initializer: expression_1
                 ListLiteral
@@ -12515,18 +12369,18 @@
                   rightBracket: ] @0
                   staticType: List<E>
           getters
-            #F6 isCompleteDeclaration isOriginVariable isStatic v (nameOffset:<null>) (firstTokenOffset:<null>) (offset:72)
+            #F6 isCompleteDeclaration isOriginVariable isStatic v (nameOffset:<null>) (firstTokenOffset:<null>) (offset:75)
               element: <testLibrary>::@enum::E::@getter::v
-            #F7 isCompleteDeclaration isOriginVariable isStatic values (nameOffset:<null>) (firstTokenOffset:<null>) (offset:55)
+            #F7 isCompleteDeclaration isOriginVariable isStatic values (nameOffset:<null>) (firstTokenOffset:<null>) (offset:58)
               element: <testLibrary>::@enum::E::@getter::values
       extensionTypes
-        #F8 extension type B (nameOffset:26) (firstTokenOffset:11) (offset:26)
+        #F8 extension type B (nameOffset:27) (firstTokenOffset:12) (offset:27)
           element: <testLibrary>::@extensionType::B
           fields
-            #F9 isFinal isOriginDeclaringFormalParameter it (nameOffset:<null>) (firstTokenOffset:<null>) (offset:26)
+            #F9 isFinal isOriginDeclaringFormalParameter it (nameOffset:<null>) (firstTokenOffset:<null>) (offset:27)
               element: <testLibrary>::@extensionType::B::@field::it
           getters
-            #F10 isCompleteDeclaration isOriginVariable it (nameOffset:<null>) (firstTokenOffset:<null>) (offset:26)
+            #F10 isCompleteDeclaration isOriginVariable it (nameOffset:<null>) (firstTokenOffset:<null>) (offset:27)
               element: <testLibrary>::@extensionType::B::@getter::it
   classes
     isSimplyBounded class A
@@ -12597,10 +12451,10 @@
   test_enum_mixins_inference() async {
     var library = await buildLibrary(r'''
 mixin M1<T> {}
+
 mixin M2<T> on M1<T> {}
-enum E with M1<int>, M2 {
-  v;
-}
+
+enum E with M1<int>, M2 { v }
 ''');
     checkElementText(library, r'''
 library
@@ -12609,7 +12463,7 @@
     #F0 <testLibraryFragment>
       element: <testLibrary>
       enums
-        #F1 enum E (nameOffset:44) (firstTokenOffset:39) (offset:44)
+        #F1 enum E (nameOffset:46) (firstTokenOffset:41) (offset:46)
           element: <testLibrary>::@enum::E
           fields
             #F2 hasImplicitType hasInitializer isConst isEnumConstant isOriginDeclaration isStatic v (nameOffset:67) (firstTokenOffset:67) (offset:67)
@@ -12626,7 +12480,7 @@
                     leftParenthesis: ( @0
                     rightParenthesis: ) @0
                   staticType: E
-            #F3 isConst isOriginEnumValues isStatic values (nameOffset:<null>) (firstTokenOffset:<null>) (offset:44)
+            #F3 isConst isOriginEnumValues isStatic values (nameOffset:<null>) (firstTokenOffset:<null>) (offset:46)
               element: <testLibrary>::@enum::E::@field::values
               initializer: expression_1
                 ListLiteral
@@ -12639,13 +12493,13 @@
                   rightBracket: ] @0
                   staticType: List<E>
           constructors
-            #F4 isConst isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:44)
+            #F4 isConst isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:46)
               element: <testLibrary>::@enum::E::@constructor::new
               typeName: E
           getters
             #F5 isCompleteDeclaration isOriginVariable isStatic v (nameOffset:<null>) (firstTokenOffset:<null>) (offset:67)
               element: <testLibrary>::@enum::E::@getter::v
-            #F6 isCompleteDeclaration isOriginVariable isStatic values (nameOffset:<null>) (firstTokenOffset:<null>) (offset:44)
+            #F6 isCompleteDeclaration isOriginVariable isStatic values (nameOffset:<null>) (firstTokenOffset:<null>) (offset:46)
               element: <testLibrary>::@enum::E::@getter::values
       mixins
         #F7 mixin M1 (nameOffset:6) (firstTokenOffset:0) (offset:6)
@@ -12653,10 +12507,10 @@
           typeParameters
             #F8 T (nameOffset:9) (firstTokenOffset:9) (offset:9)
               element: #E0 T
-        #F9 mixin M2 (nameOffset:21) (firstTokenOffset:15) (offset:21)
+        #F9 mixin M2 (nameOffset:22) (firstTokenOffset:16) (offset:22)
           element: <testLibrary>::@mixin::M2
           typeParameters
-            #F10 T (nameOffset:24) (firstTokenOffset:24) (offset:24)
+            #F10 T (nameOffset:25) (firstTokenOffset:25) (offset:25)
               element: #E1 T
   enums
     isSimplyBounded enum E
@@ -12720,10 +12574,8 @@
   }
 
   test_enum_typeParameters() async {
-    var library = await buildLibrary('''
-enum E<T> {
-  v
-}
+    var library = await buildLibrary(r'''
+enum E<T> { v }
 ''');
     checkElementText(library, r'''
 library
@@ -12738,7 +12590,7 @@
             #F2 T (nameOffset:7) (firstTokenOffset:7) (offset:7)
               element: #E0 T
           fields
-            #F3 hasImplicitType hasInitializer isConst isEnumConstant isOriginDeclaration isStatic v (nameOffset:14) (firstTokenOffset:14) (offset:14)
+            #F3 hasImplicitType hasInitializer isConst isEnumConstant isOriginDeclaration isStatic v (nameOffset:12) (firstTokenOffset:12) (offset:12)
               element: <testLibrary>::@enum::E::@field::v
               initializer: expression_0
                 InstanceCreationExpression
@@ -12771,7 +12623,7 @@
               element: <testLibrary>::@enum::E::@constructor::new
               typeName: E
           getters
-            #F6 isCompleteDeclaration isOriginVariable isStatic v (nameOffset:<null>) (firstTokenOffset:<null>) (offset:14)
+            #F6 isCompleteDeclaration isOriginVariable isStatic v (nameOffset:<null>) (firstTokenOffset:<null>) (offset:12)
               element: <testLibrary>::@enum::E::@getter::v
             #F7 isCompleteDeclaration isOriginVariable isStatic values (nameOffset:<null>) (firstTokenOffset:<null>) (offset:5)
               element: <testLibrary>::@enum::E::@getter::values
@@ -13201,10 +13053,8 @@
   }
 
   test_enum_typeParameters_bound() async {
-    var library = await buildLibrary('''
-enum E<T extends num, U extends T> {
-  v
-}
+    var library = await buildLibrary(r'''
+enum E<T extends num, U extends T> { v }
 ''');
     checkElementText(library, r'''
 library
@@ -13221,7 +13071,7 @@
             #F3 U (nameOffset:22) (firstTokenOffset:22) (offset:22)
               element: #E1 U
           fields
-            #F4 hasImplicitType hasInitializer isConst isEnumConstant isOriginDeclaration isStatic v (nameOffset:39) (firstTokenOffset:39) (offset:39)
+            #F4 hasImplicitType hasInitializer isConst isEnumConstant isOriginDeclaration isStatic v (nameOffset:37) (firstTokenOffset:37) (offset:37)
               element: <testLibrary>::@enum::E::@field::v
               initializer: expression_0
                 InstanceCreationExpression
@@ -13254,7 +13104,7 @@
               element: <testLibrary>::@enum::E::@constructor::new
               typeName: E
           getters
-            #F7 isCompleteDeclaration isOriginVariable isStatic v (nameOffset:<null>) (firstTokenOffset:<null>) (offset:39)
+            #F7 isCompleteDeclaration isOriginVariable isStatic v (nameOffset:<null>) (firstTokenOffset:<null>) (offset:37)
               element: <testLibrary>::@enum::E::@getter::v
             #F8 isCompleteDeclaration isOriginVariable isStatic values (nameOffset:<null>) (firstTokenOffset:<null>) (offset:5)
               element: <testLibrary>::@enum::E::@getter::values
@@ -13307,7 +13157,7 @@
   }
 
   test_enum_typeParameters_cycle_1of1() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 enum E<T extends T> {}
 ''');
     checkElementText(library, r'''
@@ -13636,11 +13486,10 @@
   }
 
   test_enum_typeParameters_metadata() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 const a = 42;
-enum E<@a T> {
-  v
-}
+
+enum E<@a T> { v }
 ''');
     checkElementText(library, r'''
 library
@@ -13649,21 +13498,21 @@
     #F0 <testLibraryFragment>
       element: <testLibrary>
       enums
-        #F1 enum E (nameOffset:19) (firstTokenOffset:14) (offset:19)
+        #F1 enum E (nameOffset:20) (firstTokenOffset:15) (offset:20)
           element: <testLibrary>::@enum::E
           typeParameters
-            #F2 T (nameOffset:24) (firstTokenOffset:21) (offset:24)
+            #F2 T (nameOffset:25) (firstTokenOffset:22) (offset:25)
               element: #E0 T
               metadata
                 Annotation
-                  atSign: @ @21
+                  atSign: @ @22
                   name: SimpleIdentifier
-                    token: a @22
+                    token: a @23
                     element: <testLibrary>::@getter::a
                     staticType: null
                   element: <testLibrary>::@getter::a
           fields
-            #F3 hasImplicitType hasInitializer isConst isEnumConstant isOriginDeclaration isStatic v (nameOffset:31) (firstTokenOffset:31) (offset:31)
+            #F3 hasImplicitType hasInitializer isConst isEnumConstant isOriginDeclaration isStatic v (nameOffset:30) (firstTokenOffset:30) (offset:30)
               element: <testLibrary>::@enum::E::@field::v
               initializer: expression_0
                 InstanceCreationExpression
@@ -13679,7 +13528,7 @@
                     leftParenthesis: ( @0
                     rightParenthesis: ) @0
                   staticType: E<dynamic>
-            #F4 isConst isOriginEnumValues isStatic values (nameOffset:<null>) (firstTokenOffset:<null>) (offset:19)
+            #F4 isConst isOriginEnumValues isStatic values (nameOffset:<null>) (firstTokenOffset:<null>) (offset:20)
               element: <testLibrary>::@enum::E::@field::values
               initializer: expression_1
                 ListLiteral
@@ -13692,13 +13541,13 @@
                   rightBracket: ] @0
                   staticType: List<E<dynamic>>
           constructors
-            #F5 isConst isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:19)
+            #F5 isConst isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:20)
               element: <testLibrary>::@enum::E::@constructor::new
               typeName: E
           getters
-            #F6 isCompleteDeclaration isOriginVariable isStatic v (nameOffset:<null>) (firstTokenOffset:<null>) (offset:31)
+            #F6 isCompleteDeclaration isOriginVariable isStatic v (nameOffset:<null>) (firstTokenOffset:<null>) (offset:30)
               element: <testLibrary>::@enum::E::@getter::v
-            #F7 isCompleteDeclaration isOriginVariable isStatic values (nameOffset:<null>) (firstTokenOffset:<null>) (offset:19)
+            #F7 isCompleteDeclaration isOriginVariable isStatic values (nameOffset:<null>) (firstTokenOffset:<null>) (offset:20)
               element: <testLibrary>::@enum::E::@getter::values
       topLevelVariables
         #F8 hasImplicitType hasInitializer isConst isOriginDeclaration isStatic a (nameOffset:6) (firstTokenOffset:6) (offset:6)
@@ -13719,9 +13568,9 @@
           firstFragment: #F2
           metadata
             Annotation
-              atSign: @ @21
+              atSign: @ @22
               name: SimpleIdentifier
-                token: a @22
+                token: a @23
                 element: <testLibrary>::@getter::a
                 staticType: null
               element: <testLibrary>::@getter::a
@@ -13778,7 +13627,7 @@
   }
 
   test_enum_typeParameters_variance_contravariant() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 enum E<in T> {}
 ''');
     checkElementText(library, r'''
@@ -13840,7 +13689,7 @@
   }
 
   test_enum_typeParameters_variance_covariant() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 enum E<out T> {}
 ''');
     checkElementText(library, r'''
@@ -13902,7 +13751,7 @@
   }
 
   test_enum_typeParameters_variance_invariant() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 enum E<inout T> {}
 ''');
     checkElementText(library, r'''
@@ -13964,7 +13813,7 @@
   }
 
   test_enum_typeParameters_variance_multiple() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 enum E<inout T, in U, out V> {}
 ''');
     checkElementText(library, r'''
@@ -14034,7 +13883,9 @@
   }
 
   test_enum_values() async {
-    var library = await buildLibrary('enum E { v1, v2 }');
+    var library = await buildLibrary(r'''
+enum E { v1, v2 }
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -14155,7 +14006,11 @@
   }
 
   test_enums() async {
-    var library = await buildLibrary('enum E1 { v1 } enum E2 { v2 }');
+    var library = await buildLibrary(r'''
+enum E1 { v1 }
+
+enum E2 { v2 }
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -14201,10 +14056,10 @@
               element: <testLibrary>::@enum::E1::@getter::v1
             #F6 isCompleteDeclaration isOriginVariable isStatic values (nameOffset:<null>) (firstTokenOffset:<null>) (offset:5)
               element: <testLibrary>::@enum::E1::@getter::values
-        #F7 enum E2 (nameOffset:20) (firstTokenOffset:15) (offset:20)
+        #F7 enum E2 (nameOffset:21) (firstTokenOffset:16) (offset:21)
           element: <testLibrary>::@enum::E2
           fields
-            #F8 hasImplicitType hasInitializer isConst isEnumConstant isOriginDeclaration isStatic v2 (nameOffset:25) (firstTokenOffset:25) (offset:25)
+            #F8 hasImplicitType hasInitializer isConst isEnumConstant isOriginDeclaration isStatic v2 (nameOffset:26) (firstTokenOffset:26) (offset:26)
               element: <testLibrary>::@enum::E2::@field::v2
               initializer: expression_2
                 InstanceCreationExpression
@@ -14218,7 +14073,7 @@
                     leftParenthesis: ( @0
                     rightParenthesis: ) @0
                   staticType: E2
-            #F9 isConst isOriginEnumValues isStatic values (nameOffset:<null>) (firstTokenOffset:<null>) (offset:20)
+            #F9 isConst isOriginEnumValues isStatic values (nameOffset:<null>) (firstTokenOffset:<null>) (offset:21)
               element: <testLibrary>::@enum::E2::@field::values
               initializer: expression_3
                 ListLiteral
@@ -14231,13 +14086,13 @@
                   rightBracket: ] @0
                   staticType: List<E2>
           constructors
-            #F10 isConst isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:20)
+            #F10 isConst isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:21)
               element: <testLibrary>::@enum::E2::@constructor::new
               typeName: E2
           getters
-            #F11 isCompleteDeclaration isOriginVariable isStatic v2 (nameOffset:<null>) (firstTokenOffset:<null>) (offset:25)
+            #F11 isCompleteDeclaration isOriginVariable isStatic v2 (nameOffset:<null>) (firstTokenOffset:<null>) (offset:26)
               element: <testLibrary>::@enum::E2::@getter::v2
-            #F12 isCompleteDeclaration isOriginVariable isStatic values (nameOffset:<null>) (firstTokenOffset:<null>) (offset:20)
+            #F12 isCompleteDeclaration isOriginVariable isStatic values (nameOffset:<null>) (firstTokenOffset:<null>) (offset:21)
               element: <testLibrary>::@enum::E2::@getter::values
   enums
     isSimplyBounded enum E1
@@ -14321,6 +14176,7 @@
     var library = await buildLibrary(r'''
 enum E {
   v;
+
   final foo = 42;
 }
 ''');
@@ -14360,11 +14216,11 @@
                       staticType: E
                   rightBracket: ] @0
                   staticType: List<E>
-            #F4 hasImplicitType hasInitializer isFinal isOriginDeclaration foo (nameOffset:22) (firstTokenOffset:22) (offset:22)
+            #F4 hasImplicitType hasInitializer isFinal isOriginDeclaration foo (nameOffset:23) (firstTokenOffset:23) (offset:23)
               element: <testLibrary>::@enum::E::@field::foo
               initializer: expression_2
                 IntegerLiteral
-                  literal: 42 @28
+                  literal: 42 @29
                   staticType: int
           constructors
             #F5 isConst isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:5)
@@ -14375,7 +14231,7 @@
               element: <testLibrary>::@enum::E::@getter::v
             #F7 isCompleteDeclaration isOriginVariable isStatic values (nameOffset:<null>) (firstTokenOffset:<null>) (offset:5)
               element: <testLibrary>::@enum::E::@getter::values
-            #F8 isCompleteDeclaration isOriginVariable foo (nameOffset:<null>) (firstTokenOffset:<null>) (offset:22)
+            #F8 isCompleteDeclaration isOriginVariable foo (nameOffset:<null>) (firstTokenOffset:<null>) (offset:23)
               element: <testLibrary>::@enum::E::@getter::foo
   enums
     isSimplyBounded enum E
@@ -15988,6 +15844,7 @@
     var library = await buildLibrary(r'''
 enum E {
   v(null);
+
   final int? _foo;
   E(this._foo);
 }
@@ -16012,8 +15869,9 @@
 
   test_getter() async {
     var library = await buildLibrary(r'''
-enum E{
+enum E {
   v;
+
   int get foo => 0;
 }
 ''');
@@ -16027,7 +15885,7 @@
         #F1 enum E (nameOffset:5) (firstTokenOffset:0) (offset:5)
           element: <testLibrary>::@enum::E
           fields
-            #F2 hasImplicitType hasInitializer isConst isEnumConstant isOriginDeclaration isStatic v (nameOffset:10) (firstTokenOffset:10) (offset:10)
+            #F2 hasImplicitType hasInitializer isConst isEnumConstant isOriginDeclaration isStatic v (nameOffset:11) (firstTokenOffset:11) (offset:11)
               element: <testLibrary>::@enum::E::@field::v
               initializer: expression_0
                 InstanceCreationExpression
@@ -16060,11 +15918,11 @@
               element: <testLibrary>::@enum::E::@constructor::new
               typeName: E
           getters
-            #F6 isCompleteDeclaration isOriginVariable isStatic v (nameOffset:<null>) (firstTokenOffset:<null>) (offset:10)
+            #F6 isCompleteDeclaration isOriginVariable isStatic v (nameOffset:<null>) (firstTokenOffset:<null>) (offset:11)
               element: <testLibrary>::@enum::E::@getter::v
             #F7 isCompleteDeclaration isOriginVariable isStatic values (nameOffset:<null>) (firstTokenOffset:<null>) (offset:5)
               element: <testLibrary>::@enum::E::@getter::values
-            #F8 isCompleteDeclaration isOriginDeclaration foo (nameOffset:23) (firstTokenOffset:15) (offset:23)
+            #F8 isCompleteDeclaration isOriginDeclaration foo (nameOffset:25) (firstTokenOffset:17) (offset:25)
               element: <testLibrary>::@enum::E::@getter::foo
   enums
     isSimplyBounded enum E
@@ -17189,6 +17047,7 @@
     var library = await buildLibrary(r'''
 enum E<T> {
   v;
+
   int foo<U>(T t, U u) => 0;
 }
 ''');
@@ -17243,15 +17102,15 @@
             #F7 isCompleteDeclaration isOriginVariable isStatic values (nameOffset:<null>) (firstTokenOffset:<null>) (offset:5)
               element: <testLibrary>::@enum::E::@getter::values
           methods
-            #F8 isCompleteDeclaration isOriginDeclaration foo (nameOffset:23) (firstTokenOffset:19) (offset:23)
+            #F8 isCompleteDeclaration isOriginDeclaration foo (nameOffset:24) (firstTokenOffset:20) (offset:24)
               element: <testLibrary>::@enum::E::@method::foo
               typeParameters
-                #F9 U (nameOffset:27) (firstTokenOffset:27) (offset:27)
+                #F9 U (nameOffset:28) (firstTokenOffset:28) (offset:28)
                   element: #E1 U
               formalParameters
-                #F10 requiredPositional isOriginDeclaration t (nameOffset:32) (firstTokenOffset:30) (offset:32)
+                #F10 requiredPositional isOriginDeclaration t (nameOffset:33) (firstTokenOffset:31) (offset:33)
                   element: <testLibrary>::@enum::E::@method::foo::@formalParameter::t
-                #F11 requiredPositional isOriginDeclaration u (nameOffset:37) (firstTokenOffset:35) (offset:37)
+                #F11 requiredPositional isOriginDeclaration u (nameOffset:38) (firstTokenOffset:36) (offset:38)
                   element: <testLibrary>::@enum::E::@method::foo::@formalParameter::u
   enums
     isSimplyBounded enum E
@@ -19065,8 +18924,10 @@
   test_method_metadata() async {
     var library = await buildLibrary(r'''
 const a = 42;
+
 enum E {
   v;
+
   @a
   void foo() {}
 }
@@ -19078,10 +18939,10 @@
     #F0 <testLibraryFragment>
       element: <testLibrary>
       enums
-        #F1 enum E (nameOffset:19) (firstTokenOffset:14) (offset:19)
+        #F1 enum E (nameOffset:20) (firstTokenOffset:15) (offset:20)
           element: <testLibrary>::@enum::E
           fields
-            #F2 hasImplicitType hasInitializer isConst isEnumConstant isOriginDeclaration isStatic v (nameOffset:25) (firstTokenOffset:25) (offset:25)
+            #F2 hasImplicitType hasInitializer isConst isEnumConstant isOriginDeclaration isStatic v (nameOffset:26) (firstTokenOffset:26) (offset:26)
               element: <testLibrary>::@enum::E::@field::v
               initializer: expression_0
                 InstanceCreationExpression
@@ -19095,7 +18956,7 @@
                     leftParenthesis: ( @0
                     rightParenthesis: ) @0
                   staticType: E
-            #F3 isConst isOriginEnumValues isStatic values (nameOffset:<null>) (firstTokenOffset:<null>) (offset:19)
+            #F3 isConst isOriginEnumValues isStatic values (nameOffset:<null>) (firstTokenOffset:<null>) (offset:20)
               element: <testLibrary>::@enum::E::@field::values
               initializer: expression_1
                 ListLiteral
@@ -19108,22 +18969,22 @@
                   rightBracket: ] @0
                   staticType: List<E>
           constructors
-            #F4 isConst isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:19)
+            #F4 isConst isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:20)
               element: <testLibrary>::@enum::E::@constructor::new
               typeName: E
           getters
-            #F5 isCompleteDeclaration isOriginVariable isStatic v (nameOffset:<null>) (firstTokenOffset:<null>) (offset:25)
+            #F5 isCompleteDeclaration isOriginVariable isStatic v (nameOffset:<null>) (firstTokenOffset:<null>) (offset:26)
               element: <testLibrary>::@enum::E::@getter::v
-            #F6 isCompleteDeclaration isOriginVariable isStatic values (nameOffset:<null>) (firstTokenOffset:<null>) (offset:19)
+            #F6 isCompleteDeclaration isOriginVariable isStatic values (nameOffset:<null>) (firstTokenOffset:<null>) (offset:20)
               element: <testLibrary>::@enum::E::@getter::values
           methods
-            #F7 isCompleteDeclaration isOriginDeclaration foo (nameOffset:40) (firstTokenOffset:30) (offset:40)
+            #F7 isCompleteDeclaration isOriginDeclaration foo (nameOffset:42) (firstTokenOffset:32) (offset:42)
               element: <testLibrary>::@enum::E::@method::foo
               metadata
                 Annotation
-                  atSign: @ @30
+                  atSign: @ @32
                   name: SimpleIdentifier
-                    token: a @31
+                    token: a @33
                     element: <testLibrary>::@getter::a
                     staticType: null
                   element: <testLibrary>::@getter::a
@@ -19181,9 +19042,9 @@
           firstFragment: #F7
           metadata
             Annotation
-              atSign: @ @30
+              atSign: @ @32
               name: SimpleIdentifier
-                token: a @31
+                token: a @33
                 element: <testLibrary>::@getter::a
                 staticType: null
               element: <testLibrary>::@getter::a
@@ -19210,6 +19071,7 @@
     var library = await buildLibrary(r'''
 enum E {
   v;
+
   String toString() => 'E';
 }
 ''');
@@ -19259,7 +19121,7 @@
             #F6 isCompleteDeclaration isOriginVariable isStatic values (nameOffset:<null>) (firstTokenOffset:<null>) (offset:5)
               element: <testLibrary>::@enum::E::@getter::values
           methods
-            #F7 isCompleteDeclaration isOriginDeclaration toString (nameOffset:23) (firstTokenOffset:16) (offset:23)
+            #F7 isCompleteDeclaration isOriginDeclaration toString (nameOffset:24) (firstTokenOffset:17) (offset:24)
               element: <testLibrary>::@enum::E::@method::toString
   enums
     isSimplyBounded enum E
@@ -19311,6 +19173,7 @@
     var library = await buildLibrary(r'''
 enum E(int foo) {
   v(0);
+
   final bar = foo;
 }
 ''');
@@ -19354,11 +19217,11 @@
                       staticType: E
                   rightBracket: ] @0
                   staticType: List<E>
-            #F4 hasImplicitType hasInitializer isFinal isOriginDeclaration bar (nameOffset:34) (firstTokenOffset:34) (offset:34)
+            #F4 hasImplicitType hasInitializer isFinal isOriginDeclaration bar (nameOffset:35) (firstTokenOffset:35) (offset:35)
               element: <testLibrary>::@enum::E::@field::bar
               initializer: expression_2
                 SimpleIdentifier
-                  token: foo @40
+                  token: foo @41
                   element: <testLibrary>::@enum::E::@constructor::new::@formalParameter::foo
                   staticType: int
           constructors
@@ -19374,7 +19237,7 @@
               element: <testLibrary>::@enum::E::@getter::v
             #F8 isCompleteDeclaration isOriginVariable isStatic values (nameOffset:<null>) (firstTokenOffset:<null>) (offset:5)
               element: <testLibrary>::@enum::E::@getter::values
-            #F9 isCompleteDeclaration isOriginVariable bar (nameOffset:<null>) (firstTokenOffset:<null>) (offset:34)
+            #F9 isCompleteDeclaration isOriginVariable bar (nameOffset:<null>) (firstTokenOffset:<null>) (offset:35)
               element: <testLibrary>::@enum::E::@getter::bar
   enums
     isSimplyBounded enum E
@@ -19438,6 +19301,7 @@
     var library = await buildLibrary(r'''
 enum E(final int foo) {
   v(0);
+
   final bar = foo;
 }
 ''');
@@ -19483,11 +19347,11 @@
                   staticType: List<E>
             #F4 isFinal isOriginDeclaringFormalParameter foo (nameOffset:<null>) (firstTokenOffset:<null>) (offset:5)
               element: <testLibrary>::@enum::E::@field::foo
-            #F5 hasImplicitType hasInitializer isFinal isOriginDeclaration bar (nameOffset:40) (firstTokenOffset:40) (offset:40)
+            #F5 hasImplicitType hasInitializer isFinal isOriginDeclaration bar (nameOffset:41) (firstTokenOffset:41) (offset:41)
               element: <testLibrary>::@enum::E::@field::bar
               initializer: expression_2
                 SimpleIdentifier
-                  token: foo @46
+                  token: foo @47
                   element: <testLibrary>::@enum::E::@constructor::new::@formalParameter::foo
                   staticType: int
           constructors
@@ -19505,7 +19369,7 @@
               element: <testLibrary>::@enum::E::@getter::values
             #F10 isCompleteDeclaration isOriginVariable foo (nameOffset:<null>) (firstTokenOffset:<null>) (offset:5)
               element: <testLibrary>::@enum::E::@getter::foo
-            #F11 isCompleteDeclaration isOriginVariable bar (nameOffset:<null>) (firstTokenOffset:<null>) (offset:40)
+            #F11 isCompleteDeclaration isOriginVariable bar (nameOffset:<null>) (firstTokenOffset:<null>) (offset:41)
               element: <testLibrary>::@enum::E::@getter::bar
   enums
     isSimplyBounded enum E
@@ -19581,6 +19445,7 @@
     var library = await buildLibrary(r'''
 enum E(int foo) {
   v(0);
+
   late final bar = foo;
 }
 ''');
@@ -19624,11 +19489,11 @@
                       staticType: E
                   rightBracket: ] @0
                   staticType: List<E>
-            #F4 hasImplicitType hasInitializer isFinal isLate isOriginDeclaration bar (nameOffset:39) (firstTokenOffset:39) (offset:39)
+            #F4 hasImplicitType hasInitializer isFinal isLate isOriginDeclaration bar (nameOffset:40) (firstTokenOffset:40) (offset:40)
               element: <testLibrary>::@enum::E::@field::bar
               initializer: expression_2
                 SimpleIdentifier
-                  token: foo @45
+                  token: foo @46
                   element: <null>
                   staticType: InvalidType
           constructors
@@ -19644,7 +19509,7 @@
               element: <testLibrary>::@enum::E::@getter::v
             #F8 isCompleteDeclaration isOriginVariable isStatic values (nameOffset:<null>) (firstTokenOffset:<null>) (offset:5)
               element: <testLibrary>::@enum::E::@getter::values
-            #F9 isCompleteDeclaration isOriginVariable bar (nameOffset:<null>) (firstTokenOffset:<null>) (offset:39)
+            #F9 isCompleteDeclaration isOriginVariable bar (nameOffset:<null>) (firstTokenOffset:<null>) (offset:40)
               element: <testLibrary>::@enum::E::@getter::bar
   enums
     isSimplyBounded enum E
@@ -19708,6 +19573,7 @@
     var library = await buildLibrary(r'''
 enum E(int? foo) {
   v(0);
+
   final bar = foo != null ? foo : 0;
 }
 ''');
@@ -19751,30 +19617,30 @@
                       staticType: E
                   rightBracket: ] @0
                   staticType: List<E>
-            #F4 hasImplicitType hasInitializer isFinal isOriginDeclaration bar (nameOffset:35) (firstTokenOffset:35) (offset:35)
+            #F4 hasImplicitType hasInitializer isFinal isOriginDeclaration bar (nameOffset:36) (firstTokenOffset:36) (offset:36)
               element: <testLibrary>::@enum::E::@field::bar
               initializer: expression_2
                 ConditionalExpression
                   condition: BinaryExpression
                     leftOperand: SimpleIdentifier
-                      token: foo @41
+                      token: foo @42
                       element: <testLibrary>::@enum::E::@constructor::new::@formalParameter::foo
                       staticType: int?
-                    operator: != @45
+                    operator: != @46
                     rightOperand: NullLiteral
-                      literal: null @48
+                      literal: null @49
                       staticType: Null
                     element: dart:core::@class::num::@method::==
                     staticInvokeType: bool Function(Object)
                     staticType: bool
-                  question: ? @53
+                  question: ? @54
                   thenExpression: SimpleIdentifier
-                    token: foo @55
+                    token: foo @56
                     element: <testLibrary>::@enum::E::@constructor::new::@formalParameter::foo
                     staticType: int
-                  colon: : @59
+                  colon: : @60
                   elseExpression: IntegerLiteral
-                    literal: 0 @61
+                    literal: 0 @62
                     staticType: int
                   staticType: int
           constructors
@@ -19790,7 +19656,7 @@
               element: <testLibrary>::@enum::E::@getter::v
             #F8 isCompleteDeclaration isOriginVariable isStatic values (nameOffset:<null>) (firstTokenOffset:<null>) (offset:5)
               element: <testLibrary>::@enum::E::@getter::values
-            #F9 isCompleteDeclaration isOriginVariable bar (nameOffset:<null>) (firstTokenOffset:<null>) (offset:35)
+            #F9 isCompleteDeclaration isOriginVariable bar (nameOffset:<null>) (firstTokenOffset:<null>) (offset:36)
               element: <testLibrary>::@enum::E::@getter::bar
   enums
     isSimplyBounded enum E
@@ -19854,6 +19720,7 @@
     var library = await buildLibrary(r'''
 enum E(int foo) {
   v(0);
+
   static final bar = foo;
 }
 ''');
@@ -19897,7 +19764,7 @@
                       staticType: E
                   rightBracket: ] @0
                   staticType: List<E>
-            #F4 hasImplicitType hasInitializer isFinal isOriginDeclaration isStatic bar (nameOffset:41) (firstTokenOffset:41) (offset:41)
+            #F4 hasImplicitType hasInitializer isFinal isOriginDeclaration isStatic bar (nameOffset:42) (firstTokenOffset:42) (offset:42)
               element: <testLibrary>::@enum::E::@field::bar
           constructors
             #F5 isCompleteDeclaration isConst isOriginDeclaration isPrimary new (nameOffset:<null>) (firstTokenOffset:5) (offset:5)
@@ -19912,7 +19779,7 @@
               element: <testLibrary>::@enum::E::@getter::v
             #F8 isCompleteDeclaration isOriginVariable isStatic values (nameOffset:<null>) (firstTokenOffset:<null>) (offset:5)
               element: <testLibrary>::@enum::E::@getter::values
-            #F9 isCompleteDeclaration isOriginVariable isStatic bar (nameOffset:<null>) (firstTokenOffset:<null>) (offset:41)
+            #F9 isCompleteDeclaration isOriginVariable isStatic bar (nameOffset:<null>) (firstTokenOffset:<null>) (offset:42)
               element: <testLibrary>::@enum::E::@getter::bar
   enums
     isSimplyBounded enum E
@@ -19971,8 +19838,9 @@
 
   test_setter() async {
     var library = await buildLibrary(r'''
-enum E{
+enum E {
   v;
+
   set foo(int _) {}
 }
 ''');
@@ -19986,7 +19854,7 @@
         #F1 enum E (nameOffset:5) (firstTokenOffset:0) (offset:5)
           element: <testLibrary>::@enum::E
           fields
-            #F2 hasImplicitType hasInitializer isConst isEnumConstant isOriginDeclaration isStatic v (nameOffset:10) (firstTokenOffset:10) (offset:10)
+            #F2 hasImplicitType hasInitializer isConst isEnumConstant isOriginDeclaration isStatic v (nameOffset:11) (firstTokenOffset:11) (offset:11)
               element: <testLibrary>::@enum::E::@field::v
               initializer: expression_0
                 InstanceCreationExpression
@@ -20019,15 +19887,15 @@
               element: <testLibrary>::@enum::E::@constructor::new
               typeName: E
           getters
-            #F6 isCompleteDeclaration isOriginVariable isStatic v (nameOffset:<null>) (firstTokenOffset:<null>) (offset:10)
+            #F6 isCompleteDeclaration isOriginVariable isStatic v (nameOffset:<null>) (firstTokenOffset:<null>) (offset:11)
               element: <testLibrary>::@enum::E::@getter::v
             #F7 isCompleteDeclaration isOriginVariable isStatic values (nameOffset:<null>) (firstTokenOffset:<null>) (offset:5)
               element: <testLibrary>::@enum::E::@getter::values
           setters
-            #F8 hasImplicitReturnType isCompleteDeclaration isOriginDeclaration foo (nameOffset:19) (firstTokenOffset:15) (offset:19)
+            #F8 hasImplicitReturnType isCompleteDeclaration isOriginDeclaration foo (nameOffset:21) (firstTokenOffset:17) (offset:21)
               element: <testLibrary>::@enum::E::@setter::foo
               formalParameters
-                #F9 requiredPositional isOriginDeclaration _ (nameOffset:27) (firstTokenOffset:23) (offset:27)
+                #F9 requiredPositional isOriginDeclaration _ (nameOffset:29) (firstTokenOffset:25) (offset:29)
                   element: <testLibrary>::@enum::E::@setter::foo::@formalParameter::_
   enums
     isSimplyBounded enum E
diff --git a/pkg/analyzer/test/src/summary/elements/extension_test.dart b/pkg/analyzer/test/src/summary/elements/extension_test.dart
index 90429ef..f273ad6 100644
--- a/pkg/analyzer/test/src/summary/elements/extension_test.dart
+++ b/pkg/analyzer/test/src/summary/elements/extension_test.dart
@@ -112,7 +112,6 @@
 augment class A {}
 
 augment class A {}
-
 ''');
 
     configuration.withConstructors = false;
@@ -191,11 +190,12 @@
   }
 
   test_extension_documented_tripleSlash() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 /// aaa
 /// bbbb
 /// cc
-extension E on int {}''');
+extension E on int {}
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -261,7 +261,7 @@
   }
 
   test_extension_extendedType_recordType() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 extension E on (int, String) {}
 ''');
     checkElementText(library, r'''
@@ -283,7 +283,7 @@
   }
 
   test_extension_lazy_all_fields() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 extension E on int {
   static int foo = 42;
 }
@@ -294,7 +294,7 @@
   }
 
   test_extension_lazy_all_getters() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 extension E on int {
   int get foo => 0;
 }
@@ -305,7 +305,7 @@
   }
 
   test_extension_lazy_all_methods() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 extension E on int {
   void foo() {}
 }
@@ -316,7 +316,7 @@
   }
 
   test_extension_lazy_all_setters() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 extension E on int {
   set foo(int _) {}
 }
@@ -327,7 +327,7 @@
   }
 
   test_extension_lazy_byReference_field() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 extension E on int {
   static int foo = 42;
 }
@@ -339,7 +339,7 @@
   }
 
   test_extension_lazy_byReference_getter() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 extension E on int {
   int get foo => 0;
 }
@@ -351,7 +351,7 @@
   }
 
   test_extension_lazy_byReference_method() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 extension E on int {
   void foo() {}
 }
@@ -363,7 +363,7 @@
   }
 
   test_extension_lazy_byReference_setter() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 extension E on int {
   set foo(int _) {}
 }
@@ -377,10 +377,13 @@
   test_extension_metadata() async {
     var library = await buildLibrary(r'''
 const a = null;
+
 class A {}
+
 @a
 @Object()
-extension E on A {}''');
+extension E on A {}
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -388,14 +391,14 @@
     #F0 <testLibraryFragment>
       element: <testLibrary>
       classes
-        #F1 class A (nameOffset:22) (firstTokenOffset:16) (offset:22)
+        #F1 class A (nameOffset:23) (firstTokenOffset:17) (offset:23)
           element: <testLibrary>::@class::A
           constructors
-            #F2 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:22)
+            #F2 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:23)
               element: <testLibrary>::@class::A::@constructor::new
               typeName: A
       extensions
-        #F3 extension E (nameOffset:50) (firstTokenOffset:27) (offset:50)
+        #F3 extension E (nameOffset:52) (firstTokenOffset:29) (offset:52)
           element: <testLibrary>::@extension::E
       topLevelVariables
         #F4 hasImplicitType hasInitializer isConst isOriginDeclaration isStatic a (nameOffset:6) (firstTokenOffset:6) (offset:6)
@@ -599,8 +602,9 @@
   }
 
   test_extension_onDeclaration_class() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class A {}
+
 extension E on A {}
 ''');
     checkElementText(library, r'''
@@ -617,7 +621,7 @@
               element: <testLibrary>::@class::A::@constructor::new
               typeName: A
       extensions
-        #F3 extension E (nameOffset:21) (firstTokenOffset:11) (offset:21)
+        #F3 extension E (nameOffset:22) (firstTokenOffset:12) (offset:22)
           element: <testLibrary>::@extension::E
   classes
     isSimplyBounded class A
@@ -637,7 +641,7 @@
   }
 
   test_extension_onDeclaration_dynamic() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 extension E on dynamic {}
 ''');
     checkElementText(library, r'''
@@ -659,8 +663,9 @@
   }
 
   test_extension_onDeclaration_enum() async {
-    var library = await buildLibrary('''
-enum A { foo; }
+    var library = await buildLibrary(r'''
+enum A { foo }
+
 extension E on A {}
 ''');
     checkElementText(library, r'''
@@ -759,8 +764,9 @@
   }
 
   test_extension_onDeclaration_extensionType() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 extension type A(Object? it) {}
+
 extension E on A {}
 ''');
     checkElementText(library, r'''
@@ -770,7 +776,7 @@
     #F0 <testLibraryFragment>
       element: <testLibrary>
       extensions
-        #F1 extension E (nameOffset:42) (firstTokenOffset:32) (offset:42)
+        #F1 extension E (nameOffset:43) (firstTokenOffset:33) (offset:43)
           element: <testLibrary>::@extension::E
       extensionTypes
         #F2 extension type A (nameOffset:15) (firstTokenOffset:0) (offset:15)
@@ -828,8 +834,9 @@
   }
 
   test_extension_onDeclaration_futureOr() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 import 'dart:async';
+
 extension E on FutureOr<int> {}
 ''');
     checkElementText(library, r'''
@@ -841,7 +848,7 @@
       libraryImports
         dart:async
       extensions
-        #F1 extension E (nameOffset:31) (firstTokenOffset:21) (offset:31)
+        #F1 extension E (nameOffset:32) (firstTokenOffset:22) (offset:32)
           element: <testLibrary>::@extension::E
   extensions
     extension E
@@ -853,8 +860,9 @@
   }
 
   test_extension_onDeclaration_mixin() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 mixin A {}
+
 extension E on A {}
 ''');
     checkElementText(library, r'''
@@ -864,7 +872,7 @@
     #F0 <testLibraryFragment>
       element: <testLibrary>
       extensions
-        #F1 extension E (nameOffset:21) (firstTokenOffset:11) (offset:21)
+        #F1 extension E (nameOffset:22) (firstTokenOffset:12) (offset:22)
           element: <testLibrary>::@extension::E
       mixins
         #F2 mixin A (nameOffset:6) (firstTokenOffset:0) (offset:6)
@@ -885,7 +893,7 @@
   }
 
   test_extension_onDeclaration_Never() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 extension E on Never {}
 ''');
     checkElementText(library, r'''
@@ -907,7 +915,7 @@
   }
 
   test_extension_onDeclaration_nullable() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 extension E on int? {}
 ''');
     checkElementText(library, r'''
@@ -929,8 +937,9 @@
   }
 
   test_extension_onDeclaration_typedef() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 typedef A = int;
+
 extension E on A {}
 ''');
     checkElementText(library, r'''
@@ -940,7 +949,7 @@
     #F0 <testLibraryFragment>
       element: <testLibrary>
       extensions
-        #F1 extension E (nameOffset:27) (firstTokenOffset:17) (offset:27)
+        #F1 extension E (nameOffset:28) (firstTokenOffset:18) (offset:28)
           element: <testLibrary>::@extension::E
       typeAliases
         #F2 A (nameOffset:8) (firstTokenOffset:0) (offset:8)
@@ -961,7 +970,7 @@
   }
 
   test_extension_onDeclaration_typeParameter() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 extension E<X> on X {}
 ''');
     checkElementText(library, r'''
@@ -989,7 +998,7 @@
   }
 
   test_extension_onDeclaration_void() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 extension E on void {}
 ''');
     checkElementText(library, r'''
@@ -1011,7 +1020,7 @@
   }
 
   test_extension_typeParameters() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 extension E<T> on int {}
 ''');
     checkElementText(library, r'''
@@ -1411,7 +1420,7 @@
   }
 
   test_extension_typeParameters_bound() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 extension E<T extends num> on int {}
 ''');
     checkElementText(library, r'''
@@ -1440,7 +1449,7 @@
   }
 
   test_extension_unnamed() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 extension on int {}
 ''');
     checkElementText(library, r'''
@@ -2027,10 +2036,11 @@
   }
 
   test_field_static_const_inferredType() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 extension E on int {
   static const x = 0;
-}''');
+}
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -2562,7 +2572,7 @@
   }
 
   test_getter_ofGeneric_refEnclosingTypeParameter_false() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 extension E<T> on List<T> {
   int get foo {}
 }
@@ -2611,7 +2621,7 @@
   }
 
   test_getter_ofGeneric_refEnclosingTypeParameter_true() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 extension E<T> on List<T> {
   T get foo {}
 }
@@ -2660,7 +2670,7 @@
   }
 
   test_method() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 extension E on int {
   void foo() {}
 }
@@ -3299,7 +3309,7 @@
   }
 
   test_method_ofGeneric_refEnclosingTypeParameter_false() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 extension E<T> on List<T> {
   void foo() {}
 }
@@ -3338,7 +3348,7 @@
   }
 
   test_method_ofGeneric_refEnclosingTypeParameter_true() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 extension E<T> on List<T> {
   void foo(T _) {}
 }
diff --git a/pkg/analyzer/test/src/summary/elements/extension_type_test.dart b/pkg/analyzer/test/src/summary/elements/extension_type_test.dart
index 3e7ac1a..106927d 100644
--- a/pkg/analyzer/test/src/summary/elements/extension_type_test.dart
+++ b/pkg/analyzer/test/src/summary/elements/extension_type_test.dart
@@ -1216,6 +1216,7 @@
   test_constructor_primary_formalParameter_regular_optionalPositional_type_fromDefaultValue_chain() async {
     var library = await buildLibrary(r'''
 extension type A([it = 0]) {}
+
 extension type B(A it) {}
 ''');
 
@@ -1246,21 +1247,21 @@
           getters
             #F5 isCompleteDeclaration isOriginVariable it (nameOffset:<null>) (firstTokenOffset:<null>) (offset:15)
               element: <testLibrary>::@extensionType::A::@getter::it
-        #F6 extension type B (nameOffset:45) (firstTokenOffset:30) (offset:45)
+        #F6 extension type B (nameOffset:46) (firstTokenOffset:31) (offset:46)
           element: <testLibrary>::@extensionType::B
           fields
-            #F7 isFinal isOriginDeclaringFormalParameter it (nameOffset:<null>) (firstTokenOffset:<null>) (offset:45)
+            #F7 isFinal isOriginDeclaringFormalParameter it (nameOffset:<null>) (firstTokenOffset:<null>) (offset:46)
               element: <testLibrary>::@extensionType::B::@field::it
           constructors
-            #F8 isCompleteDeclaration isOriginDeclaration isPrimary new (nameOffset:<null>) (firstTokenOffset:45) (offset:45)
+            #F8 isCompleteDeclaration isOriginDeclaration isPrimary new (nameOffset:<null>) (firstTokenOffset:46) (offset:46)
               element: <testLibrary>::@extensionType::B::@constructor::new
               typeName: B
-              typeNameOffset: 45
+              typeNameOffset: 46
               formalParameters
-                #F9 requiredPositional isDeclaring isFinal isOriginDeclaration this.it (nameOffset:49) (firstTokenOffset:47) (offset:49)
+                #F9 requiredPositional isDeclaring isFinal isOriginDeclaration this.it (nameOffset:50) (firstTokenOffset:48) (offset:50)
                   element: <testLibrary>::@extensionType::B::@constructor::new::@formalParameter::it
           getters
-            #F10 isCompleteDeclaration isOriginVariable it (nameOffset:<null>) (firstTokenOffset:<null>) (offset:45)
+            #F10 isCompleteDeclaration isOriginVariable it (nameOffset:<null>) (firstTokenOffset:<null>) (offset:46)
               element: <testLibrary>::@extensionType::B::@getter::it
   extensionTypes
     isSimplyBounded extension type A
@@ -1650,7 +1651,7 @@
 extension type A(
   /// first
   /// second
-  int it,
+  int it
 ) {}
 ''');
 
@@ -4371,7 +4372,7 @@
 
   test_constructor_primary_formalParameters_trailingComma() async {
     var library = await buildLibrary(r'''
-extension type A(int it,) {}
+extension type A(int it) {}
 ''');
 
     configuration.withCodeRanges = true;
@@ -4391,7 +4392,7 @@
             #F3 isCompleteDeclaration isOriginDeclaration isPrimary new (nameOffset:<null>) (firstTokenOffset:15) (offset:15)
               element: <testLibrary>::@extensionType::A::@constructor::new
               codeOffset: 15
-              codeLength: 10
+              codeLength: 9
               typeName: A
               typeNameOffset: 15
               formalParameters
@@ -4435,7 +4436,7 @@
   test_constructor_primary_formalParameters_trailingComma_language310() async {
     var library = await buildLibrary(r'''
 // @dart = 3.10
-extension type A(int it,) {}
+extension type A(int it) {}
 ''');
 
     configuration.withCodeRanges = true;
@@ -4455,7 +4456,7 @@
             #F3 isCompleteDeclaration isOriginDeclaration isPrimary new (nameOffset:<null>) (firstTokenOffset:31) (offset:31)
               element: <testLibrary>::@extensionType::A::@constructor::new
               codeOffset: 31
-              codeLength: 10
+              codeLength: 9
               typeName: A
               typeNameOffset: 31
               formalParameters
@@ -4615,8 +4616,9 @@
   }
 
   test_constructor_primary_scopes() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 const foo = 0;
+
 extension type E<@foo T>([@foo int it = foo]) {
   static const foo = 1;
 }
@@ -4628,53 +4630,53 @@
     #F0 <testLibraryFragment>
       element: <testLibrary>
       extensionTypes
-        #F1 extension type E (nameOffset:30) (firstTokenOffset:15) (offset:30)
+        #F1 extension type E (nameOffset:31) (firstTokenOffset:16) (offset:31)
           element: <testLibrary>::@extensionType::E
           typeParameters
-            #F2 T (nameOffset:37) (firstTokenOffset:32) (offset:37)
+            #F2 T (nameOffset:38) (firstTokenOffset:33) (offset:38)
               element: #E0 T
               metadata
                 Annotation
-                  atSign: @ @32
+                  atSign: @ @33
                   name: SimpleIdentifier
-                    token: foo @33
+                    token: foo @34
                     element: <testLibrary>::@getter::foo
                     staticType: null
                   element: <testLibrary>::@getter::foo
           fields
-            #F3 isFinal isOriginDeclaringFormalParameter it (nameOffset:<null>) (firstTokenOffset:<null>) (offset:30)
+            #F3 isFinal isOriginDeclaringFormalParameter it (nameOffset:<null>) (firstTokenOffset:<null>) (offset:31)
               element: <testLibrary>::@extensionType::E::@field::it
-            #F4 hasImplicitType hasInitializer isConst isOriginDeclaration isStatic foo (nameOffset:78) (firstTokenOffset:78) (offset:78)
+            #F4 hasImplicitType hasInitializer isConst isOriginDeclaration isStatic foo (nameOffset:79) (firstTokenOffset:79) (offset:79)
               element: <testLibrary>::@extensionType::E::@field::foo
               initializer: expression_0
                 IntegerLiteral
-                  literal: 1 @84
+                  literal: 1 @85
                   staticType: int
           constructors
-            #F5 isCompleteDeclaration isOriginDeclaration isPrimary new (nameOffset:<null>) (firstTokenOffset:30) (offset:30)
+            #F5 isCompleteDeclaration isOriginDeclaration isPrimary new (nameOffset:<null>) (firstTokenOffset:31) (offset:31)
               element: <testLibrary>::@extensionType::E::@constructor::new
               typeName: E
-              typeNameOffset: 30
+              typeNameOffset: 31
               formalParameters
-                #F6 optionalPositional isDeclaring isFinal isOriginDeclaration this.it (nameOffset:50) (firstTokenOffset:41) (offset:50)
+                #F6 optionalPositional isDeclaring isFinal isOriginDeclaration this.it (nameOffset:51) (firstTokenOffset:42) (offset:51)
                   element: <testLibrary>::@extensionType::E::@constructor::new::@formalParameter::it
                   metadata
                     Annotation
-                      atSign: @ @41
+                      atSign: @ @42
                       name: SimpleIdentifier
-                        token: foo @42
+                        token: foo @43
                         element: <testLibrary>::@extensionType::E::@getter::foo
                         staticType: null
                       element: <testLibrary>::@extensionType::E::@getter::foo
                   initializer: expression_1
                     SimpleIdentifier
-                      token: foo @55
+                      token: foo @56
                       element: <testLibrary>::@extensionType::E::@getter::foo
                       staticType: int
           getters
-            #F7 isCompleteDeclaration isOriginVariable it (nameOffset:<null>) (firstTokenOffset:<null>) (offset:30)
+            #F7 isCompleteDeclaration isOriginVariable it (nameOffset:<null>) (firstTokenOffset:<null>) (offset:31)
               element: <testLibrary>::@extensionType::E::@getter::it
-            #F8 isCompleteDeclaration isOriginVariable isStatic foo (nameOffset:<null>) (firstTokenOffset:<null>) (offset:78)
+            #F8 isCompleteDeclaration isOriginVariable isStatic foo (nameOffset:<null>) (firstTokenOffset:<null>) (offset:79)
               element: <testLibrary>::@extensionType::E::@getter::foo
       topLevelVariables
         #F9 hasImplicitType hasInitializer isConst isOriginDeclaration isStatic foo (nameOffset:6) (firstTokenOffset:6) (offset:6)
@@ -4695,9 +4697,9 @@
           firstFragment: #F2
           metadata
             Annotation
-              atSign: @ @32
+              atSign: @ @33
               name: SimpleIdentifier
-                token: foo @33
+                token: foo @34
                 element: <testLibrary>::@getter::foo
                 staticType: null
               element: <testLibrary>::@getter::foo
@@ -4710,9 +4712,9 @@
           firstFragment: #F3
           metadata
             Annotation
-              atSign: @ @41
+              atSign: @ @42
               name: SimpleIdentifier
-                token: foo @42
+                token: foo @43
                 element: <testLibrary>::@extensionType::E::@getter::foo
                 staticType: null
               element: <testLibrary>::@extensionType::E::@getter::foo
@@ -4737,9 +4739,9 @@
               type: int
               metadata
                 Annotation
-                  atSign: @ @41
+                  atSign: @ @42
                   name: SimpleIdentifier
-                    token: foo @42
+                    token: foo @43
                     element: <testLibrary>::@extensionType::E::@getter::foo
                     staticType: null
                   element: <testLibrary>::@extensionType::E::@getter::foo
@@ -5146,6 +5148,157 @@
 ''');
   }
 
+  test_constructor_secondary_augmentation_chain_isCompleteDeclaration_factory() async {
+    var library = await buildLibrary(r'''
+extension type A(int it) {
+  factory A();
+}
+
+augment extension type A(int it) {
+  augment factory A() => A(0);
+}
+
+augment extension type A(int it) {
+  augment factory A();
+}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  fragments
+    #F0 <testLibraryFragment>
+      element: <testLibrary>
+      extensionTypes
+        #F1 extension type A (nameOffset:15) (firstTokenOffset:0) (offset:15)
+          element: <testLibrary>::@extensionType::A
+          nextFragment: #F2
+          fields
+            #F3 isFinal isOriginDeclaringFormalParameter it (nameOffset:<null>) (firstTokenOffset:<null>) (offset:15)
+              element: <testLibrary>::@extensionType::A::@field::it
+              nextFragment: #F4
+          constructors
+            #F5 isCompleteDeclaration isOriginDeclaration isPrimary new (nameOffset:<null>) (firstTokenOffset:15) (offset:15)
+              element: <testLibrary>::@extensionType::A::@constructor::new
+              typeName: A
+              typeNameOffset: 15
+              formalParameters
+                #F6 requiredPositional isDeclaring isFinal isOriginDeclaration this.it (nameOffset:21) (firstTokenOffset:17) (offset:21)
+                  element: <testLibrary>::@extensionType::A::@constructor::new::@formalParameter::it
+            #F7 isFactory isOriginDeclaration new (nameOffset:<null>) (firstTokenOffset:29) (offset:37)
+              element: <testLibrary>::@extensionType::A::@constructor::new#1
+              factoryKeywordOffset: 29
+              typeName: A
+              typeNameOffset: 37
+              formalParameters
+                #F8 requiredPositional isFinal isOriginOtherFragmentOfEnclosing this.it (nameOffset:<null>) (firstTokenOffset:<null>) (offset:37)
+                  element: <testLibrary>::@extensionType::A::@constructor::new#1::@formalParameter::it
+                  nextFragment: #F9
+              nextFragment: #F10
+          getters
+            #F11 isCompleteDeclaration isOriginVariable it (nameOffset:<null>) (firstTokenOffset:<null>) (offset:15)
+              element: <testLibrary>::@extensionType::A::@getter::it
+        #F2 isAugmentation extension type A (nameOffset:68) (firstTokenOffset:45) (offset:68)
+          element: <testLibrary>::@extensionType::A
+          previousFragment: #F1
+          nextFragment: #F12
+          fields
+            #F4 isAugmentation isFinal isOriginDeclaringFormalParameter it (nameOffset:<null>) (firstTokenOffset:<null>) (offset:68)
+              element: <testLibrary>::@extensionType::A::@field::it
+              previousFragment: #F3
+              nextFragment: #F13
+          constructors
+            #F10 isAugmentation isCompleteDeclaration isOriginDeclaration isPrimary new (nameOffset:<null>) (firstTokenOffset:68) (offset:68)
+              element: <testLibrary>::@extensionType::A::@constructor::new#1
+              typeName: A
+              typeNameOffset: 68
+              formalParameters
+                #F9 requiredPositional isDeclaring isFinal isOriginDeclaration this.it (nameOffset:74) (firstTokenOffset:70) (offset:74)
+                  element: <testLibrary>::@extensionType::A::@constructor::new#1::@formalParameter::it
+                  previousFragment: #F8
+                  nextFragment: #F14
+              nextFragment: #F15
+              previousFragment: #F7
+            #F15 isAugmentation isCompleteDeclaration isFactory isOriginDeclaration new (nameOffset:<null>) (firstTokenOffset:82) (offset:98)
+              element: <testLibrary>::@extensionType::A::@constructor::new#1
+              factoryKeywordOffset: 90
+              typeName: A
+              typeNameOffset: 98
+              formalParameters
+                #F14 requiredPositional isFinal isOriginOtherFragmentOfEnclosing this.it (nameOffset:<null>) (firstTokenOffset:<null>) (offset:98)
+                  element: <testLibrary>::@extensionType::A::@constructor::new#1::@formalParameter::it
+                  previousFragment: #F9
+                  nextFragment: #F16
+              nextFragment: #F17
+              previousFragment: #F10
+        #F12 isAugmentation extension type A (nameOffset:137) (firstTokenOffset:114) (offset:137)
+          element: <testLibrary>::@extensionType::A
+          previousFragment: #F2
+          fields
+            #F13 isAugmentation isFinal isOriginDeclaringFormalParameter it (nameOffset:<null>) (firstTokenOffset:<null>) (offset:137)
+              element: <testLibrary>::@extensionType::A::@field::it
+              previousFragment: #F4
+          constructors
+            #F17 isAugmentation isCompleteDeclaration isOriginDeclaration isPrimary new (nameOffset:<null>) (firstTokenOffset:137) (offset:137)
+              element: <testLibrary>::@extensionType::A::@constructor::new#1
+              typeName: A
+              typeNameOffset: 137
+              formalParameters
+                #F16 requiredPositional isDeclaring isFinal isOriginDeclaration this.it (nameOffset:143) (firstTokenOffset:139) (offset:143)
+                  element: <testLibrary>::@extensionType::A::@constructor::new#1::@formalParameter::it
+                  previousFragment: #F14
+                  nextFragment: #F18
+              nextFragment: #F19
+              previousFragment: #F15
+            #F19 isAugmentation isFactory isOriginDeclaration new (nameOffset:<null>) (firstTokenOffset:151) (offset:167)
+              element: <testLibrary>::@extensionType::A::@constructor::new#1
+              factoryKeywordOffset: 159
+              typeName: A
+              typeNameOffset: 167
+              formalParameters
+                #F18 requiredPositional isFinal isOriginOtherFragmentOfEnclosing this.it (nameOffset:<null>) (firstTokenOffset:<null>) (offset:167)
+                  element: <testLibrary>::@extensionType::A::@constructor::new#1::@formalParameter::it
+                  previousFragment: #F16
+              previousFragment: #F17
+  extensionTypes
+    isSimplyBounded extension type A
+      reference: <testLibrary>::@extensionType::A
+      firstFragment: #F1
+      representation: <testLibrary>::@extensionType::A::@field::it
+      primaryConstructor: <testLibrary>::@extensionType::A::@constructor::new
+      typeErasure: int
+      fields
+        isFinal isOriginDeclaringFormalParameter it
+          reference: <testLibrary>::@extensionType::A::@field::it
+          firstFragment: #F3
+          type: int
+          getter: <testLibrary>::@extensionType::A::@getter::it
+          declaringFormalParameter: <testLibrary>::@extensionType::A::@constructor::new::@formalParameter::it
+      constructors
+        isExtensionTypeMember isOriginDeclaration isPrimary new
+          reference: <testLibrary>::@extensionType::A::@constructor::new
+          firstFragment: #F5
+          formalParameters
+            #E0 requiredPositional isDeclaring isFinal this.it
+              firstFragment: #F6
+              type: int
+              field: <testLibrary>::@extensionType::A::@field::it
+        isExtensionTypeMember isFactory isOriginDeclaration new
+          reference: <testLibrary>::@extensionType::A::@constructor::new#1
+          firstFragment: #F7
+          formalParameters
+            #E1 requiredPositional isFinal this.it
+              firstFragment: #F8
+              type: int
+              field: <testLibrary>::@extensionType::A::@field::it
+      getters
+        isExtensionTypeMember isOriginVariable it
+          reference: <testLibrary>::@extensionType::A::@getter::it
+          firstFragment: #F11
+          returnType: int
+          variable: <testLibrary>::@extensionType::A::@field::it
+''');
+  }
+
   test_constructor_secondary_factory() async {
     var library = await buildLibrary(r'''
 extension type A(int it) {
@@ -5377,7 +5530,7 @@
   test_constructor_secondary_factoryHead_unnamed() async {
     var library = await buildLibrary(r'''
 extension type A.primary(int it) {
-  factory (int it) => A.primary(it);
+  factory(int it) => A.primary(it);
 }
 ''');
     checkElementText(library, r'''
@@ -5406,7 +5559,7 @@
               factoryKeywordOffset: 37
               typeName: null
               formalParameters
-                #F6 requiredPositional isOriginDeclaration it (nameOffset:50) (firstTokenOffset:46) (offset:50)
+                #F6 requiredPositional isOriginDeclaration it (nameOffset:49) (firstTokenOffset:45) (offset:49)
                   element: <testLibrary>::@extensionType::A::@constructor::new::@formalParameter::it
           getters
             #F7 isCompleteDeclaration isOriginVariable it (nameOffset:<null>) (firstTokenOffset:<null>) (offset:15)
@@ -6082,7 +6235,7 @@
   test_constructor_secondary_newHead_unnamed() async {
     var library = await buildLibrary(r'''
 extension type A.primary(int it) {
-  new (this.it);
+  new(this.it);
 }
 ''');
     checkElementText(library, r'''
@@ -6111,7 +6264,7 @@
               newKeywordOffset: 37
               typeName: null
               formalParameters
-                #F6 requiredPositional hasImplicitType isFinal isOriginDeclaration this.it (nameOffset:47) (firstTokenOffset:42) (offset:47)
+                #F6 requiredPositional hasImplicitType isFinal isOriginDeclaration this.it (nameOffset:46) (firstTokenOffset:41) (offset:46)
                   element: <testLibrary>::@extensionType::A::@constructor::new::@formalParameter::it
           getters
             #F7 isCompleteDeclaration isOriginVariable it (nameOffset:<null>) (firstTokenOffset:<null>) (offset:15)
@@ -6159,7 +6312,7 @@
   test_constructor_secondary_newHead_unnamed_const() async {
     var library = await buildLibrary(r'''
 extension type A.primary(int it) {
-  const new (this.it);
+  const new(this.it);
 }
 ''');
     checkElementText(library, r'''
@@ -6188,7 +6341,7 @@
               newKeywordOffset: 43
               typeName: null
               formalParameters
-                #F6 requiredPositional hasImplicitType isFinal isOriginDeclaration this.it (nameOffset:53) (firstTokenOffset:48) (offset:53)
+                #F6 requiredPositional hasImplicitType isFinal isOriginDeclaration this.it (nameOffset:52) (firstTokenOffset:47) (offset:52)
                   element: <testLibrary>::@extensionType::A::@constructor::new::@formalParameter::it
           getters
             #F7 isCompleteDeclaration isOriginVariable it (nameOffset:<null>) (firstTokenOffset:<null>) (offset:15)
@@ -6236,6 +6389,7 @@
   test_extensionType_allSupertypes() async {
     var library = await buildLibrary(r'''
 extension type A(int? it) {}
+
 extension type B(int it) implements A, num {}
 ''');
 
@@ -6257,13 +6411,13 @@
           getters
             #F3 isCompleteDeclaration isOriginVariable it (nameOffset:<null>) (firstTokenOffset:<null>) (offset:15)
               element: <testLibrary>::@extensionType::A::@getter::it
-        #F4 extension type B (nameOffset:44) (firstTokenOffset:29) (offset:44)
+        #F4 extension type B (nameOffset:45) (firstTokenOffset:30) (offset:45)
           element: <testLibrary>::@extensionType::B
           fields
-            #F5 isFinal isOriginDeclaringFormalParameter it (nameOffset:<null>) (firstTokenOffset:<null>) (offset:44)
+            #F5 isFinal isOriginDeclaringFormalParameter it (nameOffset:<null>) (firstTokenOffset:<null>) (offset:45)
               element: <testLibrary>::@extensionType::B::@field::it
           getters
-            #F6 isCompleteDeclaration isOriginVariable it (nameOffset:<null>) (firstTokenOffset:<null>) (offset:44)
+            #F6 isCompleteDeclaration isOriginVariable it (nameOffset:<null>) (firstTokenOffset:<null>) (offset:45)
               element: <testLibrary>::@extensionType::B::@getter::it
   extensionTypes
     isSimplyBounded extension type A
@@ -6675,8 +6829,7 @@
   test_extensionType_documented() async {
     var library = await buildLibrary(r'''
 /// Docs
-extension type A(int it) {
-}
+extension type A(int it) {}
 ''');
 
     checkElementText(library, r'''
@@ -7491,8 +7644,11 @@
   test_extensionType_interfaces_class() async {
     var library = await buildLibrary(r'''
 class A {}
+
 class B {}
+
 class C implements A, B {}
+
 extension type X(C it) implements A, B {}
 ''');
 
@@ -7506,18 +7662,18 @@
       classes
         #F1 class A (nameOffset:6) (firstTokenOffset:0) (offset:6)
           element: <testLibrary>::@class::A
-        #F2 class B (nameOffset:17) (firstTokenOffset:11) (offset:17)
+        #F2 class B (nameOffset:18) (firstTokenOffset:12) (offset:18)
           element: <testLibrary>::@class::B
-        #F3 class C (nameOffset:28) (firstTokenOffset:22) (offset:28)
+        #F3 class C (nameOffset:30) (firstTokenOffset:24) (offset:30)
           element: <testLibrary>::@class::C
       extensionTypes
-        #F4 extension type X (nameOffset:64) (firstTokenOffset:49) (offset:64)
+        #F4 extension type X (nameOffset:67) (firstTokenOffset:52) (offset:67)
           element: <testLibrary>::@extensionType::X
           fields
-            #F5 isFinal isOriginDeclaringFormalParameter it (nameOffset:<null>) (firstTokenOffset:<null>) (offset:64)
+            #F5 isFinal isOriginDeclaringFormalParameter it (nameOffset:<null>) (firstTokenOffset:<null>) (offset:67)
               element: <testLibrary>::@extensionType::X::@field::it
           getters
-            #F6 isCompleteDeclaration isOriginVariable it (nameOffset:<null>) (firstTokenOffset:<null>) (offset:64)
+            #F6 isCompleteDeclaration isOriginVariable it (nameOffset:<null>) (firstTokenOffset:<null>) (offset:67)
               element: <testLibrary>::@extensionType::X::@getter::it
   classes
     isSimplyBounded class A
@@ -7561,6 +7717,7 @@
   test_extensionType_interfaces_cycle_2() async {
     var library = await buildLibrary(r'''
 extension type A(int it) implements B {}
+
 extension type B(int it) implements A {}
 ''');
 
@@ -7580,13 +7737,13 @@
           getters
             #F3 isCompleteDeclaration isOriginVariable it (nameOffset:<null>) (firstTokenOffset:<null>) (offset:15)
               element: <testLibrary>::@extensionType::A::@getter::it
-        #F4 extension type B (nameOffset:56) (firstTokenOffset:41) (offset:56)
+        #F4 extension type B (nameOffset:57) (firstTokenOffset:42) (offset:57)
           element: <testLibrary>::@extensionType::B
           fields
-            #F5 isFinal isOriginDeclaringFormalParameter it (nameOffset:<null>) (firstTokenOffset:<null>) (offset:56)
+            #F5 isFinal isOriginDeclaringFormalParameter it (nameOffset:<null>) (firstTokenOffset:<null>) (offset:57)
               element: <testLibrary>::@extensionType::B::@field::it
           getters
-            #F6 isCompleteDeclaration isOriginVariable it (nameOffset:<null>) (firstTokenOffset:<null>) (offset:56)
+            #F6 isCompleteDeclaration isOriginVariable it (nameOffset:<null>) (firstTokenOffset:<null>) (offset:57)
               element: <testLibrary>::@extensionType::B::@getter::it
   extensionTypes
     isSimplyBounded extension type A
@@ -7683,6 +7840,7 @@
   test_extensionType_interfaces_extensionType() async {
     var library = await buildLibrary(r'''
 extension type A(num it) {}
+
 extension type B(int it) implements A {}
 ''');
 
@@ -7702,13 +7860,13 @@
           getters
             #F3 isCompleteDeclaration isOriginVariable it (nameOffset:<null>) (firstTokenOffset:<null>) (offset:15)
               element: <testLibrary>::@extensionType::A::@getter::it
-        #F4 extension type B (nameOffset:43) (firstTokenOffset:28) (offset:43)
+        #F4 extension type B (nameOffset:44) (firstTokenOffset:29) (offset:44)
           element: <testLibrary>::@extensionType::B
           fields
-            #F5 isFinal isOriginDeclaringFormalParameter it (nameOffset:<null>) (firstTokenOffset:<null>) (offset:43)
+            #F5 isFinal isOriginDeclaringFormalParameter it (nameOffset:<null>) (firstTokenOffset:<null>) (offset:44)
               element: <testLibrary>::@extensionType::B::@field::it
           getters
-            #F6 isCompleteDeclaration isOriginVariable it (nameOffset:<null>) (firstTokenOffset:<null>) (offset:43)
+            #F6 isCompleteDeclaration isOriginVariable it (nameOffset:<null>) (firstTokenOffset:<null>) (offset:44)
               element: <testLibrary>::@extensionType::B::@getter::it
   extensionTypes
     isSimplyBounded extension type A
@@ -7897,6 +8055,7 @@
   test_extensionType_interfaces_void() async {
     var library = await buildLibrary(r'''
 typedef A = void;
+
 extension type X(int it) implements A, num {}
 ''');
 
@@ -7908,13 +8067,13 @@
     #F0 <testLibraryFragment>
       element: <testLibrary>
       extensionTypes
-        #F1 extension type X (nameOffset:33) (firstTokenOffset:18) (offset:33)
+        #F1 extension type X (nameOffset:34) (firstTokenOffset:19) (offset:34)
           element: <testLibrary>::@extensionType::X
           fields
-            #F2 isFinal isOriginDeclaringFormalParameter it (nameOffset:<null>) (firstTokenOffset:<null>) (offset:33)
+            #F2 isFinal isOriginDeclaringFormalParameter it (nameOffset:<null>) (firstTokenOffset:<null>) (offset:34)
               element: <testLibrary>::@extensionType::X::@field::it
           getters
-            #F3 isCompleteDeclaration isOriginVariable it (nameOffset:<null>) (firstTokenOffset:<null>) (offset:33)
+            #F3 isCompleteDeclaration isOriginVariable it (nameOffset:<null>) (firstTokenOffset:<null>) (offset:34)
               element: <testLibrary>::@extensionType::X::@getter::it
       typeAliases
         #F4 A (nameOffset:8) (firstTokenOffset:0) (offset:8)
@@ -7950,7 +8109,7 @@
   }
 
   test_extensionType_lazy_all_constructors() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 extension type E.foo(int _) {}
 ''');
 
@@ -7959,7 +8118,7 @@
   }
 
   test_extensionType_lazy_all_fields() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 extension type E(int _) {
   static int foo = 42;
 }
@@ -7970,7 +8129,7 @@
   }
 
   test_extensionType_lazy_all_getters() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 extension type E(int _) {
   int get foo => 0;
 }
@@ -7981,7 +8140,7 @@
   }
 
   test_extensionType_lazy_all_methods() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 extension type E(int _) {
   void foo() {}
 }
@@ -7992,7 +8151,7 @@
   }
 
   test_extensionType_lazy_all_setters() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 extension type E(int _) {
   set foo(int _) {}
 }
@@ -8003,7 +8162,7 @@
   }
 
   test_extensionType_lazy_byReference_constructor() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 extension type E.foo(int _) {}
 ''');
     // Test ensureReadMembers() in LinkedElementFactory.
@@ -8013,7 +8172,7 @@
   }
 
   test_extensionType_lazy_byReference_field() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 extension type E(int _) {
   static int bar = 42;
 }
@@ -8025,7 +8184,7 @@
   }
 
   test_extensionType_lazy_byReference_getter() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 extension type E(int _) {
   int get foo => 0;
 }
@@ -8037,7 +8196,7 @@
   }
 
   test_extensionType_lazy_byReference_method() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 extension type E(int _) {
   void foo() {}
 }
@@ -8049,7 +8208,7 @@
   }
 
   test_extensionType_lazy_byReference_setter() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 extension type E(int _) {
   set foo(int _) {}
 }
@@ -8067,6 +8226,7 @@
 
     var library = await buildLibrary(r'''
 import 'a.dart';
+
 @foo
 extension type A(int it) {}
 ''');
@@ -8080,21 +8240,21 @@
       libraryImports
         package:test/a.dart
       extensionTypes
-        #F1 extension type A (nameOffset:37) (firstTokenOffset:17) (offset:37)
+        #F1 extension type A (nameOffset:38) (firstTokenOffset:18) (offset:38)
           element: <testLibrary>::@extensionType::A
           fields
-            #F2 isFinal isOriginDeclaringFormalParameter it (nameOffset:<null>) (firstTokenOffset:<null>) (offset:37)
+            #F2 isFinal isOriginDeclaringFormalParameter it (nameOffset:<null>) (firstTokenOffset:<null>) (offset:38)
               element: <testLibrary>::@extensionType::A::@field::it
           constructors
-            #F3 isCompleteDeclaration isOriginDeclaration isPrimary new (nameOffset:<null>) (firstTokenOffset:37) (offset:37)
+            #F3 isCompleteDeclaration isOriginDeclaration isPrimary new (nameOffset:<null>) (firstTokenOffset:38) (offset:38)
               element: <testLibrary>::@extensionType::A::@constructor::new
               typeName: A
-              typeNameOffset: 37
+              typeNameOffset: 38
               formalParameters
-                #F4 requiredPositional isDeclaring isFinal isOriginDeclaration this.it (nameOffset:43) (firstTokenOffset:39) (offset:43)
+                #F4 requiredPositional isDeclaring isFinal isOriginDeclaration this.it (nameOffset:44) (firstTokenOffset:40) (offset:44)
                   element: <testLibrary>::@extensionType::A::@constructor::new::@formalParameter::it
           getters
-            #F5 isCompleteDeclaration isOriginVariable it (nameOffset:<null>) (firstTokenOffset:<null>) (offset:37)
+            #F5 isCompleteDeclaration isOriginVariable it (nameOffset:<null>) (firstTokenOffset:<null>) (offset:38)
               element: <testLibrary>::@extensionType::A::@getter::it
   extensionTypes
     isSimplyBounded extension type A
diff --git a/pkg/analyzer/test/src/summary/elements/formal_parameter_test.dart b/pkg/analyzer/test/src/summary/elements/formal_parameter_test.dart
index f2c6393..36ae17c 100644
--- a/pkg/analyzer/test/src/summary/elements/formal_parameter_test.dart
+++ b/pkg/analyzer/test/src/summary/elements/formal_parameter_test.dart
@@ -17,7 +17,9 @@
 
 abstract class FormalParameterElementTest extends ElementsBaseTest {
   test_parameter() async {
-    var library = await buildLibrary('void main(int p) {}');
+    var library = await buildLibrary(r'''
+void main(int p) {}
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -43,7 +45,7 @@
   }
 
   test_parameter_covariant_explicit_named() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class A {
   void m({covariant A a}) {}
 }
@@ -88,7 +90,7 @@
   }
 
   test_parameter_covariant_explicit_positional() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class A {
   void m([covariant A a]) {}
 }
@@ -133,7 +135,7 @@
   }
 
   test_parameter_covariant_explicit_required() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class A {
   void m(covariant A a) {}
 }
@@ -182,6 +184,7 @@
 class A<T> {
   void f(covariant T t) {}
 }
+
 class B<T> extends A<T> {
   void f(T t) {}
 }
@@ -208,20 +211,20 @@
               formalParameters
                 #F5 requiredPositional isExplicitlyCovariant isOriginDeclaration t (nameOffset:34) (firstTokenOffset:22) (offset:34)
                   element: <testLibrary>::@class::A::@method::f::@formalParameter::t
-        #F6 hasExtendsClause class B (nameOffset:48) (firstTokenOffset:42) (offset:48)
+        #F6 hasExtendsClause class B (nameOffset:49) (firstTokenOffset:43) (offset:49)
           element: <testLibrary>::@class::B
           typeParameters
-            #F7 T (nameOffset:50) (firstTokenOffset:50) (offset:50)
+            #F7 T (nameOffset:51) (firstTokenOffset:51) (offset:51)
               element: #E1 T
           constructors
-            #F8 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:48)
+            #F8 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:49)
               element: <testLibrary>::@class::B::@constructor::new
               typeName: B
           methods
-            #F9 isCompleteDeclaration isOriginDeclaration f (nameOffset:75) (firstTokenOffset:70) (offset:75)
+            #F9 isCompleteDeclaration isOriginDeclaration f (nameOffset:76) (firstTokenOffset:71) (offset:76)
               element: <testLibrary>::@class::B::@method::f
               formalParameters
-                #F10 requiredPositional isOriginDeclaration t (nameOffset:79) (firstTokenOffset:77) (offset:79)
+                #F10 requiredPositional isOriginDeclaration t (nameOffset:80) (firstTokenOffset:78) (offset:80)
                   element: <testLibrary>::@class::B::@method::f::@formalParameter::t
   classes
     isSimplyBounded class A
@@ -270,10 +273,11 @@
   }
 
   test_parameter_covariant_inherited_named() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class A {
   void m({covariant A a}) {}
 }
+
 class B extends A {
   void m({B a}) {}
 }
@@ -297,17 +301,17 @@
               formalParameters
                 #F4 optionalNamed isExplicitlyCovariant isOriginDeclaration a (nameOffset:32) (firstTokenOffset:20) (offset:32)
                   element: <testLibrary>::@class::A::@method::m::@formalParameter::a
-        #F5 hasExtendsClause class B (nameOffset:47) (firstTokenOffset:41) (offset:47)
+        #F5 hasExtendsClause class B (nameOffset:48) (firstTokenOffset:42) (offset:48)
           element: <testLibrary>::@class::B
           constructors
-            #F6 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:47)
+            #F6 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:48)
               element: <testLibrary>::@class::B::@constructor::new
               typeName: B
           methods
-            #F7 isCompleteDeclaration isOriginDeclaration m (nameOffset:68) (firstTokenOffset:63) (offset:68)
+            #F7 isCompleteDeclaration isOriginDeclaration m (nameOffset:69) (firstTokenOffset:64) (offset:69)
               element: <testLibrary>::@class::B::@method::m
               formalParameters
-                #F8 optionalNamed isOriginDeclaration a (nameOffset:73) (firstTokenOffset:71) (offset:73)
+                #F8 optionalNamed isOriginDeclaration a (nameOffset:74) (firstTokenOffset:72) (offset:74)
                   element: <testLibrary>::@class::B::@method::m::@formalParameter::a
   classes
     isSimplyBounded class A
@@ -348,7 +352,11 @@
   }
 
   test_parameter_parameters() async {
-    var library = await buildLibrary('class C { f(g(x, y)) {} }');
+    var library = await buildLibrary(r'''
+class C {
+  f(g(x, y)) {}
+}
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -363,16 +371,16 @@
               element: <testLibrary>::@class::C::@constructor::new
               typeName: C
           methods
-            #F3 hasImplicitReturnType isCompleteDeclaration isOriginDeclaration f (nameOffset:10) (firstTokenOffset:10) (offset:10)
+            #F3 hasImplicitReturnType isCompleteDeclaration isOriginDeclaration f (nameOffset:12) (firstTokenOffset:12) (offset:12)
               element: <testLibrary>::@class::C::@method::f
               formalParameters
-                #F4 requiredPositional isOriginDeclaration g (nameOffset:12) (firstTokenOffset:12) (offset:12)
+                #F4 requiredPositional isOriginDeclaration g (nameOffset:14) (firstTokenOffset:14) (offset:14)
                   element: <testLibrary>::@class::C::@method::f::@formalParameter::g
                   parameters
-                    #F5 requiredPositional hasImplicitType isOriginDeclaration x (nameOffset:14) (firstTokenOffset:14) (offset:14)
-                      element: x@14
-                    #F6 requiredPositional hasImplicitType isOriginDeclaration y (nameOffset:17) (firstTokenOffset:17) (offset:17)
-                      element: y@17
+                    #F5 requiredPositional hasImplicitType isOriginDeclaration x (nameOffset:16) (firstTokenOffset:16) (offset:16)
+                      element: x@16
+                    #F6 requiredPositional hasImplicitType isOriginDeclaration y (nameOffset:19) (firstTokenOffset:19) (offset:19)
+                      element: y@19
   classes
     isSimplyBounded class C
       reference: <testLibrary>::@class::C
@@ -401,7 +409,11 @@
   }
 
   test_parameter_parameters_in_generic_class() async {
-    var library = await buildLibrary('class C<A, B> { f(A g(B x)) {} }');
+    var library = await buildLibrary(r'''
+class C<A, B> {
+  f(A g(B x)) {}
+}
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -421,14 +433,14 @@
               element: <testLibrary>::@class::C::@constructor::new
               typeName: C
           methods
-            #F5 hasImplicitReturnType isCompleteDeclaration isOriginDeclaration f (nameOffset:16) (firstTokenOffset:16) (offset:16)
+            #F5 hasImplicitReturnType isCompleteDeclaration isOriginDeclaration f (nameOffset:18) (firstTokenOffset:18) (offset:18)
               element: <testLibrary>::@class::C::@method::f
               formalParameters
-                #F6 requiredPositional isOriginDeclaration g (nameOffset:20) (firstTokenOffset:18) (offset:20)
+                #F6 requiredPositional isOriginDeclaration g (nameOffset:22) (firstTokenOffset:20) (offset:22)
                   element: <testLibrary>::@class::C::@method::f::@formalParameter::g
                   parameters
-                    #F7 requiredPositional isOriginDeclaration x (nameOffset:24) (firstTokenOffset:22) (offset:24)
-                      element: x@24
+                    #F7 requiredPositional isOriginDeclaration x (nameOffset:26) (firstTokenOffset:24) (offset:26)
+                      element: x@26
   classes
     isSimplyBounded class C
       reference: <testLibrary>::@class::C
@@ -459,7 +471,11 @@
   }
 
   test_parameter_return_type() async {
-    var library = await buildLibrary('class C { f(int g()) {} }');
+    var library = await buildLibrary(r'''
+class C {
+  f(int g()) {}
+}
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -474,10 +490,10 @@
               element: <testLibrary>::@class::C::@constructor::new
               typeName: C
           methods
-            #F3 hasImplicitReturnType isCompleteDeclaration isOriginDeclaration f (nameOffset:10) (firstTokenOffset:10) (offset:10)
+            #F3 hasImplicitReturnType isCompleteDeclaration isOriginDeclaration f (nameOffset:12) (firstTokenOffset:12) (offset:12)
               element: <testLibrary>::@class::C::@method::f
               formalParameters
-                #F4 requiredPositional isOriginDeclaration g (nameOffset:16) (firstTokenOffset:12) (offset:16)
+                #F4 requiredPositional isOriginDeclaration g (nameOffset:18) (firstTokenOffset:14) (offset:18)
                   element: <testLibrary>::@class::C::@method::f::@formalParameter::g
   classes
     isSimplyBounded class C
@@ -500,7 +516,11 @@
   }
 
   test_parameter_return_type_void() async {
-    var library = await buildLibrary('class C { f(void g()) {} }');
+    var library = await buildLibrary(r'''
+class C {
+  f(void g()) {}
+}
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -515,10 +535,10 @@
               element: <testLibrary>::@class::C::@constructor::new
               typeName: C
           methods
-            #F3 hasImplicitReturnType isCompleteDeclaration isOriginDeclaration f (nameOffset:10) (firstTokenOffset:10) (offset:10)
+            #F3 hasImplicitReturnType isCompleteDeclaration isOriginDeclaration f (nameOffset:12) (firstTokenOffset:12) (offset:12)
               element: <testLibrary>::@class::C::@method::f
               formalParameters
-                #F4 requiredPositional isOriginDeclaration g (nameOffset:17) (firstTokenOffset:12) (offset:17)
+                #F4 requiredPositional isOriginDeclaration g (nameOffset:19) (firstTokenOffset:14) (offset:19)
                   element: <testLibrary>::@class::C::@method::f::@formalParameter::g
   classes
     isSimplyBounded class C
@@ -588,7 +608,7 @@
   test_parameterTypeNotInferred_constructor() async {
     // Strong mode doesn't do type inference on constructor parameters, so it's
     // ok that we don't store inferred type info for them in summaries.
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class C {
   C.positional([x = 1]);
   C.named({x: 1});
@@ -659,7 +679,7 @@
   test_parameterTypeNotInferred_initializingFormal() async {
     // Strong mode doesn't do type inference on initializing formals, so it's
     // ok that we don't store inferred type info for them in summaries.
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class C {
   var x;
   C.positional([this.x = 1]);
@@ -768,7 +788,7 @@
   test_parameterTypeNotInferred_staticMethod() async {
     // Strong mode doesn't do type inference on parameters of static methods,
     // so it's ok that we don't store inferred type info for them in summaries.
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class C {
   static void positional([x = 1]) {}
   static void named({x: 1}) {}
@@ -844,7 +864,7 @@
     // Strong mode doesn't do type inference on parameters of top level
     // functions, so it's ok that we don't store inferred type info for them in
     // summaries.
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 void positional([x = 1]) {}
 void named({x: 1}) {}
 ''');
diff --git a/pkg/analyzer/test/src/summary/elements/function_type_annotation_test.dart b/pkg/analyzer/test/src/summary/elements/function_type_annotation_test.dart
index c914282..a08607f 100644
--- a/pkg/analyzer/test/src/summary/elements/function_type_annotation_test.dart
+++ b/pkg/analyzer/test/src/summary/elements/function_type_annotation_test.dart
@@ -17,7 +17,7 @@
 
 abstract class FunctionTypeAnnotationElementTest extends ElementsBaseTest {
   test_generic_function_type_nullability_none() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 void Function() f;
 ''');
     checkElementText(library, r'''
@@ -65,7 +65,7 @@
   }
 
   test_generic_function_type_nullability_question() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 void Function()? f;
 ''');
     checkElementText(library, r'''
@@ -980,7 +980,9 @@
   test_genericFunction_typeArgument_ofSuperclass_ofClassAlias() async {
     var library = await buildLibrary(r'''
 class A<T> {}
+
 mixin M {}
+
 class B = A<void Function()> with M;
 ''');
     checkElementText(library, r'''
@@ -999,14 +1001,14 @@
             #F3 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:6)
               element: <testLibrary>::@class::A::@constructor::new
               typeName: A
-        #F4 isMixinApplication class B (nameOffset:31) (firstTokenOffset:25) (offset:31)
+        #F4 isMixinApplication class B (nameOffset:33) (firstTokenOffset:27) (offset:33)
           element: <testLibrary>::@class::B
           constructors
-            #F5 isOriginMixinApplication new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:31)
+            #F5 isOriginMixinApplication new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:33)
               element: <testLibrary>::@class::B::@constructor::new
               typeName: B
       mixins
-        #F6 mixin M (nameOffset:20) (firstTokenOffset:14) (offset:20)
+        #F6 mixin M (nameOffset:21) (firstTokenOffset:15) (offset:21)
           element: <testLibrary>::@mixin::M
   classes
     isSimplyBounded class A
diff --git a/pkg/analyzer/test/src/summary/elements/library_export_test.dart b/pkg/analyzer/test/src/summary/elements/library_export_test.dart
index e0639d3..b3e9f85 100644
--- a/pkg/analyzer/test/src/summary/elements/library_export_test.dart
+++ b/pkg/analyzer/test/src/summary/elements/library_export_test.dart
@@ -18,8 +18,12 @@
 
 abstract class LibraryExportElementTest extends ElementsBaseTest {
   test_export_class() async {
-    newFile('$testPackageLibPath/a.dart', 'class C {}');
-    var library = await buildLibrary('export "a.dart";');
+    newFile('$testPackageLibPath/a.dart', r'''
+class C {}
+''');
+    var library = await buildLibrary(r'''
+export "a.dart";
+''');
     configuration.withExportScope = true;
     checkElementText(library, r'''
 library
@@ -42,7 +46,9 @@
 class _D {}
 class _E {}
 ''');
-    var library = await buildLibrary('export "a.dart";');
+    var library = await buildLibrary(r'''
+export "a.dart";
+''');
     configuration.withExportScope = true;
     checkElementText(library, r'''
 library
@@ -61,13 +67,19 @@
 
   test_export_configurations_useDefault() async {
     declaredVariables = {'dart.library.io': 'false'};
-    newFile('$testPackageLibPath/foo.dart', 'class A {}');
-    newFile('$testPackageLibPath/foo_io.dart', 'class A {}');
-    newFile('$testPackageLibPath/foo_html.dart', 'class A {}');
+    newFile('$testPackageLibPath/foo.dart', r'''
+class A {}
+''');
+    newFile('$testPackageLibPath/foo_io.dart', r'''
+class A {}
+''');
+    newFile('$testPackageLibPath/foo_html.dart', r'''
+class A {}
+''');
     var library = await buildLibrary(r'''
 export 'foo.dart'
-  if (dart.library.io) 'foo_io.dart'
-  if (dart.library.html) 'foo_html.dart';
+    if (dart.library.io) 'foo_io.dart'
+    if (dart.library.html) 'foo_html.dart';
 ''');
     configuration.withExportScope = true;
     checkElementText(library, r'''
@@ -90,13 +102,19 @@
       'dart.library.io': 'true',
       'dart.library.html': 'true',
     };
-    newFile('$testPackageLibPath/foo.dart', 'class A {}');
-    newFile('$testPackageLibPath/foo_io.dart', 'class A {}');
-    newFile('$testPackageLibPath/foo_html.dart', 'class A {}');
+    newFile('$testPackageLibPath/foo.dart', r'''
+class A {}
+''');
+    newFile('$testPackageLibPath/foo_io.dart', r'''
+class A {}
+''');
+    newFile('$testPackageLibPath/foo_html.dart', r'''
+class A {}
+''');
     var library = await buildLibrary(r'''
 export 'foo.dart'
-  if (dart.library.io) 'foo_io.dart'
-  if (dart.library.html) 'foo_html.dart';
+    if (dart.library.io) 'foo_io.dart'
+    if (dart.library.html) 'foo_html.dart';
 ''');
     configuration.withExportScope = true;
     checkElementText(library, r'''
@@ -119,13 +137,19 @@
       'dart.library.io': 'false',
       'dart.library.html': 'true',
     };
-    newFile('$testPackageLibPath/foo.dart', 'class A {}');
-    newFile('$testPackageLibPath/foo_io.dart', 'class A {}');
-    newFile('$testPackageLibPath/foo_html.dart', 'class A {}');
+    newFile('$testPackageLibPath/foo.dart', r'''
+class A {}
+''');
+    newFile('$testPackageLibPath/foo_io.dart', r'''
+class A {}
+''');
+    newFile('$testPackageLibPath/foo_html.dart', r'''
+class A {}
+''');
     var library = await buildLibrary(r'''
 export 'foo.dart'
-  if (dart.library.io) 'foo_io.dart'
-  if (dart.library.html) 'foo_html.dart';
+    if (dart.library.io) 'foo_io.dart'
+    if (dart.library.html) 'foo_html.dart';
 ''');
     configuration.withExportScope = true;
     checkElementText(library, r'''
@@ -151,6 +175,7 @@
 
     var library = await buildLibrary(r'''
 export 'a.dart';
+
 class X {}
 ''');
     configuration.withExportScope = true;
@@ -163,10 +188,10 @@
       libraryExports
         package:test/a.dart
       classes
-        #F1 class X (nameOffset:23) (firstTokenOffset:17) (offset:23)
+        #F1 class X (nameOffset:24) (firstTokenOffset:18) (offset:24)
           element: <testLibrary>::@class::X
           constructors
-            #F2 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:23)
+            #F2 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:24)
               element: <testLibrary>::@class::X::@constructor::new
               typeName: X
   classes
@@ -187,8 +212,12 @@
   }
 
   test_export_function() async {
-    newFile('$testPackageLibPath/a.dart', 'f() {}');
-    var library = await buildLibrary('export "a.dart";');
+    newFile('$testPackageLibPath/a.dart', r'''
+f() {}
+''');
+    var library = await buildLibrary(r'''
+export "a.dart";
+''');
     configuration.withExportScope = true;
     checkElementText(library, r'''
 library
@@ -206,8 +235,12 @@
   }
 
   test_export_getter() async {
-    newFile('$testPackageLibPath/a.dart', 'get f() => null;');
-    var library = await buildLibrary('export "a.dart";');
+    newFile('$testPackageLibPath/a.dart', r'''
+get f() => null;
+''');
+    var library = await buildLibrary(r'''
+export "a.dart";
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -296,6 +329,7 @@
     var library = await buildLibrary(r'''
 export 'b.dart';
 export 'c.dart';
+
 class X {}
 ''');
 
@@ -310,10 +344,10 @@
         package:test/b.dart
         package:test/c.dart
       classes
-        #F1 class X (nameOffset:40) (firstTokenOffset:34) (offset:40)
+        #F1 class X (nameOffset:41) (firstTokenOffset:35) (offset:41)
           element: <testLibrary>::@class::X
           constructors
-            #F2 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:40)
+            #F2 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:41)
               element: <testLibrary>::@class::X::@constructor::new
               typeName: X
   classes
@@ -338,8 +372,12 @@
   }
 
   test_export_setter() async {
-    newFile('$testPackageLibPath/a.dart', 'void set f(value) {}');
-    var library = await buildLibrary('export "a.dart";');
+    newFile('$testPackageLibPath/a.dart', r'''
+void set f(value) {}
+''');
+    var library = await buildLibrary(r'''
+export "a.dart";
+''');
     configuration.withExportScope = true;
     checkElementText(library, r'''
 library
@@ -387,11 +425,13 @@
   }
 
   test_export_show_getter_setter() async {
-    newFile('$testPackageLibPath/a.dart', '''
+    newFile('$testPackageLibPath/a.dart', r'''
 get f => null;
 void set f(value) {}
 ''');
-    var library = await buildLibrary('export "a.dart" show f;');
+    var library = await buildLibrary(r'''
+export "a.dart" show f;
+''');
     configuration.withExportScope = true;
     checkElementText(library, r'''
 library
@@ -413,8 +453,12 @@
   }
 
   test_export_typedef() async {
-    newFile('$testPackageLibPath/a.dart', 'typedef F();');
-    var library = await buildLibrary('export "a.dart";');
+    newFile('$testPackageLibPath/a.dart', r'''
+typedef F();
+''');
+    var library = await buildLibrary(r'''
+export "a.dart";
+''');
     configuration.withExportScope = true;
     checkElementText(library, r'''
 library
@@ -432,7 +476,7 @@
   }
 
   test_export_uri() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 export 'foo.dart';
 ''');
 
@@ -448,8 +492,12 @@
   }
 
   test_export_variable() async {
-    newFile('$testPackageLibPath/a.dart', 'var x;');
-    var library = await buildLibrary('export "a.dart";');
+    newFile('$testPackageLibPath/a.dart', r'''
+var x;
+''');
+    var library = await buildLibrary(r'''
+export "a.dart";
+''');
     configuration.withExportScope = true;
     checkElementText(library, r'''
 library
@@ -469,8 +517,12 @@
   }
 
   test_export_variable_const() async {
-    newFile('$testPackageLibPath/a.dart', 'const x = 0;');
-    var library = await buildLibrary('export "a.dart";');
+    newFile('$testPackageLibPath/a.dart', r'''
+const x = 0;
+''');
+    var library = await buildLibrary(r'''
+export "a.dart";
+''');
     configuration.withExportScope = true;
     checkElementText(library, r'''
 library
@@ -488,8 +540,12 @@
   }
 
   test_export_variable_final() async {
-    newFile('$testPackageLibPath/a.dart', 'final x = 0;');
-    var library = await buildLibrary('export "a.dart";');
+    newFile('$testPackageLibPath/a.dart', r'''
+final x = 0;
+''');
+    var library = await buildLibrary(r'''
+export "a.dart";
+''');
     configuration.withExportScope = true;
     checkElementText(library, r'''
 library
@@ -508,9 +564,15 @@
 
   test_exportImport_configurations_useDefault() async {
     declaredVariables = {'dart.library.io': 'false'};
-    newFile('$testPackageLibPath/foo.dart', 'class A {}');
-    newFile('$testPackageLibPath/foo_io.dart', 'class A {}');
-    newFile('$testPackageLibPath/foo_html.dart', 'class A {}');
+    newFile('$testPackageLibPath/foo.dart', r'''
+class A {}
+''');
+    newFile('$testPackageLibPath/foo_io.dart', r'''
+class A {}
+''');
+    newFile('$testPackageLibPath/foo_html.dart', r'''
+class A {}
+''');
     newFile('$testPackageLibPath/bar.dart', r'''
 export 'foo.dart'
   if (dart.library.io) 'foo_io.dart'
@@ -518,6 +580,7 @@
 ''');
     var library = await buildLibrary(r'''
 import 'bar.dart';
+
 class B extends A {}
 ''');
     checkElementText(library, r'''
@@ -529,10 +592,10 @@
       libraryImports
         package:test/bar.dart
       classes
-        #F1 hasExtendsClause class B (nameOffset:25) (firstTokenOffset:19) (offset:25)
+        #F1 hasExtendsClause class B (nameOffset:26) (firstTokenOffset:20) (offset:26)
           element: <testLibrary>::@class::B
           constructors
-            #F2 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:25)
+            #F2 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:26)
               element: <testLibrary>::@class::B::@constructor::new
               typeName: B
   classes
@@ -558,9 +621,15 @@
       'dart.library.io': 'true',
       'dart.library.html': 'false',
     };
-    newFile('$testPackageLibPath/foo.dart', 'class A {}');
-    newFile('$testPackageLibPath/foo_io.dart', 'class A {}');
-    newFile('$testPackageLibPath/foo_html.dart', 'class A {}');
+    newFile('$testPackageLibPath/foo.dart', r'''
+class A {}
+''');
+    newFile('$testPackageLibPath/foo_io.dart', r'''
+class A {}
+''');
+    newFile('$testPackageLibPath/foo_html.dart', r'''
+class A {}
+''');
     newFile('$testPackageLibPath/bar.dart', r'''
 export 'foo.dart'
   if (dart.library.io) 'foo_io.dart'
@@ -568,6 +637,7 @@
 ''');
     var library = await buildLibrary(r'''
 import 'bar.dart';
+
 class B extends A {}
 ''');
     checkElementText(library, r'''
@@ -579,10 +649,10 @@
       libraryImports
         package:test/bar.dart
       classes
-        #F1 hasExtendsClause class B (nameOffset:25) (firstTokenOffset:19) (offset:25)
+        #F1 hasExtendsClause class B (nameOffset:26) (firstTokenOffset:20) (offset:26)
           element: <testLibrary>::@class::B
           constructors
-            #F2 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:25)
+            #F2 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:26)
               element: <testLibrary>::@class::B::@constructor::new
               typeName: B
   classes
@@ -608,9 +678,15 @@
       'dart.library.io': 'false',
       'dart.library.html': 'true',
     };
-    newFile('$testPackageLibPath/foo.dart', 'class A {}');
-    newFile('$testPackageLibPath/foo_io.dart', 'class A {}');
-    newFile('$testPackageLibPath/foo_html.dart', 'class A {}');
+    newFile('$testPackageLibPath/foo.dart', r'''
+class A {}
+''');
+    newFile('$testPackageLibPath/foo_io.dart', r'''
+class A {}
+''');
+    newFile('$testPackageLibPath/foo_html.dart', r'''
+class A {}
+''');
     newFile('$testPackageLibPath/bar.dart', r'''
 export 'foo.dart'
   if (dart.library.io) 'foo_io.dart'
@@ -618,6 +694,7 @@
 ''');
     var library = await buildLibrary(r'''
 import 'bar.dart';
+
 class B extends A {}
 ''');
     checkElementText(library, r'''
@@ -629,10 +706,10 @@
       libraryImports
         package:test/bar.dart
       classes
-        #F1 hasExtendsClause class B (nameOffset:25) (firstTokenOffset:19) (offset:25)
+        #F1 hasExtendsClause class B (nameOffset:26) (firstTokenOffset:20) (offset:26)
           element: <testLibrary>::@class::B
           constructors
-            #F2 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:25)
+            #F2 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:26)
               element: <testLibrary>::@class::B::@constructor::new
               typeName: B
   classes
@@ -654,9 +731,16 @@
   }
 
   test_exports() async {
-    newFile('$testPackageLibPath/a.dart', 'library a;');
-    newFile('$testPackageLibPath/b.dart', 'library b;');
-    var library = await buildLibrary('export "a.dart"; export "b.dart";');
+    newFile('$testPackageLibPath/a.dart', r'''
+library a;
+''');
+    newFile('$testPackageLibPath/b.dart', r'''
+library b;
+''');
+    var library = await buildLibrary(r'''
+export "a.dart";
+export "b.dart";
+''');
     configuration.withExportScope = true;
     checkElementText(library, r'''
 library
@@ -682,6 +766,7 @@
 
     var library = await buildLibrary(r'''
 part 'a.dart';
+
 class A {}
 ''');
 
@@ -812,6 +897,7 @@
     var library = await buildLibrary(r'''
 part 'd.dart';
 part 'e.dart';
+
 class X {}
 ''');
 
@@ -833,10 +919,10 @@
           partKeywordOffset: 15
           unit: #F2
       classes
-        #F3 class X (nameOffset:36) (firstTokenOffset:30) (offset:36)
+        #F3 class X (nameOffset:37) (firstTokenOffset:31) (offset:37)
           element: <testLibrary>::@class::X
           constructors
-            #F4 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:36)
+            #F4 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:37)
               element: <testLibrary>::@class::X::@constructor::new
               typeName: X
     #F1 package:test/d.dart
@@ -891,6 +977,7 @@
 
     var library = await buildLibrary(r'''
 part 'b.dart';
+
 class X {}
 ''');
 
@@ -908,10 +995,10 @@
           partKeywordOffset: 0
           unit: #F1
       classes
-        #F2 class X (nameOffset:21) (firstTokenOffset:15) (offset:21)
+        #F2 class X (nameOffset:22) (firstTokenOffset:16) (offset:22)
           element: <testLibrary>::@class::X
           constructors
-            #F3 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:21)
+            #F3 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:22)
               element: <testLibrary>::@class::X::@constructor::new
               typeName: X
     #F1 package:test/b.dart
@@ -955,6 +1042,7 @@
 
     var library = await buildLibrary(r'''
 part 'b.dart';
+
 class X {}
 ''');
 
@@ -972,10 +1060,10 @@
           partKeywordOffset: 0
           unit: #F1
       classes
-        #F2 class X (nameOffset:21) (firstTokenOffset:15) (offset:21)
+        #F2 class X (nameOffset:22) (firstTokenOffset:16) (offset:22)
           element: <testLibrary>::@class::X
           constructors
-            #F3 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:21)
+            #F3 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:22)
               element: <testLibrary>::@class::X::@constructor::new
               typeName: X
     #F1 package:test/b.dart
@@ -1015,6 +1103,7 @@
 
     var library = await buildLibrary(r'''
 part 'a.dart';
+
 mixin A {}
 ''');
 
@@ -1117,6 +1206,7 @@
 
     var library = await buildLibrary(r'''
 part 'a.dart';
+
 class C {}
 ''');
 
@@ -1134,10 +1224,10 @@
           partKeywordOffset: 0
           unit: #F1
       classes
-        #F2 class C (nameOffset:21) (firstTokenOffset:15) (offset:21)
+        #F2 class C (nameOffset:22) (firstTokenOffset:16) (offset:22)
           element: <testLibrary>::@class::C
           constructors
-            #F3 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:21)
+            #F3 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:22)
               element: <testLibrary>::@class::C::@constructor::new
               typeName: C
     #F1 package:test/a.dart
@@ -1223,6 +1313,7 @@
 
     var library = await buildLibrary(r'''
 part 'c.dart';
+
 class X {}
 ''');
 
@@ -1240,10 +1331,10 @@
           partKeywordOffset: 0
           unit: #F1
       classes
-        #F2 class X (nameOffset:21) (firstTokenOffset:15) (offset:21)
+        #F2 class X (nameOffset:22) (firstTokenOffset:16) (offset:22)
           element: <testLibrary>::@class::X
           constructors
-            #F3 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:21)
+            #F3 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:22)
               element: <testLibrary>::@class::X::@constructor::new
               typeName: X
     #F1 package:test/c.dart
@@ -1507,7 +1598,9 @@
   }
 
   test_unresolved_export() async {
-    var library = await buildLibrary("export 'foo.dart';");
+    var library = await buildLibrary(r'''
+export 'foo.dart';
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
diff --git a/pkg/analyzer/test/src/summary/elements/library_fragment_test.dart b/pkg/analyzer/test/src/summary/elements/library_fragment_test.dart
index b6d0b37..8f2fe455 100644
--- a/pkg/analyzer/test/src/summary/elements/library_fragment_test.dart
+++ b/pkg/analyzer/test/src/summary/elements/library_fragment_test.dart
@@ -309,6 +309,7 @@
 
     var library = await buildLibrary(r'''
 part 'a.dart';
+
 extension Z on int {}
 ''');
 
@@ -347,6 +348,7 @@
   test_scope_accessibleExtensions_unnamed() async {
     var library = await buildLibrary(r'''
 part 'a.dart';
+
 extension on int {}
 ''');
 
@@ -1316,6 +1318,7 @@
 
     var library = await buildLibrary(r'''
 part 'a.dart';
+
 class Z {}
 ''');
 
@@ -1362,6 +1365,7 @@
 
     var library = await buildLibrary(r'''
 part 'a.dart';
+
 class _Z {}
 ''');
 
diff --git a/pkg/analyzer/test/src/summary/elements/library_import_test.dart b/pkg/analyzer/test/src/summary/elements/library_import_test.dart
index e4f21f9..4ece77e 100644
--- a/pkg/analyzer/test/src/summary/elements/library_import_test.dart
+++ b/pkg/analyzer/test/src/summary/elements/library_import_test.dart
@@ -20,13 +20,19 @@
 abstract class LibraryImportElementTest extends ElementsBaseTest {
   test_import_configurations_useDefault() async {
     declaredVariables = {'dart.library.io': 'false'};
-    newFile('$testPackageLibPath/foo.dart', 'class A {}');
-    newFile('$testPackageLibPath/foo_io.dart', 'class A {}');
-    newFile('$testPackageLibPath/foo_html.dart', 'class A {}');
+    newFile('$testPackageLibPath/foo.dart', r'''
+class A {}
+''');
+    newFile('$testPackageLibPath/foo_io.dart', r'''
+class A {}
+''');
+    newFile('$testPackageLibPath/foo_html.dart', r'''
+class A {}
+''');
     var library = await buildLibrary(r'''
 import 'foo.dart'
-  if (dart.library.io) 'foo_io.dart'
-  if (dart.library.html) 'foo_html.dart';
+    if (dart.library.io) 'foo_io.dart'
+    if (dart.library.html) 'foo_html.dart';
 
 class B extends A {}
 ''');
@@ -39,10 +45,10 @@
       libraryImports
         package:test/foo.dart
       classes
-        #F1 hasExtendsClause class B (nameOffset:104) (firstTokenOffset:98) (offset:104)
+        #F1 hasExtendsClause class B (nameOffset:108) (firstTokenOffset:102) (offset:108)
           element: <testLibrary>::@class::B
           constructors
-            #F2 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:104)
+            #F2 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:108)
               element: <testLibrary>::@class::B::@constructor::new
               typeName: B
   classes
@@ -68,13 +74,19 @@
       'dart.library.io': 'true',
       'dart.library.html': 'true',
     };
-    newFile('$testPackageLibPath/foo.dart', 'class A {}');
-    newFile('$testPackageLibPath/foo_io.dart', 'class A {}');
-    newFile('$testPackageLibPath/foo_html.dart', 'class A {}');
+    newFile('$testPackageLibPath/foo.dart', r'''
+class A {}
+''');
+    newFile('$testPackageLibPath/foo_io.dart', r'''
+class A {}
+''');
+    newFile('$testPackageLibPath/foo_html.dart', r'''
+class A {}
+''');
     var library = await buildLibrary(r'''
 import 'foo.dart'
-  if (dart.library.io) 'foo_io.dart'
-  if (dart.library.html) 'foo_html.dart';
+    if (dart.library.io) 'foo_io.dart'
+    if (dart.library.html) 'foo_html.dart';
 
 class B extends A {}
 ''');
@@ -87,10 +99,10 @@
       libraryImports
         package:test/foo_io.dart
       classes
-        #F1 hasExtendsClause class B (nameOffset:104) (firstTokenOffset:98) (offset:104)
+        #F1 hasExtendsClause class B (nameOffset:108) (firstTokenOffset:102) (offset:108)
           element: <testLibrary>::@class::B
           constructors
-            #F2 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:104)
+            #F2 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:108)
               element: <testLibrary>::@class::B::@constructor::new
               typeName: B
   classes
@@ -116,13 +128,19 @@
       'dart.library.io': 'true',
       'dart.library.html': 'true',
     };
-    newFile('$testPackageLibPath/foo.dart', 'class A {}');
-    newFile('$testPackageLibPath/foo_io.dart', 'class A {}');
-    newFile('$testPackageLibPath/foo_html.dart', 'class A {}');
+    newFile('$testPackageLibPath/foo.dart', r'''
+class A {}
+''');
+    newFile('$testPackageLibPath/foo_io.dart', r'''
+class A {}
+''');
+    newFile('$testPackageLibPath/foo_html.dart', r'''
+class A {}
+''');
     var library = await buildLibrary(r'''
 import 'foo.dart'
-  if (dart.library.io == 'true') 'foo_io.dart'
-  if (dart.library.html == 'true') 'foo_html.dart';
+    if (dart.library.io == 'true') 'foo_io.dart'
+    if (dart.library.html == 'true') 'foo_html.dart';
 
 class B extends A {}
 ''');
@@ -135,10 +153,10 @@
       libraryImports
         package:test/foo_io.dart
       classes
-        #F1 hasExtendsClause class B (nameOffset:124) (firstTokenOffset:118) (offset:124)
+        #F1 hasExtendsClause class B (nameOffset:128) (firstTokenOffset:122) (offset:128)
           element: <testLibrary>::@class::B
           constructors
-            #F2 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:124)
+            #F2 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:128)
               element: <testLibrary>::@class::B::@constructor::new
               typeName: B
   classes
@@ -164,13 +182,19 @@
       'dart.library.io': 'false',
       'dart.library.html': 'true',
     };
-    newFile('$testPackageLibPath/foo.dart', 'class A {}');
-    newFile('$testPackageLibPath/foo_io.dart', 'class A {}');
-    newFile('$testPackageLibPath/foo_html.dart', 'class A {}');
+    newFile('$testPackageLibPath/foo.dart', r'''
+class A {}
+''');
+    newFile('$testPackageLibPath/foo_io.dart', r'''
+class A {}
+''');
+    newFile('$testPackageLibPath/foo_html.dart', r'''
+class A {}
+''');
     var library = await buildLibrary(r'''
 import 'foo.dart'
-  if (dart.library.io) 'foo_io.dart'
-  if (dart.library.html) 'foo_html.dart';
+    if (dart.library.io) 'foo_io.dart'
+    if (dart.library.html) 'foo_html.dart';
 
 class B extends A {}
 ''');
@@ -183,10 +207,10 @@
       libraryImports
         package:test/foo_html.dart
       classes
-        #F1 hasExtendsClause class B (nameOffset:104) (firstTokenOffset:98) (offset:104)
+        #F1 hasExtendsClause class B (nameOffset:108) (firstTokenOffset:102) (offset:108)
           element: <testLibrary>::@class::B
           constructors
-            #F2 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:104)
+            #F2 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:108)
               element: <testLibrary>::@class::B::@constructor::new
               typeName: B
   classes
@@ -212,13 +236,19 @@
       'dart.library.io': 'false',
       'dart.library.html': 'true',
     };
-    newFile('$testPackageLibPath/foo.dart', 'class A {}');
-    newFile('$testPackageLibPath/foo_io.dart', 'class A {}');
-    newFile('$testPackageLibPath/foo_html.dart', 'class A {}');
+    newFile('$testPackageLibPath/foo.dart', r'''
+class A {}
+''');
+    newFile('$testPackageLibPath/foo_io.dart', r'''
+class A {}
+''');
+    newFile('$testPackageLibPath/foo_html.dart', r'''
+class A {}
+''');
     var library = await buildLibrary(r'''
 import 'foo.dart'
-  if (dart.library.io == 'true') 'foo_io.dart'
-  if (dart.library.html == 'true') 'foo_html.dart';
+    if (dart.library.io == 'true') 'foo_io.dart'
+    if (dart.library.html == 'true') 'foo_html.dart';
 
 class B extends A {}
 ''');
@@ -231,10 +261,10 @@
       libraryImports
         package:test/foo_html.dart
       classes
-        #F1 hasExtendsClause class B (nameOffset:124) (firstTokenOffset:118) (offset:124)
+        #F1 hasExtendsClause class B (nameOffset:128) (firstTokenOffset:122) (offset:128)
           element: <testLibrary>::@class::B
           constructors
-            #F2 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:124)
+            #F2 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:128)
               element: <testLibrary>::@class::B::@constructor::new
               typeName: B
   classes
@@ -256,7 +286,7 @@
   }
 
   test_import_dartCore_explicit() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 import 'dart:core';
 import 'dart:math';
 ''');
@@ -273,7 +303,7 @@
   }
 
   test_import_dartCore_implicit() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 import 'dart:math';
 ''');
     checkElementText(library, r'''
@@ -288,8 +318,10 @@
   }
 
   test_import_deferred() async {
-    newFile('$testPackageLibPath/a.dart', 'f() {}');
-    var library = await buildLibrary('''
+    newFile('$testPackageLibPath/a.dart', r'''
+f() {}
+''');
+    var library = await buildLibrary(r'''
 import 'a.dart' deferred as p;
 ''');
     checkElementText(library, r'''
@@ -307,7 +339,7 @@
   }
 
   test_import_export() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 import 'dart:async' as i1;
 export 'dart:math';
 import 'dart:async' as i2;
@@ -340,102 +372,9 @@
   }
 
   test_import_hide() async {
-    var library = await buildLibrary('''
-import 'dart:async' hide Stream, Completer; Future f;
-''');
-    checkElementText(library, r'''
-library
-  reference: <testLibrary>
-  fragments
-    #F0 <testLibraryFragment>
-      element: <testLibrary>
-      libraryImports
-        dart:async
-          combinators
-            hide: Stream, Completer
-      topLevelVariables
-        #F1 isOriginDeclaration isStatic f (nameOffset:51) (firstTokenOffset:51) (offset:51)
-          element: <testLibrary>::@topLevelVariable::f
-      getters
-        #F2 isCompleteDeclaration isOriginVariable isStatic f (nameOffset:<null>) (firstTokenOffset:<null>) (offset:51)
-          element: <testLibrary>::@getter::f
-      setters
-        #F3 isCompleteDeclaration isOriginVariable isStatic f (nameOffset:<null>) (firstTokenOffset:<null>) (offset:51)
-          element: <testLibrary>::@setter::f
-          formalParameters
-            #F4 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:51)
-              element: <testLibrary>::@setter::f::@formalParameter::value
-  topLevelVariables
-    isOriginDeclaration isStatic f
-      reference: <testLibrary>::@topLevelVariable::f
-      firstFragment: #F1
-      type: Future<dynamic>
-      getter: <testLibrary>::@getter::f
-      setter: <testLibrary>::@setter::f
-  getters
-    isOriginVariable isStatic f
-      reference: <testLibrary>::@getter::f
-      firstFragment: #F2
-      returnType: Future<dynamic>
-      variable: <testLibrary>::@topLevelVariable::f
-  setters
-    isOriginVariable isStatic f
-      reference: <testLibrary>::@setter::f
-      firstFragment: #F3
-      formalParameters
-        #E0 requiredPositional value
-          firstFragment: #F4
-          type: Future<dynamic>
-      returnType: void
-      variable: <testLibrary>::@topLevelVariable::f
-''');
-  }
+    var library = await buildLibrary(r'''
+import 'dart:async' hide Stream, Completer;
 
-  test_import_hide_offsetEnd() async {
-    var library = await buildLibrary('''
-import "dart:math" hide e, pi;
-''');
-    var import = library.firstFragment.libraryImports[0];
-    var combinator = import.combinators[0] as HideElementCombinator;
-    expect(combinator.offset, 19);
-    expect(combinator.end, 29);
-  }
-
-  test_import_invalidUri_metadata() async {
-    var library = await buildLibrary('''
-@foo
-import 'ht:';
-''');
-    checkElementText(library, r'''
-library
-  reference: <testLibrary>
-  metadata
-    Annotation
-      atSign: @ @0
-      name: SimpleIdentifier
-        token: foo @1
-        element: <null>
-        staticType: null
-      element: <null>
-  fragments
-    #F0 <testLibraryFragment>
-      element: <testLibrary>
-      libraryImports
-        relativeUri 'ht:'
-          metadata
-            Annotation
-              atSign: @ @0
-              name: SimpleIdentifier
-                token: foo @1
-                element: <null>
-                staticType: null
-              element: <null>
-''');
-  }
-
-  test_import_multiple_combinators() async {
-    var library = await buildLibrary('''
-import "dart:async" hide Stream show Future;
 Future f;
 ''');
     checkElementText(library, r'''
@@ -447,8 +386,7 @@
       libraryImports
         dart:async
           combinators
-            hide: Stream
-            show: Future
+            hide: Stream, Completer
       topLevelVariables
         #F1 isOriginDeclaration isStatic f (nameOffset:52) (firstTokenOffset:52) (offset:52)
           element: <testLibrary>::@topLevelVariable::f
@@ -487,9 +425,113 @@
 ''');
   }
 
+  test_import_hide_offsetEnd() async {
+    var library = await buildLibrary(r'''
+import "dart:math" hide e, pi;
+''');
+    var import = library.firstFragment.libraryImports[0];
+    var combinator = import.combinators[0] as HideElementCombinator;
+    expect(combinator.offset, 19);
+    expect(combinator.end, 29);
+  }
+
+  test_import_invalidUri_metadata() async {
+    var library = await buildLibrary(r'''
+@foo
+import 'ht:';
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  metadata
+    Annotation
+      atSign: @ @0
+      name: SimpleIdentifier
+        token: foo @1
+        element: <null>
+        staticType: null
+      element: <null>
+  fragments
+    #F0 <testLibraryFragment>
+      element: <testLibrary>
+      libraryImports
+        relativeUri 'ht:'
+          metadata
+            Annotation
+              atSign: @ @0
+              name: SimpleIdentifier
+                token: foo @1
+                element: <null>
+                staticType: null
+              element: <null>
+''');
+  }
+
+  test_import_multiple_combinators() async {
+    var library = await buildLibrary(r'''
+import "dart:async" hide Stream show Future;
+
+Future f;
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  fragments
+    #F0 <testLibraryFragment>
+      element: <testLibrary>
+      libraryImports
+        dart:async
+          combinators
+            hide: Stream
+            show: Future
+      topLevelVariables
+        #F1 isOriginDeclaration isStatic f (nameOffset:53) (firstTokenOffset:53) (offset:53)
+          element: <testLibrary>::@topLevelVariable::f
+      getters
+        #F2 isCompleteDeclaration isOriginVariable isStatic f (nameOffset:<null>) (firstTokenOffset:<null>) (offset:53)
+          element: <testLibrary>::@getter::f
+      setters
+        #F3 isCompleteDeclaration isOriginVariable isStatic f (nameOffset:<null>) (firstTokenOffset:<null>) (offset:53)
+          element: <testLibrary>::@setter::f
+          formalParameters
+            #F4 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:53)
+              element: <testLibrary>::@setter::f::@formalParameter::value
+  topLevelVariables
+    isOriginDeclaration isStatic f
+      reference: <testLibrary>::@topLevelVariable::f
+      firstFragment: #F1
+      type: Future<dynamic>
+      getter: <testLibrary>::@getter::f
+      setter: <testLibrary>::@setter::f
+  getters
+    isOriginVariable isStatic f
+      reference: <testLibrary>::@getter::f
+      firstFragment: #F2
+      returnType: Future<dynamic>
+      variable: <testLibrary>::@topLevelVariable::f
+  setters
+    isOriginVariable isStatic f
+      reference: <testLibrary>::@setter::f
+      firstFragment: #F3
+      formalParameters
+        #E0 requiredPositional value
+          firstFragment: #F4
+          type: Future<dynamic>
+      returnType: void
+      variable: <testLibrary>::@topLevelVariable::f
+''');
+  }
+
   test_import_prefixed() async {
-    newFile('$testPackageLibPath/a.dart', 'library a; class C {}');
-    var library = await buildLibrary('import "a.dart" as a; a.C c;');
+    newFile('$testPackageLibPath/a.dart', r'''
+library a;
+class C {}
+''');
+    var library = await buildLibrary(r'''
+import "a.dart" as a;
+
+a.C c;
+''');
 
     var prefixElement = library.firstFragment.libraryImports[0].prefix!;
     expect(prefixElement.nameOffset, 19);
@@ -506,16 +548,16 @@
         <testLibraryFragment>::@prefix::a
           fragments: @19
       topLevelVariables
-        #F1 isOriginDeclaration isStatic c (nameOffset:26) (firstTokenOffset:26) (offset:26)
+        #F1 isOriginDeclaration isStatic c (nameOffset:27) (firstTokenOffset:27) (offset:27)
           element: <testLibrary>::@topLevelVariable::c
       getters
-        #F2 isCompleteDeclaration isOriginVariable isStatic c (nameOffset:<null>) (firstTokenOffset:<null>) (offset:26)
+        #F2 isCompleteDeclaration isOriginVariable isStatic c (nameOffset:<null>) (firstTokenOffset:<null>) (offset:27)
           element: <testLibrary>::@getter::c
       setters
-        #F3 isCompleteDeclaration isOriginVariable isStatic c (nameOffset:<null>) (firstTokenOffset:<null>) (offset:26)
+        #F3 isCompleteDeclaration isOriginVariable isStatic c (nameOffset:<null>) (firstTokenOffset:<null>) (offset:27)
           element: <testLibrary>::@setter::c
           formalParameters
-            #F4 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:26)
+            #F4 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:27)
               element: <testLibrary>::@setter::c::@formalParameter::value
   topLevelVariables
     isOriginDeclaration isStatic c
@@ -563,9 +605,11 @@
   }
 
   test_import_self() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 import 'test.dart' as p;
+
 class C {}
+
 class D extends p.C {} // Prevent "unused import" warning
 ''');
     var libraryImports = library.firstFragment.libraryImports;
@@ -583,16 +627,16 @@
         <testLibraryFragment>::@prefix::p
           fragments: @22
       classes
-        #F1 class C (nameOffset:31) (firstTokenOffset:25) (offset:31)
+        #F1 class C (nameOffset:32) (firstTokenOffset:26) (offset:32)
           element: <testLibrary>::@class::C
           constructors
-            #F2 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:31)
+            #F2 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:32)
               element: <testLibrary>::@class::C::@constructor::new
               typeName: C
-        #F3 hasExtendsClause class D (nameOffset:42) (firstTokenOffset:36) (offset:42)
+        #F3 hasExtendsClause class D (nameOffset:44) (firstTokenOffset:38) (offset:44)
           element: <testLibrary>::@class::D
           constructors
-            #F4 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:42)
+            #F4 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:44)
               element: <testLibrary>::@class::D::@constructor::new
               typeName: D
   classes
@@ -616,8 +660,9 @@
   }
 
   test_import_show() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 import "dart:async" show Future, Stream;
+
 Future f;
 Stream s;
 ''');
@@ -632,25 +677,25 @@
           combinators
             show: Future, Stream
       topLevelVariables
-        #F1 isOriginDeclaration isStatic f (nameOffset:48) (firstTokenOffset:48) (offset:48)
+        #F1 isOriginDeclaration isStatic f (nameOffset:49) (firstTokenOffset:49) (offset:49)
           element: <testLibrary>::@topLevelVariable::f
-        #F2 isOriginDeclaration isStatic s (nameOffset:58) (firstTokenOffset:58) (offset:58)
+        #F2 isOriginDeclaration isStatic s (nameOffset:59) (firstTokenOffset:59) (offset:59)
           element: <testLibrary>::@topLevelVariable::s
       getters
-        #F3 isCompleteDeclaration isOriginVariable isStatic f (nameOffset:<null>) (firstTokenOffset:<null>) (offset:48)
+        #F3 isCompleteDeclaration isOriginVariable isStatic f (nameOffset:<null>) (firstTokenOffset:<null>) (offset:49)
           element: <testLibrary>::@getter::f
-        #F4 isCompleteDeclaration isOriginVariable isStatic s (nameOffset:<null>) (firstTokenOffset:<null>) (offset:58)
+        #F4 isCompleteDeclaration isOriginVariable isStatic s (nameOffset:<null>) (firstTokenOffset:<null>) (offset:59)
           element: <testLibrary>::@getter::s
       setters
-        #F5 isCompleteDeclaration isOriginVariable isStatic f (nameOffset:<null>) (firstTokenOffset:<null>) (offset:48)
+        #F5 isCompleteDeclaration isOriginVariable isStatic f (nameOffset:<null>) (firstTokenOffset:<null>) (offset:49)
           element: <testLibrary>::@setter::f
           formalParameters
-            #F6 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:48)
+            #F6 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:49)
               element: <testLibrary>::@setter::f::@formalParameter::value
-        #F7 isCompleteDeclaration isOriginVariable isStatic s (nameOffset:<null>) (firstTokenOffset:<null>) (offset:58)
+        #F7 isCompleteDeclaration isOriginVariable isStatic s (nameOffset:<null>) (firstTokenOffset:<null>) (offset:59)
           element: <testLibrary>::@setter::s
           formalParameters
-            #F8 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:58)
+            #F8 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:59)
               element: <testLibrary>::@setter::s::@formalParameter::value
   topLevelVariables
     isOriginDeclaration isStatic f
@@ -699,10 +744,13 @@
   }
 
   test_import_show_loadLibrary_declared() async {
-    newFile('$testPackageLibPath/a.dart', 'void loadLibrary() {}');
+    newFile('$testPackageLibPath/a.dart', r'''
+void loadLibrary() {}
+''');
 
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 import "a.dart" show loadLibrary;
+
 final x = loadLibrary;
 ''');
     checkElementText(library, r'''
@@ -716,10 +764,10 @@
           combinators
             show: loadLibrary
       topLevelVariables
-        #F1 hasImplicitType hasInitializer isFinal isOriginDeclaration isStatic x (nameOffset:40) (firstTokenOffset:40) (offset:40)
+        #F1 hasImplicitType hasInitializer isFinal isOriginDeclaration isStatic x (nameOffset:41) (firstTokenOffset:41) (offset:41)
           element: <testLibrary>::@topLevelVariable::x
       getters
-        #F2 isCompleteDeclaration isOriginVariable isStatic x (nameOffset:<null>) (firstTokenOffset:<null>) (offset:40)
+        #F2 isCompleteDeclaration isOriginVariable isStatic x (nameOffset:<null>) (firstTokenOffset:<null>) (offset:41)
           element: <testLibrary>::@getter::x
   topLevelVariables
     hasImplicitType hasInitializer isFinal isOriginDeclaration isStatic isTypeInferredFromInitializer x
@@ -737,7 +785,7 @@
   }
 
   test_import_show_offsetEnd() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 import "dart:math" show e, pi;
 ''');
     var import = library.firstFragment.libraryImports[0];
@@ -747,7 +795,7 @@
   }
 
   test_import_uri() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 import 'foo.dart';
 ''');
 
@@ -757,11 +805,21 @@
   }
 
   test_imports() async {
-    newFile('$testPackageLibPath/a.dart', 'library a; class C {}');
-    newFile('$testPackageLibPath/b.dart', 'library b; class D {}');
-    var library = await buildLibrary(
-      'import "a.dart"; import "b.dart"; C c; D d;',
-    );
+    newFile('$testPackageLibPath/a.dart', r'''
+library a;
+class C {}
+''');
+    newFile('$testPackageLibPath/b.dart', r'''
+library b;
+class D {}
+''');
+    var library = await buildLibrary(r'''
+import "a.dart";
+import "b.dart";
+
+C c;
+D d;
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -772,25 +830,25 @@
         package:test/a.dart
         package:test/b.dart
       topLevelVariables
-        #F1 isOriginDeclaration isStatic c (nameOffset:36) (firstTokenOffset:36) (offset:36)
+        #F1 isOriginDeclaration isStatic c (nameOffset:37) (firstTokenOffset:37) (offset:37)
           element: <testLibrary>::@topLevelVariable::c
-        #F2 isOriginDeclaration isStatic d (nameOffset:41) (firstTokenOffset:41) (offset:41)
+        #F2 isOriginDeclaration isStatic d (nameOffset:42) (firstTokenOffset:42) (offset:42)
           element: <testLibrary>::@topLevelVariable::d
       getters
-        #F3 isCompleteDeclaration isOriginVariable isStatic c (nameOffset:<null>) (firstTokenOffset:<null>) (offset:36)
+        #F3 isCompleteDeclaration isOriginVariable isStatic c (nameOffset:<null>) (firstTokenOffset:<null>) (offset:37)
           element: <testLibrary>::@getter::c
-        #F4 isCompleteDeclaration isOriginVariable isStatic d (nameOffset:<null>) (firstTokenOffset:<null>) (offset:41)
+        #F4 isCompleteDeclaration isOriginVariable isStatic d (nameOffset:<null>) (firstTokenOffset:<null>) (offset:42)
           element: <testLibrary>::@getter::d
       setters
-        #F5 isCompleteDeclaration isOriginVariable isStatic c (nameOffset:<null>) (firstTokenOffset:<null>) (offset:36)
+        #F5 isCompleteDeclaration isOriginVariable isStatic c (nameOffset:<null>) (firstTokenOffset:<null>) (offset:37)
           element: <testLibrary>::@setter::c
           formalParameters
-            #F6 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:36)
+            #F6 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:37)
               element: <testLibrary>::@setter::c::@formalParameter::value
-        #F7 isCompleteDeclaration isOriginVariable isStatic d (nameOffset:<null>) (firstTokenOffset:<null>) (offset:41)
+        #F7 isCompleteDeclaration isOriginVariable isStatic d (nameOffset:<null>) (firstTokenOffset:<null>) (offset:42)
           element: <testLibrary>::@setter::d
           formalParameters
-            #F8 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:41)
+            #F8 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:42)
               element: <testLibrary>::@setter::d::@formalParameter::value
   topLevelVariables
     isOriginDeclaration isStatic c
@@ -869,7 +927,8 @@
   }
 
   test_library_imports_syntheticDartCore() async {
-    var library = await buildLibrary('');
+    var library = await buildLibrary(r'''
+''');
     configuration.withSyntheticDartCoreImport = true;
     checkElementText(library, r'''
 library
@@ -986,9 +1045,10 @@
   }
 
   test_metadata_importDirective() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 @a
 import "dart:math";
+
 const a = 0;
 ''');
     checkElementText(library, r'''
@@ -1016,14 +1076,14 @@
                 staticType: null
               element: <testLibrary>::@getter::a
       topLevelVariables
-        #F1 hasImplicitType hasInitializer isConst isOriginDeclaration isStatic a (nameOffset:29) (firstTokenOffset:29) (offset:29)
+        #F1 hasImplicitType hasInitializer isConst isOriginDeclaration isStatic a (nameOffset:30) (firstTokenOffset:30) (offset:30)
           element: <testLibrary>::@topLevelVariable::a
           initializer: expression_0
             IntegerLiteral
-              literal: 0 @33
+              literal: 0 @34
               staticType: int
       getters
-        #F2 isCompleteDeclaration isOriginVariable isStatic a (nameOffset:<null>) (firstTokenOffset:<null>) (offset:29)
+        #F2 isCompleteDeclaration isOriginVariable isStatic a (nameOffset:<null>) (firstTokenOffset:<null>) (offset:30)
           element: <testLibrary>::@getter::a
   topLevelVariables
     hasImplicitType hasInitializer isConst isOriginDeclaration isStatic isTypeInferredFromInitializer a
@@ -1109,11 +1169,16 @@
       return;
     }
 
-    newFile('$testPackageLibPath/a.dart', 'class A {}');
-    newFile('$testPackageLibPath/b.dart', 'export "/a.dart";');
-    var library = await buildLibrary('''
+    newFile('$testPackageLibPath/a.dart', r'''
+class A {}
+''');
+    newFile('$testPackageLibPath/b.dart', r'''
+export "/a.dart";
+''');
+    var library = await buildLibrary(r'''
 import 'a.dart';
 import 'b.dart';
+
 A v = null;
 ''');
     checkElementText(library, r'''
@@ -1126,16 +1191,16 @@
         package:test/a.dart
         package:test/b.dart
       topLevelVariables
-        #F1 hasInitializer isOriginDeclaration isStatic v (nameOffset:36) (firstTokenOffset:36) (offset:36)
+        #F1 hasInitializer isOriginDeclaration isStatic v (nameOffset:37) (firstTokenOffset:37) (offset:37)
           element: <testLibrary>::@topLevelVariable::v
       getters
-        #F2 isCompleteDeclaration isOriginVariable isStatic v (nameOffset:<null>) (firstTokenOffset:<null>) (offset:36)
+        #F2 isCompleteDeclaration isOriginVariable isStatic v (nameOffset:<null>) (firstTokenOffset:<null>) (offset:37)
           element: <testLibrary>::@getter::v
       setters
-        #F3 isCompleteDeclaration isOriginVariable isStatic v (nameOffset:<null>) (firstTokenOffset:<null>) (offset:36)
+        #F3 isCompleteDeclaration isOriginVariable isStatic v (nameOffset:<null>) (firstTokenOffset:<null>) (offset:37)
           element: <testLibrary>::@setter::v
           formalParameters
-            #F4 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:36)
+            #F4 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:37)
               element: <testLibrary>::@setter::v::@formalParameter::value
   topLevelVariables
     hasInitializer isOriginDeclaration isStatic v
@@ -1164,7 +1229,9 @@
   }
 
   test_unresolved_import() async {
-    var library = await buildLibrary("import 'foo.dart';");
+    var library = await buildLibrary(r'''
+import 'foo.dart';
+''');
     var libraryImports = library.firstFragment.libraryImports;
     var importedLibrary = libraryImports[0].importedLibrary!;
     expect(importedLibrary.loadLibraryFunction, isNotNull);
diff --git a/pkg/analyzer/test/src/summary/elements/library_test.dart b/pkg/analyzer/test/src/summary/elements/library_test.dart
index 96366b1..7023e8d 100644
--- a/pkg/analyzer/test/src/summary/elements/library_test.dart
+++ b/pkg/analyzer/test/src/summary/elements/library_test.dart
@@ -22,7 +22,8 @@
  * aaa
  * bbb
  */
-library test;''');
+library test;
+''');
 
     checkElementText(library, r'''
 library
@@ -36,7 +37,8 @@
   }
 
   test_empty() async {
-    var library = await buildLibrary('');
+    var library = await buildLibrary(r'''
+''');
 
     checkElementText(library, r'''
 library
@@ -59,7 +61,8 @@
   }
 
   test_library() async {
-    var library = await buildLibrary('');
+    var library = await buildLibrary(r'''
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -70,7 +73,7 @@
   }
 
   test_library_documented_lines() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 /// aaa
 /// bbb
 library test;
@@ -118,7 +121,7 @@
 
   test_name_withSpaces() async {
     var library = await buildLibrary(r'''
-library foo . bar ;
+library foo.bar;
 ''');
 
     checkElementText(library, r'''
diff --git a/pkg/analyzer/test/src/summary/elements/local_declarations_test.dart b/pkg/analyzer/test/src/summary/elements/local_declarations_test.dart
index 83d7961..ba21090 100644
--- a/pkg/analyzer/test/src/summary/elements/local_declarations_test.dart
+++ b/pkg/analyzer/test/src/summary/elements/local_declarations_test.dart
@@ -152,9 +152,12 @@
     var library = await buildLibrary(r'''
 class C {
   C() {
-    aaa: while (true) {}
-    bbb: switch (42) {
-      ccc: case 0:
+    aaa:
+    while (true) {}
+    bbb:
+    switch (42) {
+      ccc:
+      case 0:
         break;
     }
   }
@@ -189,9 +192,12 @@
     var library = await buildLibrary(r'''
 class C {
   m() {
-    aaa: while (true) {}
-    bbb: switch (42) {
-      ccc: case 0:
+    aaa:
+    while (true) {}
+    bbb:
+    switch (42) {
+      ccc:
+      case 0:
         break;
     }
   }
@@ -232,9 +238,12 @@
   test_localLabels_inTopLevelFunction() async {
     var library = await buildLibrary(r'''
 main() {
-  aaa: while (true) {}
-  bbb: switch (42) {
-    ccc: case 0:
+  aaa:
+  while (true) {}
+  bbb:
+  switch (42) {
+    ccc:
+    case 0:
       break;
   }
 }
diff --git a/pkg/analyzer/test/src/summary/elements/metadata_test.dart b/pkg/analyzer/test/src/summary/elements/metadata_test.dart
index ddc9ad8..9abe7ae 100644
--- a/pkg/analyzer/test/src/summary/elements/metadata_test.dart
+++ b/pkg/analyzer/test/src/summary/elements/metadata_test.dart
@@ -18,9 +18,10 @@
 
 abstract class MetadataElementTest extends ElementsBaseTest {
   test_annotationArgument_recordLiteral() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 @A((2, a: 3))
 class C {}
+
 class A {
   const A(o);
 }
@@ -38,15 +39,15 @@
             #F2 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:20)
               element: <testLibrary>::@class::C::@constructor::new
               typeName: C
-        #F3 class A (nameOffset:31) (firstTokenOffset:25) (offset:31)
+        #F3 class A (nameOffset:32) (firstTokenOffset:26) (offset:32)
           element: <testLibrary>::@class::A
           constructors
-            #F4 isConst isOriginDeclaration new (nameOffset:<null>) (firstTokenOffset:37) (offset:43)
+            #F4 isConst isOriginDeclaration new (nameOffset:<null>) (firstTokenOffset:38) (offset:44)
               element: <testLibrary>::@class::A::@constructor::new
               typeName: A
-              typeNameOffset: 43
+              typeNameOffset: 44
               formalParameters
-                #F5 requiredPositional hasImplicitType isOriginDeclaration o (nameOffset:45) (firstTokenOffset:45) (offset:45)
+                #F5 requiredPositional hasImplicitType isOriginDeclaration o (nameOffset:46) (firstTokenOffset:46) (offset:46)
                   element: <testLibrary>::@class::A::@constructor::new::@formalParameter::o
   classes
     isSimplyBounded class C
@@ -71,9 +72,10 @@
   }
 
   test_annotationArgument_recordLiteral_withConst() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 @A(const ('',))
 class C {}
+
 class A {
   const A(o);
 }
@@ -91,15 +93,15 @@
             #F2 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:22)
               element: <testLibrary>::@class::C::@constructor::new
               typeName: C
-        #F3 class A (nameOffset:33) (firstTokenOffset:27) (offset:33)
+        #F3 class A (nameOffset:34) (firstTokenOffset:28) (offset:34)
           element: <testLibrary>::@class::A
           constructors
-            #F4 isConst isOriginDeclaration new (nameOffset:<null>) (firstTokenOffset:39) (offset:45)
+            #F4 isConst isOriginDeclaration new (nameOffset:<null>) (firstTokenOffset:40) (offset:46)
               element: <testLibrary>::@class::A::@constructor::new
               typeName: A
-              typeNameOffset: 45
+              typeNameOffset: 46
               formalParameters
-                #F5 requiredPositional hasImplicitType isOriginDeclaration o (nameOffset:47) (firstTokenOffset:47) (offset:47)
+                #F5 requiredPositional hasImplicitType isOriginDeclaration o (nameOffset:48) (firstTokenOffset:48) (offset:48)
                   element: <testLibrary>::@class::A::@constructor::new::@formalParameter::o
   classes
     isSimplyBounded class C
@@ -129,8 +131,9 @@
   const A.named();
 }
 ''');
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 import "a.dart" as a;
+
 @a.A.named
 class C {}
 ''');
@@ -146,10 +149,10 @@
         <testLibraryFragment>::@prefix::a
           fragments: @19
       classes
-        #F1 class C (nameOffset:39) (firstTokenOffset:22) (offset:39)
+        #F1 class C (nameOffset:40) (firstTokenOffset:23) (offset:40)
           element: <testLibrary>::@class::C
           constructors
-            #F2 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:39)
+            #F2 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:40)
               element: <testLibrary>::@class::C::@constructor::new
               typeName: C
   classes
@@ -169,8 +172,9 @@
   const A.named();
 }
 ''');
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 import "a.dart";
+
 @A.named
 class C {}
 ''');
@@ -183,10 +187,10 @@
       libraryImports
         package:test/a.dart
       classes
-        #F1 class C (nameOffset:32) (firstTokenOffset:17) (offset:32)
+        #F1 class C (nameOffset:33) (firstTokenOffset:18) (offset:33)
           element: <testLibrary>::@class::C
           constructors
-            #F2 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:32)
+            #F2 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:33)
               element: <testLibrary>::@class::C::@constructor::new
               typeName: C
   classes
@@ -203,6 +207,7 @@
   test_metadata_class_field_first() async {
     var library = await buildLibrary(r'''
 const a = 0;
+
 class C {
   @a
   int x = 0;
@@ -219,31 +224,31 @@
     #F0 <testLibraryFragment>
       element: <testLibrary>
       classes
-        #F1 class C (nameOffset:19) (firstTokenOffset:13) (offset:19)
+        #F1 class C (nameOffset:20) (firstTokenOffset:14) (offset:20)
           element: <testLibrary>::@class::C
           fields
-            #F2 hasInitializer isOriginDeclaration x (nameOffset:34) (firstTokenOffset:34) (offset:34)
+            #F2 hasInitializer isOriginDeclaration x (nameOffset:35) (firstTokenOffset:35) (offset:35)
               element: <testLibrary>::@class::C::@field::x
               metadata
                 Annotation
-                  atSign: @ @25
+                  atSign: @ @26
                   name: SimpleIdentifier
-                    token: a @26
+                    token: a @27
                     element: <testLibrary>::@getter::a
                     staticType: null
                   element: <testLibrary>::@getter::a
           constructors
-            #F3 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:19)
+            #F3 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:20)
               element: <testLibrary>::@class::C::@constructor::new
               typeName: C
           getters
-            #F4 isCompleteDeclaration isOriginVariable x (nameOffset:<null>) (firstTokenOffset:<null>) (offset:34)
+            #F4 isCompleteDeclaration isOriginVariable x (nameOffset:<null>) (firstTokenOffset:<null>) (offset:35)
               element: <testLibrary>::@class::C::@getter::x
           setters
-            #F5 isCompleteDeclaration isOriginVariable x (nameOffset:<null>) (firstTokenOffset:<null>) (offset:34)
+            #F5 isCompleteDeclaration isOriginVariable x (nameOffset:<null>) (firstTokenOffset:<null>) (offset:35)
               element: <testLibrary>::@class::C::@setter::x
               formalParameters
-                #F6 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:34)
+                #F6 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:35)
                   element: <testLibrary>::@class::C::@setter::x::@formalParameter::value
       topLevelVariables
         #F7 hasImplicitType hasInitializer isConst isOriginDeclaration isStatic a (nameOffset:6) (firstTokenOffset:6) (offset:6)
@@ -265,9 +270,9 @@
           firstFragment: #F2
           metadata
             Annotation
-              atSign: @ @25
+              atSign: @ @26
               name: SimpleIdentifier
-                token: a @26
+                token: a @27
                 element: <testLibrary>::@getter::a
                 staticType: null
               element: <testLibrary>::@getter::a
@@ -447,9 +452,11 @@
     var library = await buildLibrary(r'''
 const a = null;
 const b = null;
+
 @a
 @b
-class C {}''');
+class C {}
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -457,10 +464,10 @@
     #F0 <testLibraryFragment>
       element: <testLibrary>
       classes
-        #F1 class C (nameOffset:44) (firstTokenOffset:32) (offset:44)
+        #F1 class C (nameOffset:45) (firstTokenOffset:33) (offset:45)
           element: <testLibrary>::@class::C
           constructors
-            #F2 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:44)
+            #F2 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:45)
               element: <testLibrary>::@class::C::@constructor::new
               typeName: C
       topLevelVariables
@@ -521,9 +528,15 @@
   }
 
   test_metadata_classTypeAlias() async {
-    var library = await buildLibrary(
-      'const a = null; @a class C = D with E; class D {} class E {}',
-    );
+    var library = await buildLibrary(r'''
+const a = null;
+@a
+class C = D with E;
+
+class D {}
+
+class E {}
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -537,16 +550,16 @@
             #F2 isOriginMixinApplication new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:25)
               element: <testLibrary>::@class::C::@constructor::new
               typeName: C
-        #F3 class D (nameOffset:45) (firstTokenOffset:39) (offset:45)
+        #F3 class D (nameOffset:46) (firstTokenOffset:40) (offset:46)
           element: <testLibrary>::@class::D
           constructors
-            #F4 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:45)
+            #F4 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:46)
               element: <testLibrary>::@class::D::@constructor::new
               typeName: D
-        #F5 class E (nameOffset:56) (firstTokenOffset:50) (offset:56)
+        #F5 class E (nameOffset:58) (firstTokenOffset:52) (offset:58)
           element: <testLibrary>::@class::E
           constructors
-            #F6 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:56)
+            #F6 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:58)
               element: <testLibrary>::@class::E::@constructor::new
               typeName: E
       topLevelVariables
@@ -611,10 +624,11 @@
   }
 
   test_metadata_constructor_call_named() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class A {
   const A.named(int _);
 }
+
 @A.named(0)
 class C {}
 ''');
@@ -636,10 +650,10 @@
               formalParameters
                 #F3 requiredPositional isOriginDeclaration _ (nameOffset:30) (firstTokenOffset:26) (offset:30)
                   element: <testLibrary>::@class::A::@constructor::named::@formalParameter::_
-        #F4 class C (nameOffset:54) (firstTokenOffset:36) (offset:54)
+        #F4 class C (nameOffset:55) (firstTokenOffset:37) (offset:55)
           element: <testLibrary>::@class::C
           constructors
-            #F5 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:54)
+            #F5 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:55)
               element: <testLibrary>::@class::C::@constructor::new
               typeName: C
   classes
@@ -665,7 +679,7 @@
   }
 
   test_metadata_constructor_call_named_generic_inference() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class A<T> {
   const A.named(T _);
 }
@@ -726,7 +740,7 @@
   }
 
   test_metadata_constructor_call_named_generic_typeArguments() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class A<T> {
   const A.named();
 }
@@ -780,7 +794,7 @@
   }
 
   test_metadata_constructor_call_named_generic_typeArguments_disabledGenericMetadata() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class A<T> {
   const A.named();
 }
@@ -834,13 +848,14 @@
   }
 
   test_metadata_constructor_call_named_prefixed() async {
-    newFile('$testPackageLibPath/foo.dart', '''
+    newFile('$testPackageLibPath/foo.dart', r'''
 class A {
   const A.named(int _);
 }
 ''');
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 import 'foo.dart' as foo;
+
 @foo.A.named(0)
 class C {}
 ''');
@@ -856,10 +871,10 @@
         <testLibraryFragment>::@prefix::foo
           fragments: @21
       classes
-        #F1 class C (nameOffset:48) (firstTokenOffset:26) (offset:48)
+        #F1 class C (nameOffset:49) (firstTokenOffset:27) (offset:49)
           element: <testLibrary>::@class::C
           constructors
-            #F2 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:48)
+            #F2 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:49)
               element: <testLibrary>::@class::C::@constructor::new
               typeName: C
   classes
@@ -874,13 +889,14 @@
   }
 
   test_metadata_constructor_call_named_prefixed_generic_inference() async {
-    newFile('$testPackageLibPath/foo.dart', '''
+    newFile('$testPackageLibPath/foo.dart', r'''
 class A<T> {
   const A.named(T _);
 }
 ''');
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 import "foo.dart" as foo;
+
 @foo.A.named(0)
 class C {}
 ''');
@@ -896,10 +912,10 @@
         <testLibraryFragment>::@prefix::foo
           fragments: @21
       classes
-        #F1 class C (nameOffset:48) (firstTokenOffset:26) (offset:48)
+        #F1 class C (nameOffset:49) (firstTokenOffset:27) (offset:49)
           element: <testLibrary>::@class::C
           constructors
-            #F2 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:48)
+            #F2 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:49)
               element: <testLibrary>::@class::C::@constructor::new
               typeName: C
   classes
@@ -914,13 +930,14 @@
   }
 
   test_metadata_constructor_call_named_prefixed_generic_typeArguments() async {
-    newFile('$testPackageLibPath/foo.dart', '''
+    newFile('$testPackageLibPath/foo.dart', r'''
 class A<T> {
   const A.named();
 }
 ''');
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 import "foo.dart" as foo;
+
 @foo.A<int>.named()
 class C {}
 ''');
@@ -936,10 +953,10 @@
         <testLibraryFragment>::@prefix::foo
           fragments: @21
       classes
-        #F1 class C (nameOffset:52) (firstTokenOffset:26) (offset:52)
+        #F1 class C (nameOffset:53) (firstTokenOffset:27) (offset:53)
           element: <testLibrary>::@class::C
           constructors
-            #F2 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:52)
+            #F2 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:53)
               element: <testLibrary>::@class::C::@constructor::new
               typeName: C
   classes
@@ -954,7 +971,7 @@
   }
 
   test_metadata_constructor_call_named_synthetic_ofClassAlias_generic() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class A {
   const A.named();
 }
@@ -1050,10 +1067,11 @@
   }
 
   test_metadata_constructor_call_unnamed() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class A {
   const A(int _);
 }
+
 @A(0)
 class C {}
 ''');
@@ -1074,10 +1092,10 @@
               formalParameters
                 #F3 requiredPositional isOriginDeclaration _ (nameOffset:24) (firstTokenOffset:20) (offset:24)
                   element: <testLibrary>::@class::A::@constructor::new::@formalParameter::_
-        #F4 class C (nameOffset:42) (firstTokenOffset:30) (offset:42)
+        #F4 class C (nameOffset:43) (firstTokenOffset:31) (offset:43)
           element: <testLibrary>::@class::C
           constructors
-            #F5 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:42)
+            #F5 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:43)
               element: <testLibrary>::@class::C::@constructor::new
               typeName: C
   classes
@@ -1103,7 +1121,7 @@
   }
 
   test_metadata_constructor_call_unnamed_generic_inference() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class A<T> {
   const A(T _);
 }
@@ -1163,7 +1181,7 @@
   }
 
   test_metadata_constructor_call_unnamed_generic_typeArguments() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class A<T> {
   const A();
 }
@@ -1216,47 +1234,14 @@
   }
 
   test_metadata_constructor_call_unnamed_prefixed() async {
-    newFile('$testPackageLibPath/foo.dart', 'class A { const A(_); }');
-    var library = await buildLibrary(
-      'import "foo.dart" as foo; @foo.A(0) class C {}',
-    );
-    checkElementText(library, r'''
-library
-  reference: <testLibrary>
-  fragments
-    #F0 <testLibraryFragment>
-      element: <testLibrary>
-      libraryImports
-        package:test/foo.dart as foo (nameOffset:21) (firstTokenOffset:<null>) (offset:21)
-      prefixes
-        <testLibraryFragment>::@prefix::foo
-          fragments: @21
-      classes
-        #F1 class C (nameOffset:42) (firstTokenOffset:26) (offset:42)
-          element: <testLibrary>::@class::C
-          constructors
-            #F2 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:42)
-              element: <testLibrary>::@class::C::@constructor::new
-              typeName: C
-  classes
-    isSimplyBounded class C
-      reference: <testLibrary>::@class::C
-      firstFragment: #F1
-      constructors
-        isOriginImplicitDefault new
-          reference: <testLibrary>::@class::C::@constructor::new
-          firstFragment: #F2
-''');
-  }
-
-  test_metadata_constructor_call_unnamed_prefixed_generic_inference() async {
-    newFile('$testPackageLibPath/foo.dart', '''
-class A<T> {
-  const A(T _);
+    newFile('$testPackageLibPath/foo.dart', r'''
+class A {
+  const A(_);
 }
 ''');
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 import "foo.dart" as foo;
+
 @foo.A(0)
 class C {}
 ''');
@@ -1272,10 +1257,51 @@
         <testLibraryFragment>::@prefix::foo
           fragments: @21
       classes
-        #F1 class C (nameOffset:42) (firstTokenOffset:26) (offset:42)
+        #F1 class C (nameOffset:43) (firstTokenOffset:27) (offset:43)
           element: <testLibrary>::@class::C
           constructors
-            #F2 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:42)
+            #F2 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:43)
+              element: <testLibrary>::@class::C::@constructor::new
+              typeName: C
+  classes
+    isSimplyBounded class C
+      reference: <testLibrary>::@class::C
+      firstFragment: #F1
+      constructors
+        isOriginImplicitDefault new
+          reference: <testLibrary>::@class::C::@constructor::new
+          firstFragment: #F2
+''');
+  }
+
+  test_metadata_constructor_call_unnamed_prefixed_generic_inference() async {
+    newFile('$testPackageLibPath/foo.dart', r'''
+class A<T> {
+  const A(T _);
+}
+''');
+    var library = await buildLibrary(r'''
+import "foo.dart" as foo;
+
+@foo.A(0)
+class C {}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  fragments
+    #F0 <testLibraryFragment>
+      element: <testLibrary>
+      libraryImports
+        package:test/foo.dart as foo (nameOffset:21) (firstTokenOffset:<null>) (offset:21)
+      prefixes
+        <testLibraryFragment>::@prefix::foo
+          fragments: @21
+      classes
+        #F1 class C (nameOffset:43) (firstTokenOffset:27) (offset:43)
+          element: <testLibrary>::@class::C
+          constructors
+            #F2 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:43)
               element: <testLibrary>::@class::C::@constructor::new
               typeName: C
   classes
@@ -1290,13 +1316,14 @@
   }
 
   test_metadata_constructor_call_unnamed_prefixed_generic_typeArguments() async {
-    newFile('$testPackageLibPath/foo.dart', '''
+    newFile('$testPackageLibPath/foo.dart', r'''
 class A<T> {
   const A();
 }
 ''');
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 import "foo.dart" as foo;
+
 @foo.A<int>()
 class C {}
 ''');
@@ -1312,10 +1339,10 @@
         <testLibraryFragment>::@prefix::foo
           fragments: @21
       classes
-        #F1 class C (nameOffset:46) (firstTokenOffset:26) (offset:46)
+        #F1 class C (nameOffset:47) (firstTokenOffset:27) (offset:47)
           element: <testLibrary>::@class::C
           constructors
-            #F2 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:46)
+            #F2 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:47)
               element: <testLibrary>::@class::C::@constructor::new
               typeName: C
   classes
@@ -1330,7 +1357,7 @@
   }
 
   test_metadata_constructor_call_unnamed_synthetic_ofClassAlias_generic() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class A {
   const A();
 }
@@ -1420,9 +1447,14 @@
   }
 
   test_metadata_constructor_call_with_args() async {
-    var library = await buildLibrary(
-      'class A { const A(x); } @A(null) class C {}',
-    );
+    var library = await buildLibrary(r'''
+class A {
+  const A(x);
+}
+
+@A(null)
+class C {}
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -1433,17 +1465,17 @@
         #F1 class A (nameOffset:6) (firstTokenOffset:0) (offset:6)
           element: <testLibrary>::@class::A
           constructors
-            #F2 isConst isOriginDeclaration new (nameOffset:<null>) (firstTokenOffset:10) (offset:16)
+            #F2 isConst isOriginDeclaration new (nameOffset:<null>) (firstTokenOffset:12) (offset:18)
               element: <testLibrary>::@class::A::@constructor::new
               typeName: A
-              typeNameOffset: 16
+              typeNameOffset: 18
               formalParameters
-                #F3 requiredPositional hasImplicitType isOriginDeclaration x (nameOffset:18) (firstTokenOffset:18) (offset:18)
+                #F3 requiredPositional hasImplicitType isOriginDeclaration x (nameOffset:20) (firstTokenOffset:20) (offset:20)
                   element: <testLibrary>::@class::A::@constructor::new::@formalParameter::x
-        #F4 class C (nameOffset:39) (firstTokenOffset:24) (offset:39)
+        #F4 class C (nameOffset:42) (firstTokenOffset:27) (offset:42)
           element: <testLibrary>::@class::C
           constructors
-            #F5 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:39)
+            #F5 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:42)
               element: <testLibrary>::@class::C::@constructor::new
               typeName: C
   classes
@@ -1477,6 +1509,7 @@
 
     var library = await buildLibrary(r'''
 import 'a.dart';
+
 @A(value: 42)
 void f() {}
 ''');
@@ -1489,25 +1522,25 @@
       libraryImports
         package:test/a.dart
       functions
-        #F1 isCompleteDeclaration isOriginDeclaration isStatic f (nameOffset:36) (firstTokenOffset:17) (offset:36)
+        #F1 isCompleteDeclaration isOriginDeclaration isStatic f (nameOffset:37) (firstTokenOffset:18) (offset:37)
           element: <testLibrary>::@function::f
           metadata
             Annotation
-              atSign: @ @17
+              atSign: @ @18
               name: SimpleIdentifier
-                token: A @18
+                token: A @19
                 element: package:test/a.dart::@class::A
                 staticType: null
               arguments: ArgumentList
-                leftParenthesis: ( @19
+                leftParenthesis: ( @20
                 arguments
                   NamedArgument
-                    name: value @20
-                    colon: : @25
+                    name: value @21
+                    colon: : @26
                     argumentExpression: IntegerLiteral
-                      literal: 42 @27
+                      literal: 42 @28
                       staticType: int
-                rightParenthesis: ) @29
+                rightParenthesis: ) @30
               element: package:test/a.dart::@class::A::@constructor::new
   functions
     isOriginDeclaration isStatic f
@@ -1515,30 +1548,35 @@
       firstFragment: #F1
       metadata
         Annotation
-          atSign: @ @17
+          atSign: @ @18
           name: SimpleIdentifier
-            token: A @18
+            token: A @19
             element: package:test/a.dart::@class::A
             staticType: null
           arguments: ArgumentList
-            leftParenthesis: ( @19
+            leftParenthesis: ( @20
             arguments
               NamedArgument
-                name: value @20
-                colon: : @25
+                name: value @21
+                colon: : @26
                 argumentExpression: IntegerLiteral
-                  literal: 42 @27
+                  literal: 42 @28
                   staticType: int
-            rightParenthesis: ) @29
+            rightParenthesis: ) @30
           element: package:test/a.dart::@class::A::@constructor::new
       returnType: void
 ''');
   }
 
   test_metadata_constructorDeclaration_named() async {
-    var library = await buildLibrary(
-      'const a = null; class C { @a C.named(); }',
-    );
+    var library = await buildLibrary(r'''
+const a = null;
+
+class C {
+  @a
+  C.named();
+}
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -1546,22 +1584,22 @@
     #F0 <testLibraryFragment>
       element: <testLibrary>
       classes
-        #F1 class C (nameOffset:22) (firstTokenOffset:16) (offset:22)
+        #F1 class C (nameOffset:23) (firstTokenOffset:17) (offset:23)
           element: <testLibrary>::@class::C
           constructors
-            #F2 isOriginDeclaration named (nameOffset:31) (firstTokenOffset:26) (offset:31)
+            #F2 isOriginDeclaration named (nameOffset:36) (firstTokenOffset:29) (offset:36)
               element: <testLibrary>::@class::C::@constructor::named
               metadata
                 Annotation
-                  atSign: @ @26
+                  atSign: @ @29
                   name: SimpleIdentifier
-                    token: a @27
+                    token: a @30
                     element: <testLibrary>::@getter::a
                     staticType: null
                   element: <testLibrary>::@getter::a
               typeName: C
-              typeNameOffset: 29
-              periodOffset: 30
+              typeNameOffset: 34
+              periodOffset: 35
       topLevelVariables
         #F3 hasImplicitType hasInitializer isConst isOriginDeclaration isStatic a (nameOffset:6) (firstTokenOffset:6) (offset:6)
           element: <testLibrary>::@topLevelVariable::a
@@ -1582,9 +1620,9 @@
           firstFragment: #F2
           metadata
             Annotation
-              atSign: @ @26
+              atSign: @ @29
               name: SimpleIdentifier
-                token: a @27
+                token: a @30
                 element: <testLibrary>::@getter::a
                 staticType: null
               element: <testLibrary>::@getter::a
@@ -1607,7 +1645,14 @@
   }
 
   test_metadata_constructorDeclaration_unnamed() async {
-    var library = await buildLibrary('const a = null; class C { @a C(); }');
+    var library = await buildLibrary(r'''
+const a = null;
+
+class C {
+  @a
+  C();
+}
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -1615,21 +1660,21 @@
     #F0 <testLibraryFragment>
       element: <testLibrary>
       classes
-        #F1 class C (nameOffset:22) (firstTokenOffset:16) (offset:22)
+        #F1 class C (nameOffset:23) (firstTokenOffset:17) (offset:23)
           element: <testLibrary>::@class::C
           constructors
-            #F2 isOriginDeclaration new (nameOffset:<null>) (firstTokenOffset:26) (offset:29)
+            #F2 isOriginDeclaration new (nameOffset:<null>) (firstTokenOffset:29) (offset:34)
               element: <testLibrary>::@class::C::@constructor::new
               metadata
                 Annotation
-                  atSign: @ @26
+                  atSign: @ @29
                   name: SimpleIdentifier
-                    token: a @27
+                    token: a @30
                     element: <testLibrary>::@getter::a
                     staticType: null
                   element: <testLibrary>::@getter::a
               typeName: C
-              typeNameOffset: 29
+              typeNameOffset: 34
       topLevelVariables
         #F3 hasImplicitType hasInitializer isConst isOriginDeclaration isStatic a (nameOffset:6) (firstTokenOffset:6) (offset:6)
           element: <testLibrary>::@topLevelVariable::a
@@ -1650,9 +1695,9 @@
           firstFragment: #F2
           metadata
             Annotation
-              atSign: @ @26
+              atSign: @ @29
               name: SimpleIdentifier
-                token: a @27
+                token: a @30
                 element: <testLibrary>::@getter::a
                 staticType: null
               element: <testLibrary>::@getter::a
@@ -1675,11 +1720,13 @@
   }
 
   test_metadata_exportDirective() async {
-    newFile('$testPackageLibPath/foo.dart', '');
+    newFile('$testPackageLibPath/foo.dart', r'''
+''');
 
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 @a
 export 'foo.dart';
+
 const a = 0;
 ''');
 
@@ -1708,14 +1755,14 @@
                 staticType: null
               element: <testLibrary>::@getter::a
       topLevelVariables
-        #F1 hasImplicitType hasInitializer isConst isOriginDeclaration isStatic a (nameOffset:28) (firstTokenOffset:28) (offset:28)
+        #F1 hasImplicitType hasInitializer isConst isOriginDeclaration isStatic a (nameOffset:29) (firstTokenOffset:29) (offset:29)
           element: <testLibrary>::@topLevelVariable::a
           initializer: expression_0
             IntegerLiteral
-              literal: 0 @32
+              literal: 0 @33
               staticType: int
       getters
-        #F2 isCompleteDeclaration isOriginVariable isStatic a (nameOffset:<null>) (firstTokenOffset:<null>) (offset:28)
+        #F2 isCompleteDeclaration isOriginVariable isStatic a (nameOffset:<null>) (firstTokenOffset:<null>) (offset:29)
           element: <testLibrary>::@getter::a
   topLevelVariables
     hasImplicitType hasInitializer isConst isOriginDeclaration isStatic isTypeInferredFromInitializer a
@@ -1736,7 +1783,14 @@
   }
 
   test_metadata_fieldDeclaration() async {
-    var library = await buildLibrary('const a = null; class C { @a int x; }');
+    var library = await buildLibrary(r'''
+const a = null;
+
+class C {
+  @a
+  int x;
+}
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -1744,31 +1798,31 @@
     #F0 <testLibraryFragment>
       element: <testLibrary>
       classes
-        #F1 class C (nameOffset:22) (firstTokenOffset:16) (offset:22)
+        #F1 class C (nameOffset:23) (firstTokenOffset:17) (offset:23)
           element: <testLibrary>::@class::C
           fields
-            #F2 isOriginDeclaration x (nameOffset:33) (firstTokenOffset:33) (offset:33)
+            #F2 isOriginDeclaration x (nameOffset:38) (firstTokenOffset:38) (offset:38)
               element: <testLibrary>::@class::C::@field::x
               metadata
                 Annotation
-                  atSign: @ @26
+                  atSign: @ @29
                   name: SimpleIdentifier
-                    token: a @27
+                    token: a @30
                     element: <testLibrary>::@getter::a
                     staticType: null
                   element: <testLibrary>::@getter::a
           constructors
-            #F3 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:22)
+            #F3 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:23)
               element: <testLibrary>::@class::C::@constructor::new
               typeName: C
           getters
-            #F4 isCompleteDeclaration isOriginVariable x (nameOffset:<null>) (firstTokenOffset:<null>) (offset:33)
+            #F4 isCompleteDeclaration isOriginVariable x (nameOffset:<null>) (firstTokenOffset:<null>) (offset:38)
               element: <testLibrary>::@class::C::@getter::x
           setters
-            #F5 isCompleteDeclaration isOriginVariable x (nameOffset:<null>) (firstTokenOffset:<null>) (offset:33)
+            #F5 isCompleteDeclaration isOriginVariable x (nameOffset:<null>) (firstTokenOffset:<null>) (offset:38)
               element: <testLibrary>::@class::C::@setter::x
               formalParameters
-                #F6 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:33)
+                #F6 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:38)
                   element: <testLibrary>::@class::C::@setter::x::@formalParameter::value
       topLevelVariables
         #F7 hasImplicitType hasInitializer isConst isOriginDeclaration isStatic a (nameOffset:6) (firstTokenOffset:6) (offset:6)
@@ -1790,9 +1844,9 @@
           firstFragment: #F2
           metadata
             Annotation
-              atSign: @ @26
+              atSign: @ @29
               name: SimpleIdentifier
-                token: a @27
+                token: a @30
                 element: <testLibrary>::@getter::a
                 staticType: null
               element: <testLibrary>::@getter::a
@@ -1838,8 +1892,9 @@
   }
 
   test_metadata_fieldFormalParameter() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 const a = null;
+
 class C {
   var x;
   C(@a this.x);
@@ -1852,35 +1907,35 @@
     #F0 <testLibraryFragment>
       element: <testLibrary>
       classes
-        #F1 class C (nameOffset:22) (firstTokenOffset:16) (offset:22)
+        #F1 class C (nameOffset:23) (firstTokenOffset:17) (offset:23)
           element: <testLibrary>::@class::C
           fields
-            #F2 hasImplicitType isOriginDeclaration x (nameOffset:32) (firstTokenOffset:32) (offset:32)
+            #F2 hasImplicitType isOriginDeclaration x (nameOffset:33) (firstTokenOffset:33) (offset:33)
               element: <testLibrary>::@class::C::@field::x
           constructors
-            #F3 isCompleteDeclaration isOriginDeclaration new (nameOffset:<null>) (firstTokenOffset:37) (offset:37)
+            #F3 isCompleteDeclaration isOriginDeclaration new (nameOffset:<null>) (firstTokenOffset:38) (offset:38)
               element: <testLibrary>::@class::C::@constructor::new
               typeName: C
-              typeNameOffset: 37
+              typeNameOffset: 38
               formalParameters
-                #F4 requiredPositional hasImplicitType isFinal isOriginDeclaration this.x (nameOffset:47) (firstTokenOffset:39) (offset:47)
+                #F4 requiredPositional hasImplicitType isFinal isOriginDeclaration this.x (nameOffset:48) (firstTokenOffset:40) (offset:48)
                   element: <testLibrary>::@class::C::@constructor::new::@formalParameter::x
                   metadata
                     Annotation
-                      atSign: @ @39
+                      atSign: @ @40
                       name: SimpleIdentifier
-                        token: a @40
+                        token: a @41
                         element: <testLibrary>::@getter::a
                         staticType: null
                       element: <testLibrary>::@getter::a
           getters
-            #F5 isCompleteDeclaration isOriginVariable x (nameOffset:<null>) (firstTokenOffset:<null>) (offset:32)
+            #F5 isCompleteDeclaration isOriginVariable x (nameOffset:<null>) (firstTokenOffset:<null>) (offset:33)
               element: <testLibrary>::@class::C::@getter::x
           setters
-            #F6 isCompleteDeclaration isOriginVariable x (nameOffset:<null>) (firstTokenOffset:<null>) (offset:32)
+            #F6 isCompleteDeclaration isOriginVariable x (nameOffset:<null>) (firstTokenOffset:<null>) (offset:33)
               element: <testLibrary>::@class::C::@setter::x
               formalParameters
-                #F7 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:32)
+                #F7 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:33)
                   element: <testLibrary>::@class::C::@setter::x::@formalParameter::value
       topLevelVariables
         #F8 hasImplicitType hasInitializer isConst isOriginDeclaration isStatic a (nameOffset:6) (firstTokenOffset:6) (offset:6)
@@ -1913,9 +1968,9 @@
               type: dynamic
               metadata
                 Annotation
-                  atSign: @ @39
+                  atSign: @ @40
                   name: SimpleIdentifier
-                    token: a @40
+                    token: a @41
                     element: <testLibrary>::@getter::a
                     staticType: null
                   element: <testLibrary>::@getter::a
@@ -1955,9 +2010,14 @@
   }
 
   test_metadata_fieldFormalParameter_withDefault() async {
-    var library = await buildLibrary(
-      'const a = null; class C { var x; C([@a this.x = null]); }',
-    );
+    var library = await buildLibrary(r'''
+const a = null;
+
+class C {
+  var x;
+  C([@a this.x = null]);
+}
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -1965,39 +2025,39 @@
     #F0 <testLibraryFragment>
       element: <testLibrary>
       classes
-        #F1 class C (nameOffset:22) (firstTokenOffset:16) (offset:22)
+        #F1 class C (nameOffset:23) (firstTokenOffset:17) (offset:23)
           element: <testLibrary>::@class::C
           fields
-            #F2 hasImplicitType isOriginDeclaration x (nameOffset:30) (firstTokenOffset:30) (offset:30)
+            #F2 hasImplicitType isOriginDeclaration x (nameOffset:33) (firstTokenOffset:33) (offset:33)
               element: <testLibrary>::@class::C::@field::x
           constructors
-            #F3 isCompleteDeclaration isOriginDeclaration new (nameOffset:<null>) (firstTokenOffset:33) (offset:33)
+            #F3 isCompleteDeclaration isOriginDeclaration new (nameOffset:<null>) (firstTokenOffset:38) (offset:38)
               element: <testLibrary>::@class::C::@constructor::new
               typeName: C
-              typeNameOffset: 33
+              typeNameOffset: 38
               formalParameters
-                #F4 optionalPositional hasImplicitType isFinal isOriginDeclaration this.x (nameOffset:44) (firstTokenOffset:36) (offset:44)
+                #F4 optionalPositional hasImplicitType isFinal isOriginDeclaration this.x (nameOffset:49) (firstTokenOffset:41) (offset:49)
                   element: <testLibrary>::@class::C::@constructor::new::@formalParameter::x
                   metadata
                     Annotation
-                      atSign: @ @36
+                      atSign: @ @41
                       name: SimpleIdentifier
-                        token: a @37
+                        token: a @42
                         element: <testLibrary>::@getter::a
                         staticType: null
                       element: <testLibrary>::@getter::a
                   initializer: expression_0
                     NullLiteral
-                      literal: null @48
+                      literal: null @53
                       staticType: Null
           getters
-            #F5 isCompleteDeclaration isOriginVariable x (nameOffset:<null>) (firstTokenOffset:<null>) (offset:30)
+            #F5 isCompleteDeclaration isOriginVariable x (nameOffset:<null>) (firstTokenOffset:<null>) (offset:33)
               element: <testLibrary>::@class::C::@getter::x
           setters
-            #F6 isCompleteDeclaration isOriginVariable x (nameOffset:<null>) (firstTokenOffset:<null>) (offset:30)
+            #F6 isCompleteDeclaration isOriginVariable x (nameOffset:<null>) (firstTokenOffset:<null>) (offset:33)
               element: <testLibrary>::@class::C::@setter::x
               formalParameters
-                #F7 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:30)
+                #F7 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:33)
                   element: <testLibrary>::@class::C::@setter::x::@formalParameter::value
       topLevelVariables
         #F8 hasImplicitType hasInitializer isConst isOriginDeclaration isStatic a (nameOffset:6) (firstTokenOffset:6) (offset:6)
@@ -2030,9 +2090,9 @@
               type: dynamic
               metadata
                 Annotation
-                  atSign: @ @36
+                  atSign: @ @41
                   name: SimpleIdentifier
-                    token: a @37
+                    token: a @42
                     element: <testLibrary>::@getter::a
                     staticType: null
                   element: <testLibrary>::@getter::a
@@ -2075,7 +2135,7 @@
   }
 
   test_metadata_functionDeclaration_function() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 const a = null;
 @a
 f() {}
@@ -2139,7 +2199,11 @@
   }
 
   test_metadata_functionDeclaration_getter() async {
-    var library = await buildLibrary('const a = null; @a get f => null;');
+    var library = await buildLibrary(r'''
+const a = null;
+@a
+get f => null;
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -2205,7 +2269,11 @@
   }
 
   test_metadata_functionDeclaration_setter() async {
-    var library = await buildLibrary('const a = null; @a set f(value) {}');
+    var library = await buildLibrary(r'''
+const a = null;
+@a
+set f(value) {}
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -2280,7 +2348,11 @@
   }
 
   test_metadata_functionTypeAlias() async {
-    var library = await buildLibrary('const a = null; @a typedef F();');
+    var library = await buildLibrary(r'''
+const a = null;
+@a
+typedef F();
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -2340,7 +2412,10 @@
   }
 
   test_metadata_functionTypedFormalParameter() async {
-    var library = await buildLibrary('const a = null; f(@a g()) {}');
+    var library = await buildLibrary(r'''
+const a = null;
+f(@a g()) {}
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -2407,7 +2482,10 @@
   }
 
   test_metadata_functionTypedFormalParameter_withDefault() async {
-    var library = await buildLibrary('const a = null; f([@a g() = null]) {}');
+    var library = await buildLibrary(r'''
+const a = null;
+f([@a g() = null]) {}
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -2486,7 +2564,8 @@
 const b = null;
 @a
 @b
-typedef F = void Function();''');
+typedef F = void Function();
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -2581,11 +2660,13 @@
   }
 
   test_metadata_importDirective() async {
-    newFile('$testPackageLibPath/foo.dart', '');
+    newFile('$testPackageLibPath/foo.dart', r'''
+''');
 
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 @a
 import 'foo.dart';
+
 const a = 0;
 ''');
 
@@ -2614,14 +2695,14 @@
                 staticType: null
               element: <testLibrary>::@getter::a
       topLevelVariables
-        #F1 hasImplicitType hasInitializer isConst isOriginDeclaration isStatic a (nameOffset:28) (firstTokenOffset:28) (offset:28)
+        #F1 hasImplicitType hasInitializer isConst isOriginDeclaration isStatic a (nameOffset:29) (firstTokenOffset:29) (offset:29)
           element: <testLibrary>::@topLevelVariable::a
           initializer: expression_0
             IntegerLiteral
-              literal: 0 @32
+              literal: 0 @33
               staticType: int
       getters
-        #F2 isCompleteDeclaration isOriginVariable isStatic a (nameOffset:<null>) (firstTokenOffset:<null>) (offset:28)
+        #F2 isCompleteDeclaration isOriginVariable isStatic a (nameOffset:<null>) (firstTokenOffset:<null>) (offset:29)
           element: <testLibrary>::@getter::a
   topLevelVariables
     hasImplicitType hasInitializer isConst isOriginDeclaration isStatic isTypeInferredFromInitializer a
@@ -2642,7 +2723,7 @@
   }
 
   test_metadata_inAliasedElement_formalParameter() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 const a = 42;
 typedef F = void Function(@a int first)
 ''');
@@ -2689,7 +2770,7 @@
   }
 
   test_metadata_inAliasedElement_formalParameter2() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 const a = 42;
 typedef F = void Function(int foo(@a int bar))
 ''');
@@ -2736,7 +2817,7 @@
   }
 
   test_metadata_inAliasedElement_typeParameter() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 const a = 42;
 typedef F = void Function<@a T>(int first)
 ''');
@@ -2783,7 +2864,12 @@
   }
 
   test_metadata_invalid_classDeclaration() async {
-    var library = await buildLibrary('f(_) {} @f(42) class C {}');
+    var library = await buildLibrary(r'''
+f(_) {}
+
+@f(42)
+class C {}
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -2791,10 +2877,10 @@
     #F0 <testLibraryFragment>
       element: <testLibrary>
       classes
-        #F1 class C (nameOffset:21) (firstTokenOffset:8) (offset:21)
+        #F1 class C (nameOffset:22) (firstTokenOffset:9) (offset:22)
           element: <testLibrary>::@class::C
           constructors
-            #F2 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:21)
+            #F2 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:22)
               element: <testLibrary>::@class::C::@constructor::new
               typeName: C
       functions
@@ -2827,7 +2913,7 @@
     newFile('$testPackageLibPath/a.dart', r'''
 part of 'test.dart';
 ''');
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 @deprecated
 part 'a.dart';
 ''');
@@ -2868,7 +2954,7 @@
 
   /// Even though the target is not a part, metadata is available.
   test_metadata_library_part_notPart() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 @deprecated
 part 'dart:math';
 ''');
@@ -2902,7 +2988,12 @@
   }
 
   test_metadata_libraryDirective() async {
-    var library = await buildLibrary('@a library L; const a = null;');
+    var library = await buildLibrary(r'''
+@a
+library L;
+
+const a = null;
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -2919,14 +3010,14 @@
     #F0 <testLibraryFragment> (nameOffset:<null>) (firstTokenOffset:0) (offset:11)
       element: <testLibrary>
       topLevelVariables
-        #F1 hasImplicitType hasInitializer isConst isOriginDeclaration isStatic a (nameOffset:20) (firstTokenOffset:20) (offset:20)
+        #F1 hasImplicitType hasInitializer isConst isOriginDeclaration isStatic a (nameOffset:21) (firstTokenOffset:21) (offset:21)
           element: <testLibrary>::@topLevelVariable::a
           initializer: expression_0
             NullLiteral
-              literal: null @24
+              literal: null @25
               staticType: Null
       getters
-        #F2 isCompleteDeclaration isOriginVariable isStatic a (nameOffset:<null>) (firstTokenOffset:<null>) (offset:20)
+        #F2 isCompleteDeclaration isOriginVariable isStatic a (nameOffset:<null>) (firstTokenOffset:<null>) (offset:21)
           element: <testLibrary>::@getter::a
   topLevelVariables
     hasImplicitType hasInitializer isConst isOriginDeclaration isStatic isTypeInferredFromInitializer a
@@ -2947,9 +3038,14 @@
   }
 
   test_metadata_methodDeclaration_getter() async {
-    var library = await buildLibrary(
-      'const a = null; class C { @a get m => null; }',
-    );
+    var library = await buildLibrary(r'''
+const a = null;
+
+class C {
+  @a
+  get m => null;
+}
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -2957,23 +3053,23 @@
     #F0 <testLibraryFragment>
       element: <testLibrary>
       classes
-        #F1 class C (nameOffset:22) (firstTokenOffset:16) (offset:22)
+        #F1 class C (nameOffset:23) (firstTokenOffset:17) (offset:23)
           element: <testLibrary>::@class::C
           fields
-            #F2 isOriginGetterSetter m (nameOffset:<null>) (firstTokenOffset:<null>) (offset:22)
+            #F2 isOriginGetterSetter m (nameOffset:<null>) (firstTokenOffset:<null>) (offset:23)
               element: <testLibrary>::@class::C::@field::m
           constructors
-            #F3 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:22)
+            #F3 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:23)
               element: <testLibrary>::@class::C::@constructor::new
               typeName: C
           getters
-            #F4 hasImplicitReturnType isCompleteDeclaration isOriginDeclaration m (nameOffset:33) (firstTokenOffset:26) (offset:33)
+            #F4 hasImplicitReturnType isCompleteDeclaration isOriginDeclaration m (nameOffset:38) (firstTokenOffset:29) (offset:38)
               element: <testLibrary>::@class::C::@getter::m
               metadata
                 Annotation
-                  atSign: @ @26
+                  atSign: @ @29
                   name: SimpleIdentifier
-                    token: a @27
+                    token: a @30
                     element: <testLibrary>::@getter::a
                     staticType: null
                   element: <testLibrary>::@getter::a
@@ -3007,9 +3103,9 @@
           firstFragment: #F4
           metadata
             Annotation
-              atSign: @ @26
+              atSign: @ @29
               name: SimpleIdentifier
-                token: a @27
+                token: a @30
                 element: <testLibrary>::@getter::a
                 staticType: null
               element: <testLibrary>::@getter::a
@@ -3037,6 +3133,7 @@
     var library = await buildLibrary(r'''
 const a = null;
 const b = null;
+
 class C {
   @a
   @b
@@ -3050,27 +3147,27 @@
     #F0 <testLibraryFragment>
       element: <testLibrary>
       classes
-        #F1 class C (nameOffset:38) (firstTokenOffset:32) (offset:38)
+        #F1 class C (nameOffset:39) (firstTokenOffset:33) (offset:39)
           element: <testLibrary>::@class::C
           constructors
-            #F2 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:38)
+            #F2 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:39)
               element: <testLibrary>::@class::C::@constructor::new
               typeName: C
           methods
-            #F3 hasImplicitReturnType isCompleteDeclaration isOriginDeclaration m (nameOffset:54) (firstTokenOffset:44) (offset:54)
+            #F3 hasImplicitReturnType isCompleteDeclaration isOriginDeclaration m (nameOffset:55) (firstTokenOffset:45) (offset:55)
               element: <testLibrary>::@class::C::@method::m
               metadata
                 Annotation
-                  atSign: @ @44
+                  atSign: @ @45
                   name: SimpleIdentifier
-                    token: a @45
+                    token: a @46
                     element: <testLibrary>::@getter::a
                     staticType: null
                   element: <testLibrary>::@getter::a
                 Annotation
-                  atSign: @ @49
+                  atSign: @ @50
                   name: SimpleIdentifier
-                    token: b @50
+                    token: b @51
                     element: <testLibrary>::@getter::b
                     staticType: null
                   element: <testLibrary>::@getter::b
@@ -3106,16 +3203,16 @@
           firstFragment: #F3
           metadata
             Annotation
-              atSign: @ @44
+              atSign: @ @45
               name: SimpleIdentifier
-                token: a @45
+                token: a @46
                 element: <testLibrary>::@getter::a
                 staticType: null
               element: <testLibrary>::@getter::a
             Annotation
-              atSign: @ @49
+              atSign: @ @50
               name: SimpleIdentifier
-                token: b @50
+                token: b @51
                 element: <testLibrary>::@getter::b
                 staticType: null
               element: <testLibrary>::@getter::b
@@ -3155,6 +3252,7 @@
     var library = await buildLibrary(r'''
 const a = null;
 const b = null;
+
 mixin M {
   @a
   @b
@@ -3168,23 +3266,23 @@
     #F0 <testLibraryFragment>
       element: <testLibrary>
       mixins
-        #F1 mixin M (nameOffset:38) (firstTokenOffset:32) (offset:38)
+        #F1 mixin M (nameOffset:39) (firstTokenOffset:33) (offset:39)
           element: <testLibrary>::@mixin::M
           methods
-            #F2 hasImplicitReturnType isCompleteDeclaration isOriginDeclaration m (nameOffset:54) (firstTokenOffset:44) (offset:54)
+            #F2 hasImplicitReturnType isCompleteDeclaration isOriginDeclaration m (nameOffset:55) (firstTokenOffset:45) (offset:55)
               element: <testLibrary>::@mixin::M::@method::m
               metadata
                 Annotation
-                  atSign: @ @44
+                  atSign: @ @45
                   name: SimpleIdentifier
-                    token: a @45
+                    token: a @46
                     element: <testLibrary>::@getter::a
                     staticType: null
                   element: <testLibrary>::@getter::a
                 Annotation
-                  atSign: @ @49
+                  atSign: @ @50
                   name: SimpleIdentifier
-                    token: b @50
+                    token: b @51
                     element: <testLibrary>::@getter::b
                     staticType: null
                   element: <testLibrary>::@getter::b
@@ -3218,16 +3316,16 @@
           firstFragment: #F2
           metadata
             Annotation
-              atSign: @ @44
+              atSign: @ @45
               name: SimpleIdentifier
-                token: a @45
+                token: a @46
                 element: <testLibrary>::@getter::a
                 staticType: null
               element: <testLibrary>::@getter::a
             Annotation
-              atSign: @ @49
+              atSign: @ @50
               name: SimpleIdentifier
-                token: b @50
+                token: b @51
                 element: <testLibrary>::@getter::b
                 staticType: null
               element: <testLibrary>::@getter::b
@@ -3264,8 +3362,9 @@
   }
 
   test_metadata_methodDeclaration_setter() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 const a = null;
+
 class C {
   @a
   set m(value) {}
@@ -3278,28 +3377,28 @@
     #F0 <testLibraryFragment>
       element: <testLibrary>
       classes
-        #F1 class C (nameOffset:22) (firstTokenOffset:16) (offset:22)
+        #F1 class C (nameOffset:23) (firstTokenOffset:17) (offset:23)
           element: <testLibrary>::@class::C
           fields
-            #F2 isOriginGetterSetter m (nameOffset:<null>) (firstTokenOffset:<null>) (offset:22)
+            #F2 isOriginGetterSetter m (nameOffset:<null>) (firstTokenOffset:<null>) (offset:23)
               element: <testLibrary>::@class::C::@field::m
           constructors
-            #F3 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:22)
+            #F3 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:23)
               element: <testLibrary>::@class::C::@constructor::new
               typeName: C
           setters
-            #F4 hasImplicitReturnType isCompleteDeclaration isOriginDeclaration m (nameOffset:37) (firstTokenOffset:28) (offset:37)
+            #F4 hasImplicitReturnType isCompleteDeclaration isOriginDeclaration m (nameOffset:38) (firstTokenOffset:29) (offset:38)
               element: <testLibrary>::@class::C::@setter::m
               metadata
                 Annotation
-                  atSign: @ @28
+                  atSign: @ @29
                   name: SimpleIdentifier
-                    token: a @29
+                    token: a @30
                     element: <testLibrary>::@getter::a
                     staticType: null
                   element: <testLibrary>::@getter::a
               formalParameters
-                #F5 requiredPositional hasImplicitType isOriginDeclaration value (nameOffset:39) (firstTokenOffset:39) (offset:39)
+                #F5 requiredPositional hasImplicitType isOriginDeclaration value (nameOffset:40) (firstTokenOffset:40) (offset:40)
                   element: <testLibrary>::@class::C::@setter::m::@formalParameter::value
       topLevelVariables
         #F6 hasImplicitType hasInitializer isConst isOriginDeclaration isStatic a (nameOffset:6) (firstTokenOffset:6) (offset:6)
@@ -3331,9 +3430,9 @@
           firstFragment: #F4
           metadata
             Annotation
-              atSign: @ @28
+              atSign: @ @29
               name: SimpleIdentifier
-                token: a @29
+                token: a @30
                 element: <testLibrary>::@getter::a
                 staticType: null
               element: <testLibrary>::@getter::a
@@ -3490,9 +3589,11 @@
     var library = await buildLibrary(r'''
 const a = null;
 const b = null;
+
 @a
 @b
-mixin M {}''');
+mixin M {}
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -3500,7 +3601,7 @@
     #F0 <testLibraryFragment>
       element: <testLibrary>
       mixins
-        #F1 mixin M (nameOffset:44) (firstTokenOffset:32) (offset:44)
+        #F1 mixin M (nameOffset:45) (firstTokenOffset:33) (offset:45)
           element: <testLibrary>::@mixin::M
       topLevelVariables
         #F2 hasImplicitType hasInitializer isConst isOriginDeclaration isStatic a (nameOffset:6) (firstTokenOffset:6) (offset:6)
@@ -4072,6 +4173,7 @@
 const foo = 0;
 
 class A {}
+
 mixin M {}
 
 @foo
@@ -4090,25 +4192,25 @@
             #F2 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:22)
               element: <testLibrary>::@class::A::@constructor::new
               typeName: A
-        #F3 isMixinApplication class B (nameOffset:50) (firstTokenOffset:39) (offset:50)
+        #F3 isMixinApplication class B (nameOffset:51) (firstTokenOffset:40) (offset:51)
           element: <testLibrary>::@class::B
           typeParameters
-            #F4 T (nameOffset:57) (firstTokenOffset:52) (offset:57)
+            #F4 T (nameOffset:58) (firstTokenOffset:53) (offset:58)
               element: #E0 T
               metadata
                 Annotation
-                  atSign: @ @52
+                  atSign: @ @53
                   name: SimpleIdentifier
-                    token: foo @53
+                    token: foo @54
                     element: <testLibrary>::@getter::foo
                     staticType: null
                   element: <testLibrary>::@getter::foo
           constructors
-            #F5 isOriginMixinApplication new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:50)
+            #F5 isOriginMixinApplication new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:51)
               element: <testLibrary>::@class::B::@constructor::new
               typeName: B
       mixins
-        #F6 mixin M (nameOffset:33) (firstTokenOffset:27) (offset:33)
+        #F6 mixin M (nameOffset:34) (firstTokenOffset:28) (offset:34)
           element: <testLibrary>::@mixin::M
       topLevelVariables
         #F7 hasImplicitType hasInitializer isConst isOriginDeclaration isStatic foo (nameOffset:6) (firstTokenOffset:6) (offset:6)
@@ -4136,9 +4238,9 @@
           firstFragment: #F4
           metadata
             Annotation
-              atSign: @ @52
+              atSign: @ @53
               name: SimpleIdentifier
-                token: foo @53
+                token: foo @54
                 element: <testLibrary>::@getter::foo
                 staticType: null
               element: <testLibrary>::@getter::foo
@@ -4187,9 +4289,11 @@
 
 @foo
 enum E {
-  @foo e1,
+  @foo
+  e1,
   e2,
-  @foo e3,
+  @foo
+  e3,
 }
 ''');
     checkElementText(library, r'''
@@ -4202,7 +4306,7 @@
         #F1 enum E (nameOffset:26) (firstTokenOffset:16) (offset:26)
           element: <testLibrary>::@enum::E
           fields
-            #F2 hasImplicitType hasInitializer isConst isEnumConstant isOriginDeclaration isStatic e1 (nameOffset:37) (firstTokenOffset:32) (offset:37)
+            #F2 hasImplicitType hasInitializer isConst isEnumConstant isOriginDeclaration isStatic e1 (nameOffset:39) (firstTokenOffset:32) (offset:39)
               element: <testLibrary>::@enum::E::@field::e1
               metadata
                 Annotation
@@ -4224,7 +4328,7 @@
                     leftParenthesis: ( @0
                     rightParenthesis: ) @0
                   staticType: E
-            #F3 hasImplicitType hasInitializer isConst isEnumConstant isOriginDeclaration isStatic e2 (nameOffset:43) (firstTokenOffset:43) (offset:43)
+            #F3 hasImplicitType hasInitializer isConst isEnumConstant isOriginDeclaration isStatic e2 (nameOffset:45) (firstTokenOffset:45) (offset:45)
               element: <testLibrary>::@enum::E::@field::e2
               initializer: expression_1
                 InstanceCreationExpression
@@ -4238,13 +4342,13 @@
                     leftParenthesis: ( @0
                     rightParenthesis: ) @0
                   staticType: E
-            #F4 hasImplicitType hasInitializer isConst isEnumConstant isOriginDeclaration isStatic e3 (nameOffset:54) (firstTokenOffset:49) (offset:54)
+            #F4 hasImplicitType hasInitializer isConst isEnumConstant isOriginDeclaration isStatic e3 (nameOffset:58) (firstTokenOffset:51) (offset:58)
               element: <testLibrary>::@enum::E::@field::e3
               metadata
                 Annotation
-                  atSign: @ @49
+                  atSign: @ @51
                   name: SimpleIdentifier
-                    token: foo @50
+                    token: foo @52
                     element: <testLibrary>::@getter::foo
                     staticType: null
                   element: <testLibrary>::@getter::foo
@@ -4285,11 +4389,11 @@
               element: <testLibrary>::@enum::E::@constructor::new
               typeName: E
           getters
-            #F7 isCompleteDeclaration isOriginVariable isStatic e1 (nameOffset:<null>) (firstTokenOffset:<null>) (offset:37)
+            #F7 isCompleteDeclaration isOriginVariable isStatic e1 (nameOffset:<null>) (firstTokenOffset:<null>) (offset:39)
               element: <testLibrary>::@enum::E::@getter::e1
-            #F8 isCompleteDeclaration isOriginVariable isStatic e2 (nameOffset:<null>) (firstTokenOffset:<null>) (offset:43)
+            #F8 isCompleteDeclaration isOriginVariable isStatic e2 (nameOffset:<null>) (firstTokenOffset:<null>) (offset:45)
               element: <testLibrary>::@enum::E::@getter::e2
-            #F9 isCompleteDeclaration isOriginVariable isStatic e3 (nameOffset:<null>) (firstTokenOffset:<null>) (offset:54)
+            #F9 isCompleteDeclaration isOriginVariable isStatic e3 (nameOffset:<null>) (firstTokenOffset:<null>) (offset:58)
               element: <testLibrary>::@enum::E::@getter::e3
             #F10 isCompleteDeclaration isOriginVariable isStatic values (nameOffset:<null>) (firstTokenOffset:<null>) (offset:26)
               element: <testLibrary>::@enum::E::@getter::values
@@ -4338,9 +4442,9 @@
           firstFragment: #F4
           metadata
             Annotation
-              atSign: @ @49
+              atSign: @ @51
               name: SimpleIdentifier
-                token: foo @50
+                token: foo @52
                 element: <testLibrary>::@getter::foo
                 staticType: null
               element: <testLibrary>::@getter::foo
@@ -4671,7 +4775,7 @@
   }
 
   test_metadata_offsets_onLibrary() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 /// Some documentation.
 @foo
 library my.lib;
@@ -4969,15 +5073,15 @@
   }
 
   test_metadata_offsets_onUnit() async {
-    newFile('$testPackageLibPath/a.dart', '''
+    newFile('$testPackageLibPath/a.dart', r'''
 part of my.lib;
 ''');
 
-    newFile('$testPackageLibPath/b.dart', '''
+    newFile('$testPackageLibPath/b.dart', r'''
 part of my.lib;
 ''');
 
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 library my.lib;
 
 @foo
@@ -5475,9 +5579,10 @@
 part of 'test.dart';
 ''');
 
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 @a
 part 'foo.dart';
+
 const a = 0;
 ''');
 
@@ -5510,14 +5615,14 @@
               element: <testLibrary>::@getter::a
           unit: #F1
       topLevelVariables
-        #F2 hasImplicitType hasInitializer isConst isOriginDeclaration isStatic a (nameOffset:26) (firstTokenOffset:26) (offset:26)
+        #F2 hasImplicitType hasInitializer isConst isOriginDeclaration isStatic a (nameOffset:27) (firstTokenOffset:27) (offset:27)
           element: <testLibrary>::@topLevelVariable::a
           initializer: expression_0
             IntegerLiteral
-              literal: 0 @30
+              literal: 0 @31
               staticType: int
       getters
-        #F3 isCompleteDeclaration isOriginVariable isStatic a (nameOffset:<null>) (firstTokenOffset:<null>) (offset:26)
+        #F3 isCompleteDeclaration isOriginVariable isStatic a (nameOffset:<null>) (firstTokenOffset:<null>) (offset:27)
           element: <testLibrary>::@getter::a
     #F1 package:test/foo.dart
       element: <testLibrary>
@@ -5542,12 +5647,17 @@
   }
 
   test_metadata_partDirective2() async {
-    newFile('$testPackageLibPath/foo.dart', 'part of L;');
-    var library = await buildLibrary('''
+    newFile('$testPackageLibPath/foo.dart', r'''
+part of L;
+''');
+    var library = await buildLibrary(r'''
 library L;
+
 @a
 part 'foo.dart';
-const a = null;''');
+
+const a = null;
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -5559,25 +5669,25 @@
       parts
         part_0
           uri: package:test/foo.dart
-          partKeywordOffset: 14
+          partKeywordOffset: 15
           metadata
             Annotation
-              atSign: @ @11
+              atSign: @ @12
               name: SimpleIdentifier
-                token: a @12
+                token: a @13
                 element: <testLibrary>::@getter::a
                 staticType: null
               element: <testLibrary>::@getter::a
           unit: #F1
       topLevelVariables
-        #F2 hasImplicitType hasInitializer isConst isOriginDeclaration isStatic a (nameOffset:37) (firstTokenOffset:37) (offset:37)
+        #F2 hasImplicitType hasInitializer isConst isOriginDeclaration isStatic a (nameOffset:39) (firstTokenOffset:39) (offset:39)
           element: <testLibrary>::@topLevelVariable::a
           initializer: expression_0
             NullLiteral
-              literal: null @41
+              literal: null @43
               staticType: Null
       getters
-        #F3 isCompleteDeclaration isOriginVariable isStatic a (nameOffset:<null>) (firstTokenOffset:<null>) (offset:37)
+        #F3 isCompleteDeclaration isOriginVariable isStatic a (nameOffset:<null>) (firstTokenOffset:<null>) (offset:39)
           element: <testLibrary>::@getter::a
     #F1 package:test/foo.dart
       element: <testLibrary>
@@ -5608,7 +5718,7 @@
     newFile('$testPackageLibPath/b.dart', r'''
 part of 'test.dart';
 ''');
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 part 'a.dart';
 part 'b.dart';
 ''');
@@ -5624,7 +5734,7 @@
 @deprecated
 class A {}
 ''');
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 part 'a.dart';
 ''');
     checkElementText(library, r'''
@@ -5667,7 +5777,7 @@
 @deprecated
 export 'dart:math';
 ''');
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 part 'a.dart';
 ''');
     checkElementText(library, r'''
@@ -5705,7 +5815,7 @@
 @deprecated
 import 'dart:math';
 ''');
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 part 'a.dart';
 ''');
     checkElementText(library, r'''
@@ -5748,7 +5858,7 @@
 part 'a.dart';
 ''');
 
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 part 'b.dart';
 ''');
 
@@ -5790,8 +5900,15 @@
   }
 
   test_metadata_prefixed_variable() async {
-    newFile('$testPackageLibPath/a.dart', 'const b = null;');
-    var library = await buildLibrary('import "a.dart" as a; @a.b class C {}');
+    newFile('$testPackageLibPath/a.dart', r'''
+const b = null;
+''');
+    var library = await buildLibrary(r'''
+import "a.dart" as a;
+
+@a.b
+class C {}
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -5804,10 +5921,10 @@
         <testLibraryFragment>::@prefix::a
           fragments: @19
       classes
-        #F1 class C (nameOffset:33) (firstTokenOffset:22) (offset:33)
+        #F1 class C (nameOffset:34) (firstTokenOffset:23) (offset:34)
           element: <testLibrary>::@class::C
           constructors
-            #F2 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:33)
+            #F2 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:34)
               element: <testLibrary>::@class::C::@constructor::new
               typeName: C
   classes
@@ -5822,7 +5939,10 @@
   }
 
   test_metadata_simpleFormalParameter() async {
-    var library = await buildLibrary('const a = null; f(@a x) {}');
+    var library = await buildLibrary(r'''
+const a = null;
+f(@a x) {}
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -5889,7 +6009,7 @@
   }
 
   test_metadata_simpleFormalParameter_method() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 const a = null;
 
 class C {
@@ -5977,7 +6097,7 @@
   }
 
   test_metadata_simpleFormalParameter_unit_setter() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 const a = null;
 
 set foo(@a int x) {}
@@ -6056,7 +6176,10 @@
   }
 
   test_metadata_simpleFormalParameter_withDefault() async {
-    var library = await buildLibrary('const a = null; f([@a x = null]) {}');
+    var library = await buildLibrary(r'''
+const a = null;
+f([@a x = null]) {}
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -6130,7 +6253,7 @@
   }
 
   test_metadata_superFormalParameter() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 const a = null;
 
 class A {
@@ -6239,7 +6362,11 @@
   }
 
   test_metadata_topLevelVariableDeclaration() async {
-    var library = await buildLibrary('const a = null; @a int v;');
+    var library = await buildLibrary(r'''
+const a = null;
+@a
+int v;
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -6322,7 +6449,11 @@
   }
 
   test_metadata_typeParameter_ofClass() async {
-    var library = await buildLibrary('const a = null; class C<@a T> {}');
+    var library = await buildLibrary(r'''
+const a = null;
+
+class C<@a T> {}
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -6330,21 +6461,21 @@
     #F0 <testLibraryFragment>
       element: <testLibrary>
       classes
-        #F1 class C (nameOffset:22) (firstTokenOffset:16) (offset:22)
+        #F1 class C (nameOffset:23) (firstTokenOffset:17) (offset:23)
           element: <testLibrary>::@class::C
           typeParameters
-            #F2 T (nameOffset:27) (firstTokenOffset:24) (offset:27)
+            #F2 T (nameOffset:28) (firstTokenOffset:25) (offset:28)
               element: #E0 T
               metadata
                 Annotation
-                  atSign: @ @24
+                  atSign: @ @25
                   name: SimpleIdentifier
-                    token: a @25
+                    token: a @26
                     element: <testLibrary>::@getter::a
                     staticType: null
                   element: <testLibrary>::@getter::a
           constructors
-            #F3 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:22)
+            #F3 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:23)
               element: <testLibrary>::@class::C::@constructor::new
               typeName: C
       topLevelVariables
@@ -6366,9 +6497,9 @@
           firstFragment: #F2
           metadata
             Annotation
-              atSign: @ @24
+              atSign: @ @25
               name: SimpleIdentifier
-                token: a @25
+                token: a @26
                 element: <testLibrary>::@getter::a
                 staticType: null
               element: <testLibrary>::@getter::a
@@ -6395,11 +6526,14 @@
   }
 
   test_metadata_typeParameter_ofClassTypeAlias() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 const a = null;
 class C<@a T> = D with E;
+
 class D {}
-class E {}''');
+
+class E {}
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -6424,16 +6558,16 @@
             #F3 isOriginMixinApplication new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:22)
               element: <testLibrary>::@class::C::@constructor::new
               typeName: C
-        #F4 class D (nameOffset:48) (firstTokenOffset:42) (offset:48)
+        #F4 class D (nameOffset:49) (firstTokenOffset:43) (offset:49)
           element: <testLibrary>::@class::D
           constructors
-            #F5 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:48)
+            #F5 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:49)
               element: <testLibrary>::@class::D::@constructor::new
               typeName: D
-        #F6 class E (nameOffset:59) (firstTokenOffset:53) (offset:59)
+        #F6 class E (nameOffset:61) (firstTokenOffset:55) (offset:61)
           element: <testLibrary>::@class::E
           constructors
-            #F7 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:59)
+            #F7 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:61)
               element: <testLibrary>::@class::E::@constructor::new
               typeName: E
       topLevelVariables
@@ -6509,7 +6643,10 @@
   }
 
   test_metadata_typeParameter_ofFunction() async {
-    var library = await buildLibrary('const a = null; f<@a T>() {}');
+    var library = await buildLibrary(r'''
+const a = null;
+f<@a T>() {}
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -6575,7 +6712,10 @@
   }
 
   test_metadata_typeParameter_ofTypedef() async {
-    var library = await buildLibrary('const a = null; typedef F<@a T>();');
+    var library = await buildLibrary(r'''
+const a = null;
+typedef F<@a T>();
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -6732,10 +6872,11 @@
   }
 
   test_metadata_value_class_staticField() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class A {
   static const x = 0;
 }
+
 @A.x
 class C {}
 ''');
@@ -6762,10 +6903,10 @@
           getters
             #F4 isCompleteDeclaration isOriginVariable isStatic x (nameOffset:<null>) (firstTokenOffset:<null>) (offset:25)
               element: <testLibrary>::@class::A::@getter::x
-        #F5 class C (nameOffset:45) (firstTokenOffset:34) (offset:45)
+        #F5 class C (nameOffset:46) (firstTokenOffset:35) (offset:46)
           element: <testLibrary>::@class::C
           constructors
-            #F6 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:45)
+            #F6 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:46)
               element: <testLibrary>::@class::C::@constructor::new
               typeName: C
   classes
@@ -6802,8 +6943,9 @@
   }
 
   test_metadata_value_enum_constant() async {
-    var library = await buildLibrary('''
-enum E {a, b, c}
+    var library = await buildLibrary(r'''
+enum E { a, b, c }
+
 @E.b
 class C {}
 ''');
@@ -6814,17 +6956,17 @@
     #F0 <testLibraryFragment>
       element: <testLibrary>
       classes
-        #F1 class C (nameOffset:28) (firstTokenOffset:17) (offset:28)
+        #F1 class C (nameOffset:31) (firstTokenOffset:20) (offset:31)
           element: <testLibrary>::@class::C
           constructors
-            #F2 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:28)
+            #F2 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:31)
               element: <testLibrary>::@class::C::@constructor::new
               typeName: C
       enums
         #F3 enum E (nameOffset:5) (firstTokenOffset:0) (offset:5)
           element: <testLibrary>::@enum::E
           fields
-            #F4 hasImplicitType hasInitializer isConst isEnumConstant isOriginDeclaration isStatic a (nameOffset:8) (firstTokenOffset:8) (offset:8)
+            #F4 hasImplicitType hasInitializer isConst isEnumConstant isOriginDeclaration isStatic a (nameOffset:9) (firstTokenOffset:9) (offset:9)
               element: <testLibrary>::@enum::E::@field::a
               initializer: expression_0
                 InstanceCreationExpression
@@ -6838,7 +6980,7 @@
                     leftParenthesis: ( @0
                     rightParenthesis: ) @0
                   staticType: E
-            #F5 hasImplicitType hasInitializer isConst isEnumConstant isOriginDeclaration isStatic b (nameOffset:11) (firstTokenOffset:11) (offset:11)
+            #F5 hasImplicitType hasInitializer isConst isEnumConstant isOriginDeclaration isStatic b (nameOffset:12) (firstTokenOffset:12) (offset:12)
               element: <testLibrary>::@enum::E::@field::b
               initializer: expression_1
                 InstanceCreationExpression
@@ -6852,7 +6994,7 @@
                     leftParenthesis: ( @0
                     rightParenthesis: ) @0
                   staticType: E
-            #F6 hasImplicitType hasInitializer isConst isEnumConstant isOriginDeclaration isStatic c (nameOffset:14) (firstTokenOffset:14) (offset:14)
+            #F6 hasImplicitType hasInitializer isConst isEnumConstant isOriginDeclaration isStatic c (nameOffset:15) (firstTokenOffset:15) (offset:15)
               element: <testLibrary>::@enum::E::@field::c
               initializer: expression_2
                 InstanceCreationExpression
@@ -6891,11 +7033,11 @@
               element: <testLibrary>::@enum::E::@constructor::new
               typeName: E
           getters
-            #F9 isCompleteDeclaration isOriginVariable isStatic a (nameOffset:<null>) (firstTokenOffset:<null>) (offset:8)
+            #F9 isCompleteDeclaration isOriginVariable isStatic a (nameOffset:<null>) (firstTokenOffset:<null>) (offset:9)
               element: <testLibrary>::@enum::E::@getter::a
-            #F10 isCompleteDeclaration isOriginVariable isStatic b (nameOffset:<null>) (firstTokenOffset:<null>) (offset:11)
+            #F10 isCompleteDeclaration isOriginVariable isStatic b (nameOffset:<null>) (firstTokenOffset:<null>) (offset:12)
               element: <testLibrary>::@enum::E::@getter::b
-            #F11 isCompleteDeclaration isOriginVariable isStatic c (nameOffset:<null>) (firstTokenOffset:<null>) (offset:14)
+            #F11 isCompleteDeclaration isOriginVariable isStatic c (nameOffset:<null>) (firstTokenOffset:<null>) (offset:15)
               element: <testLibrary>::@enum::E::@getter::c
             #F12 isCompleteDeclaration isOriginVariable isStatic values (nameOffset:<null>) (firstTokenOffset:<null>) (offset:5)
               element: <testLibrary>::@enum::E::@getter::values
@@ -6975,10 +7117,11 @@
   }
 
   test_metadata_value_extension_staticField() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 extension E on int {
   static const x = 0;
 }
+
 @E.x
 class C {}
 ''');
@@ -6989,10 +7132,10 @@
     #F0 <testLibraryFragment>
       element: <testLibrary>
       classes
-        #F1 class C (nameOffset:56) (firstTokenOffset:45) (offset:56)
+        #F1 class C (nameOffset:57) (firstTokenOffset:46) (offset:57)
           element: <testLibrary>::@class::C
           constructors
-            #F2 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:56)
+            #F2 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:57)
               element: <testLibrary>::@class::C::@constructor::new
               typeName: C
       extensions
@@ -7041,7 +7184,7 @@
   }
 
   test_metadata_value_extension_staticField_unnamed() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 extension on Object {
   @foo
   static const foo = 0;
@@ -7107,13 +7250,14 @@
   }
 
   test_metadata_value_prefix_extension_staticField() async {
-    newFile('$testPackageLibPath/foo.dart', '''
+    newFile('$testPackageLibPath/foo.dart', r'''
 extension E on int {
   static const x = 0;
 }
 ''');
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 import 'foo.dart' as foo;
+
 @foo.E.x
 class C {}
 ''');
@@ -7129,10 +7273,10 @@
         <testLibraryFragment>::@prefix::foo
           fragments: @21
       classes
-        #F1 class C (nameOffset:41) (firstTokenOffset:26) (offset:41)
+        #F1 class C (nameOffset:42) (firstTokenOffset:27) (offset:42)
           element: <testLibrary>::@class::C
           constructors
-            #F2 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:41)
+            #F2 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:42)
               element: <testLibrary>::@class::C::@constructor::new
               typeName: C
   classes
@@ -7147,7 +7291,7 @@
   }
 
   test_unresolved_annotation_instanceCreation_argument_super() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class A {
   const A(_);
 }
@@ -7201,7 +7345,7 @@
   }
 
   test_unresolved_annotation_instanceCreation_argument_this() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class A {
   const A(_);
 }
@@ -7255,7 +7399,10 @@
   }
 
   test_unresolved_annotation_namedConstructorCall_noClass() async {
-    var library = await buildLibrary('@foo.bar() class C {}');
+    var library = await buildLibrary(r'''
+@foo.bar()
+class C {}
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -7281,7 +7428,10 @@
   }
 
   test_unresolved_annotation_namedConstructorCall_noConstructor() async {
-    var library = await buildLibrary('@String.foo() class C {}');
+    var library = await buildLibrary(r'''
+@String.foo()
+class C {}
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -7307,7 +7457,10 @@
   }
 
   test_unresolved_annotation_prefixedIdentifier_badPrefix() async {
-    var library = await buildLibrary('@foo.bar class C {}');
+    var library = await buildLibrary(r'''
+@foo.bar
+class C {}
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -7333,9 +7486,12 @@
   }
 
   test_unresolved_annotation_prefixedIdentifier_noDeclaration() async {
-    var library = await buildLibrary(
-      'import "dart:async" as foo; @foo.bar class C {}',
-    );
+    var library = await buildLibrary(r'''
+import "dart:async" as foo;
+
+@foo.bar
+class C {}
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -7348,10 +7504,10 @@
         <testLibraryFragment>::@prefix::foo
           fragments: @23
       classes
-        #F1 class C (nameOffset:43) (firstTokenOffset:28) (offset:43)
+        #F1 class C (nameOffset:44) (firstTokenOffset:29) (offset:44)
           element: <testLibrary>::@class::C
           constructors
-            #F2 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:43)
+            #F2 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:44)
               element: <testLibrary>::@class::C::@constructor::new
               typeName: C
   classes
@@ -7366,7 +7522,10 @@
   }
 
   test_unresolved_annotation_prefixedNamedConstructorCall_badPrefix() async {
-    var library = await buildLibrary('@foo.bar.baz() class C {}');
+    var library = await buildLibrary(r'''
+@foo.bar.baz()
+class C {}
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -7392,9 +7551,12 @@
   }
 
   test_unresolved_annotation_prefixedNamedConstructorCall_noClass() async {
-    var library = await buildLibrary(
-      'import "dart:async" as foo; @foo.bar.baz() class C {}',
-    );
+    var library = await buildLibrary(r'''
+import "dart:async" as foo;
+
+@foo.bar.baz()
+class C {}
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -7407,10 +7569,10 @@
         <testLibraryFragment>::@prefix::foo
           fragments: @23
       classes
-        #F1 class C (nameOffset:49) (firstTokenOffset:28) (offset:49)
+        #F1 class C (nameOffset:50) (firstTokenOffset:29) (offset:50)
           element: <testLibrary>::@class::C
           constructors
-            #F2 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:49)
+            #F2 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:50)
               element: <testLibrary>::@class::C::@constructor::new
               typeName: C
   classes
@@ -7425,9 +7587,12 @@
   }
 
   test_unresolved_annotation_prefixedNamedConstructorCall_noConstructor() async {
-    var library = await buildLibrary(
-      'import "dart:async" as foo; @foo.Future.bar() class C {}',
-    );
+    var library = await buildLibrary(r'''
+import "dart:async" as foo;
+
+@foo.Future.bar()
+class C {}
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -7440,10 +7605,10 @@
         <testLibraryFragment>::@prefix::foo
           fragments: @23
       classes
-        #F1 class C (nameOffset:52) (firstTokenOffset:28) (offset:52)
+        #F1 class C (nameOffset:53) (firstTokenOffset:29) (offset:53)
           element: <testLibrary>::@class::C
           constructors
-            #F2 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:52)
+            #F2 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:53)
               element: <testLibrary>::@class::C::@constructor::new
               typeName: C
   classes
@@ -7458,7 +7623,10 @@
   }
 
   test_unresolved_annotation_prefixedUnnamedConstructorCall_badPrefix() async {
-    var library = await buildLibrary('@foo.bar() class C {}');
+    var library = await buildLibrary(r'''
+@foo.bar()
+class C {}
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -7484,9 +7652,12 @@
   }
 
   test_unresolved_annotation_prefixedUnnamedConstructorCall_noClass() async {
-    var library = await buildLibrary(
-      'import "dart:async" as foo; @foo.bar() class C {}',
-    );
+    var library = await buildLibrary(r'''
+import "dart:async" as foo;
+
+@foo.bar()
+class C {}
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -7499,10 +7670,10 @@
         <testLibraryFragment>::@prefix::foo
           fragments: @23
       classes
-        #F1 class C (nameOffset:45) (firstTokenOffset:28) (offset:45)
+        #F1 class C (nameOffset:46) (firstTokenOffset:29) (offset:46)
           element: <testLibrary>::@class::C
           constructors
-            #F2 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:45)
+            #F2 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:46)
               element: <testLibrary>::@class::C::@constructor::new
               typeName: C
   classes
@@ -7517,7 +7688,10 @@
   }
 
   test_unresolved_annotation_simpleIdentifier() async {
-    var library = await buildLibrary('@foo class C {}');
+    var library = await buildLibrary(r'''
+@foo
+class C {}
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -7545,9 +7719,13 @@
   test_unresolved_annotation_simpleIdentifier_multiplyDefined() async {
     if (!keepLinkingLibraries) return;
 
-    newFile('$testPackageLibPath/a.dart', 'const v = 0;');
-    newFile('$testPackageLibPath/b.dart', 'const v = 0;');
-    var library = await buildLibrary('''
+    newFile('$testPackageLibPath/a.dart', r'''
+const v = 0;
+''');
+    newFile('$testPackageLibPath/b.dart', r'''
+const v = 0;
+''');
+    var library = await buildLibrary(r'''
 import 'a.dart';
 import 'b.dart';
 
@@ -7582,7 +7760,10 @@
   }
 
   test_unresolved_annotation_unnamedConstructorCall_noClass() async {
-    var library = await buildLibrary('@foo() class C {}');
+    var library = await buildLibrary(r'''
+@foo()
+class C {}
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
diff --git a/pkg/analyzer/test/src/summary/elements/mixin_test.dart b/pkg/analyzer/test/src/summary/elements/mixin_test.dart
index e7de8f3..caaa9ee 100644
--- a/pkg/analyzer/test/src/summary/elements/mixin_test.dart
+++ b/pkg/analyzer/test/src/summary/elements/mixin_test.dart
@@ -696,7 +696,7 @@
   }
 
   test_field_inferredType() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 mixin M {
   var x = 0;
 }
@@ -755,10 +755,11 @@
   }
 
   test_field_inferredType_final() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 mixin M {
   final x = 0;
-}''');
+}
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -2895,6 +2896,7 @@
   test_method_namedAsConstraint() async {
     var library = await buildLibrary(r'''
 class A {}
+
 mixin B on A {
   void A() {}
 }
@@ -2913,10 +2915,10 @@
               element: <testLibrary>::@class::A::@constructor::new
               typeName: A
       mixins
-        #F3 mixin B (nameOffset:17) (firstTokenOffset:11) (offset:17)
+        #F3 mixin B (nameOffset:18) (firstTokenOffset:12) (offset:18)
           element: <testLibrary>::@mixin::B
           methods
-            #F4 isCompleteDeclaration isOriginDeclaration A (nameOffset:33) (firstTokenOffset:28) (offset:33)
+            #F4 isCompleteDeclaration isOriginDeclaration A (nameOffset:34) (firstTokenOffset:29) (offset:34)
               element: <testLibrary>::@mixin::B::@method::A
   classes
     isSimplyBounded class A
@@ -2941,7 +2943,7 @@
   }
 
   test_method_ofGeneric_refEnclosingTypeParameter_false() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 mixin M<T> {
   void foo() {}
 }
@@ -2980,7 +2982,7 @@
   }
 
   test_method_ofGeneric_refEnclosingTypeParameter_true() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 mixin M<T> {
   void foo(T _) {}
 }
@@ -3028,8 +3030,11 @@
   test_mixin() async {
     var library = await buildLibrary(r'''
 class A {}
+
 class B {}
+
 class C {}
+
 class D {}
 
 mixin M<T extends num, U> on A, B implements C, D {
@@ -3052,60 +3057,60 @@
             #F2 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:6)
               element: <testLibrary>::@class::A::@constructor::new
               typeName: A
-        #F3 class B (nameOffset:17) (firstTokenOffset:11) (offset:17)
+        #F3 class B (nameOffset:18) (firstTokenOffset:12) (offset:18)
           element: <testLibrary>::@class::B
           constructors
-            #F4 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:17)
+            #F4 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:18)
               element: <testLibrary>::@class::B::@constructor::new
               typeName: B
-        #F5 class C (nameOffset:28) (firstTokenOffset:22) (offset:28)
+        #F5 class C (nameOffset:30) (firstTokenOffset:24) (offset:30)
           element: <testLibrary>::@class::C
           constructors
-            #F6 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:28)
+            #F6 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:30)
               element: <testLibrary>::@class::C::@constructor::new
               typeName: C
-        #F7 class D (nameOffset:39) (firstTokenOffset:33) (offset:39)
+        #F7 class D (nameOffset:42) (firstTokenOffset:36) (offset:42)
           element: <testLibrary>::@class::D
           constructors
-            #F8 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:39)
+            #F8 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:42)
               element: <testLibrary>::@class::D::@constructor::new
               typeName: D
       mixins
-        #F9 mixin M (nameOffset:51) (firstTokenOffset:45) (offset:51)
+        #F9 mixin M (nameOffset:54) (firstTokenOffset:48) (offset:54)
           element: <testLibrary>::@mixin::M
           typeParameters
-            #F10 T (nameOffset:53) (firstTokenOffset:53) (offset:53)
+            #F10 T (nameOffset:56) (firstTokenOffset:56) (offset:56)
               element: #E0 T
-            #F11 U (nameOffset:68) (firstTokenOffset:68) (offset:68)
+            #F11 U (nameOffset:71) (firstTokenOffset:71) (offset:71)
               element: #E1 U
           fields
-            #F12 isOriginDeclaration f (nameOffset:101) (firstTokenOffset:101) (offset:101)
+            #F12 isOriginDeclaration f (nameOffset:104) (firstTokenOffset:104) (offset:104)
               element: <testLibrary>::@mixin::M::@field::f
-            #F13 isOriginGetterSetter g (nameOffset:<null>) (firstTokenOffset:<null>) (offset:51)
+            #F13 isOriginGetterSetter g (nameOffset:<null>) (firstTokenOffset:<null>) (offset:54)
               element: <testLibrary>::@mixin::M::@field::g
-            #F14 isOriginGetterSetter s (nameOffset:<null>) (firstTokenOffset:<null>) (offset:51)
+            #F14 isOriginGetterSetter s (nameOffset:<null>) (firstTokenOffset:<null>) (offset:54)
               element: <testLibrary>::@mixin::M::@field::s
           getters
-            #F15 isCompleteDeclaration isOriginVariable f (nameOffset:<null>) (firstTokenOffset:<null>) (offset:101)
+            #F15 isCompleteDeclaration isOriginVariable f (nameOffset:<null>) (firstTokenOffset:<null>) (offset:104)
               element: <testLibrary>::@mixin::M::@getter::f
-            #F16 isCompleteDeclaration isOriginDeclaration g (nameOffset:112) (firstTokenOffset:106) (offset:112)
+            #F16 isCompleteDeclaration isOriginDeclaration g (nameOffset:115) (firstTokenOffset:109) (offset:115)
               element: <testLibrary>::@mixin::M::@getter::g
           setters
-            #F17 isCompleteDeclaration isOriginVariable f (nameOffset:<null>) (firstTokenOffset:<null>) (offset:101)
+            #F17 isCompleteDeclaration isOriginVariable f (nameOffset:<null>) (firstTokenOffset:<null>) (offset:104)
               element: <testLibrary>::@mixin::M::@setter::f
               formalParameters
-                #F18 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:101)
+                #F18 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:104)
                   element: <testLibrary>::@mixin::M::@setter::f::@formalParameter::value
-            #F19 hasImplicitReturnType isCompleteDeclaration isOriginDeclaration s (nameOffset:126) (firstTokenOffset:122) (offset:126)
+            #F19 hasImplicitReturnType isCompleteDeclaration isOriginDeclaration s (nameOffset:129) (firstTokenOffset:125) (offset:129)
               element: <testLibrary>::@mixin::M::@setter::s
               formalParameters
-                #F20 requiredPositional isOriginDeclaration v (nameOffset:132) (firstTokenOffset:128) (offset:132)
+                #F20 requiredPositional isOriginDeclaration v (nameOffset:135) (firstTokenOffset:131) (offset:135)
                   element: <testLibrary>::@mixin::M::@setter::s::@formalParameter::v
           methods
-            #F21 isCompleteDeclaration isOriginDeclaration m (nameOffset:144) (firstTokenOffset:140) (offset:144)
+            #F21 isCompleteDeclaration isOriginDeclaration m (nameOffset:147) (firstTokenOffset:143) (offset:147)
               element: <testLibrary>::@mixin::M::@method::m
               formalParameters
-                #F22 requiredPositional isOriginDeclaration v (nameOffset:153) (firstTokenOffset:146) (offset:153)
+                #F22 requiredPositional isOriginDeclaration v (nameOffset:156) (firstTokenOffset:149) (offset:156)
                   element: <testLibrary>::@mixin::M::@method::m::@formalParameter::v
   classes
     isSimplyBounded class A
@@ -3214,6 +3219,7 @@
   test_mixin_allSupertypes() async {
     var library = await buildLibrary(r'''
 mixin M {}
+
 class A with M {}
 ''');
 
@@ -3227,7 +3233,7 @@
     #F0 <testLibraryFragment>
       element: <testLibrary>
       classes
-        #F1 class A (nameOffset:17) (firstTokenOffset:11) (offset:17)
+        #F1 class A (nameOffset:18) (firstTokenOffset:12) (offset:18)
           element: <testLibrary>::@class::A
       mixins
         #F2 mixin M (nameOffset:6) (firstTokenOffset:0) (offset:6)
@@ -3256,9 +3262,11 @@
   test_mixin_allSupertypes_generic() async {
     var library = await buildLibrary(r'''
 class A<T, U> {}
+
 class B<T> extends A<int, T> {}
 
 mixin M1 on A<int, double> {}
+
 mixin M2 on B<String> {}
 ''');
 
@@ -3279,15 +3287,15 @@
               element: #E0 T
             #F3 U (nameOffset:11) (firstTokenOffset:11) (offset:11)
               element: #E1 U
-        #F4 hasExtendsClause class B (nameOffset:23) (firstTokenOffset:17) (offset:23)
+        #F4 hasExtendsClause class B (nameOffset:24) (firstTokenOffset:18) (offset:24)
           element: <testLibrary>::@class::B
           typeParameters
-            #F5 T (nameOffset:25) (firstTokenOffset:25) (offset:25)
+            #F5 T (nameOffset:26) (firstTokenOffset:26) (offset:26)
               element: #E2 T
       mixins
-        #F6 mixin M1 (nameOffset:56) (firstTokenOffset:50) (offset:56)
+        #F6 mixin M1 (nameOffset:57) (firstTokenOffset:51) (offset:57)
           element: <testLibrary>::@mixin::M1
-        #F7 mixin M2 (nameOffset:86) (firstTokenOffset:80) (offset:86)
+        #F7 mixin M2 (nameOffset:88) (firstTokenOffset:82) (offset:88)
           element: <testLibrary>::@mixin::M2
   classes
     isSimplyBounded class A
@@ -3334,7 +3342,9 @@
   test_mixin_allSupertypes_hasInterfaces() async {
     var library = await buildLibrary(r'''
 class A {}
+
 class B {}
+
 class C {}
 
 mixin M on A implements B, C {}
@@ -3352,12 +3362,12 @@
       classes
         #F1 class A (nameOffset:6) (firstTokenOffset:0) (offset:6)
           element: <testLibrary>::@class::A
-        #F2 class B (nameOffset:17) (firstTokenOffset:11) (offset:17)
+        #F2 class B (nameOffset:18) (firstTokenOffset:12) (offset:18)
           element: <testLibrary>::@class::B
-        #F3 class C (nameOffset:28) (firstTokenOffset:22) (offset:28)
+        #F3 class C (nameOffset:30) (firstTokenOffset:24) (offset:30)
           element: <testLibrary>::@class::C
       mixins
-        #F4 mixin M (nameOffset:40) (firstTokenOffset:34) (offset:40)
+        #F4 mixin M (nameOffset:42) (firstTokenOffset:36) (offset:42)
           element: <testLibrary>::@mixin::M
   classes
     isSimplyBounded class A
@@ -3395,7 +3405,9 @@
   test_mixin_allSupertypes_hasSuperclassConstraints() async {
     var library = await buildLibrary(r'''
 class A {}
+
 mixin M on A {}
+
 class B with M {}
 ''');
 
@@ -3411,10 +3423,10 @@
       classes
         #F1 class A (nameOffset:6) (firstTokenOffset:0) (offset:6)
           element: <testLibrary>::@class::A
-        #F2 class B (nameOffset:33) (firstTokenOffset:27) (offset:33)
+        #F2 class B (nameOffset:35) (firstTokenOffset:29) (offset:35)
           element: <testLibrary>::@class::B
       mixins
-        #F3 mixin M (nameOffset:17) (firstTokenOffset:11) (offset:17)
+        #F3 mixin M (nameOffset:18) (firstTokenOffset:12) (offset:18)
           element: <testLibrary>::@mixin::M
   classes
     isSimplyBounded class A
@@ -3698,6 +3710,7 @@
   test_mixin_cycle_interfaces() async {
     var library = await buildLibrary(r'''
 mixin A implements B {}
+
 mixin B implements A {}
 ''');
     checkElementText(library, r'''
@@ -3709,7 +3722,7 @@
       mixins
         #F1 mixin A (nameOffset:6) (firstTokenOffset:0) (offset:6)
           element: <testLibrary>::@mixin::A
-        #F2 mixin B (nameOffset:30) (firstTokenOffset:24) (offset:30)
+        #F2 mixin B (nameOffset:31) (firstTokenOffset:25) (offset:31)
           element: <testLibrary>::@mixin::B
   mixins
     isSimplyBounded mixin A
@@ -3728,6 +3741,7 @@
   test_mixin_cycle_superclassConstraints() async {
     var library = await buildLibrary(r'''
 mixin A on B {}
+
 mixin B on A {}
 ''');
     checkElementText(library, r'''
@@ -3739,7 +3753,7 @@
       mixins
         #F1 mixin A (nameOffset:6) (firstTokenOffset:0) (offset:6)
           element: <testLibrary>::@mixin::A
-        #F2 mixin B (nameOffset:22) (firstTokenOffset:16) (offset:22)
+        #F2 mixin B (nameOffset:23) (firstTokenOffset:17) (offset:23)
           element: <testLibrary>::@mixin::B
   mixins
     isSimplyBounded mixin A
@@ -3837,7 +3851,9 @@
   test_mixin_inference() async {
     var library = await buildLibrary(r'''
 class A<T> {}
+
 mixin M<U> on A<U> {}
+
 class B extends A<int> with M {}
 ''');
     checkElementText(library, r'''
@@ -3856,17 +3872,17 @@
             #F3 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:6)
               element: <testLibrary>::@class::A::@constructor::new
               typeName: A
-        #F4 hasExtendsClause class B (nameOffset:42) (firstTokenOffset:36) (offset:42)
+        #F4 hasExtendsClause class B (nameOffset:44) (firstTokenOffset:38) (offset:44)
           element: <testLibrary>::@class::B
           constructors
-            #F5 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:42)
+            #F5 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:44)
               element: <testLibrary>::@class::B::@constructor::new
               typeName: B
       mixins
-        #F6 mixin M (nameOffset:20) (firstTokenOffset:14) (offset:20)
+        #F6 mixin M (nameOffset:21) (firstTokenOffset:15) (offset:21)
           element: <testLibrary>::@mixin::M
           typeParameters
-            #F7 U (nameOffset:22) (firstTokenOffset:22) (offset:22)
+            #F7 U (nameOffset:23) (firstTokenOffset:23) (offset:23)
               element: #E1 U
   classes
     isSimplyBounded class A
@@ -3911,6 +3927,7 @@
     // "with B" is interpreted as "with B<dynamic>".
     var library = await buildLibrary(r'''
 class A<T> {}
+
 class B<T> = Object with A<T>;
 class C = A<int> with B;
 ''');
@@ -3930,19 +3947,19 @@
             #F3 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:6)
               element: <testLibrary>::@class::A::@constructor::new
               typeName: A
-        #F4 isMixinApplication class B (nameOffset:20) (firstTokenOffset:14) (offset:20)
+        #F4 isMixinApplication class B (nameOffset:21) (firstTokenOffset:15) (offset:21)
           element: <testLibrary>::@class::B
           typeParameters
-            #F5 T (nameOffset:22) (firstTokenOffset:22) (offset:22)
+            #F5 T (nameOffset:23) (firstTokenOffset:23) (offset:23)
               element: #E1 T
           constructors
-            #F6 isConst isOriginMixinApplication new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:20)
+            #F6 isConst isOriginMixinApplication new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:21)
               element: <testLibrary>::@class::B::@constructor::new
               typeName: B
-        #F7 isMixinApplication class C (nameOffset:51) (firstTokenOffset:45) (offset:51)
+        #F7 isMixinApplication class C (nameOffset:52) (firstTokenOffset:46) (offset:52)
           element: <testLibrary>::@class::C
           constructors
-            #F8 isOriginMixinApplication new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:51)
+            #F8 isOriginMixinApplication new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:52)
               element: <testLibrary>::@class::C::@constructor::new
               typeName: C
   classes
@@ -4007,9 +4024,13 @@
     // "with B<int>".
     var library = await buildLibrary(r'''
 class A1<T> {}
+
 class A2<T> {}
+
 class B<T> = Object with A1<T>, A2<T>;
+
 class Base implements A1<int> {}
+
 class C = Base with B;
 ''');
     checkElementText(library, r'''
@@ -4028,34 +4049,34 @@
             #F3 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:6)
               element: <testLibrary>::@class::A1::@constructor::new
               typeName: A1
-        #F4 class A2 (nameOffset:21) (firstTokenOffset:15) (offset:21)
+        #F4 class A2 (nameOffset:22) (firstTokenOffset:16) (offset:22)
           element: <testLibrary>::@class::A2
           typeParameters
-            #F5 T (nameOffset:24) (firstTokenOffset:24) (offset:24)
+            #F5 T (nameOffset:25) (firstTokenOffset:25) (offset:25)
               element: #E1 T
           constructors
-            #F6 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:21)
+            #F6 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:22)
               element: <testLibrary>::@class::A2::@constructor::new
               typeName: A2
-        #F7 isMixinApplication class B (nameOffset:36) (firstTokenOffset:30) (offset:36)
+        #F7 isMixinApplication class B (nameOffset:38) (firstTokenOffset:32) (offset:38)
           element: <testLibrary>::@class::B
           typeParameters
-            #F8 T (nameOffset:38) (firstTokenOffset:38) (offset:38)
+            #F8 T (nameOffset:40) (firstTokenOffset:40) (offset:40)
               element: #E2 T
           constructors
-            #F9 isConst isOriginMixinApplication new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:36)
+            #F9 isConst isOriginMixinApplication new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:38)
               element: <testLibrary>::@class::B::@constructor::new
               typeName: B
-        #F10 class Base (nameOffset:75) (firstTokenOffset:69) (offset:75)
+        #F10 class Base (nameOffset:78) (firstTokenOffset:72) (offset:78)
           element: <testLibrary>::@class::Base
           constructors
-            #F11 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:75)
+            #F11 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:78)
               element: <testLibrary>::@class::Base::@constructor::new
               typeName: Base
-        #F12 isMixinApplication class C (nameOffset:108) (firstTokenOffset:102) (offset:108)
+        #F12 isMixinApplication class C (nameOffset:112) (firstTokenOffset:106) (offset:112)
           element: <testLibrary>::@class::C
           constructors
-            #F13 isOriginMixinApplication new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:108)
+            #F13 isOriginMixinApplication new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:112)
               element: <testLibrary>::@class::C::@constructor::new
               typeName: C
   classes
@@ -4133,7 +4154,9 @@
   test_mixin_inference_nested_functionType() async {
     var library = await buildLibrary(r'''
 class A<T> {}
+
 mixin M<T, U> on A<T Function(U)> {}
+
 class C extends A<int Function(String)> with M {}
 ''');
     checkElementText(library, r'''
@@ -4152,19 +4175,19 @@
             #F3 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:6)
               element: <testLibrary>::@class::A::@constructor::new
               typeName: A
-        #F4 hasExtendsClause class C (nameOffset:57) (firstTokenOffset:51) (offset:57)
+        #F4 hasExtendsClause class C (nameOffset:59) (firstTokenOffset:53) (offset:59)
           element: <testLibrary>::@class::C
           constructors
-            #F5 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:57)
+            #F5 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:59)
               element: <testLibrary>::@class::C::@constructor::new
               typeName: C
       mixins
-        #F6 mixin M (nameOffset:20) (firstTokenOffset:14) (offset:20)
+        #F6 mixin M (nameOffset:21) (firstTokenOffset:15) (offset:21)
           element: <testLibrary>::@mixin::M
           typeParameters
-            #F7 T (nameOffset:22) (firstTokenOffset:22) (offset:22)
+            #F7 T (nameOffset:23) (firstTokenOffset:23) (offset:23)
               element: #E1 T
-            #F8 U (nameOffset:25) (firstTokenOffset:25) (offset:25)
+            #F8 U (nameOffset:26) (firstTokenOffset:26) (offset:26)
               element: #E2 U
   classes
     isSimplyBounded class A
@@ -4207,7 +4230,9 @@
   test_mixin_inference_nested_interfaceType() async {
     var library = await buildLibrary(r'''
 abstract class A<T> {}
+
 mixin M<T> on A<List<T>> {}
+
 class C extends A<List<int>> with M {}
 ''');
     checkElementText(library, r'''
@@ -4226,17 +4251,17 @@
             #F3 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:15)
               element: <testLibrary>::@class::A::@constructor::new
               typeName: A
-        #F4 hasExtendsClause class C (nameOffset:57) (firstTokenOffset:51) (offset:57)
+        #F4 hasExtendsClause class C (nameOffset:59) (firstTokenOffset:53) (offset:59)
           element: <testLibrary>::@class::C
           constructors
-            #F5 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:57)
+            #F5 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:59)
               element: <testLibrary>::@class::C::@constructor::new
               typeName: C
       mixins
-        #F6 mixin M (nameOffset:29) (firstTokenOffset:23) (offset:29)
+        #F6 mixin M (nameOffset:30) (firstTokenOffset:24) (offset:30)
           element: <testLibrary>::@mixin::M
           typeParameters
-            #F7 T (nameOffset:31) (firstTokenOffset:31) (offset:31)
+            #F7 T (nameOffset:32) (firstTokenOffset:32) (offset:32)
               element: #E1 T
   classes
     isAbstract isSimplyBounded class A
@@ -4278,8 +4303,11 @@
     // Both `M1` and `M2` have their type arguments inferred.
     var library = await buildLibrary(r'''
 class I<X> {}
+
 mixin M1<T> on I<T> {}
+
 mixin M2<T> on I<T> {}
+
 class A = I<int> with M1, M2;
 ''');
     checkElementText(library, r'''
@@ -4298,22 +4326,22 @@
             #F3 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:6)
               element: <testLibrary>::@class::I::@constructor::new
               typeName: I
-        #F4 isMixinApplication class A (nameOffset:66) (firstTokenOffset:60) (offset:66)
+        #F4 isMixinApplication class A (nameOffset:69) (firstTokenOffset:63) (offset:69)
           element: <testLibrary>::@class::A
           constructors
-            #F5 isOriginMixinApplication new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:66)
+            #F5 isOriginMixinApplication new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:69)
               element: <testLibrary>::@class::A::@constructor::new
               typeName: A
       mixins
-        #F6 mixin M1 (nameOffset:20) (firstTokenOffset:14) (offset:20)
+        #F6 mixin M1 (nameOffset:21) (firstTokenOffset:15) (offset:21)
           element: <testLibrary>::@mixin::M1
           typeParameters
-            #F7 T (nameOffset:23) (firstTokenOffset:23) (offset:23)
+            #F7 T (nameOffset:24) (firstTokenOffset:24) (offset:24)
               element: #E1 T
-        #F8 mixin M2 (nameOffset:43) (firstTokenOffset:37) (offset:43)
+        #F8 mixin M2 (nameOffset:45) (firstTokenOffset:39) (offset:45)
           element: <testLibrary>::@mixin::M2
           typeParameters
-            #F9 T (nameOffset:46) (firstTokenOffset:46) (offset:46)
+            #F9 T (nameOffset:48) (firstTokenOffset:48) (offset:48)
               element: #E2 T
   classes
     isSimplyBounded class I
@@ -4577,6 +4605,7 @@
   test_mixin_interfaces() async {
     var library = await buildLibrary(r'''
 mixin A implements I {}
+
 class I {}
 ''');
 
@@ -4587,10 +4616,10 @@
     #F0 <testLibraryFragment>
       element: <testLibrary>
       classes
-        #F1 class I (nameOffset:30) (firstTokenOffset:24) (offset:30)
+        #F1 class I (nameOffset:31) (firstTokenOffset:25) (offset:31)
           element: <testLibrary>::@class::I
           constructors
-            #F2 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:30)
+            #F2 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:31)
               element: <testLibrary>::@class::I::@constructor::new
               typeName: I
       mixins
@@ -4763,8 +4792,11 @@
   test_mixin_interfaces_extensionType() async {
     var library = await buildLibrary(r'''
 class A {}
+
 extension type B(int it) {}
+
 class C {}
+
 mixin M implements A, B, C {}
 ''');
     configuration.withConstructors = false;
@@ -4777,19 +4809,19 @@
       classes
         #F1 class A (nameOffset:6) (firstTokenOffset:0) (offset:6)
           element: <testLibrary>::@class::A
-        #F2 class C (nameOffset:45) (firstTokenOffset:39) (offset:45)
+        #F2 class C (nameOffset:47) (firstTokenOffset:41) (offset:47)
           element: <testLibrary>::@class::C
       extensionTypes
-        #F3 extension type B (nameOffset:26) (firstTokenOffset:11) (offset:26)
+        #F3 extension type B (nameOffset:27) (firstTokenOffset:12) (offset:27)
           element: <testLibrary>::@extensionType::B
           fields
-            #F4 isFinal isOriginDeclaringFormalParameter it (nameOffset:<null>) (firstTokenOffset:<null>) (offset:26)
+            #F4 isFinal isOriginDeclaringFormalParameter it (nameOffset:<null>) (firstTokenOffset:<null>) (offset:27)
               element: <testLibrary>::@extensionType::B::@field::it
           getters
-            #F5 isCompleteDeclaration isOriginVariable it (nameOffset:<null>) (firstTokenOffset:<null>) (offset:26)
+            #F5 isCompleteDeclaration isOriginVariable it (nameOffset:<null>) (firstTokenOffset:<null>) (offset:27)
               element: <testLibrary>::@extensionType::B::@getter::it
       mixins
-        #F6 mixin M (nameOffset:56) (firstTokenOffset:50) (offset:56)
+        #F6 mixin M (nameOffset:59) (firstTokenOffset:53) (offset:59)
           element: <testLibrary>::@mixin::M
   classes
     isSimplyBounded class A
@@ -4831,7 +4863,7 @@
   }
 
   test_mixin_lazy_all_fields() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 mixin M {
   int foo = 0;
 }
@@ -4842,7 +4874,7 @@
   }
 
   test_mixin_lazy_all_getters() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 mixin M {
   int foo = 0;
 }
@@ -4853,7 +4885,7 @@
   }
 
   test_mixin_lazy_all_methods() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 mixin M {
   void foo() {}
 }
@@ -4864,7 +4896,7 @@
   }
 
   test_mixin_lazy_all_setters() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 mixin M {
   int foo = 0;
 }
@@ -4875,7 +4907,7 @@
   }
 
   test_mixin_lazy_byReference_field() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 mixin M {
   int foo = 0;
 }
@@ -4887,7 +4919,7 @@
   }
 
   test_mixin_lazy_byReference_getter() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 mixin M {
   int foo = 0;
 }
@@ -4899,7 +4931,7 @@
   }
 
   test_mixin_lazy_byReference_method() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 mixin M {
   void foo() {}
 }
@@ -4911,7 +4943,7 @@
   }
 
   test_mixin_lazy_byReference_setter() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 mixin M {
   int foo = 0;
 }
@@ -5038,6 +5070,7 @@
   test_mixin_superclassConstraints() async {
     var library = await buildLibrary(r'''
 mixin A on B {}
+
 class B {}
 ''');
 
@@ -5048,10 +5081,10 @@
     #F0 <testLibraryFragment>
       element: <testLibrary>
       classes
-        #F1 class B (nameOffset:22) (firstTokenOffset:16) (offset:22)
+        #F1 class B (nameOffset:23) (firstTokenOffset:17) (offset:23)
           element: <testLibrary>::@class::B
           constructors
-            #F2 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:22)
+            #F2 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:23)
               element: <testLibrary>::@class::B::@constructor::new
               typeName: B
       mixins
@@ -5340,8 +5373,11 @@
   test_mixin_superclassConstraints_extensionType() async {
     var library = await buildLibrary(r'''
 class A {}
+
 extension type B(int it) {}
+
 class C {}
+
 mixin M on A, B, C {}
 ''');
     configuration.withConstructors = false;
@@ -5354,19 +5390,19 @@
       classes
         #F1 class A (nameOffset:6) (firstTokenOffset:0) (offset:6)
           element: <testLibrary>::@class::A
-        #F2 class C (nameOffset:45) (firstTokenOffset:39) (offset:45)
+        #F2 class C (nameOffset:47) (firstTokenOffset:41) (offset:47)
           element: <testLibrary>::@class::C
       extensionTypes
-        #F3 extension type B (nameOffset:26) (firstTokenOffset:11) (offset:26)
+        #F3 extension type B (nameOffset:27) (firstTokenOffset:12) (offset:27)
           element: <testLibrary>::@extensionType::B
           fields
-            #F4 isFinal isOriginDeclaringFormalParameter it (nameOffset:<null>) (firstTokenOffset:<null>) (offset:26)
+            #F4 isFinal isOriginDeclaringFormalParameter it (nameOffset:<null>) (firstTokenOffset:<null>) (offset:27)
               element: <testLibrary>::@extensionType::B::@field::it
           getters
-            #F5 isCompleteDeclaration isOriginVariable it (nameOffset:<null>) (firstTokenOffset:<null>) (offset:26)
+            #F5 isCompleteDeclaration isOriginVariable it (nameOffset:<null>) (firstTokenOffset:<null>) (offset:27)
               element: <testLibrary>::@extensionType::B::@getter::it
       mixins
-        #F6 mixin M (nameOffset:56) (firstTokenOffset:50) (offset:56)
+        #F6 mixin M (nameOffset:59) (firstTokenOffset:53) (offset:59)
           element: <testLibrary>::@mixin::M
   classes
     isSimplyBounded class A
@@ -5941,7 +5977,9 @@
   }
 
   test_mixin_typeParameters_variance_contravariant() async {
-    var library = await buildLibrary('mixin M<in T> {}');
+    var library = await buildLibrary(r'''
+mixin M<in T> {}
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -5967,7 +6005,9 @@
   }
 
   test_mixin_typeParameters_variance_covariant() async {
-    var library = await buildLibrary('mixin M<out T> {}');
+    var library = await buildLibrary(r'''
+mixin M<out T> {}
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -5993,7 +6033,9 @@
   }
 
   test_mixin_typeParameters_variance_invariant() async {
-    var library = await buildLibrary('mixin M<inout T> {}');
+    var library = await buildLibrary(r'''
+mixin M<inout T> {}
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -6019,7 +6061,9 @@
   }
 
   test_mixin_typeParameters_variance_multiple() async {
-    var library = await buildLibrary('mixin M<inout T, in U, out V> {}');
+    var library = await buildLibrary(r'''
+mixin M<inout T, in U, out V> {}
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
diff --git a/pkg/analyzer/test/src/summary/elements/non_synthetic_test.dart b/pkg/analyzer/test/src/summary/elements/non_synthetic_test.dart
index e8bc0d8..d564623 100644
--- a/pkg/analyzer/test/src/summary/elements/non_synthetic_test.dart
+++ b/pkg/analyzer/test/src/summary/elements/non_synthetic_test.dart
@@ -189,9 +189,7 @@
 
   test_nonSynthetic_enum() async {
     var library = await buildLibrary(r'''
-enum E {
-  a, b
-}
+enum E { a, b }
 ''');
     configuration.withNonSynthetic = true;
     checkElementText(library, r'''
@@ -204,7 +202,7 @@
         #F1 enum E (nameOffset:5) (firstTokenOffset:0) (offset:5)
           element: <testLibrary>::@enum::E
           fields
-            #F2 hasImplicitType hasInitializer isConst isEnumConstant isOriginDeclaration isStatic a (nameOffset:11) (firstTokenOffset:11) (offset:11)
+            #F2 hasImplicitType hasInitializer isConst isEnumConstant isOriginDeclaration isStatic a (nameOffset:9) (firstTokenOffset:9) (offset:9)
               element: <testLibrary>::@enum::E::@field::a
               initializer: expression_0
                 InstanceCreationExpression
@@ -218,7 +216,7 @@
                     leftParenthesis: ( @0
                     rightParenthesis: ) @0
                   staticType: E
-            #F3 hasImplicitType hasInitializer isConst isEnumConstant isOriginDeclaration isStatic b (nameOffset:14) (firstTokenOffset:14) (offset:14)
+            #F3 hasImplicitType hasInitializer isConst isEnumConstant isOriginDeclaration isStatic b (nameOffset:12) (firstTokenOffset:12) (offset:12)
               element: <testLibrary>::@enum::E::@field::b
               initializer: expression_1
                 InstanceCreationExpression
@@ -253,9 +251,9 @@
               element: <testLibrary>::@enum::E::@constructor::new
               typeName: E
           getters
-            #F6 isCompleteDeclaration isOriginVariable isStatic a (nameOffset:<null>) (firstTokenOffset:<null>) (offset:11)
+            #F6 isCompleteDeclaration isOriginVariable isStatic a (nameOffset:<null>) (firstTokenOffset:<null>) (offset:9)
               element: <testLibrary>::@enum::E::@getter::a
-            #F7 isCompleteDeclaration isOriginVariable isStatic b (nameOffset:<null>) (firstTokenOffset:<null>) (offset:14)
+            #F7 isCompleteDeclaration isOriginVariable isStatic b (nameOffset:<null>) (firstTokenOffset:<null>) (offset:12)
               element: <testLibrary>::@enum::E::@getter::b
             #F8 isCompleteDeclaration isOriginVariable isStatic values (nameOffset:<null>) (firstTokenOffset:<null>) (offset:5)
               element: <testLibrary>::@enum::E::@getter::values
diff --git a/pkg/analyzer/test/src/summary/elements/offsets_test.dart b/pkg/analyzer/test/src/summary/elements/offsets_test.dart
index 5c1098a..3e87fab 100644
--- a/pkg/analyzer/test/src/summary/elements/offsets_test.dart
+++ b/pkg/analyzer/test/src/summary/elements/offsets_test.dart
@@ -17,7 +17,7 @@
 
 abstract class OffsetsElementTest extends ElementsBaseTest {
   test_codeRange_class() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class Raw {}
 
 /// Comment 1.
@@ -137,7 +137,7 @@
   }
 
   test_codeRange_class_namedMixin() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class A {}
 
 class B {}
@@ -353,7 +353,7 @@
   }
 
   test_codeRange_constructor() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class C {
   C();
 
@@ -567,7 +567,7 @@
   }
 
   test_codeRange_constructor_factory() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class C {
   factory C() => throw 0;
 
@@ -788,7 +788,7 @@
   }
 
   test_codeRange_extensions() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class A {}
 
 extension Raw on A {}
@@ -889,7 +889,7 @@
   }
 
   test_codeRange_field() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class C {
   int withInit = 1;
 
@@ -1075,7 +1075,7 @@
   }
 
   test_codeRange_field_annotations() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class C {
   /// Comment 1.
   /// Comment 2.
@@ -1614,7 +1614,7 @@
   }
 
   test_codeRange_function() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 void raw() {}
 
 /// Comment 1.
@@ -1784,7 +1784,7 @@
   }
 
   test_codeRange_method() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class C {
   void raw() {}
 
@@ -1983,7 +1983,7 @@
   }
 
   test_codeRange_parameter() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 main({int a = 1, int b, int c = 2}) {}
 ''');
     configuration.withCodeRanges = true;
@@ -2036,7 +2036,7 @@
   }
 
   test_codeRange_parameter_annotations() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 main(@Object() int a, int b, @Object() int c) {}
 ''');
     configuration.withCodeRanges = true;
@@ -2119,7 +2119,7 @@
   }
 
   test_codeRange_topLevelVariable() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 int withInit = 1 + 2 * 3;
 
 int withoutInit;
@@ -2288,7 +2288,7 @@
   }
 
   test_codeRange_topLevelVariable_annotations() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 /// Comment 1.
 /// Comment 2.
 int hasDocComment, hasDocComment2;
@@ -2810,7 +2810,7 @@
   }
 
   test_codeRange_type_parameter() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class A<T> {}
 void f<U extends num> {}
 ''');
diff --git a/pkg/analyzer/test/src/summary/elements/part_include_test.dart b/pkg/analyzer/test/src/summary/elements/part_include_test.dart
index a5e864a..67f1c5d 100644
--- a/pkg/analyzer/test/src/summary/elements/part_include_test.dart
+++ b/pkg/analyzer/test/src/summary/elements/part_include_test.dart
@@ -17,11 +17,18 @@
 
 abstract class PartIncludeElementTest extends ElementsBaseTest {
   test_library_parts() async {
-    newFile('$testPackageLibPath/a.dart', 'part of my.lib;');
-    newFile('$testPackageLibPath/b.dart', 'part of my.lib;');
-    var library = await buildLibrary(
-      'library my.lib; part "a.dart"; part "b.dart";',
-    );
+    newFile('$testPackageLibPath/a.dart', r'''
+part of my.lib;
+''');
+    newFile('$testPackageLibPath/b.dart', r'''
+part of my.lib;
+''');
+    var library = await buildLibrary(r'''
+library my.lib;
+
+part "a.dart";
+part "b.dart";
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -33,11 +40,11 @@
       parts
         part_0
           uri: package:test/a.dart
-          partKeywordOffset: 16
+          partKeywordOffset: 17
           unit: #F1
         part_1
           uri: package:test/b.dart
-          partKeywordOffset: 31
+          partKeywordOffset: 32
           unit: #F2
     #F1 package:test/a.dart
       element: <testLibrary>
@@ -85,9 +92,10 @@
 class B12 {}
 ''');
 
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 part 'a.dart';
 part 'b.dart';
+
 class Z {}
 ''');
 
@@ -109,7 +117,7 @@
           partKeywordOffset: 15
           unit: #F2
       classes
-        #F3 class Z (nameOffset:36) (firstTokenOffset:30) (offset:36)
+        #F3 class Z (nameOffset:37) (firstTokenOffset:31) (offset:37)
           element: <testLibrary>::@class::Z
     #F1 package:test/a.dart
       element: <testLibrary>
@@ -219,7 +227,9 @@
 ''');
     var library = await buildLibrary(r'''
 library my.lib;
+
 part 'a.dart';
+
 class A {}
 ''');
     checkElementText(library, r'''
@@ -233,13 +243,13 @@
       parts
         part_0
           uri: package:test/a.dart
-          partKeywordOffset: 16
+          partKeywordOffset: 17
           unit: #F1
       classes
-        #F2 class A (nameOffset:37) (firstTokenOffset:31) (offset:37)
+        #F2 class A (nameOffset:39) (firstTokenOffset:33) (offset:39)
           element: <testLibrary>::@class::A
           constructors
-            #F3 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:37)
+            #F3 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:39)
               element: <testLibrary>::@class::A::@constructor::new
               typeName: A
     #F1 package:test/a.dart
@@ -278,6 +288,7 @@
 ''');
     var library = await buildLibrary(r'''
 part 'a.dart';
+
 class A {}
 ''');
     checkElementText(library, r'''
@@ -293,10 +304,10 @@
           partKeywordOffset: 0
           unit: #F1
       classes
-        #F2 class A (nameOffset:21) (firstTokenOffset:15) (offset:21)
+        #F2 class A (nameOffset:22) (firstTokenOffset:16) (offset:22)
           element: <testLibrary>::@class::A
           constructors
-            #F3 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:21)
+            #F3 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:22)
               element: <testLibrary>::@class::A::@constructor::new
               typeName: A
     #F1 package:test/a.dart
@@ -363,7 +374,8 @@
   }
 
   test_partDirective_withRelativeUri_notPart_library() async {
-    newFile('$testPackageLibPath/a.dart', '');
+    newFile('$testPackageLibPath/a.dart', r'''
+''');
     var library = await buildLibrary(r'''
 part 'a.dart';
 ''');
@@ -490,9 +502,10 @@
 class B12 {}
 ''');
 
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 part 'a.dart';
 part 'b.dart';
+
 class Z {}
 ''');
 
@@ -514,7 +527,7 @@
           partKeywordOffset: 15
           unit: #F2
       classes
-        #F3 class Z (nameOffset:36) (firstTokenOffset:30) (offset:36)
+        #F3 class Z (nameOffset:37) (firstTokenOffset:31) (offset:37)
           element: <testLibrary>::@class::Z
     #F1 package:test/a.dart
       element: <testLibrary>
diff --git a/pkg/analyzer/test/src/summary/elements/record_type_test.dart b/pkg/analyzer/test/src/summary/elements/record_type_test.dart
index 6f8f41e..41b2bf1 100644
--- a/pkg/analyzer/test/src/summary/elements/record_type_test.dart
+++ b/pkg/analyzer/test/src/summary/elements/record_type_test.dart
@@ -17,7 +17,7 @@
 
 abstract class RecordTypeElementTest extends ElementsBaseTest {
   test_recordType_class_field() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class A {
   final (int, String) x;
 }
@@ -65,7 +65,7 @@
   }
 
   test_recordType_class_field_fromLiteral() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class A {
   final x = (0, true);
 }
@@ -113,7 +113,7 @@
   }
 
   test_recordType_class_method_formalParameter() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class A {
   void foo((int, String) a) {}
 }
@@ -158,7 +158,7 @@
   }
 
   test_recordType_class_method_returnType() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class A {
   (int, String) foo() {}
 }
@@ -196,7 +196,7 @@
   }
 
   test_recordType_class_typeParameter_bound() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class A<T extends (int, String)> {}
 ''');
     checkElementText(library, r'''
@@ -231,7 +231,7 @@
   }
 
   test_recordType_extension_onType() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 extension IntStringExtension on (int, String) {}
 ''');
     checkElementText(library, r'''
@@ -253,7 +253,7 @@
   }
 
   test_recordType_functionType_formalParameter() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 void f(void Function((int, String) a) b) {}
 ''');
     checkElementText(library, r'''
@@ -281,7 +281,7 @@
   }
 
   test_recordType_functionType_returnType() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 void f((int, String) Function() a) {}
 ''');
     checkElementText(library, r'''
@@ -309,7 +309,7 @@
   }
 
   test_recordType_topFunction_formalParameter() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 void f((int, String) a) {}
 ''');
     checkElementText(library, r'''
@@ -337,7 +337,7 @@
   }
 
   test_recordType_topFunction_returnType_empty() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 () f() {}
 ''');
     checkElementText(library, r'''
@@ -358,7 +358,7 @@
   }
 
   test_recordType_topFunction_returnType_generic() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 (int, T) f<T>() {}
 ''');
     checkElementText(library, r'''
@@ -385,7 +385,7 @@
   }
 
   test_recordType_topFunction_returnType_mixed() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 (int, String, {bool c}) f() {}
 ''');
     checkElementText(library, r'''
@@ -406,7 +406,7 @@
   }
 
   test_recordType_topFunction_returnType_named() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 ({int a, String b}) f() {}
 ''');
     checkElementText(library, r'''
@@ -427,7 +427,7 @@
   }
 
   test_recordType_topFunction_returnType_nested() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 ((int, String), (bool, double)) f() {}
 ''');
     checkElementText(library, r'''
@@ -448,7 +448,7 @@
   }
 
   test_recordType_topFunction_returnType_nullable() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 (int, String)? f() {}
 ''');
     checkElementText(library, r'''
@@ -469,7 +469,7 @@
   }
 
   test_recordType_topFunction_returnType_positional() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 (int, String) f() {}
 ''');
     checkElementText(library, r'''
@@ -490,7 +490,7 @@
   }
 
   test_recordType_topFunction_returnType_positional_one() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 (int,) f() {}
 ''');
     checkElementText(library, r'''
@@ -511,7 +511,7 @@
   }
 
   test_recordType_topVariable() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 final (int, String) x;
 ''');
     checkElementText(library, r'''
@@ -542,7 +542,7 @@
   }
 
   test_recordType_topVariable_fromLiteral() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 final x = (0, true);
 ''');
     checkElementText(library, r'''
diff --git a/pkg/analyzer/test/src/summary/elements/top_level_function_test.dart b/pkg/analyzer/test/src/summary/elements/top_level_function_test.dart
index c6d28fe..3859986 100644
--- a/pkg/analyzer/test/src/summary/elements/top_level_function_test.dart
+++ b/pkg/analyzer/test/src/summary/elements/top_level_function_test.dart
@@ -12,1619 +12,11 @@
   defineReflectiveSuite(() {
     defineReflectiveTests(TopLevelFunctionElementTest_keepLinking);
     defineReflectiveTests(TopLevelFunctionElementTest_fromBytes);
-    defineReflectiveTests(TopLevelFunctionElementTest_augmentation_keepLinking);
-    defineReflectiveTests(TopLevelFunctionElementTest_augmentation_fromBytes);
     defineReflectiveTests(UpdateNodeTextExpectations);
   });
 }
 
 abstract class TopLevelFunctionElementTest extends ElementsBaseTest {
-  test_function_async() async {
-    var library = await buildLibrary(r'''
-import 'dart:async';
-Future f() async {}
-''');
-    checkElementText(library, r'''
-library
-  reference: <testLibrary>
-  fragments
-    #F0 <testLibraryFragment>
-      element: <testLibrary>
-      libraryImports
-        dart:async
-      functions
-        #F1 isAsynchronous isCompleteDeclaration isOriginDeclaration isStatic f (nameOffset:28) (firstTokenOffset:21) (offset:28)
-          element: <testLibrary>::@function::f
-  functions
-    isOriginDeclaration isStatic f
-      reference: <testLibrary>::@function::f
-      firstFragment: #F1
-      returnType: Future<dynamic>
-''');
-  }
-
-  test_function_asyncStar() async {
-    var library = await buildLibrary(r'''
-import 'dart:async';
-Stream f() async* {}
-''');
-    checkElementText(library, r'''
-library
-  reference: <testLibrary>
-  fragments
-    #F0 <testLibraryFragment>
-      element: <testLibrary>
-      libraryImports
-        dart:async
-      functions
-        #F1 isAsynchronous isCompleteDeclaration isGenerator isOriginDeclaration isStatic f (nameOffset:28) (firstTokenOffset:21) (offset:28)
-          element: <testLibrary>::@function::f
-  functions
-    isOriginDeclaration isStatic f
-      reference: <testLibrary>::@function::f
-      firstFragment: #F1
-      returnType: Stream<dynamic>
-''');
-  }
-
-  test_function_documented() async {
-    var library = await buildLibrary('''
-// Extra comment so doc comment offset != 0
-/**
- * Docs
- */
-f() {}''');
-    checkElementText(library, r'''
-library
-  reference: <testLibrary>
-  fragments
-    #F0 <testLibraryFragment>
-      element: <testLibrary>
-      functions
-        #F1 hasImplicitReturnType isCompleteDeclaration isOriginDeclaration isStatic f (nameOffset:60) (firstTokenOffset:44) (offset:60)
-          element: <testLibrary>::@function::f
-          documentationComment: /**\n * Docs\n */
-  functions
-    isOriginDeclaration isStatic f
-      reference: <testLibrary>::@function::f
-      firstFragment: #F1
-      documentationComment: /**\n * Docs\n */
-      returnType: dynamic
-''');
-  }
-
-  test_function_entry_point() async {
-    var library = await buildLibrary('main() {}');
-    checkElementText(library, r'''
-library
-  reference: <testLibrary>
-  fragments
-    #F0 <testLibraryFragment>
-      element: <testLibrary>
-      functions
-        #F1 hasImplicitReturnType isCompleteDeclaration isOriginDeclaration isStatic main (nameOffset:0) (firstTokenOffset:0) (offset:0)
-          element: <testLibrary>::@function::main
-  functions
-    isOriginDeclaration isStatic main
-      reference: <testLibrary>::@function::main
-      firstFragment: #F1
-      returnType: dynamic
-''');
-  }
-
-  test_function_entry_point_in_export() async {
-    newFile('$testPackageLibPath/a.dart', 'library a; main() {}');
-    var library = await buildLibrary('export "a.dart";');
-    checkElementText(library, r'''
-library
-  reference: <testLibrary>
-  fragments
-    #F0 <testLibraryFragment>
-      element: <testLibrary>
-      libraryExports
-        package:test/a.dart
-''');
-  }
-
-  test_function_entry_point_in_export_hidden() async {
-    newFile('$testPackageLibPath/a.dart', 'library a; main() {}');
-    var library = await buildLibrary('export "a.dart" hide main;');
-    checkElementText(library, r'''
-library
-  reference: <testLibrary>
-  fragments
-    #F0 <testLibraryFragment>
-      element: <testLibrary>
-      libraryExports
-        package:test/a.dart
-          combinators
-            hide: main
-''');
-  }
-
-  test_function_entry_point_in_part() async {
-    newFile('$testPackageLibPath/a.dart', 'part of my.lib; main() {}');
-    var library = await buildLibrary('library my.lib; part "a.dart";');
-    checkElementText(library, r'''
-library
-  reference: <testLibrary>
-  name: my.lib
-  fragments
-    #F0 <testLibraryFragment> (nameOffset:<null>) (firstTokenOffset:0) (offset:8)
-      element: <testLibrary>
-      nextFragment: #F1
-      parts
-        part_0
-          uri: package:test/a.dart
-          partKeywordOffset: 16
-          unit: #F1
-    #F1 package:test/a.dart
-      element: <testLibrary>
-      enclosingFragment: #F0
-      previousFragment: #F0
-      functions
-        #F2 hasImplicitReturnType isCompleteDeclaration isOriginDeclaration isStatic main (nameOffset:16) (firstTokenOffset:16) (offset:16)
-          element: <testLibrary>::@function::main
-  functions
-    isOriginDeclaration isStatic main
-      reference: <testLibrary>::@function::main
-      firstFragment: #F2
-      returnType: dynamic
-''');
-  }
-
-  test_function_external() async {
-    var library = await buildLibrary('external f();');
-    checkElementText(library, r'''
-library
-  reference: <testLibrary>
-  fragments
-    #F0 <testLibraryFragment>
-      element: <testLibrary>
-      functions
-        #F1 hasImplicitReturnType isCompleteDeclaration isExternal isOriginDeclaration isStatic f (nameOffset:9) (firstTokenOffset:0) (offset:9)
-          element: <testLibrary>::@function::f
-  functions
-    isExternal isOriginDeclaration isStatic f
-      reference: <testLibrary>::@function::f
-      firstFragment: #F1
-      returnType: dynamic
-''');
-  }
-
-  test_function_hasImplicitReturnType_false() async {
-    var library = await buildLibrary('''
-int f() => 0;
-''');
-    var f = library.firstFragment.functions.single;
-    expect(f.hasImplicitReturnType, isFalse);
-  }
-
-  test_function_hasImplicitReturnType_true() async {
-    var library = await buildLibrary('''
-f() => 0;
-''');
-    var f = library.firstFragment.functions.single;
-    expect(f.hasImplicitReturnType, isTrue);
-  }
-
-  test_function_loadLibrary_declared() async {
-    var library = await buildLibrary(r'''
-void loadLibrary() {}
-''');
-    checkElementText(library, r'''
-library
-  reference: <testLibrary>
-  fragments
-    #F0 <testLibraryFragment>
-      element: <testLibrary>
-      functions
-        #F1 isCompleteDeclaration isOriginDeclaration isStatic loadLibrary (nameOffset:5) (firstTokenOffset:0) (offset:5)
-          element: <testLibrary>::@function::loadLibrary#1
-  functions
-    isOriginDeclaration isStatic loadLibrary
-      reference: <testLibrary>::@function::loadLibrary#1
-      firstFragment: #F1
-      returnType: void
-''');
-  }
-
-  test_function_missingName() async {
-    var library = await buildLibrary('''
-() {}
-''');
-    checkElementText(library, r'''
-library
-  reference: <testLibrary>
-  fragments
-    #F0 <testLibraryFragment>
-      element: <testLibrary>
-''');
-  }
-
-  test_function_parameter_const() async {
-    var library = await buildLibrary('''
-void f(const x) {}
-''');
-    checkElementText(library, r'''
-library
-  reference: <testLibrary>
-  fragments
-    #F0 <testLibraryFragment>
-      element: <testLibrary>
-      functions
-        #F1 isCompleteDeclaration isOriginDeclaration isStatic f (nameOffset:5) (firstTokenOffset:0) (offset:5)
-          element: <testLibrary>::@function::f
-          formalParameters
-            #F2 requiredPositional hasImplicitType isOriginDeclaration x (nameOffset:13) (firstTokenOffset:7) (offset:13)
-              element: <testLibrary>::@function::f::@formalParameter::x
-  functions
-    isOriginDeclaration isStatic f
-      reference: <testLibrary>::@function::f
-      firstFragment: #F1
-      formalParameters
-        #E0 requiredPositional hasImplicitType x
-          firstFragment: #F2
-          type: dynamic
-      returnType: void
-''');
-  }
-
-  test_function_parameter_fieldFormal() async {
-    var library = await buildLibrary('''
-void f(int this.a) {}
-''');
-    checkElementText(library, r'''
-library
-  reference: <testLibrary>
-  fragments
-    #F0 <testLibraryFragment>
-      element: <testLibrary>
-      functions
-        #F1 isCompleteDeclaration isOriginDeclaration isStatic f (nameOffset:5) (firstTokenOffset:0) (offset:5)
-          element: <testLibrary>::@function::f
-          formalParameters
-            #F2 requiredPositional isFinal isOriginDeclaration this.a (nameOffset:16) (firstTokenOffset:7) (offset:16)
-              element: <testLibrary>::@function::f::@formalParameter::a
-  functions
-    isOriginDeclaration isStatic f
-      reference: <testLibrary>::@function::f
-      firstFragment: #F1
-      formalParameters
-        #E0 requiredPositional isFinal this.a
-          firstFragment: #F2
-          type: int
-          field: <null>
-      returnType: void
-''');
-  }
-
-  test_function_parameter_fieldFormal_default() async {
-    var library = await buildLibrary('''
-void f({int this.a: 42}) {}
-''');
-    checkElementText(library, r'''
-library
-  reference: <testLibrary>
-  fragments
-    #F0 <testLibraryFragment>
-      element: <testLibrary>
-      functions
-        #F1 isCompleteDeclaration isOriginDeclaration isStatic f (nameOffset:5) (firstTokenOffset:0) (offset:5)
-          element: <testLibrary>::@function::f
-          formalParameters
-            #F2 optionalNamed isFinal isOriginDeclaration this.a (nameOffset:17) (firstTokenOffset:8) (offset:17)
-              element: <testLibrary>::@function::f::@formalParameter::a
-              initializer: expression_0
-                IntegerLiteral
-                  literal: 42 @20
-                  staticType: int
-  functions
-    isOriginDeclaration isStatic f
-      reference: <testLibrary>::@function::f
-      firstFragment: #F1
-      formalParameters
-        #E0 optionalNamed hasDefaultValue isFinal this.a
-          firstFragment: #F2
-          type: int
-          constantInitializer
-            fragment: #F2
-            expression: expression_0
-          field: <null>
-      returnType: void
-''');
-  }
-
-  test_function_parameter_fieldFormal_functionTyped() async {
-    var library = await buildLibrary('''
-void f(int this.a(int b)) {}
-''');
-    checkElementText(library, r'''
-library
-  reference: <testLibrary>
-  fragments
-    #F0 <testLibraryFragment>
-      element: <testLibrary>
-      functions
-        #F1 isCompleteDeclaration isOriginDeclaration isStatic f (nameOffset:5) (firstTokenOffset:0) (offset:5)
-          element: <testLibrary>::@function::f
-          formalParameters
-            #F2 requiredPositional isFinal isOriginDeclaration this.a (nameOffset:16) (firstTokenOffset:7) (offset:16)
-              element: <testLibrary>::@function::f::@formalParameter::a
-              parameters
-                #F3 requiredPositional isOriginDeclaration b (nameOffset:22) (firstTokenOffset:18) (offset:22)
-                  element: b@22
-  functions
-    isOriginDeclaration isStatic f
-      reference: <testLibrary>::@function::f
-      firstFragment: #F1
-      formalParameters
-        #E0 requiredPositional isFinal this.a
-          firstFragment: #F2
-          type: int Function(int)
-          formalParameters
-            #E1 requiredPositional b
-              firstFragment: #F3
-              type: int
-          field: <null>
-      returnType: void
-''');
-  }
-
-  test_function_parameter_final() async {
-    var library = await buildLibrary('f(final x) {}');
-    checkElementText(library, r'''
-library
-  reference: <testLibrary>
-  fragments
-    #F0 <testLibraryFragment>
-      element: <testLibrary>
-      functions
-        #F1 hasImplicitReturnType isCompleteDeclaration isOriginDeclaration isStatic f (nameOffset:0) (firstTokenOffset:0) (offset:0)
-          element: <testLibrary>::@function::f
-          formalParameters
-            #F2 requiredPositional hasImplicitType isFinal isOriginDeclaration x (nameOffset:8) (firstTokenOffset:2) (offset:8)
-              element: <testLibrary>::@function::f::@formalParameter::x
-  functions
-    isOriginDeclaration isStatic f
-      reference: <testLibrary>::@function::f
-      firstFragment: #F1
-      formalParameters
-        #E0 requiredPositional hasImplicitType isFinal x
-          firstFragment: #F2
-          type: dynamic
-      returnType: dynamic
-''');
-  }
-
-  test_function_parameter_kind_named() async {
-    var library = await buildLibrary('f({x}) {}');
-    checkElementText(library, r'''
-library
-  reference: <testLibrary>
-  fragments
-    #F0 <testLibraryFragment>
-      element: <testLibrary>
-      functions
-        #F1 hasImplicitReturnType isCompleteDeclaration isOriginDeclaration isStatic f (nameOffset:0) (firstTokenOffset:0) (offset:0)
-          element: <testLibrary>::@function::f
-          formalParameters
-            #F2 optionalNamed hasImplicitType isOriginDeclaration x (nameOffset:3) (firstTokenOffset:3) (offset:3)
-              element: <testLibrary>::@function::f::@formalParameter::x
-  functions
-    isOriginDeclaration isStatic f
-      reference: <testLibrary>::@function::f
-      firstFragment: #F1
-      formalParameters
-        #E0 optionalNamed hasImplicitType x
-          firstFragment: #F2
-          type: dynamic
-      returnType: dynamic
-''');
-  }
-
-  test_function_parameter_kind_positional() async {
-    var library = await buildLibrary('f([x]) {}');
-    checkElementText(library, r'''
-library
-  reference: <testLibrary>
-  fragments
-    #F0 <testLibraryFragment>
-      element: <testLibrary>
-      functions
-        #F1 hasImplicitReturnType isCompleteDeclaration isOriginDeclaration isStatic f (nameOffset:0) (firstTokenOffset:0) (offset:0)
-          element: <testLibrary>::@function::f
-          formalParameters
-            #F2 optionalPositional hasImplicitType isOriginDeclaration x (nameOffset:3) (firstTokenOffset:3) (offset:3)
-              element: <testLibrary>::@function::f::@formalParameter::x
-  functions
-    isOriginDeclaration isStatic f
-      reference: <testLibrary>::@function::f
-      firstFragment: #F1
-      formalParameters
-        #E0 optionalPositional hasImplicitType x
-          firstFragment: #F2
-          type: dynamic
-      returnType: dynamic
-''');
-  }
-
-  test_function_parameter_kind_required() async {
-    var library = await buildLibrary('f(x) {}');
-    checkElementText(library, r'''
-library
-  reference: <testLibrary>
-  fragments
-    #F0 <testLibraryFragment>
-      element: <testLibrary>
-      functions
-        #F1 hasImplicitReturnType isCompleteDeclaration isOriginDeclaration isStatic f (nameOffset:0) (firstTokenOffset:0) (offset:0)
-          element: <testLibrary>::@function::f
-          formalParameters
-            #F2 requiredPositional hasImplicitType isOriginDeclaration x (nameOffset:2) (firstTokenOffset:2) (offset:2)
-              element: <testLibrary>::@function::f::@formalParameter::x
-  functions
-    isOriginDeclaration isStatic f
-      reference: <testLibrary>::@function::f
-      firstFragment: #F1
-      formalParameters
-        #E0 requiredPositional hasImplicitType x
-          firstFragment: #F2
-          type: dynamic
-      returnType: dynamic
-''');
-  }
-
-  test_function_parameter_parameters() async {
-    var library = await buildLibrary('f(g(x, y)) {}');
-    checkElementText(library, r'''
-library
-  reference: <testLibrary>
-  fragments
-    #F0 <testLibraryFragment>
-      element: <testLibrary>
-      functions
-        #F1 hasImplicitReturnType isCompleteDeclaration isOriginDeclaration isStatic f (nameOffset:0) (firstTokenOffset:0) (offset:0)
-          element: <testLibrary>::@function::f
-          formalParameters
-            #F2 requiredPositional isOriginDeclaration g (nameOffset:2) (firstTokenOffset:2) (offset:2)
-              element: <testLibrary>::@function::f::@formalParameter::g
-              parameters
-                #F3 requiredPositional hasImplicitType isOriginDeclaration x (nameOffset:4) (firstTokenOffset:4) (offset:4)
-                  element: x@4
-                #F4 requiredPositional hasImplicitType isOriginDeclaration y (nameOffset:7) (firstTokenOffset:7) (offset:7)
-                  element: y@7
-  functions
-    isOriginDeclaration isStatic f
-      reference: <testLibrary>::@function::f
-      firstFragment: #F1
-      formalParameters
-        #E0 requiredPositional g
-          firstFragment: #F2
-          type: dynamic Function(dynamic, dynamic)
-          formalParameters
-            #E1 requiredPositional hasImplicitType x
-              firstFragment: #F3
-              type: dynamic
-            #E2 requiredPositional hasImplicitType y
-              firstFragment: #F4
-              type: dynamic
-      returnType: dynamic
-''');
-  }
-
-  test_function_parameter_return_type() async {
-    var library = await buildLibrary('f(int g()) {}');
-    checkElementText(library, r'''
-library
-  reference: <testLibrary>
-  fragments
-    #F0 <testLibraryFragment>
-      element: <testLibrary>
-      functions
-        #F1 hasImplicitReturnType isCompleteDeclaration isOriginDeclaration isStatic f (nameOffset:0) (firstTokenOffset:0) (offset:0)
-          element: <testLibrary>::@function::f
-          formalParameters
-            #F2 requiredPositional isOriginDeclaration g (nameOffset:6) (firstTokenOffset:2) (offset:6)
-              element: <testLibrary>::@function::f::@formalParameter::g
-  functions
-    isOriginDeclaration isStatic f
-      reference: <testLibrary>::@function::f
-      firstFragment: #F1
-      formalParameters
-        #E0 requiredPositional g
-          firstFragment: #F2
-          type: int Function()
-      returnType: dynamic
-''');
-  }
-
-  test_function_parameter_return_type_void() async {
-    var library = await buildLibrary('f(void g()) {}');
-    checkElementText(library, r'''
-library
-  reference: <testLibrary>
-  fragments
-    #F0 <testLibraryFragment>
-      element: <testLibrary>
-      functions
-        #F1 hasImplicitReturnType isCompleteDeclaration isOriginDeclaration isStatic f (nameOffset:0) (firstTokenOffset:0) (offset:0)
-          element: <testLibrary>::@function::f
-          formalParameters
-            #F2 requiredPositional isOriginDeclaration g (nameOffset:7) (firstTokenOffset:2) (offset:7)
-              element: <testLibrary>::@function::f::@formalParameter::g
-  functions
-    isOriginDeclaration isStatic f
-      reference: <testLibrary>::@function::f
-      firstFragment: #F1
-      formalParameters
-        #E0 requiredPositional g
-          firstFragment: #F2
-          type: void Function()
-      returnType: dynamic
-''');
-  }
-
-  test_function_parameter_type() async {
-    var library = await buildLibrary('f(int i) {}');
-    checkElementText(library, r'''
-library
-  reference: <testLibrary>
-  fragments
-    #F0 <testLibraryFragment>
-      element: <testLibrary>
-      functions
-        #F1 hasImplicitReturnType isCompleteDeclaration isOriginDeclaration isStatic f (nameOffset:0) (firstTokenOffset:0) (offset:0)
-          element: <testLibrary>::@function::f
-          formalParameters
-            #F2 requiredPositional isOriginDeclaration i (nameOffset:6) (firstTokenOffset:2) (offset:6)
-              element: <testLibrary>::@function::f::@formalParameter::i
-  functions
-    isOriginDeclaration isStatic f
-      reference: <testLibrary>::@function::f
-      firstFragment: #F1
-      formalParameters
-        #E0 requiredPositional i
-          firstFragment: #F2
-          type: int
-      returnType: dynamic
-''');
-  }
-
-  test_function_parameter_type_typeParameter() async {
-    var library = await buildLibrary('''
-void f<T>(T a) {}
-''');
-    checkElementText(library, r'''
-library
-  reference: <testLibrary>
-  fragments
-    #F0 <testLibraryFragment>
-      element: <testLibrary>
-      functions
-        #F1 isCompleteDeclaration isOriginDeclaration isStatic f (nameOffset:5) (firstTokenOffset:0) (offset:5)
-          element: <testLibrary>::@function::f
-          typeParameters
-            #F2 T (nameOffset:7) (firstTokenOffset:7) (offset:7)
-              element: #E0 T
-          formalParameters
-            #F3 requiredPositional isOriginDeclaration a (nameOffset:12) (firstTokenOffset:10) (offset:12)
-              element: <testLibrary>::@function::f::@formalParameter::a
-  functions
-    isOriginDeclaration isStatic f
-      reference: <testLibrary>::@function::f
-      firstFragment: #F1
-      typeParameters
-        #E0 T
-          firstFragment: #F2
-      formalParameters
-        #E1 requiredPositional a
-          firstFragment: #F3
-          type: T
-      returnType: void
-''');
-  }
-
-  test_function_parameter_type_unresolved() async {
-    var library = await buildLibrary(r'''
-void f(A a) {}
-''');
-    checkElementText(library, r'''
-library
-  reference: <testLibrary>
-  fragments
-    #F0 <testLibraryFragment>
-      element: <testLibrary>
-      functions
-        #F1 isCompleteDeclaration isOriginDeclaration isStatic f (nameOffset:5) (firstTokenOffset:0) (offset:5)
-          element: <testLibrary>::@function::f
-          formalParameters
-            #F2 requiredPositional isOriginDeclaration a (nameOffset:9) (firstTokenOffset:7) (offset:9)
-              element: <testLibrary>::@function::f::@formalParameter::a
-  functions
-    isOriginDeclaration isStatic f
-      reference: <testLibrary>::@function::f
-      firstFragment: #F1
-      formalParameters
-        #E0 requiredPositional a
-          firstFragment: #F2
-          type: InvalidType
-      returnType: void
-''');
-  }
-
-  test_function_parameters() async {
-    var library = await buildLibrary('f(x, y) {}');
-    checkElementText(library, r'''
-library
-  reference: <testLibrary>
-  fragments
-    #F0 <testLibraryFragment>
-      element: <testLibrary>
-      functions
-        #F1 hasImplicitReturnType isCompleteDeclaration isOriginDeclaration isStatic f (nameOffset:0) (firstTokenOffset:0) (offset:0)
-          element: <testLibrary>::@function::f
-          formalParameters
-            #F2 requiredPositional hasImplicitType isOriginDeclaration x (nameOffset:2) (firstTokenOffset:2) (offset:2)
-              element: <testLibrary>::@function::f::@formalParameter::x
-            #F3 requiredPositional hasImplicitType isOriginDeclaration y (nameOffset:5) (firstTokenOffset:5) (offset:5)
-              element: <testLibrary>::@function::f::@formalParameter::y
-  functions
-    isOriginDeclaration isStatic f
-      reference: <testLibrary>::@function::f
-      firstFragment: #F1
-      formalParameters
-        #E0 requiredPositional hasImplicitType x
-          firstFragment: #F2
-          type: dynamic
-        #E1 requiredPositional hasImplicitType y
-          firstFragment: #F3
-          type: dynamic
-      returnType: dynamic
-''');
-  }
-
-  test_function_return_type_implicit() async {
-    var library = await buildLibrary('f() => null;');
-    checkElementText(library, r'''
-library
-  reference: <testLibrary>
-  fragments
-    #F0 <testLibraryFragment>
-      element: <testLibrary>
-      functions
-        #F1 hasImplicitReturnType isCompleteDeclaration isOriginDeclaration isStatic f (nameOffset:0) (firstTokenOffset:0) (offset:0)
-          element: <testLibrary>::@function::f
-  functions
-    isOriginDeclaration isStatic f
-      reference: <testLibrary>::@function::f
-      firstFragment: #F1
-      returnType: dynamic
-''');
-  }
-
-  test_function_return_type_unresolved() async {
-    var library = await buildLibrary(r'''
-A f() {}
-''');
-    checkElementText(library, r'''
-library
-  reference: <testLibrary>
-  fragments
-    #F0 <testLibraryFragment>
-      element: <testLibrary>
-      functions
-        #F1 isCompleteDeclaration isOriginDeclaration isStatic f (nameOffset:2) (firstTokenOffset:0) (offset:2)
-          element: <testLibrary>::@function::f
-  functions
-    isOriginDeclaration isStatic f
-      reference: <testLibrary>::@function::f
-      firstFragment: #F1
-      returnType: InvalidType
-''');
-  }
-
-  test_function_return_type_void() async {
-    var library = await buildLibrary('void f() {}');
-    checkElementText(library, r'''
-library
-  reference: <testLibrary>
-  fragments
-    #F0 <testLibraryFragment>
-      element: <testLibrary>
-      functions
-        #F1 isCompleteDeclaration isOriginDeclaration isStatic f (nameOffset:5) (firstTokenOffset:0) (offset:5)
-          element: <testLibrary>::@function::f
-  functions
-    isOriginDeclaration isStatic f
-      reference: <testLibrary>::@function::f
-      firstFragment: #F1
-      returnType: void
-''');
-  }
-
-  test_function_returnType() async {
-    var library = await buildLibrary('''
-int f() => 0;
-''');
-    checkElementText(library, r'''
-library
-  reference: <testLibrary>
-  fragments
-    #F0 <testLibraryFragment>
-      element: <testLibrary>
-      functions
-        #F1 isCompleteDeclaration isOriginDeclaration isStatic f (nameOffset:4) (firstTokenOffset:0) (offset:4)
-          element: <testLibrary>::@function::f
-  functions
-    isOriginDeclaration isStatic f
-      reference: <testLibrary>::@function::f
-      firstFragment: #F1
-      returnType: int
-''');
-  }
-
-  test_function_returnType_typeParameter() async {
-    var library = await buildLibrary('''
-T f<T>() => throw 0;
-''');
-    checkElementText(library, r'''
-library
-  reference: <testLibrary>
-  fragments
-    #F0 <testLibraryFragment>
-      element: <testLibrary>
-      functions
-        #F1 isCompleteDeclaration isOriginDeclaration isStatic f (nameOffset:2) (firstTokenOffset:0) (offset:2)
-          element: <testLibrary>::@function::f
-          typeParameters
-            #F2 T (nameOffset:4) (firstTokenOffset:4) (offset:4)
-              element: #E0 T
-  functions
-    isOriginDeclaration isStatic f
-      reference: <testLibrary>::@function::f
-      firstFragment: #F1
-      typeParameters
-        #E0 T
-          firstFragment: #F2
-      returnType: T
-''');
-  }
-
-  test_function_type_parameter_with_function_typed_parameter() async {
-    var library = await buildLibrary('void f<T, U>(T x(U u)) {}');
-    checkElementText(library, r'''
-library
-  reference: <testLibrary>
-  fragments
-    #F0 <testLibraryFragment>
-      element: <testLibrary>
-      functions
-        #F1 isCompleteDeclaration isOriginDeclaration isStatic f (nameOffset:5) (firstTokenOffset:0) (offset:5)
-          element: <testLibrary>::@function::f
-          typeParameters
-            #F2 T (nameOffset:7) (firstTokenOffset:7) (offset:7)
-              element: #E0 T
-            #F3 U (nameOffset:10) (firstTokenOffset:10) (offset:10)
-              element: #E1 U
-          formalParameters
-            #F4 requiredPositional isOriginDeclaration x (nameOffset:15) (firstTokenOffset:13) (offset:15)
-              element: <testLibrary>::@function::f::@formalParameter::x
-              parameters
-                #F5 requiredPositional isOriginDeclaration u (nameOffset:19) (firstTokenOffset:17) (offset:19)
-                  element: u@19
-  functions
-    isOriginDeclaration isStatic f
-      reference: <testLibrary>::@function::f
-      firstFragment: #F1
-      typeParameters
-        #E0 T
-          firstFragment: #F2
-        #E1 U
-          firstFragment: #F3
-      formalParameters
-        #E2 requiredPositional x
-          firstFragment: #F4
-          type: T Function(U)
-          formalParameters
-            #E3 requiredPositional u
-              firstFragment: #F5
-              type: U
-      returnType: void
-''');
-  }
-
-  test_function_typed_parameter_implicit() async {
-    var library = await buildLibrary('f(g()) => null;');
-    expect(
-      library.topLevelFunctions.first.formalParameters.first.hasImplicitType,
-      isFalse,
-    );
-  }
-
-  test_function_typeParameters_hasBound() async {
-    var library = await buildLibrary('''
-void f<T extends num>() {}
-''');
-    checkElementText(library, r'''
-library
-  reference: <testLibrary>
-  fragments
-    #F0 <testLibraryFragment>
-      element: <testLibrary>
-      functions
-        #F1 isCompleteDeclaration isOriginDeclaration isStatic f (nameOffset:5) (firstTokenOffset:0) (offset:5)
-          element: <testLibrary>::@function::f
-          typeParameters
-            #F2 T (nameOffset:7) (firstTokenOffset:7) (offset:7)
-              element: #E0 T
-  functions
-    isOriginDeclaration isStatic f
-      reference: <testLibrary>::@function::f
-      firstFragment: #F1
-      typeParameters
-        #E0 T
-          firstFragment: #F2
-          bound: num
-      returnType: void
-''');
-  }
-
-  test_function_typeParameters_noBound() async {
-    var library = await buildLibrary('''
-void f<T>() {}
-''');
-    checkElementText(library, r'''
-library
-  reference: <testLibrary>
-  fragments
-    #F0 <testLibraryFragment>
-      element: <testLibrary>
-      functions
-        #F1 isCompleteDeclaration isOriginDeclaration isStatic f (nameOffset:5) (firstTokenOffset:0) (offset:5)
-          element: <testLibrary>::@function::f
-          typeParameters
-            #F2 T (nameOffset:7) (firstTokenOffset:7) (offset:7)
-              element: #E0 T
-  functions
-    isOriginDeclaration isStatic f
-      reference: <testLibrary>::@function::f
-      firstFragment: #F1
-      typeParameters
-        #E0 T
-          firstFragment: #F2
-      returnType: void
-''');
-  }
-
-  test_functions() async {
-    var library = await buildLibrary('f() {} g() {}');
-    checkElementText(library, r'''
-library
-  reference: <testLibrary>
-  fragments
-    #F0 <testLibraryFragment>
-      element: <testLibrary>
-      functions
-        #F1 hasImplicitReturnType isCompleteDeclaration isOriginDeclaration isStatic f (nameOffset:0) (firstTokenOffset:0) (offset:0)
-          element: <testLibrary>::@function::f
-        #F2 hasImplicitReturnType isCompleteDeclaration isOriginDeclaration isStatic g (nameOffset:7) (firstTokenOffset:7) (offset:7)
-          element: <testLibrary>::@function::g
-  functions
-    isOriginDeclaration isStatic f
-      reference: <testLibrary>::@function::f
-      firstFragment: #F1
-      returnType: dynamic
-    isOriginDeclaration isStatic g
-      reference: <testLibrary>::@function::g
-      firstFragment: #F2
-      returnType: dynamic
-''');
-  }
-
-  test_getter_missingName() async {
-    var library = await buildLibrary('''
-get () => 0;
-''');
-    checkElementText(library, r'''
-library
-  reference: <testLibrary>
-  fragments
-    #F0 <testLibraryFragment>
-      element: <testLibrary>
-      functions
-        #F1 hasImplicitReturnType isCompleteDeclaration isOriginDeclaration isStatic get (nameOffset:0) (firstTokenOffset:0) (offset:0)
-          element: <testLibrary>::@function::get
-  functions
-    isOriginDeclaration isStatic get
-      reference: <testLibrary>::@function::get
-      firstFragment: #F1
-      returnType: dynamic
-''');
-  }
-
-  test_main_class() async {
-    var library = await buildLibrary('class main {}');
-    checkElementText(library, r'''
-library
-  reference: <testLibrary>
-  fragments
-    #F0 <testLibraryFragment>
-      element: <testLibrary>
-      classes
-        #F1 class main (nameOffset:6) (firstTokenOffset:0) (offset:6)
-          element: <testLibrary>::@class::main
-          constructors
-            #F2 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:6)
-              element: <testLibrary>::@class::main::@constructor::new
-              typeName: main
-  classes
-    isSimplyBounded class main
-      reference: <testLibrary>::@class::main
-      firstFragment: #F1
-      constructors
-        isOriginImplicitDefault new
-          reference: <testLibrary>::@class::main::@constructor::new
-          firstFragment: #F2
-''');
-  }
-
-  test_main_class_alias() async {
-    var library = await buildLibrary(
-      'class main = C with D; class C {} class D {}',
-    );
-    checkElementText(library, r'''
-library
-  reference: <testLibrary>
-  fragments
-    #F0 <testLibraryFragment>
-      element: <testLibrary>
-      classes
-        #F1 isMixinApplication class main (nameOffset:6) (firstTokenOffset:0) (offset:6)
-          element: <testLibrary>::@class::main
-          constructors
-            #F2 isOriginMixinApplication new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:6)
-              element: <testLibrary>::@class::main::@constructor::new
-              typeName: main
-        #F3 class C (nameOffset:29) (firstTokenOffset:23) (offset:29)
-          element: <testLibrary>::@class::C
-          constructors
-            #F4 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:29)
-              element: <testLibrary>::@class::C::@constructor::new
-              typeName: C
-        #F5 class D (nameOffset:40) (firstTokenOffset:34) (offset:40)
-          element: <testLibrary>::@class::D
-          constructors
-            #F6 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:40)
-              element: <testLibrary>::@class::D::@constructor::new
-              typeName: D
-  classes
-    isMixinApplication isSimplyBounded class main
-      reference: <testLibrary>::@class::main
-      firstFragment: #F1
-      supertype: C
-      mixins
-        D
-      constructors
-        isOriginMixinApplication new
-          reference: <testLibrary>::@class::main::@constructor::new
-          firstFragment: #F2
-          constantInitializers
-            SuperConstructorInvocation
-              superKeyword: super @0
-              argumentList: ArgumentList
-                leftParenthesis: ( @0
-                rightParenthesis: ) @0
-              element: <testLibrary>::@class::C::@constructor::new
-          superConstructor: <testLibrary>::@class::C::@constructor::new
-    isSimplyBounded class C
-      reference: <testLibrary>::@class::C
-      firstFragment: #F3
-      constructors
-        isOriginImplicitDefault new
-          reference: <testLibrary>::@class::C::@constructor::new
-          firstFragment: #F4
-    isSimplyBounded class D
-      reference: <testLibrary>::@class::D
-      firstFragment: #F5
-      constructors
-        isOriginImplicitDefault new
-          reference: <testLibrary>::@class::D::@constructor::new
-          firstFragment: #F6
-''');
-  }
-
-  test_main_class_alias_via_export() async {
-    newFile(
-      '$testPackageLibPath/a.dart',
-      'class main = C with D; class C {} class D {}',
-    );
-    var library = await buildLibrary('export "a.dart";');
-    checkElementText(library, r'''
-library
-  reference: <testLibrary>
-  fragments
-    #F0 <testLibraryFragment>
-      element: <testLibrary>
-      libraryExports
-        package:test/a.dart
-''');
-  }
-
-  test_main_class_via_export() async {
-    newFile('$testPackageLibPath/a.dart', 'class main {}');
-    var library = await buildLibrary('export "a.dart";');
-    checkElementText(library, r'''
-library
-  reference: <testLibrary>
-  fragments
-    #F0 <testLibraryFragment>
-      element: <testLibrary>
-      libraryExports
-        package:test/a.dart
-''');
-  }
-
-  test_main_getter() async {
-    var library = await buildLibrary('get main => null;');
-    checkElementText(library, r'''
-library
-  reference: <testLibrary>
-  fragments
-    #F0 <testLibraryFragment>
-      element: <testLibrary>
-      topLevelVariables
-        #F1 isOriginGetterSetter isStatic main (nameOffset:<null>) (firstTokenOffset:<null>) (offset:4)
-          element: <testLibrary>::@topLevelVariable::main
-      getters
-        #F2 hasImplicitReturnType isCompleteDeclaration isOriginDeclaration isStatic main (nameOffset:4) (firstTokenOffset:0) (offset:4)
-          element: <testLibrary>::@getter::main
-  topLevelVariables
-    isOriginGetterSetter isStatic main
-      reference: <testLibrary>::@topLevelVariable::main
-      firstFragment: #F1
-      type: dynamic
-      getter: <testLibrary>::@getter::main
-  getters
-    isOriginDeclaration isStatic main
-      reference: <testLibrary>::@getter::main
-      firstFragment: #F2
-      returnType: dynamic
-      variable: <testLibrary>::@topLevelVariable::main
-''');
-  }
-
-  test_main_getter_via_export() async {
-    newFile('$testPackageLibPath/a.dart', 'get main => null;');
-    var library = await buildLibrary('export "a.dart";');
-    checkElementText(library, r'''
-library
-  reference: <testLibrary>
-  fragments
-    #F0 <testLibraryFragment>
-      element: <testLibrary>
-      libraryExports
-        package:test/a.dart
-''');
-  }
-
-  test_main_typedef() async {
-    var library = await buildLibrary('typedef main();');
-    checkElementText(library, r'''
-library
-  reference: <testLibrary>
-  fragments
-    #F0 <testLibraryFragment>
-      element: <testLibrary>
-      typeAliases
-        #F1 main (nameOffset:8) (firstTokenOffset:0) (offset:8)
-          element: <testLibrary>::@typeAlias::main
-  typeAliases
-    isSimplyBounded main
-      reference: <testLibrary>::@typeAlias::main
-      firstFragment: #F1
-      aliasedType: dynamic Function()
-''');
-  }
-
-  test_main_typedef_via_export() async {
-    newFile('$testPackageLibPath/a.dart', 'typedef main();');
-    var library = await buildLibrary('export "a.dart";');
-    checkElementText(library, r'''
-library
-  reference: <testLibrary>
-  fragments
-    #F0 <testLibraryFragment>
-      element: <testLibrary>
-      libraryExports
-        package:test/a.dart
-''');
-  }
-
-  test_main_variable() async {
-    var library = await buildLibrary('var main;');
-    checkElementText(library, r'''
-library
-  reference: <testLibrary>
-  fragments
-    #F0 <testLibraryFragment>
-      element: <testLibrary>
-      topLevelVariables
-        #F1 hasImplicitType isOriginDeclaration isStatic main (nameOffset:4) (firstTokenOffset:4) (offset:4)
-          element: <testLibrary>::@topLevelVariable::main
-      getters
-        #F2 isCompleteDeclaration isOriginVariable isStatic main (nameOffset:<null>) (firstTokenOffset:<null>) (offset:4)
-          element: <testLibrary>::@getter::main
-      setters
-        #F3 isCompleteDeclaration isOriginVariable isStatic main (nameOffset:<null>) (firstTokenOffset:<null>) (offset:4)
-          element: <testLibrary>::@setter::main
-          formalParameters
-            #F4 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:4)
-              element: <testLibrary>::@setter::main::@formalParameter::value
-  topLevelVariables
-    hasImplicitType isOriginDeclaration isStatic main
-      reference: <testLibrary>::@topLevelVariable::main
-      firstFragment: #F1
-      type: dynamic
-      getter: <testLibrary>::@getter::main
-      setter: <testLibrary>::@setter::main
-  getters
-    isOriginVariable isStatic main
-      reference: <testLibrary>::@getter::main
-      firstFragment: #F2
-      returnType: dynamic
-      variable: <testLibrary>::@topLevelVariable::main
-  setters
-    isOriginVariable isStatic main
-      reference: <testLibrary>::@setter::main
-      firstFragment: #F3
-      formalParameters
-        #E0 requiredPositional value
-          firstFragment: #F4
-          type: dynamic
-      returnType: void
-      variable: <testLibrary>::@topLevelVariable::main
-''');
-  }
-
-  test_main_variable_via_export() async {
-    newFile('$testPackageLibPath/a.dart', 'var main;');
-    var library = await buildLibrary('export "a.dart";');
-    checkElementText(library, r'''
-library
-  reference: <testLibrary>
-  fragments
-    #F0 <testLibraryFragment>
-      element: <testLibrary>
-      libraryExports
-        package:test/a.dart
-''');
-  }
-
-  test_setter_missingName() async {
-    var library = await buildLibrary('''
-set (int _) {}
-''');
-    checkElementText(library, r'''
-library
-  reference: <testLibrary>
-  fragments
-    #F0 <testLibraryFragment>
-      element: <testLibrary>
-      functions
-        #F1 hasImplicitReturnType isCompleteDeclaration isOriginDeclaration isStatic set (nameOffset:0) (firstTokenOffset:0) (offset:0)
-          element: <testLibrary>::@function::set
-          formalParameters
-            #F2 requiredPositional isOriginDeclaration _ (nameOffset:9) (firstTokenOffset:5) (offset:9)
-              element: <testLibrary>::@function::set::@formalParameter::_
-  functions
-    isOriginDeclaration isStatic set
-      reference: <testLibrary>::@function::set
-      firstFragment: #F1
-      formalParameters
-        #E0 requiredPositional _
-          firstFragment: #F2
-          type: int
-      returnType: dynamic
-''');
-  }
-}
-
-abstract class TopLevelFunctionElementTest_augmentation
-    extends ElementsBaseTest {
-  test_augment_function() async {
-    var library = await buildLibrary(r'''
-void foo() {}
-augment void foo() {}
-''');
-
-    configuration.withExportScope = true;
-    checkElementText(library, r'''
-library
-  reference: <testLibrary>
-  fragments
-    #F0 <testLibraryFragment>
-      element: <testLibrary>
-      functions
-        #F1 isCompleteDeclaration isOriginDeclaration isStatic foo (nameOffset:5) (firstTokenOffset:0) (offset:5)
-          element: <testLibrary>::@function::foo
-          nextFragment: #F2
-        #F2 isAugmentation isCompleteDeclaration isOriginDeclaration isStatic foo (nameOffset:27) (firstTokenOffset:14) (offset:27)
-          element: <testLibrary>::@function::foo
-          previousFragment: #F1
-  functions
-    isOriginDeclaration isStatic foo
-      reference: <testLibrary>::@function::foo
-      firstFragment: #F1
-      returnType: void
-  exportEntries
-    declared <testLibrary>::@function::foo
-  exportNamespace
-    foo: <testLibrary>::@function::foo
-''');
-  }
-
-  test_augment_getter() async {
-    var library = await buildLibrary(r'''
-int get foo => 0;
-augment void foo() {}
-''');
-
-    checkElementText(library, r'''
-library
-  reference: <testLibrary>
-  fragments
-    #F0 <testLibraryFragment>
-      element: <testLibrary>
-      topLevelVariables
-        #F1 isOriginGetterSetter isStatic foo (nameOffset:<null>) (firstTokenOffset:<null>) (offset:8)
-          element: <testLibrary>::@topLevelVariable::foo
-      getters
-        #F2 isCompleteDeclaration isOriginDeclaration isStatic foo (nameOffset:8) (firstTokenOffset:0) (offset:8)
-          element: <testLibrary>::@getter::foo
-      functions
-        #F3 isAugmentation isCompleteDeclaration isOriginDeclaration isStatic foo (nameOffset:31) (firstTokenOffset:18) (offset:31)
-          element: <testLibrary>::@function::foo
-  topLevelVariables
-    isOriginGetterSetter isStatic foo
-      reference: <testLibrary>::@topLevelVariable::foo
-      firstFragment: #F1
-      type: int
-      getter: <testLibrary>::@getter::foo
-  getters
-    isOriginDeclaration isStatic foo
-      reference: <testLibrary>::@getter::foo
-      firstFragment: #F2
-      returnType: int
-      variable: <testLibrary>::@topLevelVariable::foo
-  functions
-    isOriginDeclaration isStatic foo
-      reference: <testLibrary>::@function::foo
-      firstFragment: #F3
-      previousFragmentOfDifferentKind: #F2
-      returnType: void
-''');
-  }
-
-  test_augment_nothing() async {
-    var library = await buildLibrary(r'''
-augment void foo() {}
-''');
-
-    configuration.withExportScope = true;
-    checkElementText(library, r'''
-library
-  reference: <testLibrary>
-  fragments
-    #F0 <testLibraryFragment>
-      element: <testLibrary>
-      functions
-        #F1 isAugmentation isCompleteDeclaration isOriginDeclaration isStatic foo (nameOffset:13) (firstTokenOffset:0) (offset:13)
-          element: <testLibrary>::@function::foo
-  functions
-    isOriginDeclaration isStatic foo
-      reference: <testLibrary>::@function::foo
-      firstFragment: #F1
-      returnType: void
-  exportEntries
-    declared <testLibrary>::@function::foo
-  exportNamespace
-    foo: <testLibrary>::@function::foo
-''');
-  }
-
-  test_augment_setter() async {
-    var library = await buildLibrary(r'''
-set foo(int _) {}
-augment void foo() {}
-''');
-
-    checkElementText(library, r'''
-library
-  reference: <testLibrary>
-  fragments
-    #F0 <testLibraryFragment>
-      element: <testLibrary>
-      topLevelVariables
-        #F1 isOriginGetterSetter isStatic foo (nameOffset:<null>) (firstTokenOffset:<null>) (offset:4)
-          element: <testLibrary>::@topLevelVariable::foo
-      setters
-        #F2 hasImplicitReturnType isCompleteDeclaration isOriginDeclaration isStatic foo (nameOffset:4) (firstTokenOffset:0) (offset:4)
-          element: <testLibrary>::@setter::foo
-          formalParameters
-            #F3 requiredPositional isOriginDeclaration _ (nameOffset:12) (firstTokenOffset:8) (offset:12)
-              element: <testLibrary>::@setter::foo::@formalParameter::_
-      functions
-        #F4 isAugmentation isCompleteDeclaration isOriginDeclaration isStatic foo (nameOffset:31) (firstTokenOffset:18) (offset:31)
-          element: <testLibrary>::@function::foo
-  topLevelVariables
-    isOriginGetterSetter isStatic foo
-      reference: <testLibrary>::@topLevelVariable::foo
-      firstFragment: #F1
-      type: int
-      setter: <testLibrary>::@setter::foo
-  setters
-    isOriginDeclaration isStatic foo
-      reference: <testLibrary>::@setter::foo
-      firstFragment: #F2
-      formalParameters
-        #E0 requiredPositional _
-          firstFragment: #F3
-          type: int
-      returnType: void
-      variable: <testLibrary>::@topLevelVariable::foo
-  functions
-    isOriginDeclaration isStatic foo
-      reference: <testLibrary>::@function::foo
-      firstFragment: #F4
-      previousFragmentOfDifferentKind: #F2
-      returnType: void
-''');
-  }
-
-  test_augment_variable() async {
-    var library = await buildLibrary(r'''
-int foo = 0;
-augment void foo() {}
-''');
-
-    checkElementText(library, r'''
-library
-  reference: <testLibrary>
-  fragments
-    #F0 <testLibraryFragment>
-      element: <testLibrary>
-      topLevelVariables
-        #F1 hasInitializer isOriginDeclaration isStatic foo (nameOffset:4) (firstTokenOffset:4) (offset:4)
-          element: <testLibrary>::@topLevelVariable::foo
-      getters
-        #F2 isCompleteDeclaration isOriginVariable isStatic foo (nameOffset:<null>) (firstTokenOffset:<null>) (offset:4)
-          element: <testLibrary>::@getter::foo
-      setters
-        #F3 isCompleteDeclaration isOriginVariable isStatic foo (nameOffset:<null>) (firstTokenOffset:<null>) (offset:4)
-          element: <testLibrary>::@setter::foo
-          formalParameters
-            #F4 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:4)
-              element: <testLibrary>::@setter::foo::@formalParameter::value
-      functions
-        #F5 isAugmentation isCompleteDeclaration isOriginDeclaration isStatic foo (nameOffset:26) (firstTokenOffset:13) (offset:26)
-          element: <testLibrary>::@function::foo
-  topLevelVariables
-    hasInitializer isOriginDeclaration isStatic foo
-      reference: <testLibrary>::@topLevelVariable::foo
-      firstFragment: #F1
-      type: int
-      getter: <testLibrary>::@getter::foo
-      setter: <testLibrary>::@setter::foo
-  getters
-    isOriginVariable isStatic foo
-      reference: <testLibrary>::@getter::foo
-      firstFragment: #F2
-      returnType: int
-      variable: <testLibrary>::@topLevelVariable::foo
-  setters
-    isOriginVariable isStatic foo
-      reference: <testLibrary>::@setter::foo
-      firstFragment: #F3
-      formalParameters
-        #E0 requiredPositional value
-          firstFragment: #F4
-          type: int
-      returnType: void
-      variable: <testLibrary>::@topLevelVariable::foo
-  functions
-    isOriginDeclaration isStatic foo
-      reference: <testLibrary>::@function::foo
-      firstFragment: #F5
-      previousFragmentOfDifferentKind: #F1
-      returnType: void
-''');
-  }
-
-  test_augmentationTarget() async {
-    newFile('$testPackageLibPath/a1.dart', r'''
-part of 'test.dart';
-part 'a11.dart';
-part 'a12.dart';
-augment void foo() {}
-''');
-
-    newFile('$testPackageLibPath/a11.dart', r'''
-part of 'a1.dart';
-augment void foo() {}
-''');
-
-    newFile('$testPackageLibPath/a12.dart', r'''
-part of 'a1.dart';
-augment void foo() {}
-''');
-
-    newFile('$testPackageLibPath/a2.dart', r'''
-part of 'test.dart';
-part 'a21.dart';
-part 'a22.dart';
-augment void foo() {}
-''');
-
-    newFile('$testPackageLibPath/a21.dart', r'''
-part of 'a2.dart';
-augment void foo() {}
-''');
-
-    newFile('$testPackageLibPath/a22.dart', r'''
-part of 'a2.dart';
-augment void foo() {}
-''');
-
-    var library = await buildLibrary(r'''
-part 'a1.dart';
-part 'a2.dart';
-void foo() {}
-''');
-
-    checkElementText(library, r'''
-library
-  reference: <testLibrary>
-  fragments
-    #F0 <testLibraryFragment>
-      element: <testLibrary>
-      nextFragment: #F1
-      parts
-        part_0
-          uri: package:test/a1.dart
-          partKeywordOffset: 0
-          unit: #F1
-        part_1
-          uri: package:test/a2.dart
-          partKeywordOffset: 16
-          unit: #F2
-      functions
-        #F3 isCompleteDeclaration isOriginDeclaration isStatic foo (nameOffset:37) (firstTokenOffset:32) (offset:37)
-          element: <testLibrary>::@function::foo
-          nextFragment: #F4
-    #F1 package:test/a1.dart
-      element: <testLibrary>
-      enclosingFragment: #F0
-      previousFragment: #F0
-      nextFragment: #F5
-      parts
-        part_2
-          uri: package:test/a11.dart
-          partKeywordOffset: 21
-          unit: #F5
-        part_3
-          uri: package:test/a12.dart
-          partKeywordOffset: 38
-          unit: #F6
-      functions
-        #F4 isAugmentation isCompleteDeclaration isOriginDeclaration isStatic foo (nameOffset:68) (firstTokenOffset:55) (offset:68)
-          element: <testLibrary>::@function::foo
-          previousFragment: #F3
-          nextFragment: #F7
-    #F5 package:test/a11.dart
-      element: <testLibrary>
-      enclosingFragment: #F1
-      previousFragment: #F1
-      nextFragment: #F6
-      functions
-        #F7 isAugmentation isCompleteDeclaration isOriginDeclaration isStatic foo (nameOffset:32) (firstTokenOffset:19) (offset:32)
-          element: <testLibrary>::@function::foo
-          previousFragment: #F4
-          nextFragment: #F8
-    #F6 package:test/a12.dart
-      element: <testLibrary>
-      enclosingFragment: #F1
-      previousFragment: #F5
-      nextFragment: #F2
-      functions
-        #F8 isAugmentation isCompleteDeclaration isOriginDeclaration isStatic foo (nameOffset:32) (firstTokenOffset:19) (offset:32)
-          element: <testLibrary>::@function::foo
-          previousFragment: #F7
-          nextFragment: #F9
-    #F2 package:test/a2.dart
-      element: <testLibrary>
-      enclosingFragment: #F0
-      previousFragment: #F6
-      nextFragment: #F10
-      parts
-        part_4
-          uri: package:test/a21.dart
-          partKeywordOffset: 21
-          unit: #F10
-        part_5
-          uri: package:test/a22.dart
-          partKeywordOffset: 38
-          unit: #F11
-      functions
-        #F9 isAugmentation isCompleteDeclaration isOriginDeclaration isStatic foo (nameOffset:68) (firstTokenOffset:55) (offset:68)
-          element: <testLibrary>::@function::foo
-          previousFragment: #F8
-          nextFragment: #F12
-    #F10 package:test/a21.dart
-      element: <testLibrary>
-      enclosingFragment: #F2
-      previousFragment: #F2
-      nextFragment: #F11
-      functions
-        #F12 isAugmentation isCompleteDeclaration isOriginDeclaration isStatic foo (nameOffset:32) (firstTokenOffset:19) (offset:32)
-          element: <testLibrary>::@function::foo
-          previousFragment: #F9
-          nextFragment: #F13
-    #F11 package:test/a22.dart
-      element: <testLibrary>
-      enclosingFragment: #F2
-      previousFragment: #F10
-      functions
-        #F13 isAugmentation isCompleteDeclaration isOriginDeclaration isStatic foo (nameOffset:32) (firstTokenOffset:19) (offset:32)
-          element: <testLibrary>::@function::foo
-          previousFragment: #F12
-  functions
-    isOriginDeclaration isStatic foo
-      reference: <testLibrary>::@function::foo
-      firstFragment: #F3
-      returnType: void
-''');
-  }
-
-  test_augments_class() async {
-    var library = await buildLibrary(r'''
-class foo {}
-augment void foo() {}
-''');
-
-    checkElementText(library, r'''
-library
-  reference: <testLibrary>
-  fragments
-    #F0 <testLibraryFragment>
-      element: <testLibrary>
-      classes
-        #F1 class foo (nameOffset:6) (firstTokenOffset:0) (offset:6)
-          element: <testLibrary>::@class::foo
-          constructors
-            #F2 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:6)
-              element: <testLibrary>::@class::foo::@constructor::new
-              typeName: foo
-      functions
-        #F3 isAugmentation isCompleteDeclaration isOriginDeclaration isStatic foo (nameOffset:26) (firstTokenOffset:13) (offset:26)
-          element: <testLibrary>::@function::foo
-  classes
-    isSimplyBounded class foo
-      reference: <testLibrary>::@class::foo
-      firstFragment: #F1
-      constructors
-        isOriginImplicitDefault new
-          reference: <testLibrary>::@class::foo::@constructor::new
-          firstFragment: #F2
-  functions
-    isOriginDeclaration isStatic foo
-      reference: <testLibrary>::@function::foo
-      firstFragment: #F3
-      previousFragmentOfDifferentKind: #F1
-      returnType: void
-''');
-  }
-
   test_formalParameters_rN1__rN1() async {
     var library = await buildLibrary(r'''
 void foo({required int n1}) {}
@@ -3216,10 +1608,60 @@
 ''');
   }
 
-  test_typeParameter() async {
+  test_function_async() async {
     var library = await buildLibrary(r'''
-void foo<T>() {}
-augment void foo<T>() {}
+import 'dart:async';
+
+Future f() async {}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  fragments
+    #F0 <testLibraryFragment>
+      element: <testLibrary>
+      libraryImports
+        dart:async
+      functions
+        #F1 isAsynchronous isCompleteDeclaration isOriginDeclaration isStatic f (nameOffset:29) (firstTokenOffset:22) (offset:29)
+          element: <testLibrary>::@function::f
+  functions
+    isOriginDeclaration isStatic f
+      reference: <testLibrary>::@function::f
+      firstFragment: #F1
+      returnType: Future<dynamic>
+''');
+  }
+
+  test_function_asyncStar() async {
+    var library = await buildLibrary(r'''
+import 'dart:async';
+
+Stream f() async* {}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  fragments
+    #F0 <testLibraryFragment>
+      element: <testLibrary>
+      libraryImports
+        dart:async
+      functions
+        #F1 isAsynchronous isCompleteDeclaration isGenerator isOriginDeclaration isStatic f (nameOffset:29) (firstTokenOffset:22) (offset:29)
+          element: <testLibrary>::@function::f
+  functions
+    isOriginDeclaration isStatic f
+      reference: <testLibrary>::@function::f
+      firstFragment: #F1
+      returnType: Stream<dynamic>
+''');
+  }
+
+  test_function_augmentation_chain() async {
+    var library = await buildLibrary(r'''
+void foo() {}
+augment void foo() {}
 ''');
 
     configuration.withExportScope = true;
@@ -3233,24 +1675,13 @@
         #F1 isCompleteDeclaration isOriginDeclaration isStatic foo (nameOffset:5) (firstTokenOffset:0) (offset:5)
           element: <testLibrary>::@function::foo
           nextFragment: #F2
-          typeParameters
-            #F3 T (nameOffset:9) (firstTokenOffset:9) (offset:9)
-              element: #E0 T
-              nextFragment: #F4
-        #F2 isAugmentation isCompleteDeclaration isOriginDeclaration isStatic foo (nameOffset:30) (firstTokenOffset:17) (offset:30)
+        #F2 isAugmentation isCompleteDeclaration isOriginDeclaration isStatic foo (nameOffset:27) (firstTokenOffset:14) (offset:27)
           element: <testLibrary>::@function::foo
           previousFragment: #F1
-          typeParameters
-            #F4 T (nameOffset:34) (firstTokenOffset:34) (offset:34)
-              element: #E0 T
-              previousFragment: #F3
   functions
     isOriginDeclaration isStatic foo
       reference: <testLibrary>::@function::foo
       firstFragment: #F1
-      typeParameters
-        #E0 T
-          firstFragment: #F3
       returnType: void
   exportEntries
     declared <testLibrary>::@function::foo
@@ -3259,7 +1690,208 @@
 ''');
   }
 
-  test_typeParameters_augmentation_chain_count_111() async {
+  test_function_augmentation_chain_noIntroductoryDeclaration() async {
+    var library = await buildLibrary(r'''
+augment void foo() {}
+''');
+
+    configuration.withExportScope = true;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  fragments
+    #F0 <testLibraryFragment>
+      element: <testLibrary>
+      functions
+        #F1 isAugmentation isCompleteDeclaration isOriginDeclaration isStatic foo (nameOffset:13) (firstTokenOffset:0) (offset:13)
+          element: <testLibrary>::@function::foo
+  functions
+    isOriginDeclaration isStatic foo
+      reference: <testLibrary>::@function::foo
+      firstFragment: #F1
+      returnType: void
+  exportEntries
+    declared <testLibrary>::@function::foo
+  exportNamespace
+    foo: <testLibrary>::@function::foo
+''');
+  }
+
+  test_function_augmentation_chain_partTreePreorder() async {
+    newFile('$testPackageLibPath/a1.dart', r'''
+part of 'test.dart';
+part 'a11.dart';
+part 'a12.dart';
+augment void foo() {}
+''');
+
+    newFile('$testPackageLibPath/a11.dart', r'''
+part of 'a1.dart';
+augment void foo() {}
+''');
+
+    newFile('$testPackageLibPath/a12.dart', r'''
+part of 'a1.dart';
+augment void foo() {}
+''');
+
+    newFile('$testPackageLibPath/a2.dart', r'''
+part of 'test.dart';
+part 'a21.dart';
+part 'a22.dart';
+augment void foo() {}
+''');
+
+    newFile('$testPackageLibPath/a21.dart', r'''
+part of 'a2.dart';
+augment void foo() {}
+''');
+
+    newFile('$testPackageLibPath/a22.dart', r'''
+part of 'a2.dart';
+augment void foo() {}
+''');
+
+    var library = await buildLibrary(r'''
+part 'a1.dart';
+part 'a2.dart';
+
+void foo() {}
+''');
+
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  fragments
+    #F0 <testLibraryFragment>
+      element: <testLibrary>
+      nextFragment: #F1
+      parts
+        part_0
+          uri: package:test/a1.dart
+          partKeywordOffset: 0
+          unit: #F1
+        part_1
+          uri: package:test/a2.dart
+          partKeywordOffset: 16
+          unit: #F2
+      functions
+        #F3 isCompleteDeclaration isOriginDeclaration isStatic foo (nameOffset:38) (firstTokenOffset:33) (offset:38)
+          element: <testLibrary>::@function::foo
+          nextFragment: #F4
+    #F1 package:test/a1.dart
+      element: <testLibrary>
+      enclosingFragment: #F0
+      previousFragment: #F0
+      nextFragment: #F5
+      parts
+        part_2
+          uri: package:test/a11.dart
+          partKeywordOffset: 21
+          unit: #F5
+        part_3
+          uri: package:test/a12.dart
+          partKeywordOffset: 38
+          unit: #F6
+      functions
+        #F4 isAugmentation isCompleteDeclaration isOriginDeclaration isStatic foo (nameOffset:68) (firstTokenOffset:55) (offset:68)
+          element: <testLibrary>::@function::foo
+          previousFragment: #F3
+          nextFragment: #F7
+    #F5 package:test/a11.dart
+      element: <testLibrary>
+      enclosingFragment: #F1
+      previousFragment: #F1
+      nextFragment: #F6
+      functions
+        #F7 isAugmentation isCompleteDeclaration isOriginDeclaration isStatic foo (nameOffset:32) (firstTokenOffset:19) (offset:32)
+          element: <testLibrary>::@function::foo
+          previousFragment: #F4
+          nextFragment: #F8
+    #F6 package:test/a12.dart
+      element: <testLibrary>
+      enclosingFragment: #F1
+      previousFragment: #F5
+      nextFragment: #F2
+      functions
+        #F8 isAugmentation isCompleteDeclaration isOriginDeclaration isStatic foo (nameOffset:32) (firstTokenOffset:19) (offset:32)
+          element: <testLibrary>::@function::foo
+          previousFragment: #F7
+          nextFragment: #F9
+    #F2 package:test/a2.dart
+      element: <testLibrary>
+      enclosingFragment: #F0
+      previousFragment: #F6
+      nextFragment: #F10
+      parts
+        part_4
+          uri: package:test/a21.dart
+          partKeywordOffset: 21
+          unit: #F10
+        part_5
+          uri: package:test/a22.dart
+          partKeywordOffset: 38
+          unit: #F11
+      functions
+        #F9 isAugmentation isCompleteDeclaration isOriginDeclaration isStatic foo (nameOffset:68) (firstTokenOffset:55) (offset:68)
+          element: <testLibrary>::@function::foo
+          previousFragment: #F8
+          nextFragment: #F12
+    #F10 package:test/a21.dart
+      element: <testLibrary>
+      enclosingFragment: #F2
+      previousFragment: #F2
+      nextFragment: #F11
+      functions
+        #F12 isAugmentation isCompleteDeclaration isOriginDeclaration isStatic foo (nameOffset:32) (firstTokenOffset:19) (offset:32)
+          element: <testLibrary>::@function::foo
+          previousFragment: #F9
+          nextFragment: #F13
+    #F11 package:test/a22.dart
+      element: <testLibrary>
+      enclosingFragment: #F2
+      previousFragment: #F10
+      functions
+        #F13 isAugmentation isCompleteDeclaration isOriginDeclaration isStatic foo (nameOffset:32) (firstTokenOffset:19) (offset:32)
+          element: <testLibrary>::@function::foo
+          previousFragment: #F12
+  functions
+    isOriginDeclaration isStatic foo
+      reference: <testLibrary>::@function::foo
+      firstFragment: #F3
+      returnType: void
+''');
+  }
+
+  test_function_augmentation_chain_returnType_void_int() async {
+    var library = await buildLibrary(r'''
+void foo() {}
+augment int foo() => 0;
+''');
+
+    configuration.withConstructors = false;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  fragments
+    #F0 <testLibraryFragment>
+      element: <testLibrary>
+      functions
+        #F1 isCompleteDeclaration isOriginDeclaration isStatic foo (nameOffset:5) (firstTokenOffset:0) (offset:5)
+          element: <testLibrary>::@function::foo
+          nextFragment: #F2
+        #F2 isAugmentation isCompleteDeclaration isOriginDeclaration isStatic foo (nameOffset:26) (firstTokenOffset:14) (offset:26)
+          element: <testLibrary>::@function::foo
+          previousFragment: #F1
+  functions
+    isOriginDeclaration isStatic foo
+      reference: <testLibrary>::@function::foo
+      firstFragment: #F1
+      returnType: void
+''');
+  }
+
+  test_function_augmentation_chain_typeParameters_count_111() async {
     var library = await buildLibrary(r'''
 void foo<T>() {}
 augment void foo<T>() {}
@@ -3308,7 +1940,7 @@
 ''');
   }
 
-  test_typeParameters_augmentation_chain_count_112() async {
+  test_function_augmentation_chain_typeParameters_count_112() async {
     var library = await buildLibrary(r'''
 void foo<T>() {}
 augment void foo<T>() {}
@@ -3368,7 +2000,7 @@
 ''');
   }
 
-  test_typeParameters_augmentation_chain_count_121() async {
+  test_function_augmentation_chain_typeParameters_count_121() async {
     var library = await buildLibrary(r'''
 void foo<T>() {}
 augment void foo<T, U>() {}
@@ -3429,7 +2061,7 @@
 ''');
   }
 
-  test_typeParameters_augmentation_chain_count_123() async {
+  test_function_augmentation_chain_typeParameters_count_123() async {
     var library = await buildLibrary(r'''
 void foo<T>() {}
 augment void foo<T, U>() {}
@@ -3501,7 +2133,7 @@
 ''');
   }
 
-  test_typeParameters_augmentation_chain_count_211() async {
+  test_function_augmentation_chain_typeParameters_count_211() async {
     var library = await buildLibrary(r'''
 void foo<T, U>() {}
 augment void foo<T>() {}
@@ -3561,7 +2193,7 @@
 ''');
   }
 
-  test_typeParameters_augmentation_chain_count_212() async {
+  test_function_augmentation_chain_typeParameters_count_212() async {
     var library = await buildLibrary(r'''
 void foo<T, U>() {}
 augment void foo<T>() {}
@@ -3622,6 +2254,1482 @@
 ''');
   }
 
+  test_function_augmentation_sameName_class() async {
+    var library = await buildLibrary(r'''
+class foo {}
+augment void foo() {}
+''');
+
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  fragments
+    #F0 <testLibraryFragment>
+      element: <testLibrary>
+      classes
+        #F1 class foo (nameOffset:6) (firstTokenOffset:0) (offset:6)
+          element: <testLibrary>::@class::foo
+          constructors
+            #F2 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:6)
+              element: <testLibrary>::@class::foo::@constructor::new
+              typeName: foo
+      functions
+        #F3 isAugmentation isCompleteDeclaration isOriginDeclaration isStatic foo (nameOffset:26) (firstTokenOffset:13) (offset:26)
+          element: <testLibrary>::@function::foo
+  classes
+    isSimplyBounded class foo
+      reference: <testLibrary>::@class::foo
+      firstFragment: #F1
+      constructors
+        isOriginImplicitDefault new
+          reference: <testLibrary>::@class::foo::@constructor::new
+          firstFragment: #F2
+  functions
+    isOriginDeclaration isStatic foo
+      reference: <testLibrary>::@function::foo
+      firstFragment: #F3
+      previousFragmentOfDifferentKind: #F1
+      returnType: void
+''');
+  }
+
+  test_function_augmentation_sameName_getter() async {
+    var library = await buildLibrary(r'''
+int get foo => 0;
+augment void foo() {}
+''');
+
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  fragments
+    #F0 <testLibraryFragment>
+      element: <testLibrary>
+      topLevelVariables
+        #F1 isOriginGetterSetter isStatic foo (nameOffset:<null>) (firstTokenOffset:<null>) (offset:8)
+          element: <testLibrary>::@topLevelVariable::foo
+      getters
+        #F2 isCompleteDeclaration isOriginDeclaration isStatic foo (nameOffset:8) (firstTokenOffset:0) (offset:8)
+          element: <testLibrary>::@getter::foo
+      functions
+        #F3 isAugmentation isCompleteDeclaration isOriginDeclaration isStatic foo (nameOffset:31) (firstTokenOffset:18) (offset:31)
+          element: <testLibrary>::@function::foo
+  topLevelVariables
+    isOriginGetterSetter isStatic foo
+      reference: <testLibrary>::@topLevelVariable::foo
+      firstFragment: #F1
+      type: int
+      getter: <testLibrary>::@getter::foo
+  getters
+    isOriginDeclaration isStatic foo
+      reference: <testLibrary>::@getter::foo
+      firstFragment: #F2
+      returnType: int
+      variable: <testLibrary>::@topLevelVariable::foo
+  functions
+    isOriginDeclaration isStatic foo
+      reference: <testLibrary>::@function::foo
+      firstFragment: #F3
+      previousFragmentOfDifferentKind: #F2
+      returnType: void
+''');
+  }
+
+  test_function_augmentation_sameName_setter() async {
+    var library = await buildLibrary(r'''
+set foo(int _) {}
+augment void foo() {}
+''');
+
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  fragments
+    #F0 <testLibraryFragment>
+      element: <testLibrary>
+      topLevelVariables
+        #F1 isOriginGetterSetter isStatic foo (nameOffset:<null>) (firstTokenOffset:<null>) (offset:4)
+          element: <testLibrary>::@topLevelVariable::foo
+      setters
+        #F2 hasImplicitReturnType isCompleteDeclaration isOriginDeclaration isStatic foo (nameOffset:4) (firstTokenOffset:0) (offset:4)
+          element: <testLibrary>::@setter::foo
+          formalParameters
+            #F3 requiredPositional isOriginDeclaration _ (nameOffset:12) (firstTokenOffset:8) (offset:12)
+              element: <testLibrary>::@setter::foo::@formalParameter::_
+      functions
+        #F4 isAugmentation isCompleteDeclaration isOriginDeclaration isStatic foo (nameOffset:31) (firstTokenOffset:18) (offset:31)
+          element: <testLibrary>::@function::foo
+  topLevelVariables
+    isOriginGetterSetter isStatic foo
+      reference: <testLibrary>::@topLevelVariable::foo
+      firstFragment: #F1
+      type: int
+      setter: <testLibrary>::@setter::foo
+  setters
+    isOriginDeclaration isStatic foo
+      reference: <testLibrary>::@setter::foo
+      firstFragment: #F2
+      formalParameters
+        #E0 requiredPositional _
+          firstFragment: #F3
+          type: int
+      returnType: void
+      variable: <testLibrary>::@topLevelVariable::foo
+  functions
+    isOriginDeclaration isStatic foo
+      reference: <testLibrary>::@function::foo
+      firstFragment: #F4
+      previousFragmentOfDifferentKind: #F2
+      returnType: void
+''');
+  }
+
+  test_function_augmentation_sameName_variable() async {
+    var library = await buildLibrary(r'''
+int foo = 0;
+augment void foo() {}
+''');
+
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  fragments
+    #F0 <testLibraryFragment>
+      element: <testLibrary>
+      topLevelVariables
+        #F1 hasInitializer isOriginDeclaration isStatic foo (nameOffset:4) (firstTokenOffset:4) (offset:4)
+          element: <testLibrary>::@topLevelVariable::foo
+      getters
+        #F2 isCompleteDeclaration isOriginVariable isStatic foo (nameOffset:<null>) (firstTokenOffset:<null>) (offset:4)
+          element: <testLibrary>::@getter::foo
+      setters
+        #F3 isCompleteDeclaration isOriginVariable isStatic foo (nameOffset:<null>) (firstTokenOffset:<null>) (offset:4)
+          element: <testLibrary>::@setter::foo
+          formalParameters
+            #F4 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:4)
+              element: <testLibrary>::@setter::foo::@formalParameter::value
+      functions
+        #F5 isAugmentation isCompleteDeclaration isOriginDeclaration isStatic foo (nameOffset:26) (firstTokenOffset:13) (offset:26)
+          element: <testLibrary>::@function::foo
+  topLevelVariables
+    hasInitializer isOriginDeclaration isStatic foo
+      reference: <testLibrary>::@topLevelVariable::foo
+      firstFragment: #F1
+      type: int
+      getter: <testLibrary>::@getter::foo
+      setter: <testLibrary>::@setter::foo
+  getters
+    isOriginVariable isStatic foo
+      reference: <testLibrary>::@getter::foo
+      firstFragment: #F2
+      returnType: int
+      variable: <testLibrary>::@topLevelVariable::foo
+  setters
+    isOriginVariable isStatic foo
+      reference: <testLibrary>::@setter::foo
+      firstFragment: #F3
+      formalParameters
+        #E0 requiredPositional value
+          firstFragment: #F4
+          type: int
+      returnType: void
+      variable: <testLibrary>::@topLevelVariable::foo
+  functions
+    isOriginDeclaration isStatic foo
+      reference: <testLibrary>::@function::foo
+      firstFragment: #F5
+      previousFragmentOfDifferentKind: #F1
+      returnType: void
+''');
+  }
+
+  test_function_documented() async {
+    var library = await buildLibrary(r'''
+// Extra comment so doc comment offset != 0
+/**
+ * Docs
+ */
+f() {}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  fragments
+    #F0 <testLibraryFragment>
+      element: <testLibrary>
+      functions
+        #F1 hasImplicitReturnType isCompleteDeclaration isOriginDeclaration isStatic f (nameOffset:60) (firstTokenOffset:44) (offset:60)
+          element: <testLibrary>::@function::f
+          documentationComment: /**\n * Docs\n */
+  functions
+    isOriginDeclaration isStatic f
+      reference: <testLibrary>::@function::f
+      firstFragment: #F1
+      documentationComment: /**\n * Docs\n */
+      returnType: dynamic
+''');
+  }
+
+  test_function_entry_point() async {
+    var library = await buildLibrary(r'''
+main() {}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  fragments
+    #F0 <testLibraryFragment>
+      element: <testLibrary>
+      functions
+        #F1 hasImplicitReturnType isCompleteDeclaration isOriginDeclaration isStatic main (nameOffset:0) (firstTokenOffset:0) (offset:0)
+          element: <testLibrary>::@function::main
+  functions
+    isOriginDeclaration isStatic main
+      reference: <testLibrary>::@function::main
+      firstFragment: #F1
+      returnType: dynamic
+''');
+  }
+
+  test_function_entry_point_in_export() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+library a;
+main() {}
+''');
+    var library = await buildLibrary(r'''
+export "a.dart";
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  fragments
+    #F0 <testLibraryFragment>
+      element: <testLibrary>
+      libraryExports
+        package:test/a.dart
+''');
+  }
+
+  test_function_entry_point_in_export_hidden() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+library a;
+main() {}
+''');
+    var library = await buildLibrary(r'''
+export "a.dart" hide main;
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  fragments
+    #F0 <testLibraryFragment>
+      element: <testLibrary>
+      libraryExports
+        package:test/a.dart
+          combinators
+            hide: main
+''');
+  }
+
+  test_function_entry_point_in_part() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+part of my.lib;
+main() {}
+''');
+    var library = await buildLibrary(r'''
+library my.lib;
+
+part "a.dart";
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  name: my.lib
+  fragments
+    #F0 <testLibraryFragment> (nameOffset:<null>) (firstTokenOffset:0) (offset:8)
+      element: <testLibrary>
+      nextFragment: #F1
+      parts
+        part_0
+          uri: package:test/a.dart
+          partKeywordOffset: 17
+          unit: #F1
+    #F1 package:test/a.dart
+      element: <testLibrary>
+      enclosingFragment: #F0
+      previousFragment: #F0
+      functions
+        #F2 hasImplicitReturnType isCompleteDeclaration isOriginDeclaration isStatic main (nameOffset:16) (firstTokenOffset:16) (offset:16)
+          element: <testLibrary>::@function::main
+  functions
+    isOriginDeclaration isStatic main
+      reference: <testLibrary>::@function::main
+      firstFragment: #F2
+      returnType: dynamic
+''');
+  }
+
+  test_function_external() async {
+    var library = await buildLibrary(r'''
+external f();
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  fragments
+    #F0 <testLibraryFragment>
+      element: <testLibrary>
+      functions
+        #F1 hasImplicitReturnType isCompleteDeclaration isExternal isOriginDeclaration isStatic f (nameOffset:9) (firstTokenOffset:0) (offset:9)
+          element: <testLibrary>::@function::f
+  functions
+    isExternal isOriginDeclaration isStatic f
+      reference: <testLibrary>::@function::f
+      firstFragment: #F1
+      returnType: dynamic
+''');
+  }
+
+  test_function_hasImplicitReturnType_false() async {
+    var library = await buildLibrary(r'''
+int f() => 0;
+''');
+    var f = library.firstFragment.functions.single;
+    expect(f.hasImplicitReturnType, isFalse);
+  }
+
+  test_function_hasImplicitReturnType_true() async {
+    var library = await buildLibrary(r'''
+f() => 0;
+''');
+    var f = library.firstFragment.functions.single;
+    expect(f.hasImplicitReturnType, isTrue);
+  }
+
+  test_function_loadLibrary_declared() async {
+    var library = await buildLibrary(r'''
+void loadLibrary() {}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  fragments
+    #F0 <testLibraryFragment>
+      element: <testLibrary>
+      functions
+        #F1 isCompleteDeclaration isOriginDeclaration isStatic loadLibrary (nameOffset:5) (firstTokenOffset:0) (offset:5)
+          element: <testLibrary>::@function::loadLibrary#1
+  functions
+    isOriginDeclaration isStatic loadLibrary
+      reference: <testLibrary>::@function::loadLibrary#1
+      firstFragment: #F1
+      returnType: void
+''');
+  }
+
+  test_function_missingName() async {
+    var library = await buildLibrary(r'''
+() {}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  fragments
+    #F0 <testLibraryFragment>
+      element: <testLibrary>
+''');
+  }
+
+  test_function_parameter_const() async {
+    var library = await buildLibrary(r'''
+void f(const x) {}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  fragments
+    #F0 <testLibraryFragment>
+      element: <testLibrary>
+      functions
+        #F1 isCompleteDeclaration isOriginDeclaration isStatic f (nameOffset:5) (firstTokenOffset:0) (offset:5)
+          element: <testLibrary>::@function::f
+          formalParameters
+            #F2 requiredPositional hasImplicitType isOriginDeclaration x (nameOffset:13) (firstTokenOffset:7) (offset:13)
+              element: <testLibrary>::@function::f::@formalParameter::x
+  functions
+    isOriginDeclaration isStatic f
+      reference: <testLibrary>::@function::f
+      firstFragment: #F1
+      formalParameters
+        #E0 requiredPositional hasImplicitType x
+          firstFragment: #F2
+          type: dynamic
+      returnType: void
+''');
+  }
+
+  test_function_parameter_fieldFormal() async {
+    var library = await buildLibrary(r'''
+void f(int this.a) {}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  fragments
+    #F0 <testLibraryFragment>
+      element: <testLibrary>
+      functions
+        #F1 isCompleteDeclaration isOriginDeclaration isStatic f (nameOffset:5) (firstTokenOffset:0) (offset:5)
+          element: <testLibrary>::@function::f
+          formalParameters
+            #F2 requiredPositional isFinal isOriginDeclaration this.a (nameOffset:16) (firstTokenOffset:7) (offset:16)
+              element: <testLibrary>::@function::f::@formalParameter::a
+  functions
+    isOriginDeclaration isStatic f
+      reference: <testLibrary>::@function::f
+      firstFragment: #F1
+      formalParameters
+        #E0 requiredPositional isFinal this.a
+          firstFragment: #F2
+          type: int
+          field: <null>
+      returnType: void
+''');
+  }
+
+  test_function_parameter_fieldFormal_default() async {
+    var library = await buildLibrary(r'''
+void f({int this.a: 42}) {}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  fragments
+    #F0 <testLibraryFragment>
+      element: <testLibrary>
+      functions
+        #F1 isCompleteDeclaration isOriginDeclaration isStatic f (nameOffset:5) (firstTokenOffset:0) (offset:5)
+          element: <testLibrary>::@function::f
+          formalParameters
+            #F2 optionalNamed isFinal isOriginDeclaration this.a (nameOffset:17) (firstTokenOffset:8) (offset:17)
+              element: <testLibrary>::@function::f::@formalParameter::a
+              initializer: expression_0
+                IntegerLiteral
+                  literal: 42 @20
+                  staticType: int
+  functions
+    isOriginDeclaration isStatic f
+      reference: <testLibrary>::@function::f
+      firstFragment: #F1
+      formalParameters
+        #E0 optionalNamed hasDefaultValue isFinal this.a
+          firstFragment: #F2
+          type: int
+          constantInitializer
+            fragment: #F2
+            expression: expression_0
+          field: <null>
+      returnType: void
+''');
+  }
+
+  test_function_parameter_fieldFormal_functionTyped() async {
+    var library = await buildLibrary(r'''
+void f(int this.a(int b)) {}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  fragments
+    #F0 <testLibraryFragment>
+      element: <testLibrary>
+      functions
+        #F1 isCompleteDeclaration isOriginDeclaration isStatic f (nameOffset:5) (firstTokenOffset:0) (offset:5)
+          element: <testLibrary>::@function::f
+          formalParameters
+            #F2 requiredPositional isFinal isOriginDeclaration this.a (nameOffset:16) (firstTokenOffset:7) (offset:16)
+              element: <testLibrary>::@function::f::@formalParameter::a
+              parameters
+                #F3 requiredPositional isOriginDeclaration b (nameOffset:22) (firstTokenOffset:18) (offset:22)
+                  element: b@22
+  functions
+    isOriginDeclaration isStatic f
+      reference: <testLibrary>::@function::f
+      firstFragment: #F1
+      formalParameters
+        #E0 requiredPositional isFinal this.a
+          firstFragment: #F2
+          type: int Function(int)
+          formalParameters
+            #E1 requiredPositional b
+              firstFragment: #F3
+              type: int
+          field: <null>
+      returnType: void
+''');
+  }
+
+  test_function_parameter_final() async {
+    var library = await buildLibrary(r'''
+f(final x) {}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  fragments
+    #F0 <testLibraryFragment>
+      element: <testLibrary>
+      functions
+        #F1 hasImplicitReturnType isCompleteDeclaration isOriginDeclaration isStatic f (nameOffset:0) (firstTokenOffset:0) (offset:0)
+          element: <testLibrary>::@function::f
+          formalParameters
+            #F2 requiredPositional hasImplicitType isFinal isOriginDeclaration x (nameOffset:8) (firstTokenOffset:2) (offset:8)
+              element: <testLibrary>::@function::f::@formalParameter::x
+  functions
+    isOriginDeclaration isStatic f
+      reference: <testLibrary>::@function::f
+      firstFragment: #F1
+      formalParameters
+        #E0 requiredPositional hasImplicitType isFinal x
+          firstFragment: #F2
+          type: dynamic
+      returnType: dynamic
+''');
+  }
+
+  test_function_parameter_kind_named() async {
+    var library = await buildLibrary(r'''
+f({x}) {}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  fragments
+    #F0 <testLibraryFragment>
+      element: <testLibrary>
+      functions
+        #F1 hasImplicitReturnType isCompleteDeclaration isOriginDeclaration isStatic f (nameOffset:0) (firstTokenOffset:0) (offset:0)
+          element: <testLibrary>::@function::f
+          formalParameters
+            #F2 optionalNamed hasImplicitType isOriginDeclaration x (nameOffset:3) (firstTokenOffset:3) (offset:3)
+              element: <testLibrary>::@function::f::@formalParameter::x
+  functions
+    isOriginDeclaration isStatic f
+      reference: <testLibrary>::@function::f
+      firstFragment: #F1
+      formalParameters
+        #E0 optionalNamed hasImplicitType x
+          firstFragment: #F2
+          type: dynamic
+      returnType: dynamic
+''');
+  }
+
+  test_function_parameter_kind_positional() async {
+    var library = await buildLibrary(r'''
+f([x]) {}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  fragments
+    #F0 <testLibraryFragment>
+      element: <testLibrary>
+      functions
+        #F1 hasImplicitReturnType isCompleteDeclaration isOriginDeclaration isStatic f (nameOffset:0) (firstTokenOffset:0) (offset:0)
+          element: <testLibrary>::@function::f
+          formalParameters
+            #F2 optionalPositional hasImplicitType isOriginDeclaration x (nameOffset:3) (firstTokenOffset:3) (offset:3)
+              element: <testLibrary>::@function::f::@formalParameter::x
+  functions
+    isOriginDeclaration isStatic f
+      reference: <testLibrary>::@function::f
+      firstFragment: #F1
+      formalParameters
+        #E0 optionalPositional hasImplicitType x
+          firstFragment: #F2
+          type: dynamic
+      returnType: dynamic
+''');
+  }
+
+  test_function_parameter_kind_required() async {
+    var library = await buildLibrary(r'''
+f(x) {}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  fragments
+    #F0 <testLibraryFragment>
+      element: <testLibrary>
+      functions
+        #F1 hasImplicitReturnType isCompleteDeclaration isOriginDeclaration isStatic f (nameOffset:0) (firstTokenOffset:0) (offset:0)
+          element: <testLibrary>::@function::f
+          formalParameters
+            #F2 requiredPositional hasImplicitType isOriginDeclaration x (nameOffset:2) (firstTokenOffset:2) (offset:2)
+              element: <testLibrary>::@function::f::@formalParameter::x
+  functions
+    isOriginDeclaration isStatic f
+      reference: <testLibrary>::@function::f
+      firstFragment: #F1
+      formalParameters
+        #E0 requiredPositional hasImplicitType x
+          firstFragment: #F2
+          type: dynamic
+      returnType: dynamic
+''');
+  }
+
+  test_function_parameter_parameters() async {
+    var library = await buildLibrary(r'''
+f(g(x, y)) {}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  fragments
+    #F0 <testLibraryFragment>
+      element: <testLibrary>
+      functions
+        #F1 hasImplicitReturnType isCompleteDeclaration isOriginDeclaration isStatic f (nameOffset:0) (firstTokenOffset:0) (offset:0)
+          element: <testLibrary>::@function::f
+          formalParameters
+            #F2 requiredPositional isOriginDeclaration g (nameOffset:2) (firstTokenOffset:2) (offset:2)
+              element: <testLibrary>::@function::f::@formalParameter::g
+              parameters
+                #F3 requiredPositional hasImplicitType isOriginDeclaration x (nameOffset:4) (firstTokenOffset:4) (offset:4)
+                  element: x@4
+                #F4 requiredPositional hasImplicitType isOriginDeclaration y (nameOffset:7) (firstTokenOffset:7) (offset:7)
+                  element: y@7
+  functions
+    isOriginDeclaration isStatic f
+      reference: <testLibrary>::@function::f
+      firstFragment: #F1
+      formalParameters
+        #E0 requiredPositional g
+          firstFragment: #F2
+          type: dynamic Function(dynamic, dynamic)
+          formalParameters
+            #E1 requiredPositional hasImplicitType x
+              firstFragment: #F3
+              type: dynamic
+            #E2 requiredPositional hasImplicitType y
+              firstFragment: #F4
+              type: dynamic
+      returnType: dynamic
+''');
+  }
+
+  test_function_parameter_return_type() async {
+    var library = await buildLibrary(r'''
+f(int g()) {}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  fragments
+    #F0 <testLibraryFragment>
+      element: <testLibrary>
+      functions
+        #F1 hasImplicitReturnType isCompleteDeclaration isOriginDeclaration isStatic f (nameOffset:0) (firstTokenOffset:0) (offset:0)
+          element: <testLibrary>::@function::f
+          formalParameters
+            #F2 requiredPositional isOriginDeclaration g (nameOffset:6) (firstTokenOffset:2) (offset:6)
+              element: <testLibrary>::@function::f::@formalParameter::g
+  functions
+    isOriginDeclaration isStatic f
+      reference: <testLibrary>::@function::f
+      firstFragment: #F1
+      formalParameters
+        #E0 requiredPositional g
+          firstFragment: #F2
+          type: int Function()
+      returnType: dynamic
+''');
+  }
+
+  test_function_parameter_return_type_void() async {
+    var library = await buildLibrary(r'''
+f(void g()) {}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  fragments
+    #F0 <testLibraryFragment>
+      element: <testLibrary>
+      functions
+        #F1 hasImplicitReturnType isCompleteDeclaration isOriginDeclaration isStatic f (nameOffset:0) (firstTokenOffset:0) (offset:0)
+          element: <testLibrary>::@function::f
+          formalParameters
+            #F2 requiredPositional isOriginDeclaration g (nameOffset:7) (firstTokenOffset:2) (offset:7)
+              element: <testLibrary>::@function::f::@formalParameter::g
+  functions
+    isOriginDeclaration isStatic f
+      reference: <testLibrary>::@function::f
+      firstFragment: #F1
+      formalParameters
+        #E0 requiredPositional g
+          firstFragment: #F2
+          type: void Function()
+      returnType: dynamic
+''');
+  }
+
+  test_function_parameter_type() async {
+    var library = await buildLibrary(r'''
+f(int i) {}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  fragments
+    #F0 <testLibraryFragment>
+      element: <testLibrary>
+      functions
+        #F1 hasImplicitReturnType isCompleteDeclaration isOriginDeclaration isStatic f (nameOffset:0) (firstTokenOffset:0) (offset:0)
+          element: <testLibrary>::@function::f
+          formalParameters
+            #F2 requiredPositional isOriginDeclaration i (nameOffset:6) (firstTokenOffset:2) (offset:6)
+              element: <testLibrary>::@function::f::@formalParameter::i
+  functions
+    isOriginDeclaration isStatic f
+      reference: <testLibrary>::@function::f
+      firstFragment: #F1
+      formalParameters
+        #E0 requiredPositional i
+          firstFragment: #F2
+          type: int
+      returnType: dynamic
+''');
+  }
+
+  test_function_parameter_type_typeParameter() async {
+    var library = await buildLibrary(r'''
+void f<T>(T a) {}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  fragments
+    #F0 <testLibraryFragment>
+      element: <testLibrary>
+      functions
+        #F1 isCompleteDeclaration isOriginDeclaration isStatic f (nameOffset:5) (firstTokenOffset:0) (offset:5)
+          element: <testLibrary>::@function::f
+          typeParameters
+            #F2 T (nameOffset:7) (firstTokenOffset:7) (offset:7)
+              element: #E0 T
+          formalParameters
+            #F3 requiredPositional isOriginDeclaration a (nameOffset:12) (firstTokenOffset:10) (offset:12)
+              element: <testLibrary>::@function::f::@formalParameter::a
+  functions
+    isOriginDeclaration isStatic f
+      reference: <testLibrary>::@function::f
+      firstFragment: #F1
+      typeParameters
+        #E0 T
+          firstFragment: #F2
+      formalParameters
+        #E1 requiredPositional a
+          firstFragment: #F3
+          type: T
+      returnType: void
+''');
+  }
+
+  test_function_parameter_type_unresolved() async {
+    var library = await buildLibrary(r'''
+void f(A a) {}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  fragments
+    #F0 <testLibraryFragment>
+      element: <testLibrary>
+      functions
+        #F1 isCompleteDeclaration isOriginDeclaration isStatic f (nameOffset:5) (firstTokenOffset:0) (offset:5)
+          element: <testLibrary>::@function::f
+          formalParameters
+            #F2 requiredPositional isOriginDeclaration a (nameOffset:9) (firstTokenOffset:7) (offset:9)
+              element: <testLibrary>::@function::f::@formalParameter::a
+  functions
+    isOriginDeclaration isStatic f
+      reference: <testLibrary>::@function::f
+      firstFragment: #F1
+      formalParameters
+        #E0 requiredPositional a
+          firstFragment: #F2
+          type: InvalidType
+      returnType: void
+''');
+  }
+
+  test_function_parameters() async {
+    var library = await buildLibrary(r'''
+f(x, y) {}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  fragments
+    #F0 <testLibraryFragment>
+      element: <testLibrary>
+      functions
+        #F1 hasImplicitReturnType isCompleteDeclaration isOriginDeclaration isStatic f (nameOffset:0) (firstTokenOffset:0) (offset:0)
+          element: <testLibrary>::@function::f
+          formalParameters
+            #F2 requiredPositional hasImplicitType isOriginDeclaration x (nameOffset:2) (firstTokenOffset:2) (offset:2)
+              element: <testLibrary>::@function::f::@formalParameter::x
+            #F3 requiredPositional hasImplicitType isOriginDeclaration y (nameOffset:5) (firstTokenOffset:5) (offset:5)
+              element: <testLibrary>::@function::f::@formalParameter::y
+  functions
+    isOriginDeclaration isStatic f
+      reference: <testLibrary>::@function::f
+      firstFragment: #F1
+      formalParameters
+        #E0 requiredPositional hasImplicitType x
+          firstFragment: #F2
+          type: dynamic
+        #E1 requiredPositional hasImplicitType y
+          firstFragment: #F3
+          type: dynamic
+      returnType: dynamic
+''');
+  }
+
+  test_function_return_type_implicit() async {
+    var library = await buildLibrary(r'''
+f() => null;
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  fragments
+    #F0 <testLibraryFragment>
+      element: <testLibrary>
+      functions
+        #F1 hasImplicitReturnType isCompleteDeclaration isOriginDeclaration isStatic f (nameOffset:0) (firstTokenOffset:0) (offset:0)
+          element: <testLibrary>::@function::f
+  functions
+    isOriginDeclaration isStatic f
+      reference: <testLibrary>::@function::f
+      firstFragment: #F1
+      returnType: dynamic
+''');
+  }
+
+  test_function_return_type_unresolved() async {
+    var library = await buildLibrary(r'''
+A f() {}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  fragments
+    #F0 <testLibraryFragment>
+      element: <testLibrary>
+      functions
+        #F1 isCompleteDeclaration isOriginDeclaration isStatic f (nameOffset:2) (firstTokenOffset:0) (offset:2)
+          element: <testLibrary>::@function::f
+  functions
+    isOriginDeclaration isStatic f
+      reference: <testLibrary>::@function::f
+      firstFragment: #F1
+      returnType: InvalidType
+''');
+  }
+
+  test_function_return_type_void() async {
+    var library = await buildLibrary(r'''
+void f() {}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  fragments
+    #F0 <testLibraryFragment>
+      element: <testLibrary>
+      functions
+        #F1 isCompleteDeclaration isOriginDeclaration isStatic f (nameOffset:5) (firstTokenOffset:0) (offset:5)
+          element: <testLibrary>::@function::f
+  functions
+    isOriginDeclaration isStatic f
+      reference: <testLibrary>::@function::f
+      firstFragment: #F1
+      returnType: void
+''');
+  }
+
+  test_function_returnType() async {
+    var library = await buildLibrary(r'''
+int f() => 0;
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  fragments
+    #F0 <testLibraryFragment>
+      element: <testLibrary>
+      functions
+        #F1 isCompleteDeclaration isOriginDeclaration isStatic f (nameOffset:4) (firstTokenOffset:0) (offset:4)
+          element: <testLibrary>::@function::f
+  functions
+    isOriginDeclaration isStatic f
+      reference: <testLibrary>::@function::f
+      firstFragment: #F1
+      returnType: int
+''');
+  }
+
+  test_function_returnType_typeParameter() async {
+    var library = await buildLibrary(r'''
+T f<T>() => throw 0;
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  fragments
+    #F0 <testLibraryFragment>
+      element: <testLibrary>
+      functions
+        #F1 isCompleteDeclaration isOriginDeclaration isStatic f (nameOffset:2) (firstTokenOffset:0) (offset:2)
+          element: <testLibrary>::@function::f
+          typeParameters
+            #F2 T (nameOffset:4) (firstTokenOffset:4) (offset:4)
+              element: #E0 T
+  functions
+    isOriginDeclaration isStatic f
+      reference: <testLibrary>::@function::f
+      firstFragment: #F1
+      typeParameters
+        #E0 T
+          firstFragment: #F2
+      returnType: T
+''');
+  }
+
+  test_function_type_parameter_with_function_typed_parameter() async {
+    var library = await buildLibrary(r'''
+void f<T, U>(T x(U u)) {}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  fragments
+    #F0 <testLibraryFragment>
+      element: <testLibrary>
+      functions
+        #F1 isCompleteDeclaration isOriginDeclaration isStatic f (nameOffset:5) (firstTokenOffset:0) (offset:5)
+          element: <testLibrary>::@function::f
+          typeParameters
+            #F2 T (nameOffset:7) (firstTokenOffset:7) (offset:7)
+              element: #E0 T
+            #F3 U (nameOffset:10) (firstTokenOffset:10) (offset:10)
+              element: #E1 U
+          formalParameters
+            #F4 requiredPositional isOriginDeclaration x (nameOffset:15) (firstTokenOffset:13) (offset:15)
+              element: <testLibrary>::@function::f::@formalParameter::x
+              parameters
+                #F5 requiredPositional isOriginDeclaration u (nameOffset:19) (firstTokenOffset:17) (offset:19)
+                  element: u@19
+  functions
+    isOriginDeclaration isStatic f
+      reference: <testLibrary>::@function::f
+      firstFragment: #F1
+      typeParameters
+        #E0 T
+          firstFragment: #F2
+        #E1 U
+          firstFragment: #F3
+      formalParameters
+        #E2 requiredPositional x
+          firstFragment: #F4
+          type: T Function(U)
+          formalParameters
+            #E3 requiredPositional u
+              firstFragment: #F5
+              type: U
+      returnType: void
+''');
+  }
+
+  test_function_typed_parameter_implicit() async {
+    var library = await buildLibrary(r'''
+f(g()) => null;
+''');
+    expect(
+      library.topLevelFunctions.first.formalParameters.first.hasImplicitType,
+      isFalse,
+    );
+  }
+
+  test_function_typeParameters_hasBound() async {
+    var library = await buildLibrary(r'''
+void f<T extends num>() {}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  fragments
+    #F0 <testLibraryFragment>
+      element: <testLibrary>
+      functions
+        #F1 isCompleteDeclaration isOriginDeclaration isStatic f (nameOffset:5) (firstTokenOffset:0) (offset:5)
+          element: <testLibrary>::@function::f
+          typeParameters
+            #F2 T (nameOffset:7) (firstTokenOffset:7) (offset:7)
+              element: #E0 T
+  functions
+    isOriginDeclaration isStatic f
+      reference: <testLibrary>::@function::f
+      firstFragment: #F1
+      typeParameters
+        #E0 T
+          firstFragment: #F2
+          bound: num
+      returnType: void
+''');
+  }
+
+  test_function_typeParameters_noBound() async {
+    var library = await buildLibrary(r'''
+void f<T>() {}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  fragments
+    #F0 <testLibraryFragment>
+      element: <testLibrary>
+      functions
+        #F1 isCompleteDeclaration isOriginDeclaration isStatic f (nameOffset:5) (firstTokenOffset:0) (offset:5)
+          element: <testLibrary>::@function::f
+          typeParameters
+            #F2 T (nameOffset:7) (firstTokenOffset:7) (offset:7)
+              element: #E0 T
+  functions
+    isOriginDeclaration isStatic f
+      reference: <testLibrary>::@function::f
+      firstFragment: #F1
+      typeParameters
+        #E0 T
+          firstFragment: #F2
+      returnType: void
+''');
+  }
+
+  test_functions() async {
+    var library = await buildLibrary(r'''
+f() {}
+g() {}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  fragments
+    #F0 <testLibraryFragment>
+      element: <testLibrary>
+      functions
+        #F1 hasImplicitReturnType isCompleteDeclaration isOriginDeclaration isStatic f (nameOffset:0) (firstTokenOffset:0) (offset:0)
+          element: <testLibrary>::@function::f
+        #F2 hasImplicitReturnType isCompleteDeclaration isOriginDeclaration isStatic g (nameOffset:7) (firstTokenOffset:7) (offset:7)
+          element: <testLibrary>::@function::g
+  functions
+    isOriginDeclaration isStatic f
+      reference: <testLibrary>::@function::f
+      firstFragment: #F1
+      returnType: dynamic
+    isOriginDeclaration isStatic g
+      reference: <testLibrary>::@function::g
+      firstFragment: #F2
+      returnType: dynamic
+''');
+  }
+
+  test_getter_missingName() async {
+    var library = await buildLibrary(r'''
+get() => 0;
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  fragments
+    #F0 <testLibraryFragment>
+      element: <testLibrary>
+      functions
+        #F1 hasImplicitReturnType isCompleteDeclaration isOriginDeclaration isStatic get (nameOffset:0) (firstTokenOffset:0) (offset:0)
+          element: <testLibrary>::@function::get
+  functions
+    isOriginDeclaration isStatic get
+      reference: <testLibrary>::@function::get
+      firstFragment: #F1
+      returnType: dynamic
+''');
+  }
+
+  test_main_class() async {
+    var library = await buildLibrary(r'''
+class main {}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  fragments
+    #F0 <testLibraryFragment>
+      element: <testLibrary>
+      classes
+        #F1 class main (nameOffset:6) (firstTokenOffset:0) (offset:6)
+          element: <testLibrary>::@class::main
+          constructors
+            #F2 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:6)
+              element: <testLibrary>::@class::main::@constructor::new
+              typeName: main
+  classes
+    isSimplyBounded class main
+      reference: <testLibrary>::@class::main
+      firstFragment: #F1
+      constructors
+        isOriginImplicitDefault new
+          reference: <testLibrary>::@class::main::@constructor::new
+          firstFragment: #F2
+''');
+  }
+
+  test_main_class_alias() async {
+    var library = await buildLibrary(r'''
+class main = C with D;
+
+class C {}
+
+class D {}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  fragments
+    #F0 <testLibraryFragment>
+      element: <testLibrary>
+      classes
+        #F1 isMixinApplication class main (nameOffset:6) (firstTokenOffset:0) (offset:6)
+          element: <testLibrary>::@class::main
+          constructors
+            #F2 isOriginMixinApplication new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:6)
+              element: <testLibrary>::@class::main::@constructor::new
+              typeName: main
+        #F3 class C (nameOffset:30) (firstTokenOffset:24) (offset:30)
+          element: <testLibrary>::@class::C
+          constructors
+            #F4 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:30)
+              element: <testLibrary>::@class::C::@constructor::new
+              typeName: C
+        #F5 class D (nameOffset:42) (firstTokenOffset:36) (offset:42)
+          element: <testLibrary>::@class::D
+          constructors
+            #F6 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:42)
+              element: <testLibrary>::@class::D::@constructor::new
+              typeName: D
+  classes
+    isMixinApplication isSimplyBounded class main
+      reference: <testLibrary>::@class::main
+      firstFragment: #F1
+      supertype: C
+      mixins
+        D
+      constructors
+        isOriginMixinApplication new
+          reference: <testLibrary>::@class::main::@constructor::new
+          firstFragment: #F2
+          constantInitializers
+            SuperConstructorInvocation
+              superKeyword: super @0
+              argumentList: ArgumentList
+                leftParenthesis: ( @0
+                rightParenthesis: ) @0
+              element: <testLibrary>::@class::C::@constructor::new
+          superConstructor: <testLibrary>::@class::C::@constructor::new
+    isSimplyBounded class C
+      reference: <testLibrary>::@class::C
+      firstFragment: #F3
+      constructors
+        isOriginImplicitDefault new
+          reference: <testLibrary>::@class::C::@constructor::new
+          firstFragment: #F4
+    isSimplyBounded class D
+      reference: <testLibrary>::@class::D
+      firstFragment: #F5
+      constructors
+        isOriginImplicitDefault new
+          reference: <testLibrary>::@class::D::@constructor::new
+          firstFragment: #F6
+''');
+  }
+
+  test_main_class_alias_via_export() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+class main = C with D;
+class C {}
+class D {}
+''');
+    var library = await buildLibrary(r'''
+export "a.dart";
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  fragments
+    #F0 <testLibraryFragment>
+      element: <testLibrary>
+      libraryExports
+        package:test/a.dart
+''');
+  }
+
+  test_main_class_via_export() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+class main {}
+''');
+    var library = await buildLibrary(r'''
+export "a.dart";
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  fragments
+    #F0 <testLibraryFragment>
+      element: <testLibrary>
+      libraryExports
+        package:test/a.dart
+''');
+  }
+
+  test_main_getter() async {
+    var library = await buildLibrary(r'''
+get main => null;
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  fragments
+    #F0 <testLibraryFragment>
+      element: <testLibrary>
+      topLevelVariables
+        #F1 isOriginGetterSetter isStatic main (nameOffset:<null>) (firstTokenOffset:<null>) (offset:4)
+          element: <testLibrary>::@topLevelVariable::main
+      getters
+        #F2 hasImplicitReturnType isCompleteDeclaration isOriginDeclaration isStatic main (nameOffset:4) (firstTokenOffset:0) (offset:4)
+          element: <testLibrary>::@getter::main
+  topLevelVariables
+    isOriginGetterSetter isStatic main
+      reference: <testLibrary>::@topLevelVariable::main
+      firstFragment: #F1
+      type: dynamic
+      getter: <testLibrary>::@getter::main
+  getters
+    isOriginDeclaration isStatic main
+      reference: <testLibrary>::@getter::main
+      firstFragment: #F2
+      returnType: dynamic
+      variable: <testLibrary>::@topLevelVariable::main
+''');
+  }
+
+  test_main_getter_via_export() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+get main => null;
+''');
+    var library = await buildLibrary(r'''
+export "a.dart";
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  fragments
+    #F0 <testLibraryFragment>
+      element: <testLibrary>
+      libraryExports
+        package:test/a.dart
+''');
+  }
+
+  test_main_typedef() async {
+    var library = await buildLibrary(r'''
+typedef main();
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  fragments
+    #F0 <testLibraryFragment>
+      element: <testLibrary>
+      typeAliases
+        #F1 main (nameOffset:8) (firstTokenOffset:0) (offset:8)
+          element: <testLibrary>::@typeAlias::main
+  typeAliases
+    isSimplyBounded main
+      reference: <testLibrary>::@typeAlias::main
+      firstFragment: #F1
+      aliasedType: dynamic Function()
+''');
+  }
+
+  test_main_typedef_via_export() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+typedef main();
+''');
+    var library = await buildLibrary(r'''
+export "a.dart";
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  fragments
+    #F0 <testLibraryFragment>
+      element: <testLibrary>
+      libraryExports
+        package:test/a.dart
+''');
+  }
+
+  test_main_variable() async {
+    var library = await buildLibrary(r'''
+var main;
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  fragments
+    #F0 <testLibraryFragment>
+      element: <testLibrary>
+      topLevelVariables
+        #F1 hasImplicitType isOriginDeclaration isStatic main (nameOffset:4) (firstTokenOffset:4) (offset:4)
+          element: <testLibrary>::@topLevelVariable::main
+      getters
+        #F2 isCompleteDeclaration isOriginVariable isStatic main (nameOffset:<null>) (firstTokenOffset:<null>) (offset:4)
+          element: <testLibrary>::@getter::main
+      setters
+        #F3 isCompleteDeclaration isOriginVariable isStatic main (nameOffset:<null>) (firstTokenOffset:<null>) (offset:4)
+          element: <testLibrary>::@setter::main
+          formalParameters
+            #F4 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:4)
+              element: <testLibrary>::@setter::main::@formalParameter::value
+  topLevelVariables
+    hasImplicitType isOriginDeclaration isStatic main
+      reference: <testLibrary>::@topLevelVariable::main
+      firstFragment: #F1
+      type: dynamic
+      getter: <testLibrary>::@getter::main
+      setter: <testLibrary>::@setter::main
+  getters
+    isOriginVariable isStatic main
+      reference: <testLibrary>::@getter::main
+      firstFragment: #F2
+      returnType: dynamic
+      variable: <testLibrary>::@topLevelVariable::main
+  setters
+    isOriginVariable isStatic main
+      reference: <testLibrary>::@setter::main
+      firstFragment: #F3
+      formalParameters
+        #E0 requiredPositional value
+          firstFragment: #F4
+          type: dynamic
+      returnType: void
+      variable: <testLibrary>::@topLevelVariable::main
+''');
+  }
+
+  test_main_variable_via_export() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+var main;
+''');
+    var library = await buildLibrary(r'''
+export "a.dart";
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  fragments
+    #F0 <testLibraryFragment>
+      element: <testLibrary>
+      libraryExports
+        package:test/a.dart
+''');
+  }
+
+  test_setter_missingName() async {
+    var library = await buildLibrary(r'''
+set(int _) {}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  fragments
+    #F0 <testLibraryFragment>
+      element: <testLibrary>
+      functions
+        #F1 hasImplicitReturnType isCompleteDeclaration isOriginDeclaration isStatic set (nameOffset:0) (firstTokenOffset:0) (offset:0)
+          element: <testLibrary>::@function::set
+          formalParameters
+            #F2 requiredPositional isOriginDeclaration _ (nameOffset:8) (firstTokenOffset:4) (offset:8)
+              element: <testLibrary>::@function::set::@formalParameter::_
+  functions
+    isOriginDeclaration isStatic set
+      reference: <testLibrary>::@function::set
+      firstFragment: #F1
+      formalParameters
+        #E0 requiredPositional _
+          firstFragment: #F2
+          type: int
+      returnType: dynamic
+''');
+  }
+
+  test_typeParameter() async {
+    var library = await buildLibrary(r'''
+void foo<T>() {}
+augment void foo<T>() {}
+''');
+
+    configuration.withExportScope = true;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  fragments
+    #F0 <testLibraryFragment>
+      element: <testLibrary>
+      functions
+        #F1 isCompleteDeclaration isOriginDeclaration isStatic foo (nameOffset:5) (firstTokenOffset:0) (offset:5)
+          element: <testLibrary>::@function::foo
+          nextFragment: #F2
+          typeParameters
+            #F3 T (nameOffset:9) (firstTokenOffset:9) (offset:9)
+              element: #E0 T
+              nextFragment: #F4
+        #F2 isAugmentation isCompleteDeclaration isOriginDeclaration isStatic foo (nameOffset:30) (firstTokenOffset:17) (offset:30)
+          element: <testLibrary>::@function::foo
+          previousFragment: #F1
+          typeParameters
+            #F4 T (nameOffset:34) (firstTokenOffset:34) (offset:34)
+              element: #E0 T
+              previousFragment: #F3
+  functions
+    isOriginDeclaration isStatic foo
+      reference: <testLibrary>::@function::foo
+      firstFragment: #F1
+      typeParameters
+        #E0 T
+          firstFragment: #F3
+      returnType: void
+  exportEntries
+    declared <testLibrary>::@function::foo
+  exportNamespace
+    foo: <testLibrary>::@function::foo
+''');
+  }
+
   test_typeParameters_int_string() async {
     var library = await buildLibrary(r'''
 void foo<T extends int>() {}
@@ -3668,20 +3776,6 @@
 }
 
 @reflectiveTest
-class TopLevelFunctionElementTest_augmentation_fromBytes
-    extends TopLevelFunctionElementTest_augmentation {
-  @override
-  bool get keepLinkingLibraries => false;
-}
-
-@reflectiveTest
-class TopLevelFunctionElementTest_augmentation_keepLinking
-    extends TopLevelFunctionElementTest_augmentation {
-  @override
-  bool get keepLinkingLibraries => true;
-}
-
-@reflectiveTest
 class TopLevelFunctionElementTest_fromBytes
     extends TopLevelFunctionElementTest {
   @override
diff --git a/pkg/analyzer/test/src/summary/elements/top_level_variable_test.dart b/pkg/analyzer/test/src/summary/elements/top_level_variable_test.dart
index 1daafd0..2382a49 100644
--- a/pkg/analyzer/test/src/summary/elements/top_level_variable_test.dart
+++ b/pkg/analyzer/test/src/summary/elements/top_level_variable_test.dart
@@ -14,8 +14,6 @@
   defineReflectiveSuite(() {
     defineReflectiveTests(TopLevelVariableElementTest_keepLinking);
     defineReflectiveTests(TopLevelVariableElementTest_fromBytes);
-    defineReflectiveTests(TopLevelVariableElementTest_augmentation_keepLinking);
-    defineReflectiveTests(TopLevelVariableElementTest_augmentation_fromBytes);
     defineReflectiveTests(UpdateNodeTextExpectations);
   });
 }
@@ -157,7 +155,7 @@
   }
 
   test_getter_abstract() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 int get x;
 ''');
     checkElementText(library, r'''
@@ -221,6 +219,7 @@
   test_getter_asyncStar() async {
     var library = await buildLibrary(r'''
 import 'dart:async';
+
 Stream<int> get foo async* {}
 ''');
     checkElementText(library, r'''
@@ -232,10 +231,10 @@
       libraryImports
         dart:async
       topLevelVariables
-        #F1 isOriginGetterSetter isStatic foo (nameOffset:<null>) (firstTokenOffset:<null>) (offset:37)
+        #F1 isOriginGetterSetter isStatic foo (nameOffset:<null>) (firstTokenOffset:<null>) (offset:38)
           element: <testLibrary>::@topLevelVariable::foo
       getters
-        #F2 isAsynchronous isCompleteDeclaration isGenerator isOriginDeclaration isStatic foo (nameOffset:37) (firstTokenOffset:21) (offset:37)
+        #F2 isAsynchronous isCompleteDeclaration isGenerator isOriginDeclaration isStatic foo (nameOffset:38) (firstTokenOffset:22) (offset:38)
           element: <testLibrary>::@getter::foo
   topLevelVariables
     isOriginGetterSetter isStatic foo
@@ -252,13 +251,760 @@
 ''');
   }
 
+  test_getter_augmentation_chain() async {
+    var library = await buildLibrary(r'''
+int get foo => 0;
+augment int get foo => 1;
+''');
+
+    configuration.withExportScope = true;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  fragments
+    #F0 <testLibraryFragment>
+      element: <testLibrary>
+      topLevelVariables
+        #F1 isOriginGetterSetter isStatic foo (nameOffset:<null>) (firstTokenOffset:<null>) (offset:8)
+          element: <testLibrary>::@topLevelVariable::foo
+      getters
+        #F2 isCompleteDeclaration isOriginDeclaration isStatic foo (nameOffset:8) (firstTokenOffset:0) (offset:8)
+          element: <testLibrary>::@getter::foo
+          nextFragment: #F3
+        #F3 isAugmentation isCompleteDeclaration isOriginDeclaration isStatic foo (nameOffset:34) (firstTokenOffset:18) (offset:34)
+          element: <testLibrary>::@getter::foo
+          previousFragment: #F2
+  topLevelVariables
+    isOriginGetterSetter isStatic foo
+      reference: <testLibrary>::@topLevelVariable::foo
+      firstFragment: #F1
+      type: int
+      getter: <testLibrary>::@getter::foo
+  getters
+    isOriginDeclaration isStatic foo
+      reference: <testLibrary>::@getter::foo
+      firstFragment: #F2
+      returnType: int
+      variable: <testLibrary>::@topLevelVariable::foo
+  exportEntries
+    declared <testLibrary>::@getter::foo
+  exportNamespace
+    foo: <testLibrary>::@getter::foo
+''');
+  }
+
+  test_getter_augmentation_chain_differentType() async {
+    var library = await buildLibrary(r'''
+int get foo => 0;
+augment double get foo => 1;
+''');
+
+    configuration.withExportScope = true;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  fragments
+    #F0 <testLibraryFragment>
+      element: <testLibrary>
+      topLevelVariables
+        #F1 isOriginGetterSetter isStatic foo (nameOffset:<null>) (firstTokenOffset:<null>) (offset:8)
+          element: <testLibrary>::@topLevelVariable::foo
+      getters
+        #F2 isCompleteDeclaration isOriginDeclaration isStatic foo (nameOffset:8) (firstTokenOffset:0) (offset:8)
+          element: <testLibrary>::@getter::foo
+          nextFragment: #F3
+        #F3 isAugmentation isCompleteDeclaration isOriginDeclaration isStatic foo (nameOffset:37) (firstTokenOffset:18) (offset:37)
+          element: <testLibrary>::@getter::foo
+          previousFragment: #F2
+  topLevelVariables
+    isOriginGetterSetter isStatic foo
+      reference: <testLibrary>::@topLevelVariable::foo
+      firstFragment: #F1
+      type: int
+      getter: <testLibrary>::@getter::foo
+  getters
+    isOriginDeclaration isStatic foo
+      reference: <testLibrary>::@getter::foo
+      firstFragment: #F2
+      returnType: int
+      variable: <testLibrary>::@topLevelVariable::foo
+  exportEntries
+    declared <testLibrary>::@getter::foo
+  exportNamespace
+    foo: <testLibrary>::@getter::foo
+''');
+  }
+
+  test_getter_augmentation_chain_fromVariable() async {
+    var library = await buildLibrary(r'''
+int foo = 0;
+augment int get foo => 1;
+''');
+
+    configuration.withExportScope = true;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  fragments
+    #F0 <testLibraryFragment>
+      element: <testLibrary>
+      topLevelVariables
+        #F1 hasInitializer isOriginDeclaration isStatic foo (nameOffset:4) (firstTokenOffset:4) (offset:4)
+          element: <testLibrary>::@topLevelVariable::foo
+      getters
+        #F2 isCompleteDeclaration isOriginVariable isStatic foo (nameOffset:<null>) (firstTokenOffset:<null>) (offset:4)
+          element: <testLibrary>::@getter::foo
+          nextFragment: #F3
+        #F3 isAugmentation isCompleteDeclaration isOriginDeclaration isStatic foo (nameOffset:29) (firstTokenOffset:13) (offset:29)
+          element: <testLibrary>::@getter::foo
+          previousFragment: #F2
+      setters
+        #F4 isCompleteDeclaration isOriginVariable isStatic foo (nameOffset:<null>) (firstTokenOffset:<null>) (offset:4)
+          element: <testLibrary>::@setter::foo
+          formalParameters
+            #F5 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:4)
+              element: <testLibrary>::@setter::foo::@formalParameter::value
+  topLevelVariables
+    hasInitializer isOriginDeclaration isStatic foo
+      reference: <testLibrary>::@topLevelVariable::foo
+      firstFragment: #F1
+      type: int
+      getter: <testLibrary>::@getter::foo
+      setter: <testLibrary>::@setter::foo
+  getters
+    isOriginVariable isStatic foo
+      reference: <testLibrary>::@getter::foo
+      firstFragment: #F2
+      returnType: int
+      variable: <testLibrary>::@topLevelVariable::foo
+  setters
+    isOriginVariable isStatic foo
+      reference: <testLibrary>::@setter::foo
+      firstFragment: #F4
+      formalParameters
+        #E0 requiredPositional value
+          firstFragment: #F5
+          type: int
+      returnType: void
+      variable: <testLibrary>::@topLevelVariable::foo
+  exportEntries
+    declared <testLibrary>::@getter::foo
+    declared <testLibrary>::@setter::foo
+  exportNamespace
+    foo: <testLibrary>::@getter::foo
+    foo=: <testLibrary>::@setter::foo
+''');
+  }
+
+  test_getter_augmentation_chain_fromVariable_const() async {
+    var library = await buildLibrary(r'''
+const int foo = 0;
+augment int get foo => 1;
+''');
+
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  fragments
+    #F0 <testLibraryFragment>
+      element: <testLibrary>
+      topLevelVariables
+        #F1 hasInitializer isConst isOriginDeclaration isStatic foo (nameOffset:10) (firstTokenOffset:10) (offset:10)
+          element: <testLibrary>::@topLevelVariable::foo
+          initializer: expression_0
+            IntegerLiteral
+              literal: 0 @16
+              staticType: int
+      getters
+        #F2 isCompleteDeclaration isOriginVariable isStatic foo (nameOffset:<null>) (firstTokenOffset:<null>) (offset:10)
+          element: <testLibrary>::@getter::foo
+          nextFragment: #F3
+        #F3 isAugmentation isCompleteDeclaration isOriginDeclaration isStatic foo (nameOffset:35) (firstTokenOffset:19) (offset:35)
+          element: <testLibrary>::@getter::foo
+          previousFragment: #F2
+  topLevelVariables
+    hasInitializer isConst isOriginDeclaration isStatic foo
+      reference: <testLibrary>::@topLevelVariable::foo
+      firstFragment: #F1
+      type: int
+      constantInitializer
+        fragment: #F1
+        expression: expression_0
+      getter: <testLibrary>::@getter::foo
+  getters
+    isOriginVariable isStatic foo
+      reference: <testLibrary>::@getter::foo
+      firstFragment: #F2
+      returnType: int
+      variable: <testLibrary>::@topLevelVariable::foo
+''');
+  }
+
+  test_getter_augmentation_chain_fromVariable_differentType() async {
+    var library = await buildLibrary(r'''
+int foo = 0;
+augment double get foo => 1;
+''');
+
+    configuration.withExportScope = true;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  fragments
+    #F0 <testLibraryFragment>
+      element: <testLibrary>
+      topLevelVariables
+        #F1 hasInitializer isOriginDeclaration isStatic foo (nameOffset:4) (firstTokenOffset:4) (offset:4)
+          element: <testLibrary>::@topLevelVariable::foo
+      getters
+        #F2 isCompleteDeclaration isOriginVariable isStatic foo (nameOffset:<null>) (firstTokenOffset:<null>) (offset:4)
+          element: <testLibrary>::@getter::foo
+          nextFragment: #F3
+        #F3 isAugmentation isCompleteDeclaration isOriginDeclaration isStatic foo (nameOffset:32) (firstTokenOffset:13) (offset:32)
+          element: <testLibrary>::@getter::foo
+          previousFragment: #F2
+      setters
+        #F4 isCompleteDeclaration isOriginVariable isStatic foo (nameOffset:<null>) (firstTokenOffset:<null>) (offset:4)
+          element: <testLibrary>::@setter::foo
+          formalParameters
+            #F5 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:4)
+              element: <testLibrary>::@setter::foo::@formalParameter::value
+  topLevelVariables
+    hasInitializer isOriginDeclaration isStatic foo
+      reference: <testLibrary>::@topLevelVariable::foo
+      firstFragment: #F1
+      type: int
+      getter: <testLibrary>::@getter::foo
+      setter: <testLibrary>::@setter::foo
+  getters
+    isOriginVariable isStatic foo
+      reference: <testLibrary>::@getter::foo
+      firstFragment: #F2
+      returnType: int
+      variable: <testLibrary>::@topLevelVariable::foo
+  setters
+    isOriginVariable isStatic foo
+      reference: <testLibrary>::@setter::foo
+      firstFragment: #F4
+      formalParameters
+        #E0 requiredPositional value
+          firstFragment: #F5
+          type: int
+      returnType: void
+      variable: <testLibrary>::@topLevelVariable::foo
+  exportEntries
+    declared <testLibrary>::@getter::foo
+    declared <testLibrary>::@setter::foo
+  exportNamespace
+    foo: <testLibrary>::@getter::foo
+    foo=: <testLibrary>::@setter::foo
+''');
+  }
+
+  test_getter_augmentation_chain_fromVariable_final() async {
+    var library = await buildLibrary(r'''
+final int foo = 0;
+augment int get foo => 1;
+''');
+
+    configuration.withExportScope = true;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  fragments
+    #F0 <testLibraryFragment>
+      element: <testLibrary>
+      topLevelVariables
+        #F1 hasInitializer isFinal isOriginDeclaration isStatic foo (nameOffset:10) (firstTokenOffset:10) (offset:10)
+          element: <testLibrary>::@topLevelVariable::foo
+      getters
+        #F2 isCompleteDeclaration isOriginVariable isStatic foo (nameOffset:<null>) (firstTokenOffset:<null>) (offset:10)
+          element: <testLibrary>::@getter::foo
+          nextFragment: #F3
+        #F3 isAugmentation isCompleteDeclaration isOriginDeclaration isStatic foo (nameOffset:35) (firstTokenOffset:19) (offset:35)
+          element: <testLibrary>::@getter::foo
+          previousFragment: #F2
+  topLevelVariables
+    hasInitializer isFinal isOriginDeclaration isStatic foo
+      reference: <testLibrary>::@topLevelVariable::foo
+      firstFragment: #F1
+      type: int
+      getter: <testLibrary>::@getter::foo
+  getters
+    isOriginVariable isStatic foo
+      reference: <testLibrary>::@getter::foo
+      firstFragment: #F2
+      returnType: int
+      variable: <testLibrary>::@topLevelVariable::foo
+  exportEntries
+    declared <testLibrary>::@getter::foo
+  exportNamespace
+    foo: <testLibrary>::@getter::foo
+''');
+  }
+
+  test_getter_augmentation_chain_fromVariable_metadata() async {
+    var library = await buildLibrary(r'''
+final foo = 0;
+@deprecated
+augment int get foo;
+''');
+
+    configuration.withExportScope = true;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  fragments
+    #F0 <testLibraryFragment>
+      element: <testLibrary>
+      topLevelVariables
+        #F1 hasImplicitType hasInitializer isFinal isOriginDeclaration isStatic foo (nameOffset:6) (firstTokenOffset:6) (offset:6)
+          element: <testLibrary>::@topLevelVariable::foo
+      getters
+        #F2 isCompleteDeclaration isOriginVariable isStatic foo (nameOffset:<null>) (firstTokenOffset:<null>) (offset:6)
+          element: <testLibrary>::@getter::foo
+          nextFragment: #F3
+        #F3 isAugmentation isOriginDeclaration isStatic foo (nameOffset:43) (firstTokenOffset:15) (offset:43)
+          element: <testLibrary>::@getter::foo
+          metadata
+            Annotation
+              atSign: @ @15
+              name: SimpleIdentifier
+                token: deprecated @16
+                element: dart:core::@getter::deprecated
+                staticType: null
+              element: dart:core::@getter::deprecated
+          previousFragment: #F2
+  topLevelVariables
+    hasImplicitType hasInitializer isFinal isOriginDeclaration isStatic isTypeInferredFromInitializer foo
+      reference: <testLibrary>::@topLevelVariable::foo
+      firstFragment: #F1
+      type: int
+      getter: <testLibrary>::@getter::foo
+  getters
+    isOriginVariable isStatic foo
+      reference: <testLibrary>::@getter::foo
+      firstFragment: #F2
+      metadata
+        Annotation
+          atSign: @ @15
+          name: SimpleIdentifier
+            token: deprecated @16
+            element: dart:core::@getter::deprecated
+            staticType: null
+          element: dart:core::@getter::deprecated
+      returnType: int
+      variable: <testLibrary>::@topLevelVariable::foo
+  exportEntries
+    declared <testLibrary>::@getter::foo
+  exportNamespace
+    foo: <testLibrary>::@getter::foo
+''');
+  }
+
+  test_getter_augmentation_chain_metadata() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+const a1 = 1;
+const a2 = 2;
+const a3 = 3;
+''');
+
+    var library = await buildLibrary(r'''
+import 'a.dart';
+@a1
+int get foo => 0;
+@a2
+augment int get foo => 1;
+@a3
+augment int get foo => 2;
+''');
+
+    configuration.withExportScope = true;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  fragments
+    #F0 <testLibraryFragment>
+      element: <testLibrary>
+      libraryImports
+        package:test/a.dart
+      topLevelVariables
+        #F1 isOriginGetterSetter isStatic foo (nameOffset:<null>) (firstTokenOffset:<null>) (offset:29)
+          element: <testLibrary>::@topLevelVariable::foo
+      getters
+        #F2 isCompleteDeclaration isOriginDeclaration isStatic foo (nameOffset:29) (firstTokenOffset:17) (offset:29)
+          element: <testLibrary>::@getter::foo
+          metadata
+            Annotation
+              atSign: @ @17
+              name: SimpleIdentifier
+                token: a1 @18
+                element: package:test/a.dart::@getter::a1
+                staticType: null
+              element: package:test/a.dart::@getter::a1
+          nextFragment: #F3
+        #F3 isAugmentation isCompleteDeclaration isOriginDeclaration isStatic foo (nameOffset:59) (firstTokenOffset:39) (offset:59)
+          element: <testLibrary>::@getter::foo
+          metadata
+            Annotation
+              atSign: @ @39
+              name: SimpleIdentifier
+                token: a2 @40
+                element: package:test/a.dart::@getter::a2
+                staticType: null
+              element: package:test/a.dart::@getter::a2
+          previousFragment: #F2
+          nextFragment: #F4
+        #F4 isAugmentation isCompleteDeclaration isOriginDeclaration isStatic foo (nameOffset:89) (firstTokenOffset:69) (offset:89)
+          element: <testLibrary>::@getter::foo
+          metadata
+            Annotation
+              atSign: @ @69
+              name: SimpleIdentifier
+                token: a3 @70
+                element: package:test/a.dart::@getter::a3
+                staticType: null
+              element: package:test/a.dart::@getter::a3
+          previousFragment: #F3
+  topLevelVariables
+    isOriginGetterSetter isStatic foo
+      reference: <testLibrary>::@topLevelVariable::foo
+      firstFragment: #F1
+      type: int
+      getter: <testLibrary>::@getter::foo
+  getters
+    isOriginDeclaration isStatic foo
+      reference: <testLibrary>::@getter::foo
+      firstFragment: #F2
+      metadata
+        Annotation
+          atSign: @ @17
+          name: SimpleIdentifier
+            token: a1 @18
+            element: package:test/a.dart::@getter::a1
+            staticType: null
+          element: package:test/a.dart::@getter::a1
+        Annotation
+          atSign: @ @39
+          name: SimpleIdentifier
+            token: a2 @40
+            element: package:test/a.dart::@getter::a2
+            staticType: null
+          element: package:test/a.dart::@getter::a2
+        Annotation
+          atSign: @ @69
+          name: SimpleIdentifier
+            token: a3 @70
+            element: package:test/a.dart::@getter::a3
+            staticType: null
+          element: package:test/a.dart::@getter::a3
+      returnType: int
+      variable: <testLibrary>::@topLevelVariable::foo
+  exportEntries
+    declared <testLibrary>::@getter::foo
+  exportNamespace
+    foo: <testLibrary>::@getter::foo
+''');
+  }
+
+  test_getter_augmentation_chain_noIntroductoryDeclaration() async {
+    var library = await buildLibrary(r'''
+augment int get foo => 0;
+''');
+
+    configuration.withExportScope = true;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  fragments
+    #F0 <testLibraryFragment>
+      element: <testLibrary>
+      topLevelVariables
+        #F1 isOriginGetterSetter isStatic foo (nameOffset:<null>) (firstTokenOffset:<null>) (offset:16)
+          element: <testLibrary>::@topLevelVariable::foo
+      getters
+        #F2 isAugmentation isCompleteDeclaration isOriginDeclaration isStatic foo (nameOffset:16) (firstTokenOffset:0) (offset:16)
+          element: <testLibrary>::@getter::foo
+  topLevelVariables
+    isOriginGetterSetter isStatic foo
+      reference: <testLibrary>::@topLevelVariable::foo
+      firstFragment: #F1
+      type: int
+      getter: <testLibrary>::@getter::foo
+  getters
+    isOriginDeclaration isStatic foo
+      reference: <testLibrary>::@getter::foo
+      firstFragment: #F2
+      returnType: int
+      variable: <testLibrary>::@topLevelVariable::foo
+  exportEntries
+    declared <testLibrary>::@getter::foo
+  exportNamespace
+    foo: <testLibrary>::@getter::foo
+''');
+  }
+
+  test_getter_augmentation_chain_twoDeclarations() async {
+    var library = await buildLibrary(r'''
+int get foo => 0;
+augment int get foo => 1;
+augment int get foo => 2;
+''');
+
+    configuration.withExportScope = true;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  fragments
+    #F0 <testLibraryFragment>
+      element: <testLibrary>
+      topLevelVariables
+        #F1 isOriginGetterSetter isStatic foo (nameOffset:<null>) (firstTokenOffset:<null>) (offset:8)
+          element: <testLibrary>::@topLevelVariable::foo
+      getters
+        #F2 isCompleteDeclaration isOriginDeclaration isStatic foo (nameOffset:8) (firstTokenOffset:0) (offset:8)
+          element: <testLibrary>::@getter::foo
+          nextFragment: #F3
+        #F3 isAugmentation isCompleteDeclaration isOriginDeclaration isStatic foo (nameOffset:34) (firstTokenOffset:18) (offset:34)
+          element: <testLibrary>::@getter::foo
+          previousFragment: #F2
+          nextFragment: #F4
+        #F4 isAugmentation isCompleteDeclaration isOriginDeclaration isStatic foo (nameOffset:60) (firstTokenOffset:44) (offset:60)
+          element: <testLibrary>::@getter::foo
+          previousFragment: #F3
+  topLevelVariables
+    isOriginGetterSetter isStatic foo
+      reference: <testLibrary>::@topLevelVariable::foo
+      firstFragment: #F1
+      type: int
+      getter: <testLibrary>::@getter::foo
+  getters
+    isOriginDeclaration isStatic foo
+      reference: <testLibrary>::@getter::foo
+      firstFragment: #F2
+      returnType: int
+      variable: <testLibrary>::@topLevelVariable::foo
+  exportEntries
+    declared <testLibrary>::@getter::foo
+  exportNamespace
+    foo: <testLibrary>::@getter::foo
+''');
+  }
+
+  test_getter_augmentation_chain_twoDeclarations_differentType() async {
+    var library = await buildLibrary(r'''
+int get foo => 0;
+augment int get foo => 1;
+augment double get foo => 2;
+''');
+
+    configuration.withExportScope = true;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  fragments
+    #F0 <testLibraryFragment>
+      element: <testLibrary>
+      topLevelVariables
+        #F1 isOriginGetterSetter isStatic foo (nameOffset:<null>) (firstTokenOffset:<null>) (offset:8)
+          element: <testLibrary>::@topLevelVariable::foo
+      getters
+        #F2 isCompleteDeclaration isOriginDeclaration isStatic foo (nameOffset:8) (firstTokenOffset:0) (offset:8)
+          element: <testLibrary>::@getter::foo
+          nextFragment: #F3
+        #F3 isAugmentation isCompleteDeclaration isOriginDeclaration isStatic foo (nameOffset:34) (firstTokenOffset:18) (offset:34)
+          element: <testLibrary>::@getter::foo
+          previousFragment: #F2
+          nextFragment: #F4
+        #F4 isAugmentation isCompleteDeclaration isOriginDeclaration isStatic foo (nameOffset:63) (firstTokenOffset:44) (offset:63)
+          element: <testLibrary>::@getter::foo
+          previousFragment: #F3
+  topLevelVariables
+    isOriginGetterSetter isStatic foo
+      reference: <testLibrary>::@topLevelVariable::foo
+      firstFragment: #F1
+      type: int
+      getter: <testLibrary>::@getter::foo
+  getters
+    isOriginDeclaration isStatic foo
+      reference: <testLibrary>::@getter::foo
+      firstFragment: #F2
+      returnType: int
+      variable: <testLibrary>::@topLevelVariable::foo
+  exportEntries
+    declared <testLibrary>::@getter::foo
+  exportNamespace
+    foo: <testLibrary>::@getter::foo
+''');
+  }
+
+  test_getter_augmentation_sameName_class() async {
+    var library = await buildLibrary(r'''
+class A {}
+augment int get A => 0;
+''');
+
+    configuration.withExportScope = true;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  fragments
+    #F0 <testLibraryFragment>
+      element: <testLibrary>
+      classes
+        #F1 class A (nameOffset:6) (firstTokenOffset:0) (offset:6)
+          element: <testLibrary>::@class::A
+          constructors
+            #F2 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:6)
+              element: <testLibrary>::@class::A::@constructor::new
+              typeName: A
+      topLevelVariables
+        #F3 isOriginGetterSetter isStatic A (nameOffset:<null>) (firstTokenOffset:<null>) (offset:27)
+          element: <testLibrary>::@topLevelVariable::A
+      getters
+        #F4 isAugmentation isCompleteDeclaration isOriginDeclaration isStatic A (nameOffset:27) (firstTokenOffset:11) (offset:27)
+          element: <testLibrary>::@getter::A
+  classes
+    isSimplyBounded class A
+      reference: <testLibrary>::@class::A
+      firstFragment: #F1
+      constructors
+        isOriginImplicitDefault new
+          reference: <testLibrary>::@class::A::@constructor::new
+          firstFragment: #F2
+  topLevelVariables
+    isOriginGetterSetter isStatic A
+      reference: <testLibrary>::@topLevelVariable::A
+      firstFragment: #F3
+      type: int
+      getter: <testLibrary>::@getter::A
+  getters
+    isOriginDeclaration isStatic A
+      reference: <testLibrary>::@getter::A
+      firstFragment: #F4
+      previousFragmentOfDifferentKind: #F1
+      returnType: int
+      variable: <testLibrary>::@topLevelVariable::A
+  exportEntries
+    declared <testLibrary>::@getter::A
+  exportNamespace
+    A: <testLibrary>::@getter::A
+''');
+  }
+
+  test_getter_augmentation_sameName_function() async {
+    var library = await buildLibrary(r'''
+void foo() {}
+augment int get foo => 0;
+''');
+
+    configuration.withExportScope = true;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  fragments
+    #F0 <testLibraryFragment>
+      element: <testLibrary>
+      topLevelVariables
+        #F1 isOriginGetterSetter isStatic foo (nameOffset:<null>) (firstTokenOffset:<null>) (offset:30)
+          element: <testLibrary>::@topLevelVariable::foo
+      getters
+        #F2 isAugmentation isCompleteDeclaration isOriginDeclaration isStatic foo (nameOffset:30) (firstTokenOffset:14) (offset:30)
+          element: <testLibrary>::@getter::foo
+      functions
+        #F3 isCompleteDeclaration isOriginDeclaration isStatic foo (nameOffset:5) (firstTokenOffset:0) (offset:5)
+          element: <testLibrary>::@function::foo
+  topLevelVariables
+    isOriginGetterSetter isStatic foo
+      reference: <testLibrary>::@topLevelVariable::foo
+      firstFragment: #F1
+      type: int
+      getter: <testLibrary>::@getter::foo
+  getters
+    isOriginDeclaration isStatic foo
+      reference: <testLibrary>::@getter::foo
+      firstFragment: #F2
+      previousFragmentOfDifferentKind: #F3
+      returnType: int
+      variable: <testLibrary>::@topLevelVariable::foo
+  functions
+    isOriginDeclaration isStatic foo
+      reference: <testLibrary>::@function::foo
+      firstFragment: #F3
+      returnType: void
+  exportEntries
+    declared <testLibrary>::@getter::foo
+  exportNamespace
+    foo: <testLibrary>::@getter::foo
+''');
+  }
+
+  test_getter_augmentation_sameName_setter() async {
+    var library = await buildLibrary(r'''
+set foo(int _) {}
+augment int get foo => 0;
+''');
+
+    configuration.withExportScope = true;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  fragments
+    #F0 <testLibraryFragment>
+      element: <testLibrary>
+      topLevelVariables
+        #F1 isOriginGetterSetter isStatic foo (nameOffset:<null>) (firstTokenOffset:<null>) (offset:34)
+          element: <testLibrary>::@topLevelVariable::foo
+      getters
+        #F2 isAugmentation isCompleteDeclaration isOriginDeclaration isStatic foo (nameOffset:34) (firstTokenOffset:18) (offset:34)
+          element: <testLibrary>::@getter::foo
+      setters
+        #F3 hasImplicitReturnType isCompleteDeclaration isOriginDeclaration isStatic foo (nameOffset:4) (firstTokenOffset:0) (offset:4)
+          element: <testLibrary>::@setter::foo
+          formalParameters
+            #F4 requiredPositional isOriginDeclaration _ (nameOffset:12) (firstTokenOffset:8) (offset:12)
+              element: <testLibrary>::@setter::foo::@formalParameter::_
+  topLevelVariables
+    isOriginGetterSetter isStatic foo
+      reference: <testLibrary>::@topLevelVariable::foo
+      firstFragment: #F1
+      type: int
+      getter: <testLibrary>::@getter::foo
+      setter: <testLibrary>::@setter::foo
+  getters
+    isOriginDeclaration isStatic foo
+      reference: <testLibrary>::@getter::foo
+      firstFragment: #F2
+      previousFragmentOfDifferentKind: #F3
+      returnType: int
+      variable: <testLibrary>::@topLevelVariable::foo
+  setters
+    isOriginDeclaration isStatic foo
+      reference: <testLibrary>::@setter::foo
+      firstFragment: #F3
+      formalParameters
+        #E0 requiredPositional _
+          firstFragment: #F4
+          type: int
+      returnType: void
+      variable: <testLibrary>::@topLevelVariable::foo
+  exportEntries
+    declared <testLibrary>::@getter::foo
+    declared <testLibrary>::@setter::foo
+  exportNamespace
+    foo: <testLibrary>::@getter::foo
+    foo=: <testLibrary>::@setter::foo
+''');
+  }
+
   test_getter_documented() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 // Extra comment so doc comment offset != 0
 /**
  * Docs
  */
-get x => null;''');
+get x => null;
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -289,7 +1035,9 @@
   }
 
   test_getter_external() async {
-    var library = await buildLibrary('external int get x;');
+    var library = await buildLibrary(r'''
+external int get x;
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -318,9 +1066,15 @@
   }
 
   test_getter_inferred_type_nonStatic_implicit_return() async {
-    var library = await buildLibrary(
-      'class C extends D { get f => null; } abstract class D { int get f; }',
-    );
+    var library = await buildLibrary(r'''
+class C extends D {
+  get f => null;
+}
+
+abstract class D {
+  int get f;
+}
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -338,19 +1092,19 @@
               element: <testLibrary>::@class::C::@constructor::new
               typeName: C
           getters
-            #F4 hasImplicitReturnType isCompleteDeclaration isOriginDeclaration f (nameOffset:24) (firstTokenOffset:20) (offset:24)
+            #F4 hasImplicitReturnType isCompleteDeclaration isOriginDeclaration f (nameOffset:26) (firstTokenOffset:22) (offset:26)
               element: <testLibrary>::@class::C::@getter::f
-        #F5 isAbstract class D (nameOffset:52) (firstTokenOffset:37) (offset:52)
+        #F5 isAbstract class D (nameOffset:55) (firstTokenOffset:40) (offset:55)
           element: <testLibrary>::@class::D
           fields
-            #F6 isOriginGetterSetter f (nameOffset:<null>) (firstTokenOffset:<null>) (offset:52)
+            #F6 isOriginGetterSetter f (nameOffset:<null>) (firstTokenOffset:<null>) (offset:55)
               element: <testLibrary>::@class::D::@field::f
           constructors
-            #F7 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:52)
+            #F7 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:55)
               element: <testLibrary>::@class::D::@constructor::new
               typeName: D
           getters
-            #F8 isAbstract isOriginDeclaration f (nameOffset:64) (firstTokenOffset:56) (offset:64)
+            #F8 isAbstract isOriginDeclaration f (nameOffset:69) (firstTokenOffset:61) (offset:69)
               element: <testLibrary>::@class::D::@getter::f
   classes
     isSimplyBounded class C
@@ -428,7 +1182,10 @@
   }
 
   test_getters() async {
-    var library = await buildLibrary('int get x => null; get y => null;');
+    var library = await buildLibrary(r'''
+int get x => null;
+get y => null;
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -471,9 +1228,10 @@
   }
 
   test_implicitTopLevelVariable_getterFirst() async {
-    var library = await buildLibrary(
-      'int get x => 0; void set x(int value) {}',
-    );
+    var library = await buildLibrary(r'''
+int get x => 0;
+void set x(int value) {}
+''');
 
     checkElementText(library, r'''
 library
@@ -520,9 +1278,10 @@
   }
 
   test_implicitTopLevelVariable_setterFirst() async {
-    var library = await buildLibrary(
-      'void set x(int value) {} int get x => 0;',
-    );
+    var library = await buildLibrary(r'''
+void set x(int value) {}
+int get x => 0;
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -568,7 +1327,7 @@
   }
 
   test_setter_abstract() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 set x(int _);
 ''');
     checkElementText(library, r'''
@@ -605,13 +1364,922 @@
 ''');
   }
 
+  test_setter_augmentation_chain() async {
+    var library = await buildLibrary(r'''
+set foo(int _) {}
+augment set foo(int _) {}
+''');
+
+    configuration.withExportScope = true;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  fragments
+    #F0 <testLibraryFragment>
+      element: <testLibrary>
+      topLevelVariables
+        #F1 isOriginGetterSetter isStatic foo (nameOffset:<null>) (firstTokenOffset:<null>) (offset:4)
+          element: <testLibrary>::@topLevelVariable::foo
+      setters
+        #F2 hasImplicitReturnType isCompleteDeclaration isOriginDeclaration isStatic foo (nameOffset:4) (firstTokenOffset:0) (offset:4)
+          element: <testLibrary>::@setter::foo
+          formalParameters
+            #F3 requiredPositional isOriginDeclaration _ (nameOffset:12) (firstTokenOffset:8) (offset:12)
+              element: <testLibrary>::@setter::foo::@formalParameter::_
+              nextFragment: #F4
+          nextFragment: #F5
+        #F5 hasImplicitReturnType isAugmentation isCompleteDeclaration isOriginDeclaration isStatic foo (nameOffset:30) (firstTokenOffset:18) (offset:30)
+          element: <testLibrary>::@setter::foo
+          formalParameters
+            #F4 requiredPositional isOriginDeclaration _ (nameOffset:38) (firstTokenOffset:34) (offset:38)
+              element: <testLibrary>::@setter::foo::@formalParameter::_
+              previousFragment: #F3
+          previousFragment: #F2
+  topLevelVariables
+    isOriginGetterSetter isStatic foo
+      reference: <testLibrary>::@topLevelVariable::foo
+      firstFragment: #F1
+      type: int
+      setter: <testLibrary>::@setter::foo
+  setters
+    isOriginDeclaration isStatic foo
+      reference: <testLibrary>::@setter::foo
+      firstFragment: #F2
+      formalParameters
+        #E0 requiredPositional _
+          firstFragment: #F3
+          type: int
+      returnType: void
+      variable: <testLibrary>::@topLevelVariable::foo
+  exportEntries
+    declared <testLibrary>::@setter::foo
+  exportNamespace
+    foo=: <testLibrary>::@setter::foo
+''');
+  }
+
+  test_setter_augmentation_chain_fromVariable() async {
+    var library = await buildLibrary(r'''
+int foo = 0;
+augment set foo(int _) {}
+''');
+
+    configuration.withExportScope = true;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  fragments
+    #F0 <testLibraryFragment>
+      element: <testLibrary>
+      topLevelVariables
+        #F1 hasInitializer isOriginDeclaration isStatic foo (nameOffset:4) (firstTokenOffset:4) (offset:4)
+          element: <testLibrary>::@topLevelVariable::foo
+      getters
+        #F2 isCompleteDeclaration isOriginVariable isStatic foo (nameOffset:<null>) (firstTokenOffset:<null>) (offset:4)
+          element: <testLibrary>::@getter::foo
+      setters
+        #F3 isCompleteDeclaration isOriginVariable isStatic foo (nameOffset:<null>) (firstTokenOffset:<null>) (offset:4)
+          element: <testLibrary>::@setter::foo
+          formalParameters
+            #F4 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:4)
+              element: <testLibrary>::@setter::foo::@formalParameter::value
+              nextFragment: #F5
+          nextFragment: #F6
+        #F6 hasImplicitReturnType isAugmentation isCompleteDeclaration isOriginDeclaration isStatic foo (nameOffset:25) (firstTokenOffset:13) (offset:25)
+          element: <testLibrary>::@setter::foo
+          formalParameters
+            #F5 requiredPositional isOriginDeclaration _ (nameOffset:33) (firstTokenOffset:29) (offset:33)
+              element: <testLibrary>::@setter::foo::@formalParameter::value
+              previousFragment: #F4
+          previousFragment: #F3
+  topLevelVariables
+    hasInitializer isOriginDeclaration isStatic foo
+      reference: <testLibrary>::@topLevelVariable::foo
+      firstFragment: #F1
+      type: int
+      getter: <testLibrary>::@getter::foo
+      setter: <testLibrary>::@setter::foo
+  getters
+    isOriginVariable isStatic foo
+      reference: <testLibrary>::@getter::foo
+      firstFragment: #F2
+      returnType: int
+      variable: <testLibrary>::@topLevelVariable::foo
+  setters
+    isOriginVariable isStatic foo
+      reference: <testLibrary>::@setter::foo
+      firstFragment: #F3
+      formalParameters
+        #E0 requiredPositional value
+          firstFragment: #F4
+          type: int
+      returnType: void
+      variable: <testLibrary>::@topLevelVariable::foo
+  exportEntries
+    declared <testLibrary>::@getter::foo
+    declared <testLibrary>::@setter::foo
+  exportNamespace
+    foo: <testLibrary>::@getter::foo
+    foo=: <testLibrary>::@setter::foo
+''');
+  }
+
+  test_setter_augmentation_chain_fromVariable_differentType() async {
+    var library = await buildLibrary(r'''
+int foo = 0;
+augment set foo(double _) {}
+''');
+
+    configuration.withExportScope = true;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  fragments
+    #F0 <testLibraryFragment>
+      element: <testLibrary>
+      topLevelVariables
+        #F1 hasInitializer isOriginDeclaration isStatic foo (nameOffset:4) (firstTokenOffset:4) (offset:4)
+          element: <testLibrary>::@topLevelVariable::foo
+      getters
+        #F2 isCompleteDeclaration isOriginVariable isStatic foo (nameOffset:<null>) (firstTokenOffset:<null>) (offset:4)
+          element: <testLibrary>::@getter::foo
+      setters
+        #F3 isCompleteDeclaration isOriginVariable isStatic foo (nameOffset:<null>) (firstTokenOffset:<null>) (offset:4)
+          element: <testLibrary>::@setter::foo
+          formalParameters
+            #F4 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:4)
+              element: <testLibrary>::@setter::foo::@formalParameter::value
+              nextFragment: #F5
+          nextFragment: #F6
+        #F6 hasImplicitReturnType isAugmentation isCompleteDeclaration isOriginDeclaration isStatic foo (nameOffset:25) (firstTokenOffset:13) (offset:25)
+          element: <testLibrary>::@setter::foo
+          formalParameters
+            #F5 requiredPositional isOriginDeclaration _ (nameOffset:36) (firstTokenOffset:29) (offset:36)
+              element: <testLibrary>::@setter::foo::@formalParameter::value
+              previousFragment: #F4
+          previousFragment: #F3
+  topLevelVariables
+    hasInitializer isOriginDeclaration isStatic foo
+      reference: <testLibrary>::@topLevelVariable::foo
+      firstFragment: #F1
+      type: int
+      getter: <testLibrary>::@getter::foo
+      setter: <testLibrary>::@setter::foo
+  getters
+    isOriginVariable isStatic foo
+      reference: <testLibrary>::@getter::foo
+      firstFragment: #F2
+      returnType: int
+      variable: <testLibrary>::@topLevelVariable::foo
+  setters
+    isOriginVariable isStatic foo
+      reference: <testLibrary>::@setter::foo
+      firstFragment: #F3
+      formalParameters
+        #E0 requiredPositional value
+          firstFragment: #F4
+          type: int
+      returnType: void
+      variable: <testLibrary>::@topLevelVariable::foo
+  exportEntries
+    declared <testLibrary>::@getter::foo
+    declared <testLibrary>::@setter::foo
+  exportNamespace
+    foo: <testLibrary>::@getter::foo
+    foo=: <testLibrary>::@setter::foo
+''');
+  }
+
+  test_setter_augmentation_chain_metadata() async {
+    newFile('$testPackageLibPath/a.dart', r'''
+const a1 = 1;
+const a2 = 2;
+const a3 = 3;
+''');
+
+    var library = await buildLibrary(r'''
+import 'a.dart';
+
+@a1
+set foo(int _) {}
+@a2
+augment set foo(int _) {}
+@a3
+augment set foo(int _) {}
+''');
+
+    configuration.withExportScope = true;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  fragments
+    #F0 <testLibraryFragment>
+      element: <testLibrary>
+      libraryImports
+        package:test/a.dart
+      topLevelVariables
+        #F1 isOriginGetterSetter isStatic foo (nameOffset:<null>) (firstTokenOffset:<null>) (offset:26)
+          element: <testLibrary>::@topLevelVariable::foo
+      setters
+        #F2 hasImplicitReturnType isCompleteDeclaration isOriginDeclaration isStatic foo (nameOffset:26) (firstTokenOffset:18) (offset:26)
+          element: <testLibrary>::@setter::foo
+          metadata
+            Annotation
+              atSign: @ @18
+              name: SimpleIdentifier
+                token: a1 @19
+                element: package:test/a.dart::@getter::a1
+                staticType: null
+              element: package:test/a.dart::@getter::a1
+          formalParameters
+            #F3 requiredPositional isOriginDeclaration _ (nameOffset:34) (firstTokenOffset:30) (offset:34)
+              element: <testLibrary>::@setter::foo::@formalParameter::_
+              nextFragment: #F4
+          nextFragment: #F5
+        #F5 hasImplicitReturnType isAugmentation isCompleteDeclaration isOriginDeclaration isStatic foo (nameOffset:56) (firstTokenOffset:40) (offset:56)
+          element: <testLibrary>::@setter::foo
+          metadata
+            Annotation
+              atSign: @ @40
+              name: SimpleIdentifier
+                token: a2 @41
+                element: package:test/a.dart::@getter::a2
+                staticType: null
+              element: package:test/a.dart::@getter::a2
+          formalParameters
+            #F4 requiredPositional isOriginDeclaration _ (nameOffset:64) (firstTokenOffset:60) (offset:64)
+              element: <testLibrary>::@setter::foo::@formalParameter::_
+              previousFragment: #F3
+              nextFragment: #F6
+          previousFragment: #F2
+          nextFragment: #F7
+        #F7 hasImplicitReturnType isAugmentation isCompleteDeclaration isOriginDeclaration isStatic foo (nameOffset:86) (firstTokenOffset:70) (offset:86)
+          element: <testLibrary>::@setter::foo
+          metadata
+            Annotation
+              atSign: @ @70
+              name: SimpleIdentifier
+                token: a3 @71
+                element: package:test/a.dart::@getter::a3
+                staticType: null
+              element: package:test/a.dart::@getter::a3
+          formalParameters
+            #F6 requiredPositional isOriginDeclaration _ (nameOffset:94) (firstTokenOffset:90) (offset:94)
+              element: <testLibrary>::@setter::foo::@formalParameter::_
+              previousFragment: #F4
+          previousFragment: #F5
+  topLevelVariables
+    isOriginGetterSetter isStatic foo
+      reference: <testLibrary>::@topLevelVariable::foo
+      firstFragment: #F1
+      type: int
+      setter: <testLibrary>::@setter::foo
+  setters
+    isOriginDeclaration isStatic foo
+      reference: <testLibrary>::@setter::foo
+      firstFragment: #F2
+      metadata
+        Annotation
+          atSign: @ @18
+          name: SimpleIdentifier
+            token: a1 @19
+            element: package:test/a.dart::@getter::a1
+            staticType: null
+          element: package:test/a.dart::@getter::a1
+        Annotation
+          atSign: @ @40
+          name: SimpleIdentifier
+            token: a2 @41
+            element: package:test/a.dart::@getter::a2
+            staticType: null
+          element: package:test/a.dart::@getter::a2
+        Annotation
+          atSign: @ @70
+          name: SimpleIdentifier
+            token: a3 @71
+            element: package:test/a.dart::@getter::a3
+            staticType: null
+          element: package:test/a.dart::@getter::a3
+      formalParameters
+        #E0 requiredPositional _
+          firstFragment: #F3
+          type: int
+      returnType: void
+      variable: <testLibrary>::@topLevelVariable::foo
+  exportEntries
+    declared <testLibrary>::@setter::foo
+  exportNamespace
+    foo=: <testLibrary>::@setter::foo
+''');
+  }
+
+  test_setter_augmentation_chain_noIntroductoryDeclaration() async {
+    var library = await buildLibrary(r'''
+augment set foo(int value) {}
+''');
+
+    configuration.withExportScope = true;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  fragments
+    #F0 <testLibraryFragment>
+      element: <testLibrary>
+      topLevelVariables
+        #F1 isOriginGetterSetter isStatic foo (nameOffset:<null>) (firstTokenOffset:<null>) (offset:12)
+          element: <testLibrary>::@topLevelVariable::foo
+      setters
+        #F2 hasImplicitReturnType isAugmentation isCompleteDeclaration isOriginDeclaration isStatic foo (nameOffset:12) (firstTokenOffset:0) (offset:12)
+          element: <testLibrary>::@setter::foo
+          formalParameters
+            #F3 requiredPositional isOriginDeclaration value (nameOffset:20) (firstTokenOffset:16) (offset:20)
+              element: <testLibrary>::@setter::foo::@formalParameter::value
+  topLevelVariables
+    isOriginGetterSetter isStatic foo
+      reference: <testLibrary>::@topLevelVariable::foo
+      firstFragment: #F1
+      type: int
+      setter: <testLibrary>::@setter::foo
+  setters
+    isOriginDeclaration isStatic foo
+      reference: <testLibrary>::@setter::foo
+      firstFragment: #F2
+      formalParameters
+        #E0 requiredPositional value
+          firstFragment: #F3
+          type: int
+      returnType: void
+      variable: <testLibrary>::@topLevelVariable::foo
+  exportEntries
+    declared <testLibrary>::@setter::foo
+  exportNamespace
+    foo=: <testLibrary>::@setter::foo
+''');
+  }
+
+  test_setter_augmentation_chain_twoDeclarations() async {
+    var library = await buildLibrary(r'''
+int set foo(int _) {}
+augment set foo(int _) {}
+augment set foo(int _) {}
+''');
+
+    configuration.withExportScope = true;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  fragments
+    #F0 <testLibraryFragment>
+      element: <testLibrary>
+      topLevelVariables
+        #F1 isOriginGetterSetter isStatic foo (nameOffset:<null>) (firstTokenOffset:<null>) (offset:8)
+          element: <testLibrary>::@topLevelVariable::foo
+      setters
+        #F2 isCompleteDeclaration isOriginDeclaration isStatic foo (nameOffset:8) (firstTokenOffset:0) (offset:8)
+          element: <testLibrary>::@setter::foo
+          formalParameters
+            #F3 requiredPositional isOriginDeclaration _ (nameOffset:16) (firstTokenOffset:12) (offset:16)
+              element: <testLibrary>::@setter::foo::@formalParameter::_
+              nextFragment: #F4
+          nextFragment: #F5
+        #F5 hasImplicitReturnType isAugmentation isCompleteDeclaration isOriginDeclaration isStatic foo (nameOffset:34) (firstTokenOffset:22) (offset:34)
+          element: <testLibrary>::@setter::foo
+          formalParameters
+            #F4 requiredPositional isOriginDeclaration _ (nameOffset:42) (firstTokenOffset:38) (offset:42)
+              element: <testLibrary>::@setter::foo::@formalParameter::_
+              previousFragment: #F3
+              nextFragment: #F6
+          previousFragment: #F2
+          nextFragment: #F7
+        #F7 hasImplicitReturnType isAugmentation isCompleteDeclaration isOriginDeclaration isStatic foo (nameOffset:60) (firstTokenOffset:48) (offset:60)
+          element: <testLibrary>::@setter::foo
+          formalParameters
+            #F6 requiredPositional isOriginDeclaration _ (nameOffset:68) (firstTokenOffset:64) (offset:68)
+              element: <testLibrary>::@setter::foo::@formalParameter::_
+              previousFragment: #F4
+          previousFragment: #F5
+  topLevelVariables
+    isOriginGetterSetter isStatic foo
+      reference: <testLibrary>::@topLevelVariable::foo
+      firstFragment: #F1
+      type: int
+      setter: <testLibrary>::@setter::foo
+  setters
+    isOriginDeclaration isStatic foo
+      reference: <testLibrary>::@setter::foo
+      firstFragment: #F2
+      formalParameters
+        #E0 requiredPositional _
+          firstFragment: #F3
+          type: int
+      returnType: int
+      variable: <testLibrary>::@topLevelVariable::foo
+  exportEntries
+    declared <testLibrary>::@setter::foo
+  exportNamespace
+    foo=: <testLibrary>::@setter::foo
+''');
+  }
+
+  test_setter_augmentation_chain_twoDeclarations_differentType() async {
+    var library = await buildLibrary(r'''
+int set foo(int _) {}
+augment set foo(int _) {}
+augment set foo(double _) {}
+''');
+
+    configuration.withExportScope = true;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  fragments
+    #F0 <testLibraryFragment>
+      element: <testLibrary>
+      topLevelVariables
+        #F1 isOriginGetterSetter isStatic foo (nameOffset:<null>) (firstTokenOffset:<null>) (offset:8)
+          element: <testLibrary>::@topLevelVariable::foo
+      setters
+        #F2 isCompleteDeclaration isOriginDeclaration isStatic foo (nameOffset:8) (firstTokenOffset:0) (offset:8)
+          element: <testLibrary>::@setter::foo
+          formalParameters
+            #F3 requiredPositional isOriginDeclaration _ (nameOffset:16) (firstTokenOffset:12) (offset:16)
+              element: <testLibrary>::@setter::foo::@formalParameter::_
+              nextFragment: #F4
+          nextFragment: #F5
+        #F5 hasImplicitReturnType isAugmentation isCompleteDeclaration isOriginDeclaration isStatic foo (nameOffset:34) (firstTokenOffset:22) (offset:34)
+          element: <testLibrary>::@setter::foo
+          formalParameters
+            #F4 requiredPositional isOriginDeclaration _ (nameOffset:42) (firstTokenOffset:38) (offset:42)
+              element: <testLibrary>::@setter::foo::@formalParameter::_
+              previousFragment: #F3
+              nextFragment: #F6
+          previousFragment: #F2
+          nextFragment: #F7
+        #F7 hasImplicitReturnType isAugmentation isCompleteDeclaration isOriginDeclaration isStatic foo (nameOffset:60) (firstTokenOffset:48) (offset:60)
+          element: <testLibrary>::@setter::foo
+          formalParameters
+            #F6 requiredPositional isOriginDeclaration _ (nameOffset:71) (firstTokenOffset:64) (offset:71)
+              element: <testLibrary>::@setter::foo::@formalParameter::_
+              previousFragment: #F4
+          previousFragment: #F5
+  topLevelVariables
+    isOriginGetterSetter isStatic foo
+      reference: <testLibrary>::@topLevelVariable::foo
+      firstFragment: #F1
+      type: int
+      setter: <testLibrary>::@setter::foo
+  setters
+    isOriginDeclaration isStatic foo
+      reference: <testLibrary>::@setter::foo
+      firstFragment: #F2
+      formalParameters
+        #E0 requiredPositional _
+          firstFragment: #F3
+          type: int
+      returnType: int
+      variable: <testLibrary>::@topLevelVariable::foo
+  exportEntries
+    declared <testLibrary>::@setter::foo
+  exportNamespace
+    foo=: <testLibrary>::@setter::foo
+''');
+  }
+
+  test_setter_augmentation_sameName_class() async {
+    var library = await buildLibrary(r'''
+class A {}
+
+augment set A(int _) {}
+''');
+
+    configuration.withExportScope = true;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  fragments
+    #F0 <testLibraryFragment>
+      element: <testLibrary>
+      classes
+        #F1 class A (nameOffset:6) (firstTokenOffset:0) (offset:6)
+          element: <testLibrary>::@class::A
+          constructors
+            #F2 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:6)
+              element: <testLibrary>::@class::A::@constructor::new
+              typeName: A
+      topLevelVariables
+        #F3 isOriginGetterSetter isStatic A (nameOffset:<null>) (firstTokenOffset:<null>) (offset:24)
+          element: <testLibrary>::@topLevelVariable::A
+      setters
+        #F4 hasImplicitReturnType isAugmentation isCompleteDeclaration isOriginDeclaration isStatic A (nameOffset:24) (firstTokenOffset:12) (offset:24)
+          element: <testLibrary>::@setter::A
+          formalParameters
+            #F5 requiredPositional isOriginDeclaration _ (nameOffset:30) (firstTokenOffset:26) (offset:30)
+              element: <testLibrary>::@setter::A::@formalParameter::_
+  classes
+    isSimplyBounded class A
+      reference: <testLibrary>::@class::A
+      firstFragment: #F1
+      constructors
+        isOriginImplicitDefault new
+          reference: <testLibrary>::@class::A::@constructor::new
+          firstFragment: #F2
+  topLevelVariables
+    isOriginGetterSetter isStatic A
+      reference: <testLibrary>::@topLevelVariable::A
+      firstFragment: #F3
+      type: int
+      setter: <testLibrary>::@setter::A
+  setters
+    isOriginDeclaration isStatic A
+      reference: <testLibrary>::@setter::A
+      firstFragment: #F4
+      previousFragmentOfDifferentKind: #F1
+      formalParameters
+        #E0 requiredPositional _
+          firstFragment: #F5
+          type: int
+      returnType: void
+      variable: <testLibrary>::@topLevelVariable::A
+  exportEntries
+    declared <testLibrary>::@class::A
+    declared <testLibrary>::@setter::A
+  exportNamespace
+    A: <testLibrary>::@class::A
+    A=: <testLibrary>::@setter::A
+''');
+  }
+
+  test_setter_augmentation_sameName_function() async {
+    var library = await buildLibrary(r'''
+void foo() {}
+augment set foo(int _) {}
+''');
+
+    configuration.withExportScope = true;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  fragments
+    #F0 <testLibraryFragment>
+      element: <testLibrary>
+      topLevelVariables
+        #F1 isOriginGetterSetter isStatic foo (nameOffset:<null>) (firstTokenOffset:<null>) (offset:26)
+          element: <testLibrary>::@topLevelVariable::foo
+      setters
+        #F2 hasImplicitReturnType isAugmentation isCompleteDeclaration isOriginDeclaration isStatic foo (nameOffset:26) (firstTokenOffset:14) (offset:26)
+          element: <testLibrary>::@setter::foo
+          formalParameters
+            #F3 requiredPositional isOriginDeclaration _ (nameOffset:34) (firstTokenOffset:30) (offset:34)
+              element: <testLibrary>::@setter::foo::@formalParameter::_
+      functions
+        #F4 isCompleteDeclaration isOriginDeclaration isStatic foo (nameOffset:5) (firstTokenOffset:0) (offset:5)
+          element: <testLibrary>::@function::foo
+  topLevelVariables
+    isOriginGetterSetter isStatic foo
+      reference: <testLibrary>::@topLevelVariable::foo
+      firstFragment: #F1
+      type: int
+      setter: <testLibrary>::@setter::foo
+  setters
+    isOriginDeclaration isStatic foo
+      reference: <testLibrary>::@setter::foo
+      firstFragment: #F2
+      previousFragmentOfDifferentKind: #F4
+      formalParameters
+        #E0 requiredPositional _
+          firstFragment: #F3
+          type: int
+      returnType: void
+      variable: <testLibrary>::@topLevelVariable::foo
+  functions
+    isOriginDeclaration isStatic foo
+      reference: <testLibrary>::@function::foo
+      firstFragment: #F4
+      returnType: void
+  exportEntries
+    declared <testLibrary>::@function::foo
+    declared <testLibrary>::@setter::foo
+  exportNamespace
+    foo: <testLibrary>::@function::foo
+    foo=: <testLibrary>::@setter::foo
+''');
+  }
+
+  test_setter_augmentation_sameName_getter() async {
+    var library = await buildLibrary(r'''
+int get foo => 0;
+augment set foo(int _) {}
+''');
+
+    configuration.withExportScope = true;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  fragments
+    #F0 <testLibraryFragment>
+      element: <testLibrary>
+      topLevelVariables
+        #F1 isOriginGetterSetter isStatic foo (nameOffset:<null>) (firstTokenOffset:<null>) (offset:8)
+          element: <testLibrary>::@topLevelVariable::foo
+      getters
+        #F2 isCompleteDeclaration isOriginDeclaration isStatic foo (nameOffset:8) (firstTokenOffset:0) (offset:8)
+          element: <testLibrary>::@getter::foo
+      setters
+        #F3 hasImplicitReturnType isAugmentation isCompleteDeclaration isOriginDeclaration isStatic foo (nameOffset:30) (firstTokenOffset:18) (offset:30)
+          element: <testLibrary>::@setter::foo
+          formalParameters
+            #F4 requiredPositional isOriginDeclaration _ (nameOffset:38) (firstTokenOffset:34) (offset:38)
+              element: <testLibrary>::@setter::foo::@formalParameter::_
+  topLevelVariables
+    isOriginGetterSetter isStatic foo
+      reference: <testLibrary>::@topLevelVariable::foo
+      firstFragment: #F1
+      type: int
+      getter: <testLibrary>::@getter::foo
+      setter: <testLibrary>::@setter::foo
+  getters
+    isOriginDeclaration isStatic foo
+      reference: <testLibrary>::@getter::foo
+      firstFragment: #F2
+      returnType: int
+      variable: <testLibrary>::@topLevelVariable::foo
+  setters
+    isOriginDeclaration isStatic foo
+      reference: <testLibrary>::@setter::foo
+      firstFragment: #F3
+      previousFragmentOfDifferentKind: #F2
+      formalParameters
+        #E0 requiredPositional _
+          firstFragment: #F4
+          type: int
+      returnType: void
+      variable: <testLibrary>::@topLevelVariable::foo
+  exportEntries
+    declared <testLibrary>::@getter::foo
+    declared <testLibrary>::@setter::foo
+  exportNamespace
+    foo: <testLibrary>::@getter::foo
+    foo=: <testLibrary>::@setter::foo
+''');
+  }
+
+  test_setter_augmentation_sameName_getter_differentType() async {
+    var library = await buildLibrary(r'''
+int get foo => 0;
+augment set foo(double _) {}
+''');
+
+    configuration.withExportScope = true;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  fragments
+    #F0 <testLibraryFragment>
+      element: <testLibrary>
+      topLevelVariables
+        #F1 isOriginGetterSetter isStatic foo (nameOffset:<null>) (firstTokenOffset:<null>) (offset:8)
+          element: <testLibrary>::@topLevelVariable::foo
+      getters
+        #F2 isCompleteDeclaration isOriginDeclaration isStatic foo (nameOffset:8) (firstTokenOffset:0) (offset:8)
+          element: <testLibrary>::@getter::foo
+      setters
+        #F3 hasImplicitReturnType isAugmentation isCompleteDeclaration isOriginDeclaration isStatic foo (nameOffset:30) (firstTokenOffset:18) (offset:30)
+          element: <testLibrary>::@setter::foo
+          formalParameters
+            #F4 requiredPositional isOriginDeclaration _ (nameOffset:41) (firstTokenOffset:34) (offset:41)
+              element: <testLibrary>::@setter::foo::@formalParameter::_
+  topLevelVariables
+    isOriginGetterSetter isStatic foo
+      reference: <testLibrary>::@topLevelVariable::foo
+      firstFragment: #F1
+      type: int
+      getter: <testLibrary>::@getter::foo
+      setter: <testLibrary>::@setter::foo
+  getters
+    isOriginDeclaration isStatic foo
+      reference: <testLibrary>::@getter::foo
+      firstFragment: #F2
+      returnType: int
+      variable: <testLibrary>::@topLevelVariable::foo
+  setters
+    isOriginDeclaration isStatic foo
+      reference: <testLibrary>::@setter::foo
+      firstFragment: #F3
+      previousFragmentOfDifferentKind: #F2
+      formalParameters
+        #E0 requiredPositional _
+          firstFragment: #F4
+          type: double
+      returnType: void
+      variable: <testLibrary>::@topLevelVariable::foo
+  exportEntries
+    declared <testLibrary>::@getter::foo
+    declared <testLibrary>::@setter::foo
+  exportNamespace
+    foo: <testLibrary>::@getter::foo
+    foo=: <testLibrary>::@setter::foo
+''');
+  }
+
+  test_setter_augmentation_sameName_variable_const() async {
+    var library = await buildLibrary(r'''
+const int foo = 0;
+augment set foo(int _) {}
+''');
+
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  fragments
+    #F0 <testLibraryFragment>
+      element: <testLibrary>
+      topLevelVariables
+        #F1 hasInitializer isConst isOriginDeclaration isStatic foo (nameOffset:10) (firstTokenOffset:10) (offset:10)
+          element: <testLibrary>::@topLevelVariable::foo
+          initializer: expression_0
+            IntegerLiteral
+              literal: 0 @16
+              staticType: int
+      getters
+        #F2 isCompleteDeclaration isOriginVariable isStatic foo (nameOffset:<null>) (firstTokenOffset:<null>) (offset:10)
+          element: <testLibrary>::@getter::foo
+      setters
+        #F3 hasImplicitReturnType isAugmentation isCompleteDeclaration isOriginDeclaration isStatic foo (nameOffset:31) (firstTokenOffset:19) (offset:31)
+          element: <testLibrary>::@setter::foo
+          formalParameters
+            #F4 requiredPositional isOriginDeclaration _ (nameOffset:39) (firstTokenOffset:35) (offset:39)
+              element: <testLibrary>::@setter::foo::@formalParameter::_
+  topLevelVariables
+    hasInitializer isConst isOriginDeclaration isStatic foo
+      reference: <testLibrary>::@topLevelVariable::foo
+      firstFragment: #F1
+      type: int
+      constantInitializer
+        fragment: #F1
+        expression: expression_0
+      getter: <testLibrary>::@getter::foo
+      setter: <testLibrary>::@setter::foo
+  getters
+    isOriginVariable isStatic foo
+      reference: <testLibrary>::@getter::foo
+      firstFragment: #F2
+      returnType: int
+      variable: <testLibrary>::@topLevelVariable::foo
+  setters
+    isOriginDeclaration isStatic foo
+      reference: <testLibrary>::@setter::foo
+      firstFragment: #F3
+      previousFragmentOfDifferentKind: #F1
+      formalParameters
+        #E0 requiredPositional _
+          firstFragment: #F4
+          type: int
+      returnType: void
+      variable: <testLibrary>::@topLevelVariable::foo
+''');
+  }
+
+  test_setter_augmentation_sameName_variable_final() async {
+    var library = await buildLibrary(r'''
+final int foo = 0;
+augment set foo(int _) {}
+''');
+
+    configuration.withExportScope = true;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  fragments
+    #F0 <testLibraryFragment>
+      element: <testLibrary>
+      topLevelVariables
+        #F1 hasInitializer isFinal isOriginDeclaration isStatic foo (nameOffset:10) (firstTokenOffset:10) (offset:10)
+          element: <testLibrary>::@topLevelVariable::foo
+      getters
+        #F2 isCompleteDeclaration isOriginVariable isStatic foo (nameOffset:<null>) (firstTokenOffset:<null>) (offset:10)
+          element: <testLibrary>::@getter::foo
+      setters
+        #F3 hasImplicitReturnType isAugmentation isCompleteDeclaration isOriginDeclaration isStatic foo (nameOffset:31) (firstTokenOffset:19) (offset:31)
+          element: <testLibrary>::@setter::foo
+          formalParameters
+            #F4 requiredPositional isOriginDeclaration _ (nameOffset:39) (firstTokenOffset:35) (offset:39)
+              element: <testLibrary>::@setter::foo::@formalParameter::_
+  topLevelVariables
+    hasInitializer isFinal isOriginDeclaration isStatic foo
+      reference: <testLibrary>::@topLevelVariable::foo
+      firstFragment: #F1
+      type: int
+      getter: <testLibrary>::@getter::foo
+      setter: <testLibrary>::@setter::foo
+  getters
+    isOriginVariable isStatic foo
+      reference: <testLibrary>::@getter::foo
+      firstFragment: #F2
+      returnType: int
+      variable: <testLibrary>::@topLevelVariable::foo
+  setters
+    isOriginDeclaration isStatic foo
+      reference: <testLibrary>::@setter::foo
+      firstFragment: #F3
+      previousFragmentOfDifferentKind: #F1
+      formalParameters
+        #E0 requiredPositional _
+          firstFragment: #F4
+          type: int
+      returnType: void
+      variable: <testLibrary>::@topLevelVariable::foo
+  exportEntries
+    declared <testLibrary>::@getter::foo
+    declared <testLibrary>::@setter::foo
+  exportNamespace
+    foo: <testLibrary>::@getter::foo
+    foo=: <testLibrary>::@setter::foo
+''');
+  }
+
+  test_setter_augmentation_sameName_variable_metadata() async {
+    var library = await buildLibrary(r'''
+final foo = 0;
+@deprecated
+augment set foo(int _) {}
+''');
+
+    configuration.withExportScope = true;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  fragments
+    #F0 <testLibraryFragment>
+      element: <testLibrary>
+      topLevelVariables
+        #F1 hasImplicitType hasInitializer isFinal isOriginDeclaration isStatic foo (nameOffset:6) (firstTokenOffset:6) (offset:6)
+          element: <testLibrary>::@topLevelVariable::foo
+      getters
+        #F2 isCompleteDeclaration isOriginVariable isStatic foo (nameOffset:<null>) (firstTokenOffset:<null>) (offset:6)
+          element: <testLibrary>::@getter::foo
+      setters
+        #F3 hasImplicitReturnType isAugmentation isCompleteDeclaration isOriginDeclaration isStatic foo (nameOffset:39) (firstTokenOffset:15) (offset:39)
+          element: <testLibrary>::@setter::foo
+          metadata
+            Annotation
+              atSign: @ @15
+              name: SimpleIdentifier
+                token: deprecated @16
+                element: dart:core::@getter::deprecated
+                staticType: null
+              element: dart:core::@getter::deprecated
+          formalParameters
+            #F4 requiredPositional isOriginDeclaration _ (nameOffset:47) (firstTokenOffset:43) (offset:47)
+              element: <testLibrary>::@setter::foo::@formalParameter::_
+  topLevelVariables
+    hasImplicitType hasInitializer isFinal isOriginDeclaration isStatic isTypeInferredFromInitializer foo
+      reference: <testLibrary>::@topLevelVariable::foo
+      firstFragment: #F1
+      type: int
+      getter: <testLibrary>::@getter::foo
+      setter: <testLibrary>::@setter::foo
+  getters
+    isOriginVariable isStatic foo
+      reference: <testLibrary>::@getter::foo
+      firstFragment: #F2
+      returnType: int
+      variable: <testLibrary>::@topLevelVariable::foo
+  setters
+    isOriginDeclaration isStatic foo
+      reference: <testLibrary>::@setter::foo
+      firstFragment: #F3
+      previousFragmentOfDifferentKind: #F1
+      metadata
+        Annotation
+          atSign: @ @15
+          name: SimpleIdentifier
+            token: deprecated @16
+            element: dart:core::@getter::deprecated
+            staticType: null
+          element: dart:core::@getter::deprecated
+      formalParameters
+        #E0 requiredPositional _
+          firstFragment: #F4
+          type: int
+      returnType: void
+      variable: <testLibrary>::@topLevelVariable::foo
+  exportEntries
+    declared <testLibrary>::@getter::foo
+    declared <testLibrary>::@setter::foo
+  exportNamespace
+    foo: <testLibrary>::@getter::foo
+    foo=: <testLibrary>::@setter::foo
+''');
+  }
+
   test_setter_documented() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 // Extra comment so doc comment offset != 0
 /**
  * Docs
  */
-void set x(value) {}''');
+void set x(value) {}
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -649,7 +2317,9 @@
   }
 
   test_setter_external() async {
-    var library = await buildLibrary('external void set x(int value);');
+    var library = await buildLibrary(r'''
+external void set x(int value);
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -685,7 +2355,9 @@
   }
 
   test_setter_inferred_type_top_level_implicit_return() async {
-    var library = await buildLibrary('set f(int value) {}');
+    var library = await buildLibrary(r'''
+set f(int value) {}
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -721,9 +2393,10 @@
   }
 
   test_setters() async {
-    var library = await buildLibrary(
-      'void set x(int value) {} set y(value) {}',
-    );
+    var library = await buildLibrary(r'''
+void set x(int value) {}
+set y(value) {}
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -780,7 +2453,7 @@
   }
 
   test_unit_implicitVariable_getterFirst() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 int get x => 0;
 void set x(int value) {}
 ''');
@@ -829,7 +2502,7 @@
   }
 
   test_unit_implicitVariable_setterFirst() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 void set x(int value) {}
 int get x => 0;
 ''');
@@ -878,7 +2551,7 @@
   }
 
   test_unit_variable_duplicate() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 int foo = 0;
 int foo = 1;
 ''');
@@ -957,7 +2630,7 @@
   }
 
   test_unit_variable_duplicate_getter() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 int foo = 0;
 int get foo => 0;
 ''');
@@ -1021,7 +2694,7 @@
   }
 
   test_unit_variable_duplicate_setter() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 int foo = 0;
 set foo(int _) {}
 ''');
@@ -1142,7 +2815,9 @@
   }
 
   test_variable() async {
-    var library = await buildLibrary('int x = 0;');
+    var library = await buildLibrary(r'''
+int x = 0;
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -1188,7 +2863,7 @@
   }
 
   test_variable_abstract() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 abstract int i;
 ''');
     checkElementText(library, r'''
@@ -1235,8 +2910,760 @@
 ''');
   }
 
+  test_variable_augmentation_chain() async {
+    var library = await buildLibrary(r'''
+int foo = 0;
+augment int foo = 1;
+''');
+
+    configuration.withExportScope = true;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  fragments
+    #F0 <testLibraryFragment>
+      element: <testLibrary>
+      topLevelVariables
+        #F1 hasInitializer isOriginDeclaration isStatic foo (nameOffset:4) (firstTokenOffset:4) (offset:4)
+          element: <testLibrary>::@topLevelVariable::foo
+          nextFragment: #F2
+        #F2 hasInitializer isAugmentation isOriginDeclaration isStatic foo (nameOffset:25) (firstTokenOffset:25) (offset:25)
+          element: <testLibrary>::@topLevelVariable::foo
+          previousFragment: #F1
+      getters
+        #F3 isCompleteDeclaration isOriginVariable isStatic foo (nameOffset:<null>) (firstTokenOffset:<null>) (offset:4)
+          element: <testLibrary>::@getter::foo
+      setters
+        #F4 isCompleteDeclaration isOriginVariable isStatic foo (nameOffset:<null>) (firstTokenOffset:<null>) (offset:4)
+          element: <testLibrary>::@setter::foo
+          formalParameters
+            #F5 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:4)
+              element: <testLibrary>::@setter::foo::@formalParameter::value
+  topLevelVariables
+    hasInitializer isOriginDeclaration isStatic foo
+      reference: <testLibrary>::@topLevelVariable::foo
+      firstFragment: #F1
+      type: int
+      getter: <testLibrary>::@getter::foo
+      setter: <testLibrary>::@setter::foo
+  getters
+    isOriginVariable isStatic foo
+      reference: <testLibrary>::@getter::foo
+      firstFragment: #F3
+      returnType: int
+      variable: <testLibrary>::@topLevelVariable::foo
+  setters
+    isOriginVariable isStatic foo
+      reference: <testLibrary>::@setter::foo
+      firstFragment: #F4
+      formalParameters
+        #E0 requiredPositional value
+          firstFragment: #F5
+          type: int
+      returnType: void
+      variable: <testLibrary>::@topLevelVariable::foo
+  exportEntries
+    declared <testLibrary>::@getter::foo
+    declared <testLibrary>::@setter::foo
+  exportNamespace
+    foo: <testLibrary>::@getter::foo
+    foo=: <testLibrary>::@setter::foo
+''');
+  }
+
+  test_variable_augmentation_chain_const() async {
+    var library = await buildLibrary(r'''
+const int foo = 0;
+augment const int foo = 1;
+''');
+
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  fragments
+    #F0 <testLibraryFragment>
+      element: <testLibrary>
+      topLevelVariables
+        #F1 hasInitializer isConst isOriginDeclaration isStatic foo (nameOffset:10) (firstTokenOffset:10) (offset:10)
+          element: <testLibrary>::@topLevelVariable::foo
+          initializer: expression_0
+            IntegerLiteral
+              literal: 0 @16
+              staticType: null
+          nextFragment: #F2
+        #F2 hasInitializer isAugmentation isConst isOriginDeclaration isStatic foo (nameOffset:37) (firstTokenOffset:37) (offset:37)
+          element: <testLibrary>::@topLevelVariable::foo
+          initializer: expression_1
+            IntegerLiteral
+              literal: 1 @43
+              staticType: int
+          previousFragment: #F1
+      getters
+        #F3 isCompleteDeclaration isOriginVariable isStatic foo (nameOffset:<null>) (firstTokenOffset:<null>) (offset:10)
+          element: <testLibrary>::@getter::foo
+  topLevelVariables
+    hasInitializer isConst isOriginDeclaration isStatic foo
+      reference: <testLibrary>::@topLevelVariable::foo
+      firstFragment: #F1
+      type: int
+      constantInitializer
+        fragment: #F2
+        expression: expression_1
+      getter: <testLibrary>::@getter::foo
+  getters
+    isOriginVariable isStatic foo
+      reference: <testLibrary>::@getter::foo
+      firstFragment: #F3
+      returnType: int
+      variable: <testLibrary>::@topLevelVariable::foo
+''');
+  }
+
+  test_variable_augmentation_chain_differentType() async {
+    var library = await buildLibrary(r'''
+int foo = 0;
+augment double foo;
+''');
+
+    configuration.withExportScope = true;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  fragments
+    #F0 <testLibraryFragment>
+      element: <testLibrary>
+      topLevelVariables
+        #F1 hasInitializer isOriginDeclaration isStatic foo (nameOffset:4) (firstTokenOffset:4) (offset:4)
+          element: <testLibrary>::@topLevelVariable::foo
+          nextFragment: #F2
+        #F2 isAugmentation isOriginDeclaration isStatic foo (nameOffset:28) (firstTokenOffset:28) (offset:28)
+          element: <testLibrary>::@topLevelVariable::foo
+          previousFragment: #F1
+      getters
+        #F3 isCompleteDeclaration isOriginVariable isStatic foo (nameOffset:<null>) (firstTokenOffset:<null>) (offset:4)
+          element: <testLibrary>::@getter::foo
+      setters
+        #F4 isCompleteDeclaration isOriginVariable isStatic foo (nameOffset:<null>) (firstTokenOffset:<null>) (offset:4)
+          element: <testLibrary>::@setter::foo
+          formalParameters
+            #F5 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:4)
+              element: <testLibrary>::@setter::foo::@formalParameter::value
+  topLevelVariables
+    hasInitializer isOriginDeclaration isStatic foo
+      reference: <testLibrary>::@topLevelVariable::foo
+      firstFragment: #F1
+      type: int
+      getter: <testLibrary>::@getter::foo
+      setter: <testLibrary>::@setter::foo
+  getters
+    isOriginVariable isStatic foo
+      reference: <testLibrary>::@getter::foo
+      firstFragment: #F3
+      returnType: int
+      variable: <testLibrary>::@topLevelVariable::foo
+  setters
+    isOriginVariable isStatic foo
+      reference: <testLibrary>::@setter::foo
+      firstFragment: #F4
+      formalParameters
+        #E0 requiredPositional value
+          firstFragment: #F5
+          type: int
+      returnType: void
+      variable: <testLibrary>::@topLevelVariable::foo
+  exportEntries
+    declared <testLibrary>::@getter::foo
+    declared <testLibrary>::@setter::foo
+  exportNamespace
+    foo: <testLibrary>::@getter::foo
+    foo=: <testLibrary>::@setter::foo
+''');
+  }
+
+  test_variable_augmentation_chain_final() async {
+    var library = await buildLibrary(r'''
+final int foo = 0;
+augment int foo = 1;
+''');
+
+    configuration.withExportScope = true;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  fragments
+    #F0 <testLibraryFragment>
+      element: <testLibrary>
+      topLevelVariables
+        #F1 hasInitializer isFinal isOriginDeclaration isStatic foo (nameOffset:10) (firstTokenOffset:10) (offset:10)
+          element: <testLibrary>::@topLevelVariable::foo
+          nextFragment: #F2
+        #F2 hasInitializer isAugmentation isOriginDeclaration isStatic foo (nameOffset:31) (firstTokenOffset:31) (offset:31)
+          element: <testLibrary>::@topLevelVariable::foo
+          previousFragment: #F1
+      getters
+        #F3 isCompleteDeclaration isOriginVariable isStatic foo (nameOffset:<null>) (firstTokenOffset:<null>) (offset:10)
+          element: <testLibrary>::@getter::foo
+  topLevelVariables
+    hasInitializer isFinal isOriginDeclaration isStatic foo
+      reference: <testLibrary>::@topLevelVariable::foo
+      firstFragment: #F1
+      type: int
+      getter: <testLibrary>::@getter::foo
+  getters
+    isOriginVariable isStatic foo
+      reference: <testLibrary>::@getter::foo
+      firstFragment: #F3
+      returnType: int
+      variable: <testLibrary>::@topLevelVariable::foo
+  exportEntries
+    declared <testLibrary>::@getter::foo
+  exportNamespace
+    foo: <testLibrary>::@getter::foo
+''');
+  }
+
+  test_variable_augmentation_chain_fromGetter() async {
+    var library = await buildLibrary(r'''
+int get foo => 0;
+augment int foo = 0;
+''');
+
+    configuration.withExportScope = true;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  fragments
+    #F0 <testLibraryFragment>
+      element: <testLibrary>
+      topLevelVariables
+        #F1 isOriginGetterSetter isStatic foo (nameOffset:<null>) (firstTokenOffset:<null>) (offset:8)
+          element: <testLibrary>::@topLevelVariable::foo
+          nextFragment: #F2
+        #F2 hasInitializer isAugmentation isOriginDeclaration isStatic foo (nameOffset:30) (firstTokenOffset:30) (offset:30)
+          element: <testLibrary>::@topLevelVariable::foo
+          previousFragment: #F1
+      getters
+        #F3 isCompleteDeclaration isOriginDeclaration isStatic foo (nameOffset:8) (firstTokenOffset:0) (offset:8)
+          element: <testLibrary>::@getter::foo
+  topLevelVariables
+    hasInitializer isOriginGetterSetter isStatic foo
+      reference: <testLibrary>::@topLevelVariable::foo
+      firstFragment: #F1
+      type: int
+      getter: <testLibrary>::@getter::foo
+  getters
+    isOriginDeclaration isStatic foo
+      reference: <testLibrary>::@getter::foo
+      firstFragment: #F3
+      returnType: int
+      variable: <testLibrary>::@topLevelVariable::foo
+  exportEntries
+    declared <testLibrary>::@getter::foo
+  exportNamespace
+    foo: <testLibrary>::@getter::foo
+''');
+  }
+
+  test_variable_augmentation_chain_fromSetter() async {
+    var library = await buildLibrary(r'''
+set foo(int _) {}
+augment int foo = 0;
+''');
+
+    configuration.withExportScope = true;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  fragments
+    #F0 <testLibraryFragment>
+      element: <testLibrary>
+      topLevelVariables
+        #F1 isOriginGetterSetter isStatic foo (nameOffset:<null>) (firstTokenOffset:<null>) (offset:4)
+          element: <testLibrary>::@topLevelVariable::foo
+          nextFragment: #F2
+        #F2 hasInitializer isAugmentation isOriginDeclaration isStatic foo (nameOffset:30) (firstTokenOffset:30) (offset:30)
+          element: <testLibrary>::@topLevelVariable::foo
+          previousFragment: #F1
+      setters
+        #F3 hasImplicitReturnType isCompleteDeclaration isOriginDeclaration isStatic foo (nameOffset:4) (firstTokenOffset:0) (offset:4)
+          element: <testLibrary>::@setter::foo
+          formalParameters
+            #F4 requiredPositional isOriginDeclaration _ (nameOffset:12) (firstTokenOffset:8) (offset:12)
+              element: <testLibrary>::@setter::foo::@formalParameter::_
+  topLevelVariables
+    hasInitializer isOriginGetterSetter isStatic foo
+      reference: <testLibrary>::@topLevelVariable::foo
+      firstFragment: #F1
+      type: int
+      setter: <testLibrary>::@setter::foo
+  setters
+    isOriginDeclaration isStatic foo
+      reference: <testLibrary>::@setter::foo
+      firstFragment: #F3
+      formalParameters
+        #E0 requiredPositional _
+          firstFragment: #F4
+          type: int
+      returnType: void
+      variable: <testLibrary>::@topLevelVariable::foo
+  exportEntries
+    declared <testLibrary>::@setter::foo
+  exportNamespace
+    foo=: <testLibrary>::@setter::foo
+''');
+  }
+
+  test_variable_augmentation_chain_initializer() async {
+    var library = await buildLibrary(r'''
+int foo;
+augment int foo = 0;
+''');
+
+    configuration.withExportScope = true;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  fragments
+    #F0 <testLibraryFragment>
+      element: <testLibrary>
+      topLevelVariables
+        #F1 isOriginDeclaration isStatic foo (nameOffset:4) (firstTokenOffset:4) (offset:4)
+          element: <testLibrary>::@topLevelVariable::foo
+          nextFragment: #F2
+        #F2 hasInitializer isAugmentation isOriginDeclaration isStatic foo (nameOffset:21) (firstTokenOffset:21) (offset:21)
+          element: <testLibrary>::@topLevelVariable::foo
+          previousFragment: #F1
+      getters
+        #F3 isCompleteDeclaration isOriginVariable isStatic foo (nameOffset:<null>) (firstTokenOffset:<null>) (offset:4)
+          element: <testLibrary>::@getter::foo
+      setters
+        #F4 isCompleteDeclaration isOriginVariable isStatic foo (nameOffset:<null>) (firstTokenOffset:<null>) (offset:4)
+          element: <testLibrary>::@setter::foo
+          formalParameters
+            #F5 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:4)
+              element: <testLibrary>::@setter::foo::@formalParameter::value
+  topLevelVariables
+    hasInitializer isOriginDeclaration isStatic foo
+      reference: <testLibrary>::@topLevelVariable::foo
+      firstFragment: #F1
+      type: int
+      getter: <testLibrary>::@getter::foo
+      setter: <testLibrary>::@setter::foo
+  getters
+    isOriginVariable isStatic foo
+      reference: <testLibrary>::@getter::foo
+      firstFragment: #F3
+      returnType: int
+      variable: <testLibrary>::@topLevelVariable::foo
+  setters
+    isOriginVariable isStatic foo
+      reference: <testLibrary>::@setter::foo
+      firstFragment: #F4
+      formalParameters
+        #E0 requiredPositional value
+          firstFragment: #F5
+          type: int
+      returnType: void
+      variable: <testLibrary>::@topLevelVariable::foo
+  exportEntries
+    declared <testLibrary>::@getter::foo
+    declared <testLibrary>::@setter::foo
+  exportNamespace
+    foo: <testLibrary>::@getter::foo
+    foo=: <testLibrary>::@setter::foo
+''');
+  }
+
+  test_variable_augmentation_chain_metadata() async {
+    var library = await buildLibrary(r'''
+final foo = 0;
+@deprecated
+augment final foo;
+''');
+
+    configuration.withExportScope = true;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  fragments
+    #F0 <testLibraryFragment>
+      element: <testLibrary>
+      topLevelVariables
+        #F1 hasImplicitType hasInitializer isFinal isOriginDeclaration isStatic foo (nameOffset:6) (firstTokenOffset:6) (offset:6)
+          element: <testLibrary>::@topLevelVariable::foo
+          nextFragment: #F2
+        #F2 hasImplicitType isAugmentation isFinal isOriginDeclaration isStatic foo (nameOffset:41) (firstTokenOffset:41) (offset:41)
+          element: <testLibrary>::@topLevelVariable::foo
+          metadata
+            Annotation
+              atSign: @ @15
+              name: SimpleIdentifier
+                token: deprecated @16
+                element: dart:core::@getter::deprecated
+                staticType: null
+              element: dart:core::@getter::deprecated
+          previousFragment: #F1
+      getters
+        #F3 isCompleteDeclaration isOriginVariable isStatic foo (nameOffset:<null>) (firstTokenOffset:<null>) (offset:6)
+          element: <testLibrary>::@getter::foo
+  topLevelVariables
+    hasImplicitType hasInitializer isFinal isOriginDeclaration isStatic isTypeInferredFromInitializer foo
+      reference: <testLibrary>::@topLevelVariable::foo
+      firstFragment: #F1
+      metadata
+        Annotation
+          atSign: @ @15
+          name: SimpleIdentifier
+            token: deprecated @16
+            element: dart:core::@getter::deprecated
+            staticType: null
+          element: dart:core::@getter::deprecated
+      type: int
+      getter: <testLibrary>::@getter::foo
+  getters
+    isOriginVariable isStatic foo
+      reference: <testLibrary>::@getter::foo
+      firstFragment: #F3
+      returnType: int
+      variable: <testLibrary>::@topLevelVariable::foo
+  exportEntries
+    declared <testLibrary>::@getter::foo
+  exportNamespace
+    foo: <testLibrary>::@getter::foo
+''');
+  }
+
+  test_variable_augmentation_chain_noIntroductoryDeclaration() async {
+    var library = await buildLibrary(r'''
+augment int foo = 0;
+''');
+
+    configuration.withExportScope = true;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  fragments
+    #F0 <testLibraryFragment>
+      element: <testLibrary>
+      topLevelVariables
+        #F1 hasInitializer isAugmentation isOriginDeclaration isStatic foo (nameOffset:12) (firstTokenOffset:12) (offset:12)
+          element: <testLibrary>::@topLevelVariable::foo
+      getters
+        #F2 isCompleteDeclaration isOriginVariable isStatic foo (nameOffset:<null>) (firstTokenOffset:<null>) (offset:12)
+          element: <testLibrary>::@getter::foo
+      setters
+        #F3 isCompleteDeclaration isOriginVariable isStatic foo (nameOffset:<null>) (firstTokenOffset:<null>) (offset:12)
+          element: <testLibrary>::@setter::foo
+          formalParameters
+            #F4 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:12)
+              element: <testLibrary>::@setter::foo::@formalParameter::value
+  topLevelVariables
+    hasInitializer isOriginDeclaration isStatic foo
+      reference: <testLibrary>::@topLevelVariable::foo
+      firstFragment: #F1
+      type: int
+      getter: <testLibrary>::@getter::foo
+      setter: <testLibrary>::@setter::foo
+  getters
+    isOriginVariable isStatic foo
+      reference: <testLibrary>::@getter::foo
+      firstFragment: #F2
+      returnType: int
+      variable: <testLibrary>::@topLevelVariable::foo
+  setters
+    isOriginVariable isStatic foo
+      reference: <testLibrary>::@setter::foo
+      firstFragment: #F3
+      formalParameters
+        #E0 requiredPositional value
+          firstFragment: #F4
+          type: int
+      returnType: void
+      variable: <testLibrary>::@topLevelVariable::foo
+  exportEntries
+    declared <testLibrary>::@getter::foo
+    declared <testLibrary>::@setter::foo
+  exportNamespace
+    foo: <testLibrary>::@getter::foo
+    foo=: <testLibrary>::@setter::foo
+''');
+  }
+
+  test_variable_augmentation_chain_twoDeclarations() async {
+    var library = await buildLibrary(r'''
+int foo = 0;
+augment int foo = 1;
+augment int foo = 2;
+''');
+
+    configuration.withExportScope = true;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  fragments
+    #F0 <testLibraryFragment>
+      element: <testLibrary>
+      topLevelVariables
+        #F1 hasInitializer isOriginDeclaration isStatic foo (nameOffset:4) (firstTokenOffset:4) (offset:4)
+          element: <testLibrary>::@topLevelVariable::foo
+          nextFragment: #F2
+        #F2 hasInitializer isAugmentation isOriginDeclaration isStatic foo (nameOffset:25) (firstTokenOffset:25) (offset:25)
+          element: <testLibrary>::@topLevelVariable::foo
+          previousFragment: #F1
+          nextFragment: #F3
+        #F3 hasInitializer isAugmentation isOriginDeclaration isStatic foo (nameOffset:46) (firstTokenOffset:46) (offset:46)
+          element: <testLibrary>::@topLevelVariable::foo
+          previousFragment: #F2
+      getters
+        #F4 isCompleteDeclaration isOriginVariable isStatic foo (nameOffset:<null>) (firstTokenOffset:<null>) (offset:4)
+          element: <testLibrary>::@getter::foo
+      setters
+        #F5 isCompleteDeclaration isOriginVariable isStatic foo (nameOffset:<null>) (firstTokenOffset:<null>) (offset:4)
+          element: <testLibrary>::@setter::foo
+          formalParameters
+            #F6 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:4)
+              element: <testLibrary>::@setter::foo::@formalParameter::value
+  topLevelVariables
+    hasInitializer isOriginDeclaration isStatic foo
+      reference: <testLibrary>::@topLevelVariable::foo
+      firstFragment: #F1
+      type: int
+      getter: <testLibrary>::@getter::foo
+      setter: <testLibrary>::@setter::foo
+  getters
+    isOriginVariable isStatic foo
+      reference: <testLibrary>::@getter::foo
+      firstFragment: #F4
+      returnType: int
+      variable: <testLibrary>::@topLevelVariable::foo
+  setters
+    isOriginVariable isStatic foo
+      reference: <testLibrary>::@setter::foo
+      firstFragment: #F5
+      formalParameters
+        #E0 requiredPositional value
+          firstFragment: #F6
+          type: int
+      returnType: void
+      variable: <testLibrary>::@topLevelVariable::foo
+  exportEntries
+    declared <testLibrary>::@getter::foo
+    declared <testLibrary>::@setter::foo
+  exportNamespace
+    foo: <testLibrary>::@getter::foo
+    foo=: <testLibrary>::@setter::foo
+''');
+  }
+
+  test_variable_augmentation_chain_twoDeclarations_differentType() async {
+    var library = await buildLibrary(r'''
+int foo = 0;
+augment int foo = 1;
+augment double foo;
+''');
+
+    configuration.withExportScope = true;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  fragments
+    #F0 <testLibraryFragment>
+      element: <testLibrary>
+      topLevelVariables
+        #F1 hasInitializer isOriginDeclaration isStatic foo (nameOffset:4) (firstTokenOffset:4) (offset:4)
+          element: <testLibrary>::@topLevelVariable::foo
+          nextFragment: #F2
+        #F2 hasInitializer isAugmentation isOriginDeclaration isStatic foo (nameOffset:25) (firstTokenOffset:25) (offset:25)
+          element: <testLibrary>::@topLevelVariable::foo
+          previousFragment: #F1
+          nextFragment: #F3
+        #F3 isAugmentation isOriginDeclaration isStatic foo (nameOffset:49) (firstTokenOffset:49) (offset:49)
+          element: <testLibrary>::@topLevelVariable::foo
+          previousFragment: #F2
+      getters
+        #F4 isCompleteDeclaration isOriginVariable isStatic foo (nameOffset:<null>) (firstTokenOffset:<null>) (offset:4)
+          element: <testLibrary>::@getter::foo
+      setters
+        #F5 isCompleteDeclaration isOriginVariable isStatic foo (nameOffset:<null>) (firstTokenOffset:<null>) (offset:4)
+          element: <testLibrary>::@setter::foo
+          formalParameters
+            #F6 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:4)
+              element: <testLibrary>::@setter::foo::@formalParameter::value
+  topLevelVariables
+    hasInitializer isOriginDeclaration isStatic foo
+      reference: <testLibrary>::@topLevelVariable::foo
+      firstFragment: #F1
+      type: int
+      getter: <testLibrary>::@getter::foo
+      setter: <testLibrary>::@setter::foo
+  getters
+    isOriginVariable isStatic foo
+      reference: <testLibrary>::@getter::foo
+      firstFragment: #F4
+      returnType: int
+      variable: <testLibrary>::@topLevelVariable::foo
+  setters
+    isOriginVariable isStatic foo
+      reference: <testLibrary>::@setter::foo
+      firstFragment: #F5
+      formalParameters
+        #E0 requiredPositional value
+          firstFragment: #F6
+          type: int
+      returnType: void
+      variable: <testLibrary>::@topLevelVariable::foo
+  exportEntries
+    declared <testLibrary>::@getter::foo
+    declared <testLibrary>::@setter::foo
+  exportNamespace
+    foo: <testLibrary>::@getter::foo
+    foo=: <testLibrary>::@setter::foo
+''');
+  }
+
+  test_variable_augmentation_sameName_class() async {
+    var library = await buildLibrary(r'''
+class A {}
+augment int A = 0;
+''');
+
+    configuration.withExportScope = true;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  fragments
+    #F0 <testLibraryFragment>
+      element: <testLibrary>
+      classes
+        #F1 class A (nameOffset:6) (firstTokenOffset:0) (offset:6)
+          element: <testLibrary>::@class::A
+          constructors
+            #F2 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:6)
+              element: <testLibrary>::@class::A::@constructor::new
+              typeName: A
+      topLevelVariables
+        #F3 hasInitializer isAugmentation isOriginDeclaration isStatic A (nameOffset:23) (firstTokenOffset:23) (offset:23)
+          element: <testLibrary>::@topLevelVariable::A
+      getters
+        #F4 isCompleteDeclaration isOriginVariable isStatic A (nameOffset:<null>) (firstTokenOffset:<null>) (offset:23)
+          element: <testLibrary>::@getter::A
+      setters
+        #F5 isCompleteDeclaration isOriginVariable isStatic A (nameOffset:<null>) (firstTokenOffset:<null>) (offset:23)
+          element: <testLibrary>::@setter::A
+          formalParameters
+            #F6 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:23)
+              element: <testLibrary>::@setter::A::@formalParameter::value
+  classes
+    isSimplyBounded class A
+      reference: <testLibrary>::@class::A
+      firstFragment: #F1
+      constructors
+        isOriginImplicitDefault new
+          reference: <testLibrary>::@class::A::@constructor::new
+          firstFragment: #F2
+  topLevelVariables
+    hasInitializer isOriginDeclaration isStatic A
+      reference: <testLibrary>::@topLevelVariable::A
+      firstFragment: #F3
+      previousFragmentOfDifferentKind: #F1
+      type: int
+      getter: <testLibrary>::@getter::A
+      setter: <testLibrary>::@setter::A
+  getters
+    isOriginVariable isStatic A
+      reference: <testLibrary>::@getter::A
+      firstFragment: #F4
+      returnType: int
+      variable: <testLibrary>::@topLevelVariable::A
+  setters
+    isOriginVariable isStatic A
+      reference: <testLibrary>::@setter::A
+      firstFragment: #F5
+      formalParameters
+        #E0 requiredPositional value
+          firstFragment: #F6
+          type: int
+      returnType: void
+      variable: <testLibrary>::@topLevelVariable::A
+  exportEntries
+    declared <testLibrary>::@getter::A
+    declared <testLibrary>::@setter::A
+  exportNamespace
+    A: <testLibrary>::@getter::A
+    A=: <testLibrary>::@setter::A
+''');
+  }
+
+  test_variable_augmentation_sameName_function() async {
+    var library = await buildLibrary(r'''
+void foo() {}
+augment int foo = 0;
+''');
+
+    configuration.withExportScope = true;
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  fragments
+    #F0 <testLibraryFragment>
+      element: <testLibrary>
+      topLevelVariables
+        #F1 hasInitializer isAugmentation isOriginDeclaration isStatic foo (nameOffset:26) (firstTokenOffset:26) (offset:26)
+          element: <testLibrary>::@topLevelVariable::foo
+      getters
+        #F2 isCompleteDeclaration isOriginVariable isStatic foo (nameOffset:<null>) (firstTokenOffset:<null>) (offset:26)
+          element: <testLibrary>::@getter::foo
+      setters
+        #F3 isCompleteDeclaration isOriginVariable isStatic foo (nameOffset:<null>) (firstTokenOffset:<null>) (offset:26)
+          element: <testLibrary>::@setter::foo
+          formalParameters
+            #F4 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:26)
+              element: <testLibrary>::@setter::foo::@formalParameter::value
+      functions
+        #F5 isCompleteDeclaration isOriginDeclaration isStatic foo (nameOffset:5) (firstTokenOffset:0) (offset:5)
+          element: <testLibrary>::@function::foo
+  topLevelVariables
+    hasInitializer isOriginDeclaration isStatic foo
+      reference: <testLibrary>::@topLevelVariable::foo
+      firstFragment: #F1
+      previousFragmentOfDifferentKind: #F5
+      type: int
+      getter: <testLibrary>::@getter::foo
+      setter: <testLibrary>::@setter::foo
+  getters
+    isOriginVariable isStatic foo
+      reference: <testLibrary>::@getter::foo
+      firstFragment: #F2
+      returnType: int
+      variable: <testLibrary>::@topLevelVariable::foo
+  setters
+    isOriginVariable isStatic foo
+      reference: <testLibrary>::@setter::foo
+      firstFragment: #F3
+      formalParameters
+        #E0 requiredPositional value
+          firstFragment: #F4
+          type: int
+      returnType: void
+      variable: <testLibrary>::@topLevelVariable::foo
+  functions
+    isOriginDeclaration isStatic foo
+      reference: <testLibrary>::@function::foo
+      firstFragment: #F5
+      returnType: void
+  exportEntries
+    declared <testLibrary>::@getter::foo
+    declared <testLibrary>::@setter::foo
+  exportNamespace
+    foo: <testLibrary>::@getter::foo
+    foo=: <testLibrary>::@setter::foo
+''');
+  }
+
   test_variable_const() async {
-    var library = await buildLibrary('const int i = 0;');
+    var library = await buildLibrary(r'''
+const int i = 0;
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -1272,7 +3699,9 @@
   }
 
   test_variable_const_late() async {
-    var library = await buildLibrary('late const int i = 0;');
+    var library = await buildLibrary(r'''
+late const int i = 0;
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -1308,12 +3737,13 @@
   }
 
   test_variable_documented() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 // Extra comment so doc comment offset != 0
 /**
  * Docs
  */
-var x;''');
+var x;
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -1361,7 +3791,7 @@
   }
 
   test_variable_external() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 external int i;
 ''');
     checkElementText(library, r'''
@@ -1409,7 +3839,9 @@
   }
 
   test_variable_final() async {
-    var library = await buildLibrary('final int x = 0;');
+    var library = await buildLibrary(r'''
+final int x = 0;
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -1469,14 +3901,17 @@
   }
 
   test_variable_getterInLib_setterInPart() async {
-    newFile('$testPackageLibPath/a.dart', '''
+    newFile('$testPackageLibPath/a.dart', r'''
 part of my.lib;
 void set x(int _) {}
 ''');
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 library my.lib;
+
 part 'a.dart';
-int get x => 42;''');
+
+int get x => 42;
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -1488,13 +3923,13 @@
       parts
         part_0
           uri: package:test/a.dart
-          partKeywordOffset: 16
+          partKeywordOffset: 17
           unit: #F1
       topLevelVariables
-        #F2 isOriginGetterSetter isStatic x (nameOffset:<null>) (firstTokenOffset:<null>) (offset:39)
+        #F2 isOriginGetterSetter isStatic x (nameOffset:<null>) (firstTokenOffset:<null>) (offset:41)
           element: <testLibrary>::@topLevelVariable::x
       getters
-        #F3 isCompleteDeclaration isOriginDeclaration isStatic x (nameOffset:39) (firstTokenOffset:31) (offset:39)
+        #F3 isCompleteDeclaration isOriginDeclaration isStatic x (nameOffset:41) (firstTokenOffset:33) (offset:41)
           element: <testLibrary>::@getter::x
     #F1 package:test/a.dart
       element: <testLibrary>
@@ -1533,13 +3968,15 @@
   }
 
   test_variable_getterInPart_setterInLib() async {
-    newFile('$testPackageLibPath/a.dart', '''
+    newFile('$testPackageLibPath/a.dart', r'''
 part of my.lib;
 int get x => 42;
 ''');
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 library my.lib;
+
 part 'a.dart';
+
 void set x(int _) {}
 ''');
     checkElementText(library, r'''
@@ -1553,16 +3990,16 @@
       parts
         part_0
           uri: package:test/a.dart
-          partKeywordOffset: 16
+          partKeywordOffset: 17
           unit: #F1
       topLevelVariables
         #F2 isOriginGetterSetter isStatic x (nameOffset:<null>) (firstTokenOffset:<null>) (offset:24)
           element: <testLibrary>::@topLevelVariable::x
       setters
-        #F3 isCompleteDeclaration isOriginDeclaration isStatic x (nameOffset:40) (firstTokenOffset:31) (offset:40)
+        #F3 isCompleteDeclaration isOriginDeclaration isStatic x (nameOffset:42) (firstTokenOffset:33) (offset:42)
           element: <testLibrary>::@setter::x
           formalParameters
-            #F4 requiredPositional isOriginDeclaration _ (nameOffset:46) (firstTokenOffset:42) (offset:46)
+            #F4 requiredPositional isOriginDeclaration _ (nameOffset:48) (firstTokenOffset:44) (offset:48)
               element: <testLibrary>::@setter::x::@formalParameter::_
     #F1 package:test/a.dart
       element: <testLibrary>
@@ -1598,14 +4035,20 @@
   }
 
   test_variable_getterInPart_setterInPart() async {
-    newFile('$testPackageLibPath/a.dart', 'part of my.lib; int get x => 42;');
-    newFile(
-      '$testPackageLibPath/b.dart',
-      'part of my.lib; void set x(int _) {}',
-    );
-    var library = await buildLibrary(
-      'library my.lib; part "a.dart"; part "b.dart";',
-    );
+    newFile('$testPackageLibPath/a.dart', r'''
+part of my.lib;
+int get x => 42;
+''');
+    newFile('$testPackageLibPath/b.dart', r'''
+part of my.lib;
+void set x(int _) {}
+''');
+    var library = await buildLibrary(r'''
+library my.lib;
+
+part "a.dart";
+part "b.dart";
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -1617,11 +4060,11 @@
       parts
         part_0
           uri: package:test/a.dart
-          partKeywordOffset: 16
+          partKeywordOffset: 17
           unit: #F1
         part_1
           uri: package:test/b.dart
-          partKeywordOffset: 31
+          partKeywordOffset: 32
           unit: #F2
     #F1 package:test/a.dart
       element: <testLibrary>
@@ -1671,7 +4114,9 @@
   }
 
   test_variable_implicit() async {
-    var library = await buildLibrary('int get x => 0;');
+    var library = await buildLibrary(r'''
+int get x => 0;
+''');
 
     // We intentionally don't check the text, because we want to test
     // requesting individual elements, not all accessors/variables at once.
@@ -1685,7 +4130,9 @@
   }
 
   test_variable_implicit_type() async {
-    var library = await buildLibrary('var x;');
+    var library = await buildLibrary(r'''
+var x;
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -1731,7 +4178,9 @@
   }
 
   test_variable_initializer() async {
-    var library = await buildLibrary('int v = 0;');
+    var library = await buildLibrary(r'''
+int v = 0;
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -1777,7 +4226,9 @@
   }
 
   test_variable_initializer_final() async {
-    var library = await buildLibrary('final int v = 0;');
+    var library = await buildLibrary(r'''
+final int v = 0;
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -1806,7 +4257,9 @@
   }
 
   test_variable_initializer_final_untyped() async {
-    var library = await buildLibrary('final v = 0;');
+    var library = await buildLibrary(r'''
+final v = 0;
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -1835,7 +4288,7 @@
   }
 
   test_variable_initializer_recordType() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 const x = (1, true);
 ''');
     checkElementText(library, r'''
@@ -1881,11 +4334,13 @@
   }
 
   test_variable_initializer_staticMethod_ofExtension() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class A {}
+
 extension E on A {
   static int f() => 0;
 }
+
 var x = E.f();
 ''');
     checkElementText(library, r'''
@@ -1902,22 +4357,22 @@
               element: <testLibrary>::@class::A::@constructor::new
               typeName: A
       extensions
-        #F3 extension E (nameOffset:21) (firstTokenOffset:11) (offset:21)
+        #F3 extension E (nameOffset:22) (firstTokenOffset:12) (offset:22)
           element: <testLibrary>::@extension::E
           methods
-            #F4 isCompleteDeclaration isOriginDeclaration isStatic f (nameOffset:43) (firstTokenOffset:32) (offset:43)
+            #F4 isCompleteDeclaration isOriginDeclaration isStatic f (nameOffset:44) (firstTokenOffset:33) (offset:44)
               element: <testLibrary>::@extension::E::@method::f
       topLevelVariables
-        #F5 hasImplicitType hasInitializer isOriginDeclaration isStatic x (nameOffset:59) (firstTokenOffset:59) (offset:59)
+        #F5 hasImplicitType hasInitializer isOriginDeclaration isStatic x (nameOffset:61) (firstTokenOffset:61) (offset:61)
           element: <testLibrary>::@topLevelVariable::x
       getters
-        #F6 isCompleteDeclaration isOriginVariable isStatic x (nameOffset:<null>) (firstTokenOffset:<null>) (offset:59)
+        #F6 isCompleteDeclaration isOriginVariable isStatic x (nameOffset:<null>) (firstTokenOffset:<null>) (offset:61)
           element: <testLibrary>::@getter::x
       setters
-        #F7 isCompleteDeclaration isOriginVariable isStatic x (nameOffset:<null>) (firstTokenOffset:<null>) (offset:59)
+        #F7 isCompleteDeclaration isOriginVariable isStatic x (nameOffset:<null>) (firstTokenOffset:<null>) (offset:61)
           element: <testLibrary>::@setter::x
           formalParameters
-            #F8 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:59)
+            #F8 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:61)
               element: <testLibrary>::@setter::x::@formalParameter::value
   classes
     isSimplyBounded class A
@@ -1965,7 +4420,9 @@
   }
 
   test_variable_initializer_untyped() async {
-    var library = await buildLibrary('var v = 0;');
+    var library = await buildLibrary(r'''
+var v = 0;
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -2011,7 +4468,9 @@
   }
 
   test_variable_late() async {
-    var library = await buildLibrary('late int x = 0;');
+    var library = await buildLibrary(r'''
+late int x = 0;
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -2057,7 +4516,9 @@
   }
 
   test_variable_late_final() async {
-    var library = await buildLibrary('late final int x;');
+    var library = await buildLibrary(r'''
+late final int x;
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -2103,7 +4564,9 @@
   }
 
   test_variable_late_final_initialized() async {
-    var library = await buildLibrary('late final int x = 0;');
+    var library = await buildLibrary(r'''
+late final int x = 0;
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -2209,7 +4672,9 @@
   }
 
   test_variable_propagatedType_const_noDep() async {
-    var library = await buildLibrary('const i = 0;');
+    var library = await buildLibrary(r'''
+const i = 0;
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -2245,8 +4710,14 @@
   }
 
   test_variable_propagatedType_final_dep_inLib() async {
-    newFile('$testPackageLibPath/a.dart', 'final a = 1;');
-    var library = await buildLibrary('import "a.dart"; final b = a / 2;');
+    newFile('$testPackageLibPath/a.dart', r'''
+final a = 1;
+''');
+    var library = await buildLibrary(r'''
+import "a.dart";
+
+final b = a / 2;
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -2256,10 +4727,10 @@
       libraryImports
         package:test/a.dart
       topLevelVariables
-        #F1 hasImplicitType hasInitializer isFinal isOriginDeclaration isStatic b (nameOffset:23) (firstTokenOffset:23) (offset:23)
+        #F1 hasImplicitType hasInitializer isFinal isOriginDeclaration isStatic b (nameOffset:24) (firstTokenOffset:24) (offset:24)
           element: <testLibrary>::@topLevelVariable::b
       getters
-        #F2 isCompleteDeclaration isOriginVariable isStatic b (nameOffset:<null>) (firstTokenOffset:<null>) (offset:23)
+        #F2 isCompleteDeclaration isOriginVariable isStatic b (nameOffset:<null>) (firstTokenOffset:<null>) (offset:24)
           element: <testLibrary>::@getter::b
   topLevelVariables
     hasImplicitType hasInitializer isFinal isOriginDeclaration isStatic isTypeInferredFromInitializer b
@@ -2277,10 +4748,17 @@
   }
 
   test_variable_propagatedType_final_dep_inPart() async {
-    newFile('$testPackageLibPath/a.dart', 'part of lib; final a = 1;');
-    var library = await buildLibrary(
-      'library lib; part "a.dart"; final b = a / 2;',
-    );
+    newFile('$testPackageLibPath/a.dart', r'''
+part of lib;
+final a = 1;
+''');
+    var library = await buildLibrary(r'''
+library lib;
+
+part "a.dart";
+
+final b = a / 2;
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -2292,13 +4770,13 @@
       parts
         part_0
           uri: package:test/a.dart
-          partKeywordOffset: 13
+          partKeywordOffset: 14
           unit: #F1
       topLevelVariables
-        #F2 hasImplicitType hasInitializer isFinal isOriginDeclaration isStatic b (nameOffset:34) (firstTokenOffset:34) (offset:34)
+        #F2 hasImplicitType hasInitializer isFinal isOriginDeclaration isStatic b (nameOffset:36) (firstTokenOffset:36) (offset:36)
           element: <testLibrary>::@topLevelVariable::b
       getters
-        #F3 isCompleteDeclaration isOriginVariable isStatic b (nameOffset:<null>) (firstTokenOffset:<null>) (offset:34)
+        #F3 isCompleteDeclaration isOriginVariable isStatic b (nameOffset:<null>) (firstTokenOffset:<null>) (offset:36)
           element: <testLibrary>::@getter::b
     #F1 package:test/a.dart
       element: <testLibrary>
@@ -2336,7 +4814,9 @@
   }
 
   test_variable_propagatedType_final_noDep() async {
-    var library = await buildLibrary('final i = 0;');
+    var library = await buildLibrary(r'''
+final i = 0;
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -2366,9 +4846,18 @@
 
   test_variable_propagatedType_implicit_dep() async {
     // The propagated type is defined in a library that is not imported.
-    newFile('$testPackageLibPath/a.dart', 'class C {}');
-    newFile('$testPackageLibPath/b.dart', 'import "a.dart"; C f() => null;');
-    var library = await buildLibrary('import "b.dart"; final x = f();');
+    newFile('$testPackageLibPath/a.dart', r'''
+class C {}
+''');
+    newFile('$testPackageLibPath/b.dart', r'''
+import "a.dart";
+C f() => null;
+''');
+    var library = await buildLibrary(r'''
+import "b.dart";
+
+final x = f();
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -2378,10 +4867,10 @@
       libraryImports
         package:test/b.dart
       topLevelVariables
-        #F1 hasImplicitType hasInitializer isFinal isOriginDeclaration isStatic x (nameOffset:23) (firstTokenOffset:23) (offset:23)
+        #F1 hasImplicitType hasInitializer isFinal isOriginDeclaration isStatic x (nameOffset:24) (firstTokenOffset:24) (offset:24)
           element: <testLibrary>::@topLevelVariable::x
       getters
-        #F2 isCompleteDeclaration isOriginVariable isStatic x (nameOffset:<null>) (firstTokenOffset:<null>) (offset:23)
+        #F2 isCompleteDeclaration isOriginVariable isStatic x (nameOffset:<null>) (firstTokenOffset:<null>) (offset:24)
           element: <testLibrary>::@getter::x
   topLevelVariables
     hasImplicitType hasInitializer isFinal isOriginDeclaration isStatic isTypeInferredFromInitializer x
@@ -2399,14 +4888,20 @@
   }
 
   test_variable_setterInPart_getterInPart() async {
-    newFile(
-      '$testPackageLibPath/a.dart',
-      'part of my.lib; void set x(int _) {}',
-    );
-    newFile('$testPackageLibPath/b.dart', 'part of my.lib; int get x => 42;');
-    var library = await buildLibrary(
-      'library my.lib; part "a.dart"; part "b.dart";',
-    );
+    newFile('$testPackageLibPath/a.dart', r'''
+part of my.lib;
+void set x(int _) {}
+''');
+    newFile('$testPackageLibPath/b.dart', r'''
+part of my.lib;
+int get x => 42;
+''');
+    var library = await buildLibrary(r'''
+library my.lib;
+
+part "a.dart";
+part "b.dart";
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -2418,11 +4913,11 @@
       parts
         part_0
           uri: package:test/a.dart
-          partKeywordOffset: 16
+          partKeywordOffset: 17
           unit: #F1
         part_1
           uri: package:test/b.dart
-          partKeywordOffset: 31
+          partKeywordOffset: 32
           unit: #F2
     #F1 package:test/a.dart
       element: <testLibrary>
@@ -2472,7 +4967,9 @@
   }
 
   test_variable_type_dynamic() async {
-    var library = await buildLibrary('dynamic v;');
+    var library = await buildLibrary(r'''
+dynamic v;
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -2518,7 +5015,9 @@
   }
 
   test_variable_type_inferred() async {
-    var library = await buildLibrary('var v = 0;');
+    var library = await buildLibrary(r'''
+var v = 0;
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -2712,6 +5211,7 @@
 class A<T> {
   const A();
 }
+
 const A<int> a = A();
 ''');
     checkElementText(library, r'''
@@ -2732,24 +5232,24 @@
               typeName: A
               typeNameOffset: 21
       topLevelVariables
-        #F4 hasInitializer isConst isOriginDeclaration isStatic a (nameOffset:41) (firstTokenOffset:41) (offset:41)
+        #F4 hasInitializer isConst isOriginDeclaration isStatic a (nameOffset:42) (firstTokenOffset:42) (offset:42)
           element: <testLibrary>::@topLevelVariable::a
           initializer: expression_0
             InstanceCreationExpression
               constructorName: ConstructorName
                 type: NamedType
-                  name: A @45
+                  name: A @46
                   element: <testLibrary>::@class::A
                   type: A<int>
                 element: ConstructorMember
                   baseElement: <testLibrary>::@class::A::@constructor::new
                   substitution: {T: int}
               argumentList: ArgumentList
-                leftParenthesis: ( @46
-                rightParenthesis: ) @47
+                leftParenthesis: ( @47
+                rightParenthesis: ) @48
               staticType: A<int>
       getters
-        #F5 isCompleteDeclaration isOriginVariable isStatic a (nameOffset:<null>) (firstTokenOffset:<null>) (offset:41)
+        #F5 isCompleteDeclaration isOriginVariable isStatic a (nameOffset:<null>) (firstTokenOffset:<null>) (offset:42)
           element: <testLibrary>::@getter::a
   classes
     isSimplyBounded class A
@@ -2781,7 +5281,10 @@
   }
 
   test_variables() async {
-    var library = await buildLibrary('int i; int j;');
+    var library = await buildLibrary(r'''
+int i;
+int j;
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -2862,2425 +5365,6 @@
   }
 }
 
-abstract class TopLevelVariableElementTest_augmentation
-    extends ElementsBaseTest {
-  test_getter_augment_class() async {
-    var library = await buildLibrary(r'''
-class A {}
-augment int get A => 0;
-''');
-
-    configuration.withExportScope = true;
-    checkElementText(library, r'''
-library
-  reference: <testLibrary>
-  fragments
-    #F0 <testLibraryFragment>
-      element: <testLibrary>
-      classes
-        #F1 class A (nameOffset:6) (firstTokenOffset:0) (offset:6)
-          element: <testLibrary>::@class::A
-          constructors
-            #F2 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:6)
-              element: <testLibrary>::@class::A::@constructor::new
-              typeName: A
-      topLevelVariables
-        #F3 isOriginGetterSetter isStatic A (nameOffset:<null>) (firstTokenOffset:<null>) (offset:27)
-          element: <testLibrary>::@topLevelVariable::A
-      getters
-        #F4 isAugmentation isCompleteDeclaration isOriginDeclaration isStatic A (nameOffset:27) (firstTokenOffset:11) (offset:27)
-          element: <testLibrary>::@getter::A
-  classes
-    isSimplyBounded class A
-      reference: <testLibrary>::@class::A
-      firstFragment: #F1
-      constructors
-        isOriginImplicitDefault new
-          reference: <testLibrary>::@class::A::@constructor::new
-          firstFragment: #F2
-  topLevelVariables
-    isOriginGetterSetter isStatic A
-      reference: <testLibrary>::@topLevelVariable::A
-      firstFragment: #F3
-      type: int
-      getter: <testLibrary>::@getter::A
-  getters
-    isOriginDeclaration isStatic A
-      reference: <testLibrary>::@getter::A
-      firstFragment: #F4
-      previousFragmentOfDifferentKind: #F1
-      returnType: int
-      variable: <testLibrary>::@topLevelVariable::A
-  exportEntries
-    declared <testLibrary>::@getter::A
-  exportNamespace
-    A: <testLibrary>::@getter::A
-''');
-  }
-
-  test_getter_augment_function() async {
-    var library = await buildLibrary(r'''
-void foo() {}
-augment int get foo => 0;
-''');
-
-    configuration.withExportScope = true;
-    checkElementText(library, r'''
-library
-  reference: <testLibrary>
-  fragments
-    #F0 <testLibraryFragment>
-      element: <testLibrary>
-      topLevelVariables
-        #F1 isOriginGetterSetter isStatic foo (nameOffset:<null>) (firstTokenOffset:<null>) (offset:30)
-          element: <testLibrary>::@topLevelVariable::foo
-      getters
-        #F2 isAugmentation isCompleteDeclaration isOriginDeclaration isStatic foo (nameOffset:30) (firstTokenOffset:14) (offset:30)
-          element: <testLibrary>::@getter::foo
-      functions
-        #F3 isCompleteDeclaration isOriginDeclaration isStatic foo (nameOffset:5) (firstTokenOffset:0) (offset:5)
-          element: <testLibrary>::@function::foo
-  topLevelVariables
-    isOriginGetterSetter isStatic foo
-      reference: <testLibrary>::@topLevelVariable::foo
-      firstFragment: #F1
-      type: int
-      getter: <testLibrary>::@getter::foo
-  getters
-    isOriginDeclaration isStatic foo
-      reference: <testLibrary>::@getter::foo
-      firstFragment: #F2
-      previousFragmentOfDifferentKind: #F3
-      returnType: int
-      variable: <testLibrary>::@topLevelVariable::foo
-  functions
-    isOriginDeclaration isStatic foo
-      reference: <testLibrary>::@function::foo
-      firstFragment: #F3
-      returnType: void
-  exportEntries
-    declared <testLibrary>::@getter::foo
-  exportNamespace
-    foo: <testLibrary>::@getter::foo
-''');
-  }
-
-  test_getter_augment_getter() async {
-    var library = await buildLibrary(r'''
-int get foo => 0;
-augment int get foo => 1;
-''');
-
-    configuration.withExportScope = true;
-    checkElementText(library, r'''
-library
-  reference: <testLibrary>
-  fragments
-    #F0 <testLibraryFragment>
-      element: <testLibrary>
-      topLevelVariables
-        #F1 isOriginGetterSetter isStatic foo (nameOffset:<null>) (firstTokenOffset:<null>) (offset:8)
-          element: <testLibrary>::@topLevelVariable::foo
-      getters
-        #F2 isCompleteDeclaration isOriginDeclaration isStatic foo (nameOffset:8) (firstTokenOffset:0) (offset:8)
-          element: <testLibrary>::@getter::foo
-          nextFragment: #F3
-        #F3 isAugmentation isCompleteDeclaration isOriginDeclaration isStatic foo (nameOffset:34) (firstTokenOffset:18) (offset:34)
-          element: <testLibrary>::@getter::foo
-          previousFragment: #F2
-  topLevelVariables
-    isOriginGetterSetter isStatic foo
-      reference: <testLibrary>::@topLevelVariable::foo
-      firstFragment: #F1
-      type: int
-      getter: <testLibrary>::@getter::foo
-  getters
-    isOriginDeclaration isStatic foo
-      reference: <testLibrary>::@getter::foo
-      firstFragment: #F2
-      returnType: int
-      variable: <testLibrary>::@topLevelVariable::foo
-  exportEntries
-    declared <testLibrary>::@getter::foo
-  exportNamespace
-    foo: <testLibrary>::@getter::foo
-''');
-  }
-
-  test_getter_augment_getter_differentType() async {
-    var library = await buildLibrary(r'''
-int get foo => 0;
-augment double get foo => 1;
-''');
-
-    configuration.withExportScope = true;
-    checkElementText(library, r'''
-library
-  reference: <testLibrary>
-  fragments
-    #F0 <testLibraryFragment>
-      element: <testLibrary>
-      topLevelVariables
-        #F1 isOriginGetterSetter isStatic foo (nameOffset:<null>) (firstTokenOffset:<null>) (offset:8)
-          element: <testLibrary>::@topLevelVariable::foo
-      getters
-        #F2 isCompleteDeclaration isOriginDeclaration isStatic foo (nameOffset:8) (firstTokenOffset:0) (offset:8)
-          element: <testLibrary>::@getter::foo
-          nextFragment: #F3
-        #F3 isAugmentation isCompleteDeclaration isOriginDeclaration isStatic foo (nameOffset:37) (firstTokenOffset:18) (offset:37)
-          element: <testLibrary>::@getter::foo
-          previousFragment: #F2
-  topLevelVariables
-    isOriginGetterSetter isStatic foo
-      reference: <testLibrary>::@topLevelVariable::foo
-      firstFragment: #F1
-      type: int
-      getter: <testLibrary>::@getter::foo
-  getters
-    isOriginDeclaration isStatic foo
-      reference: <testLibrary>::@getter::foo
-      firstFragment: #F2
-      returnType: int
-      variable: <testLibrary>::@topLevelVariable::foo
-  exportEntries
-    declared <testLibrary>::@getter::foo
-  exportNamespace
-    foo: <testLibrary>::@getter::foo
-''');
-  }
-
-  test_getter_augment_getter_multiple_annotations() async {
-    newFile('$testPackageLibPath/a.dart', r'''
-const a1 = 1;
-const a2 = 2;
-const a3 = 3;
-''');
-
-    var library = await buildLibrary(r'''
-import 'a.dart';
-@a1
-int get foo => 0;
-@a2
-augment int get foo => 1;
-@a3
-augment int get foo => 2;
-''');
-
-    configuration.withExportScope = true;
-    checkElementText(library, r'''
-library
-  reference: <testLibrary>
-  fragments
-    #F0 <testLibraryFragment>
-      element: <testLibrary>
-      libraryImports
-        package:test/a.dart
-      topLevelVariables
-        #F1 isOriginGetterSetter isStatic foo (nameOffset:<null>) (firstTokenOffset:<null>) (offset:29)
-          element: <testLibrary>::@topLevelVariable::foo
-      getters
-        #F2 isCompleteDeclaration isOriginDeclaration isStatic foo (nameOffset:29) (firstTokenOffset:17) (offset:29)
-          element: <testLibrary>::@getter::foo
-          metadata
-            Annotation
-              atSign: @ @17
-              name: SimpleIdentifier
-                token: a1 @18
-                element: package:test/a.dart::@getter::a1
-                staticType: null
-              element: package:test/a.dart::@getter::a1
-          nextFragment: #F3
-        #F3 isAugmentation isCompleteDeclaration isOriginDeclaration isStatic foo (nameOffset:59) (firstTokenOffset:39) (offset:59)
-          element: <testLibrary>::@getter::foo
-          metadata
-            Annotation
-              atSign: @ @39
-              name: SimpleIdentifier
-                token: a2 @40
-                element: package:test/a.dart::@getter::a2
-                staticType: null
-              element: package:test/a.dart::@getter::a2
-          previousFragment: #F2
-          nextFragment: #F4
-        #F4 isAugmentation isCompleteDeclaration isOriginDeclaration isStatic foo (nameOffset:89) (firstTokenOffset:69) (offset:89)
-          element: <testLibrary>::@getter::foo
-          metadata
-            Annotation
-              atSign: @ @69
-              name: SimpleIdentifier
-                token: a3 @70
-                element: package:test/a.dart::@getter::a3
-                staticType: null
-              element: package:test/a.dart::@getter::a3
-          previousFragment: #F3
-  topLevelVariables
-    isOriginGetterSetter isStatic foo
-      reference: <testLibrary>::@topLevelVariable::foo
-      firstFragment: #F1
-      type: int
-      getter: <testLibrary>::@getter::foo
-  getters
-    isOriginDeclaration isStatic foo
-      reference: <testLibrary>::@getter::foo
-      firstFragment: #F2
-      metadata
-        Annotation
-          atSign: @ @17
-          name: SimpleIdentifier
-            token: a1 @18
-            element: package:test/a.dart::@getter::a1
-            staticType: null
-          element: package:test/a.dart::@getter::a1
-        Annotation
-          atSign: @ @39
-          name: SimpleIdentifier
-            token: a2 @40
-            element: package:test/a.dart::@getter::a2
-            staticType: null
-          element: package:test/a.dart::@getter::a2
-        Annotation
-          atSign: @ @69
-          name: SimpleIdentifier
-            token: a3 @70
-            element: package:test/a.dart::@getter::a3
-            staticType: null
-          element: package:test/a.dart::@getter::a3
-      returnType: int
-      variable: <testLibrary>::@topLevelVariable::foo
-  exportEntries
-    declared <testLibrary>::@getter::foo
-  exportNamespace
-    foo: <testLibrary>::@getter::foo
-''');
-  }
-
-  test_getter_augment_multiple_getters() async {
-    var library = await buildLibrary(r'''
-int get foo => 0;
-augment int get foo => 1;
-augment int get foo => 2;
-''');
-
-    configuration.withExportScope = true;
-    checkElementText(library, r'''
-library
-  reference: <testLibrary>
-  fragments
-    #F0 <testLibraryFragment>
-      element: <testLibrary>
-      topLevelVariables
-        #F1 isOriginGetterSetter isStatic foo (nameOffset:<null>) (firstTokenOffset:<null>) (offset:8)
-          element: <testLibrary>::@topLevelVariable::foo
-      getters
-        #F2 isCompleteDeclaration isOriginDeclaration isStatic foo (nameOffset:8) (firstTokenOffset:0) (offset:8)
-          element: <testLibrary>::@getter::foo
-          nextFragment: #F3
-        #F3 isAugmentation isCompleteDeclaration isOriginDeclaration isStatic foo (nameOffset:34) (firstTokenOffset:18) (offset:34)
-          element: <testLibrary>::@getter::foo
-          previousFragment: #F2
-          nextFragment: #F4
-        #F4 isAugmentation isCompleteDeclaration isOriginDeclaration isStatic foo (nameOffset:60) (firstTokenOffset:44) (offset:60)
-          element: <testLibrary>::@getter::foo
-          previousFragment: #F3
-  topLevelVariables
-    isOriginGetterSetter isStatic foo
-      reference: <testLibrary>::@topLevelVariable::foo
-      firstFragment: #F1
-      type: int
-      getter: <testLibrary>::@getter::foo
-  getters
-    isOriginDeclaration isStatic foo
-      reference: <testLibrary>::@getter::foo
-      firstFragment: #F2
-      returnType: int
-      variable: <testLibrary>::@topLevelVariable::foo
-  exportEntries
-    declared <testLibrary>::@getter::foo
-  exportNamespace
-    foo: <testLibrary>::@getter::foo
-''');
-  }
-
-  test_getter_augment_multiple_getters_differentType() async {
-    var library = await buildLibrary(r'''
-int get foo => 0;
-augment int get foo => 1;
-augment double get foo => 2;
-''');
-
-    configuration.withExportScope = true;
-    checkElementText(library, r'''
-library
-  reference: <testLibrary>
-  fragments
-    #F0 <testLibraryFragment>
-      element: <testLibrary>
-      topLevelVariables
-        #F1 isOriginGetterSetter isStatic foo (nameOffset:<null>) (firstTokenOffset:<null>) (offset:8)
-          element: <testLibrary>::@topLevelVariable::foo
-      getters
-        #F2 isCompleteDeclaration isOriginDeclaration isStatic foo (nameOffset:8) (firstTokenOffset:0) (offset:8)
-          element: <testLibrary>::@getter::foo
-          nextFragment: #F3
-        #F3 isAugmentation isCompleteDeclaration isOriginDeclaration isStatic foo (nameOffset:34) (firstTokenOffset:18) (offset:34)
-          element: <testLibrary>::@getter::foo
-          previousFragment: #F2
-          nextFragment: #F4
-        #F4 isAugmentation isCompleteDeclaration isOriginDeclaration isStatic foo (nameOffset:63) (firstTokenOffset:44) (offset:63)
-          element: <testLibrary>::@getter::foo
-          previousFragment: #F3
-  topLevelVariables
-    isOriginGetterSetter isStatic foo
-      reference: <testLibrary>::@topLevelVariable::foo
-      firstFragment: #F1
-      type: int
-      getter: <testLibrary>::@getter::foo
-  getters
-    isOriginDeclaration isStatic foo
-      reference: <testLibrary>::@getter::foo
-      firstFragment: #F2
-      returnType: int
-      variable: <testLibrary>::@topLevelVariable::foo
-  exportEntries
-    declared <testLibrary>::@getter::foo
-  exportNamespace
-    foo: <testLibrary>::@getter::foo
-''');
-  }
-
-  test_getter_augment_nothing() async {
-    var library = await buildLibrary(r'''
-augment int get foo => 0;
-''');
-
-    configuration.withExportScope = true;
-    checkElementText(library, r'''
-library
-  reference: <testLibrary>
-  fragments
-    #F0 <testLibraryFragment>
-      element: <testLibrary>
-      topLevelVariables
-        #F1 isOriginGetterSetter isStatic foo (nameOffset:<null>) (firstTokenOffset:<null>) (offset:16)
-          element: <testLibrary>::@topLevelVariable::foo
-      getters
-        #F2 isAugmentation isCompleteDeclaration isOriginDeclaration isStatic foo (nameOffset:16) (firstTokenOffset:0) (offset:16)
-          element: <testLibrary>::@getter::foo
-  topLevelVariables
-    isOriginGetterSetter isStatic foo
-      reference: <testLibrary>::@topLevelVariable::foo
-      firstFragment: #F1
-      type: int
-      getter: <testLibrary>::@getter::foo
-  getters
-    isOriginDeclaration isStatic foo
-      reference: <testLibrary>::@getter::foo
-      firstFragment: #F2
-      returnType: int
-      variable: <testLibrary>::@topLevelVariable::foo
-  exportEntries
-    declared <testLibrary>::@getter::foo
-  exportNamespace
-    foo: <testLibrary>::@getter::foo
-''');
-  }
-
-  test_getter_augment_setter() async {
-    var library = await buildLibrary(r'''
-set foo(int _) {}
-augment int get foo => 0;
-''');
-
-    configuration.withExportScope = true;
-    checkElementText(library, r'''
-library
-  reference: <testLibrary>
-  fragments
-    #F0 <testLibraryFragment>
-      element: <testLibrary>
-      topLevelVariables
-        #F1 isOriginGetterSetter isStatic foo (nameOffset:<null>) (firstTokenOffset:<null>) (offset:34)
-          element: <testLibrary>::@topLevelVariable::foo
-      getters
-        #F2 isAugmentation isCompleteDeclaration isOriginDeclaration isStatic foo (nameOffset:34) (firstTokenOffset:18) (offset:34)
-          element: <testLibrary>::@getter::foo
-      setters
-        #F3 hasImplicitReturnType isCompleteDeclaration isOriginDeclaration isStatic foo (nameOffset:4) (firstTokenOffset:0) (offset:4)
-          element: <testLibrary>::@setter::foo
-          formalParameters
-            #F4 requiredPositional isOriginDeclaration _ (nameOffset:12) (firstTokenOffset:8) (offset:12)
-              element: <testLibrary>::@setter::foo::@formalParameter::_
-  topLevelVariables
-    isOriginGetterSetter isStatic foo
-      reference: <testLibrary>::@topLevelVariable::foo
-      firstFragment: #F1
-      type: int
-      getter: <testLibrary>::@getter::foo
-      setter: <testLibrary>::@setter::foo
-  getters
-    isOriginDeclaration isStatic foo
-      reference: <testLibrary>::@getter::foo
-      firstFragment: #F2
-      previousFragmentOfDifferentKind: #F3
-      returnType: int
-      variable: <testLibrary>::@topLevelVariable::foo
-  setters
-    isOriginDeclaration isStatic foo
-      reference: <testLibrary>::@setter::foo
-      firstFragment: #F3
-      formalParameters
-        #E0 requiredPositional _
-          firstFragment: #F4
-          type: int
-      returnType: void
-      variable: <testLibrary>::@topLevelVariable::foo
-  exportEntries
-    declared <testLibrary>::@getter::foo
-    declared <testLibrary>::@setter::foo
-  exportNamespace
-    foo: <testLibrary>::@getter::foo
-    foo=: <testLibrary>::@setter::foo
-''');
-  }
-
-  test_getter_augment_variable() async {
-    var library = await buildLibrary(r'''
-int foo = 0;
-augment int get foo => 1;
-''');
-
-    configuration.withExportScope = true;
-    checkElementText(library, r'''
-library
-  reference: <testLibrary>
-  fragments
-    #F0 <testLibraryFragment>
-      element: <testLibrary>
-      topLevelVariables
-        #F1 hasInitializer isOriginDeclaration isStatic foo (nameOffset:4) (firstTokenOffset:4) (offset:4)
-          element: <testLibrary>::@topLevelVariable::foo
-      getters
-        #F2 isCompleteDeclaration isOriginVariable isStatic foo (nameOffset:<null>) (firstTokenOffset:<null>) (offset:4)
-          element: <testLibrary>::@getter::foo
-          nextFragment: #F3
-        #F3 isAugmentation isCompleteDeclaration isOriginDeclaration isStatic foo (nameOffset:29) (firstTokenOffset:13) (offset:29)
-          element: <testLibrary>::@getter::foo
-          previousFragment: #F2
-      setters
-        #F4 isCompleteDeclaration isOriginVariable isStatic foo (nameOffset:<null>) (firstTokenOffset:<null>) (offset:4)
-          element: <testLibrary>::@setter::foo
-          formalParameters
-            #F5 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:4)
-              element: <testLibrary>::@setter::foo::@formalParameter::value
-  topLevelVariables
-    hasInitializer isOriginDeclaration isStatic foo
-      reference: <testLibrary>::@topLevelVariable::foo
-      firstFragment: #F1
-      type: int
-      getter: <testLibrary>::@getter::foo
-      setter: <testLibrary>::@setter::foo
-  getters
-    isOriginVariable isStatic foo
-      reference: <testLibrary>::@getter::foo
-      firstFragment: #F2
-      returnType: int
-      variable: <testLibrary>::@topLevelVariable::foo
-  setters
-    isOriginVariable isStatic foo
-      reference: <testLibrary>::@setter::foo
-      firstFragment: #F4
-      formalParameters
-        #E0 requiredPositional value
-          firstFragment: #F5
-          type: int
-      returnType: void
-      variable: <testLibrary>::@topLevelVariable::foo
-  exportEntries
-    declared <testLibrary>::@getter::foo
-    declared <testLibrary>::@setter::foo
-  exportNamespace
-    foo: <testLibrary>::@getter::foo
-    foo=: <testLibrary>::@setter::foo
-''');
-  }
-
-  test_getter_augment_variable_annotated() async {
-    var library = await buildLibrary(r'''
-final foo = 0;
-@deprecated
-augment int get foo;
-''');
-
-    configuration.withExportScope = true;
-    checkElementText(library, r'''
-library
-  reference: <testLibrary>
-  fragments
-    #F0 <testLibraryFragment>
-      element: <testLibrary>
-      topLevelVariables
-        #F1 hasImplicitType hasInitializer isFinal isOriginDeclaration isStatic foo (nameOffset:6) (firstTokenOffset:6) (offset:6)
-          element: <testLibrary>::@topLevelVariable::foo
-      getters
-        #F2 isCompleteDeclaration isOriginVariable isStatic foo (nameOffset:<null>) (firstTokenOffset:<null>) (offset:6)
-          element: <testLibrary>::@getter::foo
-          nextFragment: #F3
-        #F3 isAugmentation isOriginDeclaration isStatic foo (nameOffset:43) (firstTokenOffset:15) (offset:43)
-          element: <testLibrary>::@getter::foo
-          metadata
-            Annotation
-              atSign: @ @15
-              name: SimpleIdentifier
-                token: deprecated @16
-                element: dart:core::@getter::deprecated
-                staticType: null
-              element: dart:core::@getter::deprecated
-          previousFragment: #F2
-  topLevelVariables
-    hasImplicitType hasInitializer isFinal isOriginDeclaration isStatic isTypeInferredFromInitializer foo
-      reference: <testLibrary>::@topLevelVariable::foo
-      firstFragment: #F1
-      type: int
-      getter: <testLibrary>::@getter::foo
-  getters
-    isOriginVariable isStatic foo
-      reference: <testLibrary>::@getter::foo
-      firstFragment: #F2
-      metadata
-        Annotation
-          atSign: @ @15
-          name: SimpleIdentifier
-            token: deprecated @16
-            element: dart:core::@getter::deprecated
-            staticType: null
-          element: dart:core::@getter::deprecated
-      returnType: int
-      variable: <testLibrary>::@topLevelVariable::foo
-  exportEntries
-    declared <testLibrary>::@getter::foo
-  exportNamespace
-    foo: <testLibrary>::@getter::foo
-''');
-  }
-
-  test_getter_augment_variable_const() async {
-    var library = await buildLibrary(r'''
-const int foo = 0;
-augment int get foo => 1;
-''');
-
-    checkElementText(library, r'''
-library
-  reference: <testLibrary>
-  fragments
-    #F0 <testLibraryFragment>
-      element: <testLibrary>
-      topLevelVariables
-        #F1 hasInitializer isConst isOriginDeclaration isStatic foo (nameOffset:10) (firstTokenOffset:10) (offset:10)
-          element: <testLibrary>::@topLevelVariable::foo
-          initializer: expression_0
-            IntegerLiteral
-              literal: 0 @16
-              staticType: int
-      getters
-        #F2 isCompleteDeclaration isOriginVariable isStatic foo (nameOffset:<null>) (firstTokenOffset:<null>) (offset:10)
-          element: <testLibrary>::@getter::foo
-          nextFragment: #F3
-        #F3 isAugmentation isCompleteDeclaration isOriginDeclaration isStatic foo (nameOffset:35) (firstTokenOffset:19) (offset:35)
-          element: <testLibrary>::@getter::foo
-          previousFragment: #F2
-  topLevelVariables
-    hasInitializer isConst isOriginDeclaration isStatic foo
-      reference: <testLibrary>::@topLevelVariable::foo
-      firstFragment: #F1
-      type: int
-      constantInitializer
-        fragment: #F1
-        expression: expression_0
-      getter: <testLibrary>::@getter::foo
-  getters
-    isOriginVariable isStatic foo
-      reference: <testLibrary>::@getter::foo
-      firstFragment: #F2
-      returnType: int
-      variable: <testLibrary>::@topLevelVariable::foo
-''');
-  }
-
-  test_getter_augment_variable_differentType() async {
-    var library = await buildLibrary(r'''
-int foo = 0;
-augment double get foo => 1;
-''');
-
-    configuration.withExportScope = true;
-    checkElementText(library, r'''
-library
-  reference: <testLibrary>
-  fragments
-    #F0 <testLibraryFragment>
-      element: <testLibrary>
-      topLevelVariables
-        #F1 hasInitializer isOriginDeclaration isStatic foo (nameOffset:4) (firstTokenOffset:4) (offset:4)
-          element: <testLibrary>::@topLevelVariable::foo
-      getters
-        #F2 isCompleteDeclaration isOriginVariable isStatic foo (nameOffset:<null>) (firstTokenOffset:<null>) (offset:4)
-          element: <testLibrary>::@getter::foo
-          nextFragment: #F3
-        #F3 isAugmentation isCompleteDeclaration isOriginDeclaration isStatic foo (nameOffset:32) (firstTokenOffset:13) (offset:32)
-          element: <testLibrary>::@getter::foo
-          previousFragment: #F2
-      setters
-        #F4 isCompleteDeclaration isOriginVariable isStatic foo (nameOffset:<null>) (firstTokenOffset:<null>) (offset:4)
-          element: <testLibrary>::@setter::foo
-          formalParameters
-            #F5 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:4)
-              element: <testLibrary>::@setter::foo::@formalParameter::value
-  topLevelVariables
-    hasInitializer isOriginDeclaration isStatic foo
-      reference: <testLibrary>::@topLevelVariable::foo
-      firstFragment: #F1
-      type: int
-      getter: <testLibrary>::@getter::foo
-      setter: <testLibrary>::@setter::foo
-  getters
-    isOriginVariable isStatic foo
-      reference: <testLibrary>::@getter::foo
-      firstFragment: #F2
-      returnType: int
-      variable: <testLibrary>::@topLevelVariable::foo
-  setters
-    isOriginVariable isStatic foo
-      reference: <testLibrary>::@setter::foo
-      firstFragment: #F4
-      formalParameters
-        #E0 requiredPositional value
-          firstFragment: #F5
-          type: int
-      returnType: void
-      variable: <testLibrary>::@topLevelVariable::foo
-  exportEntries
-    declared <testLibrary>::@getter::foo
-    declared <testLibrary>::@setter::foo
-  exportNamespace
-    foo: <testLibrary>::@getter::foo
-    foo=: <testLibrary>::@setter::foo
-''');
-  }
-
-  test_getter_augment_variable_final() async {
-    var library = await buildLibrary(r'''
-final int foo = 0;
-augment int get foo => 1;
-''');
-
-    configuration.withExportScope = true;
-    checkElementText(library, r'''
-library
-  reference: <testLibrary>
-  fragments
-    #F0 <testLibraryFragment>
-      element: <testLibrary>
-      topLevelVariables
-        #F1 hasInitializer isFinal isOriginDeclaration isStatic foo (nameOffset:10) (firstTokenOffset:10) (offset:10)
-          element: <testLibrary>::@topLevelVariable::foo
-      getters
-        #F2 isCompleteDeclaration isOriginVariable isStatic foo (nameOffset:<null>) (firstTokenOffset:<null>) (offset:10)
-          element: <testLibrary>::@getter::foo
-          nextFragment: #F3
-        #F3 isAugmentation isCompleteDeclaration isOriginDeclaration isStatic foo (nameOffset:35) (firstTokenOffset:19) (offset:35)
-          element: <testLibrary>::@getter::foo
-          previousFragment: #F2
-  topLevelVariables
-    hasInitializer isFinal isOriginDeclaration isStatic foo
-      reference: <testLibrary>::@topLevelVariable::foo
-      firstFragment: #F1
-      type: int
-      getter: <testLibrary>::@getter::foo
-  getters
-    isOriginVariable isStatic foo
-      reference: <testLibrary>::@getter::foo
-      firstFragment: #F2
-      returnType: int
-      variable: <testLibrary>::@topLevelVariable::foo
-  exportEntries
-    declared <testLibrary>::@getter::foo
-  exportNamespace
-    foo: <testLibrary>::@getter::foo
-''');
-  }
-
-  test_setter_augment_class() async {
-    var library = await buildLibrary(r'''
-class A {}
-augment set A(int _) {}
-''');
-
-    configuration.withExportScope = true;
-    checkElementText(library, r'''
-library
-  reference: <testLibrary>
-  fragments
-    #F0 <testLibraryFragment>
-      element: <testLibrary>
-      classes
-        #F1 class A (nameOffset:6) (firstTokenOffset:0) (offset:6)
-          element: <testLibrary>::@class::A
-          constructors
-            #F2 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:6)
-              element: <testLibrary>::@class::A::@constructor::new
-              typeName: A
-      topLevelVariables
-        #F3 isOriginGetterSetter isStatic A (nameOffset:<null>) (firstTokenOffset:<null>) (offset:23)
-          element: <testLibrary>::@topLevelVariable::A
-      setters
-        #F4 hasImplicitReturnType isAugmentation isCompleteDeclaration isOriginDeclaration isStatic A (nameOffset:23) (firstTokenOffset:11) (offset:23)
-          element: <testLibrary>::@setter::A
-          formalParameters
-            #F5 requiredPositional isOriginDeclaration _ (nameOffset:29) (firstTokenOffset:25) (offset:29)
-              element: <testLibrary>::@setter::A::@formalParameter::_
-  classes
-    isSimplyBounded class A
-      reference: <testLibrary>::@class::A
-      firstFragment: #F1
-      constructors
-        isOriginImplicitDefault new
-          reference: <testLibrary>::@class::A::@constructor::new
-          firstFragment: #F2
-  topLevelVariables
-    isOriginGetterSetter isStatic A
-      reference: <testLibrary>::@topLevelVariable::A
-      firstFragment: #F3
-      type: int
-      setter: <testLibrary>::@setter::A
-  setters
-    isOriginDeclaration isStatic A
-      reference: <testLibrary>::@setter::A
-      firstFragment: #F4
-      previousFragmentOfDifferentKind: #F1
-      formalParameters
-        #E0 requiredPositional _
-          firstFragment: #F5
-          type: int
-      returnType: void
-      variable: <testLibrary>::@topLevelVariable::A
-  exportEntries
-    declared <testLibrary>::@class::A
-    declared <testLibrary>::@setter::A
-  exportNamespace
-    A: <testLibrary>::@class::A
-    A=: <testLibrary>::@setter::A
-''');
-  }
-
-  test_setter_augment_function() async {
-    var library = await buildLibrary(r'''
-void foo() {}
-augment set foo(int _) {}
-''');
-
-    configuration.withExportScope = true;
-    checkElementText(library, r'''
-library
-  reference: <testLibrary>
-  fragments
-    #F0 <testLibraryFragment>
-      element: <testLibrary>
-      topLevelVariables
-        #F1 isOriginGetterSetter isStatic foo (nameOffset:<null>) (firstTokenOffset:<null>) (offset:26)
-          element: <testLibrary>::@topLevelVariable::foo
-      setters
-        #F2 hasImplicitReturnType isAugmentation isCompleteDeclaration isOriginDeclaration isStatic foo (nameOffset:26) (firstTokenOffset:14) (offset:26)
-          element: <testLibrary>::@setter::foo
-          formalParameters
-            #F3 requiredPositional isOriginDeclaration _ (nameOffset:34) (firstTokenOffset:30) (offset:34)
-              element: <testLibrary>::@setter::foo::@formalParameter::_
-      functions
-        #F4 isCompleteDeclaration isOriginDeclaration isStatic foo (nameOffset:5) (firstTokenOffset:0) (offset:5)
-          element: <testLibrary>::@function::foo
-  topLevelVariables
-    isOriginGetterSetter isStatic foo
-      reference: <testLibrary>::@topLevelVariable::foo
-      firstFragment: #F1
-      type: int
-      setter: <testLibrary>::@setter::foo
-  setters
-    isOriginDeclaration isStatic foo
-      reference: <testLibrary>::@setter::foo
-      firstFragment: #F2
-      previousFragmentOfDifferentKind: #F4
-      formalParameters
-        #E0 requiredPositional _
-          firstFragment: #F3
-          type: int
-      returnType: void
-      variable: <testLibrary>::@topLevelVariable::foo
-  functions
-    isOriginDeclaration isStatic foo
-      reference: <testLibrary>::@function::foo
-      firstFragment: #F4
-      returnType: void
-  exportEntries
-    declared <testLibrary>::@function::foo
-    declared <testLibrary>::@setter::foo
-  exportNamespace
-    foo: <testLibrary>::@function::foo
-    foo=: <testLibrary>::@setter::foo
-''');
-  }
-
-  test_setter_augment_getter() async {
-    var library = await buildLibrary(r'''
-int get foo => 0;
-augment set foo(int _) {}
-''');
-
-    configuration.withExportScope = true;
-    checkElementText(library, r'''
-library
-  reference: <testLibrary>
-  fragments
-    #F0 <testLibraryFragment>
-      element: <testLibrary>
-      topLevelVariables
-        #F1 isOriginGetterSetter isStatic foo (nameOffset:<null>) (firstTokenOffset:<null>) (offset:8)
-          element: <testLibrary>::@topLevelVariable::foo
-      getters
-        #F2 isCompleteDeclaration isOriginDeclaration isStatic foo (nameOffset:8) (firstTokenOffset:0) (offset:8)
-          element: <testLibrary>::@getter::foo
-      setters
-        #F3 hasImplicitReturnType isAugmentation isCompleteDeclaration isOriginDeclaration isStatic foo (nameOffset:30) (firstTokenOffset:18) (offset:30)
-          element: <testLibrary>::@setter::foo
-          formalParameters
-            #F4 requiredPositional isOriginDeclaration _ (nameOffset:38) (firstTokenOffset:34) (offset:38)
-              element: <testLibrary>::@setter::foo::@formalParameter::_
-  topLevelVariables
-    isOriginGetterSetter isStatic foo
-      reference: <testLibrary>::@topLevelVariable::foo
-      firstFragment: #F1
-      type: int
-      getter: <testLibrary>::@getter::foo
-      setter: <testLibrary>::@setter::foo
-  getters
-    isOriginDeclaration isStatic foo
-      reference: <testLibrary>::@getter::foo
-      firstFragment: #F2
-      returnType: int
-      variable: <testLibrary>::@topLevelVariable::foo
-  setters
-    isOriginDeclaration isStatic foo
-      reference: <testLibrary>::@setter::foo
-      firstFragment: #F3
-      previousFragmentOfDifferentKind: #F2
-      formalParameters
-        #E0 requiredPositional _
-          firstFragment: #F4
-          type: int
-      returnType: void
-      variable: <testLibrary>::@topLevelVariable::foo
-  exportEntries
-    declared <testLibrary>::@getter::foo
-    declared <testLibrary>::@setter::foo
-  exportNamespace
-    foo: <testLibrary>::@getter::foo
-    foo=: <testLibrary>::@setter::foo
-''');
-  }
-
-  test_setter_augment_getter_differentType() async {
-    var library = await buildLibrary(r'''
-int get foo => 0;
-augment set foo(double _) {}
-''');
-
-    configuration.withExportScope = true;
-    checkElementText(library, r'''
-library
-  reference: <testLibrary>
-  fragments
-    #F0 <testLibraryFragment>
-      element: <testLibrary>
-      topLevelVariables
-        #F1 isOriginGetterSetter isStatic foo (nameOffset:<null>) (firstTokenOffset:<null>) (offset:8)
-          element: <testLibrary>::@topLevelVariable::foo
-      getters
-        #F2 isCompleteDeclaration isOriginDeclaration isStatic foo (nameOffset:8) (firstTokenOffset:0) (offset:8)
-          element: <testLibrary>::@getter::foo
-      setters
-        #F3 hasImplicitReturnType isAugmentation isCompleteDeclaration isOriginDeclaration isStatic foo (nameOffset:30) (firstTokenOffset:18) (offset:30)
-          element: <testLibrary>::@setter::foo
-          formalParameters
-            #F4 requiredPositional isOriginDeclaration _ (nameOffset:41) (firstTokenOffset:34) (offset:41)
-              element: <testLibrary>::@setter::foo::@formalParameter::_
-  topLevelVariables
-    isOriginGetterSetter isStatic foo
-      reference: <testLibrary>::@topLevelVariable::foo
-      firstFragment: #F1
-      type: int
-      getter: <testLibrary>::@getter::foo
-      setter: <testLibrary>::@setter::foo
-  getters
-    isOriginDeclaration isStatic foo
-      reference: <testLibrary>::@getter::foo
-      firstFragment: #F2
-      returnType: int
-      variable: <testLibrary>::@topLevelVariable::foo
-  setters
-    isOriginDeclaration isStatic foo
-      reference: <testLibrary>::@setter::foo
-      firstFragment: #F3
-      previousFragmentOfDifferentKind: #F2
-      formalParameters
-        #E0 requiredPositional _
-          firstFragment: #F4
-          type: double
-      returnType: void
-      variable: <testLibrary>::@topLevelVariable::foo
-  exportEntries
-    declared <testLibrary>::@getter::foo
-    declared <testLibrary>::@setter::foo
-  exportNamespace
-    foo: <testLibrary>::@getter::foo
-    foo=: <testLibrary>::@setter::foo
-''');
-  }
-
-  test_setter_augment_getter_multiple_annotations() async {
-    newFile('$testPackageLibPath/a.dart', r'''
-const a1 = 1;
-const a2 = 2;
-const a3 = 3;
-''');
-
-    var library = await buildLibrary(r'''
-import 'a.dart';
-@a1
-set foo(int _) {}
-@a2
-augment set foo(int _) {}
-@a3
-augment set foo(int _) {}
-''');
-
-    configuration.withExportScope = true;
-    checkElementText(library, r'''
-library
-  reference: <testLibrary>
-  fragments
-    #F0 <testLibraryFragment>
-      element: <testLibrary>
-      libraryImports
-        package:test/a.dart
-      topLevelVariables
-        #F1 isOriginGetterSetter isStatic foo (nameOffset:<null>) (firstTokenOffset:<null>) (offset:25)
-          element: <testLibrary>::@topLevelVariable::foo
-      setters
-        #F2 hasImplicitReturnType isCompleteDeclaration isOriginDeclaration isStatic foo (nameOffset:25) (firstTokenOffset:17) (offset:25)
-          element: <testLibrary>::@setter::foo
-          metadata
-            Annotation
-              atSign: @ @17
-              name: SimpleIdentifier
-                token: a1 @18
-                element: package:test/a.dart::@getter::a1
-                staticType: null
-              element: package:test/a.dart::@getter::a1
-          formalParameters
-            #F3 requiredPositional isOriginDeclaration _ (nameOffset:33) (firstTokenOffset:29) (offset:33)
-              element: <testLibrary>::@setter::foo::@formalParameter::_
-              nextFragment: #F4
-          nextFragment: #F5
-        #F5 hasImplicitReturnType isAugmentation isCompleteDeclaration isOriginDeclaration isStatic foo (nameOffset:55) (firstTokenOffset:39) (offset:55)
-          element: <testLibrary>::@setter::foo
-          metadata
-            Annotation
-              atSign: @ @39
-              name: SimpleIdentifier
-                token: a2 @40
-                element: package:test/a.dart::@getter::a2
-                staticType: null
-              element: package:test/a.dart::@getter::a2
-          formalParameters
-            #F4 requiredPositional isOriginDeclaration _ (nameOffset:63) (firstTokenOffset:59) (offset:63)
-              element: <testLibrary>::@setter::foo::@formalParameter::_
-              previousFragment: #F3
-              nextFragment: #F6
-          previousFragment: #F2
-          nextFragment: #F7
-        #F7 hasImplicitReturnType isAugmentation isCompleteDeclaration isOriginDeclaration isStatic foo (nameOffset:85) (firstTokenOffset:69) (offset:85)
-          element: <testLibrary>::@setter::foo
-          metadata
-            Annotation
-              atSign: @ @69
-              name: SimpleIdentifier
-                token: a3 @70
-                element: package:test/a.dart::@getter::a3
-                staticType: null
-              element: package:test/a.dart::@getter::a3
-          formalParameters
-            #F6 requiredPositional isOriginDeclaration _ (nameOffset:93) (firstTokenOffset:89) (offset:93)
-              element: <testLibrary>::@setter::foo::@formalParameter::_
-              previousFragment: #F4
-          previousFragment: #F5
-  topLevelVariables
-    isOriginGetterSetter isStatic foo
-      reference: <testLibrary>::@topLevelVariable::foo
-      firstFragment: #F1
-      type: int
-      setter: <testLibrary>::@setter::foo
-  setters
-    isOriginDeclaration isStatic foo
-      reference: <testLibrary>::@setter::foo
-      firstFragment: #F2
-      metadata
-        Annotation
-          atSign: @ @17
-          name: SimpleIdentifier
-            token: a1 @18
-            element: package:test/a.dart::@getter::a1
-            staticType: null
-          element: package:test/a.dart::@getter::a1
-        Annotation
-          atSign: @ @39
-          name: SimpleIdentifier
-            token: a2 @40
-            element: package:test/a.dart::@getter::a2
-            staticType: null
-          element: package:test/a.dart::@getter::a2
-        Annotation
-          atSign: @ @69
-          name: SimpleIdentifier
-            token: a3 @70
-            element: package:test/a.dart::@getter::a3
-            staticType: null
-          element: package:test/a.dart::@getter::a3
-      formalParameters
-        #E0 requiredPositional _
-          firstFragment: #F3
-          type: int
-      returnType: void
-      variable: <testLibrary>::@topLevelVariable::foo
-  exportEntries
-    declared <testLibrary>::@setter::foo
-  exportNamespace
-    foo=: <testLibrary>::@setter::foo
-''');
-  }
-
-  test_setter_augment_multiple_setters() async {
-    var library = await buildLibrary(r'''
-int set foo(int _) {}
-augment set foo(int _) {}
-augment set foo(int _) {}
-''');
-
-    configuration.withExportScope = true;
-    checkElementText(library, r'''
-library
-  reference: <testLibrary>
-  fragments
-    #F0 <testLibraryFragment>
-      element: <testLibrary>
-      topLevelVariables
-        #F1 isOriginGetterSetter isStatic foo (nameOffset:<null>) (firstTokenOffset:<null>) (offset:8)
-          element: <testLibrary>::@topLevelVariable::foo
-      setters
-        #F2 isCompleteDeclaration isOriginDeclaration isStatic foo (nameOffset:8) (firstTokenOffset:0) (offset:8)
-          element: <testLibrary>::@setter::foo
-          formalParameters
-            #F3 requiredPositional isOriginDeclaration _ (nameOffset:16) (firstTokenOffset:12) (offset:16)
-              element: <testLibrary>::@setter::foo::@formalParameter::_
-              nextFragment: #F4
-          nextFragment: #F5
-        #F5 hasImplicitReturnType isAugmentation isCompleteDeclaration isOriginDeclaration isStatic foo (nameOffset:34) (firstTokenOffset:22) (offset:34)
-          element: <testLibrary>::@setter::foo
-          formalParameters
-            #F4 requiredPositional isOriginDeclaration _ (nameOffset:42) (firstTokenOffset:38) (offset:42)
-              element: <testLibrary>::@setter::foo::@formalParameter::_
-              previousFragment: #F3
-              nextFragment: #F6
-          previousFragment: #F2
-          nextFragment: #F7
-        #F7 hasImplicitReturnType isAugmentation isCompleteDeclaration isOriginDeclaration isStatic foo (nameOffset:60) (firstTokenOffset:48) (offset:60)
-          element: <testLibrary>::@setter::foo
-          formalParameters
-            #F6 requiredPositional isOriginDeclaration _ (nameOffset:68) (firstTokenOffset:64) (offset:68)
-              element: <testLibrary>::@setter::foo::@formalParameter::_
-              previousFragment: #F4
-          previousFragment: #F5
-  topLevelVariables
-    isOriginGetterSetter isStatic foo
-      reference: <testLibrary>::@topLevelVariable::foo
-      firstFragment: #F1
-      type: int
-      setter: <testLibrary>::@setter::foo
-  setters
-    isOriginDeclaration isStatic foo
-      reference: <testLibrary>::@setter::foo
-      firstFragment: #F2
-      formalParameters
-        #E0 requiredPositional _
-          firstFragment: #F3
-          type: int
-      returnType: int
-      variable: <testLibrary>::@topLevelVariable::foo
-  exportEntries
-    declared <testLibrary>::@setter::foo
-  exportNamespace
-    foo=: <testLibrary>::@setter::foo
-''');
-  }
-
-  test_setter_augment_multiple_setters_differentType() async {
-    var library = await buildLibrary(r'''
-int set foo(int _) {}
-augment set foo(int _) {}
-augment set foo(double _) {}
-''');
-
-    configuration.withExportScope = true;
-    checkElementText(library, r'''
-library
-  reference: <testLibrary>
-  fragments
-    #F0 <testLibraryFragment>
-      element: <testLibrary>
-      topLevelVariables
-        #F1 isOriginGetterSetter isStatic foo (nameOffset:<null>) (firstTokenOffset:<null>) (offset:8)
-          element: <testLibrary>::@topLevelVariable::foo
-      setters
-        #F2 isCompleteDeclaration isOriginDeclaration isStatic foo (nameOffset:8) (firstTokenOffset:0) (offset:8)
-          element: <testLibrary>::@setter::foo
-          formalParameters
-            #F3 requiredPositional isOriginDeclaration _ (nameOffset:16) (firstTokenOffset:12) (offset:16)
-              element: <testLibrary>::@setter::foo::@formalParameter::_
-              nextFragment: #F4
-          nextFragment: #F5
-        #F5 hasImplicitReturnType isAugmentation isCompleteDeclaration isOriginDeclaration isStatic foo (nameOffset:34) (firstTokenOffset:22) (offset:34)
-          element: <testLibrary>::@setter::foo
-          formalParameters
-            #F4 requiredPositional isOriginDeclaration _ (nameOffset:42) (firstTokenOffset:38) (offset:42)
-              element: <testLibrary>::@setter::foo::@formalParameter::_
-              previousFragment: #F3
-              nextFragment: #F6
-          previousFragment: #F2
-          nextFragment: #F7
-        #F7 hasImplicitReturnType isAugmentation isCompleteDeclaration isOriginDeclaration isStatic foo (nameOffset:60) (firstTokenOffset:48) (offset:60)
-          element: <testLibrary>::@setter::foo
-          formalParameters
-            #F6 requiredPositional isOriginDeclaration _ (nameOffset:71) (firstTokenOffset:64) (offset:71)
-              element: <testLibrary>::@setter::foo::@formalParameter::_
-              previousFragment: #F4
-          previousFragment: #F5
-  topLevelVariables
-    isOriginGetterSetter isStatic foo
-      reference: <testLibrary>::@topLevelVariable::foo
-      firstFragment: #F1
-      type: int
-      setter: <testLibrary>::@setter::foo
-  setters
-    isOriginDeclaration isStatic foo
-      reference: <testLibrary>::@setter::foo
-      firstFragment: #F2
-      formalParameters
-        #E0 requiredPositional _
-          firstFragment: #F3
-          type: int
-      returnType: int
-      variable: <testLibrary>::@topLevelVariable::foo
-  exportEntries
-    declared <testLibrary>::@setter::foo
-  exportNamespace
-    foo=: <testLibrary>::@setter::foo
-''');
-  }
-
-  test_setter_augment_nothing() async {
-    var library = await buildLibrary(r'''
-augment set foo(int value) {}
-''');
-
-    configuration.withExportScope = true;
-    checkElementText(library, r'''
-library
-  reference: <testLibrary>
-  fragments
-    #F0 <testLibraryFragment>
-      element: <testLibrary>
-      topLevelVariables
-        #F1 isOriginGetterSetter isStatic foo (nameOffset:<null>) (firstTokenOffset:<null>) (offset:12)
-          element: <testLibrary>::@topLevelVariable::foo
-      setters
-        #F2 hasImplicitReturnType isAugmentation isCompleteDeclaration isOriginDeclaration isStatic foo (nameOffset:12) (firstTokenOffset:0) (offset:12)
-          element: <testLibrary>::@setter::foo
-          formalParameters
-            #F3 requiredPositional isOriginDeclaration value (nameOffset:20) (firstTokenOffset:16) (offset:20)
-              element: <testLibrary>::@setter::foo::@formalParameter::value
-  topLevelVariables
-    isOriginGetterSetter isStatic foo
-      reference: <testLibrary>::@topLevelVariable::foo
-      firstFragment: #F1
-      type: int
-      setter: <testLibrary>::@setter::foo
-  setters
-    isOriginDeclaration isStatic foo
-      reference: <testLibrary>::@setter::foo
-      firstFragment: #F2
-      formalParameters
-        #E0 requiredPositional value
-          firstFragment: #F3
-          type: int
-      returnType: void
-      variable: <testLibrary>::@topLevelVariable::foo
-  exportEntries
-    declared <testLibrary>::@setter::foo
-  exportNamespace
-    foo=: <testLibrary>::@setter::foo
-''');
-  }
-
-  test_setter_augment_setter() async {
-    var library = await buildLibrary(r'''
-set foo(int _) {}
-augment set foo(int _) {}
-''');
-
-    configuration.withExportScope = true;
-    checkElementText(library, r'''
-library
-  reference: <testLibrary>
-  fragments
-    #F0 <testLibraryFragment>
-      element: <testLibrary>
-      topLevelVariables
-        #F1 isOriginGetterSetter isStatic foo (nameOffset:<null>) (firstTokenOffset:<null>) (offset:4)
-          element: <testLibrary>::@topLevelVariable::foo
-      setters
-        #F2 hasImplicitReturnType isCompleteDeclaration isOriginDeclaration isStatic foo (nameOffset:4) (firstTokenOffset:0) (offset:4)
-          element: <testLibrary>::@setter::foo
-          formalParameters
-            #F3 requiredPositional isOriginDeclaration _ (nameOffset:12) (firstTokenOffset:8) (offset:12)
-              element: <testLibrary>::@setter::foo::@formalParameter::_
-              nextFragment: #F4
-          nextFragment: #F5
-        #F5 hasImplicitReturnType isAugmentation isCompleteDeclaration isOriginDeclaration isStatic foo (nameOffset:30) (firstTokenOffset:18) (offset:30)
-          element: <testLibrary>::@setter::foo
-          formalParameters
-            #F4 requiredPositional isOriginDeclaration _ (nameOffset:38) (firstTokenOffset:34) (offset:38)
-              element: <testLibrary>::@setter::foo::@formalParameter::_
-              previousFragment: #F3
-          previousFragment: #F2
-  topLevelVariables
-    isOriginGetterSetter isStatic foo
-      reference: <testLibrary>::@topLevelVariable::foo
-      firstFragment: #F1
-      type: int
-      setter: <testLibrary>::@setter::foo
-  setters
-    isOriginDeclaration isStatic foo
-      reference: <testLibrary>::@setter::foo
-      firstFragment: #F2
-      formalParameters
-        #E0 requiredPositional _
-          firstFragment: #F3
-          type: int
-      returnType: void
-      variable: <testLibrary>::@topLevelVariable::foo
-  exportEntries
-    declared <testLibrary>::@setter::foo
-  exportNamespace
-    foo=: <testLibrary>::@setter::foo
-''');
-  }
-
-  test_setter_augment_variable() async {
-    var library = await buildLibrary(r'''
-int foo = 0;
-augment set foo(int _) {}
-''');
-
-    configuration.withExportScope = true;
-    checkElementText(library, r'''
-library
-  reference: <testLibrary>
-  fragments
-    #F0 <testLibraryFragment>
-      element: <testLibrary>
-      topLevelVariables
-        #F1 hasInitializer isOriginDeclaration isStatic foo (nameOffset:4) (firstTokenOffset:4) (offset:4)
-          element: <testLibrary>::@topLevelVariable::foo
-      getters
-        #F2 isCompleteDeclaration isOriginVariable isStatic foo (nameOffset:<null>) (firstTokenOffset:<null>) (offset:4)
-          element: <testLibrary>::@getter::foo
-      setters
-        #F3 isCompleteDeclaration isOriginVariable isStatic foo (nameOffset:<null>) (firstTokenOffset:<null>) (offset:4)
-          element: <testLibrary>::@setter::foo
-          formalParameters
-            #F4 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:4)
-              element: <testLibrary>::@setter::foo::@formalParameter::value
-              nextFragment: #F5
-          nextFragment: #F6
-        #F6 hasImplicitReturnType isAugmentation isCompleteDeclaration isOriginDeclaration isStatic foo (nameOffset:25) (firstTokenOffset:13) (offset:25)
-          element: <testLibrary>::@setter::foo
-          formalParameters
-            #F5 requiredPositional isOriginDeclaration _ (nameOffset:33) (firstTokenOffset:29) (offset:33)
-              element: <testLibrary>::@setter::foo::@formalParameter::value
-              previousFragment: #F4
-          previousFragment: #F3
-  topLevelVariables
-    hasInitializer isOriginDeclaration isStatic foo
-      reference: <testLibrary>::@topLevelVariable::foo
-      firstFragment: #F1
-      type: int
-      getter: <testLibrary>::@getter::foo
-      setter: <testLibrary>::@setter::foo
-  getters
-    isOriginVariable isStatic foo
-      reference: <testLibrary>::@getter::foo
-      firstFragment: #F2
-      returnType: int
-      variable: <testLibrary>::@topLevelVariable::foo
-  setters
-    isOriginVariable isStatic foo
-      reference: <testLibrary>::@setter::foo
-      firstFragment: #F3
-      formalParameters
-        #E0 requiredPositional value
-          firstFragment: #F4
-          type: int
-      returnType: void
-      variable: <testLibrary>::@topLevelVariable::foo
-  exportEntries
-    declared <testLibrary>::@getter::foo
-    declared <testLibrary>::@setter::foo
-  exportNamespace
-    foo: <testLibrary>::@getter::foo
-    foo=: <testLibrary>::@setter::foo
-''');
-  }
-
-  test_setter_augment_variable_annotated() async {
-    var library = await buildLibrary(r'''
-final foo = 0;
-@deprecated
-augment set foo(int _) {}
-''');
-
-    configuration.withExportScope = true;
-    checkElementText(library, r'''
-library
-  reference: <testLibrary>
-  fragments
-    #F0 <testLibraryFragment>
-      element: <testLibrary>
-      topLevelVariables
-        #F1 hasImplicitType hasInitializer isFinal isOriginDeclaration isStatic foo (nameOffset:6) (firstTokenOffset:6) (offset:6)
-          element: <testLibrary>::@topLevelVariable::foo
-      getters
-        #F2 isCompleteDeclaration isOriginVariable isStatic foo (nameOffset:<null>) (firstTokenOffset:<null>) (offset:6)
-          element: <testLibrary>::@getter::foo
-      setters
-        #F3 hasImplicitReturnType isAugmentation isCompleteDeclaration isOriginDeclaration isStatic foo (nameOffset:39) (firstTokenOffset:15) (offset:39)
-          element: <testLibrary>::@setter::foo
-          metadata
-            Annotation
-              atSign: @ @15
-              name: SimpleIdentifier
-                token: deprecated @16
-                element: dart:core::@getter::deprecated
-                staticType: null
-              element: dart:core::@getter::deprecated
-          formalParameters
-            #F4 requiredPositional isOriginDeclaration _ (nameOffset:47) (firstTokenOffset:43) (offset:47)
-              element: <testLibrary>::@setter::foo::@formalParameter::_
-  topLevelVariables
-    hasImplicitType hasInitializer isFinal isOriginDeclaration isStatic isTypeInferredFromInitializer foo
-      reference: <testLibrary>::@topLevelVariable::foo
-      firstFragment: #F1
-      type: int
-      getter: <testLibrary>::@getter::foo
-      setter: <testLibrary>::@setter::foo
-  getters
-    isOriginVariable isStatic foo
-      reference: <testLibrary>::@getter::foo
-      firstFragment: #F2
-      returnType: int
-      variable: <testLibrary>::@topLevelVariable::foo
-  setters
-    isOriginDeclaration isStatic foo
-      reference: <testLibrary>::@setter::foo
-      firstFragment: #F3
-      previousFragmentOfDifferentKind: #F1
-      metadata
-        Annotation
-          atSign: @ @15
-          name: SimpleIdentifier
-            token: deprecated @16
-            element: dart:core::@getter::deprecated
-            staticType: null
-          element: dart:core::@getter::deprecated
-      formalParameters
-        #E0 requiredPositional _
-          firstFragment: #F4
-          type: int
-      returnType: void
-      variable: <testLibrary>::@topLevelVariable::foo
-  exportEntries
-    declared <testLibrary>::@getter::foo
-    declared <testLibrary>::@setter::foo
-  exportNamespace
-    foo: <testLibrary>::@getter::foo
-    foo=: <testLibrary>::@setter::foo
-''');
-  }
-
-  test_setter_augment_variable_const() async {
-    var library = await buildLibrary(r'''
-const int foo = 0;
-augment set foo(int _) {}
-''');
-
-    checkElementText(library, r'''
-library
-  reference: <testLibrary>
-  fragments
-    #F0 <testLibraryFragment>
-      element: <testLibrary>
-      topLevelVariables
-        #F1 hasInitializer isConst isOriginDeclaration isStatic foo (nameOffset:10) (firstTokenOffset:10) (offset:10)
-          element: <testLibrary>::@topLevelVariable::foo
-          initializer: expression_0
-            IntegerLiteral
-              literal: 0 @16
-              staticType: int
-      getters
-        #F2 isCompleteDeclaration isOriginVariable isStatic foo (nameOffset:<null>) (firstTokenOffset:<null>) (offset:10)
-          element: <testLibrary>::@getter::foo
-      setters
-        #F3 hasImplicitReturnType isAugmentation isCompleteDeclaration isOriginDeclaration isStatic foo (nameOffset:31) (firstTokenOffset:19) (offset:31)
-          element: <testLibrary>::@setter::foo
-          formalParameters
-            #F4 requiredPositional isOriginDeclaration _ (nameOffset:39) (firstTokenOffset:35) (offset:39)
-              element: <testLibrary>::@setter::foo::@formalParameter::_
-  topLevelVariables
-    hasInitializer isConst isOriginDeclaration isStatic foo
-      reference: <testLibrary>::@topLevelVariable::foo
-      firstFragment: #F1
-      type: int
-      constantInitializer
-        fragment: #F1
-        expression: expression_0
-      getter: <testLibrary>::@getter::foo
-      setter: <testLibrary>::@setter::foo
-  getters
-    isOriginVariable isStatic foo
-      reference: <testLibrary>::@getter::foo
-      firstFragment: #F2
-      returnType: int
-      variable: <testLibrary>::@topLevelVariable::foo
-  setters
-    isOriginDeclaration isStatic foo
-      reference: <testLibrary>::@setter::foo
-      firstFragment: #F3
-      previousFragmentOfDifferentKind: #F1
-      formalParameters
-        #E0 requiredPositional _
-          firstFragment: #F4
-          type: int
-      returnType: void
-      variable: <testLibrary>::@topLevelVariable::foo
-''');
-  }
-
-  test_setter_augment_variable_differentType() async {
-    var library = await buildLibrary(r'''
-int foo = 0;
-augment set foo(double _) {}
-''');
-
-    configuration.withExportScope = true;
-    checkElementText(library, r'''
-library
-  reference: <testLibrary>
-  fragments
-    #F0 <testLibraryFragment>
-      element: <testLibrary>
-      topLevelVariables
-        #F1 hasInitializer isOriginDeclaration isStatic foo (nameOffset:4) (firstTokenOffset:4) (offset:4)
-          element: <testLibrary>::@topLevelVariable::foo
-      getters
-        #F2 isCompleteDeclaration isOriginVariable isStatic foo (nameOffset:<null>) (firstTokenOffset:<null>) (offset:4)
-          element: <testLibrary>::@getter::foo
-      setters
-        #F3 isCompleteDeclaration isOriginVariable isStatic foo (nameOffset:<null>) (firstTokenOffset:<null>) (offset:4)
-          element: <testLibrary>::@setter::foo
-          formalParameters
-            #F4 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:4)
-              element: <testLibrary>::@setter::foo::@formalParameter::value
-              nextFragment: #F5
-          nextFragment: #F6
-        #F6 hasImplicitReturnType isAugmentation isCompleteDeclaration isOriginDeclaration isStatic foo (nameOffset:25) (firstTokenOffset:13) (offset:25)
-          element: <testLibrary>::@setter::foo
-          formalParameters
-            #F5 requiredPositional isOriginDeclaration _ (nameOffset:36) (firstTokenOffset:29) (offset:36)
-              element: <testLibrary>::@setter::foo::@formalParameter::value
-              previousFragment: #F4
-          previousFragment: #F3
-  topLevelVariables
-    hasInitializer isOriginDeclaration isStatic foo
-      reference: <testLibrary>::@topLevelVariable::foo
-      firstFragment: #F1
-      type: int
-      getter: <testLibrary>::@getter::foo
-      setter: <testLibrary>::@setter::foo
-  getters
-    isOriginVariable isStatic foo
-      reference: <testLibrary>::@getter::foo
-      firstFragment: #F2
-      returnType: int
-      variable: <testLibrary>::@topLevelVariable::foo
-  setters
-    isOriginVariable isStatic foo
-      reference: <testLibrary>::@setter::foo
-      firstFragment: #F3
-      formalParameters
-        #E0 requiredPositional value
-          firstFragment: #F4
-          type: int
-      returnType: void
-      variable: <testLibrary>::@topLevelVariable::foo
-  exportEntries
-    declared <testLibrary>::@getter::foo
-    declared <testLibrary>::@setter::foo
-  exportNamespace
-    foo: <testLibrary>::@getter::foo
-    foo=: <testLibrary>::@setter::foo
-''');
-  }
-
-  test_setter_augment_variable_final() async {
-    var library = await buildLibrary(r'''
-final int foo = 0;
-augment set foo(int _) {}
-''');
-
-    configuration.withExportScope = true;
-    checkElementText(library, r'''
-library
-  reference: <testLibrary>
-  fragments
-    #F0 <testLibraryFragment>
-      element: <testLibrary>
-      topLevelVariables
-        #F1 hasInitializer isFinal isOriginDeclaration isStatic foo (nameOffset:10) (firstTokenOffset:10) (offset:10)
-          element: <testLibrary>::@topLevelVariable::foo
-      getters
-        #F2 isCompleteDeclaration isOriginVariable isStatic foo (nameOffset:<null>) (firstTokenOffset:<null>) (offset:10)
-          element: <testLibrary>::@getter::foo
-      setters
-        #F3 hasImplicitReturnType isAugmentation isCompleteDeclaration isOriginDeclaration isStatic foo (nameOffset:31) (firstTokenOffset:19) (offset:31)
-          element: <testLibrary>::@setter::foo
-          formalParameters
-            #F4 requiredPositional isOriginDeclaration _ (nameOffset:39) (firstTokenOffset:35) (offset:39)
-              element: <testLibrary>::@setter::foo::@formalParameter::_
-  topLevelVariables
-    hasInitializer isFinal isOriginDeclaration isStatic foo
-      reference: <testLibrary>::@topLevelVariable::foo
-      firstFragment: #F1
-      type: int
-      getter: <testLibrary>::@getter::foo
-      setter: <testLibrary>::@setter::foo
-  getters
-    isOriginVariable isStatic foo
-      reference: <testLibrary>::@getter::foo
-      firstFragment: #F2
-      returnType: int
-      variable: <testLibrary>::@topLevelVariable::foo
-  setters
-    isOriginDeclaration isStatic foo
-      reference: <testLibrary>::@setter::foo
-      firstFragment: #F3
-      previousFragmentOfDifferentKind: #F1
-      formalParameters
-        #E0 requiredPositional _
-          firstFragment: #F4
-          type: int
-      returnType: void
-      variable: <testLibrary>::@topLevelVariable::foo
-  exportEntries
-    declared <testLibrary>::@getter::foo
-    declared <testLibrary>::@setter::foo
-  exportNamespace
-    foo: <testLibrary>::@getter::foo
-    foo=: <testLibrary>::@setter::foo
-''');
-  }
-
-  test_variable_augment_class() async {
-    var library = await buildLibrary(r'''
-class A {}
-augment int A = 0;
-''');
-
-    configuration.withExportScope = true;
-    checkElementText(library, r'''
-library
-  reference: <testLibrary>
-  fragments
-    #F0 <testLibraryFragment>
-      element: <testLibrary>
-      classes
-        #F1 class A (nameOffset:6) (firstTokenOffset:0) (offset:6)
-          element: <testLibrary>::@class::A
-          constructors
-            #F2 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:6)
-              element: <testLibrary>::@class::A::@constructor::new
-              typeName: A
-      topLevelVariables
-        #F3 hasInitializer isAugmentation isOriginDeclaration isStatic A (nameOffset:23) (firstTokenOffset:23) (offset:23)
-          element: <testLibrary>::@topLevelVariable::A
-      getters
-        #F4 isCompleteDeclaration isOriginVariable isStatic A (nameOffset:<null>) (firstTokenOffset:<null>) (offset:23)
-          element: <testLibrary>::@getter::A
-      setters
-        #F5 isCompleteDeclaration isOriginVariable isStatic A (nameOffset:<null>) (firstTokenOffset:<null>) (offset:23)
-          element: <testLibrary>::@setter::A
-          formalParameters
-            #F6 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:23)
-              element: <testLibrary>::@setter::A::@formalParameter::value
-  classes
-    isSimplyBounded class A
-      reference: <testLibrary>::@class::A
-      firstFragment: #F1
-      constructors
-        isOriginImplicitDefault new
-          reference: <testLibrary>::@class::A::@constructor::new
-          firstFragment: #F2
-  topLevelVariables
-    hasInitializer isOriginDeclaration isStatic A
-      reference: <testLibrary>::@topLevelVariable::A
-      firstFragment: #F3
-      previousFragmentOfDifferentKind: #F1
-      type: int
-      getter: <testLibrary>::@getter::A
-      setter: <testLibrary>::@setter::A
-  getters
-    isOriginVariable isStatic A
-      reference: <testLibrary>::@getter::A
-      firstFragment: #F4
-      returnType: int
-      variable: <testLibrary>::@topLevelVariable::A
-  setters
-    isOriginVariable isStatic A
-      reference: <testLibrary>::@setter::A
-      firstFragment: #F5
-      formalParameters
-        #E0 requiredPositional value
-          firstFragment: #F6
-          type: int
-      returnType: void
-      variable: <testLibrary>::@topLevelVariable::A
-  exportEntries
-    declared <testLibrary>::@getter::A
-    declared <testLibrary>::@setter::A
-  exportNamespace
-    A: <testLibrary>::@getter::A
-    A=: <testLibrary>::@setter::A
-''');
-  }
-
-  test_variable_augment_function() async {
-    var library = await buildLibrary(r'''
-void foo() {}
-augment int foo = 0;
-''');
-
-    configuration.withExportScope = true;
-    checkElementText(library, r'''
-library
-  reference: <testLibrary>
-  fragments
-    #F0 <testLibraryFragment>
-      element: <testLibrary>
-      topLevelVariables
-        #F1 hasInitializer isAugmentation isOriginDeclaration isStatic foo (nameOffset:26) (firstTokenOffset:26) (offset:26)
-          element: <testLibrary>::@topLevelVariable::foo
-      getters
-        #F2 isCompleteDeclaration isOriginVariable isStatic foo (nameOffset:<null>) (firstTokenOffset:<null>) (offset:26)
-          element: <testLibrary>::@getter::foo
-      setters
-        #F3 isCompleteDeclaration isOriginVariable isStatic foo (nameOffset:<null>) (firstTokenOffset:<null>) (offset:26)
-          element: <testLibrary>::@setter::foo
-          formalParameters
-            #F4 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:26)
-              element: <testLibrary>::@setter::foo::@formalParameter::value
-      functions
-        #F5 isCompleteDeclaration isOriginDeclaration isStatic foo (nameOffset:5) (firstTokenOffset:0) (offset:5)
-          element: <testLibrary>::@function::foo
-  topLevelVariables
-    hasInitializer isOriginDeclaration isStatic foo
-      reference: <testLibrary>::@topLevelVariable::foo
-      firstFragment: #F1
-      previousFragmentOfDifferentKind: #F5
-      type: int
-      getter: <testLibrary>::@getter::foo
-      setter: <testLibrary>::@setter::foo
-  getters
-    isOriginVariable isStatic foo
-      reference: <testLibrary>::@getter::foo
-      firstFragment: #F2
-      returnType: int
-      variable: <testLibrary>::@topLevelVariable::foo
-  setters
-    isOriginVariable isStatic foo
-      reference: <testLibrary>::@setter::foo
-      firstFragment: #F3
-      formalParameters
-        #E0 requiredPositional value
-          firstFragment: #F4
-          type: int
-      returnType: void
-      variable: <testLibrary>::@topLevelVariable::foo
-  functions
-    isOriginDeclaration isStatic foo
-      reference: <testLibrary>::@function::foo
-      firstFragment: #F5
-      returnType: void
-  exportEntries
-    declared <testLibrary>::@getter::foo
-    declared <testLibrary>::@setter::foo
-  exportNamespace
-    foo: <testLibrary>::@getter::foo
-    foo=: <testLibrary>::@setter::foo
-''');
-  }
-
-  test_variable_augment_getter() async {
-    var library = await buildLibrary(r'''
-int get foo => 0;
-augment int foo = 0;
-''');
-
-    configuration.withExportScope = true;
-    checkElementText(library, r'''
-library
-  reference: <testLibrary>
-  fragments
-    #F0 <testLibraryFragment>
-      element: <testLibrary>
-      topLevelVariables
-        #F1 isOriginGetterSetter isStatic foo (nameOffset:<null>) (firstTokenOffset:<null>) (offset:8)
-          element: <testLibrary>::@topLevelVariable::foo
-          nextFragment: #F2
-        #F2 hasInitializer isAugmentation isOriginDeclaration isStatic foo (nameOffset:30) (firstTokenOffset:30) (offset:30)
-          element: <testLibrary>::@topLevelVariable::foo
-          previousFragment: #F1
-      getters
-        #F3 isCompleteDeclaration isOriginDeclaration isStatic foo (nameOffset:8) (firstTokenOffset:0) (offset:8)
-          element: <testLibrary>::@getter::foo
-  topLevelVariables
-    hasInitializer isOriginGetterSetter isStatic foo
-      reference: <testLibrary>::@topLevelVariable::foo
-      firstFragment: #F1
-      type: int
-      getter: <testLibrary>::@getter::foo
-  getters
-    isOriginDeclaration isStatic foo
-      reference: <testLibrary>::@getter::foo
-      firstFragment: #F3
-      returnType: int
-      variable: <testLibrary>::@topLevelVariable::foo
-  exportEntries
-    declared <testLibrary>::@getter::foo
-  exportNamespace
-    foo: <testLibrary>::@getter::foo
-''');
-  }
-
-  test_variable_augment_multiple_variables() async {
-    var library = await buildLibrary(r'''
-int foo = 0;
-augment int foo = 1;
-augment int foo = 2;
-''');
-
-    configuration.withExportScope = true;
-    checkElementText(library, r'''
-library
-  reference: <testLibrary>
-  fragments
-    #F0 <testLibraryFragment>
-      element: <testLibrary>
-      topLevelVariables
-        #F1 hasInitializer isOriginDeclaration isStatic foo (nameOffset:4) (firstTokenOffset:4) (offset:4)
-          element: <testLibrary>::@topLevelVariable::foo
-          nextFragment: #F2
-        #F2 hasInitializer isAugmentation isOriginDeclaration isStatic foo (nameOffset:25) (firstTokenOffset:25) (offset:25)
-          element: <testLibrary>::@topLevelVariable::foo
-          previousFragment: #F1
-          nextFragment: #F3
-        #F3 hasInitializer isAugmentation isOriginDeclaration isStatic foo (nameOffset:46) (firstTokenOffset:46) (offset:46)
-          element: <testLibrary>::@topLevelVariable::foo
-          previousFragment: #F2
-      getters
-        #F4 isCompleteDeclaration isOriginVariable isStatic foo (nameOffset:<null>) (firstTokenOffset:<null>) (offset:4)
-          element: <testLibrary>::@getter::foo
-      setters
-        #F5 isCompleteDeclaration isOriginVariable isStatic foo (nameOffset:<null>) (firstTokenOffset:<null>) (offset:4)
-          element: <testLibrary>::@setter::foo
-          formalParameters
-            #F6 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:4)
-              element: <testLibrary>::@setter::foo::@formalParameter::value
-  topLevelVariables
-    hasInitializer isOriginDeclaration isStatic foo
-      reference: <testLibrary>::@topLevelVariable::foo
-      firstFragment: #F1
-      type: int
-      getter: <testLibrary>::@getter::foo
-      setter: <testLibrary>::@setter::foo
-  getters
-    isOriginVariable isStatic foo
-      reference: <testLibrary>::@getter::foo
-      firstFragment: #F4
-      returnType: int
-      variable: <testLibrary>::@topLevelVariable::foo
-  setters
-    isOriginVariable isStatic foo
-      reference: <testLibrary>::@setter::foo
-      firstFragment: #F5
-      formalParameters
-        #E0 requiredPositional value
-          firstFragment: #F6
-          type: int
-      returnType: void
-      variable: <testLibrary>::@topLevelVariable::foo
-  exportEntries
-    declared <testLibrary>::@getter::foo
-    declared <testLibrary>::@setter::foo
-  exportNamespace
-    foo: <testLibrary>::@getter::foo
-    foo=: <testLibrary>::@setter::foo
-''');
-  }
-
-  test_variable_augment_multiple_variables_different_type() async {
-    var library = await buildLibrary(r'''
-int foo = 0;
-augment int foo = 1;
-augment double foo;
-''');
-
-    configuration.withExportScope = true;
-    checkElementText(library, r'''
-library
-  reference: <testLibrary>
-  fragments
-    #F0 <testLibraryFragment>
-      element: <testLibrary>
-      topLevelVariables
-        #F1 hasInitializer isOriginDeclaration isStatic foo (nameOffset:4) (firstTokenOffset:4) (offset:4)
-          element: <testLibrary>::@topLevelVariable::foo
-          nextFragment: #F2
-        #F2 hasInitializer isAugmentation isOriginDeclaration isStatic foo (nameOffset:25) (firstTokenOffset:25) (offset:25)
-          element: <testLibrary>::@topLevelVariable::foo
-          previousFragment: #F1
-          nextFragment: #F3
-        #F3 isAugmentation isOriginDeclaration isStatic foo (nameOffset:49) (firstTokenOffset:49) (offset:49)
-          element: <testLibrary>::@topLevelVariable::foo
-          previousFragment: #F2
-      getters
-        #F4 isCompleteDeclaration isOriginVariable isStatic foo (nameOffset:<null>) (firstTokenOffset:<null>) (offset:4)
-          element: <testLibrary>::@getter::foo
-      setters
-        #F5 isCompleteDeclaration isOriginVariable isStatic foo (nameOffset:<null>) (firstTokenOffset:<null>) (offset:4)
-          element: <testLibrary>::@setter::foo
-          formalParameters
-            #F6 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:4)
-              element: <testLibrary>::@setter::foo::@formalParameter::value
-  topLevelVariables
-    hasInitializer isOriginDeclaration isStatic foo
-      reference: <testLibrary>::@topLevelVariable::foo
-      firstFragment: #F1
-      type: int
-      getter: <testLibrary>::@getter::foo
-      setter: <testLibrary>::@setter::foo
-  getters
-    isOriginVariable isStatic foo
-      reference: <testLibrary>::@getter::foo
-      firstFragment: #F4
-      returnType: int
-      variable: <testLibrary>::@topLevelVariable::foo
-  setters
-    isOriginVariable isStatic foo
-      reference: <testLibrary>::@setter::foo
-      firstFragment: #F5
-      formalParameters
-        #E0 requiredPositional value
-          firstFragment: #F6
-          type: int
-      returnType: void
-      variable: <testLibrary>::@topLevelVariable::foo
-  exportEntries
-    declared <testLibrary>::@getter::foo
-    declared <testLibrary>::@setter::foo
-  exportNamespace
-    foo: <testLibrary>::@getter::foo
-    foo=: <testLibrary>::@setter::foo
-''');
-  }
-
-  test_variable_augment_nothing() async {
-    var library = await buildLibrary(r'''
-augment int foo = 0;
-''');
-
-    configuration.withExportScope = true;
-    checkElementText(library, r'''
-library
-  reference: <testLibrary>
-  fragments
-    #F0 <testLibraryFragment>
-      element: <testLibrary>
-      topLevelVariables
-        #F1 hasInitializer isAugmentation isOriginDeclaration isStatic foo (nameOffset:12) (firstTokenOffset:12) (offset:12)
-          element: <testLibrary>::@topLevelVariable::foo
-      getters
-        #F2 isCompleteDeclaration isOriginVariable isStatic foo (nameOffset:<null>) (firstTokenOffset:<null>) (offset:12)
-          element: <testLibrary>::@getter::foo
-      setters
-        #F3 isCompleteDeclaration isOriginVariable isStatic foo (nameOffset:<null>) (firstTokenOffset:<null>) (offset:12)
-          element: <testLibrary>::@setter::foo
-          formalParameters
-            #F4 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:12)
-              element: <testLibrary>::@setter::foo::@formalParameter::value
-  topLevelVariables
-    hasInitializer isOriginDeclaration isStatic foo
-      reference: <testLibrary>::@topLevelVariable::foo
-      firstFragment: #F1
-      type: int
-      getter: <testLibrary>::@getter::foo
-      setter: <testLibrary>::@setter::foo
-  getters
-    isOriginVariable isStatic foo
-      reference: <testLibrary>::@getter::foo
-      firstFragment: #F2
-      returnType: int
-      variable: <testLibrary>::@topLevelVariable::foo
-  setters
-    isOriginVariable isStatic foo
-      reference: <testLibrary>::@setter::foo
-      firstFragment: #F3
-      formalParameters
-        #E0 requiredPositional value
-          firstFragment: #F4
-          type: int
-      returnType: void
-      variable: <testLibrary>::@topLevelVariable::foo
-  exportEntries
-    declared <testLibrary>::@getter::foo
-    declared <testLibrary>::@setter::foo
-  exportNamespace
-    foo: <testLibrary>::@getter::foo
-    foo=: <testLibrary>::@setter::foo
-''');
-  }
-
-  test_variable_augment_setter() async {
-    var library = await buildLibrary(r'''
-set foo(int _) {}
-augment int foo = 0;
-''');
-
-    configuration.withExportScope = true;
-    checkElementText(library, r'''
-library
-  reference: <testLibrary>
-  fragments
-    #F0 <testLibraryFragment>
-      element: <testLibrary>
-      topLevelVariables
-        #F1 isOriginGetterSetter isStatic foo (nameOffset:<null>) (firstTokenOffset:<null>) (offset:4)
-          element: <testLibrary>::@topLevelVariable::foo
-          nextFragment: #F2
-        #F2 hasInitializer isAugmentation isOriginDeclaration isStatic foo (nameOffset:30) (firstTokenOffset:30) (offset:30)
-          element: <testLibrary>::@topLevelVariable::foo
-          previousFragment: #F1
-      setters
-        #F3 hasImplicitReturnType isCompleteDeclaration isOriginDeclaration isStatic foo (nameOffset:4) (firstTokenOffset:0) (offset:4)
-          element: <testLibrary>::@setter::foo
-          formalParameters
-            #F4 requiredPositional isOriginDeclaration _ (nameOffset:12) (firstTokenOffset:8) (offset:12)
-              element: <testLibrary>::@setter::foo::@formalParameter::_
-  topLevelVariables
-    hasInitializer isOriginGetterSetter isStatic foo
-      reference: <testLibrary>::@topLevelVariable::foo
-      firstFragment: #F1
-      type: int
-      setter: <testLibrary>::@setter::foo
-  setters
-    isOriginDeclaration isStatic foo
-      reference: <testLibrary>::@setter::foo
-      firstFragment: #F3
-      formalParameters
-        #E0 requiredPositional _
-          firstFragment: #F4
-          type: int
-      returnType: void
-      variable: <testLibrary>::@topLevelVariable::foo
-  exportEntries
-    declared <testLibrary>::@setter::foo
-  exportNamespace
-    foo=: <testLibrary>::@setter::foo
-''');
-  }
-
-  test_variable_augment_variable() async {
-    var library = await buildLibrary(r'''
-int foo = 0;
-augment int foo = 1;
-''');
-
-    configuration.withExportScope = true;
-    checkElementText(library, r'''
-library
-  reference: <testLibrary>
-  fragments
-    #F0 <testLibraryFragment>
-      element: <testLibrary>
-      topLevelVariables
-        #F1 hasInitializer isOriginDeclaration isStatic foo (nameOffset:4) (firstTokenOffset:4) (offset:4)
-          element: <testLibrary>::@topLevelVariable::foo
-          nextFragment: #F2
-        #F2 hasInitializer isAugmentation isOriginDeclaration isStatic foo (nameOffset:25) (firstTokenOffset:25) (offset:25)
-          element: <testLibrary>::@topLevelVariable::foo
-          previousFragment: #F1
-      getters
-        #F3 isCompleteDeclaration isOriginVariable isStatic foo (nameOffset:<null>) (firstTokenOffset:<null>) (offset:4)
-          element: <testLibrary>::@getter::foo
-      setters
-        #F4 isCompleteDeclaration isOriginVariable isStatic foo (nameOffset:<null>) (firstTokenOffset:<null>) (offset:4)
-          element: <testLibrary>::@setter::foo
-          formalParameters
-            #F5 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:4)
-              element: <testLibrary>::@setter::foo::@formalParameter::value
-  topLevelVariables
-    hasInitializer isOriginDeclaration isStatic foo
-      reference: <testLibrary>::@topLevelVariable::foo
-      firstFragment: #F1
-      type: int
-      getter: <testLibrary>::@getter::foo
-      setter: <testLibrary>::@setter::foo
-  getters
-    isOriginVariable isStatic foo
-      reference: <testLibrary>::@getter::foo
-      firstFragment: #F3
-      returnType: int
-      variable: <testLibrary>::@topLevelVariable::foo
-  setters
-    isOriginVariable isStatic foo
-      reference: <testLibrary>::@setter::foo
-      firstFragment: #F4
-      formalParameters
-        #E0 requiredPositional value
-          firstFragment: #F5
-          type: int
-      returnType: void
-      variable: <testLibrary>::@topLevelVariable::foo
-  exportEntries
-    declared <testLibrary>::@getter::foo
-    declared <testLibrary>::@setter::foo
-  exportNamespace
-    foo: <testLibrary>::@getter::foo
-    foo=: <testLibrary>::@setter::foo
-''');
-  }
-
-  test_variable_augment_variable_annotated() async {
-    var library = await buildLibrary(r'''
-final foo = 0;
-@deprecated
-augment final foo;
-''');
-
-    configuration.withExportScope = true;
-    checkElementText(library, r'''
-library
-  reference: <testLibrary>
-  fragments
-    #F0 <testLibraryFragment>
-      element: <testLibrary>
-      topLevelVariables
-        #F1 hasImplicitType hasInitializer isFinal isOriginDeclaration isStatic foo (nameOffset:6) (firstTokenOffset:6) (offset:6)
-          element: <testLibrary>::@topLevelVariable::foo
-          nextFragment: #F2
-        #F2 hasImplicitType isAugmentation isFinal isOriginDeclaration isStatic foo (nameOffset:41) (firstTokenOffset:41) (offset:41)
-          element: <testLibrary>::@topLevelVariable::foo
-          metadata
-            Annotation
-              atSign: @ @15
-              name: SimpleIdentifier
-                token: deprecated @16
-                element: dart:core::@getter::deprecated
-                staticType: null
-              element: dart:core::@getter::deprecated
-          previousFragment: #F1
-      getters
-        #F3 isCompleteDeclaration isOriginVariable isStatic foo (nameOffset:<null>) (firstTokenOffset:<null>) (offset:6)
-          element: <testLibrary>::@getter::foo
-  topLevelVariables
-    hasImplicitType hasInitializer isFinal isOriginDeclaration isStatic isTypeInferredFromInitializer foo
-      reference: <testLibrary>::@topLevelVariable::foo
-      firstFragment: #F1
-      metadata
-        Annotation
-          atSign: @ @15
-          name: SimpleIdentifier
-            token: deprecated @16
-            element: dart:core::@getter::deprecated
-            staticType: null
-          element: dart:core::@getter::deprecated
-      type: int
-      getter: <testLibrary>::@getter::foo
-  getters
-    isOriginVariable isStatic foo
-      reference: <testLibrary>::@getter::foo
-      firstFragment: #F3
-      returnType: int
-      variable: <testLibrary>::@topLevelVariable::foo
-  exportEntries
-    declared <testLibrary>::@getter::foo
-  exportNamespace
-    foo: <testLibrary>::@getter::foo
-''');
-  }
-
-  test_variable_augment_variable_augmented_const() async {
-    var library = await buildLibrary(r'''
-const int foo = 0;
-augment const int foo = 1;
-''');
-
-    checkElementText(library, r'''
-library
-  reference: <testLibrary>
-  fragments
-    #F0 <testLibraryFragment>
-      element: <testLibrary>
-      topLevelVariables
-        #F1 hasInitializer isConst isOriginDeclaration isStatic foo (nameOffset:10) (firstTokenOffset:10) (offset:10)
-          element: <testLibrary>::@topLevelVariable::foo
-          initializer: expression_0
-            IntegerLiteral
-              literal: 0 @16
-              staticType: null
-          nextFragment: #F2
-        #F2 hasInitializer isAugmentation isConst isOriginDeclaration isStatic foo (nameOffset:37) (firstTokenOffset:37) (offset:37)
-          element: <testLibrary>::@topLevelVariable::foo
-          initializer: expression_1
-            IntegerLiteral
-              literal: 1 @43
-              staticType: int
-          previousFragment: #F1
-      getters
-        #F3 isCompleteDeclaration isOriginVariable isStatic foo (nameOffset:<null>) (firstTokenOffset:<null>) (offset:10)
-          element: <testLibrary>::@getter::foo
-  topLevelVariables
-    hasInitializer isConst isOriginDeclaration isStatic foo
-      reference: <testLibrary>::@topLevelVariable::foo
-      firstFragment: #F1
-      type: int
-      constantInitializer
-        fragment: #F2
-        expression: expression_1
-      getter: <testLibrary>::@getter::foo
-  getters
-    isOriginVariable isStatic foo
-      reference: <testLibrary>::@getter::foo
-      firstFragment: #F3
-      returnType: int
-      variable: <testLibrary>::@topLevelVariable::foo
-''');
-  }
-
-  test_variable_augment_variable_differentType() async {
-    var library = await buildLibrary(r'''
-int foo = 0;
-augment double foo;
-''');
-
-    configuration.withExportScope = true;
-    checkElementText(library, r'''
-library
-  reference: <testLibrary>
-  fragments
-    #F0 <testLibraryFragment>
-      element: <testLibrary>
-      topLevelVariables
-        #F1 hasInitializer isOriginDeclaration isStatic foo (nameOffset:4) (firstTokenOffset:4) (offset:4)
-          element: <testLibrary>::@topLevelVariable::foo
-          nextFragment: #F2
-        #F2 isAugmentation isOriginDeclaration isStatic foo (nameOffset:28) (firstTokenOffset:28) (offset:28)
-          element: <testLibrary>::@topLevelVariable::foo
-          previousFragment: #F1
-      getters
-        #F3 isCompleteDeclaration isOriginVariable isStatic foo (nameOffset:<null>) (firstTokenOffset:<null>) (offset:4)
-          element: <testLibrary>::@getter::foo
-      setters
-        #F4 isCompleteDeclaration isOriginVariable isStatic foo (nameOffset:<null>) (firstTokenOffset:<null>) (offset:4)
-          element: <testLibrary>::@setter::foo
-          formalParameters
-            #F5 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:4)
-              element: <testLibrary>::@setter::foo::@formalParameter::value
-  topLevelVariables
-    hasInitializer isOriginDeclaration isStatic foo
-      reference: <testLibrary>::@topLevelVariable::foo
-      firstFragment: #F1
-      type: int
-      getter: <testLibrary>::@getter::foo
-      setter: <testLibrary>::@setter::foo
-  getters
-    isOriginVariable isStatic foo
-      reference: <testLibrary>::@getter::foo
-      firstFragment: #F3
-      returnType: int
-      variable: <testLibrary>::@topLevelVariable::foo
-  setters
-    isOriginVariable isStatic foo
-      reference: <testLibrary>::@setter::foo
-      firstFragment: #F4
-      formalParameters
-        #E0 requiredPositional value
-          firstFragment: #F5
-          type: int
-      returnType: void
-      variable: <testLibrary>::@topLevelVariable::foo
-  exportEntries
-    declared <testLibrary>::@getter::foo
-    declared <testLibrary>::@setter::foo
-  exportNamespace
-    foo: <testLibrary>::@getter::foo
-    foo=: <testLibrary>::@setter::foo
-''');
-  }
-
-  test_variable_augment_variable_final() async {
-    var library = await buildLibrary(r'''
-final int foo = 0;
-augment int foo = 1;
-''');
-
-    configuration.withExportScope = true;
-    checkElementText(library, r'''
-library
-  reference: <testLibrary>
-  fragments
-    #F0 <testLibraryFragment>
-      element: <testLibrary>
-      topLevelVariables
-        #F1 hasInitializer isFinal isOriginDeclaration isStatic foo (nameOffset:10) (firstTokenOffset:10) (offset:10)
-          element: <testLibrary>::@topLevelVariable::foo
-          nextFragment: #F2
-        #F2 hasInitializer isAugmentation isOriginDeclaration isStatic foo (nameOffset:31) (firstTokenOffset:31) (offset:31)
-          element: <testLibrary>::@topLevelVariable::foo
-          previousFragment: #F1
-      getters
-        #F3 isCompleteDeclaration isOriginVariable isStatic foo (nameOffset:<null>) (firstTokenOffset:<null>) (offset:10)
-          element: <testLibrary>::@getter::foo
-  topLevelVariables
-    hasInitializer isFinal isOriginDeclaration isStatic foo
-      reference: <testLibrary>::@topLevelVariable::foo
-      firstFragment: #F1
-      type: int
-      getter: <testLibrary>::@getter::foo
-  getters
-    isOriginVariable isStatic foo
-      reference: <testLibrary>::@getter::foo
-      firstFragment: #F3
-      returnType: int
-      variable: <testLibrary>::@topLevelVariable::foo
-  exportEntries
-    declared <testLibrary>::@getter::foo
-  exportNamespace
-    foo: <testLibrary>::@getter::foo
-''');
-  }
-
-  test_variable_augment_variable_initializer() async {
-    var library = await buildLibrary(r'''
-int foo;
-augment int foo = 0;
-''');
-
-    configuration.withExportScope = true;
-    checkElementText(library, r'''
-library
-  reference: <testLibrary>
-  fragments
-    #F0 <testLibraryFragment>
-      element: <testLibrary>
-      topLevelVariables
-        #F1 isOriginDeclaration isStatic foo (nameOffset:4) (firstTokenOffset:4) (offset:4)
-          element: <testLibrary>::@topLevelVariable::foo
-          nextFragment: #F2
-        #F2 hasInitializer isAugmentation isOriginDeclaration isStatic foo (nameOffset:21) (firstTokenOffset:21) (offset:21)
-          element: <testLibrary>::@topLevelVariable::foo
-          previousFragment: #F1
-      getters
-        #F3 isCompleteDeclaration isOriginVariable isStatic foo (nameOffset:<null>) (firstTokenOffset:<null>) (offset:4)
-          element: <testLibrary>::@getter::foo
-      setters
-        #F4 isCompleteDeclaration isOriginVariable isStatic foo (nameOffset:<null>) (firstTokenOffset:<null>) (offset:4)
-          element: <testLibrary>::@setter::foo
-          formalParameters
-            #F5 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:4)
-              element: <testLibrary>::@setter::foo::@formalParameter::value
-  topLevelVariables
-    hasInitializer isOriginDeclaration isStatic foo
-      reference: <testLibrary>::@topLevelVariable::foo
-      firstFragment: #F1
-      type: int
-      getter: <testLibrary>::@getter::foo
-      setter: <testLibrary>::@setter::foo
-  getters
-    isOriginVariable isStatic foo
-      reference: <testLibrary>::@getter::foo
-      firstFragment: #F3
-      returnType: int
-      variable: <testLibrary>::@topLevelVariable::foo
-  setters
-    isOriginVariable isStatic foo
-      reference: <testLibrary>::@setter::foo
-      firstFragment: #F4
-      formalParameters
-        #E0 requiredPositional value
-          firstFragment: #F5
-          type: int
-      returnType: void
-      variable: <testLibrary>::@topLevelVariable::foo
-  exportEntries
-    declared <testLibrary>::@getter::foo
-    declared <testLibrary>::@setter::foo
-  exportNamespace
-    foo: <testLibrary>::@getter::foo
-    foo=: <testLibrary>::@setter::foo
-''');
-  }
-}
-
-@reflectiveTest
-class TopLevelVariableElementTest_augmentation_fromBytes
-    extends TopLevelVariableElementTest_augmentation {
-  @override
-  bool get keepLinkingLibraries => false;
-}
-
-@reflectiveTest
-class TopLevelVariableElementTest_augmentation_keepLinking
-    extends TopLevelVariableElementTest_augmentation {
-  @override
-  bool get keepLinkingLibraries => true;
-}
-
 @reflectiveTest
 class TopLevelVariableElementTest_fromBytes
     extends TopLevelVariableElementTest {
diff --git a/pkg/analyzer/test/src/summary/elements/type_alias_test.dart b/pkg/analyzer/test/src/summary/elements/type_alias_test.dart
index a4838f9..6ad807d 100644
--- a/pkg/analyzer/test/src/summary/elements/type_alias_test.dart
+++ b/pkg/analyzer/test/src/summary/elements/type_alias_test.dart
@@ -17,7 +17,7 @@
 
 abstract class TypeAliasElementTest extends ElementsBaseTest {
   test_codeRange_functionTypeAlias() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 typedef Raw();
 
 /// Comment 1.
@@ -187,7 +187,7 @@
   }
 
   test_codeRange_genericTypeAlias() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 typedef Raw = Function();
 
 /// Comment 1.
@@ -792,7 +792,7 @@
   }
 
   test_genericTypeAlias_recursive() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 typedef F<X extends F> = Function(F);
 ''');
     checkElementText(library, r'''
@@ -820,7 +820,7 @@
   }
 
   test_new_typedef_function_notSimplyBounded_functionType_returnType() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 typedef F = G Function();
 typedef G = F Function();
 ''');
@@ -848,7 +848,7 @@
   }
 
   test_new_typedef_function_notSimplyBounded_functionType_returnType_viaInterfaceType() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 typedef F = List<F> Function();
 ''');
     checkElementText(library, r'''
@@ -869,7 +869,7 @@
   }
 
   test_new_typedef_function_notSimplyBounded_self() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 typedef F<T extends F> = void Function();
 ''');
     checkElementText(library, r'''
@@ -897,7 +897,7 @@
   }
 
   test_new_typedef_function_notSimplyBounded_simple_no_bounds() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 typedef F<T> = void Function();
 ''');
     checkElementText(library, r'''
@@ -924,7 +924,7 @@
   }
 
   test_new_typedef_function_notSimplyBounded_simple_non_generic() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 typedef F = void Function();
 ''');
     checkElementText(library, r'''
@@ -945,7 +945,7 @@
   }
 
   test_new_typedef_nonFunction_notSimplyBounded_self() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 typedef F<T extends F> = List<int>;
 ''');
     checkElementText(library, r'''
@@ -973,7 +973,7 @@
   }
 
   test_new_typedef_nonFunction_notSimplyBounded_viaInterfaceType() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 typedef F = List<F>;
 ''');
     checkElementText(library, r'''
@@ -1258,6 +1258,7 @@
   test_typeAlias_typeParameters_variance_function_invalid() async {
     var library = await buildLibrary(r'''
 class A {}
+
 typedef F<T> = void Function(A<int>);
 ''');
     checkElementText(library, r'''
@@ -1274,10 +1275,10 @@
               element: <testLibrary>::@class::A::@constructor::new
               typeName: A
       typeAliases
-        #F3 F (nameOffset:19) (firstTokenOffset:11) (offset:19)
+        #F3 F (nameOffset:20) (firstTokenOffset:12) (offset:20)
           element: <testLibrary>::@typeAlias::F
           typeParameters
-            #F4 T (nameOffset:21) (firstTokenOffset:21) (offset:21)
+            #F4 T (nameOffset:22) (firstTokenOffset:22) (offset:22)
               element: #E0 T
   classes
     isSimplyBounded class A
@@ -1709,9 +1710,9 @@
   }
 
   test_typedef_function_generic() async {
-    var library = await buildLibrary(
-      'typedef F<T> = int Function<S>(List<S> list, num Function<A>(A), T);',
-    );
+    var library = await buildLibrary(r'''
+typedef F<T> = int Function<S>(List<S> list, num Function<A>(A), T);
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -1738,6 +1739,7 @@
   test_typedef_function_generic_asFieldType() async {
     var library = await buildLibrary(r'''
 typedef Foo<S> = S Function<T>(T x);
+
 class A {
   Foo<int> f;
 }
@@ -1749,23 +1751,23 @@
     #F0 <testLibraryFragment>
       element: <testLibrary>
       classes
-        #F1 class A (nameOffset:43) (firstTokenOffset:37) (offset:43)
+        #F1 class A (nameOffset:44) (firstTokenOffset:38) (offset:44)
           element: <testLibrary>::@class::A
           fields
-            #F2 isOriginDeclaration f (nameOffset:58) (firstTokenOffset:58) (offset:58)
+            #F2 isOriginDeclaration f (nameOffset:59) (firstTokenOffset:59) (offset:59)
               element: <testLibrary>::@class::A::@field::f
           constructors
-            #F3 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:43)
+            #F3 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:44)
               element: <testLibrary>::@class::A::@constructor::new
               typeName: A
           getters
-            #F4 isCompleteDeclaration isOriginVariable f (nameOffset:<null>) (firstTokenOffset:<null>) (offset:58)
+            #F4 isCompleteDeclaration isOriginVariable f (nameOffset:<null>) (firstTokenOffset:<null>) (offset:59)
               element: <testLibrary>::@class::A::@getter::f
           setters
-            #F5 isCompleteDeclaration isOriginVariable f (nameOffset:<null>) (firstTokenOffset:<null>) (offset:58)
+            #F5 isCompleteDeclaration isOriginVariable f (nameOffset:<null>) (firstTokenOffset:<null>) (offset:59)
               element: <testLibrary>::@class::A::@setter::f
               formalParameters
-                #F6 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:58)
+                #F6 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:59)
                   element: <testLibrary>::@class::A::@setter::f::@formalParameter::value
       typeAliases
         #F7 Foo (nameOffset:8) (firstTokenOffset:0) (offset:8)
@@ -1827,8 +1829,9 @@
   test_typedef_function_notSimplyBounded_dependency_via_param_type_name_included() async {
     // F is considered "not simply bounded" because it expands to a type that
     // refers to C, which is not simply bounded.
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 typedef F = void Function(C c);
+
 class C<T extends C<T>> {}
 ''');
     checkElementText(library, r'''
@@ -1838,13 +1841,13 @@
     #F0 <testLibraryFragment>
       element: <testLibrary>
       classes
-        #F1 class C (nameOffset:38) (firstTokenOffset:32) (offset:38)
+        #F1 class C (nameOffset:39) (firstTokenOffset:33) (offset:39)
           element: <testLibrary>::@class::C
           typeParameters
-            #F2 T (nameOffset:40) (firstTokenOffset:40) (offset:40)
+            #F2 T (nameOffset:41) (firstTokenOffset:41) (offset:41)
               element: #E0 T
           constructors
-            #F3 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:38)
+            #F3 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:39)
               element: <testLibrary>::@class::C::@constructor::new
               typeName: C
       typeAliases
@@ -1873,8 +1876,9 @@
   test_typedef_function_notSimplyBounded_dependency_via_param_type_name_omitted() async {
     // F is considered "not simply bounded" because it expands to a type that
     // refers to C, which is not simply bounded.
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 typedef F = void Function(C);
+
 class C<T extends C<T>> {}
 ''');
     checkElementText(library, r'''
@@ -1884,13 +1888,13 @@
     #F0 <testLibraryFragment>
       element: <testLibrary>
       classes
-        #F1 class C (nameOffset:36) (firstTokenOffset:30) (offset:36)
+        #F1 class C (nameOffset:37) (firstTokenOffset:31) (offset:37)
           element: <testLibrary>::@class::C
           typeParameters
-            #F2 T (nameOffset:38) (firstTokenOffset:38) (offset:38)
+            #F2 T (nameOffset:39) (firstTokenOffset:39) (offset:39)
               element: #E0 T
           constructors
-            #F3 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:36)
+            #F3 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:37)
               element: <testLibrary>::@class::C::@constructor::new
               typeName: C
       typeAliases
@@ -1919,8 +1923,9 @@
   test_typedef_function_notSimplyBounded_dependency_via_return_type() async {
     // F is considered "not simply bounded" because it expands to a type that
     // refers to C, which is not simply bounded.
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 typedef F = C Function();
+
 class C<T extends C<T>> {}
 ''');
     checkElementText(library, r'''
@@ -1930,13 +1935,13 @@
     #F0 <testLibraryFragment>
       element: <testLibrary>
       classes
-        #F1 class C (nameOffset:32) (firstTokenOffset:26) (offset:32)
+        #F1 class C (nameOffset:33) (firstTokenOffset:27) (offset:33)
           element: <testLibrary>::@class::C
           typeParameters
-            #F2 T (nameOffset:34) (firstTokenOffset:34) (offset:34)
+            #F2 T (nameOffset:35) (firstTokenOffset:35) (offset:35)
               element: #E0 T
           constructors
-            #F3 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:32)
+            #F3 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:33)
               element: <testLibrary>::@class::C::@constructor::new
               typeName: C
       typeAliases
@@ -1963,9 +1968,9 @@
   }
 
   test_typedef_function_typeParameters_f_bound_simple() async {
-    var library = await buildLibrary(
-      'typedef F<T extends U, U> = U Function(T t);',
-    );
+    var library = await buildLibrary(r'''
+typedef F<T extends U, U> = U Function(T t);
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -1995,12 +2000,13 @@
   }
 
   test_typedef_legacy_documented() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 // Extra comment so doc comment offset != 0
 /**
  * Docs
  */
-typedef F();''');
+typedef F();
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -2023,8 +2029,9 @@
   test_typedef_legacy_notSimplyBounded_dependency_via_param_type() async {
     // F is considered "not simply bounded" because it expands to a type that
     // refers to C, which is not simply bounded.
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 typedef void F(C c);
+
 class C<T extends C<T>> {}
 ''');
     checkElementText(library, r'''
@@ -2034,13 +2041,13 @@
     #F0 <testLibraryFragment>
       element: <testLibrary>
       classes
-        #F1 class C (nameOffset:27) (firstTokenOffset:21) (offset:27)
+        #F1 class C (nameOffset:28) (firstTokenOffset:22) (offset:28)
           element: <testLibrary>::@class::C
           typeParameters
-            #F2 T (nameOffset:29) (firstTokenOffset:29) (offset:29)
+            #F2 T (nameOffset:30) (firstTokenOffset:30) (offset:30)
               element: #E0 T
           constructors
-            #F3 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:27)
+            #F3 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:28)
               element: <testLibrary>::@class::C::@constructor::new
               typeName: C
       typeAliases
@@ -2069,8 +2076,9 @@
   test_typedef_legacy_notSimplyBounded_dependency_via_return_type() async {
     // F is considered "not simply bounded" because it expands to a type that
     // refers to C, which is not simply bounded.
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 typedef C F();
+
 class C<T extends C<T>> {}
 ''');
     checkElementText(library, r'''
@@ -2080,13 +2088,13 @@
     #F0 <testLibraryFragment>
       element: <testLibrary>
       classes
-        #F1 class C (nameOffset:21) (firstTokenOffset:15) (offset:21)
+        #F1 class C (nameOffset:22) (firstTokenOffset:16) (offset:22)
           element: <testLibrary>::@class::C
           typeParameters
-            #F2 T (nameOffset:23) (firstTokenOffset:23) (offset:23)
+            #F2 T (nameOffset:24) (firstTokenOffset:24) (offset:24)
               element: #E0 T
           constructors
-            #F3 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:21)
+            #F3 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:22)
               element: <testLibrary>::@class::C::@constructor::new
               typeName: C
       typeAliases
@@ -2113,7 +2121,7 @@
   }
 
   test_typedef_legacy_notSimplyBounded_self() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 typedef void F<T extends F>();
 ''');
     checkElementText(library, r'''
@@ -2141,7 +2149,7 @@
   }
 
   test_typedef_legacy_notSimplyBounded_simple_because_non_generic() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 typedef void F();
 ''');
     checkElementText(library, r'''
@@ -2162,7 +2170,9 @@
   }
 
   test_typedef_legacy_notSimplyBounded_simple_no_bounds() async {
-    var library = await buildLibrary('typedef void F<T>();');
+    var library = await buildLibrary(r'''
+typedef void F<T>();
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -2208,7 +2218,9 @@
   }
 
   test_typedef_legacy_parameter_parameters() async {
-    var library = await buildLibrary('typedef F(g(x, y));');
+    var library = await buildLibrary(r'''
+typedef F(g(x, y));
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -2227,7 +2239,9 @@
   }
 
   test_typedef_legacy_parameter_parameters_in_generic_class() async {
-    var library = await buildLibrary('typedef F<A, B>(A g(B x));');
+    var library = await buildLibrary(r'''
+typedef F<A, B>(A g(B x));
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -2256,7 +2270,9 @@
   }
 
   test_typedef_legacy_parameter_return_type() async {
-    var library = await buildLibrary('typedef F(int g());');
+    var library = await buildLibrary(r'''
+typedef F(int g());
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -2275,7 +2291,9 @@
   }
 
   test_typedef_legacy_parameter_type() async {
-    var library = await buildLibrary('typedef F(int i);');
+    var library = await buildLibrary(r'''
+typedef F(int i);
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -2294,7 +2312,9 @@
   }
 
   test_typedef_legacy_parameter_type_generic() async {
-    var library = await buildLibrary('typedef F<T>(T t);');
+    var library = await buildLibrary(r'''
+typedef F<T>(T t);
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -2319,7 +2339,9 @@
   }
 
   test_typedef_legacy_parameters() async {
-    var library = await buildLibrary('typedef F(x, y);');
+    var library = await buildLibrary(r'''
+typedef F(x, y);
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -2338,7 +2360,9 @@
   }
 
   test_typedef_legacy_parameters_named() async {
-    var library = await buildLibrary('typedef F({y, z, x});');
+    var library = await buildLibrary(r'''
+typedef F({y, z, x});
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -2357,7 +2381,9 @@
   }
 
   test_typedef_legacy_return_type() async {
-    var library = await buildLibrary('typedef int F();');
+    var library = await buildLibrary(r'''
+typedef int F();
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -2376,7 +2402,9 @@
   }
 
   test_typedef_legacy_return_type_generic() async {
-    var library = await buildLibrary('typedef T F<T>();');
+    var library = await buildLibrary(r'''
+typedef T F<T>();
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -2401,7 +2429,9 @@
   }
 
   test_typedef_legacy_return_type_implicit() async {
-    var library = await buildLibrary('typedef F();');
+    var library = await buildLibrary(r'''
+typedef F();
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -2420,7 +2450,9 @@
   }
 
   test_typedef_legacy_return_type_void() async {
-    var library = await buildLibrary('typedef void F();');
+    var library = await buildLibrary(r'''
+typedef void F();
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -2439,7 +2471,9 @@
   }
 
   test_typedef_legacy_typeParameters() async {
-    var library = await buildLibrary('typedef U F<T, U>(T t);');
+    var library = await buildLibrary(r'''
+typedef U F<T, U>(T t);
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -2468,9 +2502,11 @@
   }
 
   test_typedef_legacy_typeParameters_bound() async {
-    var library = await buildLibrary(
-      'typedef U F<T extends Object, U extends D>(T t); class D {}',
-    );
+    var library = await buildLibrary(r'''
+typedef U F<T extends Object, U extends D>(T t);
+
+class D {}
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -2478,10 +2514,10 @@
     #F0 <testLibraryFragment>
       element: <testLibrary>
       classes
-        #F1 class D (nameOffset:55) (firstTokenOffset:49) (offset:55)
+        #F1 class D (nameOffset:56) (firstTokenOffset:50) (offset:56)
           element: <testLibrary>::@class::D
           constructors
-            #F2 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:55)
+            #F2 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:56)
               element: <testLibrary>::@class::D::@constructor::new
               typeName: D
       typeAliases
@@ -2516,7 +2552,9 @@
   }
 
   test_typedef_legacy_typeParameters_bound_recursive() async {
-    var library = await buildLibrary('typedef void F<T extends F>();');
+    var library = await buildLibrary(r'''
+typedef void F<T extends F>();
+''');
     // Typedefs cannot reference themselves.
     checkElementText(library, r'''
 library
@@ -2543,7 +2581,9 @@
   }
 
   test_typedef_legacy_typeParameters_bound_recursive2() async {
-    var library = await buildLibrary('typedef void F<T extends List<F>>();');
+    var library = await buildLibrary(r'''
+typedef void F<T extends List<F>>();
+''');
     // Typedefs cannot reference themselves.
     checkElementText(library, r'''
 library
@@ -2570,7 +2610,9 @@
   }
 
   test_typedef_legacy_typeParameters_f_bound_complex() async {
-    var library = await buildLibrary('typedef U F<T extends List<U>, U>(T t);');
+    var library = await buildLibrary(r'''
+typedef U F<T extends List<U>, U>(T t);
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -2600,7 +2642,9 @@
   }
 
   test_typedef_legacy_typeParameters_f_bound_simple() async {
-    var library = await buildLibrary('typedef U F<T extends U, U>(T t);');
+    var library = await buildLibrary(r'''
+typedef U F<T extends U, U>(T t);
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -3027,7 +3071,9 @@
   test_typedef_nonFunction_asInterfaceType_interfaceType_none() async {
     var library = await buildLibrary(r'''
 typedef X<T> = A<int, T>;
+
 class A<T, U> {}
+
 class B implements X<String> {}
 ''');
     checkElementText(library, r'''
@@ -3037,21 +3083,21 @@
     #F0 <testLibraryFragment>
       element: <testLibrary>
       classes
-        #F1 class A (nameOffset:32) (firstTokenOffset:26) (offset:32)
+        #F1 class A (nameOffset:33) (firstTokenOffset:27) (offset:33)
           element: <testLibrary>::@class::A
           typeParameters
-            #F2 T (nameOffset:34) (firstTokenOffset:34) (offset:34)
+            #F2 T (nameOffset:35) (firstTokenOffset:35) (offset:35)
               element: #E0 T
-            #F3 U (nameOffset:37) (firstTokenOffset:37) (offset:37)
+            #F3 U (nameOffset:38) (firstTokenOffset:38) (offset:38)
               element: #E1 U
           constructors
-            #F4 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:32)
+            #F4 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:33)
               element: <testLibrary>::@class::A::@constructor::new
               typeName: A
-        #F5 class B (nameOffset:49) (firstTokenOffset:43) (offset:49)
+        #F5 class B (nameOffset:51) (firstTokenOffset:45) (offset:51)
           element: <testLibrary>::@class::B
           constructors
-            #F6 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:49)
+            #F6 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:51)
               element: <testLibrary>::@class::B::@constructor::new
               typeName: B
       typeAliases
@@ -3099,9 +3145,13 @@
   test_typedef_nonFunction_asInterfaceType_interfaceType_question() async {
     var library = await buildLibrary(r'''
 typedef X<T> = A<T>?;
+
 class A<T> {}
+
 class B {}
+
 class C {}
+
 class D implements B, X<int>, C {}
 ''');
     checkElementText(library, r'''
@@ -3111,31 +3161,31 @@
     #F0 <testLibraryFragment>
       element: <testLibrary>
       classes
-        #F1 class A (nameOffset:28) (firstTokenOffset:22) (offset:28)
+        #F1 class A (nameOffset:29) (firstTokenOffset:23) (offset:29)
           element: <testLibrary>::@class::A
           typeParameters
-            #F2 T (nameOffset:30) (firstTokenOffset:30) (offset:30)
+            #F2 T (nameOffset:31) (firstTokenOffset:31) (offset:31)
               element: #E0 T
           constructors
-            #F3 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:28)
+            #F3 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:29)
               element: <testLibrary>::@class::A::@constructor::new
               typeName: A
-        #F4 class B (nameOffset:42) (firstTokenOffset:36) (offset:42)
+        #F4 class B (nameOffset:44) (firstTokenOffset:38) (offset:44)
           element: <testLibrary>::@class::B
           constructors
-            #F5 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:42)
+            #F5 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:44)
               element: <testLibrary>::@class::B::@constructor::new
               typeName: B
-        #F6 class C (nameOffset:53) (firstTokenOffset:47) (offset:53)
+        #F6 class C (nameOffset:56) (firstTokenOffset:50) (offset:56)
           element: <testLibrary>::@class::C
           constructors
-            #F7 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:53)
+            #F7 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:56)
               element: <testLibrary>::@class::C::@constructor::new
               typeName: C
-        #F8 class D (nameOffset:64) (firstTokenOffset:58) (offset:64)
+        #F8 class D (nameOffset:68) (firstTokenOffset:62) (offset:68)
           element: <testLibrary>::@class::D
           constructors
-            #F9 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:64)
+            #F9 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:68)
               element: <testLibrary>::@class::D::@constructor::new
               typeName: D
       typeAliases
@@ -3193,9 +3243,13 @@
   test_typedef_nonFunction_asInterfaceType_interfaceType_question2() async {
     var library = await buildLibrary(r'''
 typedef X<T> = A<T?>;
+
 class A<T> {}
+
 class B {}
+
 class C {}
+
 class D implements B, X<int>, C {}
 ''');
     checkElementText(library, r'''
@@ -3205,31 +3259,31 @@
     #F0 <testLibraryFragment>
       element: <testLibrary>
       classes
-        #F1 class A (nameOffset:28) (firstTokenOffset:22) (offset:28)
+        #F1 class A (nameOffset:29) (firstTokenOffset:23) (offset:29)
           element: <testLibrary>::@class::A
           typeParameters
-            #F2 T (nameOffset:30) (firstTokenOffset:30) (offset:30)
+            #F2 T (nameOffset:31) (firstTokenOffset:31) (offset:31)
               element: #E0 T
           constructors
-            #F3 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:28)
+            #F3 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:29)
               element: <testLibrary>::@class::A::@constructor::new
               typeName: A
-        #F4 class B (nameOffset:42) (firstTokenOffset:36) (offset:42)
+        #F4 class B (nameOffset:44) (firstTokenOffset:38) (offset:44)
           element: <testLibrary>::@class::B
           constructors
-            #F5 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:42)
+            #F5 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:44)
               element: <testLibrary>::@class::B::@constructor::new
               typeName: B
-        #F6 class C (nameOffset:53) (firstTokenOffset:47) (offset:53)
+        #F6 class C (nameOffset:56) (firstTokenOffset:50) (offset:56)
           element: <testLibrary>::@class::C
           constructors
-            #F7 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:53)
+            #F7 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:56)
               element: <testLibrary>::@class::C::@constructor::new
               typeName: C
-        #F8 class D (nameOffset:64) (firstTokenOffset:58) (offset:64)
+        #F8 class D (nameOffset:68) (firstTokenOffset:62) (offset:68)
           element: <testLibrary>::@class::D
           constructors
-            #F9 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:64)
+            #F9 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:68)
               element: <testLibrary>::@class::D::@constructor::new
               typeName: D
       typeAliases
@@ -3291,6 +3345,45 @@
   test_typedef_nonFunction_asInterfaceType_Never_none() async {
     var library = await buildLibrary(r'''
 typedef X = Never;
+
+class A implements X {}
+''');
+    checkElementText(library, r'''
+library
+  reference: <testLibrary>
+  fragments
+    #F0 <testLibraryFragment>
+      element: <testLibrary>
+      classes
+        #F1 class A (nameOffset:26) (firstTokenOffset:20) (offset:26)
+          element: <testLibrary>::@class::A
+          constructors
+            #F2 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:26)
+              element: <testLibrary>::@class::A::@constructor::new
+              typeName: A
+      typeAliases
+        #F3 X (nameOffset:8) (firstTokenOffset:0) (offset:8)
+          element: <testLibrary>::@typeAlias::X
+  classes
+    isSimplyBounded class A
+      reference: <testLibrary>::@class::A
+      firstFragment: #F1
+      constructors
+        isOriginImplicitDefault new
+          reference: <testLibrary>::@class::A::@constructor::new
+          firstFragment: #F2
+  typeAliases
+    isSimplyBounded X
+      reference: <testLibrary>::@typeAlias::X
+      firstFragment: #F3
+      aliasedType: Never
+''');
+  }
+
+  test_typedef_nonFunction_asInterfaceType_Null_none() async {
+    var library = await buildLibrary(r'''
+typedef X = Null;
+
 class A implements X {}
 ''');
     checkElementText(library, r'''
@@ -3321,43 +3414,6 @@
     isSimplyBounded X
       reference: <testLibrary>::@typeAlias::X
       firstFragment: #F3
-      aliasedType: Never
-''');
-  }
-
-  test_typedef_nonFunction_asInterfaceType_Null_none() async {
-    var library = await buildLibrary(r'''
-typedef X = Null;
-class A implements X {}
-''');
-    checkElementText(library, r'''
-library
-  reference: <testLibrary>
-  fragments
-    #F0 <testLibraryFragment>
-      element: <testLibrary>
-      classes
-        #F1 class A (nameOffset:24) (firstTokenOffset:18) (offset:24)
-          element: <testLibrary>::@class::A
-          constructors
-            #F2 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:24)
-              element: <testLibrary>::@class::A::@constructor::new
-              typeName: A
-      typeAliases
-        #F3 X (nameOffset:8) (firstTokenOffset:0) (offset:8)
-          element: <testLibrary>::@typeAlias::X
-  classes
-    isSimplyBounded class A
-      reference: <testLibrary>::@class::A
-      firstFragment: #F1
-      constructors
-        isOriginImplicitDefault new
-          reference: <testLibrary>::@class::A::@constructor::new
-          firstFragment: #F2
-  typeAliases
-    isSimplyBounded X
-      reference: <testLibrary>::@typeAlias::X
-      firstFragment: #F3
       aliasedType: Null
 ''');
   }
@@ -3365,8 +3421,11 @@
   test_typedef_nonFunction_asInterfaceType_typeParameterType() async {
     var library = await buildLibrary(r'''
 typedef X<T> = T;
+
 class A {}
+
 class B {}
+
 class C<U> implements A, X<U>, B {}
 ''');
     checkElementText(library, r'''
@@ -3376,25 +3435,25 @@
     #F0 <testLibraryFragment>
       element: <testLibrary>
       classes
-        #F1 class A (nameOffset:24) (firstTokenOffset:18) (offset:24)
+        #F1 class A (nameOffset:25) (firstTokenOffset:19) (offset:25)
           element: <testLibrary>::@class::A
           constructors
-            #F2 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:24)
+            #F2 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:25)
               element: <testLibrary>::@class::A::@constructor::new
               typeName: A
-        #F3 class B (nameOffset:35) (firstTokenOffset:29) (offset:35)
+        #F3 class B (nameOffset:37) (firstTokenOffset:31) (offset:37)
           element: <testLibrary>::@class::B
           constructors
-            #F4 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:35)
+            #F4 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:37)
               element: <testLibrary>::@class::B::@constructor::new
               typeName: B
-        #F5 class C (nameOffset:46) (firstTokenOffset:40) (offset:46)
+        #F5 class C (nameOffset:49) (firstTokenOffset:43) (offset:49)
           element: <testLibrary>::@class::C
           typeParameters
-            #F6 U (nameOffset:48) (firstTokenOffset:48) (offset:48)
+            #F6 U (nameOffset:51) (firstTokenOffset:51) (offset:51)
               element: #E0 U
           constructors
-            #F7 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:46)
+            #F7 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:49)
               element: <testLibrary>::@class::C::@constructor::new
               typeName: C
       typeAliases
@@ -3445,8 +3504,11 @@
   test_typedef_nonFunction_asInterfaceType_void() async {
     var library = await buildLibrary(r'''
 typedef X = void;
+
 class A {}
+
 class B {}
+
 class C implements A, X, B {}
 ''');
     checkElementText(library, r'''
@@ -3456,22 +3518,22 @@
     #F0 <testLibraryFragment>
       element: <testLibrary>
       classes
-        #F1 class A (nameOffset:24) (firstTokenOffset:18) (offset:24)
+        #F1 class A (nameOffset:25) (firstTokenOffset:19) (offset:25)
           element: <testLibrary>::@class::A
           constructors
-            #F2 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:24)
+            #F2 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:25)
               element: <testLibrary>::@class::A::@constructor::new
               typeName: A
-        #F3 class B (nameOffset:35) (firstTokenOffset:29) (offset:35)
+        #F3 class B (nameOffset:37) (firstTokenOffset:31) (offset:37)
           element: <testLibrary>::@class::B
           constructors
-            #F4 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:35)
+            #F4 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:37)
               element: <testLibrary>::@class::B::@constructor::new
               typeName: B
-        #F5 class C (nameOffset:46) (firstTokenOffset:40) (offset:46)
+        #F5 class C (nameOffset:49) (firstTokenOffset:43) (offset:49)
           element: <testLibrary>::@class::C
           constructors
-            #F6 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:46)
+            #F6 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:49)
               element: <testLibrary>::@class::C::@constructor::new
               typeName: C
       typeAliases
@@ -3513,7 +3575,9 @@
   test_typedef_nonFunction_asMixinType_none() async {
     var library = await buildLibrary(r'''
 typedef X = A<int>;
+
 class A<T> {}
+
 class B with X {}
 ''');
     checkElementText(library, r'''
@@ -3523,19 +3587,19 @@
     #F0 <testLibraryFragment>
       element: <testLibrary>
       classes
-        #F1 class A (nameOffset:26) (firstTokenOffset:20) (offset:26)
+        #F1 class A (nameOffset:27) (firstTokenOffset:21) (offset:27)
           element: <testLibrary>::@class::A
           typeParameters
-            #F2 T (nameOffset:28) (firstTokenOffset:28) (offset:28)
+            #F2 T (nameOffset:29) (firstTokenOffset:29) (offset:29)
               element: #E0 T
           constructors
-            #F3 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:26)
+            #F3 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:27)
               element: <testLibrary>::@class::A::@constructor::new
               typeName: A
-        #F4 class B (nameOffset:40) (firstTokenOffset:34) (offset:40)
+        #F4 class B (nameOffset:42) (firstTokenOffset:36) (offset:42)
           element: <testLibrary>::@class::B
           constructors
-            #F5 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:40)
+            #F5 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:42)
               element: <testLibrary>::@class::B::@constructor::new
               typeName: B
       typeAliases
@@ -3574,9 +3638,13 @@
   test_typedef_nonFunction_asMixinType_question() async {
     var library = await buildLibrary(r'''
 typedef X = A<int>?;
+
 class A<T> {}
+
 mixin M1 {}
+
 mixin M2 {}
+
 class B with M1, X, M2 {}
 ''');
     checkElementText(library, r'''
@@ -3586,25 +3654,25 @@
     #F0 <testLibraryFragment>
       element: <testLibrary>
       classes
-        #F1 class A (nameOffset:27) (firstTokenOffset:21) (offset:27)
+        #F1 class A (nameOffset:28) (firstTokenOffset:22) (offset:28)
           element: <testLibrary>::@class::A
           typeParameters
-            #F2 T (nameOffset:29) (firstTokenOffset:29) (offset:29)
+            #F2 T (nameOffset:30) (firstTokenOffset:30) (offset:30)
               element: #E0 T
           constructors
-            #F3 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:27)
+            #F3 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:28)
               element: <testLibrary>::@class::A::@constructor::new
               typeName: A
-        #F4 class B (nameOffset:65) (firstTokenOffset:59) (offset:65)
+        #F4 class B (nameOffset:69) (firstTokenOffset:63) (offset:69)
           element: <testLibrary>::@class::B
           constructors
-            #F5 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:65)
+            #F5 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:69)
               element: <testLibrary>::@class::B::@constructor::new
               typeName: B
       mixins
-        #F6 mixin M1 (nameOffset:41) (firstTokenOffset:35) (offset:41)
+        #F6 mixin M1 (nameOffset:43) (firstTokenOffset:37) (offset:43)
           element: <testLibrary>::@mixin::M1
-        #F7 mixin M2 (nameOffset:53) (firstTokenOffset:47) (offset:53)
+        #F7 mixin M2 (nameOffset:56) (firstTokenOffset:50) (offset:56)
           element: <testLibrary>::@mixin::M2
       typeAliases
         #F8 X (nameOffset:8) (firstTokenOffset:0) (offset:8)
@@ -3653,9 +3721,13 @@
   test_typedef_nonFunction_asMixinType_question2() async {
     var library = await buildLibrary(r'''
 typedef X = A<int?>;
+
 class A<T> {}
+
 mixin M1 {}
+
 mixin M2 {}
+
 class B with M1, X, M2 {}
 ''');
     checkElementText(library, r'''
@@ -3665,25 +3737,25 @@
     #F0 <testLibraryFragment>
       element: <testLibrary>
       classes
-        #F1 class A (nameOffset:27) (firstTokenOffset:21) (offset:27)
+        #F1 class A (nameOffset:28) (firstTokenOffset:22) (offset:28)
           element: <testLibrary>::@class::A
           typeParameters
-            #F2 T (nameOffset:29) (firstTokenOffset:29) (offset:29)
+            #F2 T (nameOffset:30) (firstTokenOffset:30) (offset:30)
               element: #E0 T
           constructors
-            #F3 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:27)
+            #F3 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:28)
               element: <testLibrary>::@class::A::@constructor::new
               typeName: A
-        #F4 class B (nameOffset:65) (firstTokenOffset:59) (offset:65)
+        #F4 class B (nameOffset:69) (firstTokenOffset:63) (offset:69)
           element: <testLibrary>::@class::B
           constructors
-            #F5 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:65)
+            #F5 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:69)
               element: <testLibrary>::@class::B::@constructor::new
               typeName: B
       mixins
-        #F6 mixin M1 (nameOffset:41) (firstTokenOffset:35) (offset:41)
+        #F6 mixin M1 (nameOffset:43) (firstTokenOffset:37) (offset:43)
           element: <testLibrary>::@mixin::M1
-        #F7 mixin M2 (nameOffset:53) (firstTokenOffset:47) (offset:53)
+        #F7 mixin M2 (nameOffset:56) (firstTokenOffset:50) (offset:56)
           element: <testLibrary>::@mixin::M2
       typeAliases
         #F8 X (nameOffset:8) (firstTokenOffset:0) (offset:8)
@@ -3734,6 +3806,7 @@
   test_typedef_nonFunction_asSuperType_interfaceType_Never_none() async {
     var library = await buildLibrary(r'''
 typedef X = Never;
+
 class A extends X {}
 ''');
     checkElementText(library, r'''
@@ -3743,10 +3816,10 @@
     #F0 <testLibraryFragment>
       element: <testLibrary>
       classes
-        #F1 hasExtendsClause class A (nameOffset:25) (firstTokenOffset:19) (offset:25)
+        #F1 hasExtendsClause class A (nameOffset:26) (firstTokenOffset:20) (offset:26)
           element: <testLibrary>::@class::A
           constructors
-            #F2 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:25)
+            #F2 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:26)
               element: <testLibrary>::@class::A::@constructor::new
               typeName: A
       typeAliases
@@ -3771,7 +3844,9 @@
   test_typedef_nonFunction_asSuperType_interfaceType_none() async {
     var library = await buildLibrary(r'''
 typedef X = A<int>;
+
 class A<T> {}
+
 class B extends X {}
 ''');
     checkElementText(library, r'''
@@ -3781,19 +3856,19 @@
     #F0 <testLibraryFragment>
       element: <testLibrary>
       classes
-        #F1 class A (nameOffset:26) (firstTokenOffset:20) (offset:26)
+        #F1 class A (nameOffset:27) (firstTokenOffset:21) (offset:27)
           element: <testLibrary>::@class::A
           typeParameters
-            #F2 T (nameOffset:28) (firstTokenOffset:28) (offset:28)
+            #F2 T (nameOffset:29) (firstTokenOffset:29) (offset:29)
               element: #E0 T
           constructors
-            #F3 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:26)
+            #F3 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:27)
               element: <testLibrary>::@class::A::@constructor::new
               typeName: A
-        #F4 hasExtendsClause class B (nameOffset:40) (firstTokenOffset:34) (offset:40)
+        #F4 hasExtendsClause class B (nameOffset:42) (firstTokenOffset:36) (offset:42)
           element: <testLibrary>::@class::B
           constructors
-            #F5 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:40)
+            #F5 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:42)
               element: <testLibrary>::@class::B::@constructor::new
               typeName: B
       typeAliases
@@ -3833,7 +3908,9 @@
   test_typedef_nonFunction_asSuperType_interfaceType_none_viaTypeParameter() async {
     var library = await buildLibrary(r'''
 typedef X<T> = T;
+
 class A<T> {}
+
 class B extends X<A<int>> {}
 ''');
     checkElementText(library, r'''
@@ -3843,19 +3920,19 @@
     #F0 <testLibraryFragment>
       element: <testLibrary>
       classes
-        #F1 class A (nameOffset:24) (firstTokenOffset:18) (offset:24)
+        #F1 class A (nameOffset:25) (firstTokenOffset:19) (offset:25)
           element: <testLibrary>::@class::A
           typeParameters
-            #F2 T (nameOffset:26) (firstTokenOffset:26) (offset:26)
+            #F2 T (nameOffset:27) (firstTokenOffset:27) (offset:27)
               element: #E0 T
           constructors
-            #F3 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:24)
+            #F3 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:25)
               element: <testLibrary>::@class::A::@constructor::new
               typeName: A
-        #F4 hasExtendsClause class B (nameOffset:38) (firstTokenOffset:32) (offset:38)
+        #F4 hasExtendsClause class B (nameOffset:40) (firstTokenOffset:34) (offset:40)
           element: <testLibrary>::@class::B
           constructors
-            #F5 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:38)
+            #F5 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:40)
               element: <testLibrary>::@class::B::@constructor::new
               typeName: B
       typeAliases
@@ -3903,6 +3980,7 @@
   test_typedef_nonFunction_asSuperType_interfaceType_Null_none() async {
     var library = await buildLibrary(r'''
 typedef X = Null;
+
 class A extends X {}
 ''');
     checkElementText(library, r'''
@@ -3912,10 +3990,10 @@
     #F0 <testLibraryFragment>
       element: <testLibrary>
       classes
-        #F1 hasExtendsClause class A (nameOffset:24) (firstTokenOffset:18) (offset:24)
+        #F1 hasExtendsClause class A (nameOffset:25) (firstTokenOffset:19) (offset:25)
           element: <testLibrary>::@class::A
           constructors
-            #F2 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:24)
+            #F2 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:25)
               element: <testLibrary>::@class::A::@constructor::new
               typeName: A
       typeAliases
@@ -3940,7 +4018,9 @@
   test_typedef_nonFunction_asSuperType_interfaceType_question() async {
     var library = await buildLibrary(r'''
 typedef X = A<int>?;
+
 class A<T> {}
+
 class D extends X {}
 ''');
     checkElementText(library, r'''
@@ -3950,19 +4030,19 @@
     #F0 <testLibraryFragment>
       element: <testLibrary>
       classes
-        #F1 class A (nameOffset:27) (firstTokenOffset:21) (offset:27)
+        #F1 class A (nameOffset:28) (firstTokenOffset:22) (offset:28)
           element: <testLibrary>::@class::A
           typeParameters
-            #F2 T (nameOffset:29) (firstTokenOffset:29) (offset:29)
+            #F2 T (nameOffset:30) (firstTokenOffset:30) (offset:30)
               element: #E0 T
           constructors
-            #F3 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:27)
+            #F3 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:28)
               element: <testLibrary>::@class::A::@constructor::new
               typeName: A
-        #F4 hasExtendsClause class D (nameOffset:41) (firstTokenOffset:35) (offset:41)
+        #F4 hasExtendsClause class D (nameOffset:43) (firstTokenOffset:37) (offset:43)
           element: <testLibrary>::@class::D
           constructors
-            #F5 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:41)
+            #F5 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:43)
               element: <testLibrary>::@class::D::@constructor::new
               typeName: D
       typeAliases
@@ -3997,7 +4077,9 @@
   test_typedef_nonFunction_asSuperType_interfaceType_question2() async {
     var library = await buildLibrary(r'''
 typedef X = A<int?>;
+
 class A<T> {}
+
 class D extends X {}
 ''');
     checkElementText(library, r'''
@@ -4007,19 +4089,19 @@
     #F0 <testLibraryFragment>
       element: <testLibrary>
       classes
-        #F1 class A (nameOffset:27) (firstTokenOffset:21) (offset:27)
+        #F1 class A (nameOffset:28) (firstTokenOffset:22) (offset:28)
           element: <testLibrary>::@class::A
           typeParameters
-            #F2 T (nameOffset:29) (firstTokenOffset:29) (offset:29)
+            #F2 T (nameOffset:30) (firstTokenOffset:30) (offset:30)
               element: #E0 T
           constructors
-            #F3 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:27)
+            #F3 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:28)
               element: <testLibrary>::@class::A::@constructor::new
               typeName: A
-        #F4 hasExtendsClause class D (nameOffset:41) (firstTokenOffset:35) (offset:41)
+        #F4 hasExtendsClause class D (nameOffset:43) (firstTokenOffset:37) (offset:43)
           element: <testLibrary>::@class::D
           constructors
-            #F5 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:41)
+            #F5 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:43)
               element: <testLibrary>::@class::D::@constructor::new
               typeName: D
       typeAliases
@@ -4059,6 +4141,7 @@
   test_typedef_nonFunction_asSuperType_Never_none() async {
     var library = await buildLibrary(r'''
 typedef X = Never;
+
 class A extends X {}
 ''');
     checkElementText(library, r'''
@@ -4068,10 +4151,10 @@
     #F0 <testLibraryFragment>
       element: <testLibrary>
       classes
-        #F1 hasExtendsClause class A (nameOffset:25) (firstTokenOffset:19) (offset:25)
+        #F1 hasExtendsClause class A (nameOffset:26) (firstTokenOffset:20) (offset:26)
           element: <testLibrary>::@class::A
           constructors
-            #F2 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:25)
+            #F2 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:26)
               element: <testLibrary>::@class::A::@constructor::new
               typeName: A
       typeAliases
@@ -4096,6 +4179,7 @@
   test_typedef_nonFunction_asSuperType_Null_none() async {
     var library = await buildLibrary(r'''
 typedef X = Null;
+
 class A extends X {}
 ''');
     checkElementText(library, r'''
@@ -4105,10 +4189,10 @@
     #F0 <testLibraryFragment>
       element: <testLibrary>
       classes
-        #F1 hasExtendsClause class A (nameOffset:24) (firstTokenOffset:18) (offset:24)
+        #F1 hasExtendsClause class A (nameOffset:25) (firstTokenOffset:19) (offset:25)
           element: <testLibrary>::@class::A
           constructors
-            #F2 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:24)
+            #F2 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:25)
               element: <testLibrary>::@class::A::@constructor::new
               typeName: A
       typeAliases
@@ -4724,7 +4808,10 @@
   }
 
   test_typedefs() async {
-    var library = await buildLibrary('f() {} g() {}');
+    var library = await buildLibrary(r'''
+f() {}
+g() {}
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
diff --git a/pkg/analyzer/test/src/summary/elements/type_inference_test.dart b/pkg/analyzer/test/src/summary/elements/type_inference_test.dart
index 83e9e0d..1da9e47 100644
--- a/pkg/analyzer/test/src/summary/elements/type_inference_test.dart
+++ b/pkg/analyzer/test/src/summary/elements/type_inference_test.dart
@@ -51,12 +51,13 @@
   }
 
   test_closure_in_variable_declaration_in_part() async {
-    newFile(
-      '$testPackageLibPath/a.dart',
-      'part of lib; final f = (int i) => i.toDouble();',
-    );
-    var library = await buildLibrary('''
+    newFile('$testPackageLibPath/a.dart', r'''
+part of lib;
+final f = (int i) => i.toDouble();
+''');
+    var library = await buildLibrary(r'''
 library lib;
+
 part "a.dart";
 ''');
     checkElementText(library, r'''
@@ -70,7 +71,7 @@
       parts
         part_0
           uri: package:test/a.dart
-          partKeywordOffset: 13
+          partKeywordOffset: 14
           unit: #F1
     #F1 package:test/a.dart
       element: <testLibrary>
@@ -98,7 +99,7 @@
   }
 
   test_expr_invalid_typeParameter_asPrefix() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class C<T> {
   final f = T.k;
 }
@@ -152,13 +153,16 @@
   }
 
   test_infer_generic_typedef_complex() async {
-    var library = await buildLibrary('''
-typedef F<T> = D<T,U> Function<U>();
+    var library = await buildLibrary(r'''
+typedef F<T> = D<T, U> Function<U>();
+
 class C<V> {
   const C(F<V> f);
 }
-class D<T,U> {}
-D<int,U> f<U>() => null;
+
+class D<T, U> {}
+
+D<int, U> f<U>() => null;
 const x = const C(f);
 ''');
     checkElementText(library, r'''
@@ -168,28 +172,28 @@
     #F0 <testLibraryFragment>
       element: <testLibrary>
       classes
-        #F1 class C (nameOffset:43) (firstTokenOffset:37) (offset:43)
+        #F1 class C (nameOffset:45) (firstTokenOffset:39) (offset:45)
           element: <testLibrary>::@class::C
           typeParameters
-            #F2 V (nameOffset:45) (firstTokenOffset:45) (offset:45)
+            #F2 V (nameOffset:47) (firstTokenOffset:47) (offset:47)
               element: #E0 V
           constructors
-            #F3 isConst isOriginDeclaration new (nameOffset:<null>) (firstTokenOffset:52) (offset:58)
+            #F3 isConst isOriginDeclaration new (nameOffset:<null>) (firstTokenOffset:54) (offset:60)
               element: <testLibrary>::@class::C::@constructor::new
               typeName: C
-              typeNameOffset: 58
+              typeNameOffset: 60
               formalParameters
-                #F4 requiredPositional isOriginDeclaration f (nameOffset:65) (firstTokenOffset:60) (offset:65)
+                #F4 requiredPositional isOriginDeclaration f (nameOffset:67) (firstTokenOffset:62) (offset:67)
                   element: <testLibrary>::@class::C::@constructor::new::@formalParameter::f
-        #F5 class D (nameOffset:77) (firstTokenOffset:71) (offset:77)
+        #F5 class D (nameOffset:80) (firstTokenOffset:74) (offset:80)
           element: <testLibrary>::@class::D
           typeParameters
-            #F6 T (nameOffset:79) (firstTokenOffset:79) (offset:79)
+            #F6 T (nameOffset:82) (firstTokenOffset:82) (offset:82)
               element: #E1 T
-            #F7 U (nameOffset:81) (firstTokenOffset:81) (offset:81)
+            #F7 U (nameOffset:85) (firstTokenOffset:85) (offset:85)
               element: #E2 U
           constructors
-            #F8 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:77)
+            #F8 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:80)
               element: <testLibrary>::@class::D::@constructor::new
               typeName: D
       typeAliases
@@ -199,36 +203,36 @@
             #F10 T (nameOffset:10) (firstTokenOffset:10) (offset:10)
               element: #E3 T
       topLevelVariables
-        #F11 hasImplicitType hasInitializer isConst isOriginDeclaration isStatic x (nameOffset:118) (firstTokenOffset:118) (offset:118)
+        #F11 hasImplicitType hasInitializer isConst isOriginDeclaration isStatic x (nameOffset:124) (firstTokenOffset:124) (offset:124)
           element: <testLibrary>::@topLevelVariable::x
           initializer: expression_0
             InstanceCreationExpression
-              keyword: const @122
+              keyword: const @128
               constructorName: ConstructorName
                 type: NamedType
-                  name: C @128
+                  name: C @134
                   element: <testLibrary>::@class::C
                   type: C<int>
                 element: ConstructorMember
                   baseElement: <testLibrary>::@class::C::@constructor::new
                   substitution: {V: int}
               argumentList: ArgumentList
-                leftParenthesis: ( @129
+                leftParenthesis: ( @135
                 arguments
                   SimpleIdentifier
-                    token: f @130
+                    token: f @136
                     element: <testLibrary>::@function::f
                     staticType: D<int, U> Function<U>()
-                rightParenthesis: ) @131
+                rightParenthesis: ) @137
               staticType: C<int>
       getters
-        #F12 isCompleteDeclaration isOriginVariable isStatic x (nameOffset:<null>) (firstTokenOffset:<null>) (offset:118)
+        #F12 isCompleteDeclaration isOriginVariable isStatic x (nameOffset:<null>) (firstTokenOffset:<null>) (offset:124)
           element: <testLibrary>::@getter::x
       functions
-        #F13 isCompleteDeclaration isOriginDeclaration isStatic f (nameOffset:96) (firstTokenOffset:87) (offset:96)
+        #F13 isCompleteDeclaration isOriginDeclaration isStatic f (nameOffset:102) (firstTokenOffset:92) (offset:102)
           element: <testLibrary>::@function::f
           typeParameters
-            #F14 U (nameOffset:98) (firstTokenOffset:98) (offset:98)
+            #F14 U (nameOffset:104) (firstTokenOffset:104) (offset:104)
               element: #E4 U
   classes
     isSimplyBounded class C
@@ -295,12 +299,15 @@
   }
 
   test_infer_generic_typedef_simple() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 typedef F = D<T> Function<T>();
+
 class C {
   const C(F f);
 }
+
 class D<T> {}
+
 D<T> f<T>() => null;
 const x = const C(f);
 ''');
@@ -311,57 +318,57 @@
     #F0 <testLibraryFragment>
       element: <testLibrary>
       classes
-        #F1 class C (nameOffset:38) (firstTokenOffset:32) (offset:38)
+        #F1 class C (nameOffset:39) (firstTokenOffset:33) (offset:39)
           element: <testLibrary>::@class::C
           constructors
-            #F2 isConst isOriginDeclaration new (nameOffset:<null>) (firstTokenOffset:44) (offset:50)
+            #F2 isConst isOriginDeclaration new (nameOffset:<null>) (firstTokenOffset:45) (offset:51)
               element: <testLibrary>::@class::C::@constructor::new
               typeName: C
-              typeNameOffset: 50
+              typeNameOffset: 51
               formalParameters
-                #F3 requiredPositional isOriginDeclaration f (nameOffset:54) (firstTokenOffset:52) (offset:54)
+                #F3 requiredPositional isOriginDeclaration f (nameOffset:55) (firstTokenOffset:53) (offset:55)
                   element: <testLibrary>::@class::C::@constructor::new::@formalParameter::f
-        #F4 class D (nameOffset:66) (firstTokenOffset:60) (offset:66)
+        #F4 class D (nameOffset:68) (firstTokenOffset:62) (offset:68)
           element: <testLibrary>::@class::D
           typeParameters
-            #F5 T (nameOffset:68) (firstTokenOffset:68) (offset:68)
+            #F5 T (nameOffset:70) (firstTokenOffset:70) (offset:70)
               element: #E0 T
           constructors
-            #F6 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:66)
+            #F6 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:68)
               element: <testLibrary>::@class::D::@constructor::new
               typeName: D
       typeAliases
         #F7 F (nameOffset:8) (firstTokenOffset:0) (offset:8)
           element: <testLibrary>::@typeAlias::F
       topLevelVariables
-        #F8 hasImplicitType hasInitializer isConst isOriginDeclaration isStatic x (nameOffset:101) (firstTokenOffset:101) (offset:101)
+        #F8 hasImplicitType hasInitializer isConst isOriginDeclaration isStatic x (nameOffset:104) (firstTokenOffset:104) (offset:104)
           element: <testLibrary>::@topLevelVariable::x
           initializer: expression_0
             InstanceCreationExpression
-              keyword: const @105
+              keyword: const @108
               constructorName: ConstructorName
                 type: NamedType
-                  name: C @111
+                  name: C @114
                   element: <testLibrary>::@class::C
                   type: C
                 element: <testLibrary>::@class::C::@constructor::new
               argumentList: ArgumentList
-                leftParenthesis: ( @112
+                leftParenthesis: ( @115
                 arguments
                   SimpleIdentifier
-                    token: f @113
+                    token: f @116
                     element: <testLibrary>::@function::f
                     staticType: D<T> Function<T>()
-                rightParenthesis: ) @114
+                rightParenthesis: ) @117
               staticType: C
       getters
-        #F9 isCompleteDeclaration isOriginVariable isStatic x (nameOffset:<null>) (firstTokenOffset:<null>) (offset:101)
+        #F9 isCompleteDeclaration isOriginVariable isStatic x (nameOffset:<null>) (firstTokenOffset:<null>) (offset:104)
           element: <testLibrary>::@getter::x
       functions
-        #F10 isCompleteDeclaration isOriginDeclaration isStatic f (nameOffset:79) (firstTokenOffset:74) (offset:79)
+        #F10 isCompleteDeclaration isOriginDeclaration isStatic f (nameOffset:82) (firstTokenOffset:77) (offset:82)
           element: <testLibrary>::@function::f
           typeParameters
-            #F11 T (nameOffset:81) (firstTokenOffset:81) (offset:81)
+            #F11 T (nameOffset:84) (firstTokenOffset:84) (offset:84)
               element: #E1 T
   classes
     isSimplyBounded class C
@@ -418,7 +425,7 @@
   }
 
   test_infer_instanceCreation_fromArguments() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class A {}
 
 class B extends A {}
@@ -532,16 +539,20 @@
   }
 
   test_infer_property_set() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class A {
   B b;
 }
+
 class B {
   C get c => null;
   void set c(C value) {}
 }
+
 class C {}
+
 class D extends C {}
+
 var a = new A();
 var x = a.b.c ??= new D();
 ''');
@@ -570,56 +581,56 @@
               formalParameters
                 #F6 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:14)
                   element: <testLibrary>::@class::A::@setter::b::@formalParameter::value
-        #F7 class B (nameOffset:25) (firstTokenOffset:19) (offset:25)
+        #F7 class B (nameOffset:26) (firstTokenOffset:20) (offset:26)
           element: <testLibrary>::@class::B
           fields
-            #F8 isOriginGetterSetter c (nameOffset:<null>) (firstTokenOffset:<null>) (offset:25)
+            #F8 isOriginGetterSetter c (nameOffset:<null>) (firstTokenOffset:<null>) (offset:26)
               element: <testLibrary>::@class::B::@field::c
           constructors
-            #F9 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:25)
+            #F9 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:26)
               element: <testLibrary>::@class::B::@constructor::new
               typeName: B
           getters
-            #F10 isCompleteDeclaration isOriginDeclaration c (nameOffset:37) (firstTokenOffset:31) (offset:37)
+            #F10 isCompleteDeclaration isOriginDeclaration c (nameOffset:38) (firstTokenOffset:32) (offset:38)
               element: <testLibrary>::@class::B::@getter::c
           setters
-            #F11 isCompleteDeclaration isOriginDeclaration c (nameOffset:59) (firstTokenOffset:50) (offset:59)
+            #F11 isCompleteDeclaration isOriginDeclaration c (nameOffset:60) (firstTokenOffset:51) (offset:60)
               element: <testLibrary>::@class::B::@setter::c
               formalParameters
-                #F12 requiredPositional isOriginDeclaration value (nameOffset:63) (firstTokenOffset:61) (offset:63)
+                #F12 requiredPositional isOriginDeclaration value (nameOffset:64) (firstTokenOffset:62) (offset:64)
                   element: <testLibrary>::@class::B::@setter::c::@formalParameter::value
-        #F13 class C (nameOffset:81) (firstTokenOffset:75) (offset:81)
+        #F13 class C (nameOffset:83) (firstTokenOffset:77) (offset:83)
           element: <testLibrary>::@class::C
           constructors
-            #F14 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:81)
+            #F14 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:83)
               element: <testLibrary>::@class::C::@constructor::new
               typeName: C
-        #F15 hasExtendsClause class D (nameOffset:92) (firstTokenOffset:86) (offset:92)
+        #F15 hasExtendsClause class D (nameOffset:95) (firstTokenOffset:89) (offset:95)
           element: <testLibrary>::@class::D
           constructors
-            #F16 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:92)
+            #F16 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:95)
               element: <testLibrary>::@class::D::@constructor::new
               typeName: D
       topLevelVariables
-        #F17 hasImplicitType hasInitializer isOriginDeclaration isStatic a (nameOffset:111) (firstTokenOffset:111) (offset:111)
+        #F17 hasImplicitType hasInitializer isOriginDeclaration isStatic a (nameOffset:115) (firstTokenOffset:115) (offset:115)
           element: <testLibrary>::@topLevelVariable::a
-        #F18 hasImplicitType hasInitializer isOriginDeclaration isStatic x (nameOffset:128) (firstTokenOffset:128) (offset:128)
+        #F18 hasImplicitType hasInitializer isOriginDeclaration isStatic x (nameOffset:132) (firstTokenOffset:132) (offset:132)
           element: <testLibrary>::@topLevelVariable::x
       getters
-        #F19 isCompleteDeclaration isOriginVariable isStatic a (nameOffset:<null>) (firstTokenOffset:<null>) (offset:111)
+        #F19 isCompleteDeclaration isOriginVariable isStatic a (nameOffset:<null>) (firstTokenOffset:<null>) (offset:115)
           element: <testLibrary>::@getter::a
-        #F20 isCompleteDeclaration isOriginVariable isStatic x (nameOffset:<null>) (firstTokenOffset:<null>) (offset:128)
+        #F20 isCompleteDeclaration isOriginVariable isStatic x (nameOffset:<null>) (firstTokenOffset:<null>) (offset:132)
           element: <testLibrary>::@getter::x
       setters
-        #F21 isCompleteDeclaration isOriginVariable isStatic a (nameOffset:<null>) (firstTokenOffset:<null>) (offset:111)
+        #F21 isCompleteDeclaration isOriginVariable isStatic a (nameOffset:<null>) (firstTokenOffset:<null>) (offset:115)
           element: <testLibrary>::@setter::a
           formalParameters
-            #F22 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:111)
+            #F22 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:115)
               element: <testLibrary>::@setter::a::@formalParameter::value
-        #F23 isCompleteDeclaration isOriginVariable isStatic x (nameOffset:<null>) (firstTokenOffset:<null>) (offset:128)
+        #F23 isCompleteDeclaration isOriginVariable isStatic x (nameOffset:<null>) (firstTokenOffset:<null>) (offset:132)
           element: <testLibrary>::@setter::x
           formalParameters
-            #F24 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:128)
+            #F24 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:132)
               element: <testLibrary>::@setter::x::@formalParameter::value
   classes
     hasNonFinalField isSimplyBounded class A
@@ -746,7 +757,7 @@
 
   test_inference_issue_32394() async {
     // Test the type inference involved in dartbug.com/32394
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 var x = y.map((a) => a.toString());
 var y = [3];
 var z = x.toList();
@@ -854,10 +865,11 @@
   }
 
   test_inference_map() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class C {
   int p;
 }
+
 var x = <C>[];
 var y = x.map((c) => c.p);
 ''');
@@ -887,25 +899,25 @@
                 #F6 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:16)
                   element: <testLibrary>::@class::C::@setter::p::@formalParameter::value
       topLevelVariables
-        #F7 hasImplicitType hasInitializer isOriginDeclaration isStatic x (nameOffset:25) (firstTokenOffset:25) (offset:25)
+        #F7 hasImplicitType hasInitializer isOriginDeclaration isStatic x (nameOffset:26) (firstTokenOffset:26) (offset:26)
           element: <testLibrary>::@topLevelVariable::x
-        #F8 hasImplicitType hasInitializer isOriginDeclaration isStatic y (nameOffset:40) (firstTokenOffset:40) (offset:40)
+        #F8 hasImplicitType hasInitializer isOriginDeclaration isStatic y (nameOffset:41) (firstTokenOffset:41) (offset:41)
           element: <testLibrary>::@topLevelVariable::y
       getters
-        #F9 isCompleteDeclaration isOriginVariable isStatic x (nameOffset:<null>) (firstTokenOffset:<null>) (offset:25)
+        #F9 isCompleteDeclaration isOriginVariable isStatic x (nameOffset:<null>) (firstTokenOffset:<null>) (offset:26)
           element: <testLibrary>::@getter::x
-        #F10 isCompleteDeclaration isOriginVariable isStatic y (nameOffset:<null>) (firstTokenOffset:<null>) (offset:40)
+        #F10 isCompleteDeclaration isOriginVariable isStatic y (nameOffset:<null>) (firstTokenOffset:<null>) (offset:41)
           element: <testLibrary>::@getter::y
       setters
-        #F11 isCompleteDeclaration isOriginVariable isStatic x (nameOffset:<null>) (firstTokenOffset:<null>) (offset:25)
+        #F11 isCompleteDeclaration isOriginVariable isStatic x (nameOffset:<null>) (firstTokenOffset:<null>) (offset:26)
           element: <testLibrary>::@setter::x
           formalParameters
-            #F12 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:25)
+            #F12 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:26)
               element: <testLibrary>::@setter::x::@formalParameter::value
-        #F13 isCompleteDeclaration isOriginVariable isStatic y (nameOffset:<null>) (firstTokenOffset:<null>) (offset:40)
+        #F13 isCompleteDeclaration isOriginVariable isStatic y (nameOffset:<null>) (firstTokenOffset:<null>) (offset:41)
           element: <testLibrary>::@setter::y
           formalParameters
-            #F14 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:40)
+            #F14 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:41)
               element: <testLibrary>::@setter::y::@formalParameter::value
   classes
     hasNonFinalField isSimplyBounded class C
@@ -987,7 +999,7 @@
   test_inferred_function_type_for_variable_in_generic_function() async {
     // In the code below, `x` has an inferred type of `() => int`, with 2
     // (unused) type parameters from the enclosing top level function.
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 f<U, V>() {
   var x = () => 0;
 }
@@ -1022,10 +1034,12 @@
   test_inferred_function_type_in_generic_class_constructor() async {
     // In the code below, `() => () => 0` has an inferred return type of
     // `() => int`, with 2 (unused) type parameters from the enclosing class.
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class C<U, V> {
   final x;
-  C() : x = (() => () => 0);
+  C()
+    : x = (() =>
+          () => 0);
 }
 ''');
     checkElementText(library, r'''
@@ -1084,9 +1098,11 @@
   test_inferred_function_type_in_generic_class_getter() async {
     // In the code below, `() => () => 0` has an inferred return type of
     // `() => int`, with 2 (unused) type parameters from the enclosing class.
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class C<U, V> {
-  get x => () => () => 0;
+  get x =>
+      () =>
+          () => 0;
 }
 ''');
     checkElementText(library, r'''
@@ -1145,10 +1161,13 @@
     // In the code below, `() => () => 0` has an inferred return type of
     // `() => int`, with 3 (unused) type parameters from the enclosing class
     // and method.
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class C<T> {
   f<U, V>() {
-    print(() => () => 0);
+    print(
+      () =>
+          () => 0,
+    );
   }
 }
 ''');
@@ -1203,10 +1222,13 @@
   test_inferred_function_type_in_generic_class_setter() async {
     // In the code below, `() => () => 0` has an inferred return type of
     // `() => int`, with 2 (unused) type parameters from the enclosing class.
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class C<U, V> {
   void set x(value) {
-    print(() => () => 0);
+    print(
+      () =>
+          () => 0,
+    );
   }
 }
 ''');
@@ -1272,9 +1294,12 @@
   test_inferred_function_type_in_generic_closure() async {
     // In the code below, `<U, V>() => () => 0` has an inferred return type of
     // `() => int`, with 3 (unused) type parameters.
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 f<T>() {
-  print(/*<U, V>*/() => () => 0);
+  print(
+    /*<U, V>*/ () =>
+        () => 0,
+  );
 }
 ''');
     checkElementText(library, r'''
@@ -1303,9 +1328,12 @@
   test_inferred_generic_function_type_in_generic_closure() async {
     // In the code below, `<U, V>() => <W, X, Y, Z>() => 0` has an inferred
     // return type of `() => int`, with 7 (unused) type parameters.
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 f<T>() {
-  print(/*<U, V>*/() => /*<W, X, Y, Z>*/() => 0);
+  print(
+    /*<U, V>*/ () => /*<W, X, Y, Z>*/
+        () => 0,
+  );
 }
 ''');
     checkElementText(library, r'''
@@ -1424,7 +1452,7 @@
   }
 
   test_inferred_type_functionExpressionInvocation_oppositeOrder() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class A {
   static final foo = bar(1.2);
   static final bar = baz();
@@ -1679,6 +1707,7 @@
     );
     var library = await buildLibrary(r'''
 import 'dart:collection';
+
 var m = HashMap();
 ''');
     checkElementText(library, r'''
@@ -1690,16 +1719,16 @@
       libraryImports
         dart:collection
       topLevelVariables
-        #F1 hasImplicitType hasInitializer isOriginDeclaration isStatic m (nameOffset:30) (firstTokenOffset:30) (offset:30)
+        #F1 hasImplicitType hasInitializer isOriginDeclaration isStatic m (nameOffset:31) (firstTokenOffset:31) (offset:31)
           element: <testLibrary>::@topLevelVariable::m
       getters
-        #F2 isCompleteDeclaration isOriginVariable isStatic m (nameOffset:<null>) (firstTokenOffset:<null>) (offset:30)
+        #F2 isCompleteDeclaration isOriginVariable isStatic m (nameOffset:<null>) (firstTokenOffset:<null>) (offset:31)
           element: <testLibrary>::@getter::m
       setters
-        #F3 isCompleteDeclaration isOriginVariable isStatic m (nameOffset:<null>) (firstTokenOffset:<null>) (offset:30)
+        #F3 isCompleteDeclaration isOriginVariable isStatic m (nameOffset:<null>) (firstTokenOffset:<null>) (offset:31)
           element: <testLibrary>::@setter::m
           formalParameters
-            #F4 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:30)
+            #F4 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:31)
               element: <testLibrary>::@setter::m::@formalParameter::value
   topLevelVariables
     hasImplicitType hasInitializer isOriginDeclaration isStatic isTypeInferredFromInitializer m
@@ -1872,11 +1901,17 @@
   }
 
   test_inferred_type_is_typedef() async {
-    var library = await buildLibrary(
-      'typedef int F(String s);'
-      ' class C extends D { var v; }'
-      ' abstract class D { F get v; }',
-    );
+    var library = await buildLibrary(r'''
+typedef int F(String s);
+
+class C extends D {
+  var v;
+}
+
+abstract class D {
+  F get v;
+}
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -1884,35 +1919,35 @@
     #F0 <testLibraryFragment>
       element: <testLibrary>
       classes
-        #F1 hasExtendsClause class C (nameOffset:31) (firstTokenOffset:25) (offset:31)
+        #F1 hasExtendsClause class C (nameOffset:32) (firstTokenOffset:26) (offset:32)
           element: <testLibrary>::@class::C
           fields
-            #F2 hasImplicitType isOriginDeclaration v (nameOffset:49) (firstTokenOffset:49) (offset:49)
+            #F2 hasImplicitType isOriginDeclaration v (nameOffset:52) (firstTokenOffset:52) (offset:52)
               element: <testLibrary>::@class::C::@field::v
           constructors
-            #F3 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:31)
+            #F3 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:32)
               element: <testLibrary>::@class::C::@constructor::new
               typeName: C
           getters
-            #F4 isCompleteDeclaration isOriginVariable v (nameOffset:<null>) (firstTokenOffset:<null>) (offset:49)
+            #F4 isCompleteDeclaration isOriginVariable v (nameOffset:<null>) (firstTokenOffset:<null>) (offset:52)
               element: <testLibrary>::@class::C::@getter::v
           setters
-            #F5 isCompleteDeclaration isOriginVariable v (nameOffset:<null>) (firstTokenOffset:<null>) (offset:49)
+            #F5 isCompleteDeclaration isOriginVariable v (nameOffset:<null>) (firstTokenOffset:<null>) (offset:52)
               element: <testLibrary>::@class::C::@setter::v
               formalParameters
-                #F6 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:49)
+                #F6 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:52)
                   element: <testLibrary>::@class::C::@setter::v::@formalParameter::value
-        #F7 isAbstract class D (nameOffset:69) (firstTokenOffset:54) (offset:69)
+        #F7 isAbstract class D (nameOffset:73) (firstTokenOffset:58) (offset:73)
           element: <testLibrary>::@class::D
           fields
-            #F8 isOriginGetterSetter v (nameOffset:<null>) (firstTokenOffset:<null>) (offset:69)
+            #F8 isOriginGetterSetter v (nameOffset:<null>) (firstTokenOffset:<null>) (offset:73)
               element: <testLibrary>::@class::D::@field::v
           constructors
-            #F9 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:69)
+            #F9 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:73)
               element: <testLibrary>::@class::D::@constructor::new
               typeName: D
           getters
-            #F10 isAbstract isOriginDeclaration v (nameOffset:79) (firstTokenOffset:73) (offset:79)
+            #F10 isAbstract isOriginDeclaration v (nameOffset:85) (firstTokenOffset:79) (offset:85)
               element: <testLibrary>::@class::D::@getter::v
       typeAliases
         #F11 F (nameOffset:12) (firstTokenOffset:0) (offset:12)
@@ -1983,9 +2018,12 @@
   }
 
   test_inferred_type_nullability_class_ref_none() async {
-    newFile('$testPackageLibPath/a.dart', 'int f() => 0;');
-    var library = await buildLibrary('''
+    newFile('$testPackageLibPath/a.dart', r'''
+int f() => 0;
+''');
+    var library = await buildLibrary(r'''
 import 'a.dart';
+
 var x = f();
 ''');
     checkElementText(library, r'''
@@ -1997,16 +2035,16 @@
       libraryImports
         package:test/a.dart
       topLevelVariables
-        #F1 hasImplicitType hasInitializer isOriginDeclaration isStatic x (nameOffset:21) (firstTokenOffset:21) (offset:21)
+        #F1 hasImplicitType hasInitializer isOriginDeclaration isStatic x (nameOffset:22) (firstTokenOffset:22) (offset:22)
           element: <testLibrary>::@topLevelVariable::x
       getters
-        #F2 isCompleteDeclaration isOriginVariable isStatic x (nameOffset:<null>) (firstTokenOffset:<null>) (offset:21)
+        #F2 isCompleteDeclaration isOriginVariable isStatic x (nameOffset:<null>) (firstTokenOffset:<null>) (offset:22)
           element: <testLibrary>::@getter::x
       setters
-        #F3 isCompleteDeclaration isOriginVariable isStatic x (nameOffset:<null>) (firstTokenOffset:<null>) (offset:21)
+        #F3 isCompleteDeclaration isOriginVariable isStatic x (nameOffset:<null>) (firstTokenOffset:<null>) (offset:22)
           element: <testLibrary>::@setter::x
           formalParameters
-            #F4 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:21)
+            #F4 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:22)
               element: <testLibrary>::@setter::x::@formalParameter::value
   topLevelVariables
     hasImplicitType hasInitializer isOriginDeclaration isStatic isTypeInferredFromInitializer x
@@ -2035,9 +2073,12 @@
   }
 
   test_inferred_type_nullability_class_ref_question() async {
-    newFile('$testPackageLibPath/a.dart', 'int? f() => 0;');
-    var library = await buildLibrary('''
+    newFile('$testPackageLibPath/a.dart', r'''
+int? f() => 0;
+''');
+    var library = await buildLibrary(r'''
 import 'a.dart';
+
 var x = f();
 ''');
     checkElementText(library, r'''
@@ -2049,16 +2090,16 @@
       libraryImports
         package:test/a.dart
       topLevelVariables
-        #F1 hasImplicitType hasInitializer isOriginDeclaration isStatic x (nameOffset:21) (firstTokenOffset:21) (offset:21)
+        #F1 hasImplicitType hasInitializer isOriginDeclaration isStatic x (nameOffset:22) (firstTokenOffset:22) (offset:22)
           element: <testLibrary>::@topLevelVariable::x
       getters
-        #F2 isCompleteDeclaration isOriginVariable isStatic x (nameOffset:<null>) (firstTokenOffset:<null>) (offset:21)
+        #F2 isCompleteDeclaration isOriginVariable isStatic x (nameOffset:<null>) (firstTokenOffset:<null>) (offset:22)
           element: <testLibrary>::@getter::x
       setters
-        #F3 isCompleteDeclaration isOriginVariable isStatic x (nameOffset:<null>) (firstTokenOffset:<null>) (offset:21)
+        #F3 isCompleteDeclaration isOriginVariable isStatic x (nameOffset:<null>) (firstTokenOffset:<null>) (offset:22)
           element: <testLibrary>::@setter::x
           formalParameters
-            #F4 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:21)
+            #F4 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:22)
               element: <testLibrary>::@setter::x::@formalParameter::value
   topLevelVariables
     hasImplicitType hasInitializer isOriginDeclaration isStatic isTypeInferredFromInitializer x
@@ -2087,9 +2128,12 @@
   }
 
   test_inferred_type_nullability_function_type_none() async {
-    newFile('$testPackageLibPath/a.dart', 'void Function() f() => () {};');
-    var library = await buildLibrary('''
+    newFile('$testPackageLibPath/a.dart', r'''
+void Function() f() => () {};
+''');
+    var library = await buildLibrary(r'''
 import 'a.dart';
+
 var x = f();
 ''');
     checkElementText(library, r'''
@@ -2101,16 +2145,16 @@
       libraryImports
         package:test/a.dart
       topLevelVariables
-        #F1 hasImplicitType hasInitializer isOriginDeclaration isStatic x (nameOffset:21) (firstTokenOffset:21) (offset:21)
+        #F1 hasImplicitType hasInitializer isOriginDeclaration isStatic x (nameOffset:22) (firstTokenOffset:22) (offset:22)
           element: <testLibrary>::@topLevelVariable::x
       getters
-        #F2 isCompleteDeclaration isOriginVariable isStatic x (nameOffset:<null>) (firstTokenOffset:<null>) (offset:21)
+        #F2 isCompleteDeclaration isOriginVariable isStatic x (nameOffset:<null>) (firstTokenOffset:<null>) (offset:22)
           element: <testLibrary>::@getter::x
       setters
-        #F3 isCompleteDeclaration isOriginVariable isStatic x (nameOffset:<null>) (firstTokenOffset:<null>) (offset:21)
+        #F3 isCompleteDeclaration isOriginVariable isStatic x (nameOffset:<null>) (firstTokenOffset:<null>) (offset:22)
           element: <testLibrary>::@setter::x
           formalParameters
-            #F4 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:21)
+            #F4 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:22)
               element: <testLibrary>::@setter::x::@formalParameter::value
   topLevelVariables
     hasImplicitType hasInitializer isOriginDeclaration isStatic isTypeInferredFromInitializer x
@@ -2139,9 +2183,12 @@
   }
 
   test_inferred_type_nullability_function_type_question() async {
-    newFile('$testPackageLibPath/a.dart', 'void Function()? f() => () {};');
-    var library = await buildLibrary('''
+    newFile('$testPackageLibPath/a.dart', r'''
+void Function()? f() => () {};
+''');
+    var library = await buildLibrary(r'''
 import 'a.dart';
+
 var x = f();
 ''');
     checkElementText(library, r'''
@@ -2153,16 +2200,16 @@
       libraryImports
         package:test/a.dart
       topLevelVariables
-        #F1 hasImplicitType hasInitializer isOriginDeclaration isStatic x (nameOffset:21) (firstTokenOffset:21) (offset:21)
+        #F1 hasImplicitType hasInitializer isOriginDeclaration isStatic x (nameOffset:22) (firstTokenOffset:22) (offset:22)
           element: <testLibrary>::@topLevelVariable::x
       getters
-        #F2 isCompleteDeclaration isOriginVariable isStatic x (nameOffset:<null>) (firstTokenOffset:<null>) (offset:21)
+        #F2 isCompleteDeclaration isOriginVariable isStatic x (nameOffset:<null>) (firstTokenOffset:<null>) (offset:22)
           element: <testLibrary>::@getter::x
       setters
-        #F3 isCompleteDeclaration isOriginVariable isStatic x (nameOffset:<null>) (firstTokenOffset:<null>) (offset:21)
+        #F3 isCompleteDeclaration isOriginVariable isStatic x (nameOffset:<null>) (firstTokenOffset:<null>) (offset:22)
           element: <testLibrary>::@setter::x
           formalParameters
-            #F4 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:21)
+            #F4 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:22)
               element: <testLibrary>::@setter::x::@formalParameter::value
   topLevelVariables
     hasImplicitType hasInitializer isOriginDeclaration isStatic isTypeInferredFromInitializer x
@@ -2191,10 +2238,11 @@
   }
 
   test_inferred_type_refers_to_bound_type_param() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class C<T> extends D<int, T> {
   var v;
 }
+
 abstract class D<U, V> {
   Map<V, U> get v;
 }
@@ -2227,22 +2275,22 @@
               formalParameters
                 #F7 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:37)
                   element: <testLibrary>::@class::C::@setter::v::@formalParameter::value
-        #F8 isAbstract class D (nameOffset:57) (firstTokenOffset:42) (offset:57)
+        #F8 isAbstract class D (nameOffset:58) (firstTokenOffset:43) (offset:58)
           element: <testLibrary>::@class::D
           typeParameters
-            #F9 U (nameOffset:59) (firstTokenOffset:59) (offset:59)
+            #F9 U (nameOffset:60) (firstTokenOffset:60) (offset:60)
               element: #E1 U
-            #F10 V (nameOffset:62) (firstTokenOffset:62) (offset:62)
+            #F10 V (nameOffset:63) (firstTokenOffset:63) (offset:63)
               element: #E2 V
           fields
-            #F11 isOriginGetterSetter v (nameOffset:<null>) (firstTokenOffset:<null>) (offset:57)
+            #F11 isOriginGetterSetter v (nameOffset:<null>) (firstTokenOffset:<null>) (offset:58)
               element: <testLibrary>::@class::D::@field::v
           constructors
-            #F12 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:57)
+            #F12 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:58)
               element: <testLibrary>::@class::D::@constructor::new
               typeName: D
           getters
-            #F13 isAbstract isOriginDeclaration v (nameOffset:83) (firstTokenOffset:69) (offset:83)
+            #F13 isAbstract isOriginDeclaration v (nameOffset:84) (firstTokenOffset:70) (offset:84)
               element: <testLibrary>::@class::D::@getter::v
   classes
     hasNonFinalField isSimplyBounded class C
@@ -2310,7 +2358,7 @@
   }
 
   test_inferred_type_refers_to_function_typed_param_of_typedef() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 typedef void F(int g(String s));
 h(F f) => null;
 var v = h((y) {});
@@ -2384,13 +2432,15 @@
   }
 
   test_inferred_type_refers_to_function_typed_parameter_type_generic_class() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class C<T, U> extends D<U, int> {
   void f(int x, g) {}
 }
+
 abstract class D<V, W> {
   void f(int x, W g(V s));
-}''');
+}
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -2417,28 +2467,28 @@
                   element: <testLibrary>::@class::C::@method::f::@formalParameter::x
                 #F7 requiredPositional hasImplicitType isOriginDeclaration g (nameOffset:50) (firstTokenOffset:50) (offset:50)
                   element: <testLibrary>::@class::C::@method::f::@formalParameter::g
-        #F8 isAbstract class D (nameOffset:73) (firstTokenOffset:58) (offset:73)
+        #F8 isAbstract class D (nameOffset:74) (firstTokenOffset:59) (offset:74)
           element: <testLibrary>::@class::D
           typeParameters
-            #F9 V (nameOffset:75) (firstTokenOffset:75) (offset:75)
+            #F9 V (nameOffset:76) (firstTokenOffset:76) (offset:76)
               element: #E2 V
-            #F10 W (nameOffset:78) (firstTokenOffset:78) (offset:78)
+            #F10 W (nameOffset:79) (firstTokenOffset:79) (offset:79)
               element: #E3 W
           constructors
-            #F11 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:73)
+            #F11 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:74)
               element: <testLibrary>::@class::D::@constructor::new
               typeName: D
           methods
-            #F12 isAbstract isOriginDeclaration f (nameOffset:90) (firstTokenOffset:85) (offset:90)
+            #F12 isAbstract isOriginDeclaration f (nameOffset:91) (firstTokenOffset:86) (offset:91)
               element: <testLibrary>::@class::D::@method::f
               formalParameters
-                #F13 requiredPositional isOriginDeclaration x (nameOffset:96) (firstTokenOffset:92) (offset:96)
+                #F13 requiredPositional isOriginDeclaration x (nameOffset:97) (firstTokenOffset:93) (offset:97)
                   element: <testLibrary>::@class::D::@method::f::@formalParameter::x
-                #F14 requiredPositional isOriginDeclaration g (nameOffset:101) (firstTokenOffset:99) (offset:101)
+                #F14 requiredPositional isOriginDeclaration g (nameOffset:102) (firstTokenOffset:100) (offset:102)
                   element: <testLibrary>::@class::D::@method::f::@formalParameter::g
                   parameters
-                    #F15 requiredPositional isOriginDeclaration s (nameOffset:105) (firstTokenOffset:103) (offset:105)
-                      element: s@105
+                    #F15 requiredPositional isOriginDeclaration s (nameOffset:106) (firstTokenOffset:104) (offset:106)
+                      element: s@106
   classes
     isSimplyBounded class C
       reference: <testLibrary>::@class::C
@@ -2500,17 +2550,18 @@
   }
 
   test_inferred_type_refers_to_function_typed_parameter_type_other_lib() async {
-    newFile('$testPackageLibPath/a.dart', '''
+    newFile('$testPackageLibPath/a.dart', r'''
 import 'b.dart';
 abstract class D extends E {}
 ''');
-    newFile('$testPackageLibPath/b.dart', '''
+    newFile('$testPackageLibPath/b.dart', r'''
 abstract class E {
   void f(int x, int g(String s));
 }
 ''');
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 import 'a.dart';
+
 class C extends D {
   void f(int x, g) {}
 }
@@ -2524,19 +2575,19 @@
       libraryImports
         package:test/a.dart
       classes
-        #F1 hasExtendsClause class C (nameOffset:23) (firstTokenOffset:17) (offset:23)
+        #F1 hasExtendsClause class C (nameOffset:24) (firstTokenOffset:18) (offset:24)
           element: <testLibrary>::@class::C
           constructors
-            #F2 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:23)
+            #F2 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:24)
               element: <testLibrary>::@class::C::@constructor::new
               typeName: C
           methods
-            #F3 isCompleteDeclaration isOriginDeclaration f (nameOffset:44) (firstTokenOffset:39) (offset:44)
+            #F3 isCompleteDeclaration isOriginDeclaration f (nameOffset:45) (firstTokenOffset:40) (offset:45)
               element: <testLibrary>::@class::C::@method::f
               formalParameters
-                #F4 requiredPositional isOriginDeclaration x (nameOffset:50) (firstTokenOffset:46) (offset:50)
+                #F4 requiredPositional isOriginDeclaration x (nameOffset:51) (firstTokenOffset:47) (offset:51)
                   element: <testLibrary>::@class::C::@method::f::@formalParameter::x
-                #F5 requiredPositional hasImplicitType isOriginDeclaration g (nameOffset:53) (firstTokenOffset:53) (offset:53)
+                #F5 requiredPositional hasImplicitType isOriginDeclaration g (nameOffset:54) (firstTokenOffset:54) (offset:54)
                   element: <testLibrary>::@class::C::@method::f::@formalParameter::g
   classes
     isSimplyBounded class C
@@ -2564,10 +2615,15 @@
   }
 
   test_inferred_type_refers_to_method_function_typed_parameter_type() async {
-    var library = await buildLibrary(
-      'class C extends D { void f(int x, g) {} }'
-      ' abstract class D { void f(int x, int g(String s)); }',
-    );
+    var library = await buildLibrary(r'''
+class C extends D {
+  void f(int x, g) {}
+}
+
+abstract class D {
+  void f(int x, int g(String s));
+}
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -2582,30 +2638,30 @@
               element: <testLibrary>::@class::C::@constructor::new
               typeName: C
           methods
-            #F3 isCompleteDeclaration isOriginDeclaration f (nameOffset:25) (firstTokenOffset:20) (offset:25)
+            #F3 isCompleteDeclaration isOriginDeclaration f (nameOffset:27) (firstTokenOffset:22) (offset:27)
               element: <testLibrary>::@class::C::@method::f
               formalParameters
-                #F4 requiredPositional isOriginDeclaration x (nameOffset:31) (firstTokenOffset:27) (offset:31)
+                #F4 requiredPositional isOriginDeclaration x (nameOffset:33) (firstTokenOffset:29) (offset:33)
                   element: <testLibrary>::@class::C::@method::f::@formalParameter::x
-                #F5 requiredPositional hasImplicitType isOriginDeclaration g (nameOffset:34) (firstTokenOffset:34) (offset:34)
+                #F5 requiredPositional hasImplicitType isOriginDeclaration g (nameOffset:36) (firstTokenOffset:36) (offset:36)
                   element: <testLibrary>::@class::C::@method::f::@formalParameter::g
-        #F6 isAbstract class D (nameOffset:57) (firstTokenOffset:42) (offset:57)
+        #F6 isAbstract class D (nameOffset:60) (firstTokenOffset:45) (offset:60)
           element: <testLibrary>::@class::D
           constructors
-            #F7 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:57)
+            #F7 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:60)
               element: <testLibrary>::@class::D::@constructor::new
               typeName: D
           methods
-            #F8 isAbstract isOriginDeclaration f (nameOffset:66) (firstTokenOffset:61) (offset:66)
+            #F8 isAbstract isOriginDeclaration f (nameOffset:71) (firstTokenOffset:66) (offset:71)
               element: <testLibrary>::@class::D::@method::f
               formalParameters
-                #F9 requiredPositional isOriginDeclaration x (nameOffset:72) (firstTokenOffset:68) (offset:72)
+                #F9 requiredPositional isOriginDeclaration x (nameOffset:77) (firstTokenOffset:73) (offset:77)
                   element: <testLibrary>::@class::D::@method::f::@formalParameter::x
-                #F10 requiredPositional isOriginDeclaration g (nameOffset:79) (firstTokenOffset:75) (offset:79)
+                #F10 requiredPositional isOriginDeclaration g (nameOffset:84) (firstTokenOffset:80) (offset:84)
                   element: <testLibrary>::@class::D::@method::f::@formalParameter::g
                   parameters
-                    #F11 requiredPositional isOriginDeclaration s (nameOffset:88) (firstTokenOffset:81) (offset:88)
-                      element: s@88
+                    #F11 requiredPositional isOriginDeclaration s (nameOffset:93) (firstTokenOffset:86) (offset:93)
+                      element: s@93
   classes
     isSimplyBounded class C
       reference: <testLibrary>::@class::C
@@ -2655,7 +2711,7 @@
   }
 
   test_inferred_type_refers_to_nested_function_typed_param() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 f(void g(int x, void h())) => null;
 var v = f((x, y) {});
 ''');
@@ -2731,7 +2787,7 @@
   }
 
   test_inferred_type_refers_to_nested_function_typed_param_named() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 f({void g(int x, void h())}) => null;
 var v = f(g: (x, y) {});
 ''');
@@ -2807,10 +2863,15 @@
   }
 
   test_inferred_type_refers_to_setter_function_typed_parameter_type() async {
-    var library = await buildLibrary(
-      'class C extends D { void set f(g) {} }'
-      ' abstract class D { void set f(int g(String s)); }',
-    );
+    var library = await buildLibrary(r'''
+class C extends D {
+  void set f(g) {}
+}
+
+abstract class D {
+  void set f(int g(String s));
+}
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -2828,29 +2889,29 @@
               element: <testLibrary>::@class::C::@constructor::new
               typeName: C
           setters
-            #F4 isCompleteDeclaration isOriginDeclaration f (nameOffset:29) (firstTokenOffset:20) (offset:29)
+            #F4 isCompleteDeclaration isOriginDeclaration f (nameOffset:31) (firstTokenOffset:22) (offset:31)
               element: <testLibrary>::@class::C::@setter::f
               formalParameters
-                #F5 requiredPositional hasImplicitType isOriginDeclaration g (nameOffset:31) (firstTokenOffset:31) (offset:31)
+                #F5 requiredPositional hasImplicitType isOriginDeclaration g (nameOffset:33) (firstTokenOffset:33) (offset:33)
                   element: <testLibrary>::@class::C::@setter::f::@formalParameter::g
-        #F6 isAbstract class D (nameOffset:54) (firstTokenOffset:39) (offset:54)
+        #F6 isAbstract class D (nameOffset:57) (firstTokenOffset:42) (offset:57)
           element: <testLibrary>::@class::D
           fields
-            #F7 isOriginGetterSetter f (nameOffset:<null>) (firstTokenOffset:<null>) (offset:54)
+            #F7 isOriginGetterSetter f (nameOffset:<null>) (firstTokenOffset:<null>) (offset:57)
               element: <testLibrary>::@class::D::@field::f
           constructors
-            #F8 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:54)
+            #F8 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:57)
               element: <testLibrary>::@class::D::@constructor::new
               typeName: D
           setters
-            #F9 isAbstract isOriginDeclaration f (nameOffset:67) (firstTokenOffset:58) (offset:67)
+            #F9 isAbstract isOriginDeclaration f (nameOffset:72) (firstTokenOffset:63) (offset:72)
               element: <testLibrary>::@class::D::@setter::f
               formalParameters
-                #F10 requiredPositional isOriginDeclaration g (nameOffset:73) (firstTokenOffset:69) (offset:73)
+                #F10 requiredPositional isOriginDeclaration g (nameOffset:78) (firstTokenOffset:74) (offset:78)
                   element: <testLibrary>::@class::D::@setter::f::@formalParameter::g
                   parameters
-                    #F11 requiredPositional isOriginDeclaration s (nameOffset:82) (firstTokenOffset:75) (offset:82)
-                      element: s@82
+                    #F11 requiredPositional isOriginDeclaration s (nameOffset:87) (firstTokenOffset:80) (offset:87)
+                      element: s@87
   classes
     isSimplyBounded class C
       reference: <testLibrary>::@class::C
@@ -2916,6 +2977,7 @@
 ''');
     var library = await buildLibrary(r'''
 import 'a.dart';
+
 class B extends A {
   m(p) {}
 }
@@ -2929,17 +2991,17 @@
       libraryImports
         package:test/a.dart
       classes
-        #F1 hasExtendsClause class B (nameOffset:23) (firstTokenOffset:17) (offset:23)
+        #F1 hasExtendsClause class B (nameOffset:24) (firstTokenOffset:18) (offset:24)
           element: <testLibrary>::@class::B
           constructors
-            #F2 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:23)
+            #F2 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:24)
               element: <testLibrary>::@class::B::@constructor::new
               typeName: B
           methods
-            #F3 hasImplicitReturnType isCompleteDeclaration isOriginDeclaration m (nameOffset:39) (firstTokenOffset:39) (offset:39)
+            #F3 hasImplicitReturnType isCompleteDeclaration isOriginDeclaration m (nameOffset:40) (firstTokenOffset:40) (offset:40)
               element: <testLibrary>::@class::B::@method::m
               formalParameters
-                #F4 requiredPositional hasImplicitType isOriginDeclaration p (nameOffset:41) (firstTokenOffset:41) (offset:41)
+                #F4 requiredPositional hasImplicitType isOriginDeclaration p (nameOffset:42) (firstTokenOffset:42) (offset:42)
                   element: <testLibrary>::@class::B::@method::m::@formalParameter::p
   classes
     isSimplyBounded class B
@@ -2979,6 +3041,7 @@
   A();
   A.named();
 }
+
 var a1 = A();
 var a2 = A.named();
 ''');
@@ -3002,25 +3065,25 @@
               typeNameOffset: 19
               periodOffset: 20
       topLevelVariables
-        #F4 hasImplicitType hasInitializer isOriginDeclaration isStatic a1 (nameOffset:36) (firstTokenOffset:36) (offset:36)
+        #F4 hasImplicitType hasInitializer isOriginDeclaration isStatic a1 (nameOffset:37) (firstTokenOffset:37) (offset:37)
           element: <testLibrary>::@topLevelVariable::a1
-        #F5 hasImplicitType hasInitializer isOriginDeclaration isStatic a2 (nameOffset:50) (firstTokenOffset:50) (offset:50)
+        #F5 hasImplicitType hasInitializer isOriginDeclaration isStatic a2 (nameOffset:51) (firstTokenOffset:51) (offset:51)
           element: <testLibrary>::@topLevelVariable::a2
       getters
-        #F6 isCompleteDeclaration isOriginVariable isStatic a1 (nameOffset:<null>) (firstTokenOffset:<null>) (offset:36)
+        #F6 isCompleteDeclaration isOriginVariable isStatic a1 (nameOffset:<null>) (firstTokenOffset:<null>) (offset:37)
           element: <testLibrary>::@getter::a1
-        #F7 isCompleteDeclaration isOriginVariable isStatic a2 (nameOffset:<null>) (firstTokenOffset:<null>) (offset:50)
+        #F7 isCompleteDeclaration isOriginVariable isStatic a2 (nameOffset:<null>) (firstTokenOffset:<null>) (offset:51)
           element: <testLibrary>::@getter::a2
       setters
-        #F8 isCompleteDeclaration isOriginVariable isStatic a1 (nameOffset:<null>) (firstTokenOffset:<null>) (offset:36)
+        #F8 isCompleteDeclaration isOriginVariable isStatic a1 (nameOffset:<null>) (firstTokenOffset:<null>) (offset:37)
           element: <testLibrary>::@setter::a1
           formalParameters
-            #F9 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:36)
+            #F9 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:37)
               element: <testLibrary>::@setter::a1::@formalParameter::value
-        #F10 isCompleteDeclaration isOriginVariable isStatic a2 (nameOffset:<null>) (firstTokenOffset:<null>) (offset:50)
+        #F10 isCompleteDeclaration isOriginVariable isStatic a2 (nameOffset:<null>) (firstTokenOffset:<null>) (offset:51)
           element: <testLibrary>::@setter::a2
           formalParameters
-            #F11 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:50)
+            #F11 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:51)
               element: <testLibrary>::@setter::a2::@formalParameter::value
   classes
     isSimplyBounded class A
@@ -3080,14 +3143,15 @@
   }
 
   test_inferredType_implicitCreation_prefixed() async {
-    newFile('$testPackageLibPath/foo.dart', '''
+    newFile('$testPackageLibPath/foo.dart', r'''
 class A {
   A();
   A.named();
 }
 ''');
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 import 'foo.dart' as foo;
+
 var a1 = foo.A();
 var a2 = foo.A.named();
 ''');
@@ -3103,25 +3167,25 @@
         <testLibraryFragment>::@prefix::foo
           fragments: @21
       topLevelVariables
-        #F1 hasImplicitType hasInitializer isOriginDeclaration isStatic a1 (nameOffset:30) (firstTokenOffset:30) (offset:30)
+        #F1 hasImplicitType hasInitializer isOriginDeclaration isStatic a1 (nameOffset:31) (firstTokenOffset:31) (offset:31)
           element: <testLibrary>::@topLevelVariable::a1
-        #F2 hasImplicitType hasInitializer isOriginDeclaration isStatic a2 (nameOffset:48) (firstTokenOffset:48) (offset:48)
+        #F2 hasImplicitType hasInitializer isOriginDeclaration isStatic a2 (nameOffset:49) (firstTokenOffset:49) (offset:49)
           element: <testLibrary>::@topLevelVariable::a2
       getters
-        #F3 isCompleteDeclaration isOriginVariable isStatic a1 (nameOffset:<null>) (firstTokenOffset:<null>) (offset:30)
+        #F3 isCompleteDeclaration isOriginVariable isStatic a1 (nameOffset:<null>) (firstTokenOffset:<null>) (offset:31)
           element: <testLibrary>::@getter::a1
-        #F4 isCompleteDeclaration isOriginVariable isStatic a2 (nameOffset:<null>) (firstTokenOffset:<null>) (offset:48)
+        #F4 isCompleteDeclaration isOriginVariable isStatic a2 (nameOffset:<null>) (firstTokenOffset:<null>) (offset:49)
           element: <testLibrary>::@getter::a2
       setters
-        #F5 isCompleteDeclaration isOriginVariable isStatic a1 (nameOffset:<null>) (firstTokenOffset:<null>) (offset:30)
+        #F5 isCompleteDeclaration isOriginVariable isStatic a1 (nameOffset:<null>) (firstTokenOffset:<null>) (offset:31)
           element: <testLibrary>::@setter::a1
           formalParameters
-            #F6 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:30)
+            #F6 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:31)
               element: <testLibrary>::@setter::a1::@formalParameter::value
-        #F7 isCompleteDeclaration isOriginVariable isStatic a2 (nameOffset:<null>) (firstTokenOffset:<null>) (offset:48)
+        #F7 isCompleteDeclaration isOriginVariable isStatic a2 (nameOffset:<null>) (firstTokenOffset:<null>) (offset:49)
           element: <testLibrary>::@setter::a2
           formalParameters
-            #F8 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:48)
+            #F8 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:49)
               element: <testLibrary>::@setter::a2::@formalParameter::value
   topLevelVariables
     hasImplicitType hasInitializer isOriginDeclaration isStatic isTypeInferredFromInitializer a1
@@ -3172,7 +3236,7 @@
   test_inferredType_usesSyntheticFunctionType_functionTypedParam() async {
     // AnalysisContext does not set the enclosing element for the synthetic
     // FunctionElement created for the [f, g] type argument.
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 int f(int x(String y)) => null;
 String g(int x(String y)) => null;
 var v = [f, g];
@@ -3264,7 +3328,7 @@
   }
 
   test_inheritance_errors() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 abstract class A {
   int m();
 }
@@ -3403,9 +3467,11 @@
 class A {
   double call() => 0.0;
 }
+
 class B {
   A a;
 }
+
 var c = new B().a();
 ''');
     checkElementText(library, r'''
@@ -3424,35 +3490,35 @@
           methods
             #F3 isCompleteDeclaration isOriginDeclaration call (nameOffset:19) (firstTokenOffset:12) (offset:19)
               element: <testLibrary>::@class::A::@method::call
-        #F4 class B (nameOffset:42) (firstTokenOffset:36) (offset:42)
+        #F4 class B (nameOffset:43) (firstTokenOffset:37) (offset:43)
           element: <testLibrary>::@class::B
           fields
-            #F5 isOriginDeclaration a (nameOffset:50) (firstTokenOffset:50) (offset:50)
+            #F5 isOriginDeclaration a (nameOffset:51) (firstTokenOffset:51) (offset:51)
               element: <testLibrary>::@class::B::@field::a
           constructors
-            #F6 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:42)
+            #F6 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:43)
               element: <testLibrary>::@class::B::@constructor::new
               typeName: B
           getters
-            #F7 isCompleteDeclaration isOriginVariable a (nameOffset:<null>) (firstTokenOffset:<null>) (offset:50)
+            #F7 isCompleteDeclaration isOriginVariable a (nameOffset:<null>) (firstTokenOffset:<null>) (offset:51)
               element: <testLibrary>::@class::B::@getter::a
           setters
-            #F8 isCompleteDeclaration isOriginVariable a (nameOffset:<null>) (firstTokenOffset:<null>) (offset:50)
+            #F8 isCompleteDeclaration isOriginVariable a (nameOffset:<null>) (firstTokenOffset:<null>) (offset:51)
               element: <testLibrary>::@class::B::@setter::a
               formalParameters
-                #F9 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:50)
+                #F9 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:51)
                   element: <testLibrary>::@class::B::@setter::a::@formalParameter::value
       topLevelVariables
-        #F10 hasImplicitType hasInitializer isOriginDeclaration isStatic c (nameOffset:59) (firstTokenOffset:59) (offset:59)
+        #F10 hasImplicitType hasInitializer isOriginDeclaration isStatic c (nameOffset:61) (firstTokenOffset:61) (offset:61)
           element: <testLibrary>::@topLevelVariable::c
       getters
-        #F11 isCompleteDeclaration isOriginVariable isStatic c (nameOffset:<null>) (firstTokenOffset:<null>) (offset:59)
+        #F11 isCompleteDeclaration isOriginVariable isStatic c (nameOffset:<null>) (firstTokenOffset:<null>) (offset:61)
           element: <testLibrary>::@getter::c
       setters
-        #F12 isCompleteDeclaration isOriginVariable isStatic c (nameOffset:<null>) (firstTokenOffset:<null>) (offset:59)
+        #F12 isCompleteDeclaration isOriginVariable isStatic c (nameOffset:<null>) (firstTokenOffset:<null>) (offset:61)
           element: <testLibrary>::@setter::c
           formalParameters
-            #F13 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:59)
+            #F13 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:61)
               element: <testLibrary>::@setter::c::@formalParameter::value
   classes
     isSimplyBounded class A
@@ -3524,7 +3590,7 @@
   }
 
   test_type_inference_assignmentExpression_references_onTopLevelVariable() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 var a = () {
   b += 0;
   return 0;
@@ -3605,9 +3671,11 @@
   }
 
   test_type_inference_based_on_loadLibrary() async {
-    newFile('$testPackageLibPath/a.dart', '');
-    var library = await buildLibrary('''
+    newFile('$testPackageLibPath/a.dart', r'''
+''');
+    var library = await buildLibrary(r'''
 import 'a.dart' deferred as a;
+
 var x = a.loadLibrary;
 ''');
     checkElementText(library, r'''
@@ -3622,16 +3690,16 @@
         <testLibraryFragment>::@prefix::a
           fragments: @28
       topLevelVariables
-        #F1 hasImplicitType hasInitializer isOriginDeclaration isStatic x (nameOffset:35) (firstTokenOffset:35) (offset:35)
+        #F1 hasImplicitType hasInitializer isOriginDeclaration isStatic x (nameOffset:36) (firstTokenOffset:36) (offset:36)
           element: <testLibrary>::@topLevelVariable::x
       getters
-        #F2 isCompleteDeclaration isOriginVariable isStatic x (nameOffset:<null>) (firstTokenOffset:<null>) (offset:35)
+        #F2 isCompleteDeclaration isOriginVariable isStatic x (nameOffset:<null>) (firstTokenOffset:<null>) (offset:36)
           element: <testLibrary>::@getter::x
       setters
-        #F3 isCompleteDeclaration isOriginVariable isStatic x (nameOffset:<null>) (firstTokenOffset:<null>) (offset:35)
+        #F3 isCompleteDeclaration isOriginVariable isStatic x (nameOffset:<null>) (firstTokenOffset:<null>) (offset:36)
           element: <testLibrary>::@setter::x
           formalParameters
-            #F4 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:35)
+            #F4 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:36)
               element: <testLibrary>::@setter::x::@formalParameter::value
   topLevelVariables
     hasImplicitType hasInitializer isOriginDeclaration isStatic isTypeInferredFromInitializer x
@@ -3660,7 +3728,7 @@
   }
 
   test_type_inference_closure_with_function_typed_parameter() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 var x = (int f(String x)) => 0;
 ''');
     checkElementText(library, r'''
@@ -3708,7 +3776,7 @@
   }
 
   test_type_inference_closure_with_function_typed_parameter_new() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 var x = (int Function(String) f) => 0;
 ''');
     checkElementText(library, r'''
@@ -3756,10 +3824,15 @@
   }
 
   test_type_inference_depends_on_exported_variable() async {
-    newFile('$testPackageLibPath/a.dart', 'export "b.dart";');
-    newFile('$testPackageLibPath/b.dart', 'var x = 0;');
-    var library = await buildLibrary('''
+    newFile('$testPackageLibPath/a.dart', r'''
+export "b.dart";
+''');
+    newFile('$testPackageLibPath/b.dart', r'''
+var x = 0;
+''');
+    var library = await buildLibrary(r'''
 import 'a.dart';
+
 var y = x;
 ''');
     checkElementText(library, r'''
@@ -3771,16 +3844,16 @@
       libraryImports
         package:test/a.dart
       topLevelVariables
-        #F1 hasImplicitType hasInitializer isOriginDeclaration isStatic y (nameOffset:21) (firstTokenOffset:21) (offset:21)
+        #F1 hasImplicitType hasInitializer isOriginDeclaration isStatic y (nameOffset:22) (firstTokenOffset:22) (offset:22)
           element: <testLibrary>::@topLevelVariable::y
       getters
-        #F2 isCompleteDeclaration isOriginVariable isStatic y (nameOffset:<null>) (firstTokenOffset:<null>) (offset:21)
+        #F2 isCompleteDeclaration isOriginVariable isStatic y (nameOffset:<null>) (firstTokenOffset:<null>) (offset:22)
           element: <testLibrary>::@getter::y
       setters
-        #F3 isCompleteDeclaration isOriginVariable isStatic y (nameOffset:<null>) (firstTokenOffset:<null>) (offset:21)
+        #F3 isCompleteDeclaration isOriginVariable isStatic y (nameOffset:<null>) (firstTokenOffset:<null>) (offset:22)
           element: <testLibrary>::@setter::y
           formalParameters
-            #F4 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:21)
+            #F4 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:22)
               element: <testLibrary>::@setter::y::@formalParameter::value
   topLevelVariables
     hasImplicitType hasInitializer isOriginDeclaration isStatic isTypeInferredFromInitializer y
@@ -3809,7 +3882,7 @@
   }
 
   test_type_inference_field_cycle() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class A {
   static final x = y + 1;
   static final y = x + 1;
@@ -3876,7 +3949,7 @@
   }
 
   test_type_inference_field_cycle_chain() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class A {
   static final a = b.c;
   static final b = A();
@@ -3958,7 +4031,7 @@
   }
 
   test_type_inference_field_depends_onFieldFormal() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class A<T> {
   T value;
 
@@ -4092,7 +4165,7 @@
   }
 
   test_type_inference_field_depends_onFieldFormal_withMixinApp() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class A<T> {
   T value;
 
@@ -4283,7 +4356,7 @@
   }
 
   test_type_inference_fieldFormal_depends_onField() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class A<T> {
   var f = 0;
   A(this.f);
@@ -4364,10 +4437,11 @@
   }
 
   test_type_inference_instanceCreation_notGeneric() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class A {
   A(_);
 }
+
 final a = A(() => b);
 final b = A(() => a);
 ''');
@@ -4389,14 +4463,14 @@
                 #F3 requiredPositional hasImplicitType isOriginDeclaration _ (nameOffset:14) (firstTokenOffset:14) (offset:14)
                   element: <testLibrary>::@class::A::@constructor::new::@formalParameter::_
       topLevelVariables
-        #F4 hasImplicitType hasInitializer isFinal isOriginDeclaration isStatic a (nameOffset:26) (firstTokenOffset:26) (offset:26)
+        #F4 hasImplicitType hasInitializer isFinal isOriginDeclaration isStatic a (nameOffset:27) (firstTokenOffset:27) (offset:27)
           element: <testLibrary>::@topLevelVariable::a
-        #F5 hasImplicitType hasInitializer isFinal isOriginDeclaration isStatic b (nameOffset:48) (firstTokenOffset:48) (offset:48)
+        #F5 hasImplicitType hasInitializer isFinal isOriginDeclaration isStatic b (nameOffset:49) (firstTokenOffset:49) (offset:49)
           element: <testLibrary>::@topLevelVariable::b
       getters
-        #F6 isCompleteDeclaration isOriginVariable isStatic a (nameOffset:<null>) (firstTokenOffset:<null>) (offset:26)
+        #F6 isCompleteDeclaration isOriginVariable isStatic a (nameOffset:<null>) (firstTokenOffset:<null>) (offset:27)
           element: <testLibrary>::@getter::a
-        #F7 isCompleteDeclaration isOriginVariable isStatic b (nameOffset:<null>) (firstTokenOffset:<null>) (offset:48)
+        #F7 isCompleteDeclaration isOriginVariable isStatic b (nameOffset:<null>) (firstTokenOffset:<null>) (offset:49)
           element: <testLibrary>::@getter::b
   classes
     isSimplyBounded class A
@@ -4440,11 +4514,16 @@
   }
 
   test_type_inference_multiplyDefinedElement() async {
-    newFile('$testPackageLibPath/a.dart', 'class C {}');
-    newFile('$testPackageLibPath/b.dart', 'class C {}');
-    var library = await buildLibrary('''
+    newFile('$testPackageLibPath/a.dart', r'''
+class C {}
+''');
+    newFile('$testPackageLibPath/b.dart', r'''
+class C {}
+''');
+    var library = await buildLibrary(r'''
 import 'a.dart';
 import 'b.dart';
+
 var v = C;
 ''');
     checkElementText(library, r'''
@@ -4457,16 +4536,16 @@
         package:test/a.dart
         package:test/b.dart
       topLevelVariables
-        #F1 hasImplicitType hasInitializer isOriginDeclaration isStatic v (nameOffset:38) (firstTokenOffset:38) (offset:38)
+        #F1 hasImplicitType hasInitializer isOriginDeclaration isStatic v (nameOffset:39) (firstTokenOffset:39) (offset:39)
           element: <testLibrary>::@topLevelVariable::v
       getters
-        #F2 isCompleteDeclaration isOriginVariable isStatic v (nameOffset:<null>) (firstTokenOffset:<null>) (offset:38)
+        #F2 isCompleteDeclaration isOriginVariable isStatic v (nameOffset:<null>) (firstTokenOffset:<null>) (offset:39)
           element: <testLibrary>::@getter::v
       setters
-        #F3 isCompleteDeclaration isOriginVariable isStatic v (nameOffset:<null>) (firstTokenOffset:<null>) (offset:38)
+        #F3 isCompleteDeclaration isOriginVariable isStatic v (nameOffset:<null>) (firstTokenOffset:<null>) (offset:39)
           element: <testLibrary>::@setter::v
           formalParameters
-            #F4 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:38)
+            #F4 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:39)
               element: <testLibrary>::@setter::v::@formalParameter::value
   topLevelVariables
     hasImplicitType hasInitializer isOriginDeclaration isStatic isTypeInferredFromInitializer v
@@ -4495,8 +4574,9 @@
   }
 
   test_type_inference_nested_function() async {
-    var library = await buildLibrary('''
-var x = (t) => (u) => t + u;
+    var library = await buildLibrary(r'''
+var x = (t) =>
+    (u) => t + u;
 ''');
     checkElementText(library, r'''
 library
@@ -4543,8 +4623,9 @@
   }
 
   test_type_inference_nested_function_with_parameter_types() async {
-    var library = await buildLibrary('''
-var x = (int t) => (int u) => t + u;
+    var library = await buildLibrary(r'''
+var x = (int t) =>
+    (int u) => t + u;
 ''');
     checkElementText(library, r'''
 library
@@ -4591,7 +4672,7 @@
   }
 
   test_type_inference_of_closure_with_default_value() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 var x = ([y: 0]) => y;
 ''');
     checkElementText(library, r'''
@@ -4640,7 +4721,7 @@
 
   test_type_inference_topVariable_cycle_afterChain() async {
     // Note that `a` depends on `b`, but does not belong to the cycle.
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 final a = b;
 final b = c;
 final c = b;
@@ -4706,7 +4787,7 @@
 
   test_type_inference_topVariable_cycle_beforeChain() async {
     // Note that `c` depends on `b`, but does not belong to the cycle.
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 final a = b;
 final b = a;
 final c = b;
@@ -4773,7 +4854,7 @@
   test_type_inference_topVariable_cycle_inCycle() async {
     // `b` and `c` form a cycle.
     // `a` and `d` form a different cycle, even though `a` references `b`.
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 final a = b + d;
 final b = c;
 final c = b;
@@ -4864,7 +4945,7 @@
     // 5. Pop `c`, already inferred (to `dynamic`), return.
     // 6. Continue resolving `b` (it is not done, and not popped yet).
     // 7. Go to `a`, detect cycle `[a, b]`, set `dynamic`, return.
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 final a = b;
 final b = c + a;
 final c = b;
@@ -4931,7 +5012,7 @@
   }
 
   test_type_inference_topVariable_depends_onFieldFormal() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class A {}
 
 class B extends A {}
@@ -5063,10 +5144,11 @@
   }
 
   test_type_inference_using_extension_getter() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 extension on String {
   int get foo => 0;
 }
+
 var v = 'a'.foo;
 ''');
     checkElementText(library, r'''
@@ -5085,16 +5167,16 @@
             #F3 isCompleteDeclaration isOriginDeclaration foo (nameOffset:32) (firstTokenOffset:24) (offset:32)
               element: <testLibrary>::@extension::#0::@getter::foo
       topLevelVariables
-        #F4 hasImplicitType hasInitializer isOriginDeclaration isStatic v (nameOffset:48) (firstTokenOffset:48) (offset:48)
+        #F4 hasImplicitType hasInitializer isOriginDeclaration isStatic v (nameOffset:49) (firstTokenOffset:49) (offset:49)
           element: <testLibrary>::@topLevelVariable::v
       getters
-        #F5 isCompleteDeclaration isOriginVariable isStatic v (nameOffset:<null>) (firstTokenOffset:<null>) (offset:48)
+        #F5 isCompleteDeclaration isOriginVariable isStatic v (nameOffset:<null>) (firstTokenOffset:<null>) (offset:49)
           element: <testLibrary>::@getter::v
       setters
-        #F6 isCompleteDeclaration isOriginVariable isStatic v (nameOffset:<null>) (firstTokenOffset:<null>) (offset:48)
+        #F6 isCompleteDeclaration isOriginVariable isStatic v (nameOffset:<null>) (firstTokenOffset:<null>) (offset:49)
           element: <testLibrary>::@setter::v
           formalParameters
-            #F7 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:48)
+            #F7 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:49)
               element: <testLibrary>::@setter::v::@formalParameter::value
   extensions
     extension <null-name>
@@ -5141,8 +5223,9 @@
   }
 
   test_type_invalid_topLevelVariableElement_asType() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class C<T extends V> {}
+
 typedef V F(V p);
 V f(V p) {}
 V V2 = null;
@@ -5165,34 +5248,34 @@
               element: <testLibrary>::@class::C::@constructor::new
               typeName: C
       typeAliases
-        #F4 F (nameOffset:34) (firstTokenOffset:24) (offset:34)
+        #F4 F (nameOffset:35) (firstTokenOffset:25) (offset:35)
           element: <testLibrary>::@typeAlias::F
       topLevelVariables
-        #F5 hasInitializer isOriginDeclaration isStatic V2 (nameOffset:56) (firstTokenOffset:56) (offset:56)
+        #F5 hasInitializer isOriginDeclaration isStatic V2 (nameOffset:57) (firstTokenOffset:57) (offset:57)
           element: <testLibrary>::@topLevelVariable::V2
-        #F6 hasInitializer isOriginDeclaration isStatic V (nameOffset:71) (firstTokenOffset:71) (offset:71)
+        #F6 hasInitializer isOriginDeclaration isStatic V (nameOffset:72) (firstTokenOffset:72) (offset:72)
           element: <testLibrary>::@topLevelVariable::V
       getters
-        #F7 isCompleteDeclaration isOriginVariable isStatic V2 (nameOffset:<null>) (firstTokenOffset:<null>) (offset:56)
+        #F7 isCompleteDeclaration isOriginVariable isStatic V2 (nameOffset:<null>) (firstTokenOffset:<null>) (offset:57)
           element: <testLibrary>::@getter::V2
-        #F8 isCompleteDeclaration isOriginVariable isStatic V (nameOffset:<null>) (firstTokenOffset:<null>) (offset:71)
+        #F8 isCompleteDeclaration isOriginVariable isStatic V (nameOffset:<null>) (firstTokenOffset:<null>) (offset:72)
           element: <testLibrary>::@getter::V
       setters
-        #F9 isCompleteDeclaration isOriginVariable isStatic V2 (nameOffset:<null>) (firstTokenOffset:<null>) (offset:56)
+        #F9 isCompleteDeclaration isOriginVariable isStatic V2 (nameOffset:<null>) (firstTokenOffset:<null>) (offset:57)
           element: <testLibrary>::@setter::V2
           formalParameters
-            #F10 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:56)
+            #F10 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:57)
               element: <testLibrary>::@setter::V2::@formalParameter::value
-        #F11 isCompleteDeclaration isOriginVariable isStatic V (nameOffset:<null>) (firstTokenOffset:<null>) (offset:71)
+        #F11 isCompleteDeclaration isOriginVariable isStatic V (nameOffset:<null>) (firstTokenOffset:<null>) (offset:72)
           element: <testLibrary>::@setter::V
           formalParameters
-            #F12 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:71)
+            #F12 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:72)
               element: <testLibrary>::@setter::V::@formalParameter::value
       functions
-        #F13 isCompleteDeclaration isOriginDeclaration isStatic f (nameOffset:44) (firstTokenOffset:42) (offset:44)
+        #F13 isCompleteDeclaration isOriginDeclaration isStatic f (nameOffset:45) (firstTokenOffset:43) (offset:45)
           element: <testLibrary>::@function::f
           formalParameters
-            #F14 requiredPositional isOriginDeclaration p (nameOffset:48) (firstTokenOffset:46) (offset:48)
+            #F14 requiredPositional isOriginDeclaration p (nameOffset:49) (firstTokenOffset:47) (offset:49)
               element: <testLibrary>::@function::f::@formalParameter::p
   classes
     isSimplyBounded class C
@@ -5267,7 +5350,7 @@
   }
 
   test_type_invalid_topLevelVariableElement_asTypeArgument() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 var V;
 static List<V> V2;
 ''');
@@ -5345,7 +5428,7 @@
   }
 
   test_type_invalid_typeParameter_asPrefix() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class C<T> {
   m(T.K p) {}
 }
@@ -5396,7 +5479,7 @@
   }
 
   test_type_invalid_unresolvedPrefix() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 p.C v;
 ''');
     checkElementText(library, r'''
@@ -5444,7 +5527,9 @@
   }
 
   test_type_never() async {
-    var library = await buildLibrary('Never d;');
+    var library = await buildLibrary(r'''
+Never d;
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -5490,7 +5575,7 @@
   }
 
   test_type_param_ref_nullability_none() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class C<T> {
   T t;
 }
@@ -5561,7 +5646,7 @@
   }
 
   test_type_param_ref_nullability_question() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class C<T> {
   T? t;
 }
@@ -5632,13 +5717,16 @@
   }
 
   test_type_reference_lib_to_lib() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class C {}
+
 enum E { v }
+
 typedef F();
 C c;
 E e;
-F f;''');
+F f;
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -5653,10 +5741,10 @@
               element: <testLibrary>::@class::C::@constructor::new
               typeName: C
       enums
-        #F3 enum E (nameOffset:16) (firstTokenOffset:11) (offset:16)
+        #F3 enum E (nameOffset:17) (firstTokenOffset:12) (offset:17)
           element: <testLibrary>::@enum::E
           fields
-            #F4 hasImplicitType hasInitializer isConst isEnumConstant isOriginDeclaration isStatic v (nameOffset:20) (firstTokenOffset:20) (offset:20)
+            #F4 hasImplicitType hasInitializer isConst isEnumConstant isOriginDeclaration isStatic v (nameOffset:21) (firstTokenOffset:21) (offset:21)
               element: <testLibrary>::@enum::E::@field::v
               initializer: expression_0
                 InstanceCreationExpression
@@ -5670,7 +5758,7 @@
                     leftParenthesis: ( @0
                     rightParenthesis: ) @0
                   staticType: E
-            #F5 isConst isOriginEnumValues isStatic values (nameOffset:<null>) (firstTokenOffset:<null>) (offset:16)
+            #F5 isConst isOriginEnumValues isStatic values (nameOffset:<null>) (firstTokenOffset:<null>) (offset:17)
               element: <testLibrary>::@enum::E::@field::values
               initializer: expression_1
                 ListLiteral
@@ -5683,46 +5771,46 @@
                   rightBracket: ] @0
                   staticType: List<E>
           constructors
-            #F6 isConst isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:16)
+            #F6 isConst isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:17)
               element: <testLibrary>::@enum::E::@constructor::new
               typeName: E
           getters
-            #F7 isCompleteDeclaration isOriginVariable isStatic v (nameOffset:<null>) (firstTokenOffset:<null>) (offset:20)
+            #F7 isCompleteDeclaration isOriginVariable isStatic v (nameOffset:<null>) (firstTokenOffset:<null>) (offset:21)
               element: <testLibrary>::@enum::E::@getter::v
-            #F8 isCompleteDeclaration isOriginVariable isStatic values (nameOffset:<null>) (firstTokenOffset:<null>) (offset:16)
+            #F8 isCompleteDeclaration isOriginVariable isStatic values (nameOffset:<null>) (firstTokenOffset:<null>) (offset:17)
               element: <testLibrary>::@enum::E::@getter::values
       typeAliases
-        #F9 F (nameOffset:32) (firstTokenOffset:24) (offset:32)
+        #F9 F (nameOffset:34) (firstTokenOffset:26) (offset:34)
           element: <testLibrary>::@typeAlias::F
       topLevelVariables
-        #F10 isOriginDeclaration isStatic c (nameOffset:39) (firstTokenOffset:39) (offset:39)
+        #F10 isOriginDeclaration isStatic c (nameOffset:41) (firstTokenOffset:41) (offset:41)
           element: <testLibrary>::@topLevelVariable::c
-        #F11 isOriginDeclaration isStatic e (nameOffset:44) (firstTokenOffset:44) (offset:44)
+        #F11 isOriginDeclaration isStatic e (nameOffset:46) (firstTokenOffset:46) (offset:46)
           element: <testLibrary>::@topLevelVariable::e
-        #F12 isOriginDeclaration isStatic f (nameOffset:49) (firstTokenOffset:49) (offset:49)
+        #F12 isOriginDeclaration isStatic f (nameOffset:51) (firstTokenOffset:51) (offset:51)
           element: <testLibrary>::@topLevelVariable::f
       getters
-        #F13 isCompleteDeclaration isOriginVariable isStatic c (nameOffset:<null>) (firstTokenOffset:<null>) (offset:39)
+        #F13 isCompleteDeclaration isOriginVariable isStatic c (nameOffset:<null>) (firstTokenOffset:<null>) (offset:41)
           element: <testLibrary>::@getter::c
-        #F14 isCompleteDeclaration isOriginVariable isStatic e (nameOffset:<null>) (firstTokenOffset:<null>) (offset:44)
+        #F14 isCompleteDeclaration isOriginVariable isStatic e (nameOffset:<null>) (firstTokenOffset:<null>) (offset:46)
           element: <testLibrary>::@getter::e
-        #F15 isCompleteDeclaration isOriginVariable isStatic f (nameOffset:<null>) (firstTokenOffset:<null>) (offset:49)
+        #F15 isCompleteDeclaration isOriginVariable isStatic f (nameOffset:<null>) (firstTokenOffset:<null>) (offset:51)
           element: <testLibrary>::@getter::f
       setters
-        #F16 isCompleteDeclaration isOriginVariable isStatic c (nameOffset:<null>) (firstTokenOffset:<null>) (offset:39)
+        #F16 isCompleteDeclaration isOriginVariable isStatic c (nameOffset:<null>) (firstTokenOffset:<null>) (offset:41)
           element: <testLibrary>::@setter::c
           formalParameters
-            #F17 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:39)
+            #F17 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:41)
               element: <testLibrary>::@setter::c::@formalParameter::value
-        #F18 isCompleteDeclaration isOriginVariable isStatic e (nameOffset:<null>) (firstTokenOffset:<null>) (offset:44)
+        #F18 isCompleteDeclaration isOriginVariable isStatic e (nameOffset:<null>) (firstTokenOffset:<null>) (offset:46)
           element: <testLibrary>::@setter::e
           formalParameters
-            #F19 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:44)
+            #F19 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:46)
               element: <testLibrary>::@setter::e::@formalParameter::value
-        #F20 isCompleteDeclaration isOriginVariable isStatic f (nameOffset:<null>) (firstTokenOffset:<null>) (offset:49)
+        #F20 isCompleteDeclaration isOriginVariable isStatic f (nameOffset:<null>) (firstTokenOffset:<null>) (offset:51)
           element: <testLibrary>::@setter::f
           formalParameters
-            #F21 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:49)
+            #F21 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:51)
               element: <testLibrary>::@setter::f::@formalParameter::value
   classes
     isSimplyBounded class C
@@ -5845,13 +5933,23 @@
   }
 
   test_type_reference_lib_to_part() async {
-    newFile(
-      '$testPackageLibPath/a.dart',
-      'part of l; class C {} enum E { v } typedef F();',
-    );
-    var library = await buildLibrary(
-      'library l; part "a.dart"; C c; E e; F f;',
-    );
+    newFile('$testPackageLibPath/a.dart', r'''
+part of l;
+class C {}
+enum E {
+  v
+}
+typedef F();
+''');
+    var library = await buildLibrary(r'''
+library l;
+
+part "a.dart";
+
+C c;
+E e;
+F f;
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -5863,37 +5961,37 @@
       parts
         part_0
           uri: package:test/a.dart
-          partKeywordOffset: 11
+          partKeywordOffset: 12
           unit: #F1
       topLevelVariables
-        #F2 isOriginDeclaration isStatic c (nameOffset:28) (firstTokenOffset:28) (offset:28)
+        #F2 isOriginDeclaration isStatic c (nameOffset:30) (firstTokenOffset:30) (offset:30)
           element: <testLibrary>::@topLevelVariable::c
-        #F3 isOriginDeclaration isStatic e (nameOffset:33) (firstTokenOffset:33) (offset:33)
+        #F3 isOriginDeclaration isStatic e (nameOffset:35) (firstTokenOffset:35) (offset:35)
           element: <testLibrary>::@topLevelVariable::e
-        #F4 isOriginDeclaration isStatic f (nameOffset:38) (firstTokenOffset:38) (offset:38)
+        #F4 isOriginDeclaration isStatic f (nameOffset:40) (firstTokenOffset:40) (offset:40)
           element: <testLibrary>::@topLevelVariable::f
       getters
-        #F5 isCompleteDeclaration isOriginVariable isStatic c (nameOffset:<null>) (firstTokenOffset:<null>) (offset:28)
+        #F5 isCompleteDeclaration isOriginVariable isStatic c (nameOffset:<null>) (firstTokenOffset:<null>) (offset:30)
           element: <testLibrary>::@getter::c
-        #F6 isCompleteDeclaration isOriginVariable isStatic e (nameOffset:<null>) (firstTokenOffset:<null>) (offset:33)
+        #F6 isCompleteDeclaration isOriginVariable isStatic e (nameOffset:<null>) (firstTokenOffset:<null>) (offset:35)
           element: <testLibrary>::@getter::e
-        #F7 isCompleteDeclaration isOriginVariable isStatic f (nameOffset:<null>) (firstTokenOffset:<null>) (offset:38)
+        #F7 isCompleteDeclaration isOriginVariable isStatic f (nameOffset:<null>) (firstTokenOffset:<null>) (offset:40)
           element: <testLibrary>::@getter::f
       setters
-        #F8 isCompleteDeclaration isOriginVariable isStatic c (nameOffset:<null>) (firstTokenOffset:<null>) (offset:28)
+        #F8 isCompleteDeclaration isOriginVariable isStatic c (nameOffset:<null>) (firstTokenOffset:<null>) (offset:30)
           element: <testLibrary>::@setter::c
           formalParameters
-            #F9 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:28)
+            #F9 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:30)
               element: <testLibrary>::@setter::c::@formalParameter::value
-        #F10 isCompleteDeclaration isOriginVariable isStatic e (nameOffset:<null>) (firstTokenOffset:<null>) (offset:33)
+        #F10 isCompleteDeclaration isOriginVariable isStatic e (nameOffset:<null>) (firstTokenOffset:<null>) (offset:35)
           element: <testLibrary>::@setter::e
           formalParameters
-            #F11 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:33)
+            #F11 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:35)
               element: <testLibrary>::@setter::e::@formalParameter::value
-        #F12 isCompleteDeclaration isOriginVariable isStatic f (nameOffset:<null>) (firstTokenOffset:<null>) (offset:38)
+        #F12 isCompleteDeclaration isOriginVariable isStatic f (nameOffset:<null>) (firstTokenOffset:<null>) (offset:40)
           element: <testLibrary>::@setter::f
           formalParameters
-            #F13 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:38)
+            #F13 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:40)
               element: <testLibrary>::@setter::f::@formalParameter::value
     #F1 package:test/a.dart
       element: <testLibrary>
@@ -5910,7 +6008,7 @@
         #F16 enum E (nameOffset:27) (firstTokenOffset:22) (offset:27)
           element: <testLibrary>::@enum::E
           fields
-            #F17 hasImplicitType hasInitializer isConst isEnumConstant isOriginDeclaration isStatic v (nameOffset:31) (firstTokenOffset:31) (offset:31)
+            #F17 hasImplicitType hasInitializer isConst isEnumConstant isOriginDeclaration isStatic v (nameOffset:33) (firstTokenOffset:33) (offset:33)
               element: <testLibrary>::@enum::E::@field::v
               initializer: expression_0
                 InstanceCreationExpression
@@ -5941,12 +6039,12 @@
               element: <testLibrary>::@enum::E::@constructor::new
               typeName: E
           getters
-            #F20 isCompleteDeclaration isOriginVariable isStatic v (nameOffset:<null>) (firstTokenOffset:<null>) (offset:31)
+            #F20 isCompleteDeclaration isOriginVariable isStatic v (nameOffset:<null>) (firstTokenOffset:<null>) (offset:33)
               element: <testLibrary>::@enum::E::@getter::v
             #F21 isCompleteDeclaration isOriginVariable isStatic values (nameOffset:<null>) (firstTokenOffset:<null>) (offset:27)
               element: <testLibrary>::@enum::E::@getter::values
       typeAliases
-        #F22 F (nameOffset:43) (firstTokenOffset:35) (offset:43)
+        #F22 F (nameOffset:45) (firstTokenOffset:37) (offset:45)
           element: <testLibrary>::@typeAlias::F
   classes
     isSimplyBounded class C
@@ -6069,10 +6167,23 @@
   }
 
   test_type_reference_part_to_lib() async {
-    newFile('$testPackageLibPath/a.dart', 'part of l; C c; E e; F f;');
-    var library = await buildLibrary(
-      'library l; part "a.dart"; class C {} enum E { v } typedef F();',
-    );
+    newFile('$testPackageLibPath/a.dart', r'''
+part of l;
+C c;
+E e;
+F f;
+''');
+    var library = await buildLibrary(r'''
+library l;
+
+part "a.dart";
+
+class C {}
+
+enum E { v }
+
+typedef F();
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -6084,20 +6195,20 @@
       parts
         part_0
           uri: package:test/a.dart
-          partKeywordOffset: 11
+          partKeywordOffset: 12
           unit: #F1
       classes
-        #F2 class C (nameOffset:32) (firstTokenOffset:26) (offset:32)
+        #F2 class C (nameOffset:34) (firstTokenOffset:28) (offset:34)
           element: <testLibrary>::@class::C
           constructors
-            #F3 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:32)
+            #F3 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:34)
               element: <testLibrary>::@class::C::@constructor::new
               typeName: C
       enums
-        #F4 enum E (nameOffset:42) (firstTokenOffset:37) (offset:42)
+        #F4 enum E (nameOffset:45) (firstTokenOffset:40) (offset:45)
           element: <testLibrary>::@enum::E
           fields
-            #F5 hasImplicitType hasInitializer isConst isEnumConstant isOriginDeclaration isStatic v (nameOffset:46) (firstTokenOffset:46) (offset:46)
+            #F5 hasImplicitType hasInitializer isConst isEnumConstant isOriginDeclaration isStatic v (nameOffset:49) (firstTokenOffset:49) (offset:49)
               element: <testLibrary>::@enum::E::@field::v
               initializer: expression_0
                 InstanceCreationExpression
@@ -6111,7 +6222,7 @@
                     leftParenthesis: ( @0
                     rightParenthesis: ) @0
                   staticType: E
-            #F6 isConst isOriginEnumValues isStatic values (nameOffset:<null>) (firstTokenOffset:<null>) (offset:42)
+            #F6 isConst isOriginEnumValues isStatic values (nameOffset:<null>) (firstTokenOffset:<null>) (offset:45)
               element: <testLibrary>::@enum::E::@field::values
               initializer: expression_1
                 ListLiteral
@@ -6124,16 +6235,16 @@
                   rightBracket: ] @0
                   staticType: List<E>
           constructors
-            #F7 isConst isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:42)
+            #F7 isConst isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:45)
               element: <testLibrary>::@enum::E::@constructor::new
               typeName: E
           getters
-            #F8 isCompleteDeclaration isOriginVariable isStatic v (nameOffset:<null>) (firstTokenOffset:<null>) (offset:46)
+            #F8 isCompleteDeclaration isOriginVariable isStatic v (nameOffset:<null>) (firstTokenOffset:<null>) (offset:49)
               element: <testLibrary>::@enum::E::@getter::v
-            #F9 isCompleteDeclaration isOriginVariable isStatic values (nameOffset:<null>) (firstTokenOffset:<null>) (offset:42)
+            #F9 isCompleteDeclaration isOriginVariable isStatic values (nameOffset:<null>) (firstTokenOffset:<null>) (offset:45)
               element: <testLibrary>::@enum::E::@getter::values
       typeAliases
-        #F10 F (nameOffset:58) (firstTokenOffset:50) (offset:58)
+        #F10 F (nameOffset:62) (firstTokenOffset:54) (offset:62)
           element: <testLibrary>::@typeAlias::F
     #F1 package:test/a.dart
       element: <testLibrary>
@@ -6290,14 +6401,26 @@
   }
 
   test_type_reference_part_to_other_part() async {
-    newFile(
-      '$testPackageLibPath/a.dart',
-      'part of l; class C {} enum E { v } typedef F();',
-    );
-    newFile('$testPackageLibPath/b.dart', 'part of l; C c; E e; F f;');
-    var library = await buildLibrary(
-      'library l; part "a.dart"; part "b.dart";',
-    );
+    newFile('$testPackageLibPath/a.dart', r'''
+part of l;
+class C {}
+enum E {
+  v
+}
+typedef F();
+''');
+    newFile('$testPackageLibPath/b.dart', r'''
+part of l;
+C c;
+E e;
+F f;
+''');
+    var library = await buildLibrary(r'''
+library l;
+
+part "a.dart";
+part "b.dart";
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -6309,11 +6432,11 @@
       parts
         part_0
           uri: package:test/a.dart
-          partKeywordOffset: 11
+          partKeywordOffset: 12
           unit: #F1
         part_1
           uri: package:test/b.dart
-          partKeywordOffset: 26
+          partKeywordOffset: 27
           unit: #F2
     #F1 package:test/a.dart
       element: <testLibrary>
@@ -6331,7 +6454,7 @@
         #F5 enum E (nameOffset:27) (firstTokenOffset:22) (offset:27)
           element: <testLibrary>::@enum::E
           fields
-            #F6 hasImplicitType hasInitializer isConst isEnumConstant isOriginDeclaration isStatic v (nameOffset:31) (firstTokenOffset:31) (offset:31)
+            #F6 hasImplicitType hasInitializer isConst isEnumConstant isOriginDeclaration isStatic v (nameOffset:33) (firstTokenOffset:33) (offset:33)
               element: <testLibrary>::@enum::E::@field::v
               initializer: expression_0
                 InstanceCreationExpression
@@ -6362,12 +6485,12 @@
               element: <testLibrary>::@enum::E::@constructor::new
               typeName: E
           getters
-            #F9 isCompleteDeclaration isOriginVariable isStatic v (nameOffset:<null>) (firstTokenOffset:<null>) (offset:31)
+            #F9 isCompleteDeclaration isOriginVariable isStatic v (nameOffset:<null>) (firstTokenOffset:<null>) (offset:33)
               element: <testLibrary>::@enum::E::@getter::v
             #F10 isCompleteDeclaration isOriginVariable isStatic values (nameOffset:<null>) (firstTokenOffset:<null>) (offset:27)
               element: <testLibrary>::@enum::E::@getter::values
       typeAliases
-        #F11 F (nameOffset:43) (firstTokenOffset:35) (offset:43)
+        #F11 F (nameOffset:45) (firstTokenOffset:37) (offset:45)
           element: <testLibrary>::@typeAlias::F
     #F2 package:test/b.dart
       element: <testLibrary>
@@ -6524,11 +6647,22 @@
   }
 
   test_type_reference_part_to_part() async {
-    newFile(
-      '$testPackageLibPath/a.dart',
-      'part of l; class C {} enum E { v } typedef F(); C c; E e; F f;',
-    );
-    var library = await buildLibrary('library l; part "a.dart";');
+    newFile('$testPackageLibPath/a.dart', r'''
+part of l;
+class C {}
+enum E {
+  v
+}
+typedef F();
+C c;
+E e;
+F f;
+''');
+    var library = await buildLibrary(r'''
+library l;
+
+part "a.dart";
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -6540,7 +6674,7 @@
       parts
         part_0
           uri: package:test/a.dart
-          partKeywordOffset: 11
+          partKeywordOffset: 12
           unit: #F1
     #F1 package:test/a.dart
       element: <testLibrary>
@@ -6557,7 +6691,7 @@
         #F4 enum E (nameOffset:27) (firstTokenOffset:22) (offset:27)
           element: <testLibrary>::@enum::E
           fields
-            #F5 hasImplicitType hasInitializer isConst isEnumConstant isOriginDeclaration isStatic v (nameOffset:31) (firstTokenOffset:31) (offset:31)
+            #F5 hasImplicitType hasInitializer isConst isEnumConstant isOriginDeclaration isStatic v (nameOffset:33) (firstTokenOffset:33) (offset:33)
               element: <testLibrary>::@enum::E::@field::v
               initializer: expression_0
                 InstanceCreationExpression
@@ -6588,42 +6722,42 @@
               element: <testLibrary>::@enum::E::@constructor::new
               typeName: E
           getters
-            #F8 isCompleteDeclaration isOriginVariable isStatic v (nameOffset:<null>) (firstTokenOffset:<null>) (offset:31)
+            #F8 isCompleteDeclaration isOriginVariable isStatic v (nameOffset:<null>) (firstTokenOffset:<null>) (offset:33)
               element: <testLibrary>::@enum::E::@getter::v
             #F9 isCompleteDeclaration isOriginVariable isStatic values (nameOffset:<null>) (firstTokenOffset:<null>) (offset:27)
               element: <testLibrary>::@enum::E::@getter::values
       typeAliases
-        #F10 F (nameOffset:43) (firstTokenOffset:35) (offset:43)
+        #F10 F (nameOffset:45) (firstTokenOffset:37) (offset:45)
           element: <testLibrary>::@typeAlias::F
       topLevelVariables
-        #F11 isOriginDeclaration isStatic c (nameOffset:50) (firstTokenOffset:50) (offset:50)
+        #F11 isOriginDeclaration isStatic c (nameOffset:52) (firstTokenOffset:52) (offset:52)
           element: <testLibrary>::@topLevelVariable::c
-        #F12 isOriginDeclaration isStatic e (nameOffset:55) (firstTokenOffset:55) (offset:55)
+        #F12 isOriginDeclaration isStatic e (nameOffset:57) (firstTokenOffset:57) (offset:57)
           element: <testLibrary>::@topLevelVariable::e
-        #F13 isOriginDeclaration isStatic f (nameOffset:60) (firstTokenOffset:60) (offset:60)
+        #F13 isOriginDeclaration isStatic f (nameOffset:62) (firstTokenOffset:62) (offset:62)
           element: <testLibrary>::@topLevelVariable::f
       getters
-        #F14 isCompleteDeclaration isOriginVariable isStatic c (nameOffset:<null>) (firstTokenOffset:<null>) (offset:50)
+        #F14 isCompleteDeclaration isOriginVariable isStatic c (nameOffset:<null>) (firstTokenOffset:<null>) (offset:52)
           element: <testLibrary>::@getter::c
-        #F15 isCompleteDeclaration isOriginVariable isStatic e (nameOffset:<null>) (firstTokenOffset:<null>) (offset:55)
+        #F15 isCompleteDeclaration isOriginVariable isStatic e (nameOffset:<null>) (firstTokenOffset:<null>) (offset:57)
           element: <testLibrary>::@getter::e
-        #F16 isCompleteDeclaration isOriginVariable isStatic f (nameOffset:<null>) (firstTokenOffset:<null>) (offset:60)
+        #F16 isCompleteDeclaration isOriginVariable isStatic f (nameOffset:<null>) (firstTokenOffset:<null>) (offset:62)
           element: <testLibrary>::@getter::f
       setters
-        #F17 isCompleteDeclaration isOriginVariable isStatic c (nameOffset:<null>) (firstTokenOffset:<null>) (offset:50)
+        #F17 isCompleteDeclaration isOriginVariable isStatic c (nameOffset:<null>) (firstTokenOffset:<null>) (offset:52)
           element: <testLibrary>::@setter::c
           formalParameters
-            #F18 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:50)
+            #F18 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:52)
               element: <testLibrary>::@setter::c::@formalParameter::value
-        #F19 isCompleteDeclaration isOriginVariable isStatic e (nameOffset:<null>) (firstTokenOffset:<null>) (offset:55)
+        #F19 isCompleteDeclaration isOriginVariable isStatic e (nameOffset:<null>) (firstTokenOffset:<null>) (offset:57)
           element: <testLibrary>::@setter::e
           formalParameters
-            #F20 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:55)
+            #F20 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:57)
               element: <testLibrary>::@setter::e::@formalParameter::value
-        #F21 isCompleteDeclaration isOriginVariable isStatic f (nameOffset:<null>) (firstTokenOffset:<null>) (offset:60)
+        #F21 isCompleteDeclaration isOriginVariable isStatic f (nameOffset:<null>) (firstTokenOffset:<null>) (offset:62)
           element: <testLibrary>::@setter::f
           formalParameters
-            #F22 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:60)
+            #F22 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:62)
               element: <testLibrary>::@setter::f::@formalParameter::value
   classes
     isSimplyBounded class C
@@ -6746,7 +6880,11 @@
   }
 
   test_type_reference_to_class() async {
-    var library = await buildLibrary('class C {} C c;');
+    var library = await buildLibrary(r'''
+class C {}
+
+C c;
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -6761,16 +6899,16 @@
               element: <testLibrary>::@class::C::@constructor::new
               typeName: C
       topLevelVariables
-        #F3 isOriginDeclaration isStatic c (nameOffset:13) (firstTokenOffset:13) (offset:13)
+        #F3 isOriginDeclaration isStatic c (nameOffset:14) (firstTokenOffset:14) (offset:14)
           element: <testLibrary>::@topLevelVariable::c
       getters
-        #F4 isCompleteDeclaration isOriginVariable isStatic c (nameOffset:<null>) (firstTokenOffset:<null>) (offset:13)
+        #F4 isCompleteDeclaration isOriginVariable isStatic c (nameOffset:<null>) (firstTokenOffset:<null>) (offset:14)
           element: <testLibrary>::@getter::c
       setters
-        #F5 isCompleteDeclaration isOriginVariable isStatic c (nameOffset:<null>) (firstTokenOffset:<null>) (offset:13)
+        #F5 isCompleteDeclaration isOriginVariable isStatic c (nameOffset:<null>) (firstTokenOffset:<null>) (offset:14)
           element: <testLibrary>::@setter::c
           formalParameters
-            #F6 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:13)
+            #F6 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:14)
               element: <testLibrary>::@setter::c::@formalParameter::value
   classes
     isSimplyBounded class C
@@ -6807,7 +6945,11 @@
   }
 
   test_type_reference_to_class_with_type_arguments() async {
-    var library = await buildLibrary('class C<T, U> {} C<int, String> c;');
+    var library = await buildLibrary(r'''
+class C<T, U> {}
+
+C<int, String> c;
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -6827,16 +6969,16 @@
               element: <testLibrary>::@class::C::@constructor::new
               typeName: C
       topLevelVariables
-        #F5 isOriginDeclaration isStatic c (nameOffset:32) (firstTokenOffset:32) (offset:32)
+        #F5 isOriginDeclaration isStatic c (nameOffset:33) (firstTokenOffset:33) (offset:33)
           element: <testLibrary>::@topLevelVariable::c
       getters
-        #F6 isCompleteDeclaration isOriginVariable isStatic c (nameOffset:<null>) (firstTokenOffset:<null>) (offset:32)
+        #F6 isCompleteDeclaration isOriginVariable isStatic c (nameOffset:<null>) (firstTokenOffset:<null>) (offset:33)
           element: <testLibrary>::@getter::c
       setters
-        #F7 isCompleteDeclaration isOriginVariable isStatic c (nameOffset:<null>) (firstTokenOffset:<null>) (offset:32)
+        #F7 isCompleteDeclaration isOriginVariable isStatic c (nameOffset:<null>) (firstTokenOffset:<null>) (offset:33)
           element: <testLibrary>::@setter::c
           formalParameters
-            #F8 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:32)
+            #F8 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:33)
               element: <testLibrary>::@setter::c::@formalParameter::value
   classes
     isSimplyBounded class C
@@ -6878,7 +7020,11 @@
   }
 
   test_type_reference_to_class_with_type_arguments_implicit() async {
-    var library = await buildLibrary('class C<T, U> {} C c;');
+    var library = await buildLibrary(r'''
+class C<T, U> {}
+
+C c;
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -6898,16 +7044,16 @@
               element: <testLibrary>::@class::C::@constructor::new
               typeName: C
       topLevelVariables
-        #F5 isOriginDeclaration isStatic c (nameOffset:19) (firstTokenOffset:19) (offset:19)
+        #F5 isOriginDeclaration isStatic c (nameOffset:20) (firstTokenOffset:20) (offset:20)
           element: <testLibrary>::@topLevelVariable::c
       getters
-        #F6 isCompleteDeclaration isOriginVariable isStatic c (nameOffset:<null>) (firstTokenOffset:<null>) (offset:19)
+        #F6 isCompleteDeclaration isOriginVariable isStatic c (nameOffset:<null>) (firstTokenOffset:<null>) (offset:20)
           element: <testLibrary>::@getter::c
       setters
-        #F7 isCompleteDeclaration isOriginVariable isStatic c (nameOffset:<null>) (firstTokenOffset:<null>) (offset:19)
+        #F7 isCompleteDeclaration isOriginVariable isStatic c (nameOffset:<null>) (firstTokenOffset:<null>) (offset:20)
           element: <testLibrary>::@setter::c
           formalParameters
-            #F8 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:19)
+            #F8 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:20)
               element: <testLibrary>::@setter::c::@formalParameter::value
   classes
     isSimplyBounded class C
@@ -6949,7 +7095,11 @@
   }
 
   test_type_reference_to_enum() async {
-    var library = await buildLibrary('enum E { v } E e;');
+    var library = await buildLibrary(r'''
+enum E { v }
+
+E e;
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -6996,16 +7146,16 @@
             #F6 isCompleteDeclaration isOriginVariable isStatic values (nameOffset:<null>) (firstTokenOffset:<null>) (offset:5)
               element: <testLibrary>::@enum::E::@getter::values
       topLevelVariables
-        #F7 isOriginDeclaration isStatic e (nameOffset:15) (firstTokenOffset:15) (offset:15)
+        #F7 isOriginDeclaration isStatic e (nameOffset:16) (firstTokenOffset:16) (offset:16)
           element: <testLibrary>::@topLevelVariable::e
       getters
-        #F8 isCompleteDeclaration isOriginVariable isStatic e (nameOffset:<null>) (firstTokenOffset:<null>) (offset:15)
+        #F8 isCompleteDeclaration isOriginVariable isStatic e (nameOffset:<null>) (firstTokenOffset:<null>) (offset:16)
           element: <testLibrary>::@getter::e
       setters
-        #F9 isCompleteDeclaration isOriginVariable isStatic e (nameOffset:<null>) (firstTokenOffset:<null>) (offset:15)
+        #F9 isCompleteDeclaration isOriginVariable isStatic e (nameOffset:<null>) (firstTokenOffset:<null>) (offset:16)
           element: <testLibrary>::@setter::e
           formalParameters
-            #F10 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:15)
+            #F10 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:16)
               element: <testLibrary>::@setter::e::@formalParameter::value
   enums
     isSimplyBounded enum E
@@ -7072,11 +7222,20 @@
   }
 
   test_type_reference_to_import() async {
-    newFile(
-      '$testPackageLibPath/a.dart',
-      'class C {} enum E { v } typedef F();',
-    );
-    var library = await buildLibrary('import "a.dart"; C c; E e; F f;');
+    newFile('$testPackageLibPath/a.dart', r'''
+class C {}
+enum E {
+  v
+}
+typedef F();
+''');
+    var library = await buildLibrary(r'''
+import "a.dart";
+
+C c;
+E e;
+F f;
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -7086,34 +7245,34 @@
       libraryImports
         package:test/a.dart
       topLevelVariables
-        #F1 isOriginDeclaration isStatic c (nameOffset:19) (firstTokenOffset:19) (offset:19)
+        #F1 isOriginDeclaration isStatic c (nameOffset:20) (firstTokenOffset:20) (offset:20)
           element: <testLibrary>::@topLevelVariable::c
-        #F2 isOriginDeclaration isStatic e (nameOffset:24) (firstTokenOffset:24) (offset:24)
+        #F2 isOriginDeclaration isStatic e (nameOffset:25) (firstTokenOffset:25) (offset:25)
           element: <testLibrary>::@topLevelVariable::e
-        #F3 isOriginDeclaration isStatic f (nameOffset:29) (firstTokenOffset:29) (offset:29)
+        #F3 isOriginDeclaration isStatic f (nameOffset:30) (firstTokenOffset:30) (offset:30)
           element: <testLibrary>::@topLevelVariable::f
       getters
-        #F4 isCompleteDeclaration isOriginVariable isStatic c (nameOffset:<null>) (firstTokenOffset:<null>) (offset:19)
+        #F4 isCompleteDeclaration isOriginVariable isStatic c (nameOffset:<null>) (firstTokenOffset:<null>) (offset:20)
           element: <testLibrary>::@getter::c
-        #F5 isCompleteDeclaration isOriginVariable isStatic e (nameOffset:<null>) (firstTokenOffset:<null>) (offset:24)
+        #F5 isCompleteDeclaration isOriginVariable isStatic e (nameOffset:<null>) (firstTokenOffset:<null>) (offset:25)
           element: <testLibrary>::@getter::e
-        #F6 isCompleteDeclaration isOriginVariable isStatic f (nameOffset:<null>) (firstTokenOffset:<null>) (offset:29)
+        #F6 isCompleteDeclaration isOriginVariable isStatic f (nameOffset:<null>) (firstTokenOffset:<null>) (offset:30)
           element: <testLibrary>::@getter::f
       setters
-        #F7 isCompleteDeclaration isOriginVariable isStatic c (nameOffset:<null>) (firstTokenOffset:<null>) (offset:19)
+        #F7 isCompleteDeclaration isOriginVariable isStatic c (nameOffset:<null>) (firstTokenOffset:<null>) (offset:20)
           element: <testLibrary>::@setter::c
           formalParameters
-            #F8 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:19)
+            #F8 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:20)
               element: <testLibrary>::@setter::c::@formalParameter::value
-        #F9 isCompleteDeclaration isOriginVariable isStatic e (nameOffset:<null>) (firstTokenOffset:<null>) (offset:24)
+        #F9 isCompleteDeclaration isOriginVariable isStatic e (nameOffset:<null>) (firstTokenOffset:<null>) (offset:25)
           element: <testLibrary>::@setter::e
           formalParameters
-            #F10 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:24)
+            #F10 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:25)
               element: <testLibrary>::@setter::e::@formalParameter::value
-        #F11 isCompleteDeclaration isOriginVariable isStatic f (nameOffset:<null>) (firstTokenOffset:<null>) (offset:29)
+        #F11 isCompleteDeclaration isOriginVariable isStatic f (nameOffset:<null>) (firstTokenOffset:<null>) (offset:30)
           element: <testLibrary>::@setter::f
           formalParameters
-            #F12 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:29)
+            #F12 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:30)
               element: <testLibrary>::@setter::f::@formalParameter::value
   topLevelVariables
     isOriginDeclaration isStatic c
@@ -7185,12 +7344,23 @@
   }
 
   test_type_reference_to_import_export() async {
-    newFile('$testPackageLibPath/a.dart', 'export "b.dart";');
-    newFile(
-      '$testPackageLibPath/b.dart',
-      'class C {} enum E { v } typedef F();',
-    );
-    var library = await buildLibrary('import "a.dart"; C c; E e; F f;');
+    newFile('$testPackageLibPath/a.dart', r'''
+export "b.dart";
+''');
+    newFile('$testPackageLibPath/b.dart', r'''
+class C {}
+enum E {
+  v
+}
+typedef F();
+''');
+    var library = await buildLibrary(r'''
+import "a.dart";
+
+C c;
+E e;
+F f;
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -7200,34 +7370,34 @@
       libraryImports
         package:test/a.dart
       topLevelVariables
-        #F1 isOriginDeclaration isStatic c (nameOffset:19) (firstTokenOffset:19) (offset:19)
+        #F1 isOriginDeclaration isStatic c (nameOffset:20) (firstTokenOffset:20) (offset:20)
           element: <testLibrary>::@topLevelVariable::c
-        #F2 isOriginDeclaration isStatic e (nameOffset:24) (firstTokenOffset:24) (offset:24)
+        #F2 isOriginDeclaration isStatic e (nameOffset:25) (firstTokenOffset:25) (offset:25)
           element: <testLibrary>::@topLevelVariable::e
-        #F3 isOriginDeclaration isStatic f (nameOffset:29) (firstTokenOffset:29) (offset:29)
+        #F3 isOriginDeclaration isStatic f (nameOffset:30) (firstTokenOffset:30) (offset:30)
           element: <testLibrary>::@topLevelVariable::f
       getters
-        #F4 isCompleteDeclaration isOriginVariable isStatic c (nameOffset:<null>) (firstTokenOffset:<null>) (offset:19)
+        #F4 isCompleteDeclaration isOriginVariable isStatic c (nameOffset:<null>) (firstTokenOffset:<null>) (offset:20)
           element: <testLibrary>::@getter::c
-        #F5 isCompleteDeclaration isOriginVariable isStatic e (nameOffset:<null>) (firstTokenOffset:<null>) (offset:24)
+        #F5 isCompleteDeclaration isOriginVariable isStatic e (nameOffset:<null>) (firstTokenOffset:<null>) (offset:25)
           element: <testLibrary>::@getter::e
-        #F6 isCompleteDeclaration isOriginVariable isStatic f (nameOffset:<null>) (firstTokenOffset:<null>) (offset:29)
+        #F6 isCompleteDeclaration isOriginVariable isStatic f (nameOffset:<null>) (firstTokenOffset:<null>) (offset:30)
           element: <testLibrary>::@getter::f
       setters
-        #F7 isCompleteDeclaration isOriginVariable isStatic c (nameOffset:<null>) (firstTokenOffset:<null>) (offset:19)
+        #F7 isCompleteDeclaration isOriginVariable isStatic c (nameOffset:<null>) (firstTokenOffset:<null>) (offset:20)
           element: <testLibrary>::@setter::c
           formalParameters
-            #F8 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:19)
+            #F8 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:20)
               element: <testLibrary>::@setter::c::@formalParameter::value
-        #F9 isCompleteDeclaration isOriginVariable isStatic e (nameOffset:<null>) (firstTokenOffset:<null>) (offset:24)
+        #F9 isCompleteDeclaration isOriginVariable isStatic e (nameOffset:<null>) (firstTokenOffset:<null>) (offset:25)
           element: <testLibrary>::@setter::e
           formalParameters
-            #F10 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:24)
+            #F10 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:25)
               element: <testLibrary>::@setter::e::@formalParameter::value
-        #F11 isCompleteDeclaration isOriginVariable isStatic f (nameOffset:<null>) (firstTokenOffset:<null>) (offset:29)
+        #F11 isCompleteDeclaration isOriginVariable isStatic f (nameOffset:<null>) (firstTokenOffset:<null>) (offset:30)
           element: <testLibrary>::@setter::f
           formalParameters
-            #F12 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:29)
+            #F12 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:30)
               element: <testLibrary>::@setter::f::@formalParameter::value
   topLevelVariables
     isOriginDeclaration isStatic c
@@ -7299,13 +7469,26 @@
   }
 
   test_type_reference_to_import_export_export() async {
-    newFile('$testPackageLibPath/a.dart', 'export "b.dart";');
-    newFile('$testPackageLibPath/b.dart', 'export "c.dart";');
-    newFile(
-      '$testPackageLibPath/c.dart',
-      'class C {} enum E { v } typedef F();',
-    );
-    var library = await buildLibrary('import "a.dart"; C c; E e; F f;');
+    newFile('$testPackageLibPath/a.dart', r'''
+export "b.dart";
+''');
+    newFile('$testPackageLibPath/b.dart', r'''
+export "c.dart";
+''');
+    newFile('$testPackageLibPath/c.dart', r'''
+class C {}
+enum E {
+  v
+}
+typedef F();
+''');
+    var library = await buildLibrary(r'''
+import "a.dart";
+
+C c;
+E e;
+F f;
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -7315,34 +7498,34 @@
       libraryImports
         package:test/a.dart
       topLevelVariables
-        #F1 isOriginDeclaration isStatic c (nameOffset:19) (firstTokenOffset:19) (offset:19)
+        #F1 isOriginDeclaration isStatic c (nameOffset:20) (firstTokenOffset:20) (offset:20)
           element: <testLibrary>::@topLevelVariable::c
-        #F2 isOriginDeclaration isStatic e (nameOffset:24) (firstTokenOffset:24) (offset:24)
+        #F2 isOriginDeclaration isStatic e (nameOffset:25) (firstTokenOffset:25) (offset:25)
           element: <testLibrary>::@topLevelVariable::e
-        #F3 isOriginDeclaration isStatic f (nameOffset:29) (firstTokenOffset:29) (offset:29)
+        #F3 isOriginDeclaration isStatic f (nameOffset:30) (firstTokenOffset:30) (offset:30)
           element: <testLibrary>::@topLevelVariable::f
       getters
-        #F4 isCompleteDeclaration isOriginVariable isStatic c (nameOffset:<null>) (firstTokenOffset:<null>) (offset:19)
+        #F4 isCompleteDeclaration isOriginVariable isStatic c (nameOffset:<null>) (firstTokenOffset:<null>) (offset:20)
           element: <testLibrary>::@getter::c
-        #F5 isCompleteDeclaration isOriginVariable isStatic e (nameOffset:<null>) (firstTokenOffset:<null>) (offset:24)
+        #F5 isCompleteDeclaration isOriginVariable isStatic e (nameOffset:<null>) (firstTokenOffset:<null>) (offset:25)
           element: <testLibrary>::@getter::e
-        #F6 isCompleteDeclaration isOriginVariable isStatic f (nameOffset:<null>) (firstTokenOffset:<null>) (offset:29)
+        #F6 isCompleteDeclaration isOriginVariable isStatic f (nameOffset:<null>) (firstTokenOffset:<null>) (offset:30)
           element: <testLibrary>::@getter::f
       setters
-        #F7 isCompleteDeclaration isOriginVariable isStatic c (nameOffset:<null>) (firstTokenOffset:<null>) (offset:19)
+        #F7 isCompleteDeclaration isOriginVariable isStatic c (nameOffset:<null>) (firstTokenOffset:<null>) (offset:20)
           element: <testLibrary>::@setter::c
           formalParameters
-            #F8 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:19)
+            #F8 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:20)
               element: <testLibrary>::@setter::c::@formalParameter::value
-        #F9 isCompleteDeclaration isOriginVariable isStatic e (nameOffset:<null>) (firstTokenOffset:<null>) (offset:24)
+        #F9 isCompleteDeclaration isOriginVariable isStatic e (nameOffset:<null>) (firstTokenOffset:<null>) (offset:25)
           element: <testLibrary>::@setter::e
           formalParameters
-            #F10 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:24)
+            #F10 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:25)
               element: <testLibrary>::@setter::e::@formalParameter::value
-        #F11 isCompleteDeclaration isOriginVariable isStatic f (nameOffset:<null>) (firstTokenOffset:<null>) (offset:29)
+        #F11 isCompleteDeclaration isOriginVariable isStatic f (nameOffset:<null>) (firstTokenOffset:<null>) (offset:30)
           element: <testLibrary>::@setter::f
           formalParameters
-            #F12 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:29)
+            #F12 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:30)
               element: <testLibrary>::@setter::f::@formalParameter::value
   topLevelVariables
     isOriginDeclaration isStatic c
@@ -7414,13 +7597,26 @@
   }
 
   test_type_reference_to_import_export_export_in_subdirs() async {
-    newFile('$testPackageLibPath/a/a.dart', 'export "b/b.dart";');
-    newFile('$testPackageLibPath/a/b/b.dart', 'export "../c/c.dart";');
-    newFile(
-      '$testPackageLibPath/a/c/c.dart',
-      'class C {} enum E { v } typedef F();',
-    );
-    var library = await buildLibrary('import "a/a.dart"; C c; E e; F f;');
+    newFile('$testPackageLibPath/a/a.dart', r'''
+export "b/b.dart";
+''');
+    newFile('$testPackageLibPath/a/b/b.dart', r'''
+export "../c/c.dart";
+''');
+    newFile('$testPackageLibPath/a/c/c.dart', r'''
+class C {}
+enum E {
+  v
+}
+typedef F();
+''');
+    var library = await buildLibrary(r'''
+import "a/a.dart";
+
+C c;
+E e;
+F f;
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -7430,34 +7626,34 @@
       libraryImports
         package:test/a/a.dart
       topLevelVariables
-        #F1 isOriginDeclaration isStatic c (nameOffset:21) (firstTokenOffset:21) (offset:21)
+        #F1 isOriginDeclaration isStatic c (nameOffset:22) (firstTokenOffset:22) (offset:22)
           element: <testLibrary>::@topLevelVariable::c
-        #F2 isOriginDeclaration isStatic e (nameOffset:26) (firstTokenOffset:26) (offset:26)
+        #F2 isOriginDeclaration isStatic e (nameOffset:27) (firstTokenOffset:27) (offset:27)
           element: <testLibrary>::@topLevelVariable::e
-        #F3 isOriginDeclaration isStatic f (nameOffset:31) (firstTokenOffset:31) (offset:31)
+        #F3 isOriginDeclaration isStatic f (nameOffset:32) (firstTokenOffset:32) (offset:32)
           element: <testLibrary>::@topLevelVariable::f
       getters
-        #F4 isCompleteDeclaration isOriginVariable isStatic c (nameOffset:<null>) (firstTokenOffset:<null>) (offset:21)
+        #F4 isCompleteDeclaration isOriginVariable isStatic c (nameOffset:<null>) (firstTokenOffset:<null>) (offset:22)
           element: <testLibrary>::@getter::c
-        #F5 isCompleteDeclaration isOriginVariable isStatic e (nameOffset:<null>) (firstTokenOffset:<null>) (offset:26)
+        #F5 isCompleteDeclaration isOriginVariable isStatic e (nameOffset:<null>) (firstTokenOffset:<null>) (offset:27)
           element: <testLibrary>::@getter::e
-        #F6 isCompleteDeclaration isOriginVariable isStatic f (nameOffset:<null>) (firstTokenOffset:<null>) (offset:31)
+        #F6 isCompleteDeclaration isOriginVariable isStatic f (nameOffset:<null>) (firstTokenOffset:<null>) (offset:32)
           element: <testLibrary>::@getter::f
       setters
-        #F7 isCompleteDeclaration isOriginVariable isStatic c (nameOffset:<null>) (firstTokenOffset:<null>) (offset:21)
+        #F7 isCompleteDeclaration isOriginVariable isStatic c (nameOffset:<null>) (firstTokenOffset:<null>) (offset:22)
           element: <testLibrary>::@setter::c
           formalParameters
-            #F8 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:21)
+            #F8 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:22)
               element: <testLibrary>::@setter::c::@formalParameter::value
-        #F9 isCompleteDeclaration isOriginVariable isStatic e (nameOffset:<null>) (firstTokenOffset:<null>) (offset:26)
+        #F9 isCompleteDeclaration isOriginVariable isStatic e (nameOffset:<null>) (firstTokenOffset:<null>) (offset:27)
           element: <testLibrary>::@setter::e
           formalParameters
-            #F10 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:26)
+            #F10 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:27)
               element: <testLibrary>::@setter::e::@formalParameter::value
-        #F11 isCompleteDeclaration isOriginVariable isStatic f (nameOffset:<null>) (firstTokenOffset:<null>) (offset:31)
+        #F11 isCompleteDeclaration isOriginVariable isStatic f (nameOffset:<null>) (firstTokenOffset:<null>) (offset:32)
           element: <testLibrary>::@setter::f
           formalParameters
-            #F12 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:31)
+            #F12 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:32)
               element: <testLibrary>::@setter::f::@formalParameter::value
   topLevelVariables
     isOriginDeclaration isStatic c
@@ -7529,12 +7725,23 @@
   }
 
   test_type_reference_to_import_export_in_subdirs() async {
-    newFile('$testPackageLibPath/a/a.dart', 'export "b/b.dart";');
-    newFile(
-      '$testPackageLibPath/a/b/b.dart',
-      'class C {} enum E { v } typedef F();',
-    );
-    var library = await buildLibrary('import "a/a.dart"; C c; E e; F f;');
+    newFile('$testPackageLibPath/a/a.dart', r'''
+export "b/b.dart";
+''');
+    newFile('$testPackageLibPath/a/b/b.dart', r'''
+class C {}
+enum E {
+  v
+}
+typedef F();
+''');
+    var library = await buildLibrary(r'''
+import "a/a.dart";
+
+C c;
+E e;
+F f;
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -7544,34 +7751,34 @@
       libraryImports
         package:test/a/a.dart
       topLevelVariables
-        #F1 isOriginDeclaration isStatic c (nameOffset:21) (firstTokenOffset:21) (offset:21)
+        #F1 isOriginDeclaration isStatic c (nameOffset:22) (firstTokenOffset:22) (offset:22)
           element: <testLibrary>::@topLevelVariable::c
-        #F2 isOriginDeclaration isStatic e (nameOffset:26) (firstTokenOffset:26) (offset:26)
+        #F2 isOriginDeclaration isStatic e (nameOffset:27) (firstTokenOffset:27) (offset:27)
           element: <testLibrary>::@topLevelVariable::e
-        #F3 isOriginDeclaration isStatic f (nameOffset:31) (firstTokenOffset:31) (offset:31)
+        #F3 isOriginDeclaration isStatic f (nameOffset:32) (firstTokenOffset:32) (offset:32)
           element: <testLibrary>::@topLevelVariable::f
       getters
-        #F4 isCompleteDeclaration isOriginVariable isStatic c (nameOffset:<null>) (firstTokenOffset:<null>) (offset:21)
+        #F4 isCompleteDeclaration isOriginVariable isStatic c (nameOffset:<null>) (firstTokenOffset:<null>) (offset:22)
           element: <testLibrary>::@getter::c
-        #F5 isCompleteDeclaration isOriginVariable isStatic e (nameOffset:<null>) (firstTokenOffset:<null>) (offset:26)
+        #F5 isCompleteDeclaration isOriginVariable isStatic e (nameOffset:<null>) (firstTokenOffset:<null>) (offset:27)
           element: <testLibrary>::@getter::e
-        #F6 isCompleteDeclaration isOriginVariable isStatic f (nameOffset:<null>) (firstTokenOffset:<null>) (offset:31)
+        #F6 isCompleteDeclaration isOriginVariable isStatic f (nameOffset:<null>) (firstTokenOffset:<null>) (offset:32)
           element: <testLibrary>::@getter::f
       setters
-        #F7 isCompleteDeclaration isOriginVariable isStatic c (nameOffset:<null>) (firstTokenOffset:<null>) (offset:21)
+        #F7 isCompleteDeclaration isOriginVariable isStatic c (nameOffset:<null>) (firstTokenOffset:<null>) (offset:22)
           element: <testLibrary>::@setter::c
           formalParameters
-            #F8 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:21)
+            #F8 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:22)
               element: <testLibrary>::@setter::c::@formalParameter::value
-        #F9 isCompleteDeclaration isOriginVariable isStatic e (nameOffset:<null>) (firstTokenOffset:<null>) (offset:26)
+        #F9 isCompleteDeclaration isOriginVariable isStatic e (nameOffset:<null>) (firstTokenOffset:<null>) (offset:27)
           element: <testLibrary>::@setter::e
           formalParameters
-            #F10 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:26)
+            #F10 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:27)
               element: <testLibrary>::@setter::e::@formalParameter::value
-        #F11 isCompleteDeclaration isOriginVariable isStatic f (nameOffset:<null>) (firstTokenOffset:<null>) (offset:31)
+        #F11 isCompleteDeclaration isOriginVariable isStatic f (nameOffset:<null>) (firstTokenOffset:<null>) (offset:32)
           element: <testLibrary>::@setter::f
           formalParameters
-            #F12 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:31)
+            #F12 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:32)
               element: <testLibrary>::@setter::f::@formalParameter::value
   topLevelVariables
     isOriginDeclaration isStatic c
@@ -7643,12 +7850,25 @@
   }
 
   test_type_reference_to_import_part() async {
-    newFile('$testPackageLibPath/a.dart', 'library l; part "b.dart";');
-    newFile(
-      '$testPackageLibPath/b.dart',
-      'part of l; class C {} enum E { v } typedef F();',
-    );
-    var library = await buildLibrary('import "a.dart"; C c; E e; F f;');
+    newFile('$testPackageLibPath/a.dart', r'''
+library l;
+part "b.dart";
+''');
+    newFile('$testPackageLibPath/b.dart', r'''
+part of l;
+class C {}
+enum E {
+  v
+}
+typedef F();
+''');
+    var library = await buildLibrary(r'''
+import "a.dart";
+
+C c;
+E e;
+F f;
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -7658,34 +7878,34 @@
       libraryImports
         package:test/a.dart
       topLevelVariables
-        #F1 isOriginDeclaration isStatic c (nameOffset:19) (firstTokenOffset:19) (offset:19)
+        #F1 isOriginDeclaration isStatic c (nameOffset:20) (firstTokenOffset:20) (offset:20)
           element: <testLibrary>::@topLevelVariable::c
-        #F2 isOriginDeclaration isStatic e (nameOffset:24) (firstTokenOffset:24) (offset:24)
+        #F2 isOriginDeclaration isStatic e (nameOffset:25) (firstTokenOffset:25) (offset:25)
           element: <testLibrary>::@topLevelVariable::e
-        #F3 isOriginDeclaration isStatic f (nameOffset:29) (firstTokenOffset:29) (offset:29)
+        #F3 isOriginDeclaration isStatic f (nameOffset:30) (firstTokenOffset:30) (offset:30)
           element: <testLibrary>::@topLevelVariable::f
       getters
-        #F4 isCompleteDeclaration isOriginVariable isStatic c (nameOffset:<null>) (firstTokenOffset:<null>) (offset:19)
+        #F4 isCompleteDeclaration isOriginVariable isStatic c (nameOffset:<null>) (firstTokenOffset:<null>) (offset:20)
           element: <testLibrary>::@getter::c
-        #F5 isCompleteDeclaration isOriginVariable isStatic e (nameOffset:<null>) (firstTokenOffset:<null>) (offset:24)
+        #F5 isCompleteDeclaration isOriginVariable isStatic e (nameOffset:<null>) (firstTokenOffset:<null>) (offset:25)
           element: <testLibrary>::@getter::e
-        #F6 isCompleteDeclaration isOriginVariable isStatic f (nameOffset:<null>) (firstTokenOffset:<null>) (offset:29)
+        #F6 isCompleteDeclaration isOriginVariable isStatic f (nameOffset:<null>) (firstTokenOffset:<null>) (offset:30)
           element: <testLibrary>::@getter::f
       setters
-        #F7 isCompleteDeclaration isOriginVariable isStatic c (nameOffset:<null>) (firstTokenOffset:<null>) (offset:19)
+        #F7 isCompleteDeclaration isOriginVariable isStatic c (nameOffset:<null>) (firstTokenOffset:<null>) (offset:20)
           element: <testLibrary>::@setter::c
           formalParameters
-            #F8 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:19)
+            #F8 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:20)
               element: <testLibrary>::@setter::c::@formalParameter::value
-        #F9 isCompleteDeclaration isOriginVariable isStatic e (nameOffset:<null>) (firstTokenOffset:<null>) (offset:24)
+        #F9 isCompleteDeclaration isOriginVariable isStatic e (nameOffset:<null>) (firstTokenOffset:<null>) (offset:25)
           element: <testLibrary>::@setter::e
           formalParameters
-            #F10 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:24)
+            #F10 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:25)
               element: <testLibrary>::@setter::e::@formalParameter::value
-        #F11 isCompleteDeclaration isOriginVariable isStatic f (nameOffset:<null>) (firstTokenOffset:<null>) (offset:29)
+        #F11 isCompleteDeclaration isOriginVariable isStatic f (nameOffset:<null>) (firstTokenOffset:<null>) (offset:30)
           element: <testLibrary>::@setter::f
           formalParameters
-            #F12 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:29)
+            #F12 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:30)
               element: <testLibrary>::@setter::f::@formalParameter::value
   topLevelVariables
     isOriginDeclaration isStatic c
@@ -7757,13 +7977,25 @@
   }
 
   test_type_reference_to_import_part2() async {
-    newFile(
-      '$testPackageLibPath/a.dart',
-      'library l; part "p1.dart"; part "p2.dart";',
-    );
-    newFile('$testPackageLibPath/p1.dart', 'part of l; class C1 {}');
-    newFile('$testPackageLibPath/p2.dart', 'part of l; class C2 {}');
-    var library = await buildLibrary('import "a.dart"; C1 c1; C2 c2;');
+    newFile('$testPackageLibPath/a.dart', r'''
+library l;
+part "p1.dart";
+part "p2.dart";
+''');
+    newFile('$testPackageLibPath/p1.dart', r'''
+part of l;
+class C1 {}
+''');
+    newFile('$testPackageLibPath/p2.dart', r'''
+part of l;
+class C2 {}
+''');
+    var library = await buildLibrary(r'''
+import "a.dart";
+
+C1 c1;
+C2 c2;
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -7773,25 +8005,25 @@
       libraryImports
         package:test/a.dart
       topLevelVariables
-        #F1 isOriginDeclaration isStatic c1 (nameOffset:20) (firstTokenOffset:20) (offset:20)
+        #F1 isOriginDeclaration isStatic c1 (nameOffset:21) (firstTokenOffset:21) (offset:21)
           element: <testLibrary>::@topLevelVariable::c1
-        #F2 isOriginDeclaration isStatic c2 (nameOffset:27) (firstTokenOffset:27) (offset:27)
+        #F2 isOriginDeclaration isStatic c2 (nameOffset:28) (firstTokenOffset:28) (offset:28)
           element: <testLibrary>::@topLevelVariable::c2
       getters
-        #F3 isCompleteDeclaration isOriginVariable isStatic c1 (nameOffset:<null>) (firstTokenOffset:<null>) (offset:20)
+        #F3 isCompleteDeclaration isOriginVariable isStatic c1 (nameOffset:<null>) (firstTokenOffset:<null>) (offset:21)
           element: <testLibrary>::@getter::c1
-        #F4 isCompleteDeclaration isOriginVariable isStatic c2 (nameOffset:<null>) (firstTokenOffset:<null>) (offset:27)
+        #F4 isCompleteDeclaration isOriginVariable isStatic c2 (nameOffset:<null>) (firstTokenOffset:<null>) (offset:28)
           element: <testLibrary>::@getter::c2
       setters
-        #F5 isCompleteDeclaration isOriginVariable isStatic c1 (nameOffset:<null>) (firstTokenOffset:<null>) (offset:20)
+        #F5 isCompleteDeclaration isOriginVariable isStatic c1 (nameOffset:<null>) (firstTokenOffset:<null>) (offset:21)
           element: <testLibrary>::@setter::c1
           formalParameters
-            #F6 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:20)
+            #F6 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:21)
               element: <testLibrary>::@setter::c1::@formalParameter::value
-        #F7 isCompleteDeclaration isOriginVariable isStatic c2 (nameOffset:<null>) (firstTokenOffset:<null>) (offset:27)
+        #F7 isCompleteDeclaration isOriginVariable isStatic c2 (nameOffset:<null>) (firstTokenOffset:<null>) (offset:28)
           element: <testLibrary>::@setter::c2
           formalParameters
-            #F8 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:27)
+            #F8 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:28)
               element: <testLibrary>::@setter::c2::@formalParameter::value
   topLevelVariables
     isOriginDeclaration isStatic c1
@@ -7840,12 +8072,25 @@
   }
 
   test_type_reference_to_import_part_in_subdir() async {
-    newFile('$testPackageLibPath/a/b.dart', 'library l; part "c.dart";');
-    newFile(
-      '$testPackageLibPath/a/c.dart',
-      'part of l; class C {} enum E { v } typedef F();',
-    );
-    var library = await buildLibrary('import "a/b.dart"; C c; E e; F f;');
+    newFile('$testPackageLibPath/a/b.dart', r'''
+library l;
+part "c.dart";
+''');
+    newFile('$testPackageLibPath/a/c.dart', r'''
+part of l;
+class C {}
+enum E {
+  v
+}
+typedef F();
+''');
+    var library = await buildLibrary(r'''
+import "a/b.dart";
+
+C c;
+E e;
+F f;
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -7855,34 +8100,34 @@
       libraryImports
         package:test/a/b.dart
       topLevelVariables
-        #F1 isOriginDeclaration isStatic c (nameOffset:21) (firstTokenOffset:21) (offset:21)
+        #F1 isOriginDeclaration isStatic c (nameOffset:22) (firstTokenOffset:22) (offset:22)
           element: <testLibrary>::@topLevelVariable::c
-        #F2 isOriginDeclaration isStatic e (nameOffset:26) (firstTokenOffset:26) (offset:26)
+        #F2 isOriginDeclaration isStatic e (nameOffset:27) (firstTokenOffset:27) (offset:27)
           element: <testLibrary>::@topLevelVariable::e
-        #F3 isOriginDeclaration isStatic f (nameOffset:31) (firstTokenOffset:31) (offset:31)
+        #F3 isOriginDeclaration isStatic f (nameOffset:32) (firstTokenOffset:32) (offset:32)
           element: <testLibrary>::@topLevelVariable::f
       getters
-        #F4 isCompleteDeclaration isOriginVariable isStatic c (nameOffset:<null>) (firstTokenOffset:<null>) (offset:21)
+        #F4 isCompleteDeclaration isOriginVariable isStatic c (nameOffset:<null>) (firstTokenOffset:<null>) (offset:22)
           element: <testLibrary>::@getter::c
-        #F5 isCompleteDeclaration isOriginVariable isStatic e (nameOffset:<null>) (firstTokenOffset:<null>) (offset:26)
+        #F5 isCompleteDeclaration isOriginVariable isStatic e (nameOffset:<null>) (firstTokenOffset:<null>) (offset:27)
           element: <testLibrary>::@getter::e
-        #F6 isCompleteDeclaration isOriginVariable isStatic f (nameOffset:<null>) (firstTokenOffset:<null>) (offset:31)
+        #F6 isCompleteDeclaration isOriginVariable isStatic f (nameOffset:<null>) (firstTokenOffset:<null>) (offset:32)
           element: <testLibrary>::@getter::f
       setters
-        #F7 isCompleteDeclaration isOriginVariable isStatic c (nameOffset:<null>) (firstTokenOffset:<null>) (offset:21)
+        #F7 isCompleteDeclaration isOriginVariable isStatic c (nameOffset:<null>) (firstTokenOffset:<null>) (offset:22)
           element: <testLibrary>::@setter::c
           formalParameters
-            #F8 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:21)
+            #F8 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:22)
               element: <testLibrary>::@setter::c::@formalParameter::value
-        #F9 isCompleteDeclaration isOriginVariable isStatic e (nameOffset:<null>) (firstTokenOffset:<null>) (offset:26)
+        #F9 isCompleteDeclaration isOriginVariable isStatic e (nameOffset:<null>) (firstTokenOffset:<null>) (offset:27)
           element: <testLibrary>::@setter::e
           formalParameters
-            #F10 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:26)
+            #F10 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:27)
               element: <testLibrary>::@setter::e::@formalParameter::value
-        #F11 isCompleteDeclaration isOriginVariable isStatic f (nameOffset:<null>) (firstTokenOffset:<null>) (offset:31)
+        #F11 isCompleteDeclaration isOriginVariable isStatic f (nameOffset:<null>) (firstTokenOffset:<null>) (offset:32)
           element: <testLibrary>::@setter::f
           formalParameters
-            #F12 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:31)
+            #F12 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:32)
               element: <testLibrary>::@setter::f::@formalParameter::value
   topLevelVariables
     isOriginDeclaration isStatic c
@@ -7954,11 +8199,20 @@
   }
 
   test_type_reference_to_import_relative() async {
-    newFile(
-      '$testPackageLibPath/a.dart',
-      'class C {} enum E { v } typedef F();',
-    );
-    var library = await buildLibrary('import "a.dart"; C c; E e; F f;');
+    newFile('$testPackageLibPath/a.dart', r'''
+class C {}
+enum E {
+  v
+}
+typedef F();
+''');
+    var library = await buildLibrary(r'''
+import "a.dart";
+
+C c;
+E e;
+F f;
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -7968,34 +8222,34 @@
       libraryImports
         package:test/a.dart
       topLevelVariables
-        #F1 isOriginDeclaration isStatic c (nameOffset:19) (firstTokenOffset:19) (offset:19)
+        #F1 isOriginDeclaration isStatic c (nameOffset:20) (firstTokenOffset:20) (offset:20)
           element: <testLibrary>::@topLevelVariable::c
-        #F2 isOriginDeclaration isStatic e (nameOffset:24) (firstTokenOffset:24) (offset:24)
+        #F2 isOriginDeclaration isStatic e (nameOffset:25) (firstTokenOffset:25) (offset:25)
           element: <testLibrary>::@topLevelVariable::e
-        #F3 isOriginDeclaration isStatic f (nameOffset:29) (firstTokenOffset:29) (offset:29)
+        #F3 isOriginDeclaration isStatic f (nameOffset:30) (firstTokenOffset:30) (offset:30)
           element: <testLibrary>::@topLevelVariable::f
       getters
-        #F4 isCompleteDeclaration isOriginVariable isStatic c (nameOffset:<null>) (firstTokenOffset:<null>) (offset:19)
+        #F4 isCompleteDeclaration isOriginVariable isStatic c (nameOffset:<null>) (firstTokenOffset:<null>) (offset:20)
           element: <testLibrary>::@getter::c
-        #F5 isCompleteDeclaration isOriginVariable isStatic e (nameOffset:<null>) (firstTokenOffset:<null>) (offset:24)
+        #F5 isCompleteDeclaration isOriginVariable isStatic e (nameOffset:<null>) (firstTokenOffset:<null>) (offset:25)
           element: <testLibrary>::@getter::e
-        #F6 isCompleteDeclaration isOriginVariable isStatic f (nameOffset:<null>) (firstTokenOffset:<null>) (offset:29)
+        #F6 isCompleteDeclaration isOriginVariable isStatic f (nameOffset:<null>) (firstTokenOffset:<null>) (offset:30)
           element: <testLibrary>::@getter::f
       setters
-        #F7 isCompleteDeclaration isOriginVariable isStatic c (nameOffset:<null>) (firstTokenOffset:<null>) (offset:19)
+        #F7 isCompleteDeclaration isOriginVariable isStatic c (nameOffset:<null>) (firstTokenOffset:<null>) (offset:20)
           element: <testLibrary>::@setter::c
           formalParameters
-            #F8 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:19)
+            #F8 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:20)
               element: <testLibrary>::@setter::c::@formalParameter::value
-        #F9 isCompleteDeclaration isOriginVariable isStatic e (nameOffset:<null>) (firstTokenOffset:<null>) (offset:24)
+        #F9 isCompleteDeclaration isOriginVariable isStatic e (nameOffset:<null>) (firstTokenOffset:<null>) (offset:25)
           element: <testLibrary>::@setter::e
           formalParameters
-            #F10 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:24)
+            #F10 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:25)
               element: <testLibrary>::@setter::e::@formalParameter::value
-        #F11 isCompleteDeclaration isOriginVariable isStatic f (nameOffset:<null>) (firstTokenOffset:<null>) (offset:29)
+        #F11 isCompleteDeclaration isOriginVariable isStatic f (nameOffset:<null>) (firstTokenOffset:<null>) (offset:30)
           element: <testLibrary>::@setter::f
           formalParameters
-            #F12 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:29)
+            #F12 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:30)
               element: <testLibrary>::@setter::f::@formalParameter::value
   topLevelVariables
     isOriginDeclaration isStatic c
@@ -8067,7 +8321,10 @@
   }
 
   test_type_reference_to_typedef() async {
-    var library = await buildLibrary('typedef F(); F f;');
+    var library = await buildLibrary(r'''
+typedef F();
+F f;
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -8124,9 +8381,10 @@
   }
 
   test_type_reference_to_typedef_with_type_arguments() async {
-    var library = await buildLibrary(
-      'typedef U F<T, U>(T t); F<int, String> f;',
-    );
+    var library = await buildLibrary(r'''
+typedef U F<T, U>(T t);
+F<int, String> f;
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -8202,7 +8460,10 @@
   }
 
   test_type_reference_to_typedef_with_type_arguments_implicit() async {
-    var library = await buildLibrary('typedef U F<T, U>(T t); F f;');
+    var library = await buildLibrary(r'''
+typedef U F<T, U>(T t);
+F f;
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
diff --git a/pkg/analyzer/test/src/summary/elements/types_test.dart b/pkg/analyzer/test/src/summary/elements/types_test.dart
index 2c251f1..bf06369 100644
--- a/pkg/analyzer/test/src/summary/elements/types_test.dart
+++ b/pkg/analyzer/test/src/summary/elements/types_test.dart
@@ -19,10 +19,13 @@
 
 abstract class TypesElementTest extends ElementsBaseTest {
   test_closure_executable_with_return_type_from_closure() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 f() {
   print(() {});
-  print(() => () => 0);
+  print(
+    () =>
+        () => 0,
+  );
 }
 ''');
     checkElementText(library, r'''
@@ -81,7 +84,11 @@
   }
 
   test_futureOr() async {
-    var library = await buildLibrary('import "dart:async"; FutureOr<int> x;');
+    var library = await buildLibrary(r'''
+import "dart:async";
+
+FutureOr<int> x;
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -91,16 +98,16 @@
       libraryImports
         dart:async
       topLevelVariables
-        #F1 isOriginDeclaration isStatic x (nameOffset:35) (firstTokenOffset:35) (offset:35)
+        #F1 isOriginDeclaration isStatic x (nameOffset:36) (firstTokenOffset:36) (offset:36)
           element: <testLibrary>::@topLevelVariable::x
       getters
-        #F2 isCompleteDeclaration isOriginVariable isStatic x (nameOffset:<null>) (firstTokenOffset:<null>) (offset:35)
+        #F2 isCompleteDeclaration isOriginVariable isStatic x (nameOffset:<null>) (firstTokenOffset:<null>) (offset:36)
           element: <testLibrary>::@getter::x
       setters
-        #F3 isCompleteDeclaration isOriginVariable isStatic x (nameOffset:<null>) (firstTokenOffset:<null>) (offset:35)
+        #F3 isCompleteDeclaration isOriginVariable isStatic x (nameOffset:<null>) (firstTokenOffset:<null>) (offset:36)
           element: <testLibrary>::@setter::x
           formalParameters
-            #F4 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:35)
+            #F4 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:36)
               element: <testLibrary>::@setter::x::@formalParameter::value
   topLevelVariables
     isOriginDeclaration isStatic x
@@ -132,9 +139,11 @@
   }
 
   test_futureOr_const() async {
-    var library = await buildLibrary(
-      'import "dart:async"; const x = FutureOr;',
-    );
+    var library = await buildLibrary(r'''
+import "dart:async";
+
+const x = FutureOr;
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -144,17 +153,17 @@
       libraryImports
         dart:async
       topLevelVariables
-        #F1 hasImplicitType hasInitializer isConst isOriginDeclaration isStatic x (nameOffset:27) (firstTokenOffset:27) (offset:27)
+        #F1 hasImplicitType hasInitializer isConst isOriginDeclaration isStatic x (nameOffset:28) (firstTokenOffset:28) (offset:28)
           element: <testLibrary>::@topLevelVariable::x
           initializer: expression_0
             TypeLiteral
               type: NamedType
-                name: FutureOr @31
+                name: FutureOr @32
                 element: dart:async::@class::FutureOr
                 type: FutureOr<dynamic>
               staticType: Type
       getters
-        #F2 isCompleteDeclaration isOriginVariable isStatic x (nameOffset:<null>) (firstTokenOffset:<null>) (offset:27)
+        #F2 isCompleteDeclaration isOriginVariable isStatic x (nameOffset:<null>) (firstTokenOffset:<null>) (offset:28)
           element: <testLibrary>::@getter::x
   topLevelVariables
     hasImplicitType hasInitializer isConst isOriginDeclaration isStatic isTypeInferredFromInitializer x
@@ -180,8 +189,9 @@
   }
 
   test_futureOr_inferred() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 import "dart:async";
+
 FutureOr<int> f() => null;
 var x = f();
 var y = x.then((z) => z.asDouble());
@@ -195,28 +205,28 @@
       libraryImports
         dart:async
       topLevelVariables
-        #F1 hasImplicitType hasInitializer isOriginDeclaration isStatic x (nameOffset:52) (firstTokenOffset:52) (offset:52)
+        #F1 hasImplicitType hasInitializer isOriginDeclaration isStatic x (nameOffset:53) (firstTokenOffset:53) (offset:53)
           element: <testLibrary>::@topLevelVariable::x
-        #F2 hasImplicitType hasInitializer isOriginDeclaration isStatic y (nameOffset:65) (firstTokenOffset:65) (offset:65)
+        #F2 hasImplicitType hasInitializer isOriginDeclaration isStatic y (nameOffset:66) (firstTokenOffset:66) (offset:66)
           element: <testLibrary>::@topLevelVariable::y
       getters
-        #F3 isCompleteDeclaration isOriginVariable isStatic x (nameOffset:<null>) (firstTokenOffset:<null>) (offset:52)
+        #F3 isCompleteDeclaration isOriginVariable isStatic x (nameOffset:<null>) (firstTokenOffset:<null>) (offset:53)
           element: <testLibrary>::@getter::x
-        #F4 isCompleteDeclaration isOriginVariable isStatic y (nameOffset:<null>) (firstTokenOffset:<null>) (offset:65)
+        #F4 isCompleteDeclaration isOriginVariable isStatic y (nameOffset:<null>) (firstTokenOffset:<null>) (offset:66)
           element: <testLibrary>::@getter::y
       setters
-        #F5 isCompleteDeclaration isOriginVariable isStatic x (nameOffset:<null>) (firstTokenOffset:<null>) (offset:52)
+        #F5 isCompleteDeclaration isOriginVariable isStatic x (nameOffset:<null>) (firstTokenOffset:<null>) (offset:53)
           element: <testLibrary>::@setter::x
           formalParameters
-            #F6 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:52)
+            #F6 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:53)
               element: <testLibrary>::@setter::x::@formalParameter::value
-        #F7 isCompleteDeclaration isOriginVariable isStatic y (nameOffset:<null>) (firstTokenOffset:<null>) (offset:65)
+        #F7 isCompleteDeclaration isOriginVariable isStatic y (nameOffset:<null>) (firstTokenOffset:<null>) (offset:66)
           element: <testLibrary>::@setter::y
           formalParameters
-            #F8 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:65)
+            #F8 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:66)
               element: <testLibrary>::@setter::y::@formalParameter::value
       functions
-        #F9 isCompleteDeclaration isOriginDeclaration isStatic f (nameOffset:35) (firstTokenOffset:21) (offset:35)
+        #F9 isCompleteDeclaration isOriginDeclaration isStatic f (nameOffset:36) (firstTokenOffset:22) (offset:36)
           element: <testLibrary>::@function::f
   topLevelVariables
     hasImplicitType hasInitializer isOriginDeclaration isStatic isTypeInferredFromInitializer x
@@ -278,11 +288,10 @@
   }
 
   test_generic_gClass_gMethodStatic() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class C<T, U> {
   static void m<V, W>(V v, W w) {
-    void f<X, Y>(V v, W w, X x, Y y) {
-    }
+    void f<X, Y>(V v, W w, X x, Y y) {}
   }
 }
 ''');
@@ -452,7 +461,9 @@
   }
 
   test_initializer_executable_with_return_type_from_closure() async {
-    var library = await buildLibrary('var v = () => 0;');
+    var library = await buildLibrary(r'''
+var v = () => 0;
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -498,7 +509,9 @@
   }
 
   test_initializer_executable_with_return_type_from_closure_await_dynamic() async {
-    var library = await buildLibrary('var v = (f) async => await f;');
+    var library = await buildLibrary(r'''
+var v = (f) async => await f;
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -546,6 +559,7 @@
   test_initializer_executable_with_return_type_from_closure_await_future3_int() async {
     var library = await buildLibrary(r'''
 import 'dart:async';
+
 var v = (Future<Future<Future<int>>> f) async => await f;
 ''');
     // The analyzer type system over-flattens - see dartbug.com/31887
@@ -558,16 +572,16 @@
       libraryImports
         dart:async
       topLevelVariables
-        #F1 hasImplicitType hasInitializer isOriginDeclaration isStatic v (nameOffset:25) (firstTokenOffset:25) (offset:25)
+        #F1 hasImplicitType hasInitializer isOriginDeclaration isStatic v (nameOffset:26) (firstTokenOffset:26) (offset:26)
           element: <testLibrary>::@topLevelVariable::v
       getters
-        #F2 isCompleteDeclaration isOriginVariable isStatic v (nameOffset:<null>) (firstTokenOffset:<null>) (offset:25)
+        #F2 isCompleteDeclaration isOriginVariable isStatic v (nameOffset:<null>) (firstTokenOffset:<null>) (offset:26)
           element: <testLibrary>::@getter::v
       setters
-        #F3 isCompleteDeclaration isOriginVariable isStatic v (nameOffset:<null>) (firstTokenOffset:<null>) (offset:25)
+        #F3 isCompleteDeclaration isOriginVariable isStatic v (nameOffset:<null>) (firstTokenOffset:<null>) (offset:26)
           element: <testLibrary>::@setter::v
           formalParameters
-            #F4 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:25)
+            #F4 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:26)
               element: <testLibrary>::@setter::v::@formalParameter::value
   topLevelVariables
     hasImplicitType hasInitializer isOriginDeclaration isStatic isTypeInferredFromInitializer v
@@ -598,6 +612,7 @@
   test_initializer_executable_with_return_type_from_closure_await_future_int() async {
     var library = await buildLibrary(r'''
 import 'dart:async';
+
 var v = (Future<int> f) async => await f;
 ''');
     checkElementText(library, r'''
@@ -609,16 +624,16 @@
       libraryImports
         dart:async
       topLevelVariables
-        #F1 hasImplicitType hasInitializer isOriginDeclaration isStatic v (nameOffset:25) (firstTokenOffset:25) (offset:25)
+        #F1 hasImplicitType hasInitializer isOriginDeclaration isStatic v (nameOffset:26) (firstTokenOffset:26) (offset:26)
           element: <testLibrary>::@topLevelVariable::v
       getters
-        #F2 isCompleteDeclaration isOriginVariable isStatic v (nameOffset:<null>) (firstTokenOffset:<null>) (offset:25)
+        #F2 isCompleteDeclaration isOriginVariable isStatic v (nameOffset:<null>) (firstTokenOffset:<null>) (offset:26)
           element: <testLibrary>::@getter::v
       setters
-        #F3 isCompleteDeclaration isOriginVariable isStatic v (nameOffset:<null>) (firstTokenOffset:<null>) (offset:25)
+        #F3 isCompleteDeclaration isOriginVariable isStatic v (nameOffset:<null>) (firstTokenOffset:<null>) (offset:26)
           element: <testLibrary>::@setter::v
           formalParameters
-            #F4 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:25)
+            #F4 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:26)
               element: <testLibrary>::@setter::v::@formalParameter::value
   topLevelVariables
     hasImplicitType hasInitializer isOriginDeclaration isStatic isTypeInferredFromInitializer v
@@ -649,6 +664,7 @@
   test_initializer_executable_with_return_type_from_closure_await_future_noArg() async {
     var library = await buildLibrary(r'''
 import 'dart:async';
+
 var v = (Future f) async => await f;
 ''');
     checkElementText(library, r'''
@@ -660,16 +676,16 @@
       libraryImports
         dart:async
       topLevelVariables
-        #F1 hasImplicitType hasInitializer isOriginDeclaration isStatic v (nameOffset:25) (firstTokenOffset:25) (offset:25)
+        #F1 hasImplicitType hasInitializer isOriginDeclaration isStatic v (nameOffset:26) (firstTokenOffset:26) (offset:26)
           element: <testLibrary>::@topLevelVariable::v
       getters
-        #F2 isCompleteDeclaration isOriginVariable isStatic v (nameOffset:<null>) (firstTokenOffset:<null>) (offset:25)
+        #F2 isCompleteDeclaration isOriginVariable isStatic v (nameOffset:<null>) (firstTokenOffset:<null>) (offset:26)
           element: <testLibrary>::@getter::v
       setters
-        #F3 isCompleteDeclaration isOriginVariable isStatic v (nameOffset:<null>) (firstTokenOffset:<null>) (offset:25)
+        #F3 isCompleteDeclaration isOriginVariable isStatic v (nameOffset:<null>) (firstTokenOffset:<null>) (offset:26)
           element: <testLibrary>::@setter::v
           formalParameters
-            #F4 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:25)
+            #F4 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:26)
               element: <testLibrary>::@setter::v::@formalParameter::value
   topLevelVariables
     hasImplicitType hasInitializer isOriginDeclaration isStatic isTypeInferredFromInitializer v
@@ -698,7 +714,7 @@
   }
 
   test_initializer_executable_with_return_type_from_closure_field() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class C {
   var v = () => 0;
 }
@@ -763,7 +779,7 @@
   }
 
   test_initializer_executable_with_return_type_from_closure_local() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 void f() {
   int u = 0;
   var v = () => 0;
@@ -800,14 +816,17 @@
 ''');
     var library = await buildLibrary(r'''
 import 'nullSafe.dart';
+
 class X1 extends NullSafeDefault {
-  bool operator==(other) => false;
+  bool operator ==(other) => false;
 }
+
 class X2 extends NullSafeObject {
-  bool operator==(other) => false;
+  bool operator ==(other) => false;
 }
+
 class X3 extends NullSafeInt {
-  bool operator==(other) => false;
+  bool operator ==(other) => false;
 }
 ''');
     checkElementText(library, r'''
@@ -819,41 +838,41 @@
       libraryImports
         package:test/nullSafe.dart
       classes
-        #F1 hasExtendsClause class X1 (nameOffset:30) (firstTokenOffset:24) (offset:30)
+        #F1 hasExtendsClause class X1 (nameOffset:31) (firstTokenOffset:25) (offset:31)
           element: <testLibrary>::@class::X1
           constructors
-            #F2 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:30)
+            #F2 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:31)
               element: <testLibrary>::@class::X1::@constructor::new
               typeName: X1
           methods
-            #F3 isCompleteDeclaration isOriginDeclaration == (nameOffset:74) (firstTokenOffset:61) (offset:74)
+            #F3 isCompleteDeclaration isOriginDeclaration == (nameOffset:76) (firstTokenOffset:62) (offset:76)
               element: <testLibrary>::@class::X1::@method::==
               formalParameters
-                #F4 requiredPositional hasImplicitType isOriginDeclaration other (nameOffset:77) (firstTokenOffset:77) (offset:77)
+                #F4 requiredPositional hasImplicitType isOriginDeclaration other (nameOffset:79) (firstTokenOffset:79) (offset:79)
                   element: <testLibrary>::@class::X1::@method::==::@formalParameter::other
-        #F5 hasExtendsClause class X2 (nameOffset:102) (firstTokenOffset:96) (offset:102)
+        #F5 hasExtendsClause class X2 (nameOffset:105) (firstTokenOffset:99) (offset:105)
           element: <testLibrary>::@class::X2
           constructors
-            #F6 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:102)
+            #F6 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:105)
               element: <testLibrary>::@class::X2::@constructor::new
               typeName: X2
           methods
-            #F7 isCompleteDeclaration isOriginDeclaration == (nameOffset:145) (firstTokenOffset:132) (offset:145)
+            #F7 isCompleteDeclaration isOriginDeclaration == (nameOffset:149) (firstTokenOffset:135) (offset:149)
               element: <testLibrary>::@class::X2::@method::==
               formalParameters
-                #F8 requiredPositional hasImplicitType isOriginDeclaration other (nameOffset:148) (firstTokenOffset:148) (offset:148)
+                #F8 requiredPositional hasImplicitType isOriginDeclaration other (nameOffset:152) (firstTokenOffset:152) (offset:152)
                   element: <testLibrary>::@class::X2::@method::==::@formalParameter::other
-        #F9 hasExtendsClause class X3 (nameOffset:173) (firstTokenOffset:167) (offset:173)
+        #F9 hasExtendsClause class X3 (nameOffset:178) (firstTokenOffset:172) (offset:178)
           element: <testLibrary>::@class::X3
           constructors
-            #F10 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:173)
+            #F10 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:178)
               element: <testLibrary>::@class::X3::@constructor::new
               typeName: X3
           methods
-            #F11 isCompleteDeclaration isOriginDeclaration == (nameOffset:213) (firstTokenOffset:200) (offset:213)
+            #F11 isCompleteDeclaration isOriginDeclaration == (nameOffset:219) (firstTokenOffset:205) (offset:219)
               element: <testLibrary>::@class::X3::@method::==
               formalParameters
-                #F12 requiredPositional hasImplicitType isOriginDeclaration other (nameOffset:216) (firstTokenOffset:216) (offset:216)
+                #F12 requiredPositional hasImplicitType isOriginDeclaration other (nameOffset:222) (firstTokenOffset:222) (offset:222)
                   element: <testLibrary>::@class::X3::@method::==::@formalParameter::other
   classes
     isSimplyBounded class X1
@@ -914,8 +933,9 @@
   }
 
   test_instantiateToBounds_boundRefersToEarlierTypeArgument() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class C<S extends num, T extends C<S, T>> {}
+
 C c;
 ''');
     checkElementText(library, r'''
@@ -937,16 +957,16 @@
               element: <testLibrary>::@class::C::@constructor::new
               typeName: C
       topLevelVariables
-        #F5 isOriginDeclaration isStatic c (nameOffset:47) (firstTokenOffset:47) (offset:47)
+        #F5 isOriginDeclaration isStatic c (nameOffset:48) (firstTokenOffset:48) (offset:48)
           element: <testLibrary>::@topLevelVariable::c
       getters
-        #F6 isCompleteDeclaration isOriginVariable isStatic c (nameOffset:<null>) (firstTokenOffset:<null>) (offset:47)
+        #F6 isCompleteDeclaration isOriginVariable isStatic c (nameOffset:<null>) (firstTokenOffset:<null>) (offset:48)
           element: <testLibrary>::@getter::c
       setters
-        #F7 isCompleteDeclaration isOriginVariable isStatic c (nameOffset:<null>) (firstTokenOffset:<null>) (offset:47)
+        #F7 isCompleteDeclaration isOriginVariable isStatic c (nameOffset:<null>) (firstTokenOffset:<null>) (offset:48)
           element: <testLibrary>::@setter::c
           formalParameters
-            #F8 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:47)
+            #F8 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:48)
               element: <testLibrary>::@setter::c::@formalParameter::value
   classes
     class C
@@ -990,10 +1010,12 @@
   }
 
   test_instantiateToBounds_boundRefersToItself() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class C<T extends C<T>> {}
+
 C c;
 var c2 = new C();
+
 class B {
   var c3 = new C();
 }
@@ -1014,44 +1036,44 @@
             #F3 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:6)
               element: <testLibrary>::@class::C::@constructor::new
               typeName: C
-        #F4 class B (nameOffset:56) (firstTokenOffset:50) (offset:56)
+        #F4 class B (nameOffset:58) (firstTokenOffset:52) (offset:58)
           element: <testLibrary>::@class::B
           fields
-            #F5 hasImplicitType hasInitializer isOriginDeclaration c3 (nameOffset:66) (firstTokenOffset:66) (offset:66)
+            #F5 hasImplicitType hasInitializer isOriginDeclaration c3 (nameOffset:68) (firstTokenOffset:68) (offset:68)
               element: <testLibrary>::@class::B::@field::c3
           constructors
-            #F6 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:56)
+            #F6 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:58)
               element: <testLibrary>::@class::B::@constructor::new
               typeName: B
           getters
-            #F7 isCompleteDeclaration isOriginVariable c3 (nameOffset:<null>) (firstTokenOffset:<null>) (offset:66)
+            #F7 isCompleteDeclaration isOriginVariable c3 (nameOffset:<null>) (firstTokenOffset:<null>) (offset:68)
               element: <testLibrary>::@class::B::@getter::c3
           setters
-            #F8 isCompleteDeclaration isOriginVariable c3 (nameOffset:<null>) (firstTokenOffset:<null>) (offset:66)
+            #F8 isCompleteDeclaration isOriginVariable c3 (nameOffset:<null>) (firstTokenOffset:<null>) (offset:68)
               element: <testLibrary>::@class::B::@setter::c3
               formalParameters
-                #F9 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:66)
+                #F9 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:68)
                   element: <testLibrary>::@class::B::@setter::c3::@formalParameter::value
       topLevelVariables
-        #F10 isOriginDeclaration isStatic c (nameOffset:29) (firstTokenOffset:29) (offset:29)
+        #F10 isOriginDeclaration isStatic c (nameOffset:30) (firstTokenOffset:30) (offset:30)
           element: <testLibrary>::@topLevelVariable::c
-        #F11 hasImplicitType hasInitializer isOriginDeclaration isStatic c2 (nameOffset:36) (firstTokenOffset:36) (offset:36)
+        #F11 hasImplicitType hasInitializer isOriginDeclaration isStatic c2 (nameOffset:37) (firstTokenOffset:37) (offset:37)
           element: <testLibrary>::@topLevelVariable::c2
       getters
-        #F12 isCompleteDeclaration isOriginVariable isStatic c (nameOffset:<null>) (firstTokenOffset:<null>) (offset:29)
+        #F12 isCompleteDeclaration isOriginVariable isStatic c (nameOffset:<null>) (firstTokenOffset:<null>) (offset:30)
           element: <testLibrary>::@getter::c
-        #F13 isCompleteDeclaration isOriginVariable isStatic c2 (nameOffset:<null>) (firstTokenOffset:<null>) (offset:36)
+        #F13 isCompleteDeclaration isOriginVariable isStatic c2 (nameOffset:<null>) (firstTokenOffset:<null>) (offset:37)
           element: <testLibrary>::@getter::c2
       setters
-        #F14 isCompleteDeclaration isOriginVariable isStatic c (nameOffset:<null>) (firstTokenOffset:<null>) (offset:29)
+        #F14 isCompleteDeclaration isOriginVariable isStatic c (nameOffset:<null>) (firstTokenOffset:<null>) (offset:30)
           element: <testLibrary>::@setter::c
           formalParameters
-            #F15 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:29)
+            #F15 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:30)
               element: <testLibrary>::@setter::c::@formalParameter::value
-        #F16 isCompleteDeclaration isOriginVariable isStatic c2 (nameOffset:<null>) (firstTokenOffset:<null>) (offset:36)
+        #F16 isCompleteDeclaration isOriginVariable isStatic c2 (nameOffset:<null>) (firstTokenOffset:<null>) (offset:37)
           element: <testLibrary>::@setter::c2
           formalParameters
-            #F17 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:36)
+            #F17 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:37)
               element: <testLibrary>::@setter::c2::@formalParameter::value
   classes
     class C
@@ -1142,8 +1164,9 @@
   }
 
   test_instantiateToBounds_boundRefersToLaterTypeArgument() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class C<T extends C<T, U>, U extends num> {}
+
 C c;
 ''');
     checkElementText(library, r'''
@@ -1165,16 +1188,16 @@
               element: <testLibrary>::@class::C::@constructor::new
               typeName: C
       topLevelVariables
-        #F5 isOriginDeclaration isStatic c (nameOffset:47) (firstTokenOffset:47) (offset:47)
+        #F5 isOriginDeclaration isStatic c (nameOffset:48) (firstTokenOffset:48) (offset:48)
           element: <testLibrary>::@topLevelVariable::c
       getters
-        #F6 isCompleteDeclaration isOriginVariable isStatic c (nameOffset:<null>) (firstTokenOffset:<null>) (offset:47)
+        #F6 isCompleteDeclaration isOriginVariable isStatic c (nameOffset:<null>) (firstTokenOffset:<null>) (offset:48)
           element: <testLibrary>::@getter::c
       setters
-        #F7 isCompleteDeclaration isOriginVariable isStatic c (nameOffset:<null>) (firstTokenOffset:<null>) (offset:47)
+        #F7 isCompleteDeclaration isOriginVariable isStatic c (nameOffset:<null>) (firstTokenOffset:<null>) (offset:48)
           element: <testLibrary>::@setter::c
           formalParameters
-            #F8 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:47)
+            #F8 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:48)
               element: <testLibrary>::@setter::c::@formalParameter::value
   classes
     class C
@@ -1225,8 +1248,9 @@
     newFile('$testPackageLibPath/b.dart', r'''
 export 'a.dart' show F;
 ''');
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 import 'b.dart';
+
 class C {
   F f() => null;
 }
@@ -1240,14 +1264,14 @@
       libraryImports
         package:test/b.dart
       classes
-        #F1 class C (nameOffset:23) (firstTokenOffset:17) (offset:23)
+        #F1 class C (nameOffset:24) (firstTokenOffset:18) (offset:24)
           element: <testLibrary>::@class::C
           constructors
-            #F2 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:23)
+            #F2 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:24)
               element: <testLibrary>::@class::C::@constructor::new
               typeName: C
           methods
-            #F3 isCompleteDeclaration isOriginDeclaration f (nameOffset:31) (firstTokenOffset:29) (offset:31)
+            #F3 isCompleteDeclaration isOriginDeclaration f (nameOffset:32) (firstTokenOffset:30) (offset:32)
               element: <testLibrary>::@class::C::@method::f
   classes
     isSimplyBounded class C
@@ -1269,7 +1293,7 @@
   }
 
   test_instantiateToBounds_functionTypeAlias_simple() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 typedef F<T extends num>(T p);
 F f;
 ''');
@@ -1342,9 +1366,11 @@
   }
 
   test_instantiateToBounds_genericFunctionAsBound() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class A<T> {}
+
 class B<T extends int Function(), U extends A<T>> {}
+
 B b;
 ''');
     checkElementText(library, r'''
@@ -1363,28 +1389,28 @@
             #F3 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:6)
               element: <testLibrary>::@class::A::@constructor::new
               typeName: A
-        #F4 class B (nameOffset:20) (firstTokenOffset:14) (offset:20)
+        #F4 class B (nameOffset:21) (firstTokenOffset:15) (offset:21)
           element: <testLibrary>::@class::B
           typeParameters
-            #F5 T (nameOffset:22) (firstTokenOffset:22) (offset:22)
+            #F5 T (nameOffset:23) (firstTokenOffset:23) (offset:23)
               element: #E1 T
-            #F6 U (nameOffset:48) (firstTokenOffset:48) (offset:48)
+            #F6 U (nameOffset:49) (firstTokenOffset:49) (offset:49)
               element: #E2 U
           constructors
-            #F7 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:20)
+            #F7 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:21)
               element: <testLibrary>::@class::B::@constructor::new
               typeName: B
       topLevelVariables
-        #F8 isOriginDeclaration isStatic b (nameOffset:69) (firstTokenOffset:69) (offset:69)
+        #F8 isOriginDeclaration isStatic b (nameOffset:71) (firstTokenOffset:71) (offset:71)
           element: <testLibrary>::@topLevelVariable::b
       getters
-        #F9 isCompleteDeclaration isOriginVariable isStatic b (nameOffset:<null>) (firstTokenOffset:<null>) (offset:69)
+        #F9 isCompleteDeclaration isOriginVariable isStatic b (nameOffset:<null>) (firstTokenOffset:<null>) (offset:71)
           element: <testLibrary>::@getter::b
       setters
-        #F10 isCompleteDeclaration isOriginVariable isStatic b (nameOffset:<null>) (firstTokenOffset:<null>) (offset:69)
+        #F10 isCompleteDeclaration isOriginVariable isStatic b (nameOffset:<null>) (firstTokenOffset:<null>) (offset:71)
           element: <testLibrary>::@setter::b
           formalParameters
-            #F11 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:69)
+            #F11 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:71)
               element: <testLibrary>::@setter::b::@formalParameter::value
   classes
     isSimplyBounded class A
@@ -1438,7 +1464,7 @@
   }
 
   test_instantiateToBounds_genericTypeAlias_simple() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 typedef F<T extends num> = S Function<S>(T p);
 F f;
 ''');
@@ -1511,10 +1537,11 @@
   }
 
   test_instantiateToBounds_issue38498() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class A<R extends B> {
   final values = <B>[];
 }
+
 class B<T extends num> {}
 ''');
     checkElementText(library, r'''
@@ -1539,13 +1566,13 @@
           getters
             #F5 isCompleteDeclaration isOriginVariable values (nameOffset:<null>) (firstTokenOffset:<null>) (offset:31)
               element: <testLibrary>::@class::A::@getter::values
-        #F6 class B (nameOffset:55) (firstTokenOffset:49) (offset:55)
+        #F6 class B (nameOffset:56) (firstTokenOffset:50) (offset:56)
           element: <testLibrary>::@class::B
           typeParameters
-            #F7 T (nameOffset:57) (firstTokenOffset:57) (offset:57)
+            #F7 T (nameOffset:58) (firstTokenOffset:58) (offset:58)
               element: #E1 T
           constructors
-            #F8 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:55)
+            #F8 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:56)
               element: <testLibrary>::@class::B::@constructor::new
               typeName: B
   classes
@@ -1587,8 +1614,9 @@
   }
 
   test_instantiateToBounds_simple() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class C<T extends num> {}
+
 C c;
 ''');
     checkElementText(library, r'''
@@ -1608,16 +1636,16 @@
               element: <testLibrary>::@class::C::@constructor::new
               typeName: C
       topLevelVariables
-        #F4 isOriginDeclaration isStatic c (nameOffset:28) (firstTokenOffset:28) (offset:28)
+        #F4 isOriginDeclaration isStatic c (nameOffset:29) (firstTokenOffset:29) (offset:29)
           element: <testLibrary>::@topLevelVariable::c
       getters
-        #F5 isCompleteDeclaration isOriginVariable isStatic c (nameOffset:<null>) (firstTokenOffset:<null>) (offset:28)
+        #F5 isCompleteDeclaration isOriginVariable isStatic c (nameOffset:<null>) (firstTokenOffset:<null>) (offset:29)
           element: <testLibrary>::@getter::c
       setters
-        #F6 isCompleteDeclaration isOriginVariable isStatic c (nameOffset:<null>) (firstTokenOffset:<null>) (offset:28)
+        #F6 isCompleteDeclaration isOriginVariable isStatic c (nameOffset:<null>) (firstTokenOffset:<null>) (offset:29)
           element: <testLibrary>::@setter::c
           formalParameters
-            #F7 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:28)
+            #F7 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:29)
               element: <testLibrary>::@setter::c::@formalParameter::value
   classes
     isSimplyBounded class C
@@ -1658,8 +1686,9 @@
   }
 
   test_invalid_importPrefix_asTypeArgument() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 import 'dart:async' as ppp;
+
 class C {
   List<ppp> v;
 }
@@ -1676,23 +1705,23 @@
         <testLibraryFragment>::@prefix::ppp
           fragments: @23
       classes
-        #F1 class C (nameOffset:34) (firstTokenOffset:28) (offset:34)
+        #F1 class C (nameOffset:35) (firstTokenOffset:29) (offset:35)
           element: <testLibrary>::@class::C
           fields
-            #F2 isOriginDeclaration v (nameOffset:50) (firstTokenOffset:50) (offset:50)
+            #F2 isOriginDeclaration v (nameOffset:51) (firstTokenOffset:51) (offset:51)
               element: <testLibrary>::@class::C::@field::v
           constructors
-            #F3 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:34)
+            #F3 isOriginImplicitDefault new (nameOffset:<null>) (firstTokenOffset:<null>) (offset:35)
               element: <testLibrary>::@class::C::@constructor::new
               typeName: C
           getters
-            #F4 isCompleteDeclaration isOriginVariable v (nameOffset:<null>) (firstTokenOffset:<null>) (offset:50)
+            #F4 isCompleteDeclaration isOriginVariable v (nameOffset:<null>) (firstTokenOffset:<null>) (offset:51)
               element: <testLibrary>::@class::C::@getter::v
           setters
-            #F5 isCompleteDeclaration isOriginVariable v (nameOffset:<null>) (firstTokenOffset:<null>) (offset:50)
+            #F5 isCompleteDeclaration isOriginVariable v (nameOffset:<null>) (firstTokenOffset:<null>) (offset:51)
               element: <testLibrary>::@class::C::@setter::v
               formalParameters
-                #F6 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:50)
+                #F6 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:51)
                   element: <testLibrary>::@class::C::@setter::v::@formalParameter::value
   classes
     hasNonFinalField isSimplyBounded class C
@@ -1731,11 +1760,16 @@
   test_invalid_nameConflict_imported() async {
     if (!keepLinkingLibraries) return;
 
-    newFile('$testPackageLibPath/a.dart', 'V() {}');
-    newFile('$testPackageLibPath/b.dart', 'V() {}');
-    var library = await buildLibrary('''
+    newFile('$testPackageLibPath/a.dart', r'''
+V() {}
+''');
+    newFile('$testPackageLibPath/b.dart', r'''
+V() {}
+''');
+    var library = await buildLibrary(r'''
 import 'a.dart';
 import 'b.dart';
+
 foo([p = V]) {}
 ''');
     checkElementText(library, r'''
@@ -1748,14 +1782,14 @@
         package:test/a.dart
         package:test/b.dart
       functions
-        #F1 hasImplicitReturnType isCompleteDeclaration isOriginDeclaration isStatic foo (nameOffset:34) (firstTokenOffset:34) (offset:34)
+        #F1 hasImplicitReturnType isCompleteDeclaration isOriginDeclaration isStatic foo (nameOffset:35) (firstTokenOffset:35) (offset:35)
           element: <testLibrary>::@function::foo
           formalParameters
-            #F2 optionalPositional hasImplicitType isOriginDeclaration p (nameOffset:39) (firstTokenOffset:39) (offset:39)
+            #F2 optionalPositional hasImplicitType isOriginDeclaration p (nameOffset:40) (firstTokenOffset:40) (offset:40)
               element: <testLibrary>::@function::foo::@formalParameter::p
               initializer: expression_0
                 SimpleIdentifier
-                  token: V @43
+                  token: V @44
                   element: multiplyDefinedElement
                     package:test/a.dart::@function::V
                     package:test/b.dart::@function::V
@@ -1776,14 +1810,19 @@
   }
 
   test_invalid_nameConflict_imported_exported() async {
-    newFile('$testPackageLibPath/a.dart', 'V() {}');
-    newFile('$testPackageLibPath/b.dart', 'V() {}');
+    newFile('$testPackageLibPath/a.dart', r'''
+V() {}
+''');
+    newFile('$testPackageLibPath/b.dart', r'''
+V() {}
+''');
     newFile('$testPackageLibPath/c.dart', r'''
 export 'a.dart';
 export 'b.dart';
 ''');
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 import 'c.dart';
+
 foo([p = V]) {}
 ''');
     checkElementText(library, r'''
@@ -1795,14 +1834,14 @@
       libraryImports
         package:test/c.dart
       functions
-        #F1 hasImplicitReturnType isCompleteDeclaration isOriginDeclaration isStatic foo (nameOffset:17) (firstTokenOffset:17) (offset:17)
+        #F1 hasImplicitReturnType isCompleteDeclaration isOriginDeclaration isStatic foo (nameOffset:18) (firstTokenOffset:18) (offset:18)
           element: <testLibrary>::@function::foo
           formalParameters
-            #F2 optionalPositional hasImplicitType isOriginDeclaration p (nameOffset:22) (firstTokenOffset:22) (offset:22)
+            #F2 optionalPositional hasImplicitType isOriginDeclaration p (nameOffset:23) (firstTokenOffset:23) (offset:23)
               element: <testLibrary>::@function::foo::@formalParameter::p
               initializer: expression_0
                 SimpleIdentifier
-                  token: V @26
+                  token: V @27
                   element: package:test/a.dart::@function::V
                   staticType: dynamic Function()
   functions
@@ -1821,7 +1860,7 @@
   }
 
   test_invalid_nameConflict_local() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 foo([p = V]) {}
 V() {}
 var V;
@@ -1900,13 +1939,16 @@
   }
 
   test_nameConflict_exportedAndLocal() async {
-    newFile('$testPackageLibPath/a.dart', 'class C {}');
-    newFile('$testPackageLibPath/c.dart', '''
+    newFile('$testPackageLibPath/a.dart', r'''
+class C {}
+''');
+    newFile('$testPackageLibPath/c.dart', r'''
 export 'a.dart';
 class C {}
 ''');
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 import 'c.dart';
+
 C v = null;
 ''');
     checkElementText(library, r'''
@@ -1918,16 +1960,16 @@
       libraryImports
         package:test/c.dart
       topLevelVariables
-        #F1 hasInitializer isOriginDeclaration isStatic v (nameOffset:19) (firstTokenOffset:19) (offset:19)
+        #F1 hasInitializer isOriginDeclaration isStatic v (nameOffset:20) (firstTokenOffset:20) (offset:20)
           element: <testLibrary>::@topLevelVariable::v
       getters
-        #F2 isCompleteDeclaration isOriginVariable isStatic v (nameOffset:<null>) (firstTokenOffset:<null>) (offset:19)
+        #F2 isCompleteDeclaration isOriginVariable isStatic v (nameOffset:<null>) (firstTokenOffset:<null>) (offset:20)
           element: <testLibrary>::@getter::v
       setters
-        #F3 isCompleteDeclaration isOriginVariable isStatic v (nameOffset:<null>) (firstTokenOffset:<null>) (offset:19)
+        #F3 isCompleteDeclaration isOriginVariable isStatic v (nameOffset:<null>) (firstTokenOffset:<null>) (offset:20)
           element: <testLibrary>::@setter::v
           formalParameters
-            #F4 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:19)
+            #F4 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:20)
               element: <testLibrary>::@setter::v::@formalParameter::value
   topLevelVariables
     hasInitializer isOriginDeclaration isStatic v
@@ -1956,14 +1998,19 @@
   }
 
   test_nameConflict_exportedAndLocal_exported() async {
-    newFile('$testPackageLibPath/a.dart', 'class C {}');
-    newFile('$testPackageLibPath/c.dart', '''
+    newFile('$testPackageLibPath/a.dart', r'''
+class C {}
+''');
+    newFile('$testPackageLibPath/c.dart', r'''
 export 'a.dart';
 class C {}
 ''');
-    newFile('$testPackageLibPath/d.dart', 'export "c.dart";');
-    var library = await buildLibrary('''
+    newFile('$testPackageLibPath/d.dart', r'''
+export "c.dart";
+''');
+    var library = await buildLibrary(r'''
 import 'd.dart';
+
 C v = null;
 ''');
     checkElementText(library, r'''
@@ -1975,16 +2022,16 @@
       libraryImports
         package:test/d.dart
       topLevelVariables
-        #F1 hasInitializer isOriginDeclaration isStatic v (nameOffset:19) (firstTokenOffset:19) (offset:19)
+        #F1 hasInitializer isOriginDeclaration isStatic v (nameOffset:20) (firstTokenOffset:20) (offset:20)
           element: <testLibrary>::@topLevelVariable::v
       getters
-        #F2 isCompleteDeclaration isOriginVariable isStatic v (nameOffset:<null>) (firstTokenOffset:<null>) (offset:19)
+        #F2 isCompleteDeclaration isOriginVariable isStatic v (nameOffset:<null>) (firstTokenOffset:<null>) (offset:20)
           element: <testLibrary>::@getter::v
       setters
-        #F3 isCompleteDeclaration isOriginVariable isStatic v (nameOffset:<null>) (firstTokenOffset:<null>) (offset:19)
+        #F3 isCompleteDeclaration isOriginVariable isStatic v (nameOffset:<null>) (firstTokenOffset:<null>) (offset:20)
           element: <testLibrary>::@setter::v
           formalParameters
-            #F4 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:19)
+            #F4 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:20)
               element: <testLibrary>::@setter::v::@formalParameter::value
   topLevelVariables
     hasInitializer isOriginDeclaration isStatic v
@@ -2013,18 +2060,21 @@
   }
 
   test_nameConflict_exportedAndParted() async {
-    newFile('$testPackageLibPath/a.dart', 'class C {}');
-    newFile('$testPackageLibPath/b.dart', '''
+    newFile('$testPackageLibPath/a.dart', r'''
+class C {}
+''');
+    newFile('$testPackageLibPath/b.dart', r'''
 part of lib;
 class C {}
 ''');
-    newFile('$testPackageLibPath/c.dart', '''
+    newFile('$testPackageLibPath/c.dart', r'''
 library lib;
 export 'a.dart';
 part 'b.dart';
 ''');
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 import 'c.dart';
+
 C v = null;
 ''');
     checkElementText(library, r'''
@@ -2036,16 +2086,16 @@
       libraryImports
         package:test/c.dart
       topLevelVariables
-        #F1 hasInitializer isOriginDeclaration isStatic v (nameOffset:19) (firstTokenOffset:19) (offset:19)
+        #F1 hasInitializer isOriginDeclaration isStatic v (nameOffset:20) (firstTokenOffset:20) (offset:20)
           element: <testLibrary>::@topLevelVariable::v
       getters
-        #F2 isCompleteDeclaration isOriginVariable isStatic v (nameOffset:<null>) (firstTokenOffset:<null>) (offset:19)
+        #F2 isCompleteDeclaration isOriginVariable isStatic v (nameOffset:<null>) (firstTokenOffset:<null>) (offset:20)
           element: <testLibrary>::@getter::v
       setters
-        #F3 isCompleteDeclaration isOriginVariable isStatic v (nameOffset:<null>) (firstTokenOffset:<null>) (offset:19)
+        #F3 isCompleteDeclaration isOriginVariable isStatic v (nameOffset:<null>) (firstTokenOffset:<null>) (offset:20)
           element: <testLibrary>::@setter::v
           formalParameters
-            #F4 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:19)
+            #F4 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:20)
               element: <testLibrary>::@setter::v::@formalParameter::value
   topLevelVariables
     hasInitializer isOriginDeclaration isStatic v
@@ -2074,11 +2124,10 @@
   }
 
   test_nested_generic_functions_in_generic_class_with_function_typed_params() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class C<T, U> {
   void g<V, W>() {
-    void h<X, Y>(void p(T t, U u, V v, W w, X x, Y y)) {
-    }
+    void h<X, Y>(void p(T t, U u, V v, W w, X x, Y y)) {}
   }
 }
 ''');
@@ -2135,7 +2184,7 @@
   }
 
   test_nested_generic_functions_in_generic_class_with_local_variables() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class C<T, U> {
   void g<V, W>() {
     void h<X, Y>() {
@@ -2202,11 +2251,10 @@
   }
 
   test_nested_generic_functions_with_function_typed_param() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 void f<T, U>() {
   void g<V, W>() {
-    void h<X, Y>(void p(T t, U u, V v, W w, X x, Y y)) {
-    }
+    void h<X, Y>(void p(T t, U u, V v, W w, X x, Y y)) {}
   }
 }
 ''');
@@ -2238,7 +2286,7 @@
   }
 
   test_nested_generic_functions_with_local_variables() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 void f<T, U>() {
   void g<V, W>() {
     void h<X, Y>() {
@@ -2280,7 +2328,7 @@
   }
 
   test_propagated_type_refers_to_closure() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 void f() {
   var x = () => 0;
   var y = x;
@@ -2304,7 +2352,7 @@
   }
 
   test_syntheticFunctionType_genericClosure() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 final v = f() ? <T>(T t) => 0 : <T>(T t) => 1;
 bool f() => true;
 ''');
@@ -2344,7 +2392,7 @@
   }
 
   test_syntheticFunctionType_genericClosure_inGenericFunction() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 void f<T, U>(bool b) {
   final v = b ? <V>(T t, U u, V v) => 0 : <V>(T t, U u, V v) => 1;
 }
@@ -2384,10 +2432,11 @@
   }
 
   test_syntheticFunctionType_inGenericClass() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 class C<T, U> {
   var v = f() ? (T t, U u) => 0 : (T t, U u) => 1;
 }
+
 bool f() => false;
 ''');
     checkElementText(library, r'''
@@ -2421,7 +2470,7 @@
                 #F8 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:22)
                   element: <testLibrary>::@class::C::@setter::v::@formalParameter::value
       functions
-        #F9 isCompleteDeclaration isOriginDeclaration isStatic f (nameOffset:74) (firstTokenOffset:69) (offset:74)
+        #F9 isCompleteDeclaration isOriginDeclaration isStatic f (nameOffset:75) (firstTokenOffset:70) (offset:75)
           element: <testLibrary>::@function::f
   classes
     hasNonFinalField isSimplyBounded class C
@@ -2468,7 +2517,7 @@
   }
 
   test_syntheticFunctionType_inGenericFunction() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 void f<T, U>(bool b) {
   var v = b ? (T t, U u) => 0 : (T t, U u) => 1;
 }
@@ -2508,7 +2557,7 @@
   }
 
   test_syntheticFunctionType_noArguments() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 final v = f() ? () => 0 : () => 1;
 bool f() => true;
 ''');
@@ -2548,7 +2597,7 @@
   }
 
   test_syntheticFunctionType_withArguments() async {
-    var library = await buildLibrary('''
+    var library = await buildLibrary(r'''
 final v = f() ? (int x, String y) => 0 : (int x, String y) => 1;
 bool f() => true;
 ''');
@@ -2588,7 +2637,9 @@
   }
 
   test_type_arguments_explicit_dynamic_dynamic() async {
-    var library = await buildLibrary('Map<dynamic, dynamic> m;');
+    var library = await buildLibrary(r'''
+Map<dynamic, dynamic> m;
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -2634,7 +2685,9 @@
   }
 
   test_type_arguments_explicit_dynamic_int() async {
-    var library = await buildLibrary('Map<dynamic, int> m;');
+    var library = await buildLibrary(r'''
+Map<dynamic, int> m;
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -2680,7 +2733,9 @@
   }
 
   test_type_arguments_explicit_String_dynamic() async {
-    var library = await buildLibrary('Map<String, dynamic> m;');
+    var library = await buildLibrary(r'''
+Map<String, dynamic> m;
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -2726,7 +2781,9 @@
   }
 
   test_type_arguments_explicit_String_int() async {
-    var library = await buildLibrary('Map<String, int> m;');
+    var library = await buildLibrary(r'''
+Map<String, int> m;
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -2772,7 +2829,9 @@
   }
 
   test_type_arguments_implicit() async {
-    var library = await buildLibrary('Map m;');
+    var library = await buildLibrary(r'''
+Map m;
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -2818,7 +2877,9 @@
   }
 
   test_type_dynamic() async {
-    var library = await buildLibrary('dynamic d;');
+    var library = await buildLibrary(r'''
+dynamic d;
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -2864,7 +2925,9 @@
   }
 
   test_type_unresolved() async {
-    var library = await buildLibrary('C c;');
+    var library = await buildLibrary(r'''
+C c;
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -2910,7 +2973,11 @@
   }
 
   test_type_unresolved_prefixed() async {
-    var library = await buildLibrary('import "dart:core" as core; core.C c;');
+    var library = await buildLibrary(r'''
+import "dart:core" as core;
+
+core.C c;
+''');
     checkElementText(library, r'''
 library
   reference: <testLibrary>
@@ -2923,16 +2990,16 @@
         <testLibraryFragment>::@prefix::core
           fragments: @22
       topLevelVariables
-        #F1 isOriginDeclaration isStatic c (nameOffset:35) (firstTokenOffset:35) (offset:35)
+        #F1 isOriginDeclaration isStatic c (nameOffset:36) (firstTokenOffset:36) (offset:36)
           element: <testLibrary>::@topLevelVariable::c
       getters
-        #F2 isCompleteDeclaration isOriginVariable isStatic c (nameOffset:<null>) (firstTokenOffset:<null>) (offset:35)
+        #F2 isCompleteDeclaration isOriginVariable isStatic c (nameOffset:<null>) (firstTokenOffset:<null>) (offset:36)
           element: <testLibrary>::@getter::c
       setters
-        #F3 isCompleteDeclaration isOriginVariable isStatic c (nameOffset:<null>) (firstTokenOffset:<null>) (offset:35)
+        #F3 isCompleteDeclaration isOriginVariable isStatic c (nameOffset:<null>) (firstTokenOffset:<null>) (offset:36)
           element: <testLibrary>::@setter::c
           formalParameters
-            #F4 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:35)
+            #F4 requiredPositional value (nameOffset:<null>) (firstTokenOffset:<null>) (offset:36)
               element: <testLibrary>::@setter::c::@formalParameter::value
   topLevelVariables
     isOriginDeclaration isStatic c
diff --git a/pkg/analyzer_plugin/api.txt b/pkg/analyzer_plugin/api.txt
index 676d69d..49b7c3ba 100644
--- a/pkg/analyzer_plugin/api.txt
+++ b/pkg/analyzer_plugin/api.txt
@@ -2103,10 +2103,7 @@
   int (referenced)
 dart:isolate:
   SendPort (referenced)
-package:_fe_analyzer_shared/src/base/diagnostic_message.dart:
-  DiagnosticMessage@2 (referenced)
 package:_fe_analyzer_shared/src/base/errors.dart:
-  Diagnostic (referenced)
   DiagnosticSeverity (referenced)
   DiagnosticType (referenced)
 package:_fe_analyzer_shared/src/base/source_range.dart:
@@ -2143,6 +2140,8 @@
   TypeProvider (referenced)
 package:analyzer/dart/element/type_system.dart:
   TypeSystem (referenced)
+package:analyzer/diagnostic/diagnostic.dart:
+  Diagnostic (referenced)
 package:analyzer/file_system/file_system.dart:
   Folder (referenced)
   ResourceProvider (referenced)
@@ -2162,5 +2161,7 @@
   FunctionBody (referenced)
   NodeList (referenced)
   TypeAnnotation (referenced)
+package:analyzer/src/diagnostic/diagnostic.dart:
+  DiagnosticMessage@2 (referenced)
 package:pub_semver/src/version.dart:
   Version (referenced)
diff --git a/pkg/analyzer_plugin/test/utilities/analyzer_converter_test.dart b/pkg/analyzer_plugin/test/utilities/analyzer_converter_test.dart
index 2794479..087433d 100644
--- a/pkg/analyzer_plugin/test/utilities/analyzer_converter_test.dart
+++ b/pkg/analyzer_plugin/test/utilities/analyzer_converter_test.dart
@@ -9,8 +9,9 @@
 import 'package:analyzer/source/line_info.dart' as analyzer;
 import 'package:analyzer/src/dart/analysis/analysis_options.dart' as analyzer;
 import 'package:analyzer/src/dart/element/element.dart' as analyzer;
+import 'package:analyzer/src/diagnostic/diagnostic.dart'
+    show DiagnosticMessageImpl;
 import 'package:analyzer/src/diagnostic/diagnostic.dart' as diag;
-import 'package:analyzer/src/diagnostic/diagnostic_message.dart' as analyzer;
 import 'package:analyzer_plugin/protocol/protocol_common.dart' as plugin;
 import 'package:analyzer_plugin/utilities/analyzer_converter.dart';
 import 'package:test/test.dart';
@@ -58,14 +59,14 @@
     int offset, {
     String? contextMessage,
   }) async {
-    var contextMessages = <analyzer.DiagnosticMessageImpl>[];
+    var contextMessages = <DiagnosticMessageImpl>[];
 
     await resolveTestCode('');
     var testSource = result.unit.declaredFragment!.source;
 
     if (contextMessage != null) {
       contextMessages.add(
-        analyzer.DiagnosticMessageImpl(
+        DiagnosticMessageImpl(
           filePath: testSource.fullName,
           offset: 53,
           length: 7,
diff --git a/pkg/analyzer_testing/api.txt b/pkg/analyzer_testing/api.txt
index 6e92e00..34d015f 100644
--- a/pkg/analyzer_testing/api.txt
+++ b/pkg/analyzer_testing/api.txt
@@ -97,8 +97,9 @@
   bool (referenced)
   int (referenced)
 package:_fe_analyzer_shared/src/base/errors.dart:
-  Diagnostic (referenced)
   DiagnosticCode (referenced)
+package:analyzer/diagnostic/diagnostic.dart:
+  Diagnostic (referenced)
 package:analyzer/file_system/file_system.dart:
   File (referenced)
   Folder (referenced)
diff --git a/pkg/analyzer_testing/lib/src/expected_diagnostics.dart b/pkg/analyzer_testing/lib/src/expected_diagnostics.dart
new file mode 100644
index 0000000..189c994
--- /dev/null
+++ b/pkg/analyzer_testing/lib/src/expected_diagnostics.dart
@@ -0,0 +1,425 @@
+// Copyright (c) 2026, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analyzer/diagnostic/diagnostic.dart';
+import 'package:analyzer/source/line_info.dart';
+import 'package:analyzer_testing/utilities/extensions/diagnostic_code.dart';
+
+/// Returns [content] with canonical diagnostic expectation markers.
+///
+/// Existing diagnostic expectation marker lines are removed before the new
+/// markers are inserted, so [content] can be either unmarked or already marked.
+String updateExpectedDiagnostics({
+  required String content,
+  required List<Diagnostic> actualDiagnostics,
+}) {
+  return _ExpectedDiagnosticsUpdater(content).update(actualDiagnostics);
+}
+
+final class _ExpectedDiagnosticsUpdater {
+  final List<_Line> lines;
+  final LineInfo lineInfo;
+  final Map<int, List<_GeneratedMarker>> markersByLine = {};
+
+  int nextMarkerIndex = 0;
+  int nextContextId = 1;
+
+  _ExpectedDiagnosticsUpdater(String content)
+    : lines = _Line.parse(content),
+      lineInfo = LineInfo.fromContent(content);
+
+  String update(List<Diagnostic> actualDiagnostics) {
+    _generateMarkers(actualDiagnostics);
+    return _writeContent();
+  }
+
+  void _addMarker(int lineNumber, _GeneratedMarker marker) {
+    markersByLine.putIfAbsent(lineNumber, () => []).add(marker);
+  }
+
+  /// Builds a caret marker line for a one-based [column] and [length].
+  String _caretLine(int column, int length) {
+    return '//${' ' * (column - 3)}${'^' * length}';
+  }
+
+  void _generateDiagnosticMarkers(Diagnostic diagnostic) {
+    var contextRefs = <int>[];
+    for (var contextMessage in diagnostic.contextMessages) {
+      if (contextMessage.filePath != diagnostic.problemMessage.filePath) {
+        // TODO(scheglov): Support generating expectations for context
+        // messages in other files.
+        throw StateError(
+          'Cannot generate a diagnostic expectation with a context message '
+          'in another file.',
+        );
+      }
+
+      var id = nextContextId++;
+      contextRefs.add(id);
+      var location = _markerLocation(
+        offset: contextMessage.offset,
+        length: contextMessage.length,
+      );
+      var line = lines[location.lineNumber - 1];
+      var presentation = _markerPresentation(
+        line,
+        column: location.column,
+        length: contextMessage.length,
+      );
+      _addMarker(
+        location.lineNumber,
+        _GeneratedMarker.context(
+          offset: contextMessage.offset,
+          index: nextMarkerIndex++,
+          id: id,
+          column: location.column,
+          length: contextMessage.length,
+          caretLength: presentation.caretLength,
+          includeExplicitLocation: presentation.includeExplicitLocation,
+          message: contextMessage.messageText(includeUrl: false),
+        ),
+      );
+    }
+
+    var location = _markerLocation(
+      offset: diagnostic.offset,
+      length: diagnostic.length,
+    );
+    var line = lines[location.lineNumber - 1];
+    var presentation = _markerPresentation(
+      line,
+      column: location.column,
+      length: diagnostic.length,
+    );
+    _addMarker(
+      location.lineNumber,
+      _GeneratedMarker.diagnostic(
+        offset: diagnostic.offset,
+        index: nextMarkerIndex++,
+        constantName: diagnostic.diagnosticCode.constantName,
+        column: location.column,
+        length: diagnostic.length,
+        caretLength: presentation.caretLength,
+        includeExplicitLocation: presentation.includeExplicitLocation,
+        contextRefs: contextRefs,
+        message: diagnostic.problemMessage.messageText(includeUrl: false),
+      ),
+    );
+  }
+
+  void _generateMarkers(List<Diagnostic> actualDiagnostics) {
+    var sortedDiagnostics = actualDiagnostics.toList()
+      ..sort((first, second) => first.offset.compareTo(second.offset));
+    for (var diagnostic in sortedDiagnostics) {
+      _generateDiagnosticMarkers(diagnostic);
+    }
+  }
+
+  /// Returns where a generated marker should be written for an actual range.
+  ///
+  /// For a normal diagnostic range, the marker belongs on the line reported by
+  /// [LineInfo]. For a zero-length diagnostic, the diagnostic is often an
+  /// insertion point rather than a source span. If the input is already
+  /// marked, that insertion point can be pushed into the existing marker
+  /// comments, or to the empty line after them, even though the marker should
+  /// still be attached to the preceding real source line. In that case, keep
+  /// the marker on the source line and express the insertion point as the
+  /// column after its last character.
+  ({int lineNumber, int column}) _markerLocation({
+    required int offset,
+    required int length,
+  }) {
+    var location = lineInfo.getLocation(offset);
+    if (length == 0) {
+      // Only zero-length diagnostics can legitimately move onto marker-only
+      // text from a previous update. A non-zero range on a marker line would
+      // describe the marker comment itself, not an insertion point in code.
+      var targetLine = _targetLineForMarkerShift(location.lineNumber);
+      if (targetLine != null) {
+        return (
+          lineNumber: targetLine.number,
+          column: targetLine.text.length + 1,
+        );
+      }
+    }
+    return (lineNumber: location.lineNumber, column: location.columnNumber);
+  }
+
+  /// Returns how [column] and [length] should be shown after [line].
+  ///
+  /// Caret lines start with `//`, so columns 1 and 2 cannot be represented. A
+  /// zero-length range may still use a one-character caret as a visual anchor,
+  /// but must keep explicit `[column ...][length 0]` metadata.
+  ({int? caretLength, bool includeExplicitLocation}) _markerPresentation(
+    _Line line, {
+    required int column,
+    required int length,
+  }) {
+    int? caretLength;
+    if (column > 2) {
+      if (length == 0 && column <= line.text.length + 1) {
+        caretLength = 1;
+      } else if (length > 0 && column + length - 1 <= line.text.length) {
+        caretLength = length;
+      }
+    }
+
+    return (
+      caretLength: caretLength,
+      includeExplicitLocation: caretLength != length,
+    );
+  }
+
+  /// Finds the real source line that owns a shifted zero-length marker.
+  ///
+  /// The updater accepts both clean source and source that already contains
+  /// diagnostic expectation comments. Existing marker comments are removed when
+  /// the new content is written, but actual diagnostics are computed before
+  /// that removal. This matters for zero-length diagnostics near the end of a
+  /// line or file: after a previous update, the analyzer may report the same
+  /// insertion point as being on a marker line, or on the empty line
+  /// immediately following marker lines.
+  ///
+  /// This method recognizes only those shifted positions. If [lineNumber]
+  /// points at ordinary source text, or at an empty line that is not directly
+  /// after a marker, there is nothing to repair and `null` is returned.
+  /// Otherwise the search walks backward over marker lines and returns the
+  /// nearest preceding non-marker line, which is where the regenerated marker
+  /// should be attached.
+  _Line? _targetLineForMarkerShift(int lineNumber) {
+    if (lineNumber < 1 || lineNumber > lines.length) {
+      return null;
+    }
+
+    var line = lines[lineNumber - 1];
+    if (!_LineMarker.isMarker(line)) {
+      // A non-marker line normally owns the reported offset. The one exception
+      // is the synthetic empty line after existing markers, which can be where
+      // EOF-style zero-length diagnostics land.
+      var previousLine = lineNumber > 1 ? lines[lineNumber - 2] : null;
+      if (line.text.isNotEmpty ||
+          previousLine == null ||
+          !_LineMarker.isMarker(previousLine)) {
+        return null;
+      }
+    }
+
+    // The reported line is either a marker line or the empty line just after
+    // marker lines. Walk back to the line these markers annotate.
+    for (var index = lineNumber - 2; index >= 0; index--) {
+      var previousLine = lines[index];
+      if (!_LineMarker.isMarker(previousLine)) {
+        return previousLine;
+      }
+    }
+    return null;
+  }
+
+  String _writeContent() {
+    var buffer = StringBuffer();
+    var isFirstLine = true;
+    for (var line in lines) {
+      if (_LineMarker.isMarker(line)) {
+        continue;
+      }
+
+      if (isFirstLine) {
+        isFirstLine = false;
+      } else {
+        buffer.writeln();
+      }
+      buffer.write(line.text);
+
+      var markers = markersByLine[line.number];
+      if (markers != null) {
+        markers.sort(_GeneratedMarker.compare);
+        ({int column, int length})? currentCaret;
+        for (var marker in markers) {
+          if (marker.caretLength case var caretLength?) {
+            var markerCaret = (column: marker.column, length: caretLength);
+            if (markerCaret != currentCaret) {
+              buffer.writeln();
+              buffer.write(_caretLine(marker.column, caretLength));
+              currentCaret = markerCaret;
+            }
+          }
+          buffer.writeln();
+          buffer.write(marker.expectationText);
+        }
+      }
+    }
+    return buffer.toString();
+  }
+}
+
+/// Generated expectation marker text for one diagnostic or context message.
+final class _GeneratedMarker {
+  /// The zero-based offset of the diagnostic or context message being marked.
+  final int offset;
+
+  /// The marker kind, used as a stable secondary sort key.
+  final _GeneratedMarkerKind kind;
+
+  /// The order in which this marker was generated.
+  final int index;
+
+  /// The one-based column of the diagnostic or context message range.
+  final int column;
+
+  /// The length of the visual caret marker, or `null` if none should be shown.
+  ///
+  /// For zero-length diagnostics, a one-character caret is useful as a visual
+  /// anchor, but the exact `[column ...][length 0]` metadata must still be
+  /// emitted.
+  final int? caretLength;
+
+  /// The expectation comment inserted after the target line.
+  final String expectationText;
+
+  /// Creates a marker for a diagnostic context message.
+  factory _GeneratedMarker.context({
+    required int offset,
+    required int index,
+    required int id,
+    required int column,
+    required int length,
+    required int? caretLength,
+    required bool includeExplicitLocation,
+    required String message,
+  }) {
+    var buffer = StringBuffer();
+    buffer.write('// [context $id]');
+    if (includeExplicitLocation) {
+      buffer.write('[column $column][length $length]');
+    }
+    buffer.write(' $message');
+
+    return _GeneratedMarker._(
+      offset: offset,
+      kind: _GeneratedMarkerKind.context,
+      index: index,
+      column: column,
+      caretLength: caretLength,
+      expectationText: buffer.toString(),
+    );
+  }
+
+  /// Creates a marker for a diagnostic.
+  factory _GeneratedMarker.diagnostic({
+    required int offset,
+    required int index,
+    required String constantName,
+    required int column,
+    required int length,
+    required int? caretLength,
+    required bool includeExplicitLocation,
+    required List<int> contextRefs,
+    required String message,
+  }) {
+    var buffer = StringBuffer();
+    buffer.write('// [$constantName]');
+    if (includeExplicitLocation) {
+      buffer.write('[column $column][length $length]');
+    }
+    for (var id in contextRefs) {
+      buffer.write('[context $id]');
+    }
+    buffer.write(' $message');
+
+    return _GeneratedMarker._(
+      offset: offset,
+      kind: _GeneratedMarkerKind.diagnostic,
+      index: index,
+      column: column,
+      caretLength: caretLength,
+      expectationText: buffer.toString(),
+    );
+  }
+
+  _GeneratedMarker._({
+    required this.offset,
+    required this.kind,
+    required this.index,
+    required this.column,
+    required this.caretLength,
+    required this.expectationText,
+  });
+
+  /// Orders generated markers in the order they should appear after a line.
+  static int compare(_GeneratedMarker first, _GeneratedMarker second) {
+    var offsetResult = first.offset.compareTo(second.offset);
+    if (offsetResult != 0) {
+      return offsetResult;
+    }
+    var kindResult = first.kind.index.compareTo(second.kind.index);
+    if (kindResult != 0) {
+      return kindResult;
+    }
+    return first.index.compareTo(second.index);
+  }
+}
+
+enum _GeneratedMarkerKind { context, diagnostic }
+
+/// A line of text in the input content.
+final class _Line {
+  /// The one-based line number in the input content.
+  final int number;
+
+  /// The line text without the trailing newline characters.
+  final String text;
+
+  _Line({required this.number, required this.text});
+
+  /// Splits [content] into lines while preserving each line's offset.
+  ///
+  /// Lines may end with `\r`, `\n`, or `\r\n`. The newline characters are not
+  /// included in [text], but they still contribute to offsets in [content].
+  static List<_Line> parse(String content) {
+    var result = <_Line>[];
+    var lineStart = 0;
+    var lineNumber = 1;
+
+    for (var index = 0; index < content.length; index++) {
+      var codeUnit = content.codeUnitAt(index);
+      if (codeUnit == 0x0D || codeUnit == 0x0A) {
+        result.add(
+          _Line(
+            number: lineNumber++,
+            text: content.substring(lineStart, index),
+          ),
+        );
+
+        // Consume the `\n` in a `\r\n` line break.
+        if (codeUnit == 0x0D &&
+            index + 1 < content.length &&
+            content.codeUnitAt(index + 1) == 0x0A) {
+          index++;
+        }
+        lineStart = index + 1;
+      }
+    }
+
+    result.add(_Line(number: lineNumber, text: content.substring(lineStart)));
+    return result;
+  }
+}
+
+abstract final class _LineMarker {
+  /// Matches a caret marker line such as `//   ^^^`.
+  static final _caretPattern = RegExp(r'^[ \t]*//[ \t]*\^+[ \t]*$');
+
+  /// Matches generated expectation comments for diagnostics and contexts.
+  ///
+  /// The updater only needs to recognize lines to remove before regeneration.
+  /// It intentionally does not validate the full marker syntax.
+  static final _expectationPattern = RegExp(
+    r'^[ \t]*//[ \t]*\[(?:diag\.[A-Za-z_][A-Za-z0-9_]*|context[ \t]+[0-9]+)\]',
+  );
+
+  static bool isMarker(_Line line) {
+    return _caretPattern.hasMatch(line.text) ||
+        _expectationPattern.hasMatch(line.text);
+  }
+}
diff --git a/pkg/api_summary/api_summary.txt b/pkg/api_summary/api_summary.txt
new file mode 100644
index 0000000..7f6a593
--- /dev/null
+++ b/pkg/api_summary/api_summary.txt
@@ -0,0 +1,25 @@
+package:api_summary/api_summary.dart:
+  summarizePackage (function: Future<String> Function(String, String, {ApiSummaryCustomizer Function()? createCustomizer}))
+  ApiSummaryCustomizer (class extends Object, base):
+    new (constructor: ApiSummaryCustomizer Function())
+    analysisContext= (setter: AnalysisContext)
+    packageName= (setter: String)
+    publicApiLibraries= (setter: Iterable<LibraryElement>)
+    topLevelPublicElements (getter: Set<Element>)
+    topLevelPublicElements= (setter: Set<Element>)
+    initialScanComplete (method: Future<void> Function())
+    setupComplete (method: Future<void> Function())
+    shouldShowDetails (method: bool Function(Element))
+dart:async:
+  Future (referenced)
+dart:core:
+  Iterable (referenced)
+  Object (referenced)
+  Set (referenced)
+  String (referenced)
+  bool (referenced)
+package:analyzer/dart/analysis/analysis_context.dart:
+  AnalysisContext (referenced)
+package:analyzer/dart/element/element.dart:
+  Element (referenced)
+  LibraryElement (referenced)
diff --git a/pkg/api_summary/bin/api_summary.dart b/pkg/api_summary/bin/api_summary.dart
new file mode 100644
index 0000000..54002b0
--- /dev/null
+++ b/pkg/api_summary/bin/api_summary.dart
@@ -0,0 +1,81 @@
+// Copyright (c) 2026, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:io';
+
+import 'package:api_summary/api_summary.dart';
+import 'package:args/args.dart';
+import 'package:path/path.dart' as p;
+import 'package:yaml/yaml.dart';
+
+Future<void> main(List<String> arguments) async {
+  try {
+    final results = parser.parse(arguments);
+
+    if (results.flag('help')) {
+      print('Usage: api_summary [options]');
+      print(parser.usage);
+      return;
+    }
+
+    final packagePath =
+        results.option('package-path') ?? Directory.current.path;
+    final absolutePath = p.normalize(p.absolute(packagePath));
+    final pubspecFile = File(p.join(absolutePath, 'pubspec.yaml'));
+
+    if (!pubspecFile.existsSync()) {
+      stderr.writeln('Error: No pubspec.yaml found at "$absolutePath".');
+      exitCode = 1;
+      return;
+    }
+
+    final packageName = _extractPackageName(pubspecFile);
+    final summary = await summarizePackage(absolutePath, packageName);
+    stdout.write(summary);
+  } on FormatException catch (e) {
+    stderr.writeln('Error: ${e.message}');
+    stderr.writeln('\nUsage: api_summary [options]');
+    stderr.writeln(parser.usage);
+    exitCode = 64;
+    return;
+  }
+}
+
+final parser = ArgParser()
+  ..addOption(
+    'package-path',
+    abbr: 'p',
+    help:
+        'The path to the package to summarize. Defaults to the current '
+        'directory.',
+  )
+  ..addFlag(
+    'help',
+    abbr: 'h',
+    help: 'Print this usage information.',
+    negatable: false,
+  );
+
+String _extractPackageName(File pubspecFile) {
+  final content = pubspecFile.readAsStringSync();
+  final yaml = loadYaml(content);
+  if (yaml is! Map) {
+    throw ArgumentError(
+      'Expected pubspec.yaml at ${pubspecFile.path} to be a YAML map.',
+    );
+  }
+  final name = yaml['name'];
+  if (name == null) {
+    throw ArgumentError(
+      'Could not find a "name" field in pubspec.yaml at ${pubspecFile.path}.',
+    );
+  }
+  if (name is! String) {
+    throw ArgumentError(
+      'The "name" field in pubspec.yaml at ${pubspecFile.path} must be a '
+      'String.',
+    );
+  }
+  return name;
+}
diff --git a/pkg/api_summary/pubspec.yaml b/pkg/api_summary/pubspec.yaml
index 36303cc..5a65c1d 100644
--- a/pkg/api_summary/pubspec.yaml
+++ b/pkg/api_summary/pubspec.yaml
@@ -11,7 +11,10 @@
 # Use 'any' constraints here; we get our versions from the DEPS file.
 dependencies:
   analyzer: any
+  args: any
   collection: any
+  path: any
+  yaml: any
 
 # Use 'any' constraints here; we get our versions from the DEPS file.
 dev_dependencies:
diff --git a/pkg/api_summary/test/app_test.dart b/pkg/api_summary/test/app_test.dart
new file mode 100644
index 0000000..b0b3a96
--- /dev/null
+++ b/pkg/api_summary/test/app_test.dart
@@ -0,0 +1,58 @@
+// Copyright (c) 2026, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:convert';
+import 'dart:io';
+import 'package:path/path.dart' as p;
+import 'package:test/test.dart';
+
+void main() {
+  test('api_summary output matches api_summary.txt', () async {
+    final packageDir = _pkgDir();
+
+    final result = await Process.run(Platform.resolvedExecutable, [
+      if (Platform.packageConfig != null)
+        '--packages=${Platform.packageConfig}',
+      p.join(packageDir, 'bin', 'api_summary.dart'),
+      '-p',
+      packageDir,
+    ], workingDirectory: packageDir);
+
+    expect(
+      result.exitCode,
+      equals(0),
+      reason: 'CLI run failed with stderr:\n${result.stderr}',
+    );
+
+    final goldenFile = File(p.join(packageDir, 'api_summary.txt'));
+    final expectedOutput = LineSplitter.split(
+      goldenFile.readAsStringSync(),
+    ).join('\n');
+    final actualOutput = LineSplitter.split(
+      result.stdout.toString(),
+    ).join('\n');
+
+    expect(actualOutput, equals(expectedOutput));
+  });
+}
+
+// Dynamically locate the api_summary package root
+String _pkgDir() {
+  var packageDir = p.normalize(p.absolute(Directory.current.path));
+  if (!_isApiSummaryDir(packageDir)) {
+    // We might be running from the SDK root
+    final candidate = p.join(packageDir, 'pkg', 'api_summary');
+    if (_isApiSummaryDir(candidate)) {
+      packageDir = candidate;
+    }
+  }
+
+  return packageDir;
+}
+
+bool _isApiSummaryDir(String dir) {
+  final pubspec = File(p.join(dir, 'pubspec.yaml'));
+  if (!pubspec.existsSync()) return false;
+  return pubspec.readAsStringSync().contains('name: api_summary');
+}
diff --git a/pkg/cfg/lib/front_end/ast_to_ir.dart b/pkg/cfg/lib/front_end/ast_to_ir.dart
index 249b260..4251410 100644
--- a/pkg/cfg/lib/front_end/ast_to_ir.dart
+++ b/pkg/cfg/lib/front_end/ast_to_ir.dart
@@ -56,6 +56,7 @@
     function.member,
     GlobalContext.instance.typeEnvironment,
   );
+  late final ClosureLayout _currentClosureLayout;
 
   Map<ast.LabeledStatement, JoinBlock>? labeledStatements;
   Map<ast.SwitchCase, JoinBlock>? switchCases;
@@ -85,6 +86,10 @@
       scopes,
       function,
     );
+    final f = function;
+    if (f is ClosureFunction) {
+      _currentClosureLayout = _computeClosureLayout(f);
+    }
   }
 
   /// Create [FlowGraph] for the body of the [function].
@@ -151,13 +156,34 @@
           if (function.hasClassTypeParameters) {
             if (function.hasReceiverParameter) {
               builder.addLoadLocal(localVarIndexer.receiver);
-            } else {
-              assert(_isCaptured(localVarIndexer.receiverDeclaration!));
-              throw 'Unimplemented _buildPrologue for class type parameters with captured receiver';
+              classTypeParameters = builder.addTypeParameters(
+                .classTypeParameters,
+              );
+            } else if (_isCaptured(localVarIndexer.receiverDeclaration!)) {
+              // Read captured receiver. Load context from closure
+              // as contexts are not defined yet.
+              final variable = localVarIndexer.receiverDeclaration!;
+              builder.addLoadLocal(localVarIndexer.closure);
+              builder.addLoadInstanceField(
+                CField(
+                  ClosureField(
+                    _currentClosureLayout.firstContextIndex +
+                        scopes
+                            .getCapturedContexts(
+                              function.functionNode!,
+                              enableAsserts: enableAsserts,
+                            )
+                            .indexOf(scopes.getVariableContext(variable)),
+                  ),
+                ),
+              );
+              builder.addLoadInstanceField(
+                localVarIndexer.contextField(variable),
+              );
+              classTypeParameters = builder.addTypeParameters(
+                .classTypeParameters,
+              );
             }
-            classTypeParameters = builder.addTypeParameters(
-              .classTypeParameters,
-            );
           }
       }
     }
@@ -819,16 +845,26 @@
       return;
     }
     if (node is ast.FunctionNode) {
-      var index = 0;
-      for (final context in scopes.getCapturedContexts(
-        node,
-        enableAsserts: enableAsserts,
-      )) {
-        assert(_isCapturedContext(context));
-        builder.addLoadLocal(localVarIndexer.closure);
-        builder.addLoadInstanceField(CField(ClosureField(index)));
-        localVarIndexer.defineContext(context, builder.pop());
-        ++index;
+      assert(function.functionNode == node);
+      if (function is ClosureFunction) {
+        var index = _currentClosureLayout.firstContextIndex;
+        for (final context in scopes.getCapturedContexts(
+          node,
+          enableAsserts: enableAsserts,
+        )) {
+          assert(_isCapturedContext(context));
+          assert(index < _currentClosureLayout.length);
+          builder.addLoadLocal(localVarIndexer.closure);
+          builder.addLoadInstanceField(CField(ClosureField(index)));
+          localVarIndexer.defineContext(context, builder.pop());
+          ++index;
+        }
+      } else {
+        assert(
+          scopes
+              .getCapturedContexts(node, enableAsserts: enableAsserts)
+              .isEmpty,
+        );
       }
     }
     final scope = scopes.getScope(node);
@@ -1763,18 +1799,82 @@
             as ClosureFunction;
     onLocalFunction(closureFunction);
 
-    // TODO: capture (parent) function type arguments and instantiator
-    // type arguments if needed.
+    final closureLayout = _computeClosureLayout(closureFunction);
+    final closure = builder.addAllocateClosure(
+      closureFunction,
+      closureLayout,
+      type,
+    );
+
+    if (closureLayout.hasClassTypeArgs) {
+      assert(typeParametersStyle == .separateFunctionAndClassTypeParameters);
+      builder.push(closure);
+      builder.push(classTypeParameters!);
+      builder.addStoreInstanceField(
+        CField(ClosureField(closureLayout.classTypeArgsIndex)),
+      );
+    }
+
+    if (closureLayout.hasFunctionTypeArgs) {
+      assert(typeParametersStyle == .separateFunctionAndClassTypeParameters);
+      builder.push(closure);
+      builder.push(functionTypeParameters!);
+      builder.addStoreInstanceField(
+        CField(ClosureField(closureLayout.functionTypeArgsIndex)),
+      );
+    }
 
     final contexts = scopes.getCapturedContexts(
       node.function,
       enableAsserts: enableAsserts,
     );
+    var index = closureLayout.firstContextIndex;
     for (final context in contexts) {
       assert(_isCapturedContext(context));
+      assert(index < closureLayout.length);
+      builder.push(closure);
       builder.push(localVarIndexer.contextDef(context));
+      // TODO: cache and reuse ClosureField objects.
+      builder.addStoreInstanceField(CField(ClosureField(index++)));
     }
-    builder.addAllocateClosure(closureFunction, type, contexts.length);
+  }
+
+  ClosureLayout _computeClosureLayout(ClosureFunction closureFunction) {
+    var hasDelayedTypeArgs = false;
+    var hasClassTypeArgs = false;
+    var hasFunctionTypeArgs = false;
+    switch (typeParametersStyle) {
+      case .separateFunctionAndClassTypeParameters:
+        hasDelayedTypeArgs = closureFunction.hasFunctionTypeParameters;
+
+        final visitor = _FindTypeParameters();
+        closureFunction.functionNode!
+            .computeFunctionType(ast.Nullability.nonNullable)
+            .accept(visitor);
+        hasClassTypeArgs = visitor.containsClassTypeParams;
+
+        hasFunctionTypeArgs = switch (closureFunction) {
+          LocalFunction() => closureFunction.hasGenericEnclosingFunction(),
+          TearOffFunction() => false,
+        };
+    }
+    final numContexts = switch (closureFunction) {
+      LocalFunction() =>
+        scopes
+            .getCapturedContexts(
+              closureFunction.functionNode!,
+              enableAsserts: enableAsserts,
+            )
+            .length,
+      TearOffFunction() =>
+        closureFunction.member.isInstanceMember ? /* receiver */ 1 : 0,
+    };
+    return ClosureLayout(
+      numContexts,
+      hasDelayedTypeArgs: hasDelayedTypeArgs,
+      hasClassTypeArgs: hasClassTypeArgs,
+      hasFunctionTypeArgs: hasFunctionTypeArgs,
+    );
   }
 
   @override
diff --git a/pkg/cfg/lib/front_end/computed_scopes.dart b/pkg/cfg/lib/front_end/computed_scopes.dart
index 691b4af..046c730 100644
--- a/pkg/cfg/lib/front_end/computed_scopes.dart
+++ b/pkg/cfg/lib/front_end/computed_scopes.dart
@@ -3,6 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:cfg/front_end/scopes.dart';
+import 'package:cfg/ir/global_context.dart';
 import 'package:kernel/ast.dart' as ast;
 
 /// Implementation of [Scopes] by computing scopes and contexts.
@@ -16,8 +17,13 @@
 
   ComputedScopes(this.member, {required this.enableAsserts}) {
     if (member.isInstanceMember || member is ast.Constructor) {
+      final type = member.enclosingClass!.getThisType(
+        GlobalContext.instance.coreTypes,
+        .nonNullable,
+      );
       thisVariable =
-          member.function?.thisVariable ?? ast.VariableDeclaration('this');
+          member.function?.thisVariable ??
+          ast.VariableDeclaration('this', type: type);
     }
     final builder = _ScopeBuilder(this);
     member.accept(builder);
diff --git a/pkg/cfg/lib/ir/field.dart b/pkg/cfg/lib/ir/field.dart
index f7681a1..3e30f02 100644
--- a/pkg/cfg/lib/ir/field.dart
+++ b/pkg/cfg/lib/ir/field.dart
@@ -56,3 +56,65 @@
         isFinal: true,
       );
 }
+
+/// Defines assignment of the closure elements.
+class ClosureLayout {
+  static const int hasDelayedTypeArgsFlag = 1 << 0;
+  static const int hasClassTypeArgsFlag = 1 << 1;
+  static const int hasFunctionTypeArgsFlag = 1 << 2;
+
+  final int _flags;
+
+  /// Total number of closure elements.
+  final int length;
+
+  ClosureLayout(
+    int numContexts, {
+    required bool hasDelayedTypeArgs,
+    required bool hasClassTypeArgs,
+    required bool hasFunctionTypeArgs,
+  }) : _flags =
+           (hasDelayedTypeArgs ? hasDelayedTypeArgsFlag : 0) |
+           (hasClassTypeArgs ? hasClassTypeArgsFlag : 0) |
+           (hasFunctionTypeArgs ? hasFunctionTypeArgsFlag : 0),
+       length =
+           (hasDelayedTypeArgs ? 1 : 0) +
+           (hasClassTypeArgs ? 1 : 0) +
+           (hasFunctionTypeArgs ? 1 : 0) +
+           numContexts {
+    assert(length == firstContextIndex + numContexts);
+  }
+
+  /// Whether closure has an element for delayed type arguments.
+  bool get hasDelayedTypeArgs => (_flags & hasDelayedTypeArgsFlag) != 0;
+
+  /// Whether closure has an element for enclosing class type arguments.
+  bool get hasClassTypeArgs => (_flags & hasClassTypeArgsFlag) != 0;
+
+  /// Whether closure has an element for enclosing function type arguments.
+  bool get hasFunctionTypeArgs => (_flags & hasFunctionTypeArgsFlag) != 0;
+
+  /// Index of the delayed type arguments element.
+  int get delayedTypeArgsIndex {
+    assert(hasDelayedTypeArgs);
+    return 0;
+  }
+
+  /// Index of the enclosing class type arguments element.
+  int get classTypeArgsIndex {
+    assert(hasClassTypeArgs);
+    return hasDelayedTypeArgs ? 1 : 0;
+  }
+
+  /// Index of the enclosing function type arguments element.
+  int get functionTypeArgsIndex {
+    assert(hasFunctionTypeArgs);
+    return (hasDelayedTypeArgs ? 1 : 0) + (hasClassTypeArgs ? 1 : 0);
+  }
+
+  int get firstContextIndex {
+    return (hasDelayedTypeArgs ? 1 : 0) +
+        (hasClassTypeArgs ? 1 : 0) +
+        (hasFunctionTypeArgs ? 1 : 0);
+  }
+}
diff --git a/pkg/cfg/lib/ir/flow_graph_builder.dart b/pkg/cfg/lib/ir/flow_graph_builder.dart
index 193d642..c9b1d03 100644
--- a/pkg/cfg/lib/ir/flow_graph_builder.dart
+++ b/pkg/cfg/lib/ir/flow_graph_builder.dart
@@ -546,17 +546,16 @@
   /// Append [AllocateClosure] to the graph.
   AllocateClosure addAllocateClosure(
     ClosureFunction function,
+    ClosureLayout closureLayout,
     CType type,
-    int inputCount,
   ) {
     final instr = AllocateClosure(
       graph,
       currentSourcePosition,
       function,
+      closureLayout,
       type,
-      inputCount: inputCount,
     );
-    popInputs(instr, 0, inputCount);
     push(instr);
     appendInstruction(instr);
     return instr;
diff --git a/pkg/cfg/lib/ir/flow_graph_checker.dart b/pkg/cfg/lib/ir/flow_graph_checker.dart
index 790fde6..e549b97 100644
--- a/pkg/cfg/lib/ir/flow_graph_checker.dart
+++ b/pkg/cfg/lib/ir/flow_graph_checker.dart
@@ -3,6 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:cfg/ir/constant_value.dart';
+import 'package:cfg/ir/field.dart';
 import 'package:cfg/ir/instructions.dart';
 import 'package:cfg/ir/ir_to_text.dart';
 import 'package:cfg/ir/types.dart';
@@ -352,11 +353,15 @@
   void visitTypeParameters(TypeParameters instr) {
     assert(instr.block is EntryBlock);
     // TypeParameters can only be used in TypeCast, TypeTest,
-    // TypeArguments and TypeLiteral.
+    // TypeArguments, TypeLiteral and StoreInstanceField for capturing.
     for (final use in instr.inputUses) {
       final user = use.getInstruction(graph);
       switch (user) {
         case TypeCast() || TypeTest() || TypeArguments() || TypeLiteral():
+        case StoreInstanceField(:var field)
+            when field.isSynthetic &&
+                (field.asSynthetic is ClosureField ||
+                    field.asSynthetic is ContextField):
           break;
         default:
           throw 'Unexpected user ${IrToText.instruction(user)} of TypeParameters';
diff --git a/pkg/cfg/lib/ir/functions.dart b/pkg/cfg/lib/ir/functions.dart
index 3193bf4..d12bc9c5 100644
--- a/pkg/cfg/lib/ir/functions.dart
+++ b/pkg/cfg/lib/ir/functions.dart
@@ -232,6 +232,19 @@
 
   @override
   SourcePosition get sourcePosition => SourcePosition(localFunction.fileOffset);
+
+  bool hasGenericEnclosingFunction() {
+    ast.TreeNode node = localFunction;
+    for (;;) {
+      node = node.parent!;
+      if (node is ast.Member) {
+        return false;
+      }
+      if (node is ast.FunctionNode && node.typeParameters.isNotEmpty) {
+        return true;
+      }
+    }
+  }
 }
 
 /// Tear-off (result of function closurization).
diff --git a/pkg/cfg/lib/ir/instructions.dart b/pkg/cfg/lib/ir/instructions.dart
index e52c868..189043a 100644
--- a/pkg/cfg/lib/ir/instructions.dart
+++ b/pkg/cfg/lib/ir/instructions.dart
@@ -1319,10 +1319,9 @@
 }
 
 /// Allocate a closure instance.
-///
-/// Takes captured values as inputs.
 final class AllocateClosure extends Definition with CanThrow, Pure {
   final ClosureFunction function;
+  final ClosureLayout closureLayout;
 
   @override
   final CType type;
@@ -1331,9 +1330,9 @@
     super.graph,
     super.sourcePosition,
     this.function,
-    this.type, {
-    required super.inputCount,
-  });
+    this.closureLayout,
+    this.type,
+  ) : super(inputCount: 0);
 
   @override
   R accept<R>(InstructionVisitor<R> v) => v.visitAllocateClosure(this);
diff --git a/pkg/cfg/lib/ir/loops.dart b/pkg/cfg/lib/ir/loops.dart
index 84b8bbc..a5dd52b 100644
--- a/pkg/cfg/lib/ir/loops.dart
+++ b/pkg/cfg/lib/ir/loops.dart
@@ -61,6 +61,15 @@
           workList.add(pred);
         }
       }
+      if (block is CatchBlock) {
+        // Blocks from the try body are implicit predecessors of a catch block.
+        for (final pred in block.graph.reversePostorder) {
+          if (pred.exceptionHandler == block && !contains(pred)) {
+            add(pred);
+            workList.add(pred);
+          }
+        }
+      }
     }
   }
 
diff --git a/pkg/cfg/testcases/capturing.dart b/pkg/cfg/testcases/capturing.dart
index 3314ab4..85b1000 100644
--- a/pkg/cfg/testcases/capturing.dart
+++ b/pkg/cfg/testcases/capturing.dart
@@ -156,12 +156,11 @@
   });
 }
 
-// TODO: support class type parameters via captured receiver
-class A /*<T>*/ {
+class A<T> {
   List<int> aField = [
     for (int i = 0; i < 10; ++i)
       () {
-        // print(T);
+        print(T);
         print(i);
         i += 2;
         return i;
diff --git a/pkg/cfg/testcases/capturing.dart.expect b/pkg/cfg/testcases/capturing.dart.expect
index e1d1cea..7c763c6 100644
--- a/pkg/cfg/testcases/capturing.dart.expect
+++ b/pkg/cfg/testcases/capturing.dart.expect
@@ -1,66 +1,83 @@
 --- A.foo47
-B0 = EntryBlock() dominates:(B9)
-  v3 = Constant(<int>)
-  v4 = Constant(0)
-  v12 = Constant(10)
-  v22 = Constant(1)
-  v30 = Constant(null)
+B0 = EntryBlock() dominates:(B14)
+  v8 = Constant(<int>)
+  v9 = Constant(0)
+  v17 = Constant(10)
+  v29 = Constant(1)
+  v37 = Constant(null)
   v1 = Parameter(this)
-  v5 = DirectCall _GrowableList.(v3, v4)
-  v7 = AllocateContext()
-  StoreInstanceField(#context-field:i, v7, v4)
-  Goto(B9)
-B9 = JoinBlock(B0, B14) idom:B0 dominates:(B15, B14) loop-header (depth:1 body:(B9, B14) back-edges:(B14))
-  v11 = LoadInstanceField(#context-field:i, v7)
-  v13 = Comparison int <(v11, v12)
-  Branch(v13, true: B14, false: B15)
-B14 = TargetBlock() idom:B9 in-loop:B9
-  v18 = AllocateClosure(v7)
-  v32 = DirectCall closure FunctionExpression(int () {
+  TypeParameters(v1)
+  v4 = AllocateContext()
+  StoreInstanceField(#context-field:this, v4, v1)
+  v10 = DirectCall _GrowableList.(v8, v9)
+  v12 = AllocateContext()
+  StoreInstanceField(#context-field:i, v12, v9)
+  Goto(B14)
+B14 = JoinBlock(B0, B19) idom:B0 dominates:(B20, B19) loop-header (depth:1 body:(B14, B19) back-edges:(B19))
+  v16 = LoadInstanceField(#context-field:i, v12)
+  v18 = Comparison int <(v16, v17)
+  Branch(v18, true: B19, false: B20)
+B19 = TargetBlock() idom:B14 in-loop:B14
+  v23 = AllocateClosure()
+  StoreInstanceField(#closure-field[0], v23, v4)
+  StoreInstanceField(#closure-field[1], v23, v12)
+  v39 = DirectCall closure FunctionExpression(int () {
+  print(A.T%);
   print(i);
   i = i.{num.+}(2);
   return i;
-}) at A.foo47(v18)
-  InterfaceCall List.add(v5, v32)
-  v21 = LoadInstanceField(#context-field:i, v7)
-  v23 = BinaryIntOp +(v21, v22)
-  StoreInstanceField(#context-field:i, v7, v23)
-  Goto(B9)
-B15 = TargetBlock() idom:B9
-  StoreInstanceField(A.aField, v1, v5)
-  DirectCall Object.(v1)
-  Return(v30)
+}) at A.foo47(v23)
+  InterfaceCall List.add(v10, v39)
+  v28 = LoadInstanceField(#context-field:i, v12)
+  v30 = BinaryIntOp +(v28, v29)
+  StoreInstanceField(#context-field:i, v12, v30)
+  Goto(B14)
+B20 = TargetBlock() idom:B14
+  StoreInstanceField(A.aField, v1, v10)
+  v35 = LoadInstanceField(#context-field:this, v4)
+  DirectCall Object.(v35)
+  Return(v37)
 
 --- closure FunctionExpression(int () {
+  print(A.T%);
   print(i);
   i = i.{num.+}(2);
   return i;
 }) at A.foo47
 B0 = EntryBlock()
-  v7 = Constant(2)
+  v10 = Constant(null)
+  v16 = Constant(2)
   v1 = Parameter(#closure)
   v3 = LoadInstanceField(#closure-field[0], v1)
-  v4 = LoadInstanceField(#context-field:i, v3)
-  DirectCall print(v4)
-  v6 = LoadInstanceField(#context-field:i, v3)
-  v8 = BinaryIntOp +(v6, v7)
-  StoreInstanceField(#context-field:i, v3, v8)
-  v10 = LoadInstanceField(#context-field:i, v3)
-  Return(v10)
+  v4 = LoadInstanceField(#context-field:this, v3)
+  v5 = TypeParameters(v4)
+  LoadInstanceField(#closure-field[0], v1)
+  v9 = LoadInstanceField(#closure-field[1], v1)
+  v11 = TypeLiteral(A.T%, v5, v10)
+  DirectCall print(v11)
+  v13 = LoadInstanceField(#context-field:i, v9)
+  DirectCall print(v13)
+  v15 = LoadInstanceField(#context-field:i, v9)
+  v17 = BinaryIntOp +(v15, v16)
+  StoreInstanceField(#context-field:i, v9, v17)
+  v19 = LoadInstanceField(#context-field:i, v9)
+  Return(v19)
 
 --- getter A.aField
 B0 = EntryBlock()
   v1 = Parameter(this)
-  v3 = LoadInstanceField(A.aField, v1)
-  Return(v3)
+  TypeParameters(v1)
+  v5 = LoadInstanceField(A.aField, v1)
+  Return(v5)
 
 --- setter A.aField
 B0 = EntryBlock()
-  v6 = Constant(null)
+  v8 = Constant(null)
   v1 = Parameter(this)
   v2 = Parameter(#value)
+  TypeParameters(v1)
   StoreInstanceField(A.aField, v1, v2)
-  Return(v6)
+  Return(v8)
 
 --- opaqueVal
 B0 = EntryBlock()
@@ -85,16 +102,16 @@
   Return(v13)
 
 --- foo42
-B0 = EntryBlock() dominates:(B14)
+B0 = EntryBlock() dominates:(B16)
   Constant(true)
-  v21 = Constant(50)
-  v23 = Constant(60)
-  v25 = Constant(70)
-  v42 = Constant(1)
-  v54 = Constant(0)
-  v59 = Constant(10)
-  v77 = Constant(90)
-  v91 = Constant(null)
+  v23 = Constant(50)
+  v25 = Constant(60)
+  v27 = Constant(70)
+  v47 = Constant(1)
+  v59 = Constant(0)
+  v64 = Constant(10)
+  v83 = Constant(90)
+  v98 = Constant(null)
   v1 = AllocateContext()
   v2 = DirectCall opaqueVal()
   StoreInstanceField(#context-field:a, v1, v2)
@@ -104,72 +121,79 @@
   StoreInstanceField(#context-field:c, v1, v6)
   v8 = DirectCall opaqueVal()
   StoreInstanceField(#context-field:d, v1, v8)
-  v10 = AllocateClosure(v1)
+  v10 = AllocateClosure()
+  StoreInstanceField(#closure-field[0], v10, v1)
   DirectCall callClosure(v10)
-  v12 = AllocateClosure(v1)
-  DirectCall callClosure(v12)
-  Goto(B14)
-B14 = JoinBlock(B0, B45) idom:B0 dominates:(B45, B44) loop-header (depth:1 body:(B14, B45) back-edges:(B45))
-  v20 = AllocateContext()
-  StoreInstanceField(#context-field:e, v20, v21)
-  StoreInstanceField(#context-field:f, v20, v23)
-  StoreInstanceField(#context-field:g, v20, v25)
-  v27 = AllocateClosure(v1)
-  DirectCall callClosure(v27)
-  v29 = AllocateClosure(v20)
+  v13 = AllocateClosure()
+  StoreInstanceField(#closure-field[0], v13, v1)
+  DirectCall callClosure(v13)
+  Goto(B16)
+B16 = JoinBlock(B0, B50) idom:B0 dominates:(B50, B49) loop-header (depth:1 body:(B16, B50) back-edges:(B50))
+  v22 = AllocateContext()
+  StoreInstanceField(#context-field:e, v22, v23)
+  StoreInstanceField(#context-field:f, v22, v25)
+  StoreInstanceField(#context-field:g, v22, v27)
+  v29 = AllocateClosure()
+  StoreInstanceField(#closure-field[0], v29, v1)
   DirectCall callClosure(v29)
-  v31 = AllocateClosure(v20)
-  DirectCall callClosure(v31)
-  v33 = LoadInstanceField(#context-field:d, v1)
-  DirectCall print(v33)
-  v35 = LoadInstanceField(#context-field:e, v20)
-  DirectCall print(v35)
-  v37 = LoadInstanceField(#context-field:f, v20)
-  DirectCall print(v37)
-  v39 = LoadInstanceField(#context-field:g, v20)
-  DirectCall print(v39)
-  v41 = DirectCall opaqueVal()
-  v43 = Comparison int ==(v41, v42)
-  Branch(v43, true: B44, false: B45)
-B44 = TargetBlock() idom:B14 dominates:(B56)
-  v53 = AllocateContext()
-  StoreInstanceField(#context-field:i, v53, v54)
-  Goto(B56)
-B56 = JoinBlock(B44, B75) idom:B44 dominates:(B62, B61) loop-header (depth:1 body:(B56, B61, B70, B75, B74) back-edges:(B75))
-  v58 = LoadInstanceField(#context-field:i, v53)
-  v60 = Comparison int <(v58, v59)
-  Branch(v60, true: B61, false: B62)
-B61 = TargetBlock() idom:B56 dominates:(B70) in-loop:B56
-  v64 = DirectCall opaqueVal()
-  StoreInstanceField(#context-field:h, v53, v64)
-  v66 = AllocateClosure(v53)
-  DirectCall callClosure(v66)
-  v68 = AllocateContext()
-  StoreInstanceField(#context-field:j, v68, v54)
-  Goto(B70)
-B70 = JoinBlock(B61, B74) idom:B61 dominates:(B75, B74) loop-header (depth:2 body:(B70, B74) back-edges:(B74))
-  v72 = LoadInstanceField(#context-field:j, v68)
-  v73 = Comparison int <(v72, v59)
-  Branch(v73, true: B74, false: B75)
-B74 = TargetBlock() idom:B70 in-loop:B70
-  StoreInstanceField(#context-field:k, v68, v77)
-  v79 = AllocateClosure(v68)
-  DirectCall callClosure(v79)
-  v81 = LoadInstanceField(#context-field:k, v68)
-  DirectCall print(v81)
-  v83 = LoadInstanceField(#context-field:j, v68)
-  v84 = BinaryIntOp +(v83, v42)
-  StoreInstanceField(#context-field:j, v68, v84)
-  Goto(B70)
-B75 = TargetBlock() idom:B70 in-loop:B56
-  v87 = LoadInstanceField(#context-field:i, v53)
-  v88 = BinaryIntOp +(v87, v42)
-  StoreInstanceField(#context-field:i, v53, v88)
-  Goto(B56)
-B62 = TargetBlock() idom:B56
-  Return(v91)
-B45 = TargetBlock() idom:B14 in-loop:B14
-  Goto(B14)
+  v32 = AllocateClosure()
+  StoreInstanceField(#closure-field[0], v32, v22)
+  DirectCall callClosure(v32)
+  v35 = AllocateClosure()
+  StoreInstanceField(#closure-field[0], v35, v22)
+  DirectCall callClosure(v35)
+  v38 = LoadInstanceField(#context-field:d, v1)
+  DirectCall print(v38)
+  v40 = LoadInstanceField(#context-field:e, v22)
+  DirectCall print(v40)
+  v42 = LoadInstanceField(#context-field:f, v22)
+  DirectCall print(v42)
+  v44 = LoadInstanceField(#context-field:g, v22)
+  DirectCall print(v44)
+  v46 = DirectCall opaqueVal()
+  v48 = Comparison int ==(v46, v47)
+  Branch(v48, true: B49, false: B50)
+B49 = TargetBlock() idom:B16 dominates:(B61)
+  v58 = AllocateContext()
+  StoreInstanceField(#context-field:i, v58, v59)
+  Goto(B61)
+B61 = JoinBlock(B49, B81) idom:B49 dominates:(B67, B66) loop-header (depth:1 body:(B61, B66, B76, B81, B80) back-edges:(B81))
+  v63 = LoadInstanceField(#context-field:i, v58)
+  v65 = Comparison int <(v63, v64)
+  Branch(v65, true: B66, false: B67)
+B66 = TargetBlock() idom:B61 dominates:(B76) in-loop:B61
+  v69 = DirectCall opaqueVal()
+  StoreInstanceField(#context-field:h, v58, v69)
+  v71 = AllocateClosure()
+  StoreInstanceField(#closure-field[0], v71, v58)
+  DirectCall callClosure(v71)
+  v74 = AllocateContext()
+  StoreInstanceField(#context-field:j, v74, v59)
+  Goto(B76)
+B76 = JoinBlock(B66, B80) idom:B66 dominates:(B81, B80) loop-header (depth:2 body:(B76, B80) back-edges:(B80))
+  v78 = LoadInstanceField(#context-field:j, v74)
+  v79 = Comparison int <(v78, v64)
+  Branch(v79, true: B80, false: B81)
+B80 = TargetBlock() idom:B76 in-loop:B76
+  StoreInstanceField(#context-field:k, v74, v83)
+  v85 = AllocateClosure()
+  StoreInstanceField(#closure-field[0], v85, v74)
+  DirectCall callClosure(v85)
+  v88 = LoadInstanceField(#context-field:k, v74)
+  DirectCall print(v88)
+  v90 = LoadInstanceField(#context-field:j, v74)
+  v91 = BinaryIntOp +(v90, v47)
+  StoreInstanceField(#context-field:j, v74, v91)
+  Goto(B76)
+B81 = TargetBlock() idom:B76 in-loop:B61
+  v94 = LoadInstanceField(#context-field:i, v58)
+  v95 = BinaryIntOp +(v94, v47)
+  StoreInstanceField(#context-field:i, v58, v95)
+  Goto(B61)
+B67 = TargetBlock() idom:B61
+  Return(v98)
+B50 = TargetBlock() idom:B16 in-loop:B16
+  Goto(B16)
 
 --- closure FunctionExpression(void () {
   print(a);
@@ -289,21 +313,25 @@
   v4 = Constant(20)
   v6 = Constant(30)
   v8 = Constant(40)
-  v18 = Constant(null)
+  v22 = Constant(null)
   v1 = AllocateContext()
   StoreInstanceField(#context-field:a, v1, v2)
   StoreInstanceField(#context-field:b, v1, v4)
   StoreInstanceField(#context-field:c, v1, v6)
   StoreInstanceField(#context-field:d, v1, v8)
-  v10 = AllocateClosure(v1)
+  v10 = AllocateClosure()
+  StoreInstanceField(#closure-field[0], v10, v1)
   DirectCall callClosure(v10)
-  v12 = AllocateClosure(v1)
-  DirectCall callClosure(v12)
-  v14 = AllocateClosure(v1)
-  DirectCall callClosure(v14)
-  v16 = AllocateClosure(v1)
+  v13 = AllocateClosure()
+  StoreInstanceField(#closure-field[0], v13, v1)
+  DirectCall callClosure(v13)
+  v16 = AllocateClosure()
+  StoreInstanceField(#closure-field[0], v16, v1)
   DirectCall callClosure(v16)
-  Return(v18)
+  v19 = AllocateClosure()
+  StoreInstanceField(#closure-field[0], v19, v1)
+  DirectCall callClosure(v19)
+  Return(v22)
 
 --- closure FunctionExpression(void () {
   a = a.{num.+}(11);
@@ -373,39 +401,42 @@
   Return(v8)
 
 --- foo45
-B0 = EntryBlock() dominates:(B10, B12, B9)
+B0 = EntryBlock() dominates:(B11, B13, B10)
   v2 = Constant(10)
-  v7 = Constant(1)
-  v14 = Constant(20)
-  v26 = Constant(30)
-  v31 = Constant(null)
+  v8 = Constant(1)
+  v15 = Constant(20)
+  v28 = Constant(30)
+  v34 = Constant(null)
   v1 = AllocateContext()
   StoreInstanceField(#context-field:a, v1, v2)
-  v4 = AllocateClosure(v1)
+  v4 = AllocateClosure()
+  StoreInstanceField(#closure-field[0], v4, v1)
   DirectCall callClosure(v4)
-  v6 = DirectCall opaqueVal()
-  v8 = Comparison int ==(v6, v7)
-  Branch(v8, true: B9, false: B10)
-B9 = TargetBlock() idom:B0
-  StoreInstanceField(#context-field:b, v1, v14)
-  v16 = AllocateClosure(v1)
-  DirectCall callClosure(v16)
-  Goto(B12)
+  v7 = DirectCall opaqueVal()
+  v9 = Comparison int ==(v7, v8)
+  Branch(v9, true: B10, false: B11)
 B10 = TargetBlock() idom:B0
-  Goto(B12)
-B12 = JoinBlock(B10, B9) idom:B0 dominates:(B22, B24, B21)
-  v19 = DirectCall opaqueVal()
-  v20 = Comparison int ==(v19, v7)
-  Branch(v20, true: B21, false: B22)
-B21 = TargetBlock() idom:B12
-  StoreInstanceField(#context-field:c, v1, v26)
-  v28 = AllocateClosure(v1)
-  DirectCall callClosure(v28)
-  Goto(B24)
-B22 = TargetBlock() idom:B12
-  Goto(B24)
-B24 = JoinBlock(B22, B21) idom:B12
-  Return(v31)
+  StoreInstanceField(#context-field:b, v1, v15)
+  v17 = AllocateClosure()
+  StoreInstanceField(#closure-field[0], v17, v1)
+  DirectCall callClosure(v17)
+  Goto(B13)
+B11 = TargetBlock() idom:B0
+  Goto(B13)
+B13 = JoinBlock(B11, B10) idom:B0 dominates:(B24, B26, B23)
+  v21 = DirectCall opaqueVal()
+  v22 = Comparison int ==(v21, v8)
+  Branch(v22, true: B23, false: B24)
+B23 = TargetBlock() idom:B13
+  StoreInstanceField(#context-field:c, v1, v28)
+  v30 = AllocateClosure()
+  StoreInstanceField(#closure-field[0], v30, v1)
+  DirectCall callClosure(v30)
+  Goto(B26)
+B24 = TargetBlock() idom:B13
+  Goto(B26)
+B26 = JoinBlock(B24, B23) idom:B13
+  Return(v34)
 
 --- closure FunctionExpression(void () {
   a = a.{num.+}(11);
@@ -458,17 +489,19 @@
 
 --- foo46
 B0 = EntryBlock()
-  v10 = Constant(null)
+  v12 = Constant(null)
   v1 = AllocateContext()
   v2 = DirectCall opaqueVal()
   StoreInstanceField(#context-field:a, v1, v2)
   v4 = DirectCall opaqueVal()
   StoreInstanceField(#context-field:b, v1, v4)
-  v6 = AllocateClosure(v1)
+  v6 = AllocateClosure()
+  StoreInstanceField(#closure-field[0], v6, v1)
   DirectCall callClosure(v6)
-  v8 = AllocateClosure(v1)
-  DirectCall callClosure(v8)
-  Return(v10)
+  v9 = AllocateClosure()
+  StoreInstanceField(#closure-field[0], v9, v1)
+  DirectCall callClosure(v9)
+  Return(v12)
 
 --- closure FunctionExpression(void () {
   callClosure(void () {
@@ -476,12 +509,13 @@
   });
 }) at foo46
 B0 = EntryBlock()
-  v6 = Constant(null)
+  v7 = Constant(null)
   v1 = Parameter(#closure)
   v3 = LoadInstanceField(#closure-field[0], v1)
-  v4 = AllocateClosure(v3)
+  v4 = AllocateClosure()
+  StoreInstanceField(#closure-field[0], v4, v3)
   DirectCall callClosure(v4)
-  Return(v6)
+  Return(v7)
 
 --- closure FunctionExpression(void () {
   print(a);
@@ -500,12 +534,13 @@
   });
 }) at foo46
 B0 = EntryBlock()
-  v6 = Constant(null)
+  v7 = Constant(null)
   v1 = Parameter(#closure)
   v3 = LoadInstanceField(#closure-field[0], v1)
-  v4 = AllocateClosure(v3)
+  v4 = AllocateClosure()
+  StoreInstanceField(#closure-field[0], v4, v3)
   DirectCall callClosure(v4)
-  Return(v6)
+  Return(v7)
 
 --- closure FunctionExpression(void () {
   b = b.{num.+}(11);
@@ -524,33 +559,35 @@
 B0 = EntryBlock() dominates:(B5, B7, B4)
   v2 = Constant(1)
   v10 = Constant(10)
-  v23 = Constant(20)
-  v28 = Constant(null)
+  v24 = Constant(20)
+  v30 = Constant(null)
   v1 = DirectCall opaqueVal()
   v3 = Comparison int ==(v1, v2)
   Branch(v3, true: B4, false: B5)
 B4 = TargetBlock() idom:B0
   v9 = AllocateContext()
   StoreInstanceField(#context-field:a, v9, v10)
-  v12 = AllocateClosure(v9)
+  v12 = AllocateClosure()
+  StoreInstanceField(#closure-field[0], v12, v9)
   DirectCall callClosure(v12)
   Goto(B7)
 B5 = TargetBlock() idom:B0
   Goto(B7)
-B7 = JoinBlock(B5, B4) idom:B0 dominates:(B18, B20, B17)
-  v15 = DirectCall opaqueVal()
-  v16 = Comparison int ==(v15, v2)
-  Branch(v16, true: B17, false: B18)
-B17 = TargetBlock() idom:B7
-  v22 = AllocateContext()
-  StoreInstanceField(#context-field:b, v22, v23)
-  v25 = AllocateClosure(v22)
-  DirectCall callClosure(v25)
-  Goto(B20)
+B7 = JoinBlock(B5, B4) idom:B0 dominates:(B19, B21, B18)
+  v16 = DirectCall opaqueVal()
+  v17 = Comparison int ==(v16, v2)
+  Branch(v17, true: B18, false: B19)
 B18 = TargetBlock() idom:B7
-  Goto(B20)
-B20 = JoinBlock(B18, B17) idom:B7
-  Return(v28)
+  v23 = AllocateContext()
+  StoreInstanceField(#context-field:b, v23, v24)
+  v26 = AllocateClosure()
+  StoreInstanceField(#closure-field[0], v26, v23)
+  DirectCall callClosure(v26)
+  Goto(B21)
+B19 = TargetBlock() idom:B7
+  Goto(B21)
+B21 = JoinBlock(B19, B18) idom:B7
+  Return(v30)
 
 --- closure FunctionExpression(void () {
   a = a.{num.+}(11);
@@ -579,28 +616,30 @@
   Return(v8)
 
 --- foo49
-B0 = EntryBlock() dominates:(B8)
-  v6 = Constant(0)
-  v11 = Constant(4)
-  v19 = Constant(1)
-  v23 = Constant(null)
+B0 = EntryBlock() dominates:(B9)
+  v7 = Constant(0)
+  v12 = Constant(4)
+  v21 = Constant(1)
+  v25 = Constant(null)
   v1 = AllocateContext()
   v2 = DirectCall opaqueVal()
   StoreInstanceField(#context-field:a, v1, v2)
-  v4 = AllocateClosure(v1)
+  v4 = AllocateClosure()
+  StoreInstanceField(#closure-field[0], v4, v1)
   DirectCall callClosure(v4)
-  Goto(B8)
-B8 = JoinBlock(B0, B13) idom:B0 dominates:(B14, B13) loop-header (depth:1 body:(B8, B13) back-edges:(B13))
-  v25 = Phi(v6, v20)
-  v12 = Comparison int <(v25, v11)
-  Branch(v12, true: B13, false: B14)
-B13 = TargetBlock() idom:B8 in-loop:B8
-  v16 = AllocateClosure(v1)
-  DirectCall callClosure(v16)
-  v20 = BinaryIntOp +(v25, v19)
-  Goto(B8)
-B14 = TargetBlock() idom:B8
-  Return(v23)
+  Goto(B9)
+B9 = JoinBlock(B0, B14) idom:B0 dominates:(B15, B14) loop-header (depth:1 body:(B9, B14) back-edges:(B14))
+  v27 = Phi(v7, v22)
+  v13 = Comparison int <(v27, v12)
+  Branch(v13, true: B14, false: B15)
+B14 = TargetBlock() idom:B9 in-loop:B9
+  v17 = AllocateClosure()
+  StoreInstanceField(#closure-field[0], v17, v1)
+  DirectCall callClosure(v17)
+  v22 = BinaryIntOp +(v27, v21)
+  Goto(B9)
+B15 = TargetBlock() idom:B9
+  Return(v25)
 
 --- closure FunctionExpression(void () {
   a = a.{num.+}(10);
@@ -623,15 +662,16 @@
 }) at foo49
 B0 = EntryBlock()
   v5 = Constant(20)
-  v10 = Constant(null)
+  v11 = Constant(null)
   v1 = Parameter(#closure)
   v3 = LoadInstanceField(#closure-field[0], v1)
   v4 = LoadInstanceField(#context-field:a, v3)
   v6 = BinaryIntOp +(v4, v5)
   StoreInstanceField(#context-field:a, v3, v6)
-  v8 = AllocateClosure(v3)
+  v8 = AllocateClosure()
+  StoreInstanceField(#closure-field[0], v8, v3)
   DirectCall callClosure(v8)
-  Return(v10)
+  Return(v11)
 
 --- closure FunctionExpression(void () {
   a = a.{num.+}(30);
diff --git a/pkg/cfg/testcases/loops.dart b/pkg/cfg/testcases/loops.dart
index 2bcaf19..a318480 100644
--- a/pkg/cfg/testcases/loops.dart
+++ b/pkg/cfg/testcases/loops.dart
@@ -41,4 +41,26 @@
   }
 }
 
+int var63 = 28;
+int var68 = 44;
+
+void withTryBlock() {
+  var n = 43;
+  while (--n > 0) {
+    try {
+      var63++;
+      // Terminate block without reaching a loop backedge,
+      // so try body won't be included into the loop body
+      // through explicit predecessors of the backedge.
+      throw 'bye';
+    } on StackOverflowError {
+      rethrow;
+    } catch (_) {
+      // Load from 'var63' is considered loop invariant if
+      // loop body doesn't include try block body.
+      var68 = var63;
+    }
+  }
+}
+
 void main() {}
diff --git a/pkg/cfg/testcases/loops.dart.expect b/pkg/cfg/testcases/loops.dart.expect
index 568873f..d6708ff 100644
--- a/pkg/cfg/testcases/loops.dart.expect
+++ b/pkg/cfg/testcases/loops.dart.expect
@@ -111,8 +111,53 @@
 B34 = JoinBlock(B14, B29) idom:B0
   Return(v38)
 
+--- withTryBlock
+B0 = EntryBlock() dominates:(B3)
+  v1 = Constant(43)
+  v6 = Constant(1)
+  v9 = Constant(0)
+  v20 = Constant("bye")
+  v22 = Constant(null)
+  v42 = Constant(-1)
+  Goto(B3)
+B3 = JoinBlock(B0, B28) idom:B0 dominates:(B12, B11) loop-header (depth:1 body:(B3, B11, B15, B28, B14) back-edges:(B28))
+  v41 = Phi(v1, v43)
+  v43 = BinaryIntOp +(v41, v42)
+  v10 = Comparison int >(v43, v9)
+  Branch(v10, true: B11, false: B12)
+B11 = TargetBlock() idom:B3 dominates:(B15, B14) in-loop:B3
+  TryEntry(try-body: B14, catch-block: B15)
+B14 = TargetBlock() exception-handler:B15 idom:B11 in-loop:B3
+  v17 = LoadStaticField(var63)
+  v18 = BinaryIntOp +(v17, v6)
+  StoreStaticField(var63, v18)
+  Throw(v20)
+B15 = CatchBlock() idom:B11 dominates:(B28, B27) in-loop:B3
+  v23 = Parameter(#exception)
+  v24 = Parameter(#stackTrace)
+  v26 = TypeTest(v23, StackOverflowError)
+  Branch(v26, true: B27, false: B28)
+B27 = TargetBlock() idom:B15
+  Throw(v23, v24)
+B28 = TargetBlock() idom:B15 in-loop:B3
+  v35 = LoadStaticField(var63)
+  StoreStaticField(var68, v35)
+  Goto(B3)
+B12 = TargetBlock() idom:B3
+  Return(v22)
+
 --- main
 B0 = EntryBlock()
   v1 = Constant(null)
   Return(v1)
 
+--- field-init var63
+B0 = EntryBlock()
+  v1 = Constant(28)
+  Return(v1)
+
+--- field-init var68
+B0 = EntryBlock()
+  v1 = Constant(44)
+  Return(v1)
+
diff --git a/pkg/compiler/lib/src/kernel/dart2js_target.dart b/pkg/compiler/lib/src/kernel/dart2js_target.dart
index d6e096a..07afceb 100644
--- a/pkg/compiler/lib/src/kernel/dart2js_target.dart
+++ b/pkg/compiler/lib/src/kernel/dart2js_target.dart
@@ -39,18 +39,18 @@
   'web_gl',
 ];
 
-List<Pattern> _allowedNativeTestPatterns = [
-  RegExp(r'(?<!generated_)tests/web/native'),
-  RegExp(r'(?<!generated_)tests/web/internal'),
-  RegExp(r'(?<!generated_)tests/web/dart2js'),
-  'generated_tests/web/native/native_test',
-  'generated_tests/web/dart2js/deferred_url_test',
-  'pkg/front_end/testcases/dart2js/native',
+List<String> _allowedNativeTestPatterns = [
+  '/tests/web/native',
+  '/tests/web/internal',
+  '/tests/web/dart2js',
+  '/generated_tests/web/native/native_test',
+  '/generated_tests/web/dart2js/deferred_url_test',
+  '/pkg/front_end/testcases/dart2js/native',
 ];
 
 bool allowedNativeTest(Uri uri) {
   String path = uri.path;
-  return _allowedNativeTestPatterns.any((pattern) => path.contains(pattern));
+  return _allowedNativeTestPatterns.any((s) => path.contains(s));
 }
 
 bool maybeEnableNative(Uri uri) {
diff --git a/pkg/dart2bytecode/bin/kernel_service.dart b/pkg/dart2bytecode/bin/kernel_service.dart
index 2742b78..277db07 100644
--- a/pkg/dart2bytecode/bin/kernel_service.dart
+++ b/pkg/dart2bytecode/bin/kernel_service.dart
@@ -38,6 +38,7 @@
       emitLocalVarInfo: true,
       emitInstanceFieldInitializers: true,
       embedSourceText: true,
+      recordCoverage: true,
     ),
   );
   return byteSink.builder.takeBytes();
diff --git a/pkg/dart2bytecode/lib/bytecode_generator.dart b/pkg/dart2bytecode/lib/bytecode_generator.dart
index c28cf8d..c940fa6 100644
--- a/pkg/dart2bytecode/lib/bytecode_generator.dart
+++ b/pkg/dart2bytecode/lib/bytecode_generator.dart
@@ -949,9 +949,7 @@
   void _genExternalCall(Member node) {
     final function = node.function!;
 
-    if (locals.hasFactoryTypeArgsVar) {
-      asm.emitPush(locals.getVarIndexInFrame(locals.factoryTypeArgsVar));
-    } else if (locals.hasFunctionTypeArgsVar) {
+    if (locals.hasFunctionTypeArgsVar) {
       asm.emitPush(locals.functionTypeArgsVarIndexInFrame);
     }
     if (locals.hasReceiver) {
@@ -1483,23 +1481,19 @@
     Member target,
     Arguments args, {
     bool hasReceiver = false,
-    bool isFactory = false,
     bool isUnchecked = false,
     TreeNode? node,
   }) {
     final argDesc = objectTable.getArgDescHandleByArguments(
       args,
       hasReceiver: hasReceiver,
-      isFactory: isFactory,
     );
 
     int totalArgCount = args.positional.length + args.named.length;
     if (hasReceiver) {
       totalArgCount++;
     }
-    if (args.types.isNotEmpty || isFactory) {
-      // VM needs type arguments for every invocation of a factory constructor.
-      // TODO(alexmarkov): Clean this up.
+    if (args.types.isNotEmpty) {
       totalArgCount++;
     }
 
@@ -1573,17 +1567,9 @@
 
   void _genPushInstantiatorTypeArguments() {
     if (instantiatorTypeArguments != null) {
-      if (locals.hasFactoryTypeArgsVar) {
-        assert(
-          enclosingMember is Procedure &&
-              (enclosingMember as Procedure).isFactory,
-        );
-        _genLoadVar(locals.factoryTypeArgsVar);
-      } else {
-        _genPushReceiver();
-        final int cpIndex = cp.addTypeArgumentsField(enclosingClass!);
-        asm.emitLoadTypeArgumentsField(cpIndex);
-      }
+      _genPushReceiver();
+      final int cpIndex = cp.addTypeArgumentsField(enclosingClass!);
+      asm.emitLoadTypeArgumentsField(cpIndex);
     } else {
       asm.emitPushNull();
     }
@@ -1844,22 +1830,15 @@
     isClosure = false;
     hasErrors = false;
     staticTypeContext.enterMember(node);
-    final isFactory = node is Procedure && node.isFactory;
-    if (node.isInstanceMember || node is Constructor || isFactory) {
+    if (node.isInstanceMember || node is Constructor) {
       if (enclosingClass!.typeParameters.isNotEmpty) {
-        final classTypeParameters = this.classTypeParameters =
-            new Set<TypeParameter>.from(enclosingClass.typeParameters);
-        // Treat type arguments of factory constructors as class
-        // type parameters.
-        if (isFactory) {
-          classTypeParameters.addAll(node.function.typeParameters);
-        }
+        this.classTypeParameters = new Set<TypeParameter>.from(
+          enclosingClass.typeParameters,
+        );
       }
       if (hasInstantiatorTypeArguments(enclosingClass)) {
         final typeParameters = getTypeParameterTypes(
-          isFactory
-              ? node.function.typeParameters
-              : enclosingClass.typeParameters,
+          enclosingClass.typeParameters,
         );
         instantiatorTypeArguments = flattenInstantiatorTypeArguments(
           enclosingClass,
@@ -2196,8 +2175,6 @@
     }
 
     if (locals.hasFunctionTypeArgsVar && function!.typeParameters.isNotEmpty) {
-      assert(!(node is Procedure && node.isFactory));
-
       Label done = new Label();
 
       if (isClosure) {
@@ -2353,9 +2330,6 @@
     if (locals.hasCapturedParameters) {
       // Copy captured parameters to their respective locations in the context.
       if (!isClosure) {
-        if (locals.hasFactoryTypeArgsVar) {
-          _copyParamIfCaptured(locals.factoryTypeArgsVar);
-        }
         if (locals.hasCapturedReceiverVar) {
           _genPushContextForVariable(locals.capturedReceiverVar);
           asm.emitPush(locals.getVarIndexInFrame(locals.receiverVar));
@@ -3385,11 +3359,8 @@
       }
     }
 
-    // _GrowableList._literal is a factory constructor.
-    // Type arguments passed to a factory constructor are counted as a normal
-    // argument and not counted in number of type arguments.
     assert(growableListLiteral.isFactory);
-    _genDirectCall(growableListLiteral, objectTable.getArgDescHandle(2), 2);
+    _genDirectCall(growableListLiteral, objectTable.getArgDescHandle(1, 1), 2);
   }
 
   @override
@@ -3451,11 +3422,8 @@
       }
     }
 
-    // Map._fromLiteral is a factory constructor.
-    // Type arguments passed to a factory constructor are counted as a normal
-    // argument and not counted in number of type arguments.
     assert(mapFromLiteral.isFactory);
-    _genDirectCall(mapFromLiteral, objectTable.getArgDescHandle(2), 2);
+    _genDirectCall(mapFromLiteral, objectTable.getArgDescHandle(1, 2), 2);
   }
 
   void _genMethodInvocationUsingSpecializedBytecode(
@@ -4025,28 +3993,8 @@
       _generateFfiCall(args.positional.single);
       return;
     }
-    if (target.isFactory) {
-      final constructedClass = target.enclosingClass!;
-      if (hasInstantiatorTypeArguments(constructedClass)) {
-        _genTypeArguments(args.types, instantiatingClass: constructedClass);
-      } else {
-        assert(args.types.isEmpty);
-        // VM needs type arguments for every invocation of a factory
-        // constructor. TODO(alexmarkov): Clean this up.
-        asm.emitPushNull();
-      }
-      args = new Arguments(
-        node.arguments.positional,
-        named: node.arguments.named,
-      )..parent = node;
-    }
     _genArguments(null, args);
-    _genDirectCallWithArgs(
-      target,
-      args,
-      isFactory: target.isFactory,
-      node: node,
-    );
+    _genDirectCallWithArgs(target, args, node: node);
     if (target == debugger) {
       // The debugger needs a pause for the current source position right after
       // stepping out from the debugger function.
@@ -4860,10 +4808,7 @@
     finallyBlocks.remove(node);
   }
 
-  bool _skipVariableInitialization(
-    VariableInitializationBase v,
-    bool isCaptured,
-  ) {
+  bool _skipVariableInitialization(VariableDeclaration v, bool isCaptured) {
     // We can skip variable initialization if the variable is supposed to be
     // initialized to null and it's captured. This is because all the slots in
     // the capture context are implicitly initialized to null.
@@ -4886,11 +4831,11 @@
   }
 
   @override
-  void visitVariableInitialization(VariableInitializationBase node) {
+  void visitVariableInitialization(VariableInitialization node) {
     _handleVariableInitialization(node);
   }
 
-  void _handleVariableInitialization(VariableInitializationBase node) {
+  void _handleVariableInitialization(VariableDeclaration node) {
     if (!node.isConst) {
       final bool isCaptured = locals.isCaptured(node.variable);
       final initializer = node.initializer;
diff --git a/pkg/dart2bytecode/lib/constant_pool.dart b/pkg/dart2bytecode/lib/constant_pool.dart
index c2f520b..dd8bc5d 100644
--- a/pkg/dart2bytecode/lib/constant_pool.dart
+++ b/pkg/dart2bytecode/lib/constant_pool.dart
@@ -692,17 +692,9 @@
     ),
   );
 
-  int addArgDescByArguments(
-    Arguments args, {
-    bool hasReceiver = false,
-    bool isFactory = false,
-  }) => _add(
+  int addArgDescByArguments(Arguments args, {bool hasReceiver = false}) => _add(
     new ConstantObjectRef(
-      objectTable.getArgDescHandleByArguments(
-        args,
-        hasReceiver: hasReceiver,
-        isFactory: isFactory,
-      ),
+      objectTable.getArgDescHandleByArguments(args, hasReceiver: hasReceiver),
     ),
   );
 
diff --git a/pkg/dart2bytecode/lib/local_vars.dart b/pkg/dart2bytecode/lib/local_vars.dart
index ab5b9f3..7369621 100644
--- a/pkg/dart2bytecode/lib/local_vars.dart
+++ b/pkg/dart2bytecode/lib/local_vars.dart
@@ -120,12 +120,6 @@
 
   bool get hasFunctionTypeArgsVar => _currentFrame.functionTypeArgsVar != null;
 
-  VariableDeclaration get factoryTypeArgsVar =>
-      _currentFrame.factoryTypeArgsVar ??
-      (throw 'FactoryTypeArgs variable is not declared in ${_currentFrame.function}');
-
-  bool get hasFactoryTypeArgsVar => _currentFrame.factoryTypeArgsVar != null;
-
   VariableDeclaration get receiverVar =>
       _currentFrame.receiverVar ??
       (throw 'Receiver variable is not declared in ${_currentFrame.function}');
@@ -243,7 +237,6 @@
   VariableDeclaration? receiverVar;
   VariableDeclaration? capturedReceiverVar;
   VariableDeclaration? functionTypeArgsVar;
-  VariableDeclaration? factoryTypeArgsVar;
   VariableDeclaration? closureVar;
   VariableDeclaration? contextVar;
   VariableDeclaration? scratchVar;
@@ -364,29 +357,15 @@
         }
       }
 
-      if (node is Procedure && node.isFactory) {
-        assert(_currentFrame.parent == null);
-        _currentFrame.numTypeArguments = 0;
-        final factoryTypeArgsVar = _currentFrame.factoryTypeArgsVar =
-            VariableDeclaration(':type_arguments');
-        _declareVariable(factoryTypeArgsVar);
-      } else {
-        _currentFrame.numTypeArguments =
-            (_currentFrame.parent?.numTypeArguments ?? 0) +
-            function.typeParameters.length;
+      _currentFrame.numTypeArguments =
+          (_currentFrame.parent?.numTypeArguments ?? 0) +
+          function.typeParameters.length;
 
-        if (_currentFrame.numTypeArguments > 0) {
-          final functionTypeArgsVar = _currentFrame.functionTypeArgsVar =
-              VariableDeclaration(':function_type_arguments_var')
-                ..fileOffset = function.fileOffset;
-          _declareVariable(functionTypeArgsVar);
-        }
-
-        final parentFactoryTypeArgsVar =
-            _currentFrame.parent?.factoryTypeArgsVar;
-        if (parentFactoryTypeArgsVar != null) {
-          _currentFrame.factoryTypeArgsVar = parentFactoryTypeArgsVar;
-        }
+      if (_currentFrame.numTypeArguments > 0) {
+        final functionTypeArgsVar = _currentFrame.functionTypeArgsVar =
+            VariableDeclaration(':function_type_arguments_var')
+              ..fileOffset = function.fileOffset;
+        _declareVariable(functionTypeArgsVar);
       }
 
       if (_hasReceiverParameter(node)) {
@@ -553,11 +532,11 @@
   }
 
   @override
-  void visitVariableInitialization(VariableInitializationBase node) {
+  void visitVariableInitialization(VariableInitialization node) {
     _handleVariableInitialization(node);
   }
 
-  void _handleVariableInitialization(VariableInitializationBase node) {
+  void _handleVariableInitialization(VariableDeclaration node) {
     _declareVariable(node.variable);
     node.visitChildren(this);
   }
@@ -625,8 +604,6 @@
     var parent = node.parameter.declaration;
     if (parent is Class) {
       _useThis();
-    } else if (parent is Procedure && parent.isFactory) {
-      _useVariable(_currentFrame.factoryTypeArgsVar!);
     }
     node.visitChildren(this);
   }
@@ -946,7 +923,6 @@
   }
 
   void _allocateParameters(TreeNode node, FunctionNode function) {
-    final bool isFactory = node is Procedure && node.isFactory;
     final bool hasReceiver = _hasReceiverParameter(node);
     final bool hasClosureArg =
         node is FunctionDeclaration || node is FunctionExpression;
@@ -954,7 +930,6 @@
     _currentFrame.numParameters =
         function.positionalParameters.length +
         function.namedParameters.length +
-        (isFactory ? 1 : 0) +
         (hasReceiver ? 1 : 0) +
         (hasClosureArg ? 1 : 0);
 
@@ -964,15 +939,11 @@
         function.namedParameters.isNotEmpty;
 
     _currentFrame.hasCapturedParameters =
-        (isFactory && locals.isCaptured(_currentFrame.factoryTypeArgsVar!)) ||
         (hasReceiver && _currentFrame.capturedReceiverVar != null) ||
         function.positionalParameters.any(locals.isCaptured) ||
         function.namedParameters.any(locals.isCaptured);
 
     int count = 0;
-    if (isFactory) {
-      _allocateParameter(_currentFrame.factoryTypeArgsVar!, count++);
-    }
     if (hasReceiver) {
       assert(!locals.isCaptured(_currentFrame.receiverVar!));
       _allocateParameter(_currentFrame.receiverVar!, count++);
@@ -1097,11 +1068,11 @@
   }
 
   @override
-  void visitVariableInitialization(VariableInitializationBase node) {
+  void visitVariableInitialization(VariableInitialization node) {
     _handleVariableInitialization(node);
   }
 
-  void _handleVariableInitialization(VariableInitializationBase node) {
+  void _handleVariableInitialization(VariableDeclaration node) {
     _allocateVariable(node.variable);
     node.visitChildren(this);
   }
diff --git a/pkg/dart2bytecode/lib/object_table.dart b/pkg/dart2bytecode/lib/object_table.dart
index bda6a1d..9896d86 100644
--- a/pkg/dart2bytecode/lib/object_table.dart
+++ b/pkg/dart2bytecode/lib/object_table.dart
@@ -1920,7 +1920,6 @@
   ObjectHandle getArgDescHandleByArguments(
     Arguments args, {
     bool hasReceiver = false,
-    bool isFactory = false,
   }) {
     List<_PublicNameHandle> argNames = const <_PublicNameHandle>[];
     final namedArguments = args.named;
@@ -1931,15 +1930,8 @@
       );
     }
     final int numArguments =
-        args.positional.length +
-        args.named.length +
-        (hasReceiver ? 1 : 0) +
-        // VM expects that type arguments vector passed to a factory
-        // constructor is counted in numArguments, and not counted in
-        // numTypeArgs.
-        // TODO(alexmarkov): Clean this up.
-        (isFactory ? 1 : 0);
-    final int numTypeArguments = isFactory ? 0 : args.types.length;
+        args.positional.length + args.named.length + (hasReceiver ? 1 : 0);
+    final int numTypeArguments = args.types.length;
     return getOrAddObject(
       new _ArgDescHandle(numArguments, numTypeArguments, argNames),
     );
diff --git a/pkg/dart2bytecode/lib/options.dart b/pkg/dart2bytecode/lib/options.dart
index 929364f..82d7481 100644
--- a/pkg/dart2bytecode/lib/options.dart
+++ b/pkg/dart2bytecode/lib/options.dart
@@ -15,6 +15,7 @@
     'closure-context-lowering':
         'Use the closure context lowering in Kernel AST instead of computing it',
     'embed-source-text': 'Embed the source text of scripts',
+    'record-coverage': 'Emit instructions and metadata for recording coverage',
   };
 
   bool enableAsserts;
@@ -27,6 +28,7 @@
   bool showBytecodeSizeStatistics;
   bool isClosureContextLoweringEnabled;
   bool embedSourceText;
+  bool recordCoverage;
 
   BytecodeOptions({
     this.enableAsserts = false,
@@ -39,6 +41,7 @@
     this.showBytecodeSizeStatistics = false,
     this.isClosureContextLoweringEnabled = false,
     this.embedSourceText = false,
+    this.recordCoverage = false,
   }) {}
 
   void parseCommandLineFlags(List<String>? flags) {
@@ -71,6 +74,9 @@
         case 'embed-source-text':
           embedSourceText = true;
           break;
+        case 'record-coverage':
+          recordCoverage = true;
+          break;
         default:
           throw 'Unexpected bytecode flag $flag';
       }
diff --git a/pkg/dart2bytecode/testcases/closures.dart.expect b/pkg/dart2bytecode/testcases/closures.dart.expect
index 4d5116b..77c7806 100644
--- a/pkg/dart2bytecode/testcases/closures.dart.expect
+++ b/pkg/dart2bytecode/testcases/closures.dart.expect
@@ -122,7 +122,7 @@
   [6] = Type DART_SDK/pkg/dart2bytecode/testcases/closures.dart::callWithArgs::TypeParam/5
   [7] = Type DART_SDK/pkg/dart2bytecode/testcases/closures.dart::callWithArgs::TypeParam/6
   [8] = Type DART_SDK/pkg/dart2bytecode/testcases/closures.dart::callWithArgs::TypeParam/7
-  [9] = DirectCall 'dart:core::_GrowableList::_literal8 (constructor)', ArgDesc num-args 9, num-type-args 0, names []
+  [9] = DirectCall 'dart:core::_GrowableList::_literal8 (constructor)', ArgDesc num-args 8, num-type-args 1, names []
   [10] = Reserved
   [11] = DirectCall 'dart:core::print', ArgDesc num-args 1, num-type-args 0, names []
   [12] = Reserved
@@ -531,7 +531,7 @@
   [13] = Type DART_SDK/pkg/dart2bytecode/testcases/closures.dart::A::foo::Closure/0::TypeParam/1
   [14] = Type DART_SDK/pkg/dart2bytecode/testcases/closures.dart::A::foo::Closure/1::TypeParam/0
   [15] = Type DART_SDK/pkg/dart2bytecode/testcases/closures.dart::A::foo::Closure/1::TypeParam/1
-  [16] = DirectCall 'dart:core::_GrowableList::_literal8 (constructor)', ArgDesc num-args 9, num-type-args 0, names []
+  [16] = DirectCall 'dart:core::_GrowableList::_literal8 (constructor)', ArgDesc num-args 8, num-type-args 1, names []
   [17] = Reserved
   [18] = DirectCall 'dart:core::print', ArgDesc num-args 1, num-type-args 0, names []
   [19] = Reserved
@@ -1035,7 +1035,7 @@
 }
 ConstantPool {
   [0] = ObjectRef < dart:core::Function >
-  [1] = DirectCall 'dart:core::_GrowableList:: (constructor)', ArgDesc num-args 2, num-type-args 0, names []
+  [1] = DirectCall 'dart:core::_GrowableList:: (constructor)', ArgDesc num-args 1, num-type-args 1, names []
   [2] = Reserved
   [3] = ClosureFunction 0
   [4] = EndClosureFunctionScope
diff --git a/pkg/dart2bytecode/testcases/ffi.dart.expect b/pkg/dart2bytecode/testcases/ffi.dart.expect
index d660758..c61ecb0 100644
--- a/pkg/dart2bytecode/testcases/ffi.dart.expect
+++ b/pkg/dart2bytecode/testcases/ffi.dart.expect
@@ -46,7 +46,7 @@
 ConstantPool {
   [0] = ObjectRef < dart:ffi::NativeFunction < FunctionType () -> dart:ffi::Void > >
   [1] = ObjectRef const 3735928559
-  [2] = DirectCall 'dart:ffi::Pointer::fromAddress (constructor)', ArgDesc num-args 2, num-type-args 0, names []
+  [2] = DirectCall 'dart:ffi::Pointer::fromAddress (constructor)', ArgDesc num-args 1, num-type-args 1, names []
   [3] = Reserved
   [4] = ClosureFunction 0
   [5] = FfiCall
@@ -107,7 +107,7 @@
 ConstantPool {
   [0] = ObjectRef < dart:ffi::NativeFunction < FunctionType (dart:ffi::Int64) -> dart:ffi::Int32 > >
   [1] = ObjectRef const 3735928559
-  [2] = DirectCall 'dart:ffi::Pointer::fromAddress (constructor)', ArgDesc num-args 2, num-type-args 0, names []
+  [2] = DirectCall 'dart:ffi::Pointer::fromAddress (constructor)', ArgDesc num-args 1, num-type-args 1, names []
   [3] = Reserved
   [4] = ClosureFunction 0
   [5] = Type dart:core::int
diff --git a/pkg/dart2bytecode/testcases/instance_creation.dart.expect b/pkg/dart2bytecode/testcases/instance_creation.dart.expect
index 145220e..0543d62 100644
--- a/pkg/dart2bytecode/testcases/instance_creation.dart.expect
+++ b/pkg/dart2bytecode/testcases/instance_creation.dart.expect
@@ -115,7 +115,7 @@
 }
 ConstantPool {
   [0] = ObjectRef < dart:core::int, dart:core::List < dart:core::String > >
-  [1] = DirectCall 'DART_SDK/pkg/dart2bytecode/testcases/instance_creation.dart::G::testFactory (constructor)', ArgDesc num-args 1, num-type-args 0, names []
+  [1] = DirectCall 'DART_SDK/pkg/dart2bytecode/testcases/instance_creation.dart::G::testFactory (constructor)', ArgDesc num-args 0, num-type-args 2, names []
   [2] = Reserved
 }
 
@@ -127,20 +127,18 @@
 Bytecode {
   Entry                0
   CheckStack           0
-  PushNull
-  DirectCall           CP#0, 1
+  DirectCall           CP#0, 0
   Drop1
-  PushNull
   PushInt              42
-  DirectCall           CP#2, 2
+  DirectCall           CP#2, 1
   Drop1
   PushNull
   ReturnTOS
 }
 ConstantPool {
-  [0] = DirectCall 'DART_SDK/pkg/dart2bytecode/testcases/instance_creation.dart::I::testFactory2 (constructor)', ArgDesc num-args 1, num-type-args 0, names []
+  [0] = DirectCall 'DART_SDK/pkg/dart2bytecode/testcases/instance_creation.dart::I::testFactory2 (constructor)', ArgDesc num-args 0, num-type-args 0, names []
   [1] = Reserved
-  [2] = DirectCall 'DART_SDK/pkg/dart2bytecode/testcases/instance_creation.dart::I::testFactory2 (constructor)', ArgDesc num-args 2, num-type-args 0, names ['param']
+  [2] = DirectCall 'DART_SDK/pkg/dart2bytecode/testcases/instance_creation.dart::I::testFactory2 (constructor)', ArgDesc num-args 1, num-type-args 0, names ['param']
   [3] = Reserved
 }
 
@@ -158,7 +156,7 @@
 }
 ConstantPool {
   [0] = ObjectRef < dart:core::String >
-  [1] = DirectCall 'dart:core::_List::empty (constructor)', ArgDesc num-args 1, num-type-args 0, names []
+  [1] = DirectCall 'dart:core::_List::empty (constructor)', ArgDesc num-args 0, num-type-args 1, names []
   [2] = Reserved
 }
 
@@ -178,7 +176,7 @@
 }
 ConstantPool {
   [0] = ObjectRef < dart:core::int >
-  [1] = DirectCall 'dart:core::_List::filled (constructor)', ArgDesc num-args 3, num-type-args 0, names []
+  [1] = DirectCall 'dart:core::_List::filled (constructor)', ArgDesc num-args 2, num-type-args 1, names []
   [2] = Reserved
 }
 
@@ -427,7 +425,7 @@
 }
 ConstantPool {
   [0] = TypeArgumentsField DART_SDK/pkg/dart2bytecode/testcases/instance_creation.dart::E
-  [1] = DirectCall 'dart:core::Map:: (constructor)', ArgDesc num-args 1, num-type-args 0, names []
+  [1] = DirectCall 'dart:core::Map:: (constructor)', ArgDesc num-args 0, num-type-args 2, names []
   [2] = Reserved
 }
 
@@ -469,7 +467,7 @@
 }
 ConstantPool {
   [0] = TypeArgumentsField DART_SDK/pkg/dart2bytecode/testcases/instance_creation.dart::F
-  [1] = DirectCall 'dart:core::Map:: (constructor)', ArgDesc num-args 1, num-type-args 0, names []
+  [1] = DirectCall 'dart:core::Map:: (constructor)', ArgDesc num-args 0, num-type-args 2, names []
   [2] = Reserved
 }
 
@@ -503,15 +501,16 @@
     return-type DART_SDK/pkg/dart2bytecode/testcases/instance_creation.dart::G < DART_SDK/pkg/dart2bytecode/testcases/instance_creation.dart::G::testFactory (constructor)::TypeParam/0, DART_SDK/pkg/dart2bytecode/testcases/instance_creation.dart::G::testFactory (constructor)::TypeParam/1 >
 
 Bytecode {
-  Entry                1
+  Entry                2
+  CheckFunctionTypeArgs 2, r0
   CheckStack           0
-  Push                 FP[-5]
   PushNull
+  Push                 r0
   InstantiateTypeArgumentsTOS 0, CP#1
   PushConstant         CP#0
   AllocateT
-  StoreLocal           r0
-  Push                 r0
+  StoreLocal           r1
+  Push                 r1
   DirectCall           CP#2, 1
   Drop1
   ReturnTOS
@@ -574,15 +573,15 @@
     return-type DART_SDK/pkg/dart2bytecode/testcases/instance_creation.dart::I
 
 Bytecode {
-  EntryOptional        1, 0, 1
-  LoadConstant         r1, CP#0
-  LoadConstant         r1, CP#1
+  EntryOptional        0, 0, 1
+  LoadConstant         r0, CP#0
+  LoadConstant         r0, CP#1
   Frame                1
   CheckStack           0
   Allocate             CP#2
-  StoreLocal           r2
-  Push                 r2
+  StoreLocal           r1
   Push                 r1
+  Push                 r0
   DirectCall           CP#3, 2
   Drop1
   ReturnTOS
@@ -649,13 +648,14 @@
     return-type DART_SDK/pkg/dart2bytecode/testcases/instance_creation.dart::L < DART_SDK/pkg/dart2bytecode/testcases/instance_creation.dart::L:: (constructor)::TypeParam/0, DART_SDK/pkg/dart2bytecode/testcases/instance_creation.dart::L:: (constructor)::TypeParam/1 >
 
 Bytecode {
-  Entry                1
+  Entry                2
+  CheckFunctionTypeArgs 2, r0
   CheckStack           0
-  Push                 FP[-5]
+  Push                 r0
   PushConstant         CP#0
   AllocateT
-  StoreLocal           r0
-  Push                 r0
+  StoreLocal           r1
+  Push                 r1
   DirectCall           CP#1, 1
   Drop1
   ReturnTOS
diff --git a/pkg/dart2bytecode/testcases/literals.dart.expect b/pkg/dart2bytecode/testcases/literals.dart.expect
index 3f4d2b7..56642bf 100644
--- a/pkg/dart2bytecode/testcases/literals.dart.expect
+++ b/pkg/dart2bytecode/testcases/literals.dart.expect
@@ -155,7 +155,7 @@
 }
 ConstantPool {
   [0] = ObjectRef < dart:core::int >
-  [1] = DirectCall 'dart:core::_GrowableList::_literal3 (constructor)', ArgDesc num-args 4, num-type-args 0, names []
+  [1] = DirectCall 'dart:core::_GrowableList::_literal3 (constructor)', ArgDesc num-args 3, num-type-args 1, names []
   [2] = Reserved
   [3] = DirectCall 'dart:core::print', ArgDesc num-args 1, num-type-args 0, names []
   [4] = Reserved
@@ -256,7 +256,7 @@
 ConstantPool {
   [0] = ObjectRef < dart:core::int, dart:core::int >
   [1] = ObjectRef < dynamic >
-  [2] = DirectCall 'dart:core::Map::_fromLiteral (constructor)', ArgDesc num-args 2, num-type-args 0, names []
+  [2] = DirectCall 'dart:core::Map::_fromLiteral (constructor)', ArgDesc num-args 1, num-type-args 2, names []
   [3] = Reserved
   [4] = DirectCall 'dart:core::print', ArgDesc num-args 1, num-type-args 0, names []
   [5] = Reserved
diff --git a/pkg/dart2bytecode/testcases/type_ops.dart.expect b/pkg/dart2bytecode/testcases/type_ops.dart.expect
index f021463..4d68a5a8 100644
--- a/pkg/dart2bytecode/testcases/type_ops.dart.expect
+++ b/pkg/dart2bytecode/testcases/type_ops.dart.expect
@@ -364,7 +364,7 @@
   [2] = Type dart:core::Map < DART_SDK/pkg/dart2bytecode/testcases/type_ops.dart::D::TypeParam/0, DART_SDK/pkg/dart2bytecode/testcases/type_ops.dart::D::TypeParam/1 >
   [3] = ObjectRef ''
   [4] = SubtypeTestCache
-  [5] = DirectCall 'dart:core::_GrowableList::_literal1 (constructor)', ArgDesc num-args 2, num-type-args 0, names []
+  [5] = DirectCall 'dart:core::_GrowableList::_literal1 (constructor)', ArgDesc num-args 1, num-type-args 1, names []
   [6] = Reserved
   [7] = InterfaceCall 'dart:core::List::[]', ArgDesc num-args 2, num-type-args 0, names []
   [8] = Reserved
@@ -403,23 +403,28 @@
     return-type DART_SDK/pkg/dart2bytecode/testcases/type_ops.dart::E < DART_SDK/pkg/dart2bytecode/testcases/type_ops.dart::E:: (constructor)::TypeParam/0 >
 
 Bytecode {
-  Entry                1
-  CheckStack           0
-  Push                 FP[-5]
+  Entry                2
+  CheckFunctionTypeArgs 1, r0
+  JumpIfNotZeroTypeArgs L1
   PushConstant         CP#0
-  AllocateT
-  StoreLocal           r0
+  PopLocal             r0
+L1:
+  CheckStack           0
   Push                 r0
-  DirectCall           CP#1, 1
+  PushConstant         CP#1
+  AllocateT
+  StoreLocal           r1
+  Push                 r1
+  DirectCall           CP#2, 1
   Drop1
   ReturnTOS
 }
-Default function type arguments: CP#3
+Default function type arguments: CP#0
 ConstantPool {
-  [0] = Class DART_SDK/pkg/dart2bytecode/testcases/type_ops.dart::E
-  [1] = DirectCall 'DART_SDK/pkg/dart2bytecode/testcases/type_ops.dart::E::_ (constructor)', ArgDesc num-args 1, num-type-args 0, names []
-  [2] = Reserved
-  [3] = ObjectRef < dart:core::String >
+  [0] = ObjectRef < dart:core::String >
+  [1] = Class DART_SDK/pkg/dart2bytecode/testcases/type_ops.dart::E
+  [2] = DirectCall 'DART_SDK/pkg/dart2bytecode/testcases/type_ops.dart::E::_ (constructor)', ArgDesc num-args 1, num-type-args 0, names []
+  [3] = Reserved
 }
 
 
diff --git a/pkg/dart2wasm/lib/async.dart b/pkg/dart2wasm/lib/async.dart
index b52e1a3..0def513 100644
--- a/pkg/dart2wasm/lib/async.dart
+++ b/pkg/dart2wasm/lib/async.dart
@@ -106,7 +106,7 @@
             translator.topType,
           ],
         ),
-        "${function.functionName} inner",
+        "$functionName inner",
       );
 }
 
@@ -116,20 +116,16 @@
     with AsyncCodeGeneratorMixin {
   AsyncProcedureCodeGenerator(
     super.translator,
-    super.function,
     super.enclosingMember,
+    super.signature,
+    super.functionName,
   );
 }
 
 /// Generates code for async closures.
 class AsyncLambdaCodeGenerator extends LambdaStateMachineEntryCodeGenerator
     with AsyncCodeGeneratorMixin {
-  AsyncLambdaCodeGenerator(
-    super.translator,
-    super.enclosingMember,
-    super.lambda,
-    super.closures,
-  );
+  AsyncLambdaCodeGenerator(super.translator, super.lambda);
 }
 
 class AsyncStateMachineCodeGenerator extends StateMachineCodeGenerator {
diff --git a/pkg/dart2wasm/lib/class_info.dart b/pkg/dart2wasm/lib/class_info.dart
index 7e6873e..10952b6 100644
--- a/pkg/dart2wasm/lib/class_info.dart
+++ b/pkg/dart2wasm/lib/class_info.dart
@@ -408,13 +408,20 @@
   TranslatorOptions get options => translator.options;
 
   void _createStructForClassTop() {
-    final w.StructType struct = translator.typesBuilder.defineStruct("#Top");
+    final w.StructType struct = translator.typesBuilder.defineStruct(
+      "#Top",
+      brand: true,
+    );
     topInfo = ClassInfo(null, 0, 0, struct, null);
     topInfo._repr = w.RefType.def(struct, nullable: false);
     translator.classForHeapType[struct] = topInfo;
   }
 
-  void _createStructForClass(Map<Class, int> classIds, Class cls) {
+  void _createStructForClass(
+    Map<Class, int> classIds,
+    Class cls, {
+    bool? brand,
+  }) {
     ClassInfo? info = translator.classInfo[cls];
     if (info != null) return;
 
@@ -425,6 +432,7 @@
       final w.StructType struct = translator.typesBuilder.defineStruct(
         cls.name,
         superType: superInfo.struct,
+        brand: brand ?? translator.options.uniqueTypes,
       );
       info = ClassInfo(cls, classId, superInfo.depth + 1, struct, superInfo);
       // Mark Top type as implementing Object to force the representation
@@ -479,6 +487,7 @@
           ? translator.typesBuilder.defineStruct(
               cls.name,
               superType: superInfo.struct,
+              brand: translator.options.uniqueTypes,
             )
           : superInfo.struct;
       info = ClassInfo(
@@ -506,6 +515,7 @@
       () => translator.typesBuilder.defineStruct(
         'Record$numFields',
         superType: translator.recordInfo.struct,
+        brand: translator.options.uniqueTypes,
       ),
     );
 
@@ -675,7 +685,7 @@
     // Subclasses of the `_Closure` class are generated on the fly as fields
     // with function types are encountered. Therefore, `_Closure` class must be
     // early in the initialization order.
-    _createStructForClass(classIds, translator.closureClass);
+    _createStructForClass(classIds, translator.closureClass, brand: true);
 
     // Similarly `_Type` is needed for type parameter fields in classes and
     // needs to be initialized before we encounter a class with type parameters.
diff --git a/pkg/dart2wasm/lib/closures.dart b/pkg/dart2wasm/lib/closures.dart
index 7093e41..3ae1be2 100644
--- a/pkg/dart2wasm/lib/closures.dart
+++ b/pkg/dart2wasm/lib/closures.dart
@@ -275,6 +275,7 @@
         mutable: false,
       ),
     },
+    brand: true,
   );
 
   /// Base struct for non-generic closure vtables.
@@ -437,10 +438,12 @@
     String name, {
     Map<String, w.FieldType>? namedFields,
     w.StructType? superType,
+    bool? brand,
   }) {
     final type = translator.typesBuilder.defineStruct(
       name,
       superType: superType,
+      brand: brand ?? translator.options.uniqueTypes,
     );
     if (superType != null) {
       type.fields.addAll(superType.fields);
@@ -636,6 +639,7 @@
           ...List.filled(typeCount, w.FieldType(typeType, mutable: false)),
         ],
         superType: _getInstantiationContextBaseStruct(typeCount),
+        brand: translator.options.uniqueTypes,
       );
     }
 
@@ -1305,22 +1309,22 @@
 /// A local function or function expression.
 class Lambda {
   final FunctionNode functionNode;
-
-  // Note: creating a `Lambda` does not add this function to the compilation
-  // queue. Make sure to get it with `Functions.getLambdaFunction` to add it
-  // to the compilation queue.
-  final w.FunctionBuilder function;
-
   final Source functionNodeSource;
 
-  /// Index of the function within the enclosing member, based on pre-order
+  final Member enclosingMember;
+  final Closures enclosingMemberClosures;
+
+  /// Index of the function within the [enclosingMember], based on pre-order
   /// traversal of the member body.
   final int index;
 
+  late final LambdaCallTarget callTarget;
+
   Lambda._(
     this.functionNode,
-    this.function,
     this.functionNodeSource,
+    this.enclosingMember,
+    this.enclosingMemberClosures,
     this.index,
   );
 }
@@ -1351,7 +1355,7 @@
   /// The parent of this context, corresponding to the lexically enclosing
   /// owner. This is null if the context is a member context, or if all contexts
   /// in the parent chain are skipped.
-  final Context? parent;
+  Context? parent;
 
   /// The variables captured by this context.
   final List<VariableDeclaration> variables = [];
@@ -1502,7 +1506,10 @@
 
   void _collectContexts() {
     if (captures.isNotEmpty || _isThisCaptured) {
-      _member.accept(_ContextCollector(this, translator.options.enableAsserts));
+      _ContextCollector(
+        this,
+        translator.options.enableAsserts,
+      ).collect(_member);
     }
   }
 
@@ -1515,15 +1522,18 @@
       if (owner is Constructor) {
         context.struct = translator.typesBuilder.defineStruct(
           "<$owner-constructor-context>",
+          brand: translator.options.uniqueTypes,
         );
       } else if (owner.parent is Constructor) {
         Constructor constructor = owner.parent as Constructor;
         context.struct = translator.typesBuilder.defineStruct(
           "<$constructor-constructor-body-context>",
+          brand: translator.options.uniqueTypes,
         );
       } else {
         context.struct = translator.typesBuilder.defineStruct(
           "<context ${owner.location}>",
+          brand: translator.options.uniqueTypes,
         );
       }
     }
@@ -1713,37 +1723,20 @@
     super.visitTypeParameterType(node);
   }
 
-  void _visitLambda(FunctionNode node, [VariableDeclaration? variable]) {
-    final module = translator.moduleForReference(member.reference);
-    List<w.ValueType> inputs = [
-      closureContextFieldType,
-      ...List.filled(node.typeParameters.length, closures.typeType),
-      for (VariableDeclaration param in node.positionalParameters)
-        translator.translateType(param.type),
-      for (VariableDeclaration param in node.namedParameters)
-        translator.translateType(param.type),
-    ];
-    List<w.ValueType> outputs = [translator.translateType(node.returnType)];
-    w.FunctionType type = translator.typesBuilder.defineFunction(
-      inputs,
-      outputs,
-    );
-    final String? functionNodeName = variable?.name;
-    final String functionName;
-    if (functionNodeName == null) {
-      functionName = "$member closure at ${node.location}";
-    } else {
-      functionName = "$member closure $functionNodeName at ${node.location}";
-    }
-    final function = module.functions.define(type, functionName);
+  void _visitLambda(FunctionNode node) {
     final lambda = Lambda._(
       node,
-      function,
       _currentSource,
+      member,
+      closures,
       closures.lambdas.length,
     );
+    lambda.callTarget = LambdaCallTarget(
+      translator.functions.getLambdaFunctionType(lambda),
+      translator,
+      lambda,
+    );
     closures.lambdas[node] = lambda;
-    translator.functions.getLambdaFunction(lambda, member, closures);
 
     functionIsSyncStarOrAsync.add(
       node.asyncMarker == AsyncMarker.SyncStar ||
@@ -1762,7 +1755,7 @@
   void visitFunctionDeclaration(FunctionDeclaration node) {
     // Variable is in outer scope
     node.variable.accept(this);
-    _visitLambda(node.function, node.variable);
+    _visitLambda(node.function);
   }
 }
 
@@ -1774,6 +1767,16 @@
 
   _ContextCollector(this.closures, this.enableAsserts);
 
+  void collect(Member member) {
+    member.accept(this);
+
+    for (final context in closures.contexts.values) {
+      while (context.parent?.isEmpty ?? false) {
+        context.parent = context.parent!.parent;
+      }
+    }
+  }
+
   @override
   void visitAssertStatement(AssertStatement node) {
     if (enableAsserts) {
@@ -1793,12 +1796,8 @@
         currentContext == null ||
         node.parent is Constructor && !isInInitializer;
     Context? oldContext = currentContext;
-    Context? parent = currentContext;
-    while (parent != null && parent.isEmpty) {
-      parent = parent.parent;
-    }
     bool containsThis = closures._isThisCaptured && outerMost;
-    currentContext = Context(node, parent, containsThis);
+    currentContext = Context(node, oldContext, containsThis);
     closures.contexts[node] = currentContext!;
     node.visitChildren(this);
     currentContext = oldContext;
diff --git a/pkg/dart2wasm/lib/code_generator.dart b/pkg/dart2wasm/lib/code_generator.dart
index a999b9b..7b374f3 100644
--- a/pkg/dart2wasm/lib/code_generator.dart
+++ b/pkg/dart2wasm/lib/code_generator.dart
@@ -8,6 +8,7 @@
 import 'package:front_end/src/api_prototype/external_effect.dart'
     show ExternalEffect;
 import 'package:kernel/ast.dart';
+import 'package:kernel/names.dart';
 import 'package:kernel/type_environment.dart';
 import 'package:wasm_builder/wasm_builder.dart' as w;
 
@@ -1332,7 +1333,7 @@
     if (expression != null) {
       translateExpression(expression, returnType);
     } else {
-      translator.convertType(b, voidMarker, returnType);
+      _implicitReturn();
     }
 
     // If we are wrapped in a [TryFinally] node then we have to run finalizers
@@ -1666,7 +1667,7 @@
 
     // When calling `==` and the argument is potentially nullable, check if the
     // argument is `null`.
-    if (node.name.text == '==') {
+    if (node.name == equalsName) {
       assert(node.arguments.positional.length == 1);
       assert(node.arguments.named.isEmpty);
       final argument = node.arguments.positional[0];
@@ -1783,7 +1784,7 @@
     // accesses on constant lists (see https://dartbug.com/60313)
     if (singleTarget == null &&
         target.kind == ProcedureKind.Operator &&
-        target.name.text == '[]') {
+        target.name == indexGetName) {
       final receiver = node.receiver;
       if (receiver is ConstantExpression && receiver.constant is ListConstant) {
         singleTarget = translator.listBaseIndexOperator;
@@ -1872,6 +1873,9 @@
     }
 
     translator.callFunction(forwarder.function, b);
+    if (callShape.isIndexSet) {
+      b.ref_null(w.HeapType.none);
+    }
 
     return translator.topType;
   }
@@ -2073,6 +2077,11 @@
       b.ref_null(w.HeapType.none);
       return w.RefType(w.HeapType.none, nullable: true);
     }
+    if (selector.synthesizeNoReturn) {
+      assert(selector.signature.outputs.isEmpty);
+      b.unreachable();
+      return voidMarker;
+    }
 
     return translator.outputOrVoid(signature.outputs);
   }
@@ -2163,12 +2172,14 @@
     translateExpression(node.value, paramType);
     if (!preserved) {
       call(node.targetReference);
+      b.drop(); // Drop `null` from setter call.
       return voidMarker;
     }
     w.Local temp = addLocal(paramType);
     b.local_tee(temp);
 
     call(reference);
+    b.drop(); // Drop `null` from setter call.
     b.local_get(temp);
     return temp.type;
   }
@@ -2416,6 +2427,7 @@
         },
         useUncheckedEntry: useUncheckedEntry,
       );
+      b.drop(); // Drop `null` from setter call.
       if (preserved) {
         b.local_get(temp!);
         return temp!.type;
@@ -2450,6 +2462,7 @@
       b.local_tee(temp);
     }
     call(reference);
+    b.drop(); // Drop `null` from setter call.
     if (preserved) {
       b.local_get(temp!);
       return temp.type;
@@ -2495,7 +2508,7 @@
     Lambda lambda = closures.lambdas[functionNode]!;
     ClosureImplementation closure = translator.getClosure(
       functionNode,
-      lambda.function,
+      lambda.callTarget,
       b.moduleBuilder,
       ParameterInfo.fromLocalFunction(functionNode),
       "closure wrapper at ${functionNode.location}",
@@ -2595,12 +2608,12 @@
   ) {
     final closureStruct = representation.closureStruct;
     final closureStructRef = w.RefType.def(closureStruct, nullable: false);
-    final signature = closureTarget.signature;
+    final callTarget = closureTarget.callTarget;
+    assert(callTarget is AstCallTarget || callTarget is LambdaCallTarget);
+    final signature = callTarget.signature;
     final paramInfo = closureTarget.paramInfo;
-    final member = closureTarget.member;
-    final lambdaFunction = closureTarget.lambdaFunction;
 
-    if (lambdaFunction == null) {
+    if (callTarget is AstCallTarget) {
       if (paramInfo.takesContextOrReceiver) {
         translateExpression(node.receiver, closureStructRef);
         b.struct_get(closureStruct, FieldIndex.closureContext);
@@ -2609,21 +2622,15 @@
       } else {
         _visitArguments(node.arguments, signature, paramInfo, 0);
       }
-      return translator.outputOrVoid(
-        call(
-          translator.getFunctionEntry(member.reference, uncheckedEntry: false),
-        ),
-      );
-    } else {
-      assert(paramInfo.takesContextOrReceiver);
-      translateExpression(node.receiver, closureStructRef);
-      b.struct_get(closureStruct, FieldIndex.closureContext);
-      translator.convertType(b, closureContextFieldType, signature.inputs[0]);
-      _visitArguments(node.arguments, signature, paramInfo, 1);
-      return translator.outputOrVoid(
-        translator.callFunction(lambdaFunction, b),
-      );
+      return translator.outputOrVoid(translator.callTarget(callTarget, b));
     }
+
+    assert(paramInfo.takesContextOrReceiver);
+    translateExpression(node.receiver, closureStructRef);
+    b.struct_get(closureStruct, FieldIndex.closureContext);
+    translator.convertType(b, closureContextFieldType, signature.inputs[0]);
+    _visitArguments(node.arguments, signature, paramInfo, 1);
+    return translator.outputOrVoid(translator.callTarget(callTarget, b));
   }
 
   w.ValueType _generateClosureInvocation(
@@ -2691,13 +2698,12 @@
     Arguments arguments = node.arguments;
     _visitArguments(
       arguments,
-      lambda.function.type,
+      lambda.callTarget.signature,
       ParameterInfo.fromLocalFunction(decl.function),
       1,
     );
     b.comment("Local call of ${decl.variable.name}");
-    translator.callFunction(lambda.function, b);
-    return translator.outputOrVoid(lambda.function.type.outputs);
+    return translator.outputOrVoid(translator.callTarget(lambda.callTarget, b));
   }
 
   @override
@@ -3427,26 +3433,28 @@
   if (asyncMarker == AsyncMarker.SyncStar) {
     return SyncStarProcedureCodeGenerator(
       translator,
-      functionBuilder,
       procedure,
+      functionBuilder.type,
+      functionBuilder.name,
     );
   }
   assert(asyncMarker == AsyncMarker.Async);
-  return AsyncProcedureCodeGenerator(translator, functionBuilder, procedure);
+  return AsyncProcedureCodeGenerator(
+    translator,
+    procedure,
+    functionBuilder.type,
+    functionBuilder.name,
+  );
 }
 
-CodeGenerator getLambdaCodeGenerator(
-  Translator translator,
-  Lambda lambda,
-  Member enclosingMember,
-  Closures enclosingMemberClosures,
-) {
+CodeGenerator getLambdaCodeGenerator(Translator translator, Lambda lambda) {
+  final enclosingMember = lambda.enclosingMember;
   final enclosingClass = enclosingMember.enclosingClass;
   if (enclosingClass != null &&
       translator.classInfo[enclosingClass]!.isCyclic) {
     return UnreachableCodeGenerator(
       translator,
-      lambda.function.type,
+      lambda.callTarget.signature,
       enclosingMember,
     );
   }
@@ -3454,28 +3462,13 @@
   final asyncMarker = lambda.functionNode.asyncMarker;
 
   if (asyncMarker == AsyncMarker.Async) {
-    return AsyncLambdaCodeGenerator(
-      translator,
-      enclosingMember,
-      lambda,
-      enclosingMemberClosures,
-    );
+    return AsyncLambdaCodeGenerator(translator, lambda);
   }
   if (asyncMarker == AsyncMarker.SyncStar) {
-    return SyncStarLambdaCodeGenerator(
-      translator,
-      enclosingMember,
-      lambda,
-      enclosingMemberClosures,
-    );
+    return SyncStarLambdaCodeGenerator(translator, lambda);
   }
   assert(asyncMarker == AsyncMarker.Sync);
-  return SynchronousLambdaCodeGenerator(
-    translator,
-    enclosingMember,
-    lambda,
-    enclosingMemberClosures,
-  );
+  return SynchronousLambdaCodeGenerator(translator, lambda);
 }
 
 /// Returns a [CodeGenerator] for the given member iff that member can be
@@ -3830,7 +3823,7 @@
       targetProcedure.reference,
       uncheckedEntry: false,
     );
-    final targetSignature = translator.signatureForDirectCall(target);
+    final callTarget = translator.directCallTarget(target);
 
     _initializeThis(reference);
 
@@ -3841,7 +3834,11 @@
     // Load the receiver
     final receiverLocal = paramLocals[argReceiverOffset];
     b.local_get(receiverLocal);
-    translator.convertType(b, receiverLocal.type, targetSignature.inputs[0]);
+    translator.convertType(
+      b,
+      receiverLocal.type,
+      callTarget.signature.inputs[0],
+    );
 
     // Load type parameters for target.
     final targetTypeParams = targetFunction.typeParameters;
@@ -3882,7 +3879,7 @@
     final targetPositionalParams = targetFunction.positionalParameters;
     for (int i = 0; i < targetParamInfo.positional.length; i++) {
       final targetParamType =
-          targetSignature.inputs[1 + targetParamInfo.typeParamCount + i];
+          callTarget.signature.inputs[1 + targetParamInfo.typeParamCount + i];
       if (i < callShape.positionalCount) {
         // Provided by the caller.
         final paramValue = paramLocals[argPositionalsOffset + i];
@@ -3918,7 +3915,7 @@
     final targetNamedParams = targetFunction.namedParameters;
     for (int i = 0; i < targetParamInfo.names.length; ++i) {
       final targetParamType =
-          targetSignature.inputs[1 +
+          callTarget.signature.inputs[1 +
               targetParamInfo.typeParamCount +
               targetParamInfo.positional.length +
               i];
@@ -3955,12 +3952,10 @@
       }
     }
 
-    call(target);
-    translator.convertType(
-      b,
-      translator.outputOrVoid(targetSignature.outputs),
-      translator.topType,
-    );
+    final outputs = translator.callTarget(callTarget, b);
+    if (outputs.isNotEmpty) {
+      translator.convertType(b, outputs.single, returnType);
+    }
     b.return_();
     b.end();
   }
@@ -4046,6 +4041,7 @@
       b.local_get(positionalArgLocal);
       translator.convertType(b, positionalArgLocal.type, setterInputs[1]);
       call(target);
+      b.drop(); // Drop `null` from setter call.
     }
 
     b.end(); // end function
@@ -4888,7 +4884,7 @@
     if (initFunction == null) {
       // Statically initialized
       definition.read(translator, b);
-      // b.ref_cast(functionType.outputs.single as w.RefType);
+      translator.convertType(b, definition.type, returnType);
     } else {
       if (flag != null) {
         // Explicit initialization flag
@@ -4898,6 +4894,7 @@
         b.else_();
         translator.callFunction(initFunction, b);
         b.end();
+        translator.convertType(b, definition.type, returnType);
       } else {
         // Null signals uninitialized
         w.Label block = b.block(const [], [initFunction.type.outputs.single]);
@@ -4905,6 +4902,7 @@
         b.br_on_non_null(block);
         translator.callFunction(initFunction, b);
         b.end();
+        translator.convertType(b, initFunction.type.outputs.single, returnType);
       }
     }
   }
@@ -5004,18 +5002,13 @@
 
 class SynchronousLambdaCodeGenerator extends AstCodeGenerator {
   final Lambda lambda;
-  final Closures enclosingMemberClosures;
 
-  SynchronousLambdaCodeGenerator(
-    Translator translator,
-    Member enclosingMember,
-    this.lambda,
-    this.enclosingMemberClosures,
-  ) : super(translator, lambda.function.type, enclosingMember);
+  SynchronousLambdaCodeGenerator(Translator translator, this.lambda)
+    : super(translator, lambda.callTarget.signature, lambda.enclosingMember);
 
   @override
   void generateInternal() {
-    closures = enclosingMemberClosures;
+    closures = lambda.enclosingMemberClosures;
 
     setSourceMapSource(lambda.functionNodeSource);
 
@@ -6111,6 +6104,9 @@
   /// Whether callers should synthesize a `null` return value.
   bool get synthesizeNullReturnValue => false;
 
+  /// Whether callee never returns and callers should emit `unreachable`.
+  bool get synthesizeNoReturn => false;
+
   /// Whether this call target supports inlining.
   bool get supportsInlining => false;
 
@@ -6146,6 +6142,9 @@
       _translator.synthesizeNullReturnValue(_reference);
 
   @override
+  bool get synthesizeNoReturn => _translator.synthesizeNoReturn(_reference);
+
+  @override
   String get name => _translator.functions.getFunctionName(_reference);
 
   @override
@@ -6167,6 +6166,21 @@
   w.BaseFunction get function => _translator.functions.getFunction(_reference);
 }
 
+class LambdaCallTarget extends CallTarget {
+  final Translator _translator;
+  final Lambda _lambda;
+
+  LambdaCallTarget(super.signature, this._translator, this._lambda);
+
+  @override
+  late final String name = _translator.functions.getLambdaFunctionName(_lambda);
+
+  @override
+  late final w.BaseFunction function = _translator.functions.getLambdaFunction(
+    _lambda,
+  );
+}
+
 /// Whether a `catch` guard has the right type to catch JS exceptions.
 ///
 /// JS exceptions are only caught as: `dynamic`, `Object`, an extension of
diff --git a/pkg/dart2wasm/lib/dart2wasm.dart b/pkg/dart2wasm/lib/dart2wasm.dart
index 8a491ed..93b0779 100644
--- a/pkg/dart2wasm/lib/dart2wasm.dart
+++ b/pkg/dart2wasm/lib/dart2wasm.dart
@@ -29,6 +29,10 @@
     defaultsTo: _d.translatorOptions.importSharedMemory,
   ),
   Flag("inlining", (o, value) => o.translatorOptions.inliningOverride = value),
+  Flag(
+    "unique-types",
+    (o, value) => o.translatorOptions.enableUniqueTypes = value,
+  ),
   Flag("minify", (o, value) => o.translatorOptions.minifyOverride = value),
   Flag("dry-run", (o, value) => o.dryRun = value, defaultsTo: _d.dryRun),
   StringMultiOption(
diff --git a/pkg/dart2wasm/lib/dispatch_table.dart b/pkg/dart2wasm/lib/dispatch_table.dart
index 6f1b97b..b80820b 100644
--- a/pkg/dart2wasm/lib/dispatch_table.dart
+++ b/pkg/dart2wasm/lib/dispatch_table.dart
@@ -5,6 +5,7 @@
 import 'dart:math' show min;
 
 import 'package:kernel/ast.dart';
+import 'package:kernel/names.dart';
 import 'package:vm/metadata/procedure_attributes.dart';
 import 'package:vm/metadata/table_selector.dart';
 import 'package:vm/metadata/unreachable.dart';
@@ -66,6 +67,12 @@
   /// Will be set during `_computeSignature`.
   late final bool synthesizeNullReturnValue;
 
+  /// Whether the call will never return and callers can emit an
+  /// `unreachable()` after the call.
+  ///
+  /// Will be set during `_computeSignature`.
+  late final bool synthesizeNoReturn;
+
   /// The selector's member's name.
   final String name;
 
@@ -110,7 +117,8 @@
   /// returns are subtypes (resp. supertypes) of the types in the signature.
   w.FunctionType _computeSignature() {
     var nameIndex = paramInfo.nameIndex;
-    final int returnCount = (isSetter || isIndexSetter) ? 0 : 1;
+    final bool isSetterOrIndexSetter = (isSetter || isIndexSetter);
+    final int returnCount = isSetterOrIndexSetter ? 0 : 1;
     List<Set<w.ValueType>> inputSets = List.generate(
       1 + paramInfo.paramCount,
       (_) => {},
@@ -208,14 +216,18 @@
       outputSets.length,
       (i) => _upperBound(outputSets[i], ensureBoxed: false),
     );
-    if (outputs case [w.RefType(heapType: w.HeapType.none, nullable: true)]) {
-      // All functions are guaranteed to return null.
-      // Will prune the signature and make call sites synthesize `null` if
-      // needed.
+    if (outputs case [
+      w.RefType(heapType: w.HeapType.none, nullable: final nullable),
+    ]) {
+      // All functions are guaranteed to return null or are unreachable.
+      // => Prune signature to not return anything
+      // => Tell callers to synthesize `null` or emit `unreachable`.
       outputs.clear();
-      synthesizeNullReturnValue = true;
+      synthesizeNullReturnValue = nullable;
+      synthesizeNoReturn = !nullable;
     } else {
-      synthesizeNullReturnValue = false;
+      synthesizeNullReturnValue = isSetterOrIndexSetter;
+      synthesizeNoReturn = false;
     }
     return translator.typesBuilder.defineFunction([
       inputs[0],
@@ -444,7 +456,7 @@
     Member member = target.asMember;
     bool isGetter = target.isGetter || target.isTearOffReference;
     bool isSetter = target.isSetter;
-    bool isIndexSetter = member.name.text == '[]=';
+    bool isIndexSetter = member.name == indexSetName;
     ProcedureAttributesMetadata metadata = procedureAttributeMetadata[member]!;
     int selectorId = isGetter
         ? metadata.getterSelectorId
diff --git a/pkg/dart2wasm/lib/dynamic_dispatch_table.dart b/pkg/dart2wasm/lib/dynamic_dispatch_table.dart
index 2982b82..05f30e9a 100644
--- a/pkg/dart2wasm/lib/dynamic_dispatch_table.dart
+++ b/pkg/dart2wasm/lib/dynamic_dispatch_table.dart
@@ -192,19 +192,18 @@
   }
 
   void output() {
+    outputTargetTable();
+    outputClassIdTable();
+  }
+
+  void outputTargetTable() {
     int start = 0;
     while (start < _table.length) {
-      final entry = _table[start];
-      if (entry == null) {
-        start++;
-        continue;
-      }
+      final pos = _findNextEntry(start);
+      final entry = pos.entry;
+      if (entry == null) break;
 
-      if (!translator.functions.hasDynamicSelectorCall(entry.shape)) {
-        // The dynamic call was never compiled (e.g. due to being unreachable).
-        start++;
-        continue;
-      }
+      start = pos.start;
 
       final strideWidth = calculateStrideWith(
         start,
@@ -230,28 +229,6 @@
 
       final targetModuleBuilder = translator.moduleForReference(entry.target);
 
-      // The dynamic selector is invoked and the class has a target, we have to
-      // write the class id - to make it match at runtime.
-      final classIdsTable = getClassIdsTable(targetModuleBuilder);
-      if (strideWidth < strideElementTableLimit) {
-        for (int i = 0; i < strideWidth; ++i) {
-          targetModuleBuilder.elements
-              .activeExpressionSegmentBuilderFor(classIdsTable)
-              .setExpressionAt(
-                start + i,
-                buildIntegerExpression(targetModuleBuilder, entry.classId + i),
-              );
-        }
-      } else {
-        final b = targetModuleBuilder.startFunction.body;
-        b.fillTableRangeWithIncreasingIntegers(
-          classIdsTable,
-          start,
-          strideWidth,
-          entry.classId,
-        );
-      }
-
       // Only write out a dynamic forwarder function iff the target supports the
       // shape. See longer comment in [build] about this.
       final fun = translator.functions.getExistingDynamicForwarder(
@@ -276,6 +253,78 @@
       start += strideWidth;
     }
   }
+
+  void outputClassIdTable() {
+    int start = 0;
+    while (start < _table.length) {
+      final pos = _findNextEntry(start);
+      final entry = pos.entry;
+      if (entry == null) break;
+
+      start = pos.start;
+      int end = start + 1;
+      final targetModuleBuilder = translator.moduleForReference(entry.target);
+      while (end < _table.length) {
+        final newEntry = _table[end];
+        if (newEntry == null) break;
+        final distance = end - start;
+        if ((entry.classId + distance) != newEntry.classId) break;
+        final newTargetModuleBuilder = translator.moduleForReference(
+          newEntry.target,
+        );
+        // If the next target is in a different module, then it must be set in a
+        // different stride.
+        if (targetModuleBuilder != translator.mainModule &&
+            targetModuleBuilder != newTargetModuleBuilder) {
+          break;
+        }
+        end++;
+      }
+      final strideWidth = end - start;
+
+      // The dynamic selector is invoked and the class has a target, we have to
+      // write the class id - to make it match at runtime.
+      final classIdsTable = getClassIdsTable(targetModuleBuilder);
+      if (strideWidth < strideElementTableLimit) {
+        for (int i = 0; i < strideWidth; ++i) {
+          targetModuleBuilder.elements
+              .activeExpressionSegmentBuilderFor(classIdsTable)
+              .setExpressionAt(
+                start + i,
+                buildIntegerExpression(targetModuleBuilder, entry.classId + i),
+              );
+        }
+      } else {
+        final b = targetModuleBuilder.startFunction.body;
+        b.fillTableRangeWithIncreasingIntegers(
+          classIdsTable,
+          start,
+          strideWidth,
+          entry.classId,
+        );
+      }
+
+      start += strideWidth;
+    }
+  }
+
+  ({int start, TableEntry? entry}) _findNextEntry(int start) {
+    while (start < _table.length) {
+      final entry = _table[start];
+      if (entry == null) {
+        start++;
+        continue;
+      }
+
+      if (!translator.functions.hasDynamicSelectorCall(entry.shape)) {
+        // The dynamic call was never compiled (e.g. due to being unreachable).
+        start++;
+        continue;
+      }
+      return (start: start, entry: entry);
+    }
+    return (start: start, entry: null);
+  }
 }
 
 class DynamicSelector {
diff --git a/pkg/dart2wasm/lib/ffi_native_transformer.dart b/pkg/dart2wasm/lib/ffi_native_transformer.dart
index 05f7fe2..ea6dc93 100644
--- a/pkg/dart2wasm/lib/ffi_native_transformer.dart
+++ b/pkg/dart2wasm/lib/ffi_native_transformer.dart
@@ -61,6 +61,7 @@
 }
 
 class WasmFfiNativeTransformer extends FfiNativeTransformer {
+  final Class wasmVoidClass;
   final Class wasmI32Class;
   final Class wasmI64Class;
   final Class wasmF32Class;
@@ -90,7 +91,8 @@
     super.hierarchy,
     super.diagnosticReporter,
     super.referenceFromIndex,
-  ) : wasmI32Class = index.getClass('dart:_wasm', 'WasmI32'),
+  ) : wasmVoidClass = index.getClass('dart:_wasm', 'WasmVoid'),
+      wasmI32Class = index.getClass('dart:_wasm', 'WasmI32'),
       wasmI64Class = index.getClass('dart:_wasm', 'WasmI64'),
       wasmF32Class = index.getClass('dart:_wasm', 'WasmF32'),
       wasmF64Class = index.getClass('dart:_wasm', 'WasmF64'),
@@ -149,6 +151,11 @@
       ),
       pointerAddressField = index.getField('dart:ffi', 'Pointer', '_address');
 
+  late final wasmVoidType = InterfaceType(
+    wasmVoidClass,
+    Nullability.nonNullable,
+  );
+
   @override
   visitProcedure(Procedure node) {
     // Only transform functions that are external and have Native annotation:
@@ -229,7 +236,7 @@
     }
 
     final retWasmType = _convertFfiTypeToWasmType(ffiFunctionType.returnType);
-    final retWasmType_ = retWasmType ?? VoidType();
+    final isVoidReturn = retWasmType == null;
 
     final wasmImportProcedure = Procedure(
       wasmImportName,
@@ -237,7 +244,7 @@
       FunctionNode(
         null,
         positionalParameters: wasmImportProcedureArgs,
-        returnType: retWasmType_,
+        returnType: isVoidReturn ? wasmVoidType : retWasmType,
       ),
       fileUri: node.fileUri,
       isExternal: true,
@@ -274,12 +281,19 @@
     }
 
     // Convert return value
-    node.function.body = ReturnStatement(
-      _ffiValueToDartValue(
-        ffiFunctionType.returnType,
-        StaticInvocation(wasmImportProcedure, Arguments(ffiCallArgs)),
-      ),
+    final resultExpression = _ffiValueToDartValue(
+      ffiFunctionType.returnType,
+      StaticInvocation(wasmImportProcedure, Arguments(ffiCallArgs)),
     );
+    if (isVoidReturn) {
+      node.function.body = Block([
+        ExpressionStatement(resultExpression),
+        ReturnStatement(NullLiteral()),
+      ])..parent = node.function.body;
+    } else {
+      node.function.body = ReturnStatement(resultExpression)
+        ..parent = node.function.body;
+    }
 
     return node;
   }
diff --git a/pkg/dart2wasm/lib/functions.dart b/pkg/dart2wasm/lib/functions.dart
index 212c21c..881e8f8 100644
--- a/pkg/dart2wasm/lib/functions.dart
+++ b/pkg/dart2wasm/lib/functions.dart
@@ -3,6 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:kernel/ast.dart';
+import 'package:kernel/names.dart';
 import 'package:wasm_builder/wasm_builder.dart' as w;
 
 import 'closures.dart';
@@ -106,6 +107,7 @@
             null,
             isImportOrExport: true,
             synthesizeNullReturnValue: false,
+            synthesizeNoReturn: false,
           );
           return _functions[member.reference] =
               translator
@@ -140,6 +142,7 @@
               null,
               isImportOrExport: true,
               synthesizeNullReturnValue: false,
+              synthesizeNoReturn: false,
             )
           : translator.signatureForDirectCall(target);
 
@@ -203,24 +206,19 @@
     });
   }
 
-  w.BaseFunction getLambdaFunction(
-    Lambda lambda,
-    Member enclosingMember,
-    Closures enclosingMemberClosures,
-  ) {
+  w.BaseFunction getLambdaFunction(Lambda lambda) {
     return _lambdas.putIfAbsent(lambda, () {
-      translator.compilationQueue.add(
-        CompilationTask(
-          lambda.function,
-          getLambdaCodeGenerator(
-            translator,
-            lambda,
-            enclosingMember,
-            enclosingMemberClosures,
-          ),
-        ),
+      final module = translator.moduleForReference(
+        lambda.enclosingMember.reference,
       );
-      return lambda.function;
+      final function = module.functions.define(
+        getLambdaFunctionType(lambda),
+        getLambdaFunctionName(lambda),
+      );
+      translator.compilationQueue.add(
+        CompilationTask(function, getLambdaCodeGenerator(translator, lambda)),
+      );
+      return function;
     });
   }
 
@@ -237,9 +235,27 @@
     return _getFunctionType(target);
   }
 
+  w.FunctionType getLambdaFunctionType(Lambda lambda) {
+    final node = lambda.functionNode;
+    final inputs = <w.ValueType>[
+      closureContextFieldType,
+      ...List.filled(
+        node.typeParameters.length,
+        translator.types.nonNullableTypeType,
+      ),
+      for (final param in node.positionalParameters)
+        translator.translateType(param.type),
+      for (final param in node.namedParameters)
+        translator.translateType(param.type),
+    ];
+    final outputs = [translator.translateType(node.returnType)];
+    return translator.typesBuilder.defineFunction(inputs, outputs);
+  }
+
   w.FunctionType _getFunctionType(Reference target) {
     final Member member = target.asMember;
     final synthesizeNullReturnValue = this.synthesizeNullReturnValue(target);
+    final synthesizeNoReturn = this.synthesizeNoReturn(target);
 
     if (target.isBodyReference) {
       // This is the function body that is always called directly (never via
@@ -249,22 +265,40 @@
         translator,
         member,
         synthesizeNullReturnValue,
+        synthesizeNoReturn,
       );
     }
 
     return member.accept1(
-      _FunctionTypeGenerator(translator, synthesizeNullReturnValue),
+      _FunctionTypeGenerator(
+        translator,
+        synthesizeNullReturnValue,
+        synthesizeNoReturn,
+      ),
       target,
     );
   }
 
   bool synthesizeNullReturnValue(Reference target) {
     final member = target.asMember;
+    if (target.isSetter) return true;
+    if (member.name == indexSetName) return true;
+
+    final returnType = translator.typeOfReturnValue(member);
+    final wasmType = translator.translateReturnType(returnType);
+    if (wasmType case w.RefType(heapType: w.HeapType.none, nullable: true)) {
+      return true;
+    }
+    return false;
+  }
+
+  bool synthesizeNoReturn(Reference target) {
+    final member = target.asMember;
     if (member is! Procedure) return false;
 
     final returnType = translator.typeOfReturnValue(member);
-    final wasmType = translator.translateType(returnType);
-    if (wasmType case w.RefType(heapType: w.HeapType.none, nullable: true)) {
+    final wasmType = translator.translateReturnType(returnType);
+    if (wasmType case w.RefType(heapType: w.HeapType.none, nullable: false)) {
       return true;
     }
     return false;
@@ -328,6 +362,18 @@
     }
   }
 
+  String getLambdaFunctionName(Lambda lambda) {
+    final location = lambda.functionNode.location;
+    final member = lambda.enclosingMember;
+    final lambdaNode = lambda.functionNode.parent;
+    if (lambdaNode is FunctionDeclaration) {
+      final functionNodeName = lambdaNode.variable.name;
+      return "$member closure $functionNodeName at $location";
+    }
+    assert(lambdaNode is FunctionExpression);
+    return "$member closure at $location";
+  }
+
   String getDynamicForwarderName(Reference target, CallShape shape) {
     final member = target.asMember;
     final memberName = member.toString();
@@ -407,8 +453,13 @@
 class _FunctionTypeGenerator extends MemberVisitor1<w.FunctionType, Reference> {
   final Translator translator;
   final bool synthesizeNullReturnValue;
+  final bool synthesizeNoReturn;
 
-  _FunctionTypeGenerator(this.translator, this.synthesizeNullReturnValue);
+  _FunctionTypeGenerator(
+    this.translator,
+    this.synthesizeNullReturnValue,
+    this.synthesizeNoReturn,
+  );
 
   @override
   w.FunctionType visitField(Field node, Reference target) {
@@ -419,6 +470,7 @@
         target,
         null,
         synthesizeNullReturnValue: synthesizeNullReturnValue,
+        synthesizeNoReturn: synthesizeNoReturn,
       );
     }
     assert(
@@ -439,6 +491,7 @@
       target,
       translator.translateType(receiverType),
       synthesizeNullReturnValue: synthesizeNullReturnValue,
+      synthesizeNoReturn: synthesizeNoReturn,
     );
   }
 
@@ -451,6 +504,7 @@
         target,
         null,
         synthesizeNullReturnValue: synthesizeNullReturnValue,
+        synthesizeNoReturn: synthesizeNoReturn,
       );
     }
 
@@ -476,6 +530,7 @@
       target,
       receiverType,
       synthesizeNullReturnValue: synthesizeNullReturnValue,
+      synthesizeNoReturn: synthesizeNoReturn,
     );
   }
 
@@ -712,6 +767,7 @@
   Translator translator,
   Member member,
   bool synthesizeNullReturnValue,
+  bool synthesizeNoReturn,
 ) {
   assert(member.isInstanceMember);
   assert(member is Procedure);
@@ -732,9 +788,7 @@
       translator.translateType(translator.typeOfCheckedParameterVariable(p)),
   ];
 
-  final hasNoReturnValue =
-      member is Procedure && (member.isSetter || member.name.text == '[]=') ||
-      synthesizeNullReturnValue;
+  final hasNoReturnValue = synthesizeNullReturnValue || synthesizeNoReturn;
   final outputs = [
     if (!hasNoReturnValue)
       translator.translateReturnType(translator.typeOfReturnValue(member)),
@@ -772,16 +826,13 @@
       ], []);
 
     case MethodCallShape():
-      return translator.typesBuilder.defineFunction(
-        [
-          nullableReceiver ? translator.topType : translator.topTypeNonNullable,
-          for (int i = 0; i < shape.typeCount; ++i)
-            translator.translateType(translator.types.typeType),
-          for (int i = 0; i < shape.positionalCount; ++i) translator.topType,
-          for (int i = 0; i < shape.named.length; ++i) translator.topType,
-        ],
-        [translator.topType],
-      );
+      return translator.typesBuilder.defineFunction([
+        nullableReceiver ? translator.topType : translator.topTypeNonNullable,
+        for (int i = 0; i < shape.typeCount; ++i)
+          translator.translateType(translator.types.typeType),
+        for (int i = 0; i < shape.positionalCount; ++i) translator.topType,
+        for (int i = 0; i < shape.named.length; ++i) translator.topType,
+      ], shape.isIndexSet ? [] : [translator.topType]);
   }
 }
 
@@ -820,13 +871,20 @@
   Reference target,
   w.ValueType? receiverType, {
   required bool synthesizeNullReturnValue,
+  required bool synthesizeNoReturn,
   bool isImportOrExport = false,
 }) {
   Member member = target.asMember;
 
   if (member is Field && !member.isInstanceMember) {
     final fieldType = translator.translateTypeOfField(member);
-    if (target.isImplicitGetter || target.isStaticFieldInitializer) {
+    if (target.isImplicitGetter) {
+      return translator.typesBuilder.defineFunction(
+        const [],
+        synthesizeNullReturnValue ? [] : [fieldType],
+      );
+    }
+    if (target.isStaticFieldInitializer) {
       return translator.typesBuilder.defineFunction(const [], [fieldType]);
     }
     assert(target.isImplicitSetter);
@@ -854,11 +912,8 @@
       (t is InterfaceType && t.classNode == translator.wasmVoidClass);
 
   final List<w.ValueType> outputs;
-  final hasNoReturnValue =
-      target.isSetter || member.name.text == '[]=' || synthesizeNullReturnValue;
+  final hasNoReturnValue = synthesizeNullReturnValue || synthesizeNoReturn;
   if (hasNoReturnValue) {
-    // Setters and []= are the only functions without any returned values. All
-    // other functions can return values (even `void` returning functions).
     outputs = const [];
   } else {
     final DartType returnType = translator.typeOfReturnValue(member);
@@ -886,6 +941,8 @@
 
   MethodCallShape(super.name, this.typeCount, this.positionalCount, this.named);
 
+  bool get isIndexSet => name == indexSetName;
+
   @override
   bool get isGetter => false;
   @override
diff --git a/pkg/dart2wasm/lib/intrinsics.dart b/pkg/dart2wasm/lib/intrinsics.dart
index fe20cac..62b64dc 100644
--- a/pkg/dart2wasm/lib/intrinsics.dart
+++ b/pkg/dart2wasm/lib/intrinsics.dart
@@ -629,6 +629,21 @@
       return w.NumType.i64;
     }
 
+    // int.trailingZeroBitCount
+    if (cls == translator.coreTypes.intClass &&
+        name == 'trailingZeroBitCount') {
+      codeGen.translateExpression(receiver, w.NumType.i64);
+      b.i64_ctz();
+      return w.NumType.i64;
+    }
+
+    // int.oneBitCount
+    if (cls == translator.coreTypes.intClass && name == 'oneBitCount') {
+      codeGen.translateExpression(receiver, w.NumType.i64);
+      b.i64_popcnt();
+      return w.NumType.i64;
+    }
+
     return null;
   }
 
@@ -863,7 +878,8 @@
         assert(name == '[]=');
         codeGen.translateExpression(node.arguments.positional[1], table.type);
         b.table_set(table);
-        return codeGen.voidMarker;
+        b.ref_null(w.HeapType.none);
+        return translator.topType;
       }
     }
 
@@ -1173,7 +1189,8 @@
             b.i32_wrap_i64();
             codeGen.translateExpression(value, typeOfExp(value));
             b.array_set(arrayType);
-            return codeGen.voidMarker;
+            b.ref_null(w.HeapType.none);
+            return translator.topType;
           case StaticIntrinsic.wasmArrayCopy:
             assert(fieldType.mutable);
             final destArray = node.arguments.positional[0];
@@ -1197,7 +1214,8 @@
             codeGen.translateExpression(size, w.NumType.i64);
             b.i32_wrap_i64();
             b.array_copy(arrayType, arrayType);
-            return codeGen.voidMarker;
+            b.ref_null(w.HeapType.none);
+            return translator.topType;
           case StaticIntrinsic.wasmArrayFill:
             assert(fieldType.mutable);
             final array = node.arguments.positional[0];
@@ -1218,7 +1236,8 @@
             codeGen.translateExpression(size, w.NumType.i64);
             b.i32_wrap_i64();
             b.array_fill(arrayType);
-            return codeGen.voidMarker;
+            b.ref_null(w.HeapType.none);
+            return translator.topType;
           case StaticIntrinsic.wasmArrayClone:
             assert(fieldType.mutable);
             // Until `array.new_copy` we need a special case for empty arrays.
@@ -1324,7 +1343,8 @@
           }
         }
         b.array_set(arrayType);
-        return codeGen.voidMarker;
+        b.ref_null(w.HeapType.none);
+        return translator.topType;
 
       case StaticIntrinsic.identical:
         // We can use reference equality for `identical()` except if one of the
@@ -1430,7 +1450,8 @@
         codeGen.translateExpression(hash, w.NumType.i64);
         b.i32_wrap_i64();
         b.struct_set(translator.objectInfo.struct, FieldIndex.identityHash);
-        return codeGen.voidMarker;
+        b.ref_null(w.HeapType.none);
+        return translator.topType;
 
       // dart:_internal static functions
       case StaticIntrinsic.unsafeCast:
@@ -1597,7 +1618,8 @@
               w.NumType.i64,
             );
             b.i64_store8(translator.ffiMemory, offset);
-            return translator.voidMarker;
+            b.ref_null(w.HeapType.none);
+            return translator.topType;
           case StaticIntrinsic.storeInt16:
           case StaticIntrinsic.storeUint16:
             codeGen.translateExpression(
@@ -1605,7 +1627,8 @@
               w.NumType.i64,
             );
             b.i64_store16(translator.ffiMemory, offset);
-            return translator.voidMarker;
+            b.ref_null(w.HeapType.none);
+            return translator.topType;
           case StaticIntrinsic.storeInt32:
           case StaticIntrinsic.storeUint32:
             codeGen.translateExpression(
@@ -1613,7 +1636,8 @@
               w.NumType.i64,
             );
             b.i64_store32(translator.ffiMemory, offset);
-            return translator.voidMarker;
+            b.ref_null(w.HeapType.none);
+            return translator.topType;
           case StaticIntrinsic.storeInt64:
           case StaticIntrinsic.storeUint64:
             codeGen.translateExpression(
@@ -1621,7 +1645,8 @@
               w.NumType.i64,
             );
             b.i64_store(translator.ffiMemory, offset);
-            return translator.voidMarker;
+            b.ref_null(w.HeapType.none);
+            return translator.topType;
           case StaticIntrinsic.storeFloat:
             codeGen.translateExpression(
               node.arguments.positional[2],
@@ -1629,7 +1654,8 @@
             );
             b.f32_demote_f64();
             b.f32_store(translator.ffiMemory, offset);
-            return translator.voidMarker;
+            b.ref_null(w.HeapType.none);
+            return translator.topType;
           case StaticIntrinsic.storeFloatUnaligned:
             codeGen.translateExpression(
               node.arguments.positional[2],
@@ -1637,21 +1663,24 @@
             );
             b.f32_demote_f64();
             b.f32_store(translator.ffiMemory, offset, 0);
-            return translator.voidMarker;
+            b.ref_null(w.HeapType.none);
+            return translator.topType;
           case StaticIntrinsic.storeDouble:
             codeGen.translateExpression(
               node.arguments.positional[2],
               w.NumType.f64,
             );
             b.f64_store(translator.ffiMemory, offset);
-            return translator.voidMarker;
+            b.ref_null(w.HeapType.none);
+            return translator.topType;
           case StaticIntrinsic.storeDoubleUnaligned:
             codeGen.translateExpression(
               node.arguments.positional[2],
               w.NumType.f64,
             );
             b.f64_store(translator.ffiMemory, offset, 0);
-            return translator.voidMarker;
+            b.ref_null(w.HeapType.none);
+            return translator.topType;
           default:
             throw StateError('Unhandled ffi intrinsic: $intrinsic');
         }
@@ -2539,7 +2568,8 @@
         codeGen.translateExpression(length, w.NumType.i64);
         b.i32_wrap_i64();
         b.memory_fill(memory);
-        return codeGen.voidMarker;
+        b.ref_null(w.HeapType.none);
+        return translator.topType;
       case StaticIntrinsic.wasmMemoryLoadFloat32:
       case StaticIntrinsic.wasmMemoryLoadFloat64:
       case StaticIntrinsic.wasmMemoryLoadInt8:
@@ -2626,7 +2656,8 @@
             throw AssertionError('unreachable');
         }
 
-        return codeGen.voidMarker;
+        b.ref_null(w.HeapType.none);
+        return translator.topType;
     }
   }
 
diff --git a/pkg/dart2wasm/lib/io_util.dart b/pkg/dart2wasm/lib/io_util.dart
index e536591..9f47038 100644
--- a/pkg/dart2wasm/lib/io_util.dart
+++ b/pkg/dart2wasm/lib/io_util.dart
@@ -65,11 +65,29 @@
     ).readComponent(component);
   }
 
+  final Set<String> _createdDirectories = {};
+
+  void _createDirIfNecessary(String filePath) {
+    final dirPath = path.dirname(filePath);
+    // Exit early if we've already created/checked this directory. For I/O heavy
+    // compilations (e.g. deferred loading with many modules), this can avoid
+    // a lot of redundant directory checks.
+    if (_createdDirectories.contains(dirPath)) return;
+    final Directory dir = Directory(dirPath);
+    // Do this synchronously to make sure it happens before subsequent async
+    // operations.
+    if (!dir.existsSync()) {
+      dir.createSync(recursive: true);
+    }
+    _createdDirectories.add(dirPath);
+  }
+
   Future<void> writeComponent(
     Component component,
     String path, {
     bool includeSource = true,
   }) {
+    _createDirIfNecessary(path);
     return writeComponentToBinary(
       component,
       path,
@@ -78,37 +96,38 @@
   }
 
   void writeComponentAsText(Component component, String path) {
+    _createDirIfNecessary(path);
     writeComponentToText(component, path: path, showMetadata: true);
   }
 
   Future<void> writeWasmModule(Uint8List wasmModule, String moduleName) {
     final wasmFileName = _moduleNameToWasmFile(options.outputFile, moduleName);
-    final Directory dir = Directory(path.dirname(wasmFileName));
-    // Do this synchronously to make sure it happens before subsequent async
-    // operations.
-    if (!dir.existsSync()) {
-      dir.createSync(recursive: true);
-    }
-
+    _createDirIfNecessary(wasmFileName);
     return File(wasmFileName).writeAsBytes(wasmModule);
   }
 
   Future<void> writeWasmSourceMap(String sourceMap, String moduleName) {
-    return File(
-      _moduleNameToSourceMapFile(options.outputFile, moduleName),
-    ).writeAsString(sourceMap);
+    final sourceMapFileName = _moduleNameToSourceMapFile(
+      options.outputFile,
+      moduleName,
+    );
+    _createDirIfNecessary(sourceMapFileName);
+    return File(sourceMapFileName).writeAsString(sourceMap);
   }
 
   Future<void> writeJsRuntime(String jsRuntime) {
-    return File(
-      path.setExtension(options.outputFile, '.mjs'),
-    ).writeAsString(jsRuntime);
+    final jsRuntimeFileName = path.setExtension(options.outputFile, '.mjs');
+    _createDirIfNecessary(jsRuntimeFileName);
+    return File(jsRuntimeFileName).writeAsString(jsRuntime);
   }
 
   Future<void> writeSupportJs(String supportJs) {
-    return File(
-      path.setExtension(options.outputFile, '.support.js'),
-    ).writeAsString(supportJs);
+    final supportJsFileName = path.setExtension(
+      options.outputFile,
+      '.support.js',
+    );
+    _createDirIfNecessary(supportJsFileName);
+    return File(supportJsFileName).writeAsString(supportJs);
   }
 
   Future<void> runWasmOpt(
diff --git a/pkg/dart2wasm/lib/js/runtime_blob.dart b/pkg/dart2wasm/lib/js/runtime_blob.dart
index 0e2079b..3e6597a 100644
--- a/pkg/dart2wasm/lib/js/runtime_blob.dart
+++ b/pkg/dart2wasm/lib/js/runtime_blob.dart
@@ -4,7 +4,7 @@
 
 final jsRuntimeBlobTemplate = Template(r'''
 // Compiles a dart2wasm-generated main module from `source` which can then
-// instantiatable via the `instantiate` method.
+// be instantiated via the `instantiate` method.
 //
 // `source` needs to be a `Response` object (or promise thereof) e.g. created
 // via the `fetch()` JS API.
@@ -14,8 +14,8 @@
       await WebAssembly.compileStreaming(source, builtins), builtins);
 }
 
-// Compiles a dart2wasm-generated wasm modules from `bytes` which is then
-// instantiatable via the `instantiate` method.
+// Compiles a dart2wasm-generated wasm module from `bytes` which is then
+// instantiable via the `instantiate` method.
 export async function compile(bytes) {
   const builtins = {<<BUILTINS_MAP_BODY>>};
   return new CompiledApp(await WebAssembly.compile(bytes, builtins), builtins);
@@ -49,7 +49,7 @@
   // The second argument is an options object containing:
   // `loadDeferredModules` is a JS function that takes an array of module names
   //   matching wasm files produced by the dart2wasm compiler. It also takes a
-  //   callback that should be invoked for each loaded module with 2 arugments:
+  //   callback that should be invoked for each loaded module with 2 arguments:
   //   (1) the module name, (2) the loaded module in a format supported by
   //   `WebAssembly.compile` or `WebAssembly.compileStreaming`. The callback
   //   returns a Promise that resolves when the module is instantiated.
@@ -59,11 +59,11 @@
   //   compiler when the `use-load-ids` option is passed. Each load ID maps to
   //   one or more wasm files as specified in the emitted JSON file. It also
   //   takes a callback that should be invoked for each loaded module with 2
-  //   arugments: (1) the module name, (2) the loaded module in a format
+  //   arguments: (1) the module name, (2) the loaded module in a format
   //   supported by `WebAssembly.compile` or `WebAssembly.compileStreaming`.
   //   The callback returns a Promise that resolves when the module is
   //   instantiated.
-  //   loadDeferredModules should return a Promise that resolves when all the
+  //   loadDeferredId should return a Promise that resolves when all the
   //   modules have been loaded and the callback promises have resolved.
   async instantiate(additionalImports, {loadDeferredModules, loadDeferredId} = {}) {
     let dartInstance;
diff --git a/pkg/dart2wasm/lib/record_class_generator.dart b/pkg/dart2wasm/lib/record_class_generator.dart
index d740093..52f331f 100644
--- a/pkg/dart2wasm/lib/record_class_generator.dart
+++ b/pkg/dart2wasm/lib/record_class_generator.dart
@@ -4,6 +4,7 @@
 
 import 'package:kernel/ast.dart';
 import 'package:kernel/core_types.dart';
+import 'package:kernel/names.dart';
 
 import 'records.dart';
 import 'util.dart';
@@ -177,7 +178,7 @@
               .extensions
               .singleWhere((e) => e.name == 'WasmArrayExt')
               .memberDescriptors
-              .singleWhere((member) => member.name.text == '[]')
+              .singleWhere((member) => member.name == indexGetName)
               .memberReference!
               .node
           as Procedure;
diff --git a/pkg/dart2wasm/lib/state_machine.dart b/pkg/dart2wasm/lib/state_machine.dart
index bcf4c9a..36eb636 100644
--- a/pkg/dart2wasm/lib/state_machine.dart
+++ b/pkg/dart2wasm/lib/state_machine.dart
@@ -620,12 +620,13 @@
 }
 
 abstract class StateMachineEntryAstCodeGenerator extends AstCodeGenerator {
-  final w.FunctionBuilder function;
+  final String functionName;
   StateMachineEntryAstCodeGenerator(
     Translator translator,
     Member enclosingMember,
-    this.function,
-  ) : super(translator, function.type, enclosingMember);
+    w.FunctionType signature,
+    this.functionName,
+  ) : super(translator, signature, enclosingMember);
 
   /// Generate the outer function.
   ///
@@ -644,13 +645,14 @@
 
 abstract class ProcedureStateMachineEntryCodeGenerator
     extends StateMachineEntryAstCodeGenerator {
-  final Procedure member;
+  Procedure get member => enclosingMember as Procedure;
 
   ProcedureStateMachineEntryCodeGenerator(
-    Translator translator,
-    w.FunctionBuilder function,
-    this.member,
-  ) : super(translator, member, function);
+    super.translator,
+    super.member,
+    super.signature,
+    super.functionName,
+  );
 
   @override
   void generateInternal() {
@@ -676,13 +678,14 @@
     extends StateMachineEntryAstCodeGenerator {
   final Lambda lambda;
 
-  LambdaStateMachineEntryCodeGenerator(
-    Translator translator,
-    Member enclosingMember,
-    this.lambda,
-    Closures closures,
-  ) : super(translator, enclosingMember, lambda.function) {
-    this.closures = closures;
+  LambdaStateMachineEntryCodeGenerator(Translator translator, this.lambda)
+    : super(
+        translator,
+        lambda.enclosingMember,
+        lambda.callTarget.signature,
+        lambda.callTarget.name,
+      ) {
+    closures = lambda.enclosingMemberClosures;
   }
 
   @override
diff --git a/pkg/dart2wasm/lib/sync_star.dart b/pkg/dart2wasm/lib/sync_star.dart
index 97066c2..c2fc0ae 100644
--- a/pkg/dart2wasm/lib/sync_star.dart
+++ b/pkg/dart2wasm/lib/sync_star.dart
@@ -75,7 +75,7 @@
             w.NumType.i32,
           ],
         ),
-        "${function.functionName} inner",
+        "$functionName inner",
       );
 }
 
@@ -85,7 +85,8 @@
     with SyncStarCodeGeneratorMixin {
   SyncStarProcedureCodeGenerator(
     super.translator,
-    super.function,
+    super.signature,
+    super.functionName,
     super.enclosingMember,
   );
 }
@@ -93,12 +94,7 @@
 /// Generates code for sync* closures.
 class SyncStarLambdaCodeGenerator extends LambdaStateMachineEntryCodeGenerator
     with SyncStarCodeGeneratorMixin {
-  SyncStarLambdaCodeGenerator(
-    super.translator,
-    super.enclosingMember,
-    super.lambda,
-    super.closures,
-  );
+  SyncStarLambdaCodeGenerator(super.translator, super.lambda);
 }
 
 /// A specialized code generator for generating code for `sync*` functions.
@@ -129,9 +125,6 @@
   late final ClassInfo suspendStateInfo =
       translator.classInfo[translator.suspendStateClass]!;
 
-  late final ClassInfo syncStarIterableInfo =
-      translator.classInfo[translator.syncStarIterableClass]!;
-
   late final ClassInfo syncStarIteratorInfo =
       translator.classInfo[translator.syncStarIteratorClass]!;
 
diff --git a/pkg/dart2wasm/lib/transformers.dart b/pkg/dart2wasm/lib/transformers.dart
index df0018a..49e6082 100644
--- a/pkg/dart2wasm/lib/transformers.dart
+++ b/pkg/dart2wasm/lib/transformers.dart
@@ -46,7 +46,9 @@
   final Class _wasmBaseClass;
 
   final Procedure _completerComplete;
+  final Procedure _completerCompleteError;
   final Procedure _completerConstructor;
+  final Procedure _completerSyncConstructor;
   final Procedure _completerGetFuture;
   final Procedure _streamControllerAdd;
   final Procedure _streamControllerAddError;
@@ -56,9 +58,7 @@
   final Procedure _streamControllerGetHasListener;
   final Procedure _streamControllerGetIsPaused;
   final Procedure _streamControllerGetStream;
-  final Procedure _streamControllerSetOnCancel;
   final Procedure _streamControllerSetOnListen;
-  final Procedure _streamControllerSetOnResume;
 
   final Procedure _trySetStackTraceForwarder;
   final Procedure _trySetStackTrace;
@@ -150,11 +150,21 @@
         'Completer',
         'complete',
       ),
+      _completerCompleteError = coreTypes.index.getProcedure(
+        'dart:async',
+        'Completer',
+        'completeError',
+      ),
       _completerConstructor = coreTypes.index.getProcedure(
         'dart:async',
         'Completer',
         '',
       ),
+      _completerSyncConstructor = coreTypes.index.getProcedure(
+        'dart:async',
+        'Completer',
+        'sync',
+      ),
       _completerGetFuture = coreTypes.index.getProcedure(
         'dart:async',
         'Completer',
@@ -200,21 +210,11 @@
         'StreamController',
         'get:stream',
       ),
-      _streamControllerSetOnCancel = coreTypes.index.getProcedure(
-        'dart:async',
-        'StreamController',
-        'set:onCancel',
-      ),
       _streamControllerSetOnListen = coreTypes.index.getProcedure(
         'dart:async',
         'StreamController',
         'set:onListen',
       ),
-      _streamControllerSetOnResume = coreTypes.index.getProcedure(
-        'dart:async',
-        'StreamController',
-        'set:onResume',
-      ),
       _trySetStackTraceForwarder = coreTypes.index.getTopLevelProcedure(
         'dart:async',
         '_trySetStackTrace',
@@ -523,22 +523,43 @@
     // Convert the function into:
     //
     //    Stream<T> name(args) {
-    //      var #controller = StreamController<T>(sync: true);
-    //
-    //      void #body() async {
-    //        Completer<void>? #paused;
-    //
-    //        #controller.onResume = #controller.onCancel = () {
+    //      var #paused;
+    //      var #cancelCompleter;
+    //      var #isDone = false;
+    //      var #onCancelCallback = () {
+    //        if (#isDone) return null;
+    //        if (#paused != null) {
     //          #paused?.complete(null);
     //          #paused = null;
-    //        };
+    //        }
+    //        #cancelCompleter ??= Completer.sync<void>();
+    //        return #cancelCompleter.future;
+    //      };
+    //      var #onResumeCallback = () {
+    //        if (#paused != null) {
+    //          #paused?.complete(null);
+    //          #paused = null;
+    //        }
+    //      }
+    //      var #controller = StreamController<T>(sync: true, onCancel: #onCancelCallback, onResume: #onResumeCallback);
     //
+    //      void #body() async {
     //        try {
     //          <transformed body>
     //        } catch (e, s) {
-    //          #controller.addError(e, s);
+    //          if (#cancelCompleter != null) {
+    //            #cancelCompleter?.completeError(e, s);
+    //            #cancelCompleter = null;
+    //          } else {
+    //            #controller.addError(e, s);
+    //          }
     //        } finally {
+    //          #isDone = true;
     //          #controller.close();
+    //          if (#cancelCompleter != null) {
+    //            #cancelCompleter?.complete(null);
+    //            #cancelCompleter = null;
+    //          }
     //        }
     //      }
     //
@@ -585,26 +606,6 @@
       [emittedValueType],
     );
 
-    // StreamController<T>(sync: true)
-    final controllerInitializer = StaticInvocation(
-      _streamControllerConstructor,
-      Arguments(
-        [],
-        types: [emittedValueType],
-        named: [
-          NamedExpression('sync', ConstantExpression(BoolConstant(true))),
-        ],
-      ),
-    );
-
-    // var #controller = ...
-    final controllerVar = VariableDeclaration(
-      '#controller',
-      initializer: controllerInitializer..fileOffset = fileOffset,
-      type: controllerObjectType,
-      isSynthesized: true,
-    )..fileOffset = fileOffset;
-
     // `void #body() async { ... }` statements.
     final List<Statement> bodyStatements = [];
 
@@ -620,46 +621,85 @@
       isSynthesized: true,
     );
 
-    bodyStatements.add(pausedVar);
+    final cancelCompleterVar = VariableDeclaration(
+      '#cancelCompleter',
+      initializer: null,
+      type: InterfaceType(_completerClass, Nullability.nullable, [
+        const VoidType(),
+      ]),
+      isSynthesized: true,
+    );
 
-    // controller.onResume = controller.onCancel = () {
-    //   #paused?.complete(null);
-    //   #paused = null;
-    // };
+    final isDoneVar = VariableDeclaration(
+      '#isDone',
+      type: InterfaceType(coreTypes.boolClass, Nullability.nonNullable),
+      initializer: ConstantExpression(BoolConstant(false)),
+      isSynthesized: true,
+    );
+
+    IfStatement makePauseCheck() => IfStatement(
+      EqualsNull(VariableGet(pausedVar)),
+      Block([]),
+      Block([
+        ExpressionStatement(
+          InstanceInvocation(
+            InstanceAccessKind.Instance,
+            VariableGet(pausedVar),
+            Name('complete'),
+            Arguments([ConstantExpression(NullConstant())]),
+            interfaceTarget: _completerComplete,
+            functionType:
+                substitute(_completerComplete.getterType, {
+                      _completerClass.typeParameters.first: const VoidType(),
+                    })
+                    as FunctionType,
+          ),
+        ),
+        ExpressionStatement(
+          VariableSet(pausedVar, ConstantExpression(NullConstant())),
+        ),
+      ]),
+    );
+
     final List<Statement> onCancelCallbackBodyStatements = [
       IfStatement(
-        EqualsNull(VariableGet(pausedVar)),
-        Block([]),
-        Block([
-          ExpressionStatement(
-            InstanceInvocation(
-              InstanceAccessKind.Instance,
-              VariableGet(pausedVar),
-              Name('complete'),
-              Arguments([ConstantExpression(NullConstant())]),
-              interfaceTarget: _completerComplete,
-              functionType:
-                  substitute(_completerComplete.getterType, {
-                        _completerClass.typeParameters.first: const VoidType(),
-                      })
-                      as FunctionType,
+        VariableGet(isDoneVar),
+        ReturnStatement(ConstantExpression(NullConstant())),
+        null,
+      ),
+      makePauseCheck(),
+      IfStatement(
+        EqualsNull(VariableGet(cancelCompleterVar)),
+        ExpressionStatement(
+          VariableSet(
+            cancelCompleterVar,
+            StaticInvocation(
+              _completerSyncConstructor,
+              Arguments([], types: [const VoidType()]),
             ),
           ),
-          ExpressionStatement(
-            VariableSet(pausedVar, ConstantExpression(NullConstant())),
+        ),
+        null,
+      ),
+      ReturnStatement(
+        InstanceGet(
+          InstanceAccessKind.Instance,
+          VariableGet(cancelCompleterVar),
+          Name('future'),
+          interfaceTarget: _completerGetFuture,
+          resultType: InterfaceType(
+            coreTypes.futureClass,
+            Nullability.nonNullable,
+            [const VoidType()],
           ),
-        ]),
+        ),
       ),
     ];
 
     final onCancelCallback = FunctionExpression(
       FunctionNode(
         Block(onCancelCallbackBodyStatements),
-        typeParameters: [],
-        positionalParameters: [],
-        namedParameters: [],
-        requiredParameterCount: 0,
-        returnType: const VoidType(),
+        returnType: FutureOrType(const VoidType(), Nullability.nonNullable),
       ),
     );
 
@@ -668,31 +708,36 @@
       initializer: onCancelCallback,
     );
 
-    bodyStatements.add(onCancelCallbackVar);
+    final onResumeCallback = FunctionExpression(
+      FunctionNode(makePauseCheck(), returnType: const VoidType()),
+    );
 
-    bodyStatements.add(
-      ExpressionStatement(
-        InstanceSet(
-          InstanceAccessKind.Instance,
-          VariableGet(controllerVar),
-          Name('onResume'),
-          VariableGet(onCancelCallbackVar),
-          interfaceTarget: _streamControllerSetOnResume,
-        ),
+    final onResumeCallbackVar = VariableDeclaration(
+      "#onResumeCallback",
+      initializer: onResumeCallback,
+    );
+
+    // StreamController<T>(sync: true)
+    final controllerInitializer = StaticInvocation(
+      _streamControllerConstructor,
+      Arguments(
+        [],
+        types: [emittedValueType],
+        named: [
+          NamedExpression('sync', ConstantExpression(BoolConstant(true))),
+          NamedExpression('onCancel', VariableGet(onCancelCallbackVar)),
+          NamedExpression('onResume', VariableGet(onResumeCallbackVar)),
+        ],
       ),
     );
 
-    bodyStatements.add(
-      ExpressionStatement(
-        InstanceSet(
-          InstanceAccessKind.Instance,
-          VariableGet(controllerVar),
-          Name('onCancel'),
-          VariableGet(onCancelCallbackVar),
-          interfaceTarget: _streamControllerSetOnCancel,
-        ),
-      ),
-    );
+    // var #controller = ...
+    final controllerVar = VariableDeclaration(
+      '#controller',
+      initializer: controllerInitializer..fileOffset = fileOffset,
+      type: controllerObjectType,
+      isSynthesized: true,
+    )..fileOffset = fileOffset;
 
     _asyncStarFrames.add(
       _AsyncStarFrame(controllerVar, pausedVar, emittedValueType),
@@ -714,28 +759,73 @@
     final catch_ = Catch(
       exceptionVar,
       stackTrace: stackTraceVar,
+      IfStatement(
+        EqualsNull(VariableGet(cancelCompleterVar)),
+        ExpressionStatement(
+          InstanceInvocation(
+            InstanceAccessKind.Instance,
+            VariableGet(controllerVar),
+            Name("addError"),
+            Arguments([VariableGet(exceptionVar), VariableGet(stackTraceVar)]),
+            interfaceTarget: _streamControllerAddError,
+            functionType: _streamControllerAddError.getterType as FunctionType,
+          ),
+        ),
+        Block([
+          ExpressionStatement(
+            InstanceInvocation(
+              InstanceAccessKind.Instance,
+              VariableGet(cancelCompleterVar),
+              Name("completeError"),
+              Arguments([
+                VariableGet(exceptionVar),
+                VariableGet(stackTraceVar),
+              ]),
+              interfaceTarget: _completerCompleteError,
+              functionType: _completerCompleteError.getterType as FunctionType,
+            ),
+          ),
+          ExpressionStatement(
+            VariableSet(cancelCompleterVar, ConstantExpression(NullConstant())),
+          ),
+        ]),
+      ),
+    );
+
+    final finalizer = Block([
+      ExpressionStatement(
+        VariableSet(isDoneVar, ConstantExpression(BoolConstant(true))),
+      ),
       ExpressionStatement(
         InstanceInvocation(
           InstanceAccessKind.Instance,
           VariableGet(controllerVar),
-          Name("addError"),
-          Arguments([VariableGet(exceptionVar), VariableGet(stackTraceVar)]),
-          interfaceTarget: _streamControllerAddError,
-          functionType: _streamControllerAddError.getterType as FunctionType,
+          Name("close"),
+          Arguments([]),
+          interfaceTarget: _streamControllerClose,
+          functionType: _streamControllerClose.getterType as FunctionType,
         ),
       ),
-    );
-
-    final finalizer = ExpressionStatement(
-      InstanceInvocation(
-        InstanceAccessKind.Instance,
-        VariableGet(controllerVar),
-        Name("close"),
-        Arguments([]),
-        interfaceTarget: _streamControllerClose,
-        functionType: _streamControllerClose.getterType as FunctionType,
+      // Only complete the cancel completer if there was no error.
+      IfStatement(
+        Not(EqualsNull(VariableGet(cancelCompleterVar))),
+        ExpressionStatement(
+          InstanceInvocation(
+            InstanceAccessKind.Instance,
+            VariableGet(cancelCompleterVar),
+            Name('complete'),
+            Arguments([ConstantExpression(NullConstant())]),
+            interfaceTarget: _completerComplete,
+            functionType:
+                substitute(_completerComplete.getterType, {
+                      _completerClass.typeParameters.first: const VoidType(),
+                    })
+                    as FunctionType,
+          ),
+        ),
+        null,
       ),
-    );
+    ]);
 
     bodyStatements.add(
       TryFinally(TryCatch(transformedBody, [catch_]), finalizer),
@@ -793,7 +883,13 @@
 
     return FunctionNode(
       Block([
-        // var controller = StreamController<T>(sync: true);
+        pausedVar,
+        cancelCompleterVar,
+        isDoneVar,
+        onCancelCallbackVar,
+        onResumeCallbackVar,
+
+        // var controller = StreamController<T>(sync: true, onCancel: onCancelCallback, onResume: onResumeCallback);
         controllerVar,
 
         // var #body = ...;
diff --git a/pkg/dart2wasm/lib/translator.dart b/pkg/dart2wasm/lib/translator.dart
index 7a2271e4..fde0fb17 100644
--- a/pkg/dart2wasm/lib/translator.dart
+++ b/pkg/dart2wasm/lib/translator.dart
@@ -9,6 +9,7 @@
     show ClassHierarchy, ClassHierarchySubtypes, ClosedWorldClassHierarchy;
 import 'package:kernel/core_types.dart';
 import 'package:kernel/library_index.dart';
+import 'package:kernel/names.dart';
 import 'package:kernel/src/printer.dart';
 import 'package:kernel/type_environment.dart';
 import 'package:vm/metadata/direct_call.dart';
@@ -44,6 +45,7 @@
 
 /// Options controlling the translation.
 class TranslatorOptions {
+  bool? enableUniqueTypes;
   bool enableAsserts = false;
   bool importSharedMemory = false;
   bool uniqueConstantNames = true;
@@ -79,6 +81,7 @@
       omitImplicitTypeChecksOverride ?? optimizationLevel >= 3;
   bool get omitBoundsChecks =>
       omitBoundsChecksOverride ?? optimizationLevel >= 4;
+  bool get uniqueTypes => enableUniqueTypes ?? optimizationLevel >= 2;
 }
 
 /// The main entry point for the translation from kernel to Wasm and the hub for
@@ -755,8 +758,13 @@
   List<w.ValueType> callReference(
     Reference reference,
     w.InstructionsBuilder b,
-  ) {
-    final callTarget = directCallTarget(reference);
+  ) => callTarget(directCallTarget(reference), b, reference);
+
+  List<w.ValueType> callTarget(
+    CallTarget callTarget,
+    w.InstructionsBuilder b, [
+    Reference? reference,
+  ]) {
     late final List<w.ValueType> outputs;
     if (callTarget.supportsInlining) {
       final decision = callTarget.shouldInline;
@@ -775,6 +783,11 @@
       b.ref_null(w.HeapType.none);
       return [w.RefType(w.HeapType.none, nullable: true)];
     }
+    if (callTarget.synthesizeNoReturn) {
+      assert(outputs.isEmpty);
+      b.unreachable();
+      return const [];
+    }
     return outputs;
   }
 
@@ -1215,10 +1228,9 @@
         member.reference,
         uncheckedEntry: false,
       );
-      w.BaseFunction target = functions.getFunction(reference);
       return getClosure(
         member.function,
-        target,
+        directCallTarget(reference),
         closureModule,
         paramInfoForDirectCall(reference),
         "$member tear-off",
@@ -1260,7 +1272,7 @@
 
   ClosureImplementation getClosure(
     FunctionNode functionNode,
-    w.BaseFunction target,
+    CallTarget target,
     w.ModuleBuilder closureModule,
     ParameterInfo paramInfo,
     String name,
@@ -1294,7 +1306,7 @@
     assert(positionalCount <= paramInfo.positional.length);
     assert(names.length <= paramInfo.named.length);
     assert(
-      target.type.inputs.length ==
+      target.signature.inputs.length ==
           (paramInfo.takesContextOrReceiver ? 1 : 0) +
               paramInfo.typeParamCount +
               paramInfo.positional.length +
@@ -1501,11 +1513,8 @@
       }
       if (to != voidMarker) {
         // This can happen e.g. when a `return;` is guaranteed to be never taken
-        // but TFA didn't remove the dead code. In that case we synthesize a
-        // dummy value.
-        getDummyValuesCollectorForModule(
-          b.moduleBuilder,
-        ).instantiateLocalDummyValue(b, to);
+        // but TFA didn't remove the dead code.
+        b.unreachable();
         return;
       }
     }
@@ -1778,16 +1787,24 @@
       final table = dispatchTable;
       final selector = table.selectorForTarget(target);
       if (selector.containsTarget(target)) {
-        assert(
-          !selector.synthesizeNullReturnValue ||
-              selector.signature.outputs.isEmpty,
-        );
         return selector.synthesizeNullReturnValue;
       }
     }
     return functions.synthesizeNullReturnValue(target);
   }
 
+  bool synthesizeNoReturn(Reference target) {
+    final member = target.asMember;
+    if (member.isInstanceMember) {
+      final table = dispatchTable;
+      final selector = table.selectorForTarget(target);
+      if (selector.containsTarget(target)) {
+        return selector.synthesizeNoReturn;
+      }
+    }
+    return functions.synthesizeNoReturn(target);
+  }
+
   ParameterInfo paramInfoForDirectCall(Reference target) {
     if (target.asMember.isInstanceMember) {
       final selector = dispatchTable.selectorForTarget(target);
@@ -1895,42 +1912,34 @@
       );
 
       return SingleClosureTarget._(
-        member,
+        directCallTarget(entryReference),
         paramInfoForDirectCall(entryReference),
-        signatureForDirectCall(entryReference),
-        null,
-      );
-    } else {
-      // A closure in the member is called.
-      final Closures enclosingMemberClosures = getClosures(
-        member,
-        findCaptures: true,
-      );
-      final Lambda lambda = enclosingMemberClosures.lambdas.values.firstWhere(
-        (lambda) => lambda.index == closureId - 1,
-      );
-      final FunctionType lambdaDartType = lambda.functionNode
-          .computeFunctionType(Nullability.nonNullable);
-      final w.BaseFunction lambdaFunction = functions.getLambdaFunction(
-        lambda,
-        member,
-        enclosingMemberClosures,
-      );
-
-      if (!typeEnvironment.isSubtypeOf(
-        lambdaDartType,
-        node.receiver.getStaticType(typeContext),
-      )) {
-        return null;
-      }
-
-      return SingleClosureTarget._(
-        member,
-        ParameterInfo.fromLocalFunction(lambda.functionNode),
-        lambdaFunction.type,
-        lambdaFunction,
       );
     }
+
+    // A closure in the member is called.
+    final Closures enclosingMemberClosures = getClosures(
+      member,
+      findCaptures: true,
+    );
+    final Lambda lambda = enclosingMemberClosures.lambdas.values.firstWhere(
+      (lambda) => lambda.index == closureId - 1,
+    );
+    final FunctionType lambdaDartType = lambda.functionNode.computeFunctionType(
+      Nullability.nonNullable,
+    );
+
+    if (!typeEnvironment.isSubtypeOf(
+      lambdaDartType,
+      node.receiver.getStaticType(typeContext),
+    )) {
+      return null;
+    }
+
+    return SingleClosureTarget._(
+      lambda.callTarget,
+      ParameterInfo.fromLocalFunction(lambda.functionNode),
+    );
   }
 
   bool canSkipImplicitCheck(VariableDeclaration node) {
@@ -1958,7 +1967,7 @@
       // If [node] is a parameter of a `operator==` method, then the argument to
       // it cannot be nullable.
       final member = node.parent!.parent;
-      if (member is Procedure && member.name.text == '==') {
+      if (member is Procedure && member.name == equalsName) {
         return coreTypes.objectNonNullableRawType;
       }
       // The type argument of a static type is not required to conform
@@ -2506,7 +2515,10 @@
     instantiateHeapType,
   ) {
     if (type == w.HeapType.struct) {
-      final structType = typesBuilder.defineStruct(name);
+      final structType = typesBuilder.defineStruct(
+        name,
+        brand: options.uniqueTypes,
+      );
       b.struct_new(structType);
       return;
     } else if (type is w.DefType) {
@@ -2640,7 +2652,7 @@
 class _ClosureTrampolineGenerator implements CodeGenerator {
   final Translator translator;
   final w.FunctionBuilder trampoline;
-  final w.BaseFunction target;
+  final CallTarget target;
   final int typeCount;
   final int posArgCount;
   final List<String> argNames;
@@ -2671,7 +2683,7 @@
       translator.convertType(
         b,
         receiver.type,
-        target.type.inputs[targetIndex++],
+        target.signature.inputs[targetIndex++],
       );
     }
     int argIndex = 1;
@@ -2683,12 +2695,16 @@
       if (i < posArgCount) {
         w.Local arg = trampoline.locals[argIndex++];
         b.local_get(arg);
-        translator.convertType(b, arg.type, target.type.inputs[targetIndex++]);
+        translator.convertType(
+          b,
+          arg.type,
+          target.signature.inputs[targetIndex++],
+        );
       } else {
         translator.constants.instantiateConstant(
           b,
           paramInfo.positional[i]!,
-          target.type.inputs[targetIndex++],
+          target.signature.inputs[targetIndex++],
         );
       }
     }
@@ -2698,27 +2714,32 @@
       if (argNameIndex < argNames.length && argNames[argNameIndex] == argName) {
         w.Local arg = trampoline.locals[argIndex++];
         b.local_get(arg);
-        translator.convertType(b, arg.type, target.type.inputs[targetIndex++]);
+        translator.convertType(
+          b,
+          arg.type,
+          target.signature.inputs[targetIndex++],
+        );
         argNameIndex++;
       } else {
         translator.constants.instantiateConstant(
           b,
           paramInfo.named[argName]!,
-          target.type.inputs[targetIndex++],
+          target.signature.inputs[targetIndex++],
         );
       }
     }
     assert(argIndex == trampoline.type.inputs.length);
-    assert(targetIndex == target.type.inputs.length);
+    assert(targetIndex == target.signature.inputs.length);
     assert(argNameIndex == argNames.length);
 
-    translator.callFunction(target, b);
-
-    translator.convertType(
-      b,
-      translator.outputOrVoid(target.type.outputs),
-      translator.outputOrVoid(trampoline.type.outputs),
-    );
+    final outputs = translator.callTarget(target, b);
+    if (outputs.isNotEmpty) {
+      translator.convertType(
+        b,
+        outputs.single,
+        translator.outputOrVoid(trampoline.type.outputs),
+      );
+    }
     b.end();
   }
 }
@@ -2728,7 +2749,7 @@
 class _ClosureDynamicEntryGenerator implements CodeGenerator {
   final Translator translator;
   final FunctionNode functionNode;
-  final w.BaseFunction target;
+  final CallTarget target;
   final ParameterInfo paramInfo;
   final String name;
   final w.FunctionBuilder function;
@@ -2768,7 +2789,7 @@
     // of type arguments in the list, but optional positional and named
     // parameters may be missing.
 
-    final targetInputs = target.type.inputs;
+    final targetInputs = target.signature.inputs;
     int inputIdx = 0;
 
     // Push context or receiver
@@ -2871,7 +2892,7 @@
         translator.convertType(
           b,
           translator.nullableObjectArrayType.elementType.type.unpacked,
-          target.type.inputs[inputIdx],
+          target.signature.inputs[inputIdx],
         );
       } else {
         // Parameter may not be passed.
@@ -2905,13 +2926,14 @@
       inputIdx += 1;
     }
 
-    translator.callFunction(target, b);
-
-    translator.convertType(
-      b,
-      translator.outputOrVoid(target.type.outputs),
-      translator.outputOrVoid(function.type.outputs),
-    );
+    final outputs = translator.callTarget(target, b);
+    if (outputs.isNotEmpty) {
+      translator.convertType(
+        b,
+        outputs.single,
+        translator.outputOrVoid(function.type.outputs),
+      );
+    }
 
     b.end(); // end function
   }
@@ -3920,26 +3942,11 @@
 }
 
 class SingleClosureTarget {
-  /// When `lambdaFunction` is null, the member being directly called. Otherwise
-  /// the enclosing member of the closure being called.
-  final Member member;
+  final CallTarget callTarget;
 
   /// [ParameterInfo] specifying how to compile arguments to the closure or
   /// member.
   final ParameterInfo paramInfo;
 
-  /// Wasm function type that goes along with the [paramInfo] for compiling
-  /// arguments.
-  final w.FunctionType signature;
-
-  /// If the callee is a local function or function expression (intead of a
-  /// member), this Wasm function for it.
-  final w.BaseFunction? lambdaFunction;
-
-  SingleClosureTarget._(
-    this.member,
-    this.paramInfo,
-    this.signature,
-    this.lambdaFunction,
-  );
+  SingleClosureTarget._(this.callTarget, this.paramInfo);
 }
diff --git a/pkg/dart2wasm/test/ir_test.dart b/pkg/dart2wasm/test/ir_test.dart
index e242e93..6a9d51a 100644
--- a/pkg/dart2wasm/test/ir_test.dart
+++ b/pkg/dart2wasm/test/ir_test.dart
@@ -66,6 +66,7 @@
       final result = await Process.run('/usr/bin/env', [
         'bash',
         'pkg/dart2wasm/tool/compile_benchmark',
+        '--extra-compiler-option=--unique-types',
         for (final option in compilerOptions)
           if (option == '--standalone')
             '--standalone'
diff --git a/pkg/dart2wasm/test/ir_tests/always_throws.dart b/pkg/dart2wasm/test/ir_tests/always_throws.dart
new file mode 100644
index 0000000..6cd207e
--- /dev/null
+++ b/pkg/dart2wasm/test/ir_tests/always_throws.dart
@@ -0,0 +1,22 @@
+// Copyright (c) 2026, 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.
+
+// functionFilter=foo
+// typeFilter=NoMatch
+// globalFilter=NoMatch
+// compilerOption=-O0
+
+void main() {
+  foo();
+}
+
+void foo() {
+  print('foo');
+  print(fooAlwaysThrows());
+}
+
+Never fooAlwaysThrows() {
+  print('fooAlwaysThrows');
+  throw Object();
+}
diff --git a/pkg/dart2wasm/test/ir_tests/always_throws.wat b/pkg/dart2wasm/test/ir_tests/always_throws.wat
new file mode 100644
index 0000000..af8ea7e
--- /dev/null
+++ b/pkg/dart2wasm/test/ir_tests/always_throws.wat
@@ -0,0 +1,27 @@
+(module $module0
+  (type $#Top <...>)
+  (type $JSExternWrapper <...>)
+  (type $Object <...>)
+  (global $"\"fooAlwaysThrows\"" (ref $JSExternWrapper) <...>)
+  (global $"\"foo\"" (ref $JSExternWrapper) <...>)
+  (func $Error._throwWithCurrentStackTrace <noInline> (param $object (ref $#Top)) <...>)
+  (func $Object (result (ref $Object)) <...>)
+  (func $foo (result (ref null $#Top))
+    global.get $"\"foo\""
+    call $print
+    ref.null none
+    drop
+    call $fooAlwaysThrows
+    unreachable
+  )
+  (func $fooAlwaysThrows
+    global.get $"\"fooAlwaysThrows\""
+    call $print
+    ref.null none
+    drop
+    call $Object
+    call $"Error._throwWithCurrentStackTrace <noInline>"
+    unreachable
+  )
+  (func $print (param $object (ref null $#Top)) <...>)
+)
\ No newline at end of file
diff --git a/pkg/dart2wasm/test/ir_tests/deferred.fine_grained_module3.wat b/pkg/dart2wasm/test/ir_tests/deferred.fine_grained_module3.wat
index d6da359..bbcdb7f 100644
--- a/pkg/dart2wasm/test/ir_tests/deferred.fine_grained_module3.wat
+++ b/pkg/dart2wasm/test/ir_tests/deferred.fine_grained_module3.wat
@@ -211,6 +211,7 @@
       global.get $"\"[]\""
       i32.const 21
       call_indirect $module0.cross-module-funcs-0 (param i64 i64 (ref null $JSExternWrapper))
+      unreachable
     end
     local.get $var1
     struct.get $WasmListBase $_data
diff --git a/pkg/dart2wasm/test/ir_tests/deferred.type_checks_module1.wat b/pkg/dart2wasm/test/ir_tests/deferred.type_checks_module1.wat
index 350fc25..30d270a 100644
--- a/pkg/dart2wasm/test/ir_tests/deferred.type_checks_module1.wat
+++ b/pkg/dart2wasm/test/ir_tests/deferred.type_checks_module1.wat
@@ -8,7 +8,6 @@
   (type $_InterfaceType <...>)
   (type $_Type <...>)
   (global $"\")\"_11" (import "$" "2") (ref $JSExternWrapper))
-  (global $"\"Attempt to execute code remove<...>\"" (import "$" "(") (ref $JSExternWrapper))
   (global $_InterfaceType (import "$" "0") (ref $_InterfaceType))
   (table $$.% (import "$" "%") 742 funcref)
   (table $$.' (import "$" "'") 20 funcref)
@@ -158,9 +157,6 @@
     if
       i32.const 2
       call_indirect $$.' 
-      global.get $"\"Attempt to execute code remove<...>\""
-      i32.const 3
-      call_indirect $$.' (param (ref $#Top))
       unreachable
     end
     local.get $var0
diff --git a/pkg/dart2wasm/test/ir_tests/dispatch_table_reuse_module1.wat b/pkg/dart2wasm/test/ir_tests/dispatch_table_reuse_module1.wat
index aa1accc..1366de9 100644
--- a/pkg/dart2wasm/test/ir_tests/dispatch_table_reuse_module1.wat
+++ b/pkg/dart2wasm/test/ir_tests/dispatch_table_reuse_module1.wat
@@ -77,6 +77,7 @@
           local.get $var3
           i32.const 5
           call_indirect $module0.cross-module-funcs-0 (param (ref null $#Top) (ref $_Type))
+          unreachable
         end
         local.get $var1
         ref.cast $Object
diff --git a/pkg/dart2wasm/test/ir_tests/dyn_closure.wat b/pkg/dart2wasm/test/ir_tests/dyn_closure.wat
index a7176c5..b7b401e 100644
--- a/pkg/dart2wasm/test/ir_tests/dyn_closure.wat
+++ b/pkg/dart2wasm/test/ir_tests/dyn_closure.wat
@@ -25,7 +25,7 @@
     (i32.const 0)
     (global.get $global0)
     (ref.func $"bar tear-off trampoline")
-    (ref.func $"bar tear-off trampoline_118")
+    (ref.func $"bar tear-off trampoline_116")
     (struct.new $#Vtable-0-2)
     (i32.const 11)
     (i32.const 0)
@@ -50,7 +50,7 @@
     (i32.const 0)
     (global.get $global0)
     (ref.func $"foo tear-off trampoline")
-    (ref.func $"foo tear-off trampoline_115")
+    (ref.func $"foo tear-off trampoline_114")
     (struct.new $#Vtable-0-2)
     (i32.const 11)
     (i32.const 0)
@@ -74,7 +74,7 @@
   (global $_TopType_290 (ref $_TopType) <...>)
   (global $global0 (ref $"dummy struct") <...>)
   (func $bar tear-off trampoline (param $var0 (ref struct)) (param $var1 (ref null $#Top)) (result (ref null $#Top)) <...>)
-  (func $bar tear-off trampoline_118 (param $var0 (ref struct)) (param $var1 (ref null $#Top)) (param $var2 (ref null $#Top)) (result (ref null $#Top)) <...>)
+  (func $bar tear-off trampoline_116 (param $var0 (ref struct)) (param $var1 (ref null $#Top)) (param $var2 (ref null $#Top)) (result (ref null $#Top)) <...>)
   (func $foo tear-off trampoline (param $var0 (ref struct)) (param $var1 (ref null $#Top)) (result (ref null $#Top)) <...>)
-  (func $foo tear-off trampoline_115 (param $var0 (ref struct)) (param $var1 (ref null $#Top)) (param $var2 (ref null $#Top)) (result (ref null $#Top)) <...>)
+  (func $foo tear-off trampoline_114 (param $var0 (ref struct)) (param $var1 (ref null $#Top)) (param $var2 (ref null $#Top)) (result (ref null $#Top)) <...>)
 )
\ No newline at end of file
diff --git a/pkg/dart2wasm/test/ir_tests/dyn_closure_function_apply.wat b/pkg/dart2wasm/test/ir_tests/dyn_closure_function_apply.wat
index 593d324..159794e 100644
--- a/pkg/dart2wasm/test/ir_tests/dyn_closure_function_apply.wat
+++ b/pkg/dart2wasm/test/ir_tests/dyn_closure_function_apply.wat
@@ -25,7 +25,7 @@
     (i32.const 0)
     (global.get $global0)
     (ref.func $"bar tear-off trampoline")
-    (ref.func $"bar tear-off trampoline_121")
+    (ref.func $"bar tear-off trampoline_119")
     (struct.new $#Vtable-0-2)
     (i32.const 11)
     (i32.const 0)
@@ -50,7 +50,7 @@
     (i32.const 0)
     (global.get $global0)
     (ref.func $"foo tear-off trampoline")
-    (ref.func $"foo tear-off trampoline_116")
+    (ref.func $"foo tear-off trampoline_115")
     (struct.new $#Vtable-0-2)
     (i32.const 11)
     (i32.const 0)
@@ -74,7 +74,7 @@
   (global $_TopType_290 (ref $_TopType) <...>)
   (global $global0 (ref $"dummy struct") <...>)
   (func $bar tear-off trampoline (param $var0 (ref struct)) (param $var1 (ref null $#Top)) (result (ref null $#Top)) <...>)
-  (func $bar tear-off trampoline_121 (param $var0 (ref struct)) (param $var1 (ref null $#Top)) (param $var2 (ref null $#Top)) (result (ref null $#Top)) <...>)
+  (func $bar tear-off trampoline_119 (param $var0 (ref struct)) (param $var1 (ref null $#Top)) (param $var2 (ref null $#Top)) (result (ref null $#Top)) <...>)
   (func $foo tear-off trampoline (param $var0 (ref struct)) (param $var1 (ref null $#Top)) (result (ref null $#Top)) <...>)
-  (func $foo tear-off trampoline_116 (param $var0 (ref struct)) (param $var1 (ref null $#Top)) (param $var2 (ref null $#Top)) (result (ref null $#Top)) <...>)
+  (func $foo tear-off trampoline_115 (param $var0 (ref struct)) (param $var1 (ref null $#Top)) (param $var2 (ref null $#Top)) (result (ref null $#Top)) <...>)
 )
\ No newline at end of file
diff --git a/pkg/dart2wasm/test/ir_tests/dyn_closure_function_apply_named.wat b/pkg/dart2wasm/test/ir_tests/dyn_closure_function_apply_named.wat
index 32d5e0c..a97fd35 100644
--- a/pkg/dart2wasm/test/ir_tests/dyn_closure_function_apply_named.wat
+++ b/pkg/dart2wasm/test/ir_tests/dyn_closure_function_apply_named.wat
@@ -29,7 +29,7 @@
     (i32.const 0)
     (global.get $global0)
     (ref.func $"bar tear-off dynamic call entry")
-    (ref.func $"bar tear-off trampoline_125")
+    (ref.func $"bar tear-off trampoline_122")
     (struct.new $#Vtable-0-2)
     (i32.const 11)
     (i32.const 0)
@@ -49,7 +49,7 @@
     (i32.const 0)
     (global.get $global0)
     (ref.func $"foo tear-off dynamic call entry")
-    (ref.func $"foo tear-off trampoline_119")
+    (ref.func $"foo tear-off trampoline_117")
     (struct.new $#Vtable-0-2)
     (i32.const 11)
     (i32.const 0)
@@ -74,7 +74,7 @@
   (global $_TopType_290 (ref $_TopType) <...>)
   (global $global0 (ref $"dummy struct") <...>)
   (func $bar tear-off dynamic call entry (param $var0 (ref $#Closure-0-0)) (param $var1 (ref $Array<_Type>)) (param $var2 (ref $Array<Object?>)) (param $var3 (ref $Array<Object?>)) (result (ref null $#Top)) <...>)
-  (func $bar tear-off trampoline_125 (param $var0 (ref struct)) (param $var1 (ref null $#Top)) (param $var2 (ref null $#Top)) (result (ref null $#Top)) <...>)
+  (func $bar tear-off trampoline_122 (param $var0 (ref struct)) (param $var1 (ref null $#Top)) (param $var2 (ref null $#Top)) (result (ref null $#Top)) <...>)
   (func $foo tear-off dynamic call entry (param $var0 (ref $#Closure-0-0)) (param $var1 (ref $Array<_Type>)) (param $var2 (ref $Array<Object?>)) (param $var3 (ref $Array<Object?>)) (result (ref null $#Top)) <...>)
-  (func $foo tear-off trampoline_119 (param $var0 (ref struct)) (param $var1 (ref null $#Top)) (param $var2 (ref null $#Top)) (result (ref null $#Top)) <...>)
+  (func $foo tear-off trampoline_117 (param $var0 (ref struct)) (param $var1 (ref null $#Top)) (param $var2 (ref null $#Top)) (result (ref null $#Top)) <...>)
 )
\ No newline at end of file
diff --git a/pkg/dart2wasm/test/ir_tests/dynamic_call.wat b/pkg/dart2wasm/test/ir_tests/dynamic_call.wat
index e8627fb..705d67b 100644
--- a/pkg/dart2wasm/test/ir_tests/dynamic_call.wat
+++ b/pkg/dart2wasm/test/ir_tests/dynamic_call.wat
@@ -4,7 +4,7 @@
   (type $Array<Object?> (array (field (mut (ref null $#Top)))))
   (type $BoxedBool (sub final $#Top (struct
     (field $field0 i32)
-    (field $value (mut i32)))))
+    (field $value i32))))
   (type $BoxedInt (sub final $#Top (struct
     (field $field0 i32)
     (field $value i64))))
diff --git a/pkg/dart2wasm/test/ir_tests/type_brand.dart b/pkg/dart2wasm/test/ir_tests/type_brand.dart
new file mode 100644
index 0000000..3dc37d3
--- /dev/null
+++ b/pkg/dart2wasm/test/ir_tests/type_brand.dart
@@ -0,0 +1,131 @@
+// Copyright (c) 2026, 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.
+
+// typeFilter=Foo|Bar
+// compilerOption=-O0
+// compilerOption=--unique-types
+
+main() {
+  for (final entry in [...list, ...list]) {
+    print(entry);
+  }
+}
+
+final intValue = int.parse('1');
+final doubleValue = double.parse('1.1');
+final stringValue = intValue.toString();
+final list = [
+  Foo1(stringValue, intValue),
+  Foo2(stringValue, intValue),
+  Foo3(stringValue, intValue),
+  Foo4(stringValue, intValue),
+  Foo5(stringValue, intValue),
+  Foo6(stringValue, intValue),
+  Foo7(stringValue, intValue),
+  Foo8(stringValue, intValue),
+  Foo9(stringValue, intValue),
+  Foo10(stringValue, intValue),
+  Foo11(stringValue, intValue),
+  Bar1(stringValue, doubleValue),
+  Bar2(stringValue, doubleValue),
+  Bar3(stringValue, doubleValue),
+];
+
+class Foo1 {
+  final String s1;
+  final int a1;
+  Foo1(this.s1, this.a1);
+  toString() => 'Foo1.$s1.$a1';
+}
+
+class Foo2 {
+  final String s2;
+  final int a2;
+  Foo2(this.s2, this.a2);
+  toString() => 'Foo2.$s2.$a2';
+}
+
+class Foo3 {
+  final String s3;
+  final int a3;
+  Foo3(this.s3, this.a3);
+  toString() => 'Foo3.$s3.$a3';
+}
+
+class Foo4 {
+  final String s4;
+  final int a4;
+  Foo4(this.s4, this.a4);
+  toString() => 'Foo4.$s4.$a4';
+}
+
+class Foo5 {
+  final String s5;
+  final int a5;
+  Foo5(this.s5, this.a5);
+  toString() => 'Foo5.$s5.$a5';
+}
+
+class Foo6 {
+  final String s6;
+  final int a6;
+  Foo6(this.s6, this.a6);
+  toString() => 'Foo6.$s6.$a6';
+}
+
+class Foo7 {
+  final String s7;
+  final int a7;
+  Foo7(this.s7, this.a7);
+  toString() => 'Foo7.$s7.$a7';
+}
+
+class Foo8 {
+  final String s8;
+  final int a8;
+  Foo8(this.s8, this.a8);
+  toString() => 'Foo8.$s8.$a8';
+}
+
+class Foo9 {
+  final String s9;
+  final int a9;
+  Foo9(this.s9, this.a9);
+  toString() => 'Foo9.$s9.$a9';
+}
+
+class Foo10 {
+  final String s10;
+  final int a10;
+  Foo10(this.s10, this.a10);
+  toString() => 'Foo10.$s10.$a10';
+}
+
+class Foo11 {
+  final String s11;
+  final int a11;
+  Foo11(this.s11, this.a11);
+  toString() => 'Foo11.$s11.$a11';
+}
+
+class Bar1 {
+  final String s1;
+  final double b1;
+  Bar1(this.s1, this.b1);
+  toString() => 'Bar1.$s1.$b1';
+}
+
+class Bar2 {
+  final String s2;
+  final double b2;
+  Bar2(this.s2, this.b2);
+  toString() => 'Bar2.$s2.$b2';
+}
+
+class Bar3 {
+  final String s3;
+  final double b3;
+  Bar3(this.s3, this.b3);
+  toString() => 'Bar3.$s3.$b3';
+}
diff --git a/pkg/dart2wasm/test/ir_tests/type_brand.wat b/pkg/dart2wasm/test/ir_tests/type_brand.wat
new file mode 100644
index 0000000..dafb003
--- /dev/null
+++ b/pkg/dart2wasm/test/ir_tests/type_brand.wat
@@ -0,0 +1,74 @@
+(module $module0
+  (type $Bar1 (sub final $Object (struct
+    (field $field0 i32)
+    (field $field1 (mut i32))
+    (field $s1 (ref $JSExternWrapper))
+    (field $b1 f64))))
+  (type $Bar2 (sub final $Object (struct
+    (field $field0 i32)
+    (field $field1 (mut i32))
+    (field $s2 (ref $JSExternWrapper))
+    (field $b2 f64))))
+  (type $Bar3 (sub final $Object (struct
+    (field $field0 i32)
+    (field $field1 (mut i32))
+    (field $s3 (ref $JSExternWrapper))
+    (field $b3 f64))))
+  (type $Foo1 (sub final $Object (struct
+    (field $field0 i32)
+    (field $field1 (mut i32))
+    (field $s1 (ref $JSExternWrapper))
+    (field $a1 i64))))
+  (type $Foo10 (sub final $Object (struct
+    (field $field0 i32)
+    (field $field1 (mut i32))
+    (field $s10 (ref $JSExternWrapper))
+    (field $a10 i64))))
+  (type $Foo11 (sub final $Object (struct
+    (field $field0 i32)
+    (field $field1 (mut i32))
+    (field $s11 (ref $JSExternWrapper))
+    (field $a11 i64))))
+  (type $Foo2 (sub final $Object (struct
+    (field $field0 i32)
+    (field $field1 (mut i32))
+    (field $s2 (ref $JSExternWrapper))
+    (field $a2 i64))))
+  (type $Foo3 (sub final $Object (struct
+    (field $field0 i32)
+    (field $field1 (mut i32))
+    (field $s3 (ref $JSExternWrapper))
+    (field $a3 i64))))
+  (type $Foo4 (sub final $Object (struct
+    (field $field0 i32)
+    (field $field1 (mut i32))
+    (field $s4 (ref $JSExternWrapper))
+    (field $a4 i64))))
+  (type $Foo5 (sub final $Object (struct
+    (field $field0 i32)
+    (field $field1 (mut i32))
+    (field $s5 (ref $JSExternWrapper))
+    (field $a5 i64))))
+  (type $Foo6 (sub final $Object (struct
+    (field $field0 i32)
+    (field $field1 (mut i32))
+    (field $s6 (ref $JSExternWrapper))
+    (field $a6 i64))))
+  (type $Foo7 (sub final $Object (struct
+    (field $field0 i32)
+    (field $field1 (mut i32))
+    (field $s7 (ref $JSExternWrapper))
+    (field $a7 i64))))
+  (type $Foo8 (sub final $Object (struct
+    (field $field0 i32)
+    (field $field1 (mut i32))
+    (field $s8 (ref $JSExternWrapper))
+    (field $a8 i64))))
+  (type $Foo9 (sub final $Object (struct
+    (field $field0 i32)
+    (field $field1 (mut i32))
+    (field $s9 (ref $JSExternWrapper))
+    (field $a9 i64))))
+  (type $JSExternWrapper <...>)
+  (type $Object <...>)
+)
\ No newline at end of file
diff --git a/pkg/dart2wasm/test/ir_tests/type_nobrand.dart b/pkg/dart2wasm/test/ir_tests/type_nobrand.dart
new file mode 100644
index 0000000..49f47e5
--- /dev/null
+++ b/pkg/dart2wasm/test/ir_tests/type_nobrand.dart
@@ -0,0 +1,131 @@
+// Copyright (c) 2026, 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.
+
+// typeFilter=Foo|Bar
+// compilerOption=-O0
+// compilerOption=--no-unique-types
+
+main() {
+  for (final entry in [...list, ...list]) {
+    print(entry);
+  }
+}
+
+final intValue = int.parse('1');
+final doubleValue = double.parse('1.1');
+final stringValue = intValue.toString();
+final list = [
+  Foo1(stringValue, intValue),
+  Foo2(stringValue, intValue),
+  Foo3(stringValue, intValue),
+  Foo4(stringValue, intValue),
+  Foo5(stringValue, intValue),
+  Foo6(stringValue, intValue),
+  Foo7(stringValue, intValue),
+  Foo8(stringValue, intValue),
+  Foo9(stringValue, intValue),
+  Foo10(stringValue, intValue),
+  Foo11(stringValue, intValue),
+  Bar1(stringValue, doubleValue),
+  Bar2(stringValue, doubleValue),
+  Bar3(stringValue, doubleValue),
+];
+
+class Foo1 {
+  final String s1;
+  final int a1;
+  Foo1(this.s1, this.a1);
+  toString() => 'Foo1.$s1.$a1';
+}
+
+class Foo2 {
+  final String s2;
+  final int a2;
+  Foo2(this.s2, this.a2);
+  toString() => 'Foo2.$s2.$a2';
+}
+
+class Foo3 {
+  final String s3;
+  final int a3;
+  Foo3(this.s3, this.a3);
+  toString() => 'Foo3.$s3.$a3';
+}
+
+class Foo4 {
+  final String s4;
+  final int a4;
+  Foo4(this.s4, this.a4);
+  toString() => 'Foo4.$s4.$a4';
+}
+
+class Foo5 {
+  final String s5;
+  final int a5;
+  Foo5(this.s5, this.a5);
+  toString() => 'Foo5.$s5.$a5';
+}
+
+class Foo6 {
+  final String s6;
+  final int a6;
+  Foo6(this.s6, this.a6);
+  toString() => 'Foo6.$s6.$a6';
+}
+
+class Foo7 {
+  final String s7;
+  final int a7;
+  Foo7(this.s7, this.a7);
+  toString() => 'Foo7.$s7.$a7';
+}
+
+class Foo8 {
+  final String s8;
+  final int a8;
+  Foo8(this.s8, this.a8);
+  toString() => 'Foo8.$s8.$a8';
+}
+
+class Foo9 {
+  final String s9;
+  final int a9;
+  Foo9(this.s9, this.a9);
+  toString() => 'Foo9.$s9.$a9';
+}
+
+class Foo10 {
+  final String s10;
+  final int a10;
+  Foo10(this.s10, this.a10);
+  toString() => 'Foo10.$s10.$a10';
+}
+
+class Foo11 {
+  final String s11;
+  final int a11;
+  Foo11(this.s11, this.a11);
+  toString() => 'Foo11.$s11.$a11';
+}
+
+class Bar1 {
+  final String s1;
+  final double b1;
+  Bar1(this.s1, this.b1);
+  toString() => 'Bar1.$s1.$b1';
+}
+
+class Bar2 {
+  final String s2;
+  final double b2;
+  Bar2(this.s2, this.b2);
+  toString() => 'Bar2.$s2.$b2';
+}
+
+class Bar3 {
+  final String s3;
+  final double b3;
+  Bar3(this.s3, this.b3);
+  toString() => 'Bar3.$s3.$b3';
+}
diff --git a/pkg/dart2wasm/test/ir_tests/type_nobrand.wat b/pkg/dart2wasm/test/ir_tests/type_nobrand.wat
new file mode 100644
index 0000000..476221b
--- /dev/null
+++ b/pkg/dart2wasm/test/ir_tests/type_nobrand.wat
@@ -0,0 +1,74 @@
+(module $module0
+  (type $Bar3|Bar2|Bar1 (sub final $Object (struct
+    (field $field0 i32)
+    (field $field1 (mut i32))
+    (field $Bar3.s3|Bar2.s2|Bar1.s1 (ref $JSExternWrapper))
+    (field $Bar3.b3|Bar2.b2|Bar1.b1 f64))))
+  (type $Bar3|Bar2|Bar1 (sub final $Object (struct
+    (field $field0 i32)
+    (field $field1 (mut i32))
+    (field $Bar3.s3|Bar2.s2|Bar1.s1 (ref $JSExternWrapper))
+    (field $Bar3.b3|Bar2.b2|Bar1.b1 f64))))
+  (type $Bar3|Bar2|Bar1 (sub final $Object (struct
+    (field $field0 i32)
+    (field $field1 (mut i32))
+    (field $Bar3.s3|Bar2.s2|Bar1.s1 (ref $JSExternWrapper))
+    (field $Bar3.b3|Bar2.b2|Bar1.b1 f64))))
+  (type $Foo11|Foo10|Foo9|Foo8|Foo7|Foo6|Foo5|Foo4|Foo3|Foo2|... (sub final $Object (struct
+    (field $field0 i32)
+    (field $field1 (mut i32))
+    (field $Foo11.s11|Foo10.s10|Foo9.s9|Foo8.s8|Foo7.s7|Foo6.s6|Foo5.s5|Foo4.s4|Foo3.s3|Foo2.s2|... (ref $JSExternWrapper))
+    (field $Foo11.a11|Foo10.a10|Foo9.a9|Foo8.a8|Foo7.a7|Foo6.a6|Foo5.a5|Foo4.a4|Foo3.a3|Foo2.a2|... i64))))
+  (type $Foo11|Foo10|Foo9|Foo8|Foo7|Foo6|Foo5|Foo4|Foo3|Foo2|... (sub final $Object (struct
+    (field $field0 i32)
+    (field $field1 (mut i32))
+    (field $Foo11.s11|Foo10.s10|Foo9.s9|Foo8.s8|Foo7.s7|Foo6.s6|Foo5.s5|Foo4.s4|Foo3.s3|Foo2.s2|... (ref $JSExternWrapper))
+    (field $Foo11.a11|Foo10.a10|Foo9.a9|Foo8.a8|Foo7.a7|Foo6.a6|Foo5.a5|Foo4.a4|Foo3.a3|Foo2.a2|... i64))))
+  (type $Foo11|Foo10|Foo9|Foo8|Foo7|Foo6|Foo5|Foo4|Foo3|Foo2|... (sub final $Object (struct
+    (field $field0 i32)
+    (field $field1 (mut i32))
+    (field $Foo11.s11|Foo10.s10|Foo9.s9|Foo8.s8|Foo7.s7|Foo6.s6|Foo5.s5|Foo4.s4|Foo3.s3|Foo2.s2|... (ref $JSExternWrapper))
+    (field $Foo11.a11|Foo10.a10|Foo9.a9|Foo8.a8|Foo7.a7|Foo6.a6|Foo5.a5|Foo4.a4|Foo3.a3|Foo2.a2|... i64))))
+  (type $Foo11|Foo10|Foo9|Foo8|Foo7|Foo6|Foo5|Foo4|Foo3|Foo2|... (sub final $Object (struct
+    (field $field0 i32)
+    (field $field1 (mut i32))
+    (field $Foo11.s11|Foo10.s10|Foo9.s9|Foo8.s8|Foo7.s7|Foo6.s6|Foo5.s5|Foo4.s4|Foo3.s3|Foo2.s2|... (ref $JSExternWrapper))
+    (field $Foo11.a11|Foo10.a10|Foo9.a9|Foo8.a8|Foo7.a7|Foo6.a6|Foo5.a5|Foo4.a4|Foo3.a3|Foo2.a2|... i64))))
+  (type $Foo11|Foo10|Foo9|Foo8|Foo7|Foo6|Foo5|Foo4|Foo3|Foo2|... (sub final $Object (struct
+    (field $field0 i32)
+    (field $field1 (mut i32))
+    (field $Foo11.s11|Foo10.s10|Foo9.s9|Foo8.s8|Foo7.s7|Foo6.s6|Foo5.s5|Foo4.s4|Foo3.s3|Foo2.s2|... (ref $JSExternWrapper))
+    (field $Foo11.a11|Foo10.a10|Foo9.a9|Foo8.a8|Foo7.a7|Foo6.a6|Foo5.a5|Foo4.a4|Foo3.a3|Foo2.a2|... i64))))
+  (type $Foo11|Foo10|Foo9|Foo8|Foo7|Foo6|Foo5|Foo4|Foo3|Foo2|... (sub final $Object (struct
+    (field $field0 i32)
+    (field $field1 (mut i32))
+    (field $Foo11.s11|Foo10.s10|Foo9.s9|Foo8.s8|Foo7.s7|Foo6.s6|Foo5.s5|Foo4.s4|Foo3.s3|Foo2.s2|... (ref $JSExternWrapper))
+    (field $Foo11.a11|Foo10.a10|Foo9.a9|Foo8.a8|Foo7.a7|Foo6.a6|Foo5.a5|Foo4.a4|Foo3.a3|Foo2.a2|... i64))))
+  (type $Foo11|Foo10|Foo9|Foo8|Foo7|Foo6|Foo5|Foo4|Foo3|Foo2|... (sub final $Object (struct
+    (field $field0 i32)
+    (field $field1 (mut i32))
+    (field $Foo11.s11|Foo10.s10|Foo9.s9|Foo8.s8|Foo7.s7|Foo6.s6|Foo5.s5|Foo4.s4|Foo3.s3|Foo2.s2|... (ref $JSExternWrapper))
+    (field $Foo11.a11|Foo10.a10|Foo9.a9|Foo8.a8|Foo7.a7|Foo6.a6|Foo5.a5|Foo4.a4|Foo3.a3|Foo2.a2|... i64))))
+  (type $Foo11|Foo10|Foo9|Foo8|Foo7|Foo6|Foo5|Foo4|Foo3|Foo2|... (sub final $Object (struct
+    (field $field0 i32)
+    (field $field1 (mut i32))
+    (field $Foo11.s11|Foo10.s10|Foo9.s9|Foo8.s8|Foo7.s7|Foo6.s6|Foo5.s5|Foo4.s4|Foo3.s3|Foo2.s2|... (ref $JSExternWrapper))
+    (field $Foo11.a11|Foo10.a10|Foo9.a9|Foo8.a8|Foo7.a7|Foo6.a6|Foo5.a5|Foo4.a4|Foo3.a3|Foo2.a2|... i64))))
+  (type $Foo11|Foo10|Foo9|Foo8|Foo7|Foo6|Foo5|Foo4|Foo3|Foo2|... (sub final $Object (struct
+    (field $field0 i32)
+    (field $field1 (mut i32))
+    (field $Foo11.s11|Foo10.s10|Foo9.s9|Foo8.s8|Foo7.s7|Foo6.s6|Foo5.s5|Foo4.s4|Foo3.s3|Foo2.s2|... (ref $JSExternWrapper))
+    (field $Foo11.a11|Foo10.a10|Foo9.a9|Foo8.a8|Foo7.a7|Foo6.a6|Foo5.a5|Foo4.a4|Foo3.a3|Foo2.a2|... i64))))
+  (type $Foo11|Foo10|Foo9|Foo8|Foo7|Foo6|Foo5|Foo4|Foo3|Foo2|... (sub final $Object (struct
+    (field $field0 i32)
+    (field $field1 (mut i32))
+    (field $Foo11.s11|Foo10.s10|Foo9.s9|Foo8.s8|Foo7.s7|Foo6.s6|Foo5.s5|Foo4.s4|Foo3.s3|Foo2.s2|... (ref $JSExternWrapper))
+    (field $Foo11.a11|Foo10.a10|Foo9.a9|Foo8.a8|Foo7.a7|Foo6.a6|Foo5.a5|Foo4.a4|Foo3.a3|Foo2.a2|... i64))))
+  (type $Foo11|Foo10|Foo9|Foo8|Foo7|Foo6|Foo5|Foo4|Foo3|Foo2|... (sub final $Object (struct
+    (field $field0 i32)
+    (field $field1 (mut i32))
+    (field $Foo11.s11|Foo10.s10|Foo9.s9|Foo8.s8|Foo7.s7|Foo6.s6|Foo5.s5|Foo4.s4|Foo3.s3|Foo2.s2|... (ref $JSExternWrapper))
+    (field $Foo11.a11|Foo10.a10|Foo9.a9|Foo8.a8|Foo7.a7|Foo6.a6|Foo5.a5|Foo4.a4|Foo3.a3|Foo2.a2|... i64))))
+  (type $JSExternWrapper <...>)
+  (type $Object <...>)
+)
\ No newline at end of file
diff --git a/pkg/dev_compiler/lib/js/ddc/ddc_module_loader.js b/pkg/dev_compiler/lib/js/ddc/ddc_module_loader.js
index e5de482..d22732b 100644
--- a/pkg/dev_compiler/lib/js/ddc/ddc_module_loader.js
+++ b/pkg/dev_compiler/lib/js/ddc/ddc_module_loader.js
@@ -1694,8 +1694,53 @@
       this.hotReloadGeneration += 1;
     }
 
+    // See docs on `DartDevEmbedder.hotRestartBegin`.
+    async hotRestartBegin(filesToRequest) {
+      if (!this.savedEntryPointLibraryName) {
+        throw 'Error: Hot restart requested before application started.';
+      }
+      this.hotRestartInProgress = true;
+      let reloadedFiles = await self.$dartReloadModifiedModules(
+          filesToRequest, this.savedEntryPointLibraryName);
+      return reloadedFiles;
+    }
+
+    // See docs on `DartDevEmbedder.hotRestartEnd`.
+    hotRestartEnd() {
+      if (!this.hotRestartInProgress) {
+        throw 'Error: Hot restart end called without a corresponding start.';
+      }
+      // Clear all libraries.
+      this.libraries = Object.create(null);
+      this.triggeredSDKLibrariesWithSideEffects = false;
+      this.setDartSDKRuntimeOptions(this.savedDartSdkRuntimeOptions);
+      // Update initializers. They'll be invoked later at some point after we
+      // call main.
+      for (let name in this.pendingHotRestartLibraryInitializers) {
+        let initializer = this.pendingHotRestartLibraryInitializers[name];
+        this.libraryInitializers[name] = initializer;
+      }
+      let entryPointLibrary =
+          this.initializeAndLinkLibrary(this.savedEntryPointLibraryName);
+      // TODO(nshahan): Start sharing a single source of truth for the restart
+      // generation between the dart:_runtime and this module system.
+      this.hotRestartGeneration += 1;
+      console.log(
+          'Hot restarting application from main method in: ' +
+          this.savedEntryPointLibraryName +
+          ' (generation: ' + this.hotRestartGeneration + ').');
+      // Cleanup.
+      this.hotRestartInProgress = false;
+      this.pendingHotRestartLibraryInitializers = Object.create(null);
+
+      this._runMain(entryPointLibrary);
+    }
+
+
     /**
      * Completes a hot restart operation.
+     *
+     * @deprecated Use `hotRestartBegin` and `hotRestartEnd` instead.
      */
     hotRestart() {
       if (!this.savedEntryPointLibraryName) {
@@ -2076,6 +2121,7 @@
      * that invokes 'main' when called.
      * @type {?function(function())}
      */
+    // TODO(nshahan): Remove this once the migration is complete.
     capturedMainHandler = null;
 
     /**
@@ -2195,8 +2241,62 @@
     }
 
     /**
+     * Immediately triggers the start of a hot restart of the application.
+     *
+     * Assumes that a function named `$dartReloadModifiedModules` is available
+     * in the global scope and relies on it to actually request the files
+     * that are being reloaded and add them to the document.
+     *
+     * @param {!Array<!Object>} filesToRequest The descriptor Objects
+     *     describing the JavaScript files that could be part of this hot
+     *     restart. This must include all the files that changed and need
+     *     to be reloaded on the page.
+     *
+     *     Each descriptor Object must have the following properties:
+     *     - src: The url of the Javascript file to request.
+     *     - id: The unique and stable identifier for this file, typically
+     *       the "module name" is used.
+     *
+     *     Additional properties may be present and will simply be passed
+     *     through to the `$dartReloadModifiedModules` function.
+     *
+     * @return {!Promise<!Array<!Object>>} Descriptor Objects for the
+     *     JavaScript files that were actually requested by
+     *     `$dartReloadModifiedModules`.
+     *
+     *     This is expected to be the same set of files described by
+     *     `filesToRequest` or a subset. Naming additional files could cause
+     *     undefined behavior.
+     *
+     *     Note: when a Dart debugger is attached, the hot restart operation
+     *     will block until a script parse event is received from Chrome
+     *     DevTools for each of the JavaScript files described here.
+     *
+     *     Each descriptor Object returned from `$dartReloadModifiedModules`
+     *     must contain the following properties:
+     *     - src: The url of the Javascript file that was requested.
+     *
+     *     Additional properties may be present.
+     */
+    async hotRestartBegin(filesToRequest) {
+      return await libraryManager.hotRestartBegin(filesToRequest);
+    }
+
+    /**
+     * Finishes the hot restart operation that must have been previously
+     * started by [hotRestartBegin] losing all application state and running
+     * the main method again.
+     */
+    hotRestartEnd() {
+      libraryManager.hotRestartEnd();
+    }
+
+
+    /**
      * Immediately triggers a hot restart of the application losing all state
      * and running the main method again.
+     *
+     * @deprecated Use `hotRestartBegin` and `hotRestartEnd` instead.
      */
     async hotRestart() {
       libraryManager.hotRestartInProgress = true;
diff --git a/pkg/dev_compiler/lib/src/kernel/compiler.dart b/pkg/dev_compiler/lib/src/kernel/compiler.dart
index 721f433..ca43d5a 100644
--- a/pkg/dev_compiler/lib/src/kernel/compiler.dart
+++ b/pkg/dev_compiler/lib/src/kernel/compiler.dart
@@ -8065,6 +8065,12 @@
     var init = _visitExpression(v.initializer!);
     var body = _visitExpression(node.body);
     var temp = _tempVariables.remove(v);
+    // TODO(eernst): Remove the following `if` if anonymous-methods is rejected.
+    // Otherwise, revise this method to be more readable.
+    // See https://github.com/dart-lang/language/issues/260.
+    if (temp == null && !_isTemporaryVariable(v)) {
+      temp = _emitVariableRef(v);
+    }
     if (temp != null) {
       if (_letVariables != null) {
         init = js_ast.Assignment(temp, init);
diff --git a/pkg/dev_compiler/lib/src/kernel/compiler_new.dart b/pkg/dev_compiler/lib/src/kernel/compiler_new.dart
index a19b2c5..922e363 100644
--- a/pkg/dev_compiler/lib/src/kernel/compiler_new.dart
+++ b/pkg/dev_compiler/lib/src/kernel/compiler_new.dart
@@ -8938,6 +8938,12 @@
     var init = _visitExpression(v.initializer!);
     var body = _visitExpression(node.body);
     var temp = _tempVariables.remove(v);
+    // TODO(eernst): Remove the following `if` if anonymous-methods is rejected.
+    // Otherwise, revise this method to be more readable.
+    // See https://github.com/dart-lang/language/issues/260.
+    if (temp == null && !_isTemporaryVariable(v)) {
+      temp = _emitVariableRef(v);
+    }
     if (temp != null) {
       if (_letVariables != null) {
         init = js_ast.Assignment(temp, init);
diff --git a/pkg/dev_compiler/lib/src/kernel/expression_compiler.dart b/pkg/dev_compiler/lib/src/kernel/expression_compiler.dart
index 00d050c..d041072 100644
--- a/pkg/dev_compiler/lib/src/kernel/expression_compiler.dart
+++ b/pkg/dev_compiler/lib/src/kernel/expression_compiler.dart
@@ -140,20 +140,6 @@
       // different from dart.
       // See [issue 40273](https://github.com/dart-lang/sdk/issues/40273)
 
-      // Work around mismatched names and lowered representation for late local
-      // variables.
-      // Replace the existing entries with a name that matches the named
-      // extracted from the lowering.
-      // See https://github.com/dart-lang/sdk/issues/55918
-      var dartLateLocals = [
-        for (var name in dartScope.variables.keys)
-          if (isLateLoweredLocalName(name)) name,
-      ];
-      for (var localName in dartLateLocals) {
-        dartScope.variables[extractLocalName(localName)] = dartScope.variables
-            .remove(localName)!;
-      }
-
       // Create a mapping from Dart variable names in scope to the corresponding
       // JS values. The Dart variable may have had a suffix of the
       // form '$N' added to it where N is either the empty string or an
diff --git a/pkg/dev_compiler/test/expression_compiler/scope_offset_test.dart b/pkg/dev_compiler/test/expression_compiler/scope_offset_test.dart
index aa1e165..a441f1a 100644
--- a/pkg/dev_compiler/test/expression_compiler/scope_offset_test.dart
+++ b/pkg/dev_compiler/test/expression_compiler/scope_offset_test.dart
@@ -144,7 +144,7 @@
     blockCount++;
     expect(
       block,
-      const TypeMatcher<FunctionNode>().having(
+      const TypeMatcher<Block>().having(
         (c) => c.fileOffset,
         '${block.toText(astTextStrategyForTesting)} : fileOffset',
         isNot(equals(-1)),
diff --git a/pkg/dwds/CHANGELOG.md b/pkg/dwds/CHANGELOG.md
index da1c2eb..4ca56d1 100644
--- a/pkg/dwds/CHANGELOG.md
+++ b/pkg/dwds/CHANGELOG.md
@@ -1,6 +1,10 @@
-## 27.1.1-wip
+## 27.1.2-wip
 
-- Replace raw map for client ping checks with a proper `PingRequest` class and update client deserialization handling.
+## 27.1.1
+
+- Fix deserialization errors appearing in the chrome console.
+  Replace raw map for client ping checks with a proper `PingRequest` class and
+  update client deserialization handling.
 
 ## 27.1.0
 
diff --git a/pkg/dwds/lib/src/handlers/injected_client_js.dart b/pkg/dwds/lib/src/handlers/injected_client_js.dart
index cd169ff..9ce5482 100644
--- a/pkg/dwds/lib/src/handlers/injected_client_js.dart
+++ b/pkg/dwds/lib/src/handlers/injected_client_js.dart
@@ -2,7 +2,7 @@
 // Emits the transpiled client.js directly into a statically embeddable string.
 // dart format off
 
-const injectedClientJs = "// Generated by dart2js (, csp, intern-composite-values), the Dart to JavaScript compiler version: 3.13.0-edge.\n"
+const injectedClientJs = "// Generated by dart2js (, csp, intern-composite-values), the Dart to JavaScript compiler version: 3.13.0-89.0.dev.\n"
 "// The code supports the following hooks:\n"
 "// dartPrint(message):\n"
 "//    if this function is defined it is called instead of the Dart [print]\n"
@@ -3886,78 +3886,6 @@
 "      }(\$function, 1);\n"
 "      return \$.Zone__current.registerBinaryCallback\$3\$1(new A._wrapJsFunctionForAsync_closure(\$protected), type\$.void, type\$.int, type\$.dynamic);\n"
 "    },\n"
-"    _asyncStarHelper(object, bodyFunctionOrErrorCode, controller) {\n"
-"      var t1, t2, t3,\n"
-"        _s10_ = \"controller\";\n"
-"      if (bodyFunctionOrErrorCode === 0) {\n"
-"        t1 = controller.cancelationFuture;\n"
-"        if (t1 != null)\n"
-"          t1._completeWithValue\$1(null);\n"
-"        else {\n"
-"          t1 = controller.___AsyncStarStreamController_controller_A;\n"
-"          t1 === \$ && A.throwLateFieldNI(_s10_);\n"
-"          t1.close\$0();\n"
-"        }\n"
-"        return;\n"
-"      } else if (bodyFunctionOrErrorCode === 1) {\n"
-"        t1 = controller.cancelationFuture;\n"
-"        if (t1 != null) {\n"
-"          t2 = A.unwrapException(object);\n"
-"          t3 = A.getTraceFromException(object);\n"
-"          t1._completeErrorObject\$1(new A.AsyncError(t2, t3));\n"
-"        } else {\n"
-"          t1 = A.unwrapException(object);\n"
-"          t2 = A.getTraceFromException(object);\n"
-"          t3 = controller.___AsyncStarStreamController_controller_A;\n"
-"          t3 === \$ && A.throwLateFieldNI(_s10_);\n"
-"          t3.addError\$2(t1, t2);\n"
-"          controller.___AsyncStarStreamController_controller_A.close\$0();\n"
-"        }\n"
-"        return;\n"
-"      }\n"
-"      type\$.void_Function_int_dynamic._as(bodyFunctionOrErrorCode);\n"
-"      if (object instanceof A._IterationMarker) {\n"
-"        if (controller.cancelationFuture != null) {\n"
-"          bodyFunctionOrErrorCode.call\$2(2, null);\n"
-"          return;\n"
-"        }\n"
-"        t1 = object.state;\n"
-"        if (t1 === 0) {\n"
-"          t1 = object.value;\n"
-"          t2 = controller.___AsyncStarStreamController_controller_A;\n"
-"          t2 === \$ && A.throwLateFieldNI(_s10_);\n"
-"          t2.add\$1(0, controller.\$ti._precomputed1._as(t1));\n"
-"          A.scheduleMicrotask(new A._asyncStarHelper_closure(controller, bodyFunctionOrErrorCode));\n"
-"          return;\n"
-"        } else if (t1 === 1) {\n"
-"          t1 = controller.\$ti._eval\$1(\"Stream<1>\")._as(type\$.Stream_dynamic._as(object.value));\n"
-"          t2 = controller.___AsyncStarStreamController_controller_A;\n"
-"          t2 === \$ && A.throwLateFieldNI(_s10_);\n"
-"          t2.addStream\$2\$cancelOnError(t1, false).then\$1\$1(new A._asyncStarHelper_closure0(controller, bodyFunctionOrErrorCode), type\$.Null);\n"
-"          return;\n"
-"        }\n"
-"      }\n"
-"      A._awaitOnObject(object, bodyFunctionOrErrorCode);\n"
-"    },\n"
-"    _streamOfController(controller) {\n"
-"      var t1 = controller.___AsyncStarStreamController_controller_A;\n"
-"      t1 === \$ && A.throwLateFieldNI(\"controller\");\n"
-"      return new A._ControllerStream(t1, A._instanceType(t1)._eval\$1(\"_ControllerStream<1>\"));\n"
-"    },\n"
-"    _AsyncStarStreamController\$(body, \$T) {\n"
-"      var t1 = new A._AsyncStarStreamController(\$T._eval\$1(\"_AsyncStarStreamController<0>\"));\n"
-"      t1._AsyncStarStreamController\$1(body, \$T);\n"
-"      return t1;\n"
-"    },\n"
-"    _makeAsyncStarStreamController(body, \$T) {\n"
-"      return A._AsyncStarStreamController\$(body, \$T);\n"
-"    },\n"
-"    _IterationMarker_yieldStar(values) {\n"
-"      return new A._IterationMarker(values, 1);\n"
-"    },\n"
-"    _IterationMarker_yieldSingle(value) {\n"
-"      return new A._IterationMarker(value, 0);\n"
-"    },\n"
 "    AsyncError_defaultStackTrace(error) {\n"
 "      var stackTrace;\n"
 "      if (type\$.Error._is(error)) {\n"
@@ -4269,8 +4197,9 @@
 "      A.checkNotNullable(stream, \"stream\", type\$.Object);\n"
 "      return new A._StreamIterator(\$T._eval\$1(\"_StreamIterator<0>\"));\n"
 "    },\n"
-"    StreamController_StreamController(onCancel, onListen, onResume, \$T) {\n"
-"      return new A._AsyncStreamController(onListen, null, onResume, onCancel, \$T._eval\$1(\"_AsyncStreamController<0>\"));\n"
+"    StreamController_StreamController(\$T) {\n"
+"      var _null = null;\n"
+"      return new A._AsyncStreamController(_null, _null, _null, _null, \$T._eval\$1(\"_AsyncStreamController<0>\"));\n"
 "    },\n"
 "    _runGuarded(notificationHandler) {\n"
 "      var e, s, exception;\n"
@@ -4284,9 +4213,6 @@
 "        \$.Zone__current.handleUncaughtError\$2(e, s);\n"
 "      }\n"
 "    },\n"
-"    _AddStreamState_makeErrorHandler(controller) {\n"
-"      return new A._AddStreamState_makeErrorHandler_closure(controller);\n"
-"    },\n"
 "    _BufferingStreamSubscription__registerDataHandler(zone, handleData, \$T) {\n"
 "      var t1 = handleData == null ? A.async___nullDataHandler\$closure() : handleData;\n"
 "      return zone.registerUnaryCallback\$2\$1(t1, type\$.void, \$T);\n"
@@ -4506,45 +4432,6 @@
 "    _wrapJsFunctionForAsync_closure: function _wrapJsFunctionForAsync_closure(t0) {\n"
 "      this.\$protected = t0;\n"
 "    },\n"
-"    _asyncStarHelper_closure: function _asyncStarHelper_closure(t0, t1) {\n"
-"      this.controller = t0;\n"
-"      this.bodyFunction = t1;\n"
-"    },\n"
-"    _asyncStarHelper_closure0: function _asyncStarHelper_closure0(t0, t1) {\n"
-"      this.controller = t0;\n"
-"      this.bodyFunction = t1;\n"
-"    },\n"
-"    _AsyncStarStreamController: function _AsyncStarStreamController(t0) {\n"
-"      var _ = this;\n"
-"      _.___AsyncStarStreamController_controller_A = \$;\n"
-"      _.isSuspended = false;\n"
-"      _.cancelationFuture = null;\n"
-"      _.\$ti = t0;\n"
-"    },\n"
-"    _AsyncStarStreamController__resumeBody: function _AsyncStarStreamController__resumeBody(t0) {\n"
-"      this.body = t0;\n"
-"    },\n"
-"    _AsyncStarStreamController__resumeBody_closure: function _AsyncStarStreamController__resumeBody_closure(t0) {\n"
-"      this.body = t0;\n"
-"    },\n"
-"    _AsyncStarStreamController_closure0: function _AsyncStarStreamController_closure0(t0) {\n"
-"      this._resumeBody = t0;\n"
-"    },\n"
-"    _AsyncStarStreamController_closure1: function _AsyncStarStreamController_closure1(t0, t1) {\n"
-"      this.\$this = t0;\n"
-"      this._resumeBody = t1;\n"
-"    },\n"
-"    _AsyncStarStreamController_closure: function _AsyncStarStreamController_closure(t0, t1) {\n"
-"      this.\$this = t0;\n"
-"      this.body = t1;\n"
-"    },\n"
-"    _AsyncStarStreamController__closure: function _AsyncStarStreamController__closure(t0) {\n"
-"      this.body = t0;\n"
-"    },\n"
-"    _IterationMarker: function _IterationMarker(t0, t1) {\n"
-"      this.value = t0;\n"
-"      this.state = t1;\n"
-"    },\n"
 "    AsyncError: function AsyncError(t0, t1) {\n"
 "      this.error = t0;\n"
 "      this.stackTrace = t1;\n"
@@ -4704,21 +4591,6 @@
 "      this._async\$_target = t0;\n"
 "      this.\$ti = t1;\n"
 "    },\n"
-"    _AddStreamState: function _AddStreamState() {\n"
-"    },\n"
-"    _AddStreamState_makeErrorHandler_closure: function _AddStreamState_makeErrorHandler_closure(t0) {\n"
-"      this.controller = t0;\n"
-"    },\n"
-"    _AddStreamState_cancel_closure: function _AddStreamState_cancel_closure(t0) {\n"
-"      this.\$this = t0;\n"
-"    },\n"
-"    _StreamControllerAddStreamState: function _StreamControllerAddStreamState(t0, t1, t2, t3) {\n"
-"      var _ = this;\n"
-"      _._varData = t0;\n"
-"      _.addStreamFuture = t1;\n"
-"      _.addSubscription = t2;\n"
-"      _.\$ti = t3;\n"
-"    },\n"
 "    _BufferingStreamSubscription: function _BufferingStreamSubscription() {\n"
 "    },\n"
 "    _BufferingStreamSubscription_asFuture_closure: function _BufferingStreamSubscription_asFuture_closure(t0, t1) {\n"
@@ -4781,6 +4653,26 @@
 "    _EmptyStream: function _EmptyStream(t0) {\n"
 "      this.\$ti = t0;\n"
 "    },\n"
+"    _MultiStream: function _MultiStream(t0, t1, t2) {\n"
+"      this.isBroadcast = t0;\n"
+"      this._onListen = t1;\n"
+"      this.\$ti = t2;\n"
+"    },\n"
+"    _MultiStream_listen_closure: function _MultiStream_listen_closure(t0, t1) {\n"
+"      this.\$this = t0;\n"
+"      this.controller = t1;\n"
+"    },\n"
+"    _MultiStreamController: function _MultiStreamController(t0, t1, t2, t3, t4) {\n"
+"      var _ = this;\n"
+"      _._varData = null;\n"
+"      _._state = 0;\n"
+"      _._doneFuture = null;\n"
+"      _.onListen = t0;\n"
+"      _.onPause = t1;\n"
+"      _.onResume = t2;\n"
+"      _.onCancel = t3;\n"
+"      _.\$ti = t4;\n"
+"    },\n"
 "    _cancelAndValue_closure: function _cancelAndValue_closure(t0, t1) {\n"
 "      this.future = t0;\n"
 "      this.value = t1;\n"
@@ -7579,6 +7471,10 @@
 "      this.iterator = t1;\n"
 "      this.\$ti = t2;\n"
 "    },\n"
+"    RequestAbortedException: function RequestAbortedException(t0, t1) {\n"
+"      this.message = t0;\n"
+"      this.uri = t1;\n"
+"    },\n"
 "    BaseClient: function BaseClient() {\n"
 "    },\n"
 "    BaseRequest: function BaseRequest() {\n"
@@ -7589,29 +7485,35 @@
 "    },\n"
 "    BaseResponse: function BaseResponse() {\n"
 "    },\n"
-"    _rethrowAsClientException(e, st, request) {\n"
+"    _toClientException(e, request) {\n"
 "      var message;\n"
+"      if (type\$.JSObject._is(e) && \"AbortError\" === A._asString(e.name))\n"
+"        return new A.RequestAbortedException(\"Request aborted by `abortTrigger`\", request.url);\n"
 "      if (!(e instanceof A.ClientException)) {\n"
 "        message = J.toString\$0\$(e);\n"
 "        if (B.JSString_methods.startsWith\$1(message, \"TypeError: \"))\n"
 "          message = B.JSString_methods.substring\$1(message, 11);\n"
 "        e = new A.ClientException(message, request.url);\n"
 "      }\n"
-"      A.Error_throwWithStackTrace(e, st);\n"
+"      return e;\n"
 "    },\n"
-"    _readBody(request, response) {\n"
-"      return A._readBody\$body(request, response);\n"
+"    _rethrowAsClientException(e, st, request) {\n"
+"      A.Error_throwWithStackTrace(A._toClientException(e, request), st);\n"
 "    },\n"
-"    _readBody\$body(request, response) {\n"
-"      var \$async\$_readBody = A._wrapJsFunctionForAsync(function(\$async\$errorCode, \$async\$result) {\n"
-"        switch (\$async\$errorCode) {\n"
-"          case 2:\n"
-"            \$async\$next = \$async\$nextWhenCanceled;\n"
-"            \$async\$goto = \$async\$next.pop();\n"
-"            break;\n"
-"          case 1:\n"
-"            \$async\$errorStack.push(\$async\$result);\n"
-"            \$async\$goto = \$async\$handler;\n"
+"    _bodyToStream(request, response) {\n"
+"      return new A._MultiStream(false, new A._bodyToStream_closure(request, response), type\$._MultiStream_List_int);\n"
+"    },\n"
+"    _readStreamBody(request, response, controller) {\n"
+"      return A._readStreamBody\$body(request, response, controller);\n"
+"    },\n"
+"    _readStreamBody\$body(request, response, controller) {\n"
+"      var \$async\$goto = 0,\n"
+"        \$async\$completer = A._makeAsyncAwaitCompleter(type\$.void),\n"
+"        \$async\$returnValue, \$async\$handler = 2, \$async\$errorStack = [], chunk, e, s, t2, t3, t4, t5, t6, t7, exception, varData, t8, t9, _box_0, t1, reader, \$async\$exception;\n"
+"      var \$async\$_readStreamBody = A._wrapJsFunctionForAsync(function(\$async\$errorCode, \$async\$result) {\n"
+"        if (\$async\$errorCode === 1) {\n"
+"          \$async\$errorStack.push(\$async\$result);\n"
+"          \$async\$goto = \$async\$handler;\n"
 "        }\n"
 "        for (;;)\n"
 "          switch (\$async\$goto) {\n"
@@ -7619,127 +7521,153 @@
 "              // Function start\n"
 "              _box_0 = {};\n"
 "              t1 = A._asJSObjectQ(response.body);\n"
-"              bodyStreamReader = t1 == null ? null : A._asJSObject(t1.getReader());\n"
-"              if (bodyStreamReader == null) {\n"
-"                // goto return\n"
-"                \$async\$goto = 1;\n"
-"                break;\n"
-"              }\n"
-"              isDone = false;\n"
-"              _box_0.isError = false;\n"
-"              \$async\$handler = 4;\n"
-"              t1 = type\$.NativeUint8List, t2 = type\$.JSObject;\n"
-"            case 7:\n"
-"              // for condition\n"
-"              // trivial condition\n"
-"              \$async\$goto = 9;\n"
-"              return A._asyncStarHelper(A.promiseToFuture(A._asJSObject(bodyStreamReader.read()), t2), \$async\$_readBody, \$async\$controller);\n"
-"            case 9:\n"
-"              // returning from await.\n"
-"              chunk = \$async\$result;\n"
-"              if (A._asBool(chunk.done)) {\n"
-"                isDone = true;\n"
-"                // goto after for\n"
-"                \$async\$goto = 8;\n"
-"                break;\n"
-"              }\n"
-"              t3 = chunk.value;\n"
-"              t3.toString;\n"
-"              \$async\$goto = 10;\n"
-"              \$async\$nextWhenCanceled = [1, 5];\n"
-"              return A._asyncStarHelper(A._IterationMarker_yieldSingle(t1._as(t3)), \$async\$_readBody, \$async\$controller);\n"
-"            case 10:\n"
-"              // after yield\n"
-"              // goto for condition\n"
-"              \$async\$goto = 7;\n"
-"              break;\n"
-"            case 8:\n"
-"              // after for\n"
-"              \$async\$next.push(6);\n"
-"              // goto finally\n"
-"              \$async\$goto = 5;\n"
-"              break;\n"
-"            case 4:\n"
-"              // catch\n"
-"              \$async\$handler = 3;\n"
-"              \$async\$exception = \$async\$errorStack.pop();\n"
-"              e = A.unwrapException(\$async\$exception);\n"
-"              st = A.getTraceFromException(\$async\$exception);\n"
-"              _box_0.isError = true;\n"
-"              A._rethrowAsClientException(e, st, request);\n"
-"              \$async\$next.push(6);\n"
-"              // goto finally\n"
-"              \$async\$goto = 5;\n"
+"              reader = t1 == null ? null : A._asJSObject(t1.getReader());\n"
+"              \$async\$goto = reader == null ? 3 : 4;\n"
 "              break;\n"
 "            case 3:\n"
-"              // uncaught\n"
-"              \$async\$next = [2];\n"
-"            case 5:\n"
-"              // finally\n"
-"              \$async\$handler = 2;\n"
-"              \$async\$goto = !isDone ? 11 : 12;\n"
-"              break;\n"
-"            case 11:\n"
 "              // then\n"
-"              \$async\$handler = 14;\n"
-"              \$async\$goto = 17;\n"
-"              return A._asyncStarHelper(A.promiseToFuture(A._asJSObject(bodyStreamReader.cancel()), type\$.nullable_Object).catchError\$2\$test(new A._readBody_closure(), new A._readBody_closure0(_box_0)), \$async\$_readBody, \$async\$controller);\n"
-"            case 17:\n"
+"              \$async\$goto = 5;\n"
+"              return A._asyncAwait(controller.close\$0(), \$async\$_readStreamBody);\n"
+"            case 5:\n"
 "              // returning from await.\n"
+"              // goto return\n"
+"              \$async\$goto = 1;\n"
+"              break;\n"
+"            case 4:\n"
+"              // join\n"
+"              _box_0.resumeSignal = null;\n"
+"              _box_0.hadError = _box_0.cancelled = false;\n"
+"              controller.set\$onResume(new A._readStreamBody_closure(_box_0));\n"
+"              controller.set\$onCancel(new A._readStreamBody_closure0(_box_0, reader, request));\n"
+"              t1 = type\$.NativeUint8List, t2 = controller.\$ti, t3 = t2._precomputed1, t4 = type\$.JSObject, t2 = t2._eval\$1(\"_ControllerSubscription<1>\"), t5 = type\$._StreamControllerAddStreamState_nullable_Object, t6 = type\$._Future_void, t7 = type\$._AsyncCompleter_void;\n"
+"            case 6:\n"
+"              // for condition\n"
+"              // trivial condition\n"
+"              chunk = null;\n"
+"              \$async\$handler = 9;\n"
+"              \$async\$goto = 12;\n"
+"              return A._asyncAwait(A.promiseToFuture(A._asJSObject(reader.read()), t4), \$async\$_readStreamBody);\n"
+"            case 12:\n"
+"              // returning from await.\n"
+"              chunk = \$async\$result;\n"
 "              \$async\$handler = 2;\n"
 "              // goto after finally\n"
-"              \$async\$goto = 16;\n"
+"              \$async\$goto = 11;\n"
 "              break;\n"
-"            case 14:\n"
+"            case 9:\n"
 "              // catch\n"
-"              \$async\$handler = 13;\n"
-"              \$async\$exception1 = \$async\$errorStack.pop();\n"
-"              e0 = A.unwrapException(\$async\$exception1);\n"
-"              st0 = A.getTraceFromException(\$async\$exception1);\n"
-"              if (!_box_0.isError)\n"
-"                A._rethrowAsClientException(e0, st0, request);\n"
-"              // goto after finally\n"
-"              \$async\$goto = 16;\n"
+"              \$async\$handler = 8;\n"
+"              \$async\$exception = \$async\$errorStack.pop();\n"
+"              e = A.unwrapException(\$async\$exception);\n"
+"              s = A.getTraceFromException(\$async\$exception);\n"
+"              \$async\$goto = !_box_0.cancelled ? 13 : 14;\n"
 "              break;\n"
 "            case 13:\n"
+"              // then\n"
+"              _box_0.hadError = true;\n"
+"              t1 = A._toClientException(e, request);\n"
+"              t3 = type\$.nullable_StackTrace._as(s);\n"
+"              t4 = controller._state;\n"
+"              if (t4 >= 4)\n"
+"                A.throwExpression(controller._badEventState\$0());\n"
+"              if ((t4 & 1) !== 0) {\n"
+"                varData = controller._varData;\n"
+"                t6 = t2._as((t4 & 8) !== 0 ? t5._as(varData).get\$_varData() : varData);\n"
+"                t6._addError\$2(t1, t3 == null ? B._StringStackTrace_OdL : t3);\n"
+"              }\n"
+"              \$async\$goto = 15;\n"
+"              return A._asyncAwait(controller.close\$0(), \$async\$_readStreamBody);\n"
+"            case 15:\n"
+"              // returning from await.\n"
+"            case 14:\n"
+"              // join\n"
+"              // goto after for\n"
+"              \$async\$goto = 7;\n"
+"              break;\n"
+"              // goto after finally\n"
+"              \$async\$goto = 11;\n"
+"              break;\n"
+"            case 8:\n"
 "              // uncaught\n"
 "              // goto rethrow\n"
 "              \$async\$goto = 2;\n"
 "              break;\n"
-"            case 16:\n"
+"            case 11:\n"
 "              // after finally\n"
-"            case 12:\n"
-"              // join\n"
-"              // goto the next finally handler\n"
-"              \$async\$goto = \$async\$next.pop();\n"
+"              if (A._asBool(chunk.done)) {\n"
+"                controller.closeSync\$0();\n"
+"                // goto after for\n"
+"                \$async\$goto = 7;\n"
+"                break;\n"
+"              } else {\n"
+"                t8 = chunk.value;\n"
+"                t8.toString;\n"
+"                t8 = t3._as(t1._as(t8));\n"
+"                t9 = controller._state;\n"
+"                if (t9 >= 4)\n"
+"                  A.throwExpression(controller._badEventState\$0());\n"
+"                if ((t9 & 1) !== 0) {\n"
+"                  varData = controller._varData;\n"
+"                  t2._as((t9 & 8) !== 0 ? t5._as(varData).get\$_varData() : varData)._add\$1(t8);\n"
+"                }\n"
+"              }\n"
+"              t8 = controller._state;\n"
+"              if ((t8 & 1) !== 0) {\n"
+"                varData = controller._varData;\n"
+"                t9 = (t2._as((t8 & 8) !== 0 ? t5._as(varData).get\$_varData() : varData)._state & 4) !== 0;\n"
+"                t8 = t9;\n"
+"              } else\n"
+"                t8 = (t8 & 2) === 0;\n"
+"              \$async\$goto = t8 ? 16 : 17;\n"
 "              break;\n"
-"            case 6:\n"
-"              // after finally\n"
+"            case 16:\n"
+"              // then\n"
+"              t8 = _box_0.resumeSignal;\n"
+"              \$async\$goto = 18;\n"
+"              return A._asyncAwait((t8 == null ? _box_0.resumeSignal = new A._AsyncCompleter(new A._Future(\$.Zone__current, t6), t7) : t8).future, \$async\$_readStreamBody);\n"
+"            case 18:\n"
+"              // returning from await.\n"
+"            case 17:\n"
+"              // join\n"
+"              if ((controller._state & 1) === 0) {\n"
+"                // goto after for\n"
+"                \$async\$goto = 7;\n"
+"                break;\n"
+"              }\n"
+"              // goto for condition\n"
+"              \$async\$goto = 6;\n"
+"              break;\n"
+"            case 7:\n"
+"              // after for\n"
 "            case 1:\n"
 "              // return\n"
-"              return A._asyncStarHelper(null, 0, \$async\$controller);\n"
+"              return A._asyncReturn(\$async\$returnValue, \$async\$completer);\n"
 "            case 2:\n"
 "              // rethrow\n"
-"              return A._asyncStarHelper(\$async\$errorStack.at(-1), 1, \$async\$controller);\n"
+"              return A._asyncRethrow(\$async\$errorStack.at(-1), \$async\$completer);\n"
 "          }\n"
 "      });\n"
-"      var \$async\$goto = 0,\n"
-"        \$async\$controller = A._makeAsyncStarStreamController(\$async\$_readBody, type\$.List_int),\n"
-"        \$async\$nextWhenCanceled, \$async\$handler = 2, \$async\$errorStack = [], \$async\$next = [], isDone, chunk, e, st, e0, st0, t2, t3, exception, _box_0, t1, bodyStreamReader, \$async\$exception, \$async\$exception1;\n"
-"      return A._streamOfController(\$async\$controller);\n"
+"      return A._asyncStartSync(\$async\$_readStreamBody, \$async\$completer);\n"
 "    },\n"
 "    BrowserClient: function BrowserClient(t0) {\n"
-"      this._abortController = t0;\n"
 "      this.withCredentials = false;\n"
+"      this._openRequestAbortControllers = t0;\n"
 "    },\n"
 "    BrowserClient_send_closure: function BrowserClient_send_closure(t0) {\n"
 "      this.headers = t0;\n"
 "    },\n"
-"    _readBody_closure: function _readBody_closure() {\n"
+"    _bodyToStream_closure: function _bodyToStream_closure(t0, t1) {\n"
+"      this.request = t0;\n"
+"      this.response = t1;\n"
 "    },\n"
-"    _readBody_closure0: function _readBody_closure0(t0) {\n"
+"    _readStreamBody_closure: function _readStreamBody_closure(t0) {\n"
 "      this._box_0 = t0;\n"
 "    },\n"
+"    _readStreamBody_closure0: function _readStreamBody_closure0(t0, t1, t2) {\n"
+"      this._box_0 = t0;\n"
+"      this.reader = t1;\n"
+"      this.request = t2;\n"
+"    },\n"
 "    ByteStream: function ByteStream(t0) {\n"
 "      this._stream = t0;\n"
 "    },\n"
@@ -8325,10 +8253,10 @@
 "      _.text = t3;\n"
 "    },\n"
 "    SseClient\$(serverUrl, debugKey) {\n"
-"      var t3, t4, t5, _null = null,\n"
+"      var t3, t4, t5,\n"
 "        t1 = type\$.String,\n"
-"        t2 = A.StreamController_StreamController(_null, _null, _null, t1);\n"
-"      t1 = A.StreamController_StreamController(_null, _null, _null, t1);\n"
+"        t2 = A.StreamController_StreamController(t1);\n"
+"      t1 = A.StreamController_StreamController(t1);\n"
 "      t3 = A.Logger_Logger(\"SseClient\");\n"
 "      t4 = \$.Zone__current;\n"
 "      t5 = A.generateId();\n"
@@ -8443,7 +8371,7 @@
 "              t1 = type\$.JSArray_nullable_Object._as(new t1());\n"
 "              webSocket = A._asJSObject(new t2(t3, t1));\n"
 "              webSocket.binaryType = \"arraybuffer\";\n"
-"              browserSocket = new A.BrowserWebSocket(webSocket, A.StreamController_StreamController(null, null, null, type\$.WebSocketEvent));\n"
+"              browserSocket = new A.BrowserWebSocket(webSocket, A.StreamController_StreamController(type\$.WebSocketEvent));\n"
 "              t1 = new A._Future(\$.Zone__current, type\$._Future_BrowserWebSocket);\n"
 "              webSocketConnected = new A._AsyncCompleter(t1, type\$._AsyncCompleter_BrowserWebSocket);\n"
 "              if (A._asInt(webSocket.readyState) === 1)\n"
@@ -8657,7 +8585,7 @@
 "          switch (\$async\$goto) {\n"
 "            case 0:\n"
 "              // Function start\n"
-"              client = new A.BrowserClient(A._asJSObject(new init.G.AbortController()));\n"
+"              client = new A.BrowserClient(A._setArrayType([], type\$.JSArray_JSObject));\n"
 "              client.withCredentials = true;\n"
 "              \$async\$goto = 3;\n"
 "              return A._asyncAwait(client._sendUnstreamed\$3(\"GET\", A.Uri_parse(authUrl), null), \$async\$_authenticateUser);\n"
@@ -9484,6 +9412,16 @@
 "        throw A.wrapException(A.diagnoseIndexError(receiver, -1));\n"
 "      return receiver.pop();\n"
 "    },\n"
+"    remove\$1(receiver, element) {\n"
+"      var i;\n"
+"      receiver.\$flags & 1 && A.throwUnsupportedOperation(receiver, \"remove\", 1);\n"
+"      for (i = 0; i < receiver.length; ++i)\n"
+"        if (J.\$eq\$(receiver[i], element)) {\n"
+"          receiver.splice(i, 1);\n"
+"          return true;\n"
+"        }\n"
+"      return false;\n"
+"    },\n"
 "    _removeWhere\$2(receiver, test, removeMatching) {\n"
 "      var retained, end, i, element, t1;\n"
 "      A._arrayInstanceType(receiver)._eval\$1(\"bool(1)\")._as(test);\n"
@@ -10327,7 +10265,7 @@
 "    call\$0() {\n"
 "      return A.Future_Future\$value(null, type\$.void);\n"
 "    },\n"
-"    \$signature: 10\n"
+"    \$signature: 5\n"
 "  };\n"
 "  A.SentinelValue.prototype = {};\n"
 "  A.EfficientLengthIterable.prototype = {};\n"
@@ -11323,19 +11261,19 @@
 "    call\$1(o) {\n"
 "      return this.getTag(o);\n"
 "    },\n"
-"    \$signature: 20\n"
+"    \$signature: 16\n"
 "  };\n"
 "  A.initHooks_closure0.prototype = {\n"
 "    call\$2(o, tag) {\n"
 "      return this.getUnknownTag(o, tag);\n"
 "    },\n"
-"    \$signature: 74\n"
+"    \$signature: 58\n"
 "  };\n"
 "  A.initHooks_closure1.prototype = {\n"
 "    call\$1(tag) {\n"
 "      return this.prototypeForTag(A._asString(tag));\n"
 "    },\n"
-"    \$signature: 30\n"
+"    \$signature: 55\n"
 "  };\n"
 "  A._Record.prototype = {\n"
 "    get\$runtimeType(_) {\n"
@@ -11843,7 +11781,7 @@
 "      t1.storedCallback = null;\n"
 "      f.call\$0();\n"
 "    },\n"
-"    \$signature: 4\n"
+"    \$signature: 8\n"
 "  };\n"
 "  A._AsyncRun__initializeScheduleImmediate_closure.prototype = {\n"
 "    call\$1(callback) {\n"
@@ -11853,7 +11791,7 @@
 "      t2 = this.span;\n"
 "      t1.firstChild ? t1.removeChild(t2) : t1.appendChild(t2);\n"
 "    },\n"
-"    \$signature: 59\n"
+"    \$signature: 90\n"
 "  };\n"
 "  A._AsyncRun__scheduleImmediateJsOverride_internalCallback.prototype = {\n"
 "    call\$0() {\n"
@@ -11953,104 +11891,19 @@
 "    call\$1(result) {\n"
 "      return this.bodyFunction.call\$2(0, result);\n"
 "    },\n"
-"    \$signature: 5\n"
+"    \$signature: 4\n"
 "  };\n"
 "  A._awaitOnObject_closure0.prototype = {\n"
 "    call\$2(error, stackTrace) {\n"
 "      this.bodyFunction.call\$2(1, new A.ExceptionAndStackTrace(error, type\$.StackTrace._as(stackTrace)));\n"
 "    },\n"
-"    \$signature: 31\n"
+"    \$signature: 41\n"
 "  };\n"
 "  A._wrapJsFunctionForAsync_closure.prototype = {\n"
 "    call\$2(errorCode, result) {\n"
 "      this.\$protected(A._asInt(errorCode), result);\n"
 "    },\n"
-"    \$signature: 48\n"
-"  };\n"
-"  A._asyncStarHelper_closure.prototype = {\n"
-"    call\$0() {\n"
-"      var t3,\n"
-"        t1 = this.controller,\n"
-"        t2 = t1.___AsyncStarStreamController_controller_A;\n"
-"      t2 === \$ && A.throwLateFieldNI(\"controller\");\n"
-"      t3 = t2._state;\n"
-"      if ((t3 & 1) !== 0 ? (t2.get\$_subscription()._state & 4) !== 0 : (t3 & 2) === 0) {\n"
-"        t1.isSuspended = true;\n"
-"        return;\n"
-"      }\n"
-"      t1 = t1.cancelationFuture != null ? 2 : 0;\n"
-"      this.bodyFunction.call\$2(t1, null);\n"
-"    },\n"
-"    \$signature: 0\n"
-"  };\n"
-"  A._asyncStarHelper_closure0.prototype = {\n"
-"    call\$1(__wc0_formal) {\n"
-"      var errorCode = this.controller.cancelationFuture != null ? 2 : 0;\n"
-"      this.bodyFunction.call\$2(errorCode, null);\n"
-"    },\n"
-"    \$signature: 4\n"
-"  };\n"
-"  A._AsyncStarStreamController.prototype = {\n"
-"    _AsyncStarStreamController\$1(body, \$T) {\n"
-"      var _this = this,\n"
-"        t1 = new A._AsyncStarStreamController__resumeBody(body);\n"
-"      _this.___AsyncStarStreamController_controller_A = _this.\$ti._eval\$1(\"StreamController<1>\")._as(A.StreamController_StreamController(new A._AsyncStarStreamController_closure(_this, body), new A._AsyncStarStreamController_closure0(t1), new A._AsyncStarStreamController_closure1(_this, t1), \$T));\n"
-"    }\n"
-"  };\n"
-"  A._AsyncStarStreamController__resumeBody.prototype = {\n"
-"    call\$0() {\n"
-"      A.scheduleMicrotask(new A._AsyncStarStreamController__resumeBody_closure(this.body));\n"
-"    },\n"
-"    \$signature: 1\n"
-"  };\n"
-"  A._AsyncStarStreamController__resumeBody_closure.prototype = {\n"
-"    call\$0() {\n"
-"      this.body.call\$2(0, null);\n"
-"    },\n"
-"    \$signature: 0\n"
-"  };\n"
-"  A._AsyncStarStreamController_closure0.prototype = {\n"
-"    call\$0() {\n"
-"      this._resumeBody.call\$0();\n"
-"    },\n"
-"    \$signature: 0\n"
-"  };\n"
-"  A._AsyncStarStreamController_closure1.prototype = {\n"
-"    call\$0() {\n"
-"      var t1 = this.\$this;\n"
-"      if (t1.isSuspended) {\n"
-"        t1.isSuspended = false;\n"
-"        this._resumeBody.call\$0();\n"
-"      }\n"
-"    },\n"
-"    \$signature: 0\n"
-"  };\n"
-"  A._AsyncStarStreamController_closure.prototype = {\n"
-"    call\$0() {\n"
-"      var t1 = this.\$this,\n"
-"        t2 = t1.___AsyncStarStreamController_controller_A;\n"
-"      t2 === \$ && A.throwLateFieldNI(\"controller\");\n"
-"      if ((t2._state & 4) === 0) {\n"
-"        t1.cancelationFuture = new A._Future(\$.Zone__current, type\$._Future_dynamic);\n"
-"        if (t1.isSuspended) {\n"
-"          t1.isSuspended = false;\n"
-"          A.scheduleMicrotask(new A._AsyncStarStreamController__closure(this.body));\n"
-"        }\n"
-"        return t1.cancelationFuture;\n"
-"      }\n"
-"    },\n"
-"    \$signature: 55\n"
-"  };\n"
-"  A._AsyncStarStreamController__closure.prototype = {\n"
-"    call\$0() {\n"
-"      this.body.call\$2(2, null);\n"
-"    },\n"
-"    \$signature: 0\n"
-"  };\n"
-"  A._IterationMarker.prototype = {\n"
-"    toString\$0(_) {\n"
-"      return \"IterationMarker(\" + this.state + \", \" + A.S(this.value) + \")\";\n"
-"    }\n"
+"    \$signature: 43\n"
 "  };\n"
 "  A.AsyncError.prototype = {\n"
 "    toString\$0(_) {\n"
@@ -12195,23 +12048,14 @@
 "      this._addListener\$1(new A._FutureListener(result, 19, f, onError, t1._eval\$1(\"@<1>\")._bind\$1(\$E)._eval\$1(\"_FutureListener<1,2>\")));\n"
 "      return result;\n"
 "    },\n"
-"    catchError\$2\$test(onError, test) {\n"
-"      var t1, t2, result;\n"
-"      type\$.nullable_bool_Function_Object._as(test);\n"
-"      t1 = this.\$ti;\n"
-"      t2 = \$.Zone__current;\n"
-"      result = new A._Future(t2, t1);\n"
-"      if (t2 !== B.C__RootZone) {\n"
-"        onError = A._registerErrorHandler(onError, t2);\n"
-"        if (test != null)\n"
-"          test = t2.registerUnaryCallback\$2\$1(test, type\$.bool, type\$.Object);\n"
-"      }\n"
-"      t2 = test == null ? 2 : 6;\n"
-"      this._addListener\$1(new A._FutureListener(result, t2, test, onError, t1._eval\$1(\"_FutureListener<1,1>\")));\n"
-"      return result;\n"
-"    },\n"
 "    catchError\$1(onError) {\n"
-"      return this.catchError\$2\$test(onError, null);\n"
+"      var t1 = this.\$ti,\n"
+"        t2 = \$.Zone__current,\n"
+"        result = new A._Future(t2, t1);\n"
+"      if (t2 !== B.C__RootZone)\n"
+"        onError = A._registerErrorHandler(onError, t2);\n"
+"      this._addListener\$1(new A._FutureListener(result, 2, null, onError, t1._eval\$1(\"_FutureListener<1,1>\")));\n"
+"      return result;\n"
 "    },\n"
 "    whenComplete\$1(action) {\n"
 "      var t1, t2, result;\n"
@@ -12455,7 +12299,7 @@
 "    call\$1(__wc0_formal) {\n"
 "      this.joinedResult._completeWithResultOf\$1(this.originalSource);\n"
 "    },\n"
-"    \$signature: 4\n"
+"    \$signature: 8\n"
 "  };\n"
 "  A._Future__propagateToListeners_handleWhenCompleteCallback_closure0.prototype = {\n"
 "    call\$2(e, s) {\n"
@@ -12634,10 +12478,10 @@
 "      if ((_this._state & 8) === 0)\n"
 "        return A._instanceType(_this)._eval\$1(\"_PendingEvents<1>?\")._as(_this._varData);\n"
 "      t1 = A._instanceType(_this);\n"
-"      return t1._eval\$1(\"_PendingEvents<1>?\")._as(t1._eval\$1(\"_StreamControllerAddStreamState<1>\")._as(_this._varData)._varData);\n"
+"      return t1._eval\$1(\"_PendingEvents<1>?\")._as(t1._eval\$1(\"_StreamControllerAddStreamState<1>\")._as(_this._varData).get\$_varData());\n"
 "    },\n"
 "    _ensurePendingEvents\$0() {\n"
-"      var events, t1, state, _this = this;\n"
+"      var events, t1, _this = this;\n"
 "      if ((_this._state & 8) === 0) {\n"
 "        events = _this._varData;\n"
 "        if (events == null)\n"
@@ -12645,16 +12489,13 @@
 "        return A._instanceType(_this)._eval\$1(\"_PendingEvents<1>\")._as(events);\n"
 "      }\n"
 "      t1 = A._instanceType(_this);\n"
-"      state = t1._eval\$1(\"_StreamControllerAddStreamState<1>\")._as(_this._varData);\n"
-"      events = state._varData;\n"
-"      if (events == null)\n"
-"        events = state._varData = new A._PendingEvents(t1._eval\$1(\"_PendingEvents<1>\"));\n"
+"      events = t1._eval\$1(\"_StreamControllerAddStreamState<1>\")._as(_this._varData).get\$_varData();\n"
 "      return t1._eval\$1(\"_PendingEvents<1>\")._as(events);\n"
 "    },\n"
 "    get\$_subscription() {\n"
 "      var varData = this._varData;\n"
 "      if ((this._state & 8) !== 0)\n"
-"        varData = type\$._StreamControllerAddStreamState_nullable_Object._as(varData)._varData;\n"
+"        varData = type\$._StreamControllerAddStreamState_nullable_Object._as(varData).get\$_varData();\n"
 "      return A._instanceType(this)._eval\$1(\"_ControllerSubscription<1>\")._as(varData);\n"
 "    },\n"
 "    _badEventState\$0() {\n"
@@ -12662,31 +12503,6 @@
 "        return new A.StateError(\"Cannot add event after closing\");\n"
 "      return new A.StateError(\"Cannot add event while adding a stream\");\n"
 "    },\n"
-"    addStream\$2\$cancelOnError(source, cancelOnError) {\n"
-"      var t2, t3, t4, t5, t6, _this = this,\n"
-"        t1 = A._instanceType(_this);\n"
-"      t1._eval\$1(\"Stream<1>\")._as(source);\n"
-"      t2 = _this._state;\n"
-"      if (t2 >= 4)\n"
-"        throw A.wrapException(_this._badEventState\$0());\n"
-"      if ((t2 & 2) !== 0) {\n"
-"        t1 = new A._Future(\$.Zone__current, type\$._Future_dynamic);\n"
-"        t1._asyncComplete\$1(null);\n"
-"        return t1;\n"
-"      }\n"
-"      t2 = _this._varData;\n"
-"      t3 = cancelOnError === true;\n"
-"      t4 = new A._Future(\$.Zone__current, type\$._Future_dynamic);\n"
-"      t5 = t1._eval\$1(\"~(1)\")._as(_this.get\$_add());\n"
-"      t6 = t3 ? A._AddStreamState_makeErrorHandler(_this) : _this.get\$_addError();\n"
-"      t6 = source.listen\$4\$cancelOnError\$onDone\$onError(t5, t3, _this.get\$_close(), t6);\n"
-"      t3 = _this._state;\n"
-"      if ((t3 & 1) !== 0 ? (_this.get\$_subscription()._state & 4) !== 0 : (t3 & 2) === 0)\n"
-"        t6.pause\$0();\n"
-"      _this._varData = new A._StreamControllerAddStreamState(t2, t4, t6, t1._eval\$1(\"_StreamControllerAddStreamState<1>\"));\n"
-"      _this._state |= 8;\n"
-"      return t4;\n"
-"    },\n"
 "    _ensureDoneFuture\$0() {\n"
 "      var t1 = this._doneFuture;\n"
 "      if (t1 == null)\n"
@@ -12700,16 +12516,6 @@
 "        throw A.wrapException(_this._badEventState\$0());\n"
 "      _this._add\$1(value);\n"
 "    },\n"
-"    addError\$2(error, stackTrace) {\n"
-"      var _0_0;\n"
-"      if (this._state >= 4)\n"
-"        throw A.wrapException(this._badEventState\$0());\n"
-"      _0_0 = A._interceptUserError(error, stackTrace);\n"
-"      this._addError\$2(_0_0.error, _0_0.stackTrace);\n"
-"    },\n"
-"    addError\$1(error) {\n"
-"      return this.addError\$2(error, null);\n"
-"    },\n"
 "    close\$0() {\n"
 "      var _this = this,\n"
 "        t1 = _this._state;\n"
@@ -12737,23 +12543,6 @@
 "      else if ((t2 & 3) === 0)\n"
 "        _this._ensurePendingEvents\$0().add\$1(0, new A._DelayedData(value, t1._eval\$1(\"_DelayedData<1>\")));\n"
 "    },\n"
-"    _addError\$2(error, stackTrace) {\n"
-"      var t1;\n"
-"      A._asObject(error);\n"
-"      type\$.StackTrace._as(stackTrace);\n"
-"      t1 = this._state;\n"
-"      if ((t1 & 1) !== 0)\n"
-"        this._sendError\$2(error, stackTrace);\n"
-"      else if ((t1 & 3) === 0)\n"
-"        this._ensurePendingEvents\$0().add\$1(0, new A._DelayedError(error, stackTrace));\n"
-"    },\n"
-"    _close\$0() {\n"
-"      var _this = this,\n"
-"        addState = A._instanceType(_this)._eval\$1(\"_StreamControllerAddStreamState<1>\")._as(_this._varData);\n"
-"      _this._varData = addState._varData;\n"
-"      _this._state &= 4294967287;\n"
-"      addState.addStreamFuture._asyncComplete\$1(null);\n"
-"    },\n"
 "    _subscribe\$4(onData, onError, onDone, cancelOnError) {\n"
 "      var t2, t3, t4, t5, t6, t7, subscription, pendingEvents, addState, _this = this,\n"
 "        t1 = A._instanceType(_this);\n"
@@ -12771,8 +12560,8 @@
 "      pendingEvents = _this.get\$_pendingEvents();\n"
 "      if (((_this._state |= 1) & 8) !== 0) {\n"
 "        addState = t1._eval\$1(\"_StreamControllerAddStreamState<1>\")._as(_this._varData);\n"
-"        addState._varData = subscription;\n"
-"        addState.addSubscription.resume\$0();\n"
+"        addState.set\$_varData(subscription);\n"
+"        addState.resume\$0();\n"
 "      } else\n"
 "        _this._varData = subscription;\n"
 "      subscription._setPendingEvents\$1(pendingEvents);\n"
@@ -12816,6 +12605,12 @@
 "    set\$onListen(onListen) {\n"
 "      this.onListen = type\$.nullable_void_Function._as(onListen);\n"
 "    },\n"
+"    set\$onResume(onResume) {\n"
+"      this.onResume = type\$.nullable_void_Function._as(onResume);\n"
+"    },\n"
+"    set\$onCancel(onCancel) {\n"
+"      this.onCancel = type\$.nullable_void_Function._as(onCancel);\n"
+"    },\n"
 "    \$isStreamSink: 1,\n"
 "    \$isStreamController: 1,\n"
 "    \$is_StreamControllerLifecycle: 1,\n"
@@ -12838,7 +12633,7 @@
 "  };\n"
 "  A._AsyncStreamControllerDispatch.prototype = {\n"
 "    _sendData\$1(data) {\n"
-"      var t1 = this.\$ti;\n"
+"      var t1 = A._instanceType(this);\n"
 "      t1._precomputed1._as(data);\n"
 "      this.get\$_subscription()._addPending\$1(new A._DelayedData(data, t1._eval\$1(\"_DelayedData<1>\")));\n"
 "    },\n"
@@ -12871,7 +12666,7 @@
 "        t2 = A._instanceType(t1);\n"
 "      t2._eval\$1(\"StreamSubscription<1>\")._as(this);\n"
 "      if ((t1._state & 8) !== 0)\n"
-"        t2._eval\$1(\"_StreamControllerAddStreamState<1>\")._as(t1._varData).addSubscription.pause\$0();\n"
+"        t2._eval\$1(\"_StreamControllerAddStreamState<1>\")._as(t1._varData).pause\$0();\n"
 "      A._runGuarded(t1.onPause);\n"
 "    },\n"
 "    _onResume\$0() {\n"
@@ -12879,32 +12674,11 @@
 "        t2 = A._instanceType(t1);\n"
 "      t2._eval\$1(\"StreamSubscription<1>\")._as(this);\n"
 "      if ((t1._state & 8) !== 0)\n"
-"        t2._eval\$1(\"_StreamControllerAddStreamState<1>\")._as(t1._varData).addSubscription.resume\$0();\n"
+"        t2._eval\$1(\"_StreamControllerAddStreamState<1>\")._as(t1._varData).resume\$0();\n"
 "      A._runGuarded(t1.onResume);\n"
 "    }\n"
 "  };\n"
 "  A._StreamSinkWrapper.prototype = {\$isStreamSink: 1};\n"
-"  A._AddStreamState.prototype = {\n"
-"    cancel\$0() {\n"
-"      var cancel = this.addSubscription.cancel\$0();\n"
-"      return cancel.whenComplete\$1(new A._AddStreamState_cancel_closure(this));\n"
-"    }\n"
-"  };\n"
-"  A._AddStreamState_makeErrorHandler_closure.prototype = {\n"
-"    call\$2(e, s) {\n"
-"      var t1 = this.controller;\n"
-"      t1._addError\$2(A._asObject(e), type\$.StackTrace._as(s));\n"
-"      t1._close\$0();\n"
-"    },\n"
-"    \$signature: 3\n"
-"  };\n"
-"  A._AddStreamState_cancel_closure.prototype = {\n"
-"    call\$0() {\n"
-"      this.\$this.addStreamFuture._asyncComplete\$1(null);\n"
-"    },\n"
-"    \$signature: 1\n"
-"  };\n"
-"  A._StreamControllerAddStreamState.prototype = {};\n"
 "  A._BufferingStreamSubscription.prototype = {\n"
 "    _setPendingEvents\$1(pendingEvents) {\n"
 "      var _this = this;\n"
@@ -13368,6 +13142,44 @@
 "      return this.listen\$4\$cancelOnError\$onDone\$onError(onData, cancelOnError, onDone, null);\n"
 "    }\n"
 "  };\n"
+"  A._MultiStream.prototype = {\n"
+"    listen\$4\$cancelOnError\$onDone\$onError(onData, cancelOnError, onDone, onError) {\n"
+"      var controller, _null = null,\n"
+"        t1 = this.\$ti;\n"
+"      t1._eval\$1(\"~(1)?\")._as(onData);\n"
+"      type\$.nullable_void_Function._as(onDone);\n"
+"      controller = new A._MultiStreamController(_null, _null, _null, _null, t1._eval\$1(\"_MultiStreamController<1>\"));\n"
+"      controller.set\$onListen(new A._MultiStream_listen_closure(this, controller));\n"
+"      return controller._subscribe\$4(onData, onError, onDone, cancelOnError === true);\n"
+"    },\n"
+"    listen\$3\$onDone\$onError(onData, onDone, onError) {\n"
+"      return this.listen\$4\$cancelOnError\$onDone\$onError(onData, null, onDone, onError);\n"
+"    },\n"
+"    listen\$3\$cancelOnError\$onDone(onData, cancelOnError, onDone) {\n"
+"      return this.listen\$4\$cancelOnError\$onDone\$onError(onData, cancelOnError, onDone, null);\n"
+"    }\n"
+"  };\n"
+"  A._MultiStream_listen_closure.prototype = {\n"
+"    call\$0() {\n"
+"      this.\$this._onListen.call\$1(this.controller);\n"
+"    },\n"
+"    \$signature: 0\n"
+"  };\n"
+"  A._MultiStreamController.prototype = {\n"
+"    closeSync\$0() {\n"
+"      var _this = this,\n"
+"        t1 = _this._state;\n"
+"      if ((t1 & 4) !== 0)\n"
+"        return;\n"
+"      if (t1 >= 4)\n"
+"        throw A.wrapException(_this._badEventState\$0());\n"
+"      t1 |= 4;\n"
+"      _this._state = t1;\n"
+"      if ((t1 & 1) !== 0)\n"
+"        _this.get\$_subscription()._close\$0();\n"
+"    },\n"
+"    \$isMultiStreamController: 1\n"
+"  };\n"
 "  A._cancelAndValue_closure.prototype = {\n"
 "    call\$0() {\n"
 "      return this.future._complete\$1(this.value);\n"
@@ -13932,7 +13744,7 @@
 "          t2._processUncaughtError\$3(zone, A._asObject(e), t1._as(s));\n"
 "      }\n"
 "    },\n"
-"    \$signature: 33\n"
+"    \$signature: 31\n"
 "  };\n"
 "  A._ZoneDelegate.prototype = {\$isZoneDelegate: 1};\n"
 "  A._rootHandleError_closure.prototype = {\n"
@@ -14206,7 +14018,7 @@
 "    call\$1(v) {\n"
 "      return this.K._is(v);\n"
 "    },\n"
-"    \$signature: 42\n"
+"    \$signature: 32\n"
 "  };\n"
 "  A._HashSet.prototype = {\n"
 "    get\$iterator(_) {\n"
@@ -14429,21 +14241,6 @@
 "    take\$1(receiver, count) {\n"
 "      return A.SubListIterable\$(receiver, 0, A.checkNotNullable(count, \"count\", type\$.int), A.instanceType(receiver)._eval\$1(\"ListBase.E\"));\n"
 "    },\n"
-"    toList\$1\$growable(receiver, growable) {\n"
-"      var t1, first, result, i, _this = this;\n"
-"      if (_this.get\$isEmpty(receiver)) {\n"
-"        t1 = J.JSArray_JSArray\$growable(0, A.instanceType(receiver)._eval\$1(\"ListBase.E\"));\n"
-"        return t1;\n"
-"      }\n"
-"      first = _this.\$index(receiver, 0);\n"
-"      result = A.List_List\$filled(_this.get\$length(receiver), first, true, A.instanceType(receiver)._eval\$1(\"ListBase.E\"));\n"
-"      for (i = 1; i < _this.get\$length(receiver); ++i)\n"
-"        B.JSArray_methods.\$indexSet(result, i, _this.\$index(receiver, i));\n"
-"      return result;\n"
-"    },\n"
-"    toList\$0(receiver) {\n"
-"      return this.toList\$1\$growable(receiver, true);\n"
-"    },\n"
 "    add\$1(receiver, element) {\n"
 "      var t1;\n"
 "      A.instanceType(receiver)._eval\$1(\"ListBase.E\")._as(element);\n"
@@ -14550,7 +14347,7 @@
 "      t2 = A.S(v);\n"
 "      t1._contents += t2;\n"
 "    },\n"
-"    \$signature: 17\n"
+"    \$signature: 18\n"
 "  };\n"
 "  A._UnmodifiableMapMixin.prototype = {\n"
 "    \$indexSet(_, key, value) {\n"
@@ -15158,7 +14955,7 @@
 "      }\n"
 "      return null;\n"
 "    },\n"
-"    \$signature: 18\n"
+"    \$signature: 19\n"
 "  };\n"
 "  A._Utf8Decoder__decoderNonfatal_closure.prototype = {\n"
 "    call\$0() {\n"
@@ -15170,7 +14967,7 @@
 "      }\n"
 "      return null;\n"
 "    },\n"
-"    \$signature: 18\n"
+"    \$signature: 19\n"
 "  };\n"
 "  A.AsciiCodec.prototype = {\n"
 "    encode\$1(source) {\n"
@@ -15603,7 +15400,7 @@
 "      B.JSArray_methods.\$indexSet(t1, t2.i++, key);\n"
 "      B.JSArray_methods.\$indexSet(t1, t2.i++, value);\n"
 "    },\n"
-"    \$signature: 17\n"
+"    \$signature: 18\n"
 "  };\n"
 "  A._JsonStringStringifier.prototype = {\n"
 "    get\$_partialResult() {\n"
@@ -16353,7 +16150,7 @@
 "    call\$2(msg, position) {\n"
 "      throw A.wrapException(A.FormatException\$(\"Illegal IPv6 address, \" + msg, this.host, position));\n"
 "    },\n"
-"    \$signature: 89\n"
+"    \$signature: 48\n"
 "  };\n"
 "  A._Uri.prototype = {\n"
 "    get\$_text() {\n"
@@ -16653,7 +16450,7 @@
 "    call\$1(s) {\n"
 "      return A._Uri__uriEncode(64, A._asString(s), B.C_Utf8Codec, false);\n"
 "    },\n"
-"    \$signature: 11\n"
+"    \$signature: 9\n"
 "  };\n"
 "  A.UriData.prototype = {\n"
 "    get\$uri() {\n"
@@ -16985,7 +16782,7 @@
 "      var t1 = type\$.JavaScriptFunction;\n"
 "      this._this.then\$1\$2\$onError(new A.FutureOfJSAnyToJSPromise_get_toJS__closure(t1._as(resolve)), new A.FutureOfJSAnyToJSPromise_get_toJS__closure0(t1._as(reject)), type\$.nullable_Object);\n"
 "    },\n"
-"    \$signature: 19\n"
+"    \$signature: 20\n"
 "  };\n"
 "  A.FutureOfJSAnyToJSPromise_get_toJS__closure.prototype = {\n"
 "    call\$1(value) {\n"
@@ -16993,7 +16790,7 @@
 "      t1.call(t1, value);\n"
 "      return value;\n"
 "    },\n"
-"    \$signature: 12\n"
+"    \$signature: 10\n"
 "  };\n"
 "  A.FutureOfJSAnyToJSPromise_get_toJS__closure0.prototype = {\n"
 "    call\$2(error, stackTrace) {\n"
@@ -17011,14 +16808,14 @@
 "      t1.call(t1, wrapper);\n"
 "      return wrapper;\n"
 "    },\n"
-"    \$signature: 44\n"
+"    \$signature: 59\n"
 "  };\n"
 "  A.FutureOfVoidToJSPromise_get_toJS_closure.prototype = {\n"
 "    call\$2(resolve, reject) {\n"
 "      var t1 = type\$.JavaScriptFunction;\n"
 "      this._this.then\$1\$2\$onError(new A.FutureOfVoidToJSPromise_get_toJS__closure(t1._as(resolve)), new A.FutureOfVoidToJSPromise_get_toJS__closure0(t1._as(reject)), type\$.nullable_Object);\n"
 "    },\n"
-"    \$signature: 19\n"
+"    \$signature: 20\n"
 "  };\n"
 "  A.FutureOfVoidToJSPromise_get_toJS__closure.prototype = {\n"
 "    call\$1(__wc0_formal) {\n"
@@ -17068,13 +16865,13 @@
 "      } else\n"
 "        return o;\n"
 "    },\n"
-"    \$signature: 12\n"
+"    \$signature: 10\n"
 "  };\n"
 "  A.promiseToFuture_closure.prototype = {\n"
 "    call\$1(r) {\n"
 "      return this.completer.complete\$1(this.T._eval\$1(\"0/?\")._as(r));\n"
 "    },\n"
-"    \$signature: 5\n"
+"    \$signature: 4\n"
 "  };\n"
 "  A.promiseToFuture_closure0.prototype = {\n"
 "    call\$1(e) {\n"
@@ -17082,7 +16879,7 @@
 "        return this.completer.completeError\$1(new A.NullRejectionException(e === undefined));\n"
 "      return this.completer.completeError\$1(e);\n"
 "    },\n"
-"    \$signature: 5\n"
+"    \$signature: 4\n"
 "  };\n"
 "  A.dartify_convert.prototype = {\n"
 "    call\$1(o) {\n"
@@ -17134,7 +16931,7 @@
 "      }\n"
 "      return o;\n"
 "    },\n"
-"    \$signature: 12\n"
+"    \$signature: 10\n"
 "  };\n"
 "  A._JSRandom.prototype = {\n"
 "    nextInt\$1(max) {\n"
@@ -17556,7 +17353,7 @@
 "    call\$0() {\n"
 "      throw A.wrapException(A.ArgumentError\$(\"Unknown BuildStatus: \" + this.json, null));\n"
 "    },\n"
-"    \$signature: 53\n"
+"    \$signature: 74\n"
 "  };\n"
 "  A.BuildResult.prototype = {\n"
 "    toJson\$0() {\n"
@@ -17632,7 +17429,7 @@
 "    call\$1(e) {\n"
 "      return type\$.DebugEvent._as(e).toJson\$0();\n"
 "    },\n"
-"    \$signature: 90\n"
+"    \$signature: 89\n"
 "  };\n"
 "  A.DebugInfo.prototype = {\n"
 "    toJson\$0() {\n"
@@ -18010,13 +17807,13 @@
 "    call\$0() {\n"
 "      return true;\n"
 "    },\n"
-"    \$signature: 22\n"
+"    \$signature: 21\n"
 "  };\n"
 "  A.BatchedStreamController__hasEventDuring_closure.prototype = {\n"
 "    call\$0() {\n"
 "      return false;\n"
 "    },\n"
-"    \$signature: 22\n"
+"    \$signature: 21\n"
 "  };\n"
 "  A.SocketClient.prototype = {};\n"
 "  A.SseSocketClient.prototype = {\n"
@@ -18045,14 +17842,14 @@
 "    call\$1(o) {\n"
 "      return J.toString\$0\$(o);\n"
 "    },\n"
-"    \$signature: 46\n"
+"    \$signature: 30\n"
 "  };\n"
 "  A.PersistentWebSocket.prototype = {\n"
 "    get\$_incomingStreamController() {\n"
 "      var result, _this = this,\n"
 "        value = _this.__PersistentWebSocket__incomingStreamController_FI;\n"
 "      if (value === \$) {\n"
-"        result = A.StreamController_StreamController(null, null, null, type\$.dynamic);\n"
+"        result = A.StreamController_StreamController(type\$.dynamic);\n"
 "        result.set\$onListen(_this.get\$_listenWithRetry());\n"
 "        _this.__PersistentWebSocket__incomingStreamController_FI !== \$ && A.throwLateFieldADI(\"_incomingStreamController\");\n"
 "        _this.__PersistentWebSocket__incomingStreamController_FI = result;\n"
@@ -18222,9 +18019,9 @@
 "    call\$1(socket) {\n"
 "      var _this = this;\n"
 "      type\$.WebSocket._as(socket);\n"
-"      return new A.PersistentWebSocket(_this.logger, _this.debugName, _this.maxRetryAttempts, new A._AsyncCompleter(new A._Future(\$.Zone__current, type\$._Future_void), type\$._AsyncCompleter_void), _this.uri, _this.onReconnect, socket, A.StreamController_StreamController(null, null, null, type\$.dynamic));\n"
+"      return new A.PersistentWebSocket(_this.logger, _this.debugName, _this.maxRetryAttempts, new A._AsyncCompleter(new A._Future(\$.Zone__current, type\$._Future_void), type\$._AsyncCompleter_void), _this.uri, _this.onReconnect, socket, A.StreamController_StreamController(type\$.dynamic));\n"
 "    },\n"
-"    \$signature: 32\n"
+"    \$signature: 29\n"
 "  };\n"
 "  A.PersistentWebSocket__listenWithRetry_attemptRetry.prototype = {\n"
 "    call\$1(message) {\n"
@@ -18251,7 +18048,7 @@
 "      });\n"
 "      return A._asyncStartSync(\$async\$call\$1, \$async\$completer);\n"
 "    },\n"
-"    \$signature: 23\n"
+"    \$signature: 22\n"
 "  };\n"
 "  A.PersistentWebSocket__listenWithRetry_closure.prototype = {\n"
 "    call\$1(e) {\n"
@@ -18318,7 +18115,7 @@
 "      });\n"
 "      return A._asyncStartSync(\$async\$call\$1, \$async\$completer);\n"
 "    },\n"
-"    \$signature: 34\n"
+"    \$signature: 33\n"
 "  };\n"
 "  A._PersistentWebSocket_Object_StreamChannelMixin.prototype = {};\n"
 "  A.safeUnawaited_closure.prototype = {\n"
@@ -18350,6 +18147,7 @@
 "    }\n"
 "  };\n"
 "  A._StackState.prototype = {};\n"
+"  A.RequestAbortedException.prototype = {};\n"
 "  A.BaseClient.prototype = {\n"
 "    _sendUnstreamed\$3(method, url, headers) {\n"
 "      var \$async\$goto = 0,\n"
@@ -18395,13 +18193,13 @@
 "    call\$2(key1, key2) {\n"
 "      return A._asString(key1).toLowerCase() === A._asString(key2).toLowerCase();\n"
 "    },\n"
-"    \$signature: 35\n"
+"    \$signature: 34\n"
 "  };\n"
 "  A.BaseRequest_closure0.prototype = {\n"
 "    call\$1(key) {\n"
 "      return B.JSString_methods.get\$hashCode(A._asString(key).toLowerCase());\n"
 "    },\n"
-"    \$signature: 36\n"
+"    \$signature: 35\n"
 "  };\n"
 "  A.BaseResponse.prototype = {\n"
 "    BaseResponse\$7\$contentLength\$headers\$isRedirect\$persistentConnection\$reasonPhrase\$request(statusCode, contentLength, headers, isRedirect, persistentConnection, reasonPhrase, request) {\n"
@@ -18422,7 +18220,7 @@
 "    send\$body\$BrowserClient(request) {\n"
 "      var \$async\$goto = 0,\n"
 "        \$async\$completer = A._makeAsyncAwaitCompleter(type\$.StreamedResponse),\n"
-"        \$async\$returnValue, \$async\$handler = 2, \$async\$errorStack = [], \$async\$self = this, bodyBytes, t1, _0_0, contentLength, header, response, contentLengthHeader, contentLength0, headers, e, st, t2, t3, _this, t4, t5, t6, t7, result, exception, \$async\$exception;\n"
+"        \$async\$returnValue, \$async\$handler = 2, \$async\$errorStack = [], \$async\$next = [], \$async\$self = this, bodyBytes, _0_0, _0_2, _0_2_isSet, abortTrigger, t1, _1_0, contentLength, header, response, contentLengthHeader, contentLength0, headers, e, st, t4, t5, _this, t6, t7, t8, t9, result, exception, t2, abortController, t3, \$async\$exception;\n"
 "      var \$async\$send\$1 = A._wrapJsFunctionForAsync(function(\$async\$errorCode, \$async\$result) {\n"
 "        if (\$async\$errorCode === 1) {\n"
 "          \$async\$errorStack.push(\$async\$result);\n"
@@ -18432,51 +18230,59 @@
 "          switch (\$async\$goto) {\n"
 "            case 0:\n"
 "              // Function start\n"
+"              t2 = init.G;\n"
+"              abortController = A._asJSObject(new t2.AbortController());\n"
+"              t3 = \$async\$self._openRequestAbortControllers;\n"
+"              B.JSArray_methods.add\$1(t3, abortController);\n"
 "              request.super\$BaseRequest\$finalize();\n"
-"              t2 = type\$._AsyncStreamController_List_int;\n"
-"              t3 = new A._AsyncStreamController(null, null, null, null, t2);\n"
-"              t3._add\$1(request._bodyBytes);\n"
-"              t3._closeUnchecked\$0();\n"
+"              t4 = type\$._AsyncStreamController_List_int;\n"
+"              t5 = new A._AsyncStreamController(null, null, null, null, t4);\n"
+"              t5._add\$1(request._bodyBytes);\n"
+"              t5._closeUnchecked\$0();\n"
 "              \$async\$goto = 3;\n"
-"              return A._asyncAwait(new A.ByteStream(new A._ControllerStream(t3, t2._eval\$1(\"_ControllerStream<1>\"))).toBytes\$0(), \$async\$send\$1);\n"
+"              return A._asyncAwait(new A.ByteStream(new A._ControllerStream(t5, t4._eval\$1(\"_ControllerStream<1>\"))).toBytes\$0(), \$async\$send\$1);\n"
 "            case 3:\n"
 "              // returning from await.\n"
 "              bodyBytes = \$async\$result;\n"
 "              \$async\$handler = 5;\n"
-"              t2 = request.url;\n"
-"              _this = t2.toString\$0(0);\n"
-"              t3 = !J.get\$isEmpty\$asx(bodyBytes) ? bodyBytes : null;\n"
-"              t4 = \$async\$self.withCredentials ? \"include\" : \"same-origin\";\n"
-"              t5 = type\$.String;\n"
-"              t1 = A.LinkedHashMap_LinkedHashMap\$_empty(t5, type\$.Object);\n"
-"              _0_0 = request._bodyBytes.length;\n"
+"              _0_0 = request;\n"
+"              _0_2 = null;\n"
+"              _0_2_isSet = false;\n"
+"              abortTrigger = null;\n"
+"              t4 = request.url;\n"
+"              _this = t4.toString\$0(0);\n"
+"              t5 = !J.get\$isEmpty\$asx(bodyBytes) ? bodyBytes : null;\n"
+"              t6 = \$async\$self.withCredentials ? \"include\" : \"same-origin\";\n"
+"              t7 = type\$.String;\n"
+"              t1 = A.LinkedHashMap_LinkedHashMap\$_empty(t7, type\$.Object);\n"
+"              _1_0 = request._bodyBytes.length;\n"
 "              contentLength = null;\n"
-"              if (_0_0 != null) {\n"
-"                contentLength = _0_0;\n"
+"              if (_1_0 != null) {\n"
+"                contentLength = _1_0;\n"
 "                J.\$indexSet\$ax(t1, \"content-length\", contentLength);\n"
 "              }\n"
-"              for (t6 = request.headers, t6 = new A.LinkedHashMapEntriesIterable(t6, A._instanceType(t6)._eval\$1(\"LinkedHashMapEntriesIterable<1,2>\")).get\$iterator(0); t6.moveNext\$0();) {\n"
-"                t7 = t6.__js_helper\$_current;\n"
-"                t7.toString;\n"
-"                header = t7;\n"
+"              for (t8 = request.headers, t8 = new A.LinkedHashMapEntriesIterable(t8, A._instanceType(t8)._eval\$1(\"LinkedHashMapEntriesIterable<1,2>\")).get\$iterator(0); t8.moveNext\$0();) {\n"
+"                t9 = t8.__js_helper\$_current;\n"
+"                t9.toString;\n"
+"                header = t9;\n"
 "                J.\$indexSet\$ax(t1, header.key, header.value);\n"
 "              }\n"
 "              t1 = A.jsify(t1);\n"
 "              t1.toString;\n"
 "              A._asJSObject(t1);\n"
-"              t6 = A._asJSObject(\$async\$self._abortController.signal);\n"
+"              t8 = A._asJSObject(abortController.signal);\n"
 "              \$async\$goto = 8;\n"
-"              return A._asyncAwait(A.promiseToFuture(A._asJSObject(init.G.fetch(_this, {method: request.method, headers: t1, body: t3, credentials: t4, redirect: \"follow\", signal: t6})), type\$.JSObject), \$async\$send\$1);\n"
+"              return A._asyncAwait(A.promiseToFuture(A._asJSObject(t2.fetch(_this, {method: request.method, headers: t1, body: t5, credentials: t6, redirect: \"follow\", signal: t8})), type\$.JSObject), \$async\$send\$1);\n"
 "            case 8:\n"
 "              // returning from await.\n"
 "              response = \$async\$result;\n"
 "              contentLengthHeader = A._asStringQ(A._asJSObject(response.headers).get(\"content-length\"));\n"
 "              contentLength0 = contentLengthHeader != null ? A.Primitives_parseInt(contentLengthHeader, null) : null;\n"
 "              if (contentLength0 == null && contentLengthHeader != null) {\n"
-"                t1 = A.ClientException\$(\"Invalid content-length header [\" + contentLengthHeader + \"].\", t2);\n"
+"                t1 = A.ClientException\$(\"Invalid content-length header [\" + contentLengthHeader + \"].\", t4);\n"
 "                throw A.wrapException(t1);\n"
 "              }\n"
-"              headers = A.LinkedHashMap_LinkedHashMap\$_empty(t5, t5);\n"
+"              headers = A.LinkedHashMap_LinkedHashMap\$_empty(t7, t7);\n"
 "              t1 = A._asJSObject(response.headers);\n"
 "              t2 = new A.BrowserClient_send_closure(headers);\n"
 "              if (typeof t2 == \"function\")\n"
@@ -18488,21 +18294,22 @@
 "              }(A._callDartFunctionFast3, t2);\n"
 "              result[\$.\$get\$DART_CLOSURE_DART_JSINTEROP_PROPERTY_NAME()] = t2;\n"
 "              t1.forEach(result);\n"
-"              t1 = A._readBody(request, response);\n"
+"              t1 = A._bodyToStream(request, response);\n"
 "              t2 = A._asInt(response.status);\n"
-"              t3 = headers;\n"
-"              t4 = contentLength0;\n"
+"              t4 = headers;\n"
+"              t5 = contentLength0;\n"
 "              A.Uri_parse(A._asString(response.url));\n"
-"              t5 = A._asString(response.statusText);\n"
-"              t1 = new A.StreamedResponseV2(A.toByteStream(t1), request, t2, t5, t4, t3, false, true);\n"
-"              t1.BaseResponse\$7\$contentLength\$headers\$isRedirect\$persistentConnection\$reasonPhrase\$request(t2, t4, t3, false, true, t5, request);\n"
+"              t6 = A._asString(response.statusText);\n"
+"              t1 = new A.StreamedResponseV2(A.toByteStream(t1), request, t2, t6, t5, t4, false, true);\n"
+"              t1.BaseResponse\$7\$contentLength\$headers\$isRedirect\$persistentConnection\$reasonPhrase\$request(t2, t5, t4, false, true, t6, request);\n"
 "              \$async\$returnValue = t1;\n"
-"              // goto return\n"
-"              \$async\$goto = 1;\n"
+"              \$async\$next = [1];\n"
+"              // goto finally\n"
+"              \$async\$goto = 6;\n"
 "              break;\n"
-"              \$async\$handler = 2;\n"
-"              // goto after finally\n"
-"              \$async\$goto = 7;\n"
+"              \$async\$next.push(7);\n"
+"              // goto finally\n"
+"              \$async\$goto = 6;\n"
 "              break;\n"
 "            case 5:\n"
 "              // catch\n"
@@ -18511,13 +18318,19 @@
 "              e = A.unwrapException(\$async\$exception);\n"
 "              st = A.getTraceFromException(\$async\$exception);\n"
 "              A._rethrowAsClientException(e, st, request);\n"
-"              // goto after finally\n"
-"              \$async\$goto = 7;\n"
+"              \$async\$next.push(7);\n"
+"              // goto finally\n"
+"              \$async\$goto = 6;\n"
 "              break;\n"
 "            case 4:\n"
 "              // uncaught\n"
-"              // goto rethrow\n"
-"              \$async\$goto = 2;\n"
+"              \$async\$next = [2];\n"
+"            case 6:\n"
+"              // finally\n"
+"              \$async\$handler = 2;\n"
+"              B.JSArray_methods.remove\$1(t3, abortController);\n"
+"              // goto the next finally handler\n"
+"              \$async\$goto = \$async\$next.pop();\n"
 "              break;\n"
 "            case 7:\n"
 "              // after finally\n"
@@ -18540,20 +18353,77 @@
 "    call\$2(value, header) {\n"
 "      return this.call\$3(value, header, null);\n"
 "    },\n"
+"    \$signature: 36\n"
+"  };\n"
+"  A._bodyToStream_closure.prototype = {\n"
+"    call\$1(listener) {\n"
+"      return A._readStreamBody(this.request, this.response, type\$.MultiStreamController_List_int._as(listener));\n"
+"    },\n"
 "    \$signature: 37\n"
 "  };\n"
-"  A._readBody_closure.prototype = {\n"
-"    call\$1(_) {\n"
-"      return null;\n"
+"  A._readStreamBody_closure.prototype = {\n"
+"    call\$0() {\n"
+"      var t1 = this._box_0,\n"
+"        _0_0 = t1.resumeSignal;\n"
+"      if (_0_0 != null) {\n"
+"        t1.resumeSignal = null;\n"
+"        _0_0.complete\$0();\n"
+"      }\n"
 "    },\n"
-"    \$signature: 4\n"
+"    \$signature: 0\n"
 "  };\n"
-"  A._readBody_closure0.prototype = {\n"
-"    call\$1(_) {\n"
-"      A._asObject(_);\n"
-"      return this._box_0.isError;\n"
+"  A._readStreamBody_closure0.prototype = {\n"
+"    call\$0() {\n"
+"      var \$async\$goto = 0,\n"
+"        \$async\$completer = A._makeAsyncAwaitCompleter(type\$.void),\n"
+"        \$async\$handler = 1, \$async\$errorStack = [], \$async\$self = this, e, s, exception, \$async\$exception;\n"
+"      var \$async\$call\$0 = A._wrapJsFunctionForAsync(function(\$async\$errorCode, \$async\$result) {\n"
+"        if (\$async\$errorCode === 1) {\n"
+"          \$async\$errorStack.push(\$async\$result);\n"
+"          \$async\$goto = \$async\$handler;\n"
+"        }\n"
+"        for (;;)\n"
+"          switch (\$async\$goto) {\n"
+"            case 0:\n"
+"              // Function start\n"
+"              \$async\$handler = 3;\n"
+"              \$async\$self._box_0.cancelled = true;\n"
+"              \$async\$goto = 6;\n"
+"              return A._asyncAwait(A.promiseToFuture(A._asJSObject(\$async\$self.reader.cancel()), type\$.nullable_Object), \$async\$call\$0);\n"
+"            case 6:\n"
+"              // returning from await.\n"
+"              \$async\$handler = 1;\n"
+"              // goto after finally\n"
+"              \$async\$goto = 5;\n"
+"              break;\n"
+"            case 3:\n"
+"              // catch\n"
+"              \$async\$handler = 2;\n"
+"              \$async\$exception = \$async\$errorStack.pop();\n"
+"              e = A.unwrapException(\$async\$exception);\n"
+"              s = A.getTraceFromException(\$async\$exception);\n"
+"              if (!\$async\$self._box_0.hadError)\n"
+"                A._rethrowAsClientException(e, s, \$async\$self.request);\n"
+"              // goto after finally\n"
+"              \$async\$goto = 5;\n"
+"              break;\n"
+"            case 2:\n"
+"              // uncaught\n"
+"              // goto rethrow\n"
+"              \$async\$goto = 1;\n"
+"              break;\n"
+"            case 5:\n"
+"              // after finally\n"
+"              // implicit return\n"
+"              return A._asyncReturn(null, \$async\$completer);\n"
+"            case 1:\n"
+"              // rethrow\n"
+"              return A._asyncRethrow(\$async\$errorStack.at(-1), \$async\$completer);\n"
+"          }\n"
+"      });\n"
+"      return A._asyncStartSync(\$async\$call\$0, \$async\$completer);\n"
 "    },\n"
-"    \$signature: 38\n"
+"    \$signature: 5\n"
 "  };\n"
 "  A.ByteStream.prototype = {\n"
 "    toBytes\$0() {\n"
@@ -18568,7 +18438,7 @@
 "    call\$1(bytes) {\n"
 "      return this.completer.complete\$1(new Uint8Array(A._ensureNativeList(type\$.List_int._as(bytes))));\n"
 "    },\n"
-"    \$signature: 39\n"
+"    \$signature: 38\n"
 "  };\n"
 "  A.ClientException.prototype = {\n"
 "    toString\$0(_) {\n"
@@ -18656,7 +18526,7 @@
 "      scanner.expectDone\$0();\n"
 "      return A.MediaType\$(t4, t5, parameters);\n"
 "    },\n"
-"    \$signature: 40\n"
+"    \$signature: 39\n"
 "  };\n"
 "  A.MediaType_toString_closure.prototype = {\n"
 "    call\$2(attribute, value) {\n"
@@ -18675,13 +18545,13 @@
 "      } else\n"
 "        t1._contents = t3 + value;\n"
 "    },\n"
-"    \$signature: 29\n"
+"    \$signature: 40\n"
 "  };\n"
 "  A.MediaType_toString__closure.prototype = {\n"
 "    call\$1(match) {\n"
 "      return \"\\\\\" + A.S(match.\$index(0, 0));\n"
 "    },\n"
-"    \$signature: 24\n"
+"    \$signature: 23\n"
 "  };\n"
 "  A.expectQuotedString_closure.prototype = {\n"
 "    call\$1(match) {\n"
@@ -18689,7 +18559,7 @@
 "      t1.toString;\n"
 "      return t1;\n"
 "    },\n"
-"    \$signature: 24\n"
+"    \$signature: 23\n"
 "  };\n"
 "  A.Level.prototype = {\n"
 "    \$eq(_, other) {\n"
@@ -18778,7 +18648,7 @@
 "        \$parent._children.\$indexSet(0, thisName, t1);\n"
 "      return t1;\n"
 "    },\n"
-"    \$signature: 43\n"
+"    \$signature: 42\n"
 "  };\n"
 "  A.Context.prototype = {\n"
 "    absolute\$15(part1, part2, part3, part4, part5, part6, part7, part8, part9, part10, part11, part12, part13, part14, part15) {\n"
@@ -19012,20 +18882,20 @@
 "    call\$1(part) {\n"
 "      return A._asString(part) !== \"\";\n"
 "    },\n"
-"    \$signature: 25\n"
+"    \$signature: 24\n"
 "  };\n"
 "  A.Context_split_closure.prototype = {\n"
 "    call\$1(part) {\n"
 "      return A._asString(part).length !== 0;\n"
 "    },\n"
-"    \$signature: 25\n"
+"    \$signature: 24\n"
 "  };\n"
 "  A._validateArgList_closure.prototype = {\n"
 "    call\$1(arg) {\n"
 "      A._asStringQ(arg);\n"
 "      return arg == null ? \"null\" : '\"' + arg + '\"';\n"
 "    },\n"
-"    \$signature: 45\n"
+"    \$signature: 44\n"
 "  };\n"
 "  A.InternalStyle.prototype = {\n"
 "    getRoot\$1(path) {\n"
@@ -19454,7 +19324,7 @@
 "    },\n"
 "    _runOnRelease\$1(onRelease) {\n"
 "      var t1, t2;\n"
-"      A.Future_Future\$sync(type\$.dynamic_Function._as(onRelease), type\$.dynamic).then\$1\$1(new A.Pool__runOnRelease_closure(this), type\$.Null).catchError\$1(new A.Pool__runOnRelease_closure0(this));\n"
+"      A.Future_Future\$sync(type\$.void_Function._as(onRelease), type\$.void).then\$1\$1(new A.Pool__runOnRelease_closure(this), type\$.Null).catchError\$1(new A.Pool__runOnRelease_closure0(this));\n"
 "      t1 = new A._Future(\$.Zone__current, type\$._Future_PoolResource);\n"
 "      t2 = this._onReleaseCompleters;\n"
 "      t2._collection\$_add\$1(t2.\$ti._precomputed1._as(new A._SyncCompleter(t1, type\$._SyncCompleter_PoolResource)));\n"
@@ -19479,7 +19349,7 @@
 "      var t1 = this.\$this;\n"
 "      t1._onReleaseCompleters.removeFirst\$0().complete\$1(new A.PoolResource(t1));\n"
 "    },\n"
-"    \$signature: 4\n"
+"    \$signature: 45\n"
 "  };\n"
 "  A.Pool__runOnRelease_closure0.prototype = {\n"
 "    call\$2(error, stackTrace) {\n"
@@ -19497,23 +19367,27 @@
 "    get\$lines() {\n"
 "      return this._lineStarts.length;\n"
 "    },\n"
-"    SourceFile\$decoded\$2\$url(decodedChars, url) {\n"
-"      var t1, t2, t3, i, c, j, t4;\n"
-"      for (t1 = this._decodedChars, t2 = t1.length, t3 = this._lineStarts, i = 0; i < t2; ++i) {\n"
-"        c = t1[i];\n"
+"    SourceFile\$_fromList\$2\$url(decodedChars, url) {\n"
+"      var t1, t2, t3, t4, t5, t6, i, c, j, t7;\n"
+"      for (t1 = this._decodedChars, t2 = t1.length, t3 = decodedChars.__internal\$_string, t4 = t3.length, t5 = t1.\$flags | 0, t6 = this._lineStarts, i = 0; i < t2; ++i) {\n"
+"        if (!(i < t4))\n"
+"          return A.ioore(t3, i);\n"
+"        c = t3.charCodeAt(i);\n"
+"        t5 & 2 && A.throwUnsupportedOperation(t1);\n"
+"        t1[i] = c;\n"
 "        if (c === 13) {\n"
 "          j = i + 1;\n"
-"          if (j < t2) {\n"
-"            if (!(j < t2))\n"
-"              return A.ioore(t1, j);\n"
-"            t4 = t1[j] !== 10;\n"
+"          if (j < t4) {\n"
+"            if (!(j < t4))\n"
+"              return A.ioore(t3, j);\n"
+"            t7 = t3.charCodeAt(j) !== 10;\n"
 "          } else\n"
-"            t4 = true;\n"
-"          if (t4)\n"
+"            t7 = true;\n"
+"          if (t7)\n"
 "            c = 10;\n"
 "        }\n"
 "        if (c === 10)\n"
-"          B.JSArray_methods.add\$1(t3, i + 1);\n"
+"          B.JSArray_methods.add\$1(t6, i + 1);\n"
 "      }\n"
 "    },\n"
 "    getLine\$1(offset) {\n"
@@ -19919,7 +19793,7 @@
 "    call\$0() {\n"
 "      return this.color;\n"
 "    },\n"
-"    \$signature: 92\n"
+"    \$signature: 46\n"
 "  };\n"
 "  A.Highlighter\$__closure.prototype = {\n"
 "    call\$1(line) {\n"
@@ -19934,7 +19808,7 @@
 "      var t1 = type\$._Highlight._as(highlight).span;\n"
 "      return t1.get\$start().get\$line() !== t1.get\$end().get\$line();\n"
 "    },\n"
-"    \$signature: 13\n"
+"    \$signature: 12\n"
 "  };\n"
 "  A.Highlighter\$__closure0.prototype = {\n"
 "    call\$1(line) {\n"
@@ -20003,14 +19877,14 @@
 "    call\$1(highlight) {\n"
 "      return type\$._Highlight._as(highlight).span.get\$end().get\$line() < this.line.number;\n"
 "    },\n"
-"    \$signature: 13\n"
+"    \$signature: 12\n"
 "  };\n"
 "  A.Highlighter_highlight_closure.prototype = {\n"
 "    call\$1(highlight) {\n"
 "      type\$._Highlight._as(highlight);\n"
 "      return true;\n"
 "    },\n"
-"    \$signature: 13\n"
+"    \$signature: 12\n"
 "  };\n"
 "  A.Highlighter__writeFileStart_closure.prototype = {\n"
 "    call\$0() {\n"
@@ -20108,7 +19982,7 @@
 "      t2._contents = t4;\n"
 "      return t4.length - t3.length;\n"
 "    },\n"
-"    \$signature: 21\n"
+"    \$signature: 25\n"
 "  };\n"
 "  A.Highlighter__writeIndicator_closure0.prototype = {\n"
 "    call\$0() {\n"
@@ -20128,7 +20002,7 @@
 "        t1._writeArrow\$3\$beginning(_this.line, Math.max(_this.highlight.span.get\$end().get\$column() - 1, 0), false);\n"
 "      return t2._contents.length - t3.length;\n"
 "    },\n"
-"    \$signature: 21\n"
+"    \$signature: 25\n"
 "  };\n"
 "  A.Highlighter__writeSidebar_closure.prototype = {\n"
 "    call\$0() {\n"
@@ -20377,8 +20251,18 @@
 "      _this._outgoingController.close\$0();\n"
 "    },\n"
 "    _closeWithError\$1(error) {\n"
-"      var t1;\n"
-"      this._incomingController.addError\$1(error);\n"
+"      var _0_0, error0, stackTrace, t2,\n"
+"        t1 = this._incomingController;\n"
+"      if (t1._state >= 4)\n"
+"        A.throwExpression(t1._badEventState\$0());\n"
+"      _0_0 = A._interceptUserError(error, null);\n"
+"      error0 = _0_0.error;\n"
+"      stackTrace = _0_0.stackTrace;\n"
+"      t2 = t1._state;\n"
+"      if ((t2 & 1) !== 0)\n"
+"        t1._sendError\$2(error0, stackTrace);\n"
+"      else if ((t2 & 3) === 0)\n"
+"        t1._ensurePendingEvents\$0().add\$1(0, new A._DelayedError(error0, stackTrace));\n"
 "      this.close\$0();\n"
 "      t1 = this._onConnected;\n"
 "      if ((t1.future._state & 30) === 0)\n"
@@ -20579,7 +20463,7 @@
 "      this._fail\$1(\"no more input\");\n"
 "    },\n"
 "    error\$3\$length\$position(message, \$length, position) {\n"
-"      var t2, t3, t4, t5, sourceFile, end,\n"
+"      var t2, t3, end, sourceFile, end0,\n"
 "        t1 = this.string;\n"
 "      if (position < 0)\n"
 "        A.throwExpression(A.RangeError\$(\"position must be greater than or equal to 0.\"));\n"
@@ -20589,17 +20473,16 @@
 "      if (t2)\n"
 "        A.throwExpression(A.RangeError\$(\"position plus length must not go beyond the end of the string.\"));\n"
 "      t2 = this.sourceUrl;\n"
-"      t3 = new A.CodeUnits(t1);\n"
-"      t4 = A._setArrayType([0], type\$.JSArray_int);\n"
-"      t5 = new Uint32Array(A._ensureNativeList(t3.toList\$0(t3)));\n"
-"      sourceFile = new A.SourceFile(t2, t4, t5);\n"
-"      sourceFile.SourceFile\$decoded\$2\$url(t3, t2);\n"
-"      end = position + \$length;\n"
-"      if (end > t5.length)\n"
-"        A.throwExpression(A.RangeError\$(\"End \" + end + string\$.x20must_ + sourceFile.get\$length(0) + \".\"));\n"
+"      t3 = A._setArrayType([0], type\$.JSArray_int);\n"
+"      end = t1.length;\n"
+"      sourceFile = new A.SourceFile(t2, t3, new Uint32Array(end));\n"
+"      sourceFile.SourceFile\$_fromList\$2\$url(new A.CodeUnits(t1), t2);\n"
+"      end0 = position + \$length;\n"
+"      if (end0 > end)\n"
+"        A.throwExpression(A.RangeError\$(\"End \" + end0 + string\$.x20must_ + sourceFile.get\$length(0) + \".\"));\n"
 "      else if (position < 0)\n"
 "        A.throwExpression(A.RangeError\$(\"Start may not be negative, was \" + position + \".\"));\n"
-"      throw A.wrapException(new A.StringScannerException(t1, message, new A._FileSpan(sourceFile, position, end)));\n"
+"      throw A.wrapException(new A.StringScannerException(t1, message, new A._FileSpan(sourceFile, position, end0)));\n"
 "    },\n"
 "    _fail\$1(\$name) {\n"
 "      this.error\$3\$length\$position(\"expected \" + \$name + \".\", 0, this._string_scanner\$_position);\n"
@@ -20699,7 +20582,7 @@
 "      A._asJSObject(_);\n"
 "      this.webSocketConnected.complete\$1(this.browserSocket);\n"
 "    },\n"
-"    \$signature: 14\n"
+"    \$signature: 13\n"
 "  };\n"
 "  A.BrowserWebSocket_connect_closure0.prototype = {\n"
 "    call\$1(e) {\n"
@@ -20711,7 +20594,7 @@
 "      else\n"
 "        this.browserSocket._closed\$2(1006, \"error\");\n"
 "    },\n"
-"    \$signature: 14\n"
+"    \$signature: 13\n"
 "  };\n"
 "  A.BrowserWebSocket_connect_closure1.prototype = {\n"
 "    call\$1(e) {\n"
@@ -20741,7 +20624,7 @@
 "        t1.complete\$1(this.browserSocket);\n"
 "      this.browserSocket._closed\$2(A._asInt(\$event.code), A._asString(\$event.reason));\n"
 "    },\n"
-"    \$signature: 14\n"
+"    \$signature: 13\n"
 "  };\n"
 "  A.WebSocketEvent.prototype = {};\n"
 "  A.TextDataReceived.prototype = {\n"
@@ -20903,8 +20786,8 @@
 "              t1.\$dartReadyToRunMain = A._functionToJS0(new A.main__closure3(_box_0));\n"
 "              t2 = \$.Zone__current;\n"
 "              t3 = Math.max(100, 1);\n"
-"              t4 = A.StreamController_StreamController(null, null, null, type\$.DebugEvent);\n"
-"              t5 = A.StreamController_StreamController(null, null, null, type\$.List_DebugEvent);\n"
+"              t4 = A.StreamController_StreamController(type\$.DebugEvent);\n"
+"              t5 = A.StreamController_StreamController(type\$.List_DebugEvent);\n"
 "              debugEventController = new A.BatchedStreamController(t3, 1000, t4, t5, new A._AsyncCompleter(new A._Future(t2, type\$._Future_bool), type\$._AsyncCompleter_bool), type\$.BatchedStreamController_DebugEvent);\n"
 "              t2 = A.List_List\$filled(A.QueueList__computeInitialCapacity(null), null, false, type\$.nullable_Result_DebugEvent);\n"
 "              t3 = A.ListQueue\$(type\$._EventRequest_dynamic);\n"
@@ -20926,7 +20809,7 @@
 "      });\n"
 "      return A._asyncStartSync(\$async\$call\$0, \$async\$completer);\n"
 "    },\n"
-"    \$signature: 10\n"
+"    \$signature: 5\n"
 "  };\n"
 "  A.main__closure.prototype = {\n"
 "    call\$0() {\n"
@@ -20934,13 +20817,13 @@
 "      path.toString;\n"
 "      return A.FutureOfJSAnyToJSPromise_get_toJS(this.manager._restarter.hotReloadStart\$1(path), type\$.JSArray_nullable_Object);\n"
 "    },\n"
-"    \$signature: 8\n"
+"    \$signature: 7\n"
 "  };\n"
 "  A.main__closure0.prototype = {\n"
 "    call\$0() {\n"
 "      return A.FutureOfVoidToJSPromise_get_toJS(this.manager.hotReloadEnd\$0());\n"
 "    },\n"
-"    \$signature: 8\n"
+"    \$signature: 7\n"
 "  };\n"
 "  A.main__closure1.prototype = {\n"
 "    call\$2(runId, pauseIsolatesOnStart) {\n"
@@ -20969,7 +20852,7 @@
 "      t1 = type\$.dynamic;\n"
 "      A._trySendEvent(this.client.get\$sink(), B.C_JsonCodec.encode\$2\$toEncodable(A._setArrayType([\"HotRestartRequest\", A.LinkedHashMap_LinkedHashMap\$_literal([\"id\", runId], type\$.String, t1)], type\$.JSArray_Object), null), t1);\n"
 "    },\n"
-"    \$signature: 15\n"
+"    \$signature: 17\n"
 "  };\n"
 "  A.main__closure3.prototype = {\n"
 "    call\$0() {\n"
@@ -21009,7 +20892,7 @@
 "      A._asString(eventData);\n"
 "      A._trySendEvent(this.client.get\$sink(), B.C_JsonCodec.encode\$2\$toEncodable(A._setArrayType([\"RegisterEvent\", new A.RegisterEvent(eventData, Date.now()).toJson\$0()], type\$.JSArray_Object), null), type\$.dynamic);\n"
 "    },\n"
-"    \$signature: 15\n"
+"    \$signature: 17\n"
 "  };\n"
 "  A.main__closure7.prototype = {\n"
 "    call\$0() {\n"
@@ -21193,12 +21076,12 @@
 "      });\n"
 "      return A._asyncStartSync(\$async\$call\$1, \$async\$completer);\n"
 "    },\n"
-"    \$signature: 23\n"
+"    \$signature: 22\n"
 "  };\n"
 "  A.main__closure9.prototype = {\n"
 "    call\$1(error) {\n"
 "    },\n"
-"    \$signature: 4\n"
+"    \$signature: 8\n"
 "  };\n"
 "  A.main__closure10.prototype = {\n"
 "    call\$1(e) {\n"
@@ -21229,7 +21112,7 @@
 "    call\$3(id, success, errorMessage) {\n"
 "      return new A.HotReloadResponse(id, success, errorMessage);\n"
 "    },\n"
-"    \$signature: 91\n"
+"    \$signature: 65\n"
 "  };\n"
 "  A._sendHotRestartResponse_closure.prototype = {\n"
 "    call\$3(id, success, errorMessage) {\n"
@@ -21795,7 +21678,7 @@
 "    _getDigests\$0() {\n"
 "      var \$async\$goto = 0,\n"
 "        \$async\$completer = A._makeAsyncAwaitCompleter(type\$.Map_String_String),\n"
-"        \$async\$returnValue, t1, response;\n"
+"        \$async\$returnValue, response, t1;\n"
 "      var \$async\$_getDigests\$0 = A._wrapJsFunctionForAsync(function(\$async\$errorCode, \$async\$result) {\n"
 "        if (\$async\$errorCode === 1)\n"
 "          return A._asyncRethrow(\$async\$result, \$async\$completer);\n"
@@ -21803,9 +21686,8 @@
 "          switch (\$async\$goto) {\n"
 "            case 0:\n"
 "              // Function start\n"
-"              t1 = init.G;\n"
 "              \$async\$goto = 3;\n"
-"              return A._asyncAwait(new A.BrowserClient(A._asJSObject(new t1.AbortController()))._sendUnstreamed\$3(\"GET\", A.Uri_parse(A._asString(type\$.JavaScriptObject._as(t1.\$requireLoader).digestsPath)), null), \$async\$_getDigests\$0);\n"
+"              return A._asyncAwait(new A.BrowserClient(A._setArrayType([], type\$.JSArray_JSObject))._sendUnstreamed\$3(\"GET\", A.Uri_parse(A._asString(type\$.JavaScriptObject._as(init.G.\$requireLoader).digestsPath)), null), \$async\$_getDigests\$0);\n"
 "            case 3:\n"
 "              // returning from await.\n"
 "              response = \$async\$result;\n"
@@ -22082,7 +21964,7 @@
 "    call\$0() {\n"
 "      return A._asJSObject(A._asJSObject(init.G.document).createElement(\"script\"));\n"
 "    },\n"
-"    \$signature: 8\n"
+"    \$signature: 7\n"
 "  };\n"
 "  A._createScript__closure0.prototype = {\n"
 "    call\$0() {\n"
@@ -22090,7 +21972,7 @@
 "      scriptElement.setAttribute(\"nonce\", this.nonce);\n"
 "      return scriptElement;\n"
 "    },\n"
-"    \$signature: 8\n"
+"    \$signature: 7\n"
 "  };\n"
 "  A.runMain_closure.prototype = {\n"
 "    call\$0() {\n"
@@ -22135,12 +22017,12 @@
 "      _instance_0_u = hunkHelpers._instance_0u,\n"
 "      _instance_1_i = hunkHelpers._instance_1i;\n"
 "    _static_2(J, \"_interceptors_JSArray__compareAny\$closure\", \"JSArray__compareAny\", 27);\n"
-"    _instance_1_u(A.CastStreamSubscription.prototype, \"get\$__internal\$_onData\", \"__internal\$_onData\$1\", 7);\n"
-"    _static_1(A, \"async__AsyncRun__scheduleImmediateJsOverride\$closure\", \"_AsyncRun__scheduleImmediateJsOverride\", 9);\n"
-"    _static_1(A, \"async__AsyncRun__scheduleImmediateWithSetImmediate\$closure\", \"_AsyncRun__scheduleImmediateWithSetImmediate\", 9);\n"
-"    _static_1(A, \"async__AsyncRun__scheduleImmediateWithTimer\$closure\", \"_AsyncRun__scheduleImmediateWithTimer\", 9);\n"
+"    _instance_1_u(A.CastStreamSubscription.prototype, \"get\$__internal\$_onData\", \"__internal\$_onData\$1\", 11);\n"
+"    _static_1(A, \"async__AsyncRun__scheduleImmediateJsOverride\$closure\", \"_AsyncRun__scheduleImmediateJsOverride\", 14);\n"
+"    _static_1(A, \"async__AsyncRun__scheduleImmediateWithSetImmediate\$closure\", \"_AsyncRun__scheduleImmediateWithSetImmediate\", 14);\n"
+"    _static_1(A, \"async__AsyncRun__scheduleImmediateWithTimer\$closure\", \"_AsyncRun__scheduleImmediateWithTimer\", 14);\n"
 "    _static_0(A, \"async___startMicrotaskLoop\$closure\", \"_startMicrotaskLoop\", 0);\n"
-"    _static_1(A, \"async___nullDataHandler\$closure\", \"_nullDataHandler\", 5);\n"
+"    _static_1(A, \"async___nullDataHandler\$closure\", \"_nullDataHandler\", 4);\n"
 "    _static_2(A, \"async___nullErrorHandler\$closure\", \"_nullErrorHandler\", 6);\n"
 "    _static_0(A, \"async___nullDoneHandler\$closure\", \"_nullDoneHandler\", 0);\n"
 "    _static(A, \"async___rootHandleUncaughtError\$closure\", 5, null, [\"call\$5\"], [\"_rootHandleUncaughtError\"], 75, 0);\n"
@@ -22170,12 +22052,9 @@
 "    _static(A, \"async___rootPrint\$closure\", 4, null, [\"call\$4\"], [\"_rootPrint\"], 86, 0);\n"
 "    _static_1(A, \"async___printToZone\$closure\", \"_printToZone0\", 87);\n"
 "    _static(A, \"async___rootFork\$closure\", 5, null, [\"call\$5\"], [\"_rootFork\"], 88, 0);\n"
-"    _instance(A._Completer.prototype, \"get\$completeError\", 0, 1, null, [\"call\$2\", \"call\$1\"], [\"completeError\$2\", \"completeError\$1\"], 58, 0, 0);\n"
+"    _instance(A._Completer.prototype, \"get\$completeError\", 0, 1, null, [\"call\$2\", \"call\$1\"], [\"completeError\$2\", \"completeError\$1\"], 53, 0, 0);\n"
 "    _instance_2_u(A._Future.prototype, \"get\$_completeError\", \"_completeError\$2\", 6);\n"
 "    var _;\n"
-"    _instance_1_u(_ = A._StreamController.prototype, \"get\$_add\", \"_add\$1\", 7);\n"
-"    _instance_2_u(_, \"get\$_addError\", \"_addError\$2\", 6);\n"
-"    _instance_0_u(_, \"get\$_close\", \"_close\$0\", 0);\n"
 "    _instance_0_u(_ = A._ControllerSubscription.prototype, \"get\$_onPause\", \"_onPause\$0\", 0);\n"
 "    _instance_0_u(_, \"get\$_onResume\", \"_onResume\$0\", 0);\n"
 "    _instance_0_u(_ = A._BufferingStreamSubscription.prototype, \"get\$_onPause\", \"_onPause\$0\", 0);\n"
@@ -22183,24 +22062,24 @@
 "    _instance_0_u(A._DoneStreamSubscription.prototype, \"get\$_onMicrotask\", \"_onMicrotask\$0\", 0);\n"
 "    _instance_0_u(_ = A._ForwardingStreamSubscription.prototype, \"get\$_onPause\", \"_onPause\$0\", 0);\n"
 "    _instance_0_u(_, \"get\$_onResume\", \"_onResume\$0\", 0);\n"
-"    _instance_1_u(_, \"get\$_handleData\", \"_handleData\$1\", 7);\n"
-"    _instance_2_u(_, \"get\$_handleError\", \"_handleError\$2\", 41);\n"
+"    _instance_1_u(_, \"get\$_handleData\", \"_handleData\$1\", 11);\n"
+"    _instance_2_u(_, \"get\$_handleError\", \"_handleError\$2\", 92);\n"
 "    _instance_0_u(_, \"get\$_handleDone\", \"_handleDone\$0\", 0);\n"
 "    _static_2(A, \"collection___defaultEquals\$closure\", \"_defaultEquals0\", 28);\n"
-"    _static_1(A, \"collection___defaultHashCode\$closure\", \"_defaultHashCode\", 16);\n"
+"    _static_1(A, \"collection___defaultHashCode\$closure\", \"_defaultHashCode\", 15);\n"
 "    _static_2(A, \"collection_ListBase__compareAny\$closure\", \"ListBase__compareAny\", 27);\n"
-"    _static_1(A, \"convert___defaultToEncodable\$closure\", \"_defaultToEncodable\", 20);\n"
-"    _instance_1_i(_ = A._ByteCallbackSink.prototype, \"get\$add\", \"add\$1\", 7);\n"
+"    _static_1(A, \"convert___defaultToEncodable\$closure\", \"_defaultToEncodable\", 16);\n"
+"    _instance_1_i(_ = A._ByteCallbackSink.prototype, \"get\$add\", \"add\$1\", 11);\n"
 "    _instance_0_u(_, \"get\$close\", \"close\$0\", 0);\n"
-"    _static_1(A, \"core__identityHashCode\$closure\", \"identityHashCode\", 16);\n"
+"    _static_1(A, \"core__identityHashCode\$closure\", \"identityHashCode\", 15);\n"
 "    _static_2(A, \"core__identical\$closure\", \"identical\", 28);\n"
-"    _static_1(A, \"core_Uri_decodeComponent\$closure\", \"Uri_decodeComponent\", 11);\n"
+"    _static_1(A, \"core_Uri_decodeComponent\$closure\", \"Uri_decodeComponent\", 9);\n"
 "    _static(A, \"math__max\$closure\", 2, null, [\"call\$1\$2\", \"call\$2\"], [\"max\", function(a, b) {\n"
 "      return A.max(a, b, type\$.num);\n"
-"    }], 65, 0);\n"
-"    _instance_1_u(_ = A.PersistentWebSocket.prototype, \"get\$_writeToWebSocket\", \"_writeToWebSocket\$1\", 5);\n"
-"    _instance_0_u(_, \"get\$_listenWithRetry\", \"_listenWithRetry\$0\", 10);\n"
-"    _static_1(A, \"case_insensitive_map_CaseInsensitiveMap__canonicalizer\$closure\", \"CaseInsensitiveMap__canonicalizer\", 11);\n"
+"    }], 91, 0);\n"
+"    _instance_1_u(_ = A.PersistentWebSocket.prototype, \"get\$_writeToWebSocket\", \"_writeToWebSocket\$1\", 4);\n"
+"    _instance_0_u(_, \"get\$_listenWithRetry\", \"_listenWithRetry\$0\", 5);\n"
+"    _static_1(A, \"case_insensitive_map_CaseInsensitiveMap__canonicalizer\$closure\", \"CaseInsensitiveMap__canonicalizer\", 9);\n"
 "    _instance_1_u(_ = A.SseClient.prototype, \"get\$_onIncomingControlMessage\", \"_onIncomingControlMessage\$1\", 2);\n"
 "    _instance_1_u(_, \"get\$_onIncomingMessage\", \"_onIncomingMessage\$1\", 2);\n"
 "    _instance_0_u(_, \"get\$_onOutgoingDone\", \"_onOutgoingDone\$0\", 0);\n"
@@ -22215,26 +22094,26 @@
 "      _inherit = hunkHelpers.inherit,\n"
 "      _inheritMany = hunkHelpers.inheritMany;\n"
 "    _inherit(A.Object, null);\n"
-"    _inheritMany(A.Object, [A.JS_CONST, J.Interceptor, A.SafeToStringHook, J.ArrayIterator, A.Stream, A.CastStreamSubscription, A.Iterable, A.CastIterator, A.Closure, A.MapBase, A.Error, A.ListBase, A.SentinelValue, A.ListIterator, A.MappedIterator, A.WhereIterator, A.ExpandIterator, A.TakeIterator, A.SkipIterator, A.EmptyIterator, A.WhereTypeIterator, A.FixedLengthListMixin, A.UnmodifiableListMixin, A._Record, A.ConstantMap, A._KeysOrValuesOrElementsIterator, A.TypeErrorDecoder, A.NullThrownFromJavaScriptException, A.ExceptionAndStackTrace, A._StackTrace, A.LinkedHashMapCell, A.LinkedHashMapKeyIterator, A.LinkedHashMapValueIterator, A.LinkedHashMapEntryIterator, A.JSSyntaxRegExp, A._MatchImplementation, A._AllMatchesIterator, A.StringMatch, A._StringAllMatchesIterator, A._Cell, A._UnmodifiableNativeByteBufferView, A.Rti, A._FunctionParameters, A._Type, A._TimerImpl, A._AsyncAwaitCompleter, A._AsyncStarStreamController, A._IterationMarker, A.AsyncError, A._Completer, A._FutureListener, A._Future, A._AsyncCallbackEntry, A._StreamController, A._AsyncStreamControllerDispatch, A._BufferingStreamSubscription, A._StreamSinkWrapper, A._AddStreamState, A._DelayedEvent, A._DelayedDone, A._PendingEvents, A._DoneStreamSubscription, A._StreamIterator, A._ZoneFunction, A._Zone, A._ZoneDelegate, A._ZoneSpecification, A._HashMapKeyIterator, A.SetBase, A._HashSetIterator, A._UnmodifiableMapMixin, A.MapView, A._ListQueueIterator, A._SplayTreeNode, A._SplayTree, A._SplayTreeIterator, A.Codec, A.Converter, A.ByteConversionSink, A._JsonStringifier, A._Utf8Encoder, A._Utf8Decoder, A.DateTime, A.Duration, A._Enum, A.OutOfMemoryError, A.StackOverflowError, A._Exception, A.FormatException, A.MapEntry, A.Null, A._StringStackTrace, A.StringBuffer, A._Uri, A.UriData, A._SimpleUri, A.NullRejectionException, A._JSRandom, A._JSSecureRandom, A.AsyncMemoizer, A.ErrorResult, A.ValueResult, A.StreamQueue, A._NextRequest, A._HasNextRequest, A.CanonicalizedMap, A._QueueList_Object_ListMixin, A.BuildResult, A.ConnectRequest, A.DebugEvent, A.BatchedDebugEvents, A.DebugInfo, A.DevToolsRequest, A.DevToolsResponse, A.ErrorResponse, A.HotReloadRequest, A.HotReloadResponse, A.HotRestartRequest, A.HotRestartResponse, A.PingRequest, A.RegisterEvent, A.RunRequest, A.ServiceExtensionRequest, A.ServiceExtensionResponse, A.BatchedStreamController, A.SocketClient, A._PersistentWebSocket_Object_StreamChannelMixin, A.Uuid, A._StackState, A.BaseClient, A.BaseRequest, A.BaseResponse, A.ClientException, A.MediaType, A.Level, A.LogRecord, A.Logger, A.Context, A.Style, A.ParsedPath, A.PathException, A.Pool, A.PoolResource, A.SourceFile, A.SourceLocationMixin, A.SourceSpanMixin, A.Highlighter, A._Highlight, A._Line, A.SourceLocation, A.SourceSpanException, A.StreamChannelMixin, A.StringScanner, A.EventStreamProvider, A._EventStreamSubscription, A.BrowserWebSocket, A.WebSocketEvent, A.WebSocketException, A.DdcLibraryBundleRestarter, A.DdcRestarter, A.ReloadingManager, A.HotReloadFailedException, A.RequireRestarter]);\n"
+"    _inheritMany(A.Object, [A.JS_CONST, J.Interceptor, A.SafeToStringHook, J.ArrayIterator, A.Stream, A.CastStreamSubscription, A.Iterable, A.CastIterator, A.Closure, A.MapBase, A.Error, A.ListBase, A.SentinelValue, A.ListIterator, A.MappedIterator, A.WhereIterator, A.ExpandIterator, A.TakeIterator, A.SkipIterator, A.EmptyIterator, A.WhereTypeIterator, A.FixedLengthListMixin, A.UnmodifiableListMixin, A._Record, A.ConstantMap, A._KeysOrValuesOrElementsIterator, A.TypeErrorDecoder, A.NullThrownFromJavaScriptException, A.ExceptionAndStackTrace, A._StackTrace, A.LinkedHashMapCell, A.LinkedHashMapKeyIterator, A.LinkedHashMapValueIterator, A.LinkedHashMapEntryIterator, A.JSSyntaxRegExp, A._MatchImplementation, A._AllMatchesIterator, A.StringMatch, A._StringAllMatchesIterator, A._Cell, A._UnmodifiableNativeByteBufferView, A.Rti, A._FunctionParameters, A._Type, A._TimerImpl, A._AsyncAwaitCompleter, A.AsyncError, A._Completer, A._FutureListener, A._Future, A._AsyncCallbackEntry, A._StreamController, A._AsyncStreamControllerDispatch, A._BufferingStreamSubscription, A._StreamSinkWrapper, A._DelayedEvent, A._DelayedDone, A._PendingEvents, A._DoneStreamSubscription, A._StreamIterator, A._ZoneFunction, A._Zone, A._ZoneDelegate, A._ZoneSpecification, A._HashMapKeyIterator, A.SetBase, A._HashSetIterator, A._UnmodifiableMapMixin, A.MapView, A._ListQueueIterator, A._SplayTreeNode, A._SplayTree, A._SplayTreeIterator, A.Codec, A.Converter, A.ByteConversionSink, A._JsonStringifier, A._Utf8Encoder, A._Utf8Decoder, A.DateTime, A.Duration, A._Enum, A.OutOfMemoryError, A.StackOverflowError, A._Exception, A.FormatException, A.MapEntry, A.Null, A._StringStackTrace, A.StringBuffer, A._Uri, A.UriData, A._SimpleUri, A.NullRejectionException, A._JSRandom, A._JSSecureRandom, A.AsyncMemoizer, A.ErrorResult, A.ValueResult, A.StreamQueue, A._NextRequest, A._HasNextRequest, A.CanonicalizedMap, A._QueueList_Object_ListMixin, A.BuildResult, A.ConnectRequest, A.DebugEvent, A.BatchedDebugEvents, A.DebugInfo, A.DevToolsRequest, A.DevToolsResponse, A.ErrorResponse, A.HotReloadRequest, A.HotReloadResponse, A.HotRestartRequest, A.HotRestartResponse, A.PingRequest, A.RegisterEvent, A.RunRequest, A.ServiceExtensionRequest, A.ServiceExtensionResponse, A.BatchedStreamController, A.SocketClient, A._PersistentWebSocket_Object_StreamChannelMixin, A.Uuid, A._StackState, A.ClientException, A.BaseClient, A.BaseRequest, A.BaseResponse, A.MediaType, A.Level, A.LogRecord, A.Logger, A.Context, A.Style, A.ParsedPath, A.PathException, A.Pool, A.PoolResource, A.SourceFile, A.SourceLocationMixin, A.SourceSpanMixin, A.Highlighter, A._Highlight, A._Line, A.SourceLocation, A.SourceSpanException, A.StreamChannelMixin, A.StringScanner, A.EventStreamProvider, A._EventStreamSubscription, A.BrowserWebSocket, A.WebSocketEvent, A.WebSocketException, A.DdcLibraryBundleRestarter, A.DdcRestarter, A.ReloadingManager, A.HotReloadFailedException, A.RequireRestarter]);\n"
 "    _inheritMany(J.Interceptor, [J.JSBool, J.JSNull, J.JavaScriptObject, J.JavaScriptBigInt, J.JavaScriptSymbol, J.JSNumber, J.JSString]);\n"
 "    _inheritMany(J.JavaScriptObject, [J.LegacyJavaScriptObject, J.JSArray, A.NativeByteBuffer, A.NativeTypedData]);\n"
 "    _inheritMany(J.LegacyJavaScriptObject, [J.PlainJavaScriptObject, J.UnknownJavaScriptObject, J.JavaScriptFunction]);\n"
 "    _inherit(J.JSArraySafeToStringHook, A.SafeToStringHook);\n"
 "    _inherit(J.JSUnmodifiableArray, J.JSArray);\n"
 "    _inheritMany(J.JSNumber, [J.JSInt, J.JSNumNotInt]);\n"
-"    _inheritMany(A.Stream, [A.CastStream, A.StreamView, A._StreamImpl, A._EmptyStream, A._ForwardingStream, A._EventStream]);\n"
+"    _inheritMany(A.Stream, [A.CastStream, A.StreamView, A._StreamImpl, A._EmptyStream, A._MultiStream, A._ForwardingStream, A._EventStream]);\n"
 "    _inheritMany(A.Iterable, [A._CastIterableBase, A.EfficientLengthIterable, A.MappedIterable, A.WhereIterable, A.ExpandIterable, A.TakeIterable, A.SkipIterable, A.WhereTypeIterable, A._KeysOrValues, A._AllMatchesIterable, A._StringAllMatchesIterable]);\n"
 "    _inheritMany(A._CastIterableBase, [A.CastIterable, A.__CastListBase__CastIterableBase_ListMixin]);\n"
 "    _inherit(A._EfficientLengthCastIterable, A.CastIterable);\n"
 "    _inherit(A._CastListBase, A.__CastListBase__CastIterableBase_ListMixin);\n"
-"    _inheritMany(A.Closure, [A.Closure2Args, A.Closure0Args, A.Instantiation, A.TearOffClosure, A.initHooks_closure, A.initHooks_closure1, A._AsyncRun__initializeScheduleImmediate_internalCallback, A._AsyncRun__initializeScheduleImmediate_closure, A._awaitOnObject_closure, A._asyncStarHelper_closure0, A._Future__propagateToListeners_handleWhenCompleteCallback_closure, A._Future_timeout_closure0, A.Stream_length_closure, A.Stream_first_closure0, A._CustomZone_bindUnaryCallback_closure, A._CustomZone_bindUnaryCallbackGuarded_closure, A._RootZone_bindUnaryCallback_closure, A._RootZone_bindUnaryCallbackGuarded_closure, A.runZonedGuarded_closure, A._LinkedCustomHashMap_closure, A._Uri__makePath_closure, A.FutureOfJSAnyToJSPromise_get_toJS__closure, A.FutureOfVoidToJSPromise_get_toJS__closure, A.jsify__convert, A.promiseToFuture_closure, A.promiseToFuture_closure0, A.dartify_convert, A.StreamQueue__ensureListening_closure, A.CanonicalizedMap_keys_closure, A.BuildStatus_BuildStatus\$fromJson_closure, A.BatchedDebugEvents_toJson_closure, A.WebSocketClient_stream_closure, A.PersistentWebSocket_connect_closure, A.PersistentWebSocket__listenWithRetry_attemptRetry, A.PersistentWebSocket__listenWithRetry_closure, A.BaseRequest_closure0, A.BrowserClient_send_closure, A._readBody_closure, A._readBody_closure0, A.ByteStream_toBytes_closure, A.MediaType_toString__closure, A.expectQuotedString_closure, A.Context_joinAll_closure, A.Context_split_closure, A._validateArgList_closure, A.Pool__runOnRelease_closure, A.Highlighter\$__closure, A.Highlighter\$___closure, A.Highlighter\$__closure0, A.Highlighter__collateLines_closure, A.Highlighter__collateLines_closure1, A.Highlighter__collateLines__closure, A.Highlighter_highlight_closure, A.SseClient_closure0, A.SseClient_closure1, A._EventStreamSubscription_closure, A._EventStreamSubscription_onData_closure, A.BrowserWebSocket_connect_closure, A.BrowserWebSocket_connect_closure0, A.BrowserWebSocket_connect_closure1, A.BrowserWebSocket_connect_closure2, A.main__closure1, A.main__closure2, A.main__closure4, A.main__closure6, A.main__closure8, A.main__closure9, A.main__closure10, A._handleAuthRequest_closure, A._sendHotReloadResponse_closure, A._sendHotRestartResponse_closure, A.DdcLibraryBundleRestarter_restart_closure, A.DdcLibraryBundleRestarter_hotReloadStart_closure, A.DdcRestarter_restart_closure0, A.DdcRestarter_restart_closure, A.RequireRestarter__reloadModule_closure0, A.JSArrayExtension_toDartIterable_closure]);\n"
-"    _inheritMany(A.Closure2Args, [A._CastListBase_sort_closure, A.CastMap_forEach_closure, A.initHooks_closure0, A._awaitOnObject_closure0, A._wrapJsFunctionForAsync_closure, A._Future__propagateToListeners_handleWhenCompleteCallback_closure0, A._Future_timeout_closure1, A._AddStreamState_makeErrorHandler_closure, A._BufferingStreamSubscription_asFuture_closure0, A.MapBase_mapToString_closure, A._JsonStringifier_writeMap_closure, A.Uri_parseIPv6Address_error, A.FutureOfJSAnyToJSPromise_get_toJS_closure, A.FutureOfJSAnyToJSPromise_get_toJS__closure0, A.FutureOfVoidToJSPromise_get_toJS_closure, A.FutureOfVoidToJSPromise_get_toJS__closure0, A.StreamQueue__ensureListening_closure1, A.CanonicalizedMap_addAll_closure, A.CanonicalizedMap_forEach_closure, A.safeUnawaited_closure, A.BaseRequest_closure, A.MediaType_toString_closure, A.Pool__runOnRelease_closure0, A.Highlighter__collateLines_closure0, A.main__closure5, A.main_closure0]);\n"
+"    _inheritMany(A.Closure, [A.Closure2Args, A.Closure0Args, A.Instantiation, A.TearOffClosure, A.initHooks_closure, A.initHooks_closure1, A._AsyncRun__initializeScheduleImmediate_internalCallback, A._AsyncRun__initializeScheduleImmediate_closure, A._awaitOnObject_closure, A._Future__propagateToListeners_handleWhenCompleteCallback_closure, A._Future_timeout_closure0, A.Stream_length_closure, A.Stream_first_closure0, A._CustomZone_bindUnaryCallback_closure, A._CustomZone_bindUnaryCallbackGuarded_closure, A._RootZone_bindUnaryCallback_closure, A._RootZone_bindUnaryCallbackGuarded_closure, A.runZonedGuarded_closure, A._LinkedCustomHashMap_closure, A._Uri__makePath_closure, A.FutureOfJSAnyToJSPromise_get_toJS__closure, A.FutureOfVoidToJSPromise_get_toJS__closure, A.jsify__convert, A.promiseToFuture_closure, A.promiseToFuture_closure0, A.dartify_convert, A.StreamQueue__ensureListening_closure, A.CanonicalizedMap_keys_closure, A.BuildStatus_BuildStatus\$fromJson_closure, A.BatchedDebugEvents_toJson_closure, A.WebSocketClient_stream_closure, A.PersistentWebSocket_connect_closure, A.PersistentWebSocket__listenWithRetry_attemptRetry, A.PersistentWebSocket__listenWithRetry_closure, A.BaseRequest_closure0, A.BrowserClient_send_closure, A._bodyToStream_closure, A.ByteStream_toBytes_closure, A.MediaType_toString__closure, A.expectQuotedString_closure, A.Context_joinAll_closure, A.Context_split_closure, A._validateArgList_closure, A.Pool__runOnRelease_closure, A.Highlighter\$__closure, A.Highlighter\$___closure, A.Highlighter\$__closure0, A.Highlighter__collateLines_closure, A.Highlighter__collateLines_closure1, A.Highlighter__collateLines__closure, A.Highlighter_highlight_closure, A.SseClient_closure0, A.SseClient_closure1, A._EventStreamSubscription_closure, A._EventStreamSubscription_onData_closure, A.BrowserWebSocket_connect_closure, A.BrowserWebSocket_connect_closure0, A.BrowserWebSocket_connect_closure1, A.BrowserWebSocket_connect_closure2, A.main__closure1, A.main__closure2, A.main__closure4, A.main__closure6, A.main__closure8, A.main__closure9, A.main__closure10, A._handleAuthRequest_closure, A._sendHotReloadResponse_closure, A._sendHotRestartResponse_closure, A.DdcLibraryBundleRestarter_restart_closure, A.DdcLibraryBundleRestarter_hotReloadStart_closure, A.DdcRestarter_restart_closure0, A.DdcRestarter_restart_closure, A.RequireRestarter__reloadModule_closure0, A.JSArrayExtension_toDartIterable_closure]);\n"
+"    _inheritMany(A.Closure2Args, [A._CastListBase_sort_closure, A.CastMap_forEach_closure, A.initHooks_closure0, A._awaitOnObject_closure0, A._wrapJsFunctionForAsync_closure, A._Future__propagateToListeners_handleWhenCompleteCallback_closure0, A._Future_timeout_closure1, A._BufferingStreamSubscription_asFuture_closure0, A.MapBase_mapToString_closure, A._JsonStringifier_writeMap_closure, A.Uri_parseIPv6Address_error, A.FutureOfJSAnyToJSPromise_get_toJS_closure, A.FutureOfJSAnyToJSPromise_get_toJS__closure0, A.FutureOfVoidToJSPromise_get_toJS_closure, A.FutureOfVoidToJSPromise_get_toJS__closure0, A.StreamQueue__ensureListening_closure1, A.CanonicalizedMap_addAll_closure, A.CanonicalizedMap_forEach_closure, A.safeUnawaited_closure, A.BaseRequest_closure, A.MediaType_toString_closure, A.Pool__runOnRelease_closure0, A.Highlighter__collateLines_closure0, A.main__closure5, A.main_closure0]);\n"
 "    _inherit(A.CastList, A._CastListBase);\n"
 "    _inheritMany(A.MapBase, [A.CastMap, A.JsLinkedHashMap, A._HashMap, A._JsonMap]);\n"
 "    _inheritMany(A.Error, [A.LateError, A.TypeError, A.JsNoSuchMethodError, A.UnknownJsTypeError, A.RuntimeError, A._Error, A.JsonUnsupportedObjectError, A.AssertionError, A.ArgumentError, A.UnsupportedError, A.UnimplementedError, A.StateError, A.ConcurrentModificationError]);\n"
 "    _inherit(A.UnmodifiableListBase, A.ListBase);\n"
 "    _inherit(A.CodeUnits, A.UnmodifiableListBase);\n"
-"    _inheritMany(A.Closure0Args, [A.nullFuture_closure, A._AsyncRun__scheduleImmediateJsOverride_internalCallback, A._AsyncRun__scheduleImmediateWithSetImmediate_internalCallback, A._TimerImpl_internalCallback, A._TimerImpl\$periodic_closure, A._asyncStarHelper_closure, A._AsyncStarStreamController__resumeBody, A._AsyncStarStreamController__resumeBody_closure, A._AsyncStarStreamController_closure0, A._AsyncStarStreamController_closure1, A._AsyncStarStreamController_closure, A._AsyncStarStreamController__closure, A.Future_Future\$microtask_closure, A.Future_Future\$delayed_closure, A._Future__addListener_closure, A._Future__prependListeners_closure, A._Future__chainCoreFuture_closure, A._Future__asyncCompleteWithValue_closure, A._Future__asyncCompleteErrorObject_closure, A._Future__propagateToListeners_handleWhenCompleteCallback, A._Future__propagateToListeners_handleValueCallback, A._Future__propagateToListeners_handleError, A._Future_timeout_closure, A.Stream_length_closure0, A.Stream_first_closure, A._StreamController__subscribe_closure, A._StreamController__recordCancel_complete, A._AddStreamState_cancel_closure, A._BufferingStreamSubscription_asFuture_closure, A._BufferingStreamSubscription_asFuture__closure, A._BufferingStreamSubscription__sendError_sendError, A._BufferingStreamSubscription__sendDone_sendDone, A._PendingEvents_schedule_closure, A._cancelAndValue_closure, A._CustomZone_bindCallback_closure, A._CustomZone_bindCallbackGuarded_closure, A._RootZone_bindCallback_closure, A._RootZone_bindCallbackGuarded_closure, A._rootHandleError_closure, A._Utf8Decoder__decoder_closure, A._Utf8Decoder__decoderNonfatal_closure, A.StreamQueue__ensureListening_closure0, A.BuildStatus_BuildStatus\$fromJson_closure0, A.BatchedStreamController__hasEventOrTimeOut_closure, A.BatchedStreamController__hasEventDuring_closure, A.MediaType_MediaType\$parse_closure, A.Logger_Logger_closure, A.Highlighter_closure, A.Highlighter__writeFileStart_closure, A.Highlighter__writeMultilineHighlights_closure, A.Highlighter__writeMultilineHighlights_closure0, A.Highlighter__writeMultilineHighlights_closure1, A.Highlighter__writeMultilineHighlights_closure2, A.Highlighter__writeMultilineHighlights__closure, A.Highlighter__writeMultilineHighlights__closure0, A.Highlighter__writeHighlightedText_closure, A.Highlighter__writeIndicator_closure, A.Highlighter__writeIndicator_closure0, A.Highlighter__writeIndicator_closure1, A.Highlighter__writeSidebar_closure, A._Highlight_closure, A.SseClient_closure, A.SseClient__closure, A.SseClient__onOutgoingMessage_closure, A.main_closure, A.main__closure, A.main__closure0, A.main__closure3, A.main__closure7, A.DdcLibraryBundleRestarter__getSrcModuleLibraries_closure, A.RequireRestarter__reload_closure, A.RequireRestarter__reloadModule_closure, A._createScript_closure, A._createScript__closure, A._createScript__closure0, A.runMain_closure]);\n"
+"    _inheritMany(A.Closure0Args, [A.nullFuture_closure, A._AsyncRun__scheduleImmediateJsOverride_internalCallback, A._AsyncRun__scheduleImmediateWithSetImmediate_internalCallback, A._TimerImpl_internalCallback, A._TimerImpl\$periodic_closure, A.Future_Future\$microtask_closure, A.Future_Future\$delayed_closure, A._Future__addListener_closure, A._Future__prependListeners_closure, A._Future__chainCoreFuture_closure, A._Future__asyncCompleteWithValue_closure, A._Future__asyncCompleteErrorObject_closure, A._Future__propagateToListeners_handleWhenCompleteCallback, A._Future__propagateToListeners_handleValueCallback, A._Future__propagateToListeners_handleError, A._Future_timeout_closure, A.Stream_length_closure0, A.Stream_first_closure, A._StreamController__subscribe_closure, A._StreamController__recordCancel_complete, A._BufferingStreamSubscription_asFuture_closure, A._BufferingStreamSubscription_asFuture__closure, A._BufferingStreamSubscription__sendError_sendError, A._BufferingStreamSubscription__sendDone_sendDone, A._PendingEvents_schedule_closure, A._MultiStream_listen_closure, A._cancelAndValue_closure, A._CustomZone_bindCallback_closure, A._CustomZone_bindCallbackGuarded_closure, A._RootZone_bindCallback_closure, A._RootZone_bindCallbackGuarded_closure, A._rootHandleError_closure, A._Utf8Decoder__decoder_closure, A._Utf8Decoder__decoderNonfatal_closure, A.StreamQueue__ensureListening_closure0, A.BuildStatus_BuildStatus\$fromJson_closure0, A.BatchedStreamController__hasEventOrTimeOut_closure, A.BatchedStreamController__hasEventDuring_closure, A._readStreamBody_closure, A._readStreamBody_closure0, A.MediaType_MediaType\$parse_closure, A.Logger_Logger_closure, A.Highlighter_closure, A.Highlighter__writeFileStart_closure, A.Highlighter__writeMultilineHighlights_closure, A.Highlighter__writeMultilineHighlights_closure0, A.Highlighter__writeMultilineHighlights_closure1, A.Highlighter__writeMultilineHighlights_closure2, A.Highlighter__writeMultilineHighlights__closure, A.Highlighter__writeMultilineHighlights__closure0, A.Highlighter__writeHighlightedText_closure, A.Highlighter__writeIndicator_closure, A.Highlighter__writeIndicator_closure0, A.Highlighter__writeIndicator_closure1, A.Highlighter__writeSidebar_closure, A._Highlight_closure, A.SseClient_closure, A.SseClient__closure, A.SseClient__onOutgoingMessage_closure, A.main_closure, A.main__closure, A.main__closure0, A.main__closure3, A.main__closure7, A.DdcLibraryBundleRestarter__getSrcModuleLibraries_closure, A.RequireRestarter__reload_closure, A.RequireRestarter__reloadModule_closure, A._createScript_closure, A._createScript__closure, A._createScript__closure0, A.runMain_closure]);\n"
 "    _inheritMany(A.EfficientLengthIterable, [A.ListIterable, A.EmptyIterable, A.LinkedHashMapKeysIterable, A.LinkedHashMapValuesIterable, A.LinkedHashMapEntriesIterable, A._HashMapKeyIterable]);\n"
 "    _inheritMany(A.ListIterable, [A.SubListIterable, A.MappedListIterable, A.ReversedListIterable, A.ListQueue, A._JsonMapKeyIterable]);\n"
 "    _inherit(A.EfficientLengthMappedIterable, A.MappedIterable);\n"
@@ -22261,8 +22140,8 @@
 "    _inherit(A._AsyncStreamController, A._StreamController);\n"
 "    _inherit(A._ControllerStream, A._StreamImpl);\n"
 "    _inheritMany(A._BufferingStreamSubscription, [A._ControllerSubscription, A._ForwardingStreamSubscription]);\n"
-"    _inherit(A._StreamControllerAddStreamState, A._AddStreamState);\n"
 "    _inheritMany(A._DelayedEvent, [A._DelayedData, A._DelayedError]);\n"
+"    _inherit(A._MultiStreamController, A._AsyncStreamController);\n"
 "    _inherit(A._MapStream, A._ForwardingStream);\n"
 "    _inheritMany(A._Zone, [A._CustomZone, A._RootZone]);\n"
 "    _inherit(A._IdentityHashMap, A._HashMap);\n"
@@ -22290,6 +22169,7 @@
 "    _inherit(A.BuildStatus, A._Enum);\n"
 "    _inheritMany(A.SocketClient, [A.SseSocketClient, A.WebSocketClient]);\n"
 "    _inherit(A.PersistentWebSocket, A._PersistentWebSocket_Object_StreamChannelMixin);\n"
+"    _inherit(A.RequestAbortedException, A.ClientException);\n"
 "    _inherit(A.BrowserClient, A.BaseClient);\n"
 "    _inherit(A.ByteStream, A.StreamView);\n"
 "    _inherit(A.Request, A.BaseRequest);\n"
@@ -22324,7 +22204,7 @@
 "    typeUniverse: {eC: new Map(), tR: {}, eT: {}, tPV: {}, sEA: []},\n"
 "    mangledGlobalNames: {int: \"int\", double: \"double\", num: \"num\", String: \"String\", bool: \"bool\", Null: \"Null\", List: \"List\", Object: \"Object\", Map: \"Map\", JSObject: \"JSObject\"},\n"
 "    mangledNames: {},\n"
-"    types: [\"~()\", \"Null()\", \"~(JSObject)\", \"Null(Object,StackTrace)\", \"Null(@)\", \"~(@)\", \"~(Object,StackTrace)\", \"~(Object?)\", \"JSObject()\", \"~(~())\", \"Future<~>()\", \"String(String)\", \"Object?(Object?)\", \"bool(_Highlight)\", \"Null(JSObject)\", \"Null(String)\", \"int(Object?)\", \"~(Object?,Object?)\", \"@()\", \"Null(JavaScriptFunction,JavaScriptFunction)\", \"@(@)\", \"int()\", \"bool()\", \"Future<~>(String)\", \"String(Match)\", \"bool(String)\", \"Null(JavaScriptFunction)\", \"int(@,@)\", \"bool(Object?,Object?)\", \"~(String,String)\", \"@(String)\", \"Null(@,StackTrace)\", \"PersistentWebSocket(WebSocket)\", \"~(Zone,ZoneDelegate,Zone,Object,StackTrace)\", \"Future<~>(WebSocketEvent)\", \"bool(String,String)\", \"int(String)\", \"Null(String,String[Object?])\", \"bool(Object)\", \"~(List<int>)\", \"MediaType()\", \"~(@,StackTrace)\", \"bool(Object?)\", \"Logger()\", \"JSObject(Object,StackTrace)\", \"String(String?)\", \"String(@)\", \"int(_Line)\", \"~(int,@)\", \"Object(_Line)\", \"Object(_Highlight)\", \"int(_Highlight,_Highlight)\", \"List<_Line>(MapEntry<Object,List<_Highlight>>)\", \"0&()\", \"SourceSpanWithContext()\", \"_Future<@>?()\", \"~(String?)\", \"Future<Null>()\", \"~(Object[StackTrace?])\", \"Null(~())\", \"JSObject(String[bool?])\", \"~(StreamSink<@>)\", \"~(List<DebugEvent>)\", \"Null(String,String)\", \"~(bool)\", \"0^(0^,0^)<num>\", \"HotRestartResponse(String,bool,String?)\", \"Object?(~)\", \"bool(bool)\", \"List<String>(String)\", \"int(String,String)\", \"Null(JavaScriptObject)\", \"JSObject()()\", \"bool(BuildStatus)\", \"@(@,String)\", \"~(Zone?,ZoneDelegate?,Zone,Object,StackTrace)\", \"0^(Zone?,ZoneDelegate?,Zone,0^())<Object?>\", \"0^(Zone?,ZoneDelegate?,Zone,0^(1^),1^)<Object?,Object?>\", \"0^(Zone?,ZoneDelegate?,Zone,0^(1^,2^),1^,2^)<Object?,Object?,Object?>\", \"0^()(Zone,ZoneDelegate,Zone,0^())<Object?>\", \"0^(1^)(Zone,ZoneDelegate,Zone,0^(1^))<Object?,Object?>\", \"0^(1^,2^)(Zone,ZoneDelegate,Zone,0^(1^,2^))<Object?,Object?,Object?>\", \"AsyncError?(Zone,ZoneDelegate,Zone,Object,StackTrace?)\", \"~(Zone?,ZoneDelegate?,Zone,~())\", \"Timer(Zone,ZoneDelegate,Zone,Duration,~())\", \"Timer(Zone,ZoneDelegate,Zone,Duration,~(Timer))\", \"~(Zone,ZoneDelegate,Zone,String)\", \"~(String)\", \"Zone(Zone?,ZoneDelegate?,Zone,ZoneSpecification?,Map<Object?,Object?>?)\", \"0&(String,int?)\", \"Map<String,@>(DebugEvent)\", \"HotReloadResponse(String,bool,String?)\", \"String?()\"],\n"
+"    types: [\"~()\", \"Null()\", \"~(JSObject)\", \"Null(Object,StackTrace)\", \"~(@)\", \"Future<~>()\", \"~(Object,StackTrace)\", \"JSObject()\", \"Null(@)\", \"String(String)\", \"Object?(Object?)\", \"~(Object?)\", \"bool(_Highlight)\", \"Null(JSObject)\", \"~(~())\", \"int(Object?)\", \"@(@)\", \"Null(String)\", \"~(Object?,Object?)\", \"@()\", \"Null(JavaScriptFunction,JavaScriptFunction)\", \"bool()\", \"Future<~>(String)\", \"String(Match)\", \"bool(String)\", \"int()\", \"Null(JavaScriptFunction)\", \"int(@,@)\", \"bool(Object?,Object?)\", \"PersistentWebSocket(WebSocket)\", \"String(@)\", \"~(Zone,ZoneDelegate,Zone,Object,StackTrace)\", \"bool(Object?)\", \"Future<~>(WebSocketEvent)\", \"bool(String,String)\", \"int(String)\", \"Null(String,String[Object?])\", \"~(MultiStreamController<List<int>>)\", \"~(List<int>)\", \"MediaType()\", \"~(String,String)\", \"Null(@,StackTrace)\", \"Logger()\", \"~(int,@)\", \"String(String?)\", \"Null(~)\", \"String?()\", \"int(_Line)\", \"0&(String,int?)\", \"Object(_Line)\", \"Object(_Highlight)\", \"int(_Highlight,_Highlight)\", \"List<_Line>(MapEntry<Object,List<_Highlight>>)\", \"~(Object[StackTrace?])\", \"SourceSpanWithContext()\", \"@(String)\", \"~(String?)\", \"Future<Null>()\", \"@(@,String)\", \"JSObject(Object,StackTrace)\", \"JSObject(String[bool?])\", \"~(StreamSink<@>)\", \"~(List<DebugEvent>)\", \"Null(String,String)\", \"~(bool)\", \"HotReloadResponse(String,bool,String?)\", \"HotRestartResponse(String,bool,String?)\", \"Object?(~)\", \"bool(bool)\", \"List<String>(String)\", \"int(String,String)\", \"Null(JavaScriptObject)\", \"JSObject()()\", \"bool(BuildStatus)\", \"0&()\", \"~(Zone?,ZoneDelegate?,Zone,Object,StackTrace)\", \"0^(Zone?,ZoneDelegate?,Zone,0^())<Object?>\", \"0^(Zone?,ZoneDelegate?,Zone,0^(1^),1^)<Object?,Object?>\", \"0^(Zone?,ZoneDelegate?,Zone,0^(1^,2^),1^,2^)<Object?,Object?,Object?>\", \"0^()(Zone,ZoneDelegate,Zone,0^())<Object?>\", \"0^(1^)(Zone,ZoneDelegate,Zone,0^(1^))<Object?,Object?>\", \"0^(1^,2^)(Zone,ZoneDelegate,Zone,0^(1^,2^))<Object?,Object?,Object?>\", \"AsyncError?(Zone,ZoneDelegate,Zone,Object,StackTrace?)\", \"~(Zone?,ZoneDelegate?,Zone,~())\", \"Timer(Zone,ZoneDelegate,Zone,Duration,~())\", \"Timer(Zone,ZoneDelegate,Zone,Duration,~(Timer))\", \"~(Zone,ZoneDelegate,Zone,String)\", \"~(String)\", \"Zone(Zone?,ZoneDelegate?,Zone,ZoneSpecification?,Map<Object?,Object?>?)\", \"Map<String,@>(DebugEvent)\", \"Null(~())\", \"0^(0^,0^)<num>\", \"~(@,StackTrace)\"],\n"
 "    interceptorsByTag: null,\n"
 "    leafTags: null,\n"
 "    arrayRti: Symbol(\"\$ti\"),\n"
@@ -22332,7 +22212,7 @@
 "      \"2;\": (t1, t2) => o => o instanceof A._Record_2 && t1._is(o._0) && t2._is(o._1)\n"
 "    }\n"
 "  };\n"
-"  A._Universe_addRules(init.typeUniverse, JSON.parse('{\"JavaScriptFunction\":\"LegacyJavaScriptObject\",\"PlainJavaScriptObject\":\"LegacyJavaScriptObject\",\"UnknownJavaScriptObject\":\"LegacyJavaScriptObject\",\"NativeSharedArrayBuffer\":\"NativeByteBuffer\",\"JavaScriptObject\":{\"JSObject\":[]},\"JSArray\":{\"List\":[\"1\"],\"JavaScriptObject\":[],\"EfficientLengthIterable\":[\"1\"],\"JSObject\":[],\"Iterable\":[\"1\"],\"Iterable.E\":\"1\"},\"JSBool\":{\"bool\":[],\"TrustedGetRuntimeType\":[]},\"JSNull\":{\"Null\":[],\"TrustedGetRuntimeType\":[]},\"LegacyJavaScriptObject\":{\"JavaScriptObject\":[],\"JSObject\":[]},\"JSArraySafeToStringHook\":{\"SafeToStringHook\":[]},\"JSUnmodifiableArray\":{\"JSArray\":[\"1\"],\"List\":[\"1\"],\"JavaScriptObject\":[],\"EfficientLengthIterable\":[\"1\"],\"JSObject\":[],\"Iterable\":[\"1\"],\"Iterable.E\":\"1\"},\"ArrayIterator\":{\"Iterator\":[\"1\"]},\"JSNumber\":{\"double\":[],\"num\":[],\"Comparable\":[\"num\"]},\"JSInt\":{\"double\":[],\"int\":[],\"num\":[],\"Comparable\":[\"num\"],\"TrustedGetRuntimeType\":[]},\"JSNumNotInt\":{\"double\":[],\"num\":[],\"Comparable\":[\"num\"],\"TrustedGetRuntimeType\":[]},\"JSString\":{\"String\":[],\"Comparable\":[\"String\"],\"Pattern\":[],\"TrustedGetRuntimeType\":[]},\"CastStream\":{\"Stream\":[\"2\"],\"Stream.T\":\"2\"},\"CastStreamSubscription\":{\"StreamSubscription\":[\"2\"]},\"_CastIterableBase\":{\"Iterable\":[\"2\"]},\"CastIterator\":{\"Iterator\":[\"2\"]},\"CastIterable\":{\"_CastIterableBase\":[\"1\",\"2\"],\"Iterable\":[\"2\"],\"Iterable.E\":\"2\"},\"_EfficientLengthCastIterable\":{\"CastIterable\":[\"1\",\"2\"],\"_CastIterableBase\":[\"1\",\"2\"],\"EfficientLengthIterable\":[\"2\"],\"Iterable\":[\"2\"],\"Iterable.E\":\"2\"},\"_CastListBase\":{\"ListBase\":[\"2\"],\"List\":[\"2\"],\"_CastIterableBase\":[\"1\",\"2\"],\"EfficientLengthIterable\":[\"2\"],\"Iterable\":[\"2\"]},\"CastList\":{\"_CastListBase\":[\"1\",\"2\"],\"ListBase\":[\"2\"],\"List\":[\"2\"],\"_CastIterableBase\":[\"1\",\"2\"],\"EfficientLengthIterable\":[\"2\"],\"Iterable\":[\"2\"],\"ListBase.E\":\"2\",\"Iterable.E\":\"2\"},\"CastMap\":{\"MapBase\":[\"3\",\"4\"],\"Map\":[\"3\",\"4\"],\"MapBase.K\":\"3\",\"MapBase.V\":\"4\"},\"LateError\":{\"Error\":[]},\"CodeUnits\":{\"ListBase\":[\"int\"],\"UnmodifiableListMixin\":[\"int\"],\"List\":[\"int\"],\"EfficientLengthIterable\":[\"int\"],\"Iterable\":[\"int\"],\"ListBase.E\":\"int\",\"Iterable.E\":\"int\",\"UnmodifiableListMixin.E\":\"int\"},\"EfficientLengthIterable\":{\"Iterable\":[\"1\"]},\"ListIterable\":{\"EfficientLengthIterable\":[\"1\"],\"Iterable\":[\"1\"]},\"SubListIterable\":{\"ListIterable\":[\"1\"],\"EfficientLengthIterable\":[\"1\"],\"Iterable\":[\"1\"],\"ListIterable.E\":\"1\",\"Iterable.E\":\"1\"},\"ListIterator\":{\"Iterator\":[\"1\"]},\"MappedIterable\":{\"Iterable\":[\"2\"],\"Iterable.E\":\"2\"},\"EfficientLengthMappedIterable\":{\"MappedIterable\":[\"1\",\"2\"],\"EfficientLengthIterable\":[\"2\"],\"Iterable\":[\"2\"],\"Iterable.E\":\"2\"},\"MappedIterator\":{\"Iterator\":[\"2\"]},\"MappedListIterable\":{\"ListIterable\":[\"2\"],\"EfficientLengthIterable\":[\"2\"],\"Iterable\":[\"2\"],\"ListIterable.E\":\"2\",\"Iterable.E\":\"2\"},\"WhereIterable\":{\"Iterable\":[\"1\"],\"Iterable.E\":\"1\"},\"WhereIterator\":{\"Iterator\":[\"1\"]},\"ExpandIterable\":{\"Iterable\":[\"2\"],\"Iterable.E\":\"2\"},\"ExpandIterator\":{\"Iterator\":[\"2\"]},\"TakeIterable\":{\"Iterable\":[\"1\"],\"Iterable.E\":\"1\"},\"EfficientLengthTakeIterable\":{\"TakeIterable\":[\"1\"],\"EfficientLengthIterable\":[\"1\"],\"Iterable\":[\"1\"],\"Iterable.E\":\"1\"},\"TakeIterator\":{\"Iterator\":[\"1\"]},\"SkipIterable\":{\"Iterable\":[\"1\"],\"Iterable.E\":\"1\"},\"EfficientLengthSkipIterable\":{\"SkipIterable\":[\"1\"],\"EfficientLengthIterable\":[\"1\"],\"Iterable\":[\"1\"],\"Iterable.E\":\"1\"},\"SkipIterator\":{\"Iterator\":[\"1\"]},\"EmptyIterable\":{\"EfficientLengthIterable\":[\"1\"],\"Iterable\":[\"1\"],\"Iterable.E\":\"1\"},\"EmptyIterator\":{\"Iterator\":[\"1\"]},\"WhereTypeIterable\":{\"Iterable\":[\"1\"],\"Iterable.E\":\"1\"},\"WhereTypeIterator\":{\"Iterator\":[\"1\"]},\"UnmodifiableListBase\":{\"ListBase\":[\"1\"],\"UnmodifiableListMixin\":[\"1\"],\"List\":[\"1\"],\"EfficientLengthIterable\":[\"1\"],\"Iterable\":[\"1\"]},\"ReversedListIterable\":{\"ListIterable\":[\"1\"],\"EfficientLengthIterable\":[\"1\"],\"Iterable\":[\"1\"],\"ListIterable.E\":\"1\",\"Iterable.E\":\"1\"},\"_Record_2\":{\"_Record2\":[],\"_Record\":[]},\"ConstantMap\":{\"Map\":[\"1\",\"2\"]},\"ConstantStringMap\":{\"ConstantMap\":[\"1\",\"2\"],\"Map\":[\"1\",\"2\"]},\"_KeysOrValues\":{\"Iterable\":[\"1\"],\"Iterable.E\":\"1\"},\"_KeysOrValuesOrElementsIterator\":{\"Iterator\":[\"1\"]},\"Instantiation\":{\"Closure\":[],\"Function\":[]},\"Instantiation1\":{\"Closure\":[],\"Function\":[]},\"NullError\":{\"TypeError\":[],\"Error\":[]},\"JsNoSuchMethodError\":{\"Error\":[]},\"UnknownJsTypeError\":{\"Error\":[]},\"NullThrownFromJavaScriptException\":{\"Exception\":[]},\"_StackTrace\":{\"StackTrace\":[]},\"Closure\":{\"Function\":[]},\"Closure0Args\":{\"Closure\":[],\"Function\":[]},\"Closure2Args\":{\"Closure\":[],\"Function\":[]},\"TearOffClosure\":{\"Closure\":[],\"Function\":[]},\"StaticClosure\":{\"Closure\":[],\"Function\":[]},\"BoundClosure\":{\"Closure\":[],\"Function\":[]},\"RuntimeError\":{\"Error\":[]},\"JsLinkedHashMap\":{\"MapBase\":[\"1\",\"2\"],\"LinkedHashMap\":[\"1\",\"2\"],\"Map\":[\"1\",\"2\"],\"MapBase.K\":\"1\",\"MapBase.V\":\"2\"},\"LinkedHashMapKeysIterable\":{\"EfficientLengthIterable\":[\"1\"],\"Iterable\":[\"1\"],\"Iterable.E\":\"1\"},\"LinkedHashMapKeyIterator\":{\"Iterator\":[\"1\"]},\"LinkedHashMapValuesIterable\":{\"EfficientLengthIterable\":[\"1\"],\"Iterable\":[\"1\"],\"Iterable.E\":\"1\"},\"LinkedHashMapValueIterator\":{\"Iterator\":[\"1\"]},\"LinkedHashMapEntriesIterable\":{\"EfficientLengthIterable\":[\"MapEntry<1,2>\"],\"Iterable\":[\"MapEntry<1,2>\"],\"Iterable.E\":\"MapEntry<1,2>\"},\"LinkedHashMapEntryIterator\":{\"Iterator\":[\"MapEntry<1,2>\"]},\"JsIdentityLinkedHashMap\":{\"JsLinkedHashMap\":[\"1\",\"2\"],\"MapBase\":[\"1\",\"2\"],\"LinkedHashMap\":[\"1\",\"2\"],\"Map\":[\"1\",\"2\"],\"MapBase.K\":\"1\",\"MapBase.V\":\"2\"},\"_Record2\":{\"_Record\":[]},\"JSSyntaxRegExp\":{\"RegExp\":[],\"Pattern\":[]},\"_MatchImplementation\":{\"RegExpMatch\":[],\"Match\":[]},\"_AllMatchesIterable\":{\"Iterable\":[\"RegExpMatch\"],\"Iterable.E\":\"RegExpMatch\"},\"_AllMatchesIterator\":{\"Iterator\":[\"RegExpMatch\"]},\"StringMatch\":{\"Match\":[]},\"_StringAllMatchesIterable\":{\"Iterable\":[\"Match\"],\"Iterable.E\":\"Match\"},\"_StringAllMatchesIterator\":{\"Iterator\":[\"Match\"]},\"NativeByteBuffer\":{\"JavaScriptObject\":[],\"JSObject\":[],\"ByteBuffer\":[],\"TrustedGetRuntimeType\":[]},\"NativeArrayBuffer\":{\"NativeByteBuffer\":[],\"JavaScriptObject\":[],\"JSObject\":[],\"ByteBuffer\":[],\"TrustedGetRuntimeType\":[]},\"NativeTypedData\":{\"JavaScriptObject\":[],\"JSObject\":[]},\"_UnmodifiableNativeByteBufferView\":{\"ByteBuffer\":[]},\"NativeByteData\":{\"JavaScriptObject\":[],\"ByteData\":[],\"JSObject\":[],\"TrustedGetRuntimeType\":[]},\"NativeTypedArray\":{\"JavaScriptIndexingBehavior\":[\"1\"],\"JavaScriptObject\":[],\"JSObject\":[]},\"NativeTypedArrayOfDouble\":{\"ListBase\":[\"double\"],\"NativeTypedArray\":[\"double\"],\"List\":[\"double\"],\"JavaScriptIndexingBehavior\":[\"double\"],\"JavaScriptObject\":[],\"EfficientLengthIterable\":[\"double\"],\"JSObject\":[],\"Iterable\":[\"double\"],\"FixedLengthListMixin\":[\"double\"]},\"NativeTypedArrayOfInt\":{\"ListBase\":[\"int\"],\"NativeTypedArray\":[\"int\"],\"List\":[\"int\"],\"JavaScriptIndexingBehavior\":[\"int\"],\"JavaScriptObject\":[],\"EfficientLengthIterable\":[\"int\"],\"JSObject\":[],\"Iterable\":[\"int\"],\"FixedLengthListMixin\":[\"int\"]},\"NativeFloat32List\":{\"Float32List\":[],\"ListBase\":[\"double\"],\"NativeTypedArray\":[\"double\"],\"List\":[\"double\"],\"JavaScriptIndexingBehavior\":[\"double\"],\"JavaScriptObject\":[],\"EfficientLengthIterable\":[\"double\"],\"JSObject\":[],\"Iterable\":[\"double\"],\"FixedLengthListMixin\":[\"double\"],\"TrustedGetRuntimeType\":[],\"ListBase.E\":\"double\",\"Iterable.E\":\"double\",\"FixedLengthListMixin.E\":\"double\"},\"NativeFloat64List\":{\"Float64List\":[],\"ListBase\":[\"double\"],\"NativeTypedArray\":[\"double\"],\"List\":[\"double\"],\"JavaScriptIndexingBehavior\":[\"double\"],\"JavaScriptObject\":[],\"EfficientLengthIterable\":[\"double\"],\"JSObject\":[],\"Iterable\":[\"double\"],\"FixedLengthListMixin\":[\"double\"],\"TrustedGetRuntimeType\":[],\"ListBase.E\":\"double\",\"Iterable.E\":\"double\",\"FixedLengthListMixin.E\":\"double\"},\"NativeInt16List\":{\"NativeTypedArrayOfInt\":[],\"Int16List\":[],\"ListBase\":[\"int\"],\"NativeTypedArray\":[\"int\"],\"List\":[\"int\"],\"JavaScriptIndexingBehavior\":[\"int\"],\"JavaScriptObject\":[],\"EfficientLengthIterable\":[\"int\"],\"JSObject\":[],\"Iterable\":[\"int\"],\"FixedLengthListMixin\":[\"int\"],\"TrustedGetRuntimeType\":[],\"ListBase.E\":\"int\",\"Iterable.E\":\"int\",\"FixedLengthListMixin.E\":\"int\"},\"NativeInt32List\":{\"NativeTypedArrayOfInt\":[],\"Int32List\":[],\"ListBase\":[\"int\"],\"NativeTypedArray\":[\"int\"],\"List\":[\"int\"],\"JavaScriptIndexingBehavior\":[\"int\"],\"JavaScriptObject\":[],\"EfficientLengthIterable\":[\"int\"],\"JSObject\":[],\"Iterable\":[\"int\"],\"FixedLengthListMixin\":[\"int\"],\"TrustedGetRuntimeType\":[],\"ListBase.E\":\"int\",\"Iterable.E\":\"int\",\"FixedLengthListMixin.E\":\"int\"},\"NativeInt8List\":{\"NativeTypedArrayOfInt\":[],\"Int8List\":[],\"ListBase\":[\"int\"],\"NativeTypedArray\":[\"int\"],\"List\":[\"int\"],\"JavaScriptIndexingBehavior\":[\"int\"],\"JavaScriptObject\":[],\"EfficientLengthIterable\":[\"int\"],\"JSObject\":[],\"Iterable\":[\"int\"],\"FixedLengthListMixin\":[\"int\"],\"TrustedGetRuntimeType\":[],\"ListBase.E\":\"int\",\"Iterable.E\":\"int\",\"FixedLengthListMixin.E\":\"int\"},\"NativeUint16List\":{\"NativeTypedArrayOfInt\":[],\"Uint16List\":[],\"ListBase\":[\"int\"],\"NativeTypedArray\":[\"int\"],\"List\":[\"int\"],\"JavaScriptIndexingBehavior\":[\"int\"],\"JavaScriptObject\":[],\"EfficientLengthIterable\":[\"int\"],\"JSObject\":[],\"Iterable\":[\"int\"],\"FixedLengthListMixin\":[\"int\"],\"TrustedGetRuntimeType\":[],\"ListBase.E\":\"int\",\"Iterable.E\":\"int\",\"FixedLengthListMixin.E\":\"int\"},\"NativeUint32List\":{\"NativeTypedArrayOfInt\":[],\"Uint32List\":[],\"ListBase\":[\"int\"],\"NativeTypedArray\":[\"int\"],\"List\":[\"int\"],\"JavaScriptIndexingBehavior\":[\"int\"],\"JavaScriptObject\":[],\"EfficientLengthIterable\":[\"int\"],\"JSObject\":[],\"Iterable\":[\"int\"],\"FixedLengthListMixin\":[\"int\"],\"TrustedGetRuntimeType\":[],\"ListBase.E\":\"int\",\"Iterable.E\":\"int\",\"FixedLengthListMixin.E\":\"int\"},\"NativeUint8ClampedList\":{\"NativeTypedArrayOfInt\":[],\"Uint8ClampedList\":[],\"ListBase\":[\"int\"],\"NativeTypedArray\":[\"int\"],\"List\":[\"int\"],\"JavaScriptIndexingBehavior\":[\"int\"],\"JavaScriptObject\":[],\"EfficientLengthIterable\":[\"int\"],\"JSObject\":[],\"Iterable\":[\"int\"],\"FixedLengthListMixin\":[\"int\"],\"TrustedGetRuntimeType\":[],\"ListBase.E\":\"int\",\"Iterable.E\":\"int\",\"FixedLengthListMixin.E\":\"int\"},\"NativeUint8List\":{\"NativeTypedArrayOfInt\":[],\"Uint8List\":[],\"ListBase\":[\"int\"],\"NativeTypedArray\":[\"int\"],\"List\":[\"int\"],\"JavaScriptIndexingBehavior\":[\"int\"],\"JavaScriptObject\":[],\"EfficientLengthIterable\":[\"int\"],\"JSObject\":[],\"Iterable\":[\"int\"],\"FixedLengthListMixin\":[\"int\"],\"TrustedGetRuntimeType\":[],\"ListBase.E\":\"int\",\"Iterable.E\":\"int\",\"FixedLengthListMixin.E\":\"int\"},\"_Error\":{\"Error\":[]},\"_TypeError\":{\"TypeError\":[],\"Error\":[]},\"AsyncError\":{\"Error\":[]},\"_Future\":{\"Future\":[\"1\"]},\"_TimerImpl\":{\"Timer\":[]},\"_AsyncAwaitCompleter\":{\"Completer\":[\"1\"]},\"_Completer\":{\"Completer\":[\"1\"]},\"_AsyncCompleter\":{\"_Completer\":[\"1\"],\"Completer\":[\"1\"]},\"_SyncCompleter\":{\"_Completer\":[\"1\"],\"Completer\":[\"1\"]},\"StreamView\":{\"Stream\":[\"1\"]},\"_StreamController\":{\"StreamController\":[\"1\"],\"StreamSink\":[\"1\"],\"_StreamControllerLifecycle\":[\"1\"],\"_EventSink\":[\"1\"],\"_EventDispatch\":[\"1\"]},\"_AsyncStreamController\":{\"_AsyncStreamControllerDispatch\":[\"1\"],\"_StreamController\":[\"1\"],\"StreamController\":[\"1\"],\"StreamSink\":[\"1\"],\"_StreamControllerLifecycle\":[\"1\"],\"_EventSink\":[\"1\"],\"_EventDispatch\":[\"1\"]},\"_ControllerStream\":{\"_StreamImpl\":[\"1\"],\"Stream\":[\"1\"],\"Stream.T\":\"1\"},\"_ControllerSubscription\":{\"_BufferingStreamSubscription\":[\"1\"],\"StreamSubscription\":[\"1\"],\"_EventSink\":[\"1\"],\"_EventDispatch\":[\"1\"],\"_BufferingStreamSubscription.T\":\"1\"},\"_StreamSinkWrapper\":{\"StreamSink\":[\"1\"]},\"_StreamControllerAddStreamState\":{\"_AddStreamState\":[\"1\"]},\"_BufferingStreamSubscription\":{\"StreamSubscription\":[\"1\"],\"_EventSink\":[\"1\"],\"_EventDispatch\":[\"1\"],\"_BufferingStreamSubscription.T\":\"1\"},\"_StreamImpl\":{\"Stream\":[\"1\"]},\"_DelayedData\":{\"_DelayedEvent\":[\"1\"]},\"_DelayedError\":{\"_DelayedEvent\":[\"@\"]},\"_DelayedDone\":{\"_DelayedEvent\":[\"@\"]},\"_DoneStreamSubscription\":{\"StreamSubscription\":[\"1\"]},\"_EmptyStream\":{\"Stream\":[\"1\"],\"Stream.T\":\"1\"},\"_ForwardingStream\":{\"Stream\":[\"2\"]},\"_ForwardingStreamSubscription\":{\"_BufferingStreamSubscription\":[\"2\"],\"StreamSubscription\":[\"2\"],\"_EventSink\":[\"2\"],\"_EventDispatch\":[\"2\"],\"_BufferingStreamSubscription.T\":\"2\"},\"_MapStream\":{\"_ForwardingStream\":[\"1\",\"2\"],\"Stream\":[\"2\"],\"Stream.T\":\"2\"},\"_Zone\":{\"Zone\":[]},\"_CustomZone\":{\"_Zone\":[],\"Zone\":[]},\"_RootZone\":{\"_Zone\":[],\"Zone\":[]},\"_ZoneDelegate\":{\"ZoneDelegate\":[]},\"_ZoneSpecification\":{\"ZoneSpecification\":[]},\"_SplayTreeSetNode\":{\"_SplayTreeNode\":[\"1\",\"_SplayTreeSetNode<1>\"],\"_SplayTreeNode.K\":\"1\",\"_SplayTreeNode.1\":\"_SplayTreeSetNode<1>\"},\"_HashMap\":{\"MapBase\":[\"1\",\"2\"],\"HashMap\":[\"1\",\"2\"],\"Map\":[\"1\",\"2\"],\"MapBase.K\":\"1\",\"MapBase.V\":\"2\"},\"_IdentityHashMap\":{\"_HashMap\":[\"1\",\"2\"],\"MapBase\":[\"1\",\"2\"],\"HashMap\":[\"1\",\"2\"],\"Map\":[\"1\",\"2\"],\"MapBase.K\":\"1\",\"MapBase.V\":\"2\"},\"_HashMapKeyIterable\":{\"EfficientLengthIterable\":[\"1\"],\"Iterable\":[\"1\"],\"Iterable.E\":\"1\"},\"_HashMapKeyIterator\":{\"Iterator\":[\"1\"]},\"_LinkedCustomHashMap\":{\"JsLinkedHashMap\":[\"1\",\"2\"],\"MapBase\":[\"1\",\"2\"],\"LinkedHashMap\":[\"1\",\"2\"],\"Map\":[\"1\",\"2\"],\"MapBase.K\":\"1\",\"MapBase.V\":\"2\"},\"_HashSet\":{\"SetBase\":[\"1\"],\"EfficientLengthIterable\":[\"1\"],\"Iterable\":[\"1\"],\"Iterable.E\":\"1\"},\"_HashSetIterator\":{\"Iterator\":[\"1\"]},\"ListBase\":{\"List\":[\"1\"],\"EfficientLengthIterable\":[\"1\"],\"Iterable\":[\"1\"]},\"MapBase\":{\"Map\":[\"1\",\"2\"]},\"MapView\":{\"Map\":[\"1\",\"2\"]},\"UnmodifiableMapView\":{\"_UnmodifiableMapView_MapView__UnmodifiableMapMixin\":[\"1\",\"2\"],\"MapView\":[\"1\",\"2\"],\"_UnmodifiableMapMixin\":[\"1\",\"2\"],\"Map\":[\"1\",\"2\"]},\"ListQueue\":{\"Queue\":[\"1\"],\"ListIterable\":[\"1\"],\"EfficientLengthIterable\":[\"1\"],\"Iterable\":[\"1\"],\"ListIterable.E\":\"1\",\"Iterable.E\":\"1\"},\"_ListQueueIterator\":{\"Iterator\":[\"1\"]},\"SetBase\":{\"EfficientLengthIterable\":[\"1\"],\"Iterable\":[\"1\"]},\"_SetBase\":{\"SetBase\":[\"1\"],\"EfficientLengthIterable\":[\"1\"],\"Iterable\":[\"1\"]},\"_SplayTreeIterator\":{\"Iterator\":[\"3\"]},\"_SplayTreeKeyIterator\":{\"_SplayTreeIterator\":[\"1\",\"2\",\"1\"],\"Iterator\":[\"1\"],\"_SplayTreeIterator.K\":\"1\",\"_SplayTreeIterator.T\":\"1\",\"_SplayTreeIterator.1\":\"2\"},\"SplayTreeSet\":{\"SetBase\":[\"1\"],\"EfficientLengthIterable\":[\"1\"],\"_SplayTree\":[\"1\",\"_SplayTreeSetNode<1>\"],\"Iterable\":[\"1\"],\"Iterable.E\":\"1\",\"_SplayTree.1\":\"_SplayTreeSetNode<1>\",\"_SplayTree.K\":\"1\"},\"Encoding\":{\"Codec\":[\"String\",\"List<int>\"]},\"_JsonMap\":{\"MapBase\":[\"String\",\"@\"],\"Map\":[\"String\",\"@\"],\"MapBase.K\":\"String\",\"MapBase.V\":\"@\"},\"_JsonMapKeyIterable\":{\"ListIterable\":[\"String\"],\"EfficientLengthIterable\":[\"String\"],\"Iterable\":[\"String\"],\"ListIterable.E\":\"String\",\"Iterable.E\":\"String\"},\"AsciiCodec\":{\"Encoding\":[],\"Codec\":[\"String\",\"List<int>\"]},\"_UnicodeSubsetEncoder\":{\"Converter\":[\"String\",\"List<int>\"]},\"AsciiEncoder\":{\"Converter\":[\"String\",\"List<int>\"]},\"_UnicodeSubsetDecoder\":{\"Converter\":[\"List<int>\",\"String\"]},\"AsciiDecoder\":{\"Converter\":[\"List<int>\",\"String\"]},\"Base64Codec\":{\"Codec\":[\"List<int>\",\"String\"]},\"Base64Encoder\":{\"Converter\":[\"List<int>\",\"String\"]},\"JsonUnsupportedObjectError\":{\"Error\":[]},\"JsonCyclicError\":{\"Error\":[]},\"JsonCodec\":{\"Codec\":[\"Object?\",\"String\"]},\"JsonEncoder\":{\"Converter\":[\"Object?\",\"String\"]},\"JsonDecoder\":{\"Converter\":[\"String\",\"Object?\"]},\"Latin1Codec\":{\"Encoding\":[],\"Codec\":[\"String\",\"List<int>\"]},\"Latin1Encoder\":{\"Converter\":[\"String\",\"List<int>\"]},\"Latin1Decoder\":{\"Converter\":[\"List<int>\",\"String\"]},\"Utf8Codec\":{\"Encoding\":[],\"Codec\":[\"String\",\"List<int>\"]},\"Utf8Encoder\":{\"Converter\":[\"String\",\"List<int>\"]},\"Utf8Decoder\":{\"Converter\":[\"List<int>\",\"String\"]},\"DateTime\":{\"Comparable\":[\"DateTime\"]},\"double\":{\"num\":[],\"Comparable\":[\"num\"]},\"Duration\":{\"Comparable\":[\"Duration\"]},\"int\":{\"num\":[],\"Comparable\":[\"num\"]},\"List\":{\"EfficientLengthIterable\":[\"1\"],\"Iterable\":[\"1\"]},\"num\":{\"Comparable\":[\"num\"]},\"RegExpMatch\":{\"Match\":[]},\"String\":{\"Comparable\":[\"String\"],\"Pattern\":[]},\"AssertionError\":{\"Error\":[]},\"TypeError\":{\"Error\":[]},\"ArgumentError\":{\"Error\":[]},\"RangeError\":{\"Error\":[]},\"IndexError\":{\"Error\":[]},\"UnsupportedError\":{\"Error\":[]},\"UnimplementedError\":{\"Error\":[]},\"StateError\":{\"Error\":[]},\"ConcurrentModificationError\":{\"Error\":[]},\"OutOfMemoryError\":{\"Error\":[]},\"StackOverflowError\":{\"Error\":[]},\"_Exception\":{\"Exception\":[]},\"FormatException\":{\"Exception\":[]},\"_StringStackTrace\":{\"StackTrace\":[]},\"StringBuffer\":{\"StringSink\":[]},\"_Uri\":{\"Uri\":[]},\"_SimpleUri\":{\"Uri\":[]},\"_DataUri\":{\"Uri\":[]},\"NullRejectionException\":{\"Exception\":[]},\"ErrorResult\":{\"Result\":[\"0&\"]},\"ValueResult\":{\"Result\":[\"1\"]},\"_NextRequest\":{\"_EventRequest\":[\"1\"]},\"_HasNextRequest\":{\"_EventRequest\":[\"1\"]},\"CanonicalizedMap\":{\"Map\":[\"2\",\"3\"]},\"QueueList\":{\"ListBase\":[\"1\"],\"List\":[\"1\"],\"Queue\":[\"1\"],\"EfficientLengthIterable\":[\"1\"],\"Iterable\":[\"1\"],\"ListBase.E\":\"1\",\"QueueList.E\":\"1\",\"Iterable.E\":\"1\"},\"_CastQueueList\":{\"QueueList\":[\"2\"],\"ListBase\":[\"2\"],\"List\":[\"2\"],\"Queue\":[\"2\"],\"EfficientLengthIterable\":[\"2\"],\"Iterable\":[\"2\"],\"ListBase.E\":\"2\",\"QueueList.E\":\"2\",\"Iterable.E\":\"2\"},\"PersistentWebSocket\":{\"StreamChannelMixin\":[\"@\"]},\"SseSocketClient\":{\"SocketClient\":[]},\"WebSocketClient\":{\"SocketClient\":[]},\"ByteStream\":{\"StreamView\":[\"List<int>\"],\"Stream\":[\"List<int>\"],\"Stream.T\":\"List<int>\",\"StreamView.T\":\"List<int>\"},\"ClientException\":{\"Exception\":[]},\"Request\":{\"BaseRequest\":[]},\"StreamedResponseV2\":{\"StreamedResponse\":[]},\"CaseInsensitiveMap\":{\"CanonicalizedMap\":[\"String\",\"String\",\"1\"],\"Map\":[\"String\",\"1\"],\"CanonicalizedMap.K\":\"String\",\"CanonicalizedMap.V\":\"1\",\"CanonicalizedMap.C\":\"String\"},\"Level\":{\"Comparable\":[\"Level\"]},\"PathException\":{\"Exception\":[]},\"PosixStyle\":{\"InternalStyle\":[]},\"UrlStyle\":{\"InternalStyle\":[]},\"WindowsStyle\":{\"InternalStyle\":[]},\"FileLocation\":{\"SourceLocation\":[],\"Comparable\":[\"SourceLocation\"]},\"_FileSpan\":{\"SourceSpanWithContext\":[],\"SourceSpan\":[],\"Comparable\":[\"SourceSpan\"]},\"SourceLocation\":{\"Comparable\":[\"SourceLocation\"]},\"SourceLocationMixin\":{\"SourceLocation\":[],\"Comparable\":[\"SourceLocation\"]},\"SourceSpan\":{\"Comparable\":[\"SourceSpan\"]},\"SourceSpanBase\":{\"SourceSpan\":[],\"Comparable\":[\"SourceSpan\"]},\"SourceSpanException\":{\"Exception\":[]},\"SourceSpanFormatException\":{\"FormatException\":[],\"Exception\":[]},\"SourceSpanMixin\":{\"SourceSpan\":[],\"Comparable\":[\"SourceSpan\"]},\"SourceSpanWithContext\":{\"SourceSpan\":[],\"Comparable\":[\"SourceSpan\"]},\"SseClient\":{\"StreamChannelMixin\":[\"String?\"]},\"StringScannerException\":{\"FormatException\":[],\"Exception\":[]},\"_EventStream\":{\"Stream\":[\"1\"],\"Stream.T\":\"1\"},\"_EventStreamSubscription\":{\"StreamSubscription\":[\"1\"]},\"BrowserWebSocket\":{\"WebSocket\":[]},\"TextDataReceived\":{\"WebSocketEvent\":[]},\"BinaryDataReceived\":{\"WebSocketEvent\":[]},\"CloseReceived\":{\"WebSocketEvent\":[]},\"WebSocketException\":{\"Exception\":[]},\"WebSocketConnectionClosed\":{\"Exception\":[]},\"DdcLibraryBundleRestarter\":{\"Restarter\":[]},\"DdcRestarter\":{\"Restarter\":[]},\"RequireRestarter\":{\"Restarter\":[]},\"HotReloadFailedException\":{\"Exception\":[]},\"Int8List\":{\"List\":[\"int\"],\"EfficientLengthIterable\":[\"int\"],\"Iterable\":[\"int\"]},\"Uint8List\":{\"List\":[\"int\"],\"EfficientLengthIterable\":[\"int\"],\"Iterable\":[\"int\"]},\"Uint8ClampedList\":{\"List\":[\"int\"],\"EfficientLengthIterable\":[\"int\"],\"Iterable\":[\"int\"]},\"Int16List\":{\"List\":[\"int\"],\"EfficientLengthIterable\":[\"int\"],\"Iterable\":[\"int\"]},\"Uint16List\":{\"List\":[\"int\"],\"EfficientLengthIterable\":[\"int\"],\"Iterable\":[\"int\"]},\"Int32List\":{\"List\":[\"int\"],\"EfficientLengthIterable\":[\"int\"],\"Iterable\":[\"int\"]},\"Uint32List\":{\"List\":[\"int\"],\"EfficientLengthIterable\":[\"int\"],\"Iterable\":[\"int\"]},\"Float32List\":{\"List\":[\"double\"],\"EfficientLengthIterable\":[\"double\"],\"Iterable\":[\"double\"]},\"Float64List\":{\"List\":[\"double\"],\"EfficientLengthIterable\":[\"double\"],\"Iterable\":[\"double\"]}}'));\n"
+"  A._Universe_addRules(init.typeUniverse, JSON.parse('{\"JavaScriptFunction\":\"LegacyJavaScriptObject\",\"PlainJavaScriptObject\":\"LegacyJavaScriptObject\",\"UnknownJavaScriptObject\":\"LegacyJavaScriptObject\",\"NativeSharedArrayBuffer\":\"NativeByteBuffer\",\"JavaScriptObject\":{\"JSObject\":[]},\"JSArray\":{\"List\":[\"1\"],\"JavaScriptObject\":[],\"EfficientLengthIterable\":[\"1\"],\"JSObject\":[],\"Iterable\":[\"1\"],\"Iterable.E\":\"1\"},\"JSBool\":{\"bool\":[],\"TrustedGetRuntimeType\":[]},\"JSNull\":{\"Null\":[],\"TrustedGetRuntimeType\":[]},\"LegacyJavaScriptObject\":{\"JavaScriptObject\":[],\"JSObject\":[]},\"JSArraySafeToStringHook\":{\"SafeToStringHook\":[]},\"JSUnmodifiableArray\":{\"JSArray\":[\"1\"],\"List\":[\"1\"],\"JavaScriptObject\":[],\"EfficientLengthIterable\":[\"1\"],\"JSObject\":[],\"Iterable\":[\"1\"],\"Iterable.E\":\"1\"},\"ArrayIterator\":{\"Iterator\":[\"1\"]},\"JSNumber\":{\"double\":[],\"num\":[],\"Comparable\":[\"num\"]},\"JSInt\":{\"double\":[],\"int\":[],\"num\":[],\"Comparable\":[\"num\"],\"TrustedGetRuntimeType\":[]},\"JSNumNotInt\":{\"double\":[],\"num\":[],\"Comparable\":[\"num\"],\"TrustedGetRuntimeType\":[]},\"JSString\":{\"String\":[],\"Comparable\":[\"String\"],\"Pattern\":[],\"TrustedGetRuntimeType\":[]},\"CastStream\":{\"Stream\":[\"2\"],\"Stream.T\":\"2\"},\"CastStreamSubscription\":{\"StreamSubscription\":[\"2\"]},\"_CastIterableBase\":{\"Iterable\":[\"2\"]},\"CastIterator\":{\"Iterator\":[\"2\"]},\"CastIterable\":{\"_CastIterableBase\":[\"1\",\"2\"],\"Iterable\":[\"2\"],\"Iterable.E\":\"2\"},\"_EfficientLengthCastIterable\":{\"CastIterable\":[\"1\",\"2\"],\"_CastIterableBase\":[\"1\",\"2\"],\"EfficientLengthIterable\":[\"2\"],\"Iterable\":[\"2\"],\"Iterable.E\":\"2\"},\"_CastListBase\":{\"ListBase\":[\"2\"],\"List\":[\"2\"],\"_CastIterableBase\":[\"1\",\"2\"],\"EfficientLengthIterable\":[\"2\"],\"Iterable\":[\"2\"]},\"CastList\":{\"_CastListBase\":[\"1\",\"2\"],\"ListBase\":[\"2\"],\"List\":[\"2\"],\"_CastIterableBase\":[\"1\",\"2\"],\"EfficientLengthIterable\":[\"2\"],\"Iterable\":[\"2\"],\"ListBase.E\":\"2\",\"Iterable.E\":\"2\"},\"CastMap\":{\"MapBase\":[\"3\",\"4\"],\"Map\":[\"3\",\"4\"],\"MapBase.K\":\"3\",\"MapBase.V\":\"4\"},\"LateError\":{\"Error\":[]},\"CodeUnits\":{\"ListBase\":[\"int\"],\"UnmodifiableListMixin\":[\"int\"],\"List\":[\"int\"],\"EfficientLengthIterable\":[\"int\"],\"Iterable\":[\"int\"],\"ListBase.E\":\"int\",\"Iterable.E\":\"int\",\"UnmodifiableListMixin.E\":\"int\"},\"EfficientLengthIterable\":{\"Iterable\":[\"1\"]},\"ListIterable\":{\"EfficientLengthIterable\":[\"1\"],\"Iterable\":[\"1\"]},\"SubListIterable\":{\"ListIterable\":[\"1\"],\"EfficientLengthIterable\":[\"1\"],\"Iterable\":[\"1\"],\"ListIterable.E\":\"1\",\"Iterable.E\":\"1\"},\"ListIterator\":{\"Iterator\":[\"1\"]},\"MappedIterable\":{\"Iterable\":[\"2\"],\"Iterable.E\":\"2\"},\"EfficientLengthMappedIterable\":{\"MappedIterable\":[\"1\",\"2\"],\"EfficientLengthIterable\":[\"2\"],\"Iterable\":[\"2\"],\"Iterable.E\":\"2\"},\"MappedIterator\":{\"Iterator\":[\"2\"]},\"MappedListIterable\":{\"ListIterable\":[\"2\"],\"EfficientLengthIterable\":[\"2\"],\"Iterable\":[\"2\"],\"ListIterable.E\":\"2\",\"Iterable.E\":\"2\"},\"WhereIterable\":{\"Iterable\":[\"1\"],\"Iterable.E\":\"1\"},\"WhereIterator\":{\"Iterator\":[\"1\"]},\"ExpandIterable\":{\"Iterable\":[\"2\"],\"Iterable.E\":\"2\"},\"ExpandIterator\":{\"Iterator\":[\"2\"]},\"TakeIterable\":{\"Iterable\":[\"1\"],\"Iterable.E\":\"1\"},\"EfficientLengthTakeIterable\":{\"TakeIterable\":[\"1\"],\"EfficientLengthIterable\":[\"1\"],\"Iterable\":[\"1\"],\"Iterable.E\":\"1\"},\"TakeIterator\":{\"Iterator\":[\"1\"]},\"SkipIterable\":{\"Iterable\":[\"1\"],\"Iterable.E\":\"1\"},\"EfficientLengthSkipIterable\":{\"SkipIterable\":[\"1\"],\"EfficientLengthIterable\":[\"1\"],\"Iterable\":[\"1\"],\"Iterable.E\":\"1\"},\"SkipIterator\":{\"Iterator\":[\"1\"]},\"EmptyIterable\":{\"EfficientLengthIterable\":[\"1\"],\"Iterable\":[\"1\"],\"Iterable.E\":\"1\"},\"EmptyIterator\":{\"Iterator\":[\"1\"]},\"WhereTypeIterable\":{\"Iterable\":[\"1\"],\"Iterable.E\":\"1\"},\"WhereTypeIterator\":{\"Iterator\":[\"1\"]},\"UnmodifiableListBase\":{\"ListBase\":[\"1\"],\"UnmodifiableListMixin\":[\"1\"],\"List\":[\"1\"],\"EfficientLengthIterable\":[\"1\"],\"Iterable\":[\"1\"]},\"ReversedListIterable\":{\"ListIterable\":[\"1\"],\"EfficientLengthIterable\":[\"1\"],\"Iterable\":[\"1\"],\"ListIterable.E\":\"1\",\"Iterable.E\":\"1\"},\"_Record_2\":{\"_Record2\":[],\"_Record\":[]},\"ConstantMap\":{\"Map\":[\"1\",\"2\"]},\"ConstantStringMap\":{\"ConstantMap\":[\"1\",\"2\"],\"Map\":[\"1\",\"2\"]},\"_KeysOrValues\":{\"Iterable\":[\"1\"],\"Iterable.E\":\"1\"},\"_KeysOrValuesOrElementsIterator\":{\"Iterator\":[\"1\"]},\"Instantiation\":{\"Closure\":[],\"Function\":[]},\"Instantiation1\":{\"Closure\":[],\"Function\":[]},\"NullError\":{\"TypeError\":[],\"Error\":[]},\"JsNoSuchMethodError\":{\"Error\":[]},\"UnknownJsTypeError\":{\"Error\":[]},\"NullThrownFromJavaScriptException\":{\"Exception\":[]},\"_StackTrace\":{\"StackTrace\":[]},\"Closure\":{\"Function\":[]},\"Closure0Args\":{\"Closure\":[],\"Function\":[]},\"Closure2Args\":{\"Closure\":[],\"Function\":[]},\"TearOffClosure\":{\"Closure\":[],\"Function\":[]},\"StaticClosure\":{\"Closure\":[],\"Function\":[]},\"BoundClosure\":{\"Closure\":[],\"Function\":[]},\"RuntimeError\":{\"Error\":[]},\"JsLinkedHashMap\":{\"MapBase\":[\"1\",\"2\"],\"LinkedHashMap\":[\"1\",\"2\"],\"Map\":[\"1\",\"2\"],\"MapBase.K\":\"1\",\"MapBase.V\":\"2\"},\"LinkedHashMapKeysIterable\":{\"EfficientLengthIterable\":[\"1\"],\"Iterable\":[\"1\"],\"Iterable.E\":\"1\"},\"LinkedHashMapKeyIterator\":{\"Iterator\":[\"1\"]},\"LinkedHashMapValuesIterable\":{\"EfficientLengthIterable\":[\"1\"],\"Iterable\":[\"1\"],\"Iterable.E\":\"1\"},\"LinkedHashMapValueIterator\":{\"Iterator\":[\"1\"]},\"LinkedHashMapEntriesIterable\":{\"EfficientLengthIterable\":[\"MapEntry<1,2>\"],\"Iterable\":[\"MapEntry<1,2>\"],\"Iterable.E\":\"MapEntry<1,2>\"},\"LinkedHashMapEntryIterator\":{\"Iterator\":[\"MapEntry<1,2>\"]},\"JsIdentityLinkedHashMap\":{\"JsLinkedHashMap\":[\"1\",\"2\"],\"MapBase\":[\"1\",\"2\"],\"LinkedHashMap\":[\"1\",\"2\"],\"Map\":[\"1\",\"2\"],\"MapBase.K\":\"1\",\"MapBase.V\":\"2\"},\"_Record2\":{\"_Record\":[]},\"JSSyntaxRegExp\":{\"RegExp\":[],\"Pattern\":[]},\"_MatchImplementation\":{\"RegExpMatch\":[],\"Match\":[]},\"_AllMatchesIterable\":{\"Iterable\":[\"RegExpMatch\"],\"Iterable.E\":\"RegExpMatch\"},\"_AllMatchesIterator\":{\"Iterator\":[\"RegExpMatch\"]},\"StringMatch\":{\"Match\":[]},\"_StringAllMatchesIterable\":{\"Iterable\":[\"Match\"],\"Iterable.E\":\"Match\"},\"_StringAllMatchesIterator\":{\"Iterator\":[\"Match\"]},\"NativeByteBuffer\":{\"JavaScriptObject\":[],\"JSObject\":[],\"ByteBuffer\":[],\"TrustedGetRuntimeType\":[]},\"NativeArrayBuffer\":{\"NativeByteBuffer\":[],\"JavaScriptObject\":[],\"JSObject\":[],\"ByteBuffer\":[],\"TrustedGetRuntimeType\":[]},\"NativeTypedData\":{\"JavaScriptObject\":[],\"JSObject\":[]},\"_UnmodifiableNativeByteBufferView\":{\"ByteBuffer\":[]},\"NativeByteData\":{\"JavaScriptObject\":[],\"ByteData\":[],\"JSObject\":[],\"TrustedGetRuntimeType\":[]},\"NativeTypedArray\":{\"JavaScriptIndexingBehavior\":[\"1\"],\"JavaScriptObject\":[],\"JSObject\":[]},\"NativeTypedArrayOfDouble\":{\"ListBase\":[\"double\"],\"NativeTypedArray\":[\"double\"],\"List\":[\"double\"],\"JavaScriptIndexingBehavior\":[\"double\"],\"JavaScriptObject\":[],\"EfficientLengthIterable\":[\"double\"],\"JSObject\":[],\"Iterable\":[\"double\"],\"FixedLengthListMixin\":[\"double\"]},\"NativeTypedArrayOfInt\":{\"ListBase\":[\"int\"],\"NativeTypedArray\":[\"int\"],\"List\":[\"int\"],\"JavaScriptIndexingBehavior\":[\"int\"],\"JavaScriptObject\":[],\"EfficientLengthIterable\":[\"int\"],\"JSObject\":[],\"Iterable\":[\"int\"],\"FixedLengthListMixin\":[\"int\"]},\"NativeFloat32List\":{\"Float32List\":[],\"ListBase\":[\"double\"],\"NativeTypedArray\":[\"double\"],\"List\":[\"double\"],\"JavaScriptIndexingBehavior\":[\"double\"],\"JavaScriptObject\":[],\"EfficientLengthIterable\":[\"double\"],\"JSObject\":[],\"Iterable\":[\"double\"],\"FixedLengthListMixin\":[\"double\"],\"TrustedGetRuntimeType\":[],\"ListBase.E\":\"double\",\"Iterable.E\":\"double\",\"FixedLengthListMixin.E\":\"double\"},\"NativeFloat64List\":{\"Float64List\":[],\"ListBase\":[\"double\"],\"NativeTypedArray\":[\"double\"],\"List\":[\"double\"],\"JavaScriptIndexingBehavior\":[\"double\"],\"JavaScriptObject\":[],\"EfficientLengthIterable\":[\"double\"],\"JSObject\":[],\"Iterable\":[\"double\"],\"FixedLengthListMixin\":[\"double\"],\"TrustedGetRuntimeType\":[],\"ListBase.E\":\"double\",\"Iterable.E\":\"double\",\"FixedLengthListMixin.E\":\"double\"},\"NativeInt16List\":{\"NativeTypedArrayOfInt\":[],\"Int16List\":[],\"ListBase\":[\"int\"],\"NativeTypedArray\":[\"int\"],\"List\":[\"int\"],\"JavaScriptIndexingBehavior\":[\"int\"],\"JavaScriptObject\":[],\"EfficientLengthIterable\":[\"int\"],\"JSObject\":[],\"Iterable\":[\"int\"],\"FixedLengthListMixin\":[\"int\"],\"TrustedGetRuntimeType\":[],\"ListBase.E\":\"int\",\"Iterable.E\":\"int\",\"FixedLengthListMixin.E\":\"int\"},\"NativeInt32List\":{\"NativeTypedArrayOfInt\":[],\"Int32List\":[],\"ListBase\":[\"int\"],\"NativeTypedArray\":[\"int\"],\"List\":[\"int\"],\"JavaScriptIndexingBehavior\":[\"int\"],\"JavaScriptObject\":[],\"EfficientLengthIterable\":[\"int\"],\"JSObject\":[],\"Iterable\":[\"int\"],\"FixedLengthListMixin\":[\"int\"],\"TrustedGetRuntimeType\":[],\"ListBase.E\":\"int\",\"Iterable.E\":\"int\",\"FixedLengthListMixin.E\":\"int\"},\"NativeInt8List\":{\"NativeTypedArrayOfInt\":[],\"Int8List\":[],\"ListBase\":[\"int\"],\"NativeTypedArray\":[\"int\"],\"List\":[\"int\"],\"JavaScriptIndexingBehavior\":[\"int\"],\"JavaScriptObject\":[],\"EfficientLengthIterable\":[\"int\"],\"JSObject\":[],\"Iterable\":[\"int\"],\"FixedLengthListMixin\":[\"int\"],\"TrustedGetRuntimeType\":[],\"ListBase.E\":\"int\",\"Iterable.E\":\"int\",\"FixedLengthListMixin.E\":\"int\"},\"NativeUint16List\":{\"NativeTypedArrayOfInt\":[],\"Uint16List\":[],\"ListBase\":[\"int\"],\"NativeTypedArray\":[\"int\"],\"List\":[\"int\"],\"JavaScriptIndexingBehavior\":[\"int\"],\"JavaScriptObject\":[],\"EfficientLengthIterable\":[\"int\"],\"JSObject\":[],\"Iterable\":[\"int\"],\"FixedLengthListMixin\":[\"int\"],\"TrustedGetRuntimeType\":[],\"ListBase.E\":\"int\",\"Iterable.E\":\"int\",\"FixedLengthListMixin.E\":\"int\"},\"NativeUint32List\":{\"NativeTypedArrayOfInt\":[],\"Uint32List\":[],\"ListBase\":[\"int\"],\"NativeTypedArray\":[\"int\"],\"List\":[\"int\"],\"JavaScriptIndexingBehavior\":[\"int\"],\"JavaScriptObject\":[],\"EfficientLengthIterable\":[\"int\"],\"JSObject\":[],\"Iterable\":[\"int\"],\"FixedLengthListMixin\":[\"int\"],\"TrustedGetRuntimeType\":[],\"ListBase.E\":\"int\",\"Iterable.E\":\"int\",\"FixedLengthListMixin.E\":\"int\"},\"NativeUint8ClampedList\":{\"NativeTypedArrayOfInt\":[],\"Uint8ClampedList\":[],\"ListBase\":[\"int\"],\"NativeTypedArray\":[\"int\"],\"List\":[\"int\"],\"JavaScriptIndexingBehavior\":[\"int\"],\"JavaScriptObject\":[],\"EfficientLengthIterable\":[\"int\"],\"JSObject\":[],\"Iterable\":[\"int\"],\"FixedLengthListMixin\":[\"int\"],\"TrustedGetRuntimeType\":[],\"ListBase.E\":\"int\",\"Iterable.E\":\"int\",\"FixedLengthListMixin.E\":\"int\"},\"NativeUint8List\":{\"NativeTypedArrayOfInt\":[],\"Uint8List\":[],\"ListBase\":[\"int\"],\"NativeTypedArray\":[\"int\"],\"List\":[\"int\"],\"JavaScriptIndexingBehavior\":[\"int\"],\"JavaScriptObject\":[],\"EfficientLengthIterable\":[\"int\"],\"JSObject\":[],\"Iterable\":[\"int\"],\"FixedLengthListMixin\":[\"int\"],\"TrustedGetRuntimeType\":[],\"ListBase.E\":\"int\",\"Iterable.E\":\"int\",\"FixedLengthListMixin.E\":\"int\"},\"_Error\":{\"Error\":[]},\"_TypeError\":{\"TypeError\":[],\"Error\":[]},\"AsyncError\":{\"Error\":[]},\"MultiStreamController\":{\"StreamController\":[\"1\"],\"StreamSink\":[\"1\"]},\"_TimerImpl\":{\"Timer\":[]},\"_AsyncAwaitCompleter\":{\"Completer\":[\"1\"]},\"_Completer\":{\"Completer\":[\"1\"]},\"_AsyncCompleter\":{\"_Completer\":[\"1\"],\"Completer\":[\"1\"]},\"_SyncCompleter\":{\"_Completer\":[\"1\"],\"Completer\":[\"1\"]},\"_Future\":{\"Future\":[\"1\"]},\"StreamView\":{\"Stream\":[\"1\"]},\"_StreamController\":{\"StreamController\":[\"1\"],\"StreamSink\":[\"1\"],\"_StreamControllerLifecycle\":[\"1\"],\"_EventSink\":[\"1\"],\"_EventDispatch\":[\"1\"]},\"_AsyncStreamController\":{\"_AsyncStreamControllerDispatch\":[\"1\"],\"_StreamController\":[\"1\"],\"StreamController\":[\"1\"],\"StreamSink\":[\"1\"],\"_StreamControllerLifecycle\":[\"1\"],\"_EventSink\":[\"1\"],\"_EventDispatch\":[\"1\"]},\"_ControllerStream\":{\"_StreamImpl\":[\"1\"],\"Stream\":[\"1\"],\"Stream.T\":\"1\"},\"_ControllerSubscription\":{\"_BufferingStreamSubscription\":[\"1\"],\"StreamSubscription\":[\"1\"],\"_EventSink\":[\"1\"],\"_EventDispatch\":[\"1\"],\"_BufferingStreamSubscription.T\":\"1\"},\"_StreamSinkWrapper\":{\"StreamSink\":[\"1\"]},\"_BufferingStreamSubscription\":{\"StreamSubscription\":[\"1\"],\"_EventSink\":[\"1\"],\"_EventDispatch\":[\"1\"],\"_BufferingStreamSubscription.T\":\"1\"},\"_StreamImpl\":{\"Stream\":[\"1\"]},\"_DelayedData\":{\"_DelayedEvent\":[\"1\"]},\"_DelayedError\":{\"_DelayedEvent\":[\"@\"]},\"_DelayedDone\":{\"_DelayedEvent\":[\"@\"]},\"_DoneStreamSubscription\":{\"StreamSubscription\":[\"1\"]},\"_EmptyStream\":{\"Stream\":[\"1\"],\"Stream.T\":\"1\"},\"_MultiStream\":{\"Stream\":[\"1\"],\"Stream.T\":\"1\"},\"_MultiStreamController\":{\"_AsyncStreamController\":[\"1\"],\"_AsyncStreamControllerDispatch\":[\"1\"],\"_StreamController\":[\"1\"],\"MultiStreamController\":[\"1\"],\"StreamController\":[\"1\"],\"StreamSink\":[\"1\"],\"_StreamControllerLifecycle\":[\"1\"],\"_EventSink\":[\"1\"],\"_EventDispatch\":[\"1\"]},\"_ForwardingStream\":{\"Stream\":[\"2\"]},\"_ForwardingStreamSubscription\":{\"_BufferingStreamSubscription\":[\"2\"],\"StreamSubscription\":[\"2\"],\"_EventSink\":[\"2\"],\"_EventDispatch\":[\"2\"],\"_BufferingStreamSubscription.T\":\"2\"},\"_MapStream\":{\"_ForwardingStream\":[\"1\",\"2\"],\"Stream\":[\"2\"],\"Stream.T\":\"2\"},\"_Zone\":{\"Zone\":[]},\"_CustomZone\":{\"_Zone\":[],\"Zone\":[]},\"_RootZone\":{\"_Zone\":[],\"Zone\":[]},\"_ZoneDelegate\":{\"ZoneDelegate\":[]},\"_ZoneSpecification\":{\"ZoneSpecification\":[]},\"_SplayTreeSetNode\":{\"_SplayTreeNode\":[\"1\",\"_SplayTreeSetNode<1>\"],\"_SplayTreeNode.K\":\"1\",\"_SplayTreeNode.1\":\"_SplayTreeSetNode<1>\"},\"_HashMap\":{\"MapBase\":[\"1\",\"2\"],\"HashMap\":[\"1\",\"2\"],\"Map\":[\"1\",\"2\"],\"MapBase.K\":\"1\",\"MapBase.V\":\"2\"},\"_IdentityHashMap\":{\"_HashMap\":[\"1\",\"2\"],\"MapBase\":[\"1\",\"2\"],\"HashMap\":[\"1\",\"2\"],\"Map\":[\"1\",\"2\"],\"MapBase.K\":\"1\",\"MapBase.V\":\"2\"},\"_HashMapKeyIterable\":{\"EfficientLengthIterable\":[\"1\"],\"Iterable\":[\"1\"],\"Iterable.E\":\"1\"},\"_HashMapKeyIterator\":{\"Iterator\":[\"1\"]},\"_LinkedCustomHashMap\":{\"JsLinkedHashMap\":[\"1\",\"2\"],\"MapBase\":[\"1\",\"2\"],\"LinkedHashMap\":[\"1\",\"2\"],\"Map\":[\"1\",\"2\"],\"MapBase.K\":\"1\",\"MapBase.V\":\"2\"},\"_HashSet\":{\"SetBase\":[\"1\"],\"EfficientLengthIterable\":[\"1\"],\"Iterable\":[\"1\"],\"Iterable.E\":\"1\"},\"_HashSetIterator\":{\"Iterator\":[\"1\"]},\"ListBase\":{\"List\":[\"1\"],\"EfficientLengthIterable\":[\"1\"],\"Iterable\":[\"1\"]},\"MapBase\":{\"Map\":[\"1\",\"2\"]},\"MapView\":{\"Map\":[\"1\",\"2\"]},\"UnmodifiableMapView\":{\"_UnmodifiableMapView_MapView__UnmodifiableMapMixin\":[\"1\",\"2\"],\"MapView\":[\"1\",\"2\"],\"_UnmodifiableMapMixin\":[\"1\",\"2\"],\"Map\":[\"1\",\"2\"]},\"ListQueue\":{\"Queue\":[\"1\"],\"ListIterable\":[\"1\"],\"EfficientLengthIterable\":[\"1\"],\"Iterable\":[\"1\"],\"ListIterable.E\":\"1\",\"Iterable.E\":\"1\"},\"_ListQueueIterator\":{\"Iterator\":[\"1\"]},\"SetBase\":{\"EfficientLengthIterable\":[\"1\"],\"Iterable\":[\"1\"]},\"_SetBase\":{\"SetBase\":[\"1\"],\"EfficientLengthIterable\":[\"1\"],\"Iterable\":[\"1\"]},\"_SplayTreeIterator\":{\"Iterator\":[\"3\"]},\"_SplayTreeKeyIterator\":{\"_SplayTreeIterator\":[\"1\",\"2\",\"1\"],\"Iterator\":[\"1\"],\"_SplayTreeIterator.K\":\"1\",\"_SplayTreeIterator.T\":\"1\",\"_SplayTreeIterator.1\":\"2\"},\"SplayTreeSet\":{\"SetBase\":[\"1\"],\"EfficientLengthIterable\":[\"1\"],\"_SplayTree\":[\"1\",\"_SplayTreeSetNode<1>\"],\"Iterable\":[\"1\"],\"Iterable.E\":\"1\",\"_SplayTree.1\":\"_SplayTreeSetNode<1>\",\"_SplayTree.K\":\"1\"},\"Encoding\":{\"Codec\":[\"String\",\"List<int>\"]},\"_JsonMap\":{\"MapBase\":[\"String\",\"@\"],\"Map\":[\"String\",\"@\"],\"MapBase.K\":\"String\",\"MapBase.V\":\"@\"},\"_JsonMapKeyIterable\":{\"ListIterable\":[\"String\"],\"EfficientLengthIterable\":[\"String\"],\"Iterable\":[\"String\"],\"ListIterable.E\":\"String\",\"Iterable.E\":\"String\"},\"AsciiCodec\":{\"Encoding\":[],\"Codec\":[\"String\",\"List<int>\"]},\"_UnicodeSubsetEncoder\":{\"Converter\":[\"String\",\"List<int>\"]},\"AsciiEncoder\":{\"Converter\":[\"String\",\"List<int>\"]},\"_UnicodeSubsetDecoder\":{\"Converter\":[\"List<int>\",\"String\"]},\"AsciiDecoder\":{\"Converter\":[\"List<int>\",\"String\"]},\"Base64Codec\":{\"Codec\":[\"List<int>\",\"String\"]},\"Base64Encoder\":{\"Converter\":[\"List<int>\",\"String\"]},\"JsonUnsupportedObjectError\":{\"Error\":[]},\"JsonCyclicError\":{\"Error\":[]},\"JsonCodec\":{\"Codec\":[\"Object?\",\"String\"]},\"JsonEncoder\":{\"Converter\":[\"Object?\",\"String\"]},\"JsonDecoder\":{\"Converter\":[\"String\",\"Object?\"]},\"Latin1Codec\":{\"Encoding\":[],\"Codec\":[\"String\",\"List<int>\"]},\"Latin1Encoder\":{\"Converter\":[\"String\",\"List<int>\"]},\"Latin1Decoder\":{\"Converter\":[\"List<int>\",\"String\"]},\"Utf8Codec\":{\"Encoding\":[],\"Codec\":[\"String\",\"List<int>\"]},\"Utf8Encoder\":{\"Converter\":[\"String\",\"List<int>\"]},\"Utf8Decoder\":{\"Converter\":[\"List<int>\",\"String\"]},\"DateTime\":{\"Comparable\":[\"DateTime\"]},\"double\":{\"num\":[],\"Comparable\":[\"num\"]},\"Duration\":{\"Comparable\":[\"Duration\"]},\"int\":{\"num\":[],\"Comparable\":[\"num\"]},\"List\":{\"EfficientLengthIterable\":[\"1\"],\"Iterable\":[\"1\"]},\"num\":{\"Comparable\":[\"num\"]},\"RegExpMatch\":{\"Match\":[]},\"String\":{\"Comparable\":[\"String\"],\"Pattern\":[]},\"AssertionError\":{\"Error\":[]},\"TypeError\":{\"Error\":[]},\"ArgumentError\":{\"Error\":[]},\"RangeError\":{\"Error\":[]},\"IndexError\":{\"Error\":[]},\"UnsupportedError\":{\"Error\":[]},\"UnimplementedError\":{\"Error\":[]},\"StateError\":{\"Error\":[]},\"ConcurrentModificationError\":{\"Error\":[]},\"OutOfMemoryError\":{\"Error\":[]},\"StackOverflowError\":{\"Error\":[]},\"_Exception\":{\"Exception\":[]},\"FormatException\":{\"Exception\":[]},\"_StringStackTrace\":{\"StackTrace\":[]},\"StringBuffer\":{\"StringSink\":[]},\"_Uri\":{\"Uri\":[]},\"_SimpleUri\":{\"Uri\":[]},\"_DataUri\":{\"Uri\":[]},\"NullRejectionException\":{\"Exception\":[]},\"ErrorResult\":{\"Result\":[\"0&\"]},\"ValueResult\":{\"Result\":[\"1\"]},\"_NextRequest\":{\"_EventRequest\":[\"1\"]},\"_HasNextRequest\":{\"_EventRequest\":[\"1\"]},\"CanonicalizedMap\":{\"Map\":[\"2\",\"3\"]},\"QueueList\":{\"ListBase\":[\"1\"],\"List\":[\"1\"],\"Queue\":[\"1\"],\"EfficientLengthIterable\":[\"1\"],\"Iterable\":[\"1\"],\"ListBase.E\":\"1\",\"QueueList.E\":\"1\",\"Iterable.E\":\"1\"},\"_CastQueueList\":{\"QueueList\":[\"2\"],\"ListBase\":[\"2\"],\"List\":[\"2\"],\"Queue\":[\"2\"],\"EfficientLengthIterable\":[\"2\"],\"Iterable\":[\"2\"],\"ListBase.E\":\"2\",\"QueueList.E\":\"2\",\"Iterable.E\":\"2\"},\"PersistentWebSocket\":{\"StreamChannelMixin\":[\"@\"]},\"SseSocketClient\":{\"SocketClient\":[]},\"WebSocketClient\":{\"SocketClient\":[]},\"RequestAbortedException\":{\"Exception\":[]},\"ByteStream\":{\"StreamView\":[\"List<int>\"],\"Stream\":[\"List<int>\"],\"Stream.T\":\"List<int>\",\"StreamView.T\":\"List<int>\"},\"ClientException\":{\"Exception\":[]},\"Request\":{\"BaseRequest\":[]},\"StreamedResponseV2\":{\"StreamedResponse\":[]},\"CaseInsensitiveMap\":{\"CanonicalizedMap\":[\"String\",\"String\",\"1\"],\"Map\":[\"String\",\"1\"],\"CanonicalizedMap.K\":\"String\",\"CanonicalizedMap.V\":\"1\",\"CanonicalizedMap.C\":\"String\"},\"Level\":{\"Comparable\":[\"Level\"]},\"PathException\":{\"Exception\":[]},\"PosixStyle\":{\"InternalStyle\":[]},\"UrlStyle\":{\"InternalStyle\":[]},\"WindowsStyle\":{\"InternalStyle\":[]},\"FileLocation\":{\"SourceLocation\":[],\"Comparable\":[\"SourceLocation\"]},\"_FileSpan\":{\"SourceSpanWithContext\":[],\"SourceSpan\":[],\"Comparable\":[\"SourceSpan\"]},\"SourceLocation\":{\"Comparable\":[\"SourceLocation\"]},\"SourceLocationMixin\":{\"SourceLocation\":[],\"Comparable\":[\"SourceLocation\"]},\"SourceSpan\":{\"Comparable\":[\"SourceSpan\"]},\"SourceSpanBase\":{\"SourceSpan\":[],\"Comparable\":[\"SourceSpan\"]},\"SourceSpanException\":{\"Exception\":[]},\"SourceSpanFormatException\":{\"FormatException\":[],\"Exception\":[]},\"SourceSpanMixin\":{\"SourceSpan\":[],\"Comparable\":[\"SourceSpan\"]},\"SourceSpanWithContext\":{\"SourceSpan\":[],\"Comparable\":[\"SourceSpan\"]},\"SseClient\":{\"StreamChannelMixin\":[\"String?\"]},\"StringScannerException\":{\"FormatException\":[],\"Exception\":[]},\"_EventStream\":{\"Stream\":[\"1\"],\"Stream.T\":\"1\"},\"_EventStreamSubscription\":{\"StreamSubscription\":[\"1\"]},\"BrowserWebSocket\":{\"WebSocket\":[]},\"TextDataReceived\":{\"WebSocketEvent\":[]},\"BinaryDataReceived\":{\"WebSocketEvent\":[]},\"CloseReceived\":{\"WebSocketEvent\":[]},\"WebSocketException\":{\"Exception\":[]},\"WebSocketConnectionClosed\":{\"Exception\":[]},\"DdcLibraryBundleRestarter\":{\"Restarter\":[]},\"DdcRestarter\":{\"Restarter\":[]},\"RequireRestarter\":{\"Restarter\":[]},\"HotReloadFailedException\":{\"Exception\":[]},\"Int8List\":{\"List\":[\"int\"],\"EfficientLengthIterable\":[\"int\"],\"Iterable\":[\"int\"]},\"Uint8List\":{\"List\":[\"int\"],\"EfficientLengthIterable\":[\"int\"],\"Iterable\":[\"int\"]},\"Uint8ClampedList\":{\"List\":[\"int\"],\"EfficientLengthIterable\":[\"int\"],\"Iterable\":[\"int\"]},\"Int16List\":{\"List\":[\"int\"],\"EfficientLengthIterable\":[\"int\"],\"Iterable\":[\"int\"]},\"Uint16List\":{\"List\":[\"int\"],\"EfficientLengthIterable\":[\"int\"],\"Iterable\":[\"int\"]},\"Int32List\":{\"List\":[\"int\"],\"EfficientLengthIterable\":[\"int\"],\"Iterable\":[\"int\"]},\"Uint32List\":{\"List\":[\"int\"],\"EfficientLengthIterable\":[\"int\"],\"Iterable\":[\"int\"]},\"Float32List\":{\"List\":[\"double\"],\"EfficientLengthIterable\":[\"double\"],\"Iterable\":[\"double\"]},\"Float64List\":{\"List\":[\"double\"],\"EfficientLengthIterable\":[\"double\"],\"Iterable\":[\"double\"]}}'));\n"
 "  A._Universe_addErasedTypes(init.typeUniverse, JSON.parse('{\"UnmodifiableListBase\":1,\"__CastListBase__CastIterableBase_ListMixin\":2,\"NativeTypedArray\":1,\"_DelayedEvent\":1,\"_SetBase\":1,\"_SplayTreeSet__SplayTree_Iterable\":1,\"_SplayTreeSet__SplayTree_Iterable_SetMixin\":1,\"_QueueList_Object_ListMixin\":1,\"StreamChannelMixin\":1}'));\n"
 "  var string\$ = {\n"
 "    x00_____: \"\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\u03f6\\x00\\u0404\\u03f4 \\u03f4\\u03f6\\u01f6\\u01f6\\u03f6\\u03fc\\u01f4\\u03ff\\u03ff\\u0584\\u03ff\\u03ff\\u03ff\\u03ff\\u03ff\\u03ff\\u03ff\\u03ff\\u03ff\\u03ff\\u05d4\\u01f4\\x00\\u01f4\\x00\\u0504\\u05c4\\u03ff\\u03ff\\u03ff\\u03ff\\u03ff\\u03ff\\u03ff\\u03ff\\u03ff\\u03ff\\u03ff\\u03ff\\u03ff\\u03ff\\u03ff\\u03ff\\u03ff\\u03ff\\u03ff\\u03ff\\u03ff\\u03ff\\u03ff\\u03ff\\u03ff\\u03ff\\u0400\\x00\\u0400\\u0200\\u03f7\\u0200\\u03ff\\u03ff\\u03ff\\u03ff\\u03ff\\u03ff\\u03ff\\u03ff\\u03ff\\u03ff\\u03ff\\u03ff\\u03ff\\u03ff\\u03ff\\u03ff\\u03ff\\u03ff\\u03ff\\u03ff\\u03ff\\u03ff\\u03ff\\u03ff\\u03ff\\u03ff\\u0200\\u0200\\u0200\\u03f7\\x00\",\n"
@@ -22379,6 +22259,7 @@
 "      Iterable_String: findType(\"Iterable<String>\"),\n"
 "      Iterable_dynamic: findType(\"Iterable<@>\"),\n"
 "      Iterable_int: findType(\"Iterable<int>\"),\n"
+"      JSArray_JSObject: findType(\"JSArray<JSObject>\"),\n"
 "      JSArray_Object: findType(\"JSArray<Object>\"),\n"
 "      JSArray_String: findType(\"JSArray<String>\"),\n"
 "      JSArray__Highlight: findType(\"JSArray<_Highlight>\"),\n"
@@ -22407,6 +22288,7 @@
 "      Map_dynamic_dynamic: findType(\"Map<@,@>\"),\n"
 "      MappedListIterable_String_dynamic: findType(\"MappedListIterable<String,@>\"),\n"
 "      MediaType: findType(\"MediaType\"),\n"
+"      MultiStreamController_List_int: findType(\"MultiStreamController<List<int>>\"),\n"
 "      NativeArrayBuffer: findType(\"NativeArrayBuffer\"),\n"
 "      NativeTypedArrayOfInt: findType(\"NativeTypedArrayOfInt\"),\n"
 "      NativeUint8List: findType(\"NativeUint8List\"),\n"
@@ -22428,7 +22310,6 @@
 "      SplayTreeSet_String: findType(\"SplayTreeSet<String>\"),\n"
 "      StackTrace: findType(\"StackTrace\"),\n"
 "      StreamQueue_DebugEvent: findType(\"StreamQueue<DebugEvent>\"),\n"
-"      Stream_dynamic: findType(\"Stream<@>\"),\n"
 "      StreamedResponse: findType(\"StreamedResponse\"),\n"
 "      String: findType(\"String\"),\n"
 "      String_Function_Match: findType(\"String(Match)\"),\n"
@@ -22467,6 +22348,7 @@
 "      _Highlight: findType(\"_Highlight\"),\n"
 "      _IdentityHashMap_of_nullable_Object_and_nullable_Object: findType(\"_IdentityHashMap<Object?,Object?>\"),\n"
 "      _Line: findType(\"_Line\"),\n"
+"      _MultiStream_List_int: findType(\"_MultiStream<List<int>>\"),\n"
 "      _StreamControllerAddStreamState_nullable_Object: findType(\"_StreamControllerAddStreamState<Object?>\"),\n"
 "      _SyncCompleter_PoolResource: findType(\"_SyncCompleter<PoolResource>\"),\n"
 "      _ZoneFunction_of_void_Function_Zone_ZoneDelegate_Zone_Object_StackTrace: findType(\"_ZoneFunction<~(Zone,ZoneDelegate,Zone,Object,StackTrace)>\"),\n"
@@ -22499,7 +22381,6 @@
 "      nullable__FutureListener_dynamic_dynamic: findType(\"_FutureListener<@,@>?\"),\n"
 "      nullable__Highlight: findType(\"_Highlight?\"),\n"
 "      nullable_bool: findType(\"bool?\"),\n"
-"      nullable_bool_Function_Object: findType(\"bool(Object)?\"),\n"
 "      nullable_double: findType(\"double?\"),\n"
 "      nullable_int: findType(\"int?\"),\n"
 "      nullable_num: findType(\"num?\"),\n"
@@ -22512,8 +22393,7 @@
 "      void_Function_Object: findType(\"~(Object)\"),\n"
 "      void_Function_Object_StackTrace: findType(\"~(Object,StackTrace)\"),\n"
 "      void_Function_String_dynamic: findType(\"~(String,@)\"),\n"
-"      void_Function_Timer: findType(\"~(Timer)\"),\n"
-"      void_Function_int_dynamic: findType(\"~(int,@)\")\n"
+"      void_Function_Timer: findType(\"~(Timer)\")\n"
 "    };\n"
 "  })();\n"
 "  (function constants() {\n"
@@ -22848,8 +22728,8 @@
 "        t2 = A.ListQueue\$(t1),\n"
 "        t3 = A.ListQueue\$(type\$.void_Function);\n"
 "      t1 = A.ListQueue\$(t1);\n"
-"      t4 = A.Completer_Completer(type\$.dynamic);\n"
-"      return new A.Pool(t2, t3, t1, 1000, new A.AsyncMemoizer(t4, A.findType(\"AsyncMemoizer<@>\")));\n"
+"      t4 = A.Completer_Completer(type\$.void);\n"
+"      return new A.Pool(t2, t3, t1, 1000, new A.AsyncMemoizer(t4, A.findType(\"AsyncMemoizer<~>\")));\n"
 "    });\n"
 "    _lazyFinal(\$, \"_noncePattern\", \"\$get\$_noncePattern\", () => A.RegExp_RegExp(\"^[\\\\w+/_-]+[=]{0,2}\$\", false));\n"
 "    _lazyFinal(\$, \"_createScript\", \"\$get\$_createScript\", () => new A._createScript_closure().call\$0());\n"
diff --git a/pkg/dwds/lib/src/version.dart b/pkg/dwds/lib/src/version.dart
index 6f26bfd..d419bb6 100644
--- a/pkg/dwds/lib/src/version.dart
+++ b/pkg/dwds/lib/src/version.dart
@@ -1,2 +1,2 @@
 // Generated code. Do not modify.
-const packageVersion = '27.1.1-wip';
+const packageVersion = '27.1.2-wip';
diff --git a/pkg/dwds/pubspec.yaml b/pkg/dwds/pubspec.yaml
index 06517a0..5770b84 100644
--- a/pkg/dwds/pubspec.yaml
+++ b/pkg/dwds/pubspec.yaml
@@ -1,12 +1,12 @@
 name: dwds
 # Every time this changes you need to run `dart run tool/build.dart`.
-version: 27.1.1-wip
+version: 27.1.2-wip
 
 description: >-
   A service that proxies between the Chrome debug protocol and the Dart VM
   service protocol.
 environment:
-  sdk: ^3.12.0-0
+  sdk: ^3.12.0-307.0.dev
 
 resolution: workspace
 
diff --git a/pkg/dwds/test/integration/devtools_amd_test.dart b/pkg/dwds/test/integration/devtools_amd_test.dart
new file mode 100644
index 0000000..1ce6a59
--- /dev/null
+++ b/pkg/dwds/test/integration/devtools_amd_test.dart
@@ -0,0 +1,22 @@
+// Copyright (c) 2026, 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.
+
+@Timeout(Duration(minutes: 5))
+@TestOn('vm')
+library;
+
+import 'package:dwds/expression_compiler.dart';
+import 'package:dwds_test_common/test_sdk_configuration.dart';
+import 'package:test/test.dart';
+
+import 'devtools_common.dart';
+
+void main() {
+  final provider = TestSdkConfigurationProvider(
+    ddcModuleFormat: ModuleFormat.amd,
+  );
+  tearDownAll(provider.dispose);
+
+  testAll(provider: provider);
+}
diff --git a/pkg/dwds/test/integration/devtools_common.dart b/pkg/dwds/test/integration/devtools_common.dart
new file mode 100644
index 0000000..7caf070
--- /dev/null
+++ b/pkg/dwds/test/integration/devtools_common.dart
@@ -0,0 +1,222 @@
+// 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.
+
+import 'dart:io';
+
+import 'package:dwds/src/config/tool_configuration.dart';
+import 'package:dwds_test_common/test_sdk_configuration.dart';
+import 'package:test/test.dart';
+import 'package:vm_service/vm_service.dart';
+// ignore: deprecated_member_use
+import 'package:webdriver/io.dart';
+
+import 'fixtures/context.dart';
+import 'fixtures/project.dart';
+import 'fixtures/utilities.dart';
+
+Future<void> _waitForPageReady(TestContext context) async {
+  var attempt = 100;
+  while (attempt-- > 0) {
+    final content = await context.webDriver.pageSource;
+    if (content.contains('hello_world')) return;
+    await Future<void>.delayed(const Duration(milliseconds: 100));
+  }
+  throw StateError('Page never initialized');
+}
+
+TypeMatcher<Event> _hasKind(String kind) =>
+    isA<Event>().having((Event e) => e.kind, 'kind', kind);
+
+void testAll({required TestSdkConfigurationProvider provider}) {
+  final context = TestContext(TestProject.test, provider);
+
+  for (final serveFromDds in [true, false]) {
+    group('Injected client with DevTools served from '
+        '${serveFromDds ? 'DDS' : 'DevTools Launcher'}', () {
+      setUp(() async {
+        await context.setUp(
+          debugSettings: TestDebugSettings.withDevToolsLaunch(
+            context,
+            serveFromDds: serveFromDds,
+          ),
+          testSettings: TestSettings(
+            moduleFormat: provider.ddcModuleFormat,
+            canaryFeatures: provider.canaryFeatures,
+          ),
+        );
+        await context.webDriver.driver.keyboard.sendChord([Keyboard.alt, 'd']);
+        // Wait for DevTools to actually open.
+        await Future<void>.delayed(const Duration(seconds: 2));
+      });
+
+      tearDown(() async {
+        await context.tearDown();
+      });
+
+      test('can launch devtools', () async {
+        final windows = await context.webDriver.windows.toList();
+        await context.webDriver.driver.switchTo.window(windows.last);
+        expect(await context.webDriver.pageSource, contains('DevTools'));
+        expect(await context.webDriver.currentUrl, contains('ide=Dwds'));
+        // TODO(https://github.com/dart-lang/webdev/issues/1888): Re-enable.
+      }, skip: Platform.isWindows);
+
+      test(
+        'can not launch devtools for the same app in multiple tabs',
+        () async {
+          final appUrl = await context.webDriver.currentUrl;
+          // Open a new tab, select it, and navigate to the app
+          await context.webDriver.driver.execute(
+            "window.open('$appUrl', '_blank');",
+            [],
+          );
+          await Future<void>.delayed(const Duration(seconds: 2));
+          final newAppWindow = await context.webDriver.windows.last;
+          await newAppWindow.setAsActive();
+
+          // Wait for the page to be ready before trying to open DevTools
+          // again.
+          await _waitForPageReady(context);
+
+          // Try to open devtools and check for the alert.
+          await context.webDriver.driver.keyboard.sendChord([
+            Keyboard.alt,
+            'd',
+          ]);
+          await Future<void>.delayed(const Duration(seconds: 2));
+          final alert = context.webDriver.driver.switchTo.alert;
+          expect(alert, isNotNull);
+          expect(
+            await alert.text,
+            contains('This app is already being debugged in a different tab'),
+          );
+          await alert.accept();
+
+          var windows = await context.webDriver.windows.toList();
+          for (final window in windows) {
+            if (window.id != newAppWindow.id) {
+              await window.setAsActive();
+              await window.close();
+            }
+          }
+
+          await newAppWindow.setAsActive();
+          await context.webDriver.driver.keyboard.sendChord([
+            Keyboard.alt,
+            'd',
+          ]);
+          await Future<void>.delayed(const Duration(seconds: 2));
+          windows = await context.webDriver.windows.toList();
+          final devToolsWindow = windows.firstWhere(
+            (Window window) => window != newAppWindow,
+          );
+          await devToolsWindow.setAsActive();
+          expect(await context.webDriver.pageSource, contains('DevTools'));
+        },
+        skip: 'See https://github.com/dart-lang/webdev/issues/2462',
+      );
+
+      test(
+        'destroys and recreates the isolate during a page refresh',
+        () async {
+          final client = context.debugConnection.vmService;
+          await client.streamListen('Isolate');
+          await context.makeEdits([
+            (
+              file: context.project.dartEntryFileName,
+              originalString: 'Hello World!',
+              newString: 'Bonjour le monde!',
+            ),
+          ]);
+          await context.waitForSuccessfulBuild(propagateToBrowser: true);
+
+          final eventsDone = expectLater(
+            client.onIsolateEvent,
+            emitsThrough(
+              emitsInOrder([
+                _hasKind(EventKind.kIsolateExit),
+                _hasKind(EventKind.kIsolateStart),
+                _hasKind(EventKind.kIsolateRunnable),
+              ]),
+            ),
+          );
+
+          await context.webDriver.driver.refresh();
+
+          await eventsDone;
+        },
+        skip: 'https://github.com/dart-lang/webdev/issues/1888',
+      );
+    }, timeout: const Timeout.factor(2));
+  }
+
+  group('Injected client without a DevTools server', () {
+    setUp(() async {
+      await context.setUp(
+        debugSettings: const TestDebugSettings.noDevToolsLaunch().copyWith(
+          enableDevToolsLaunch: true,
+          ddsConfiguration: const DartDevelopmentServiceConfiguration(
+            serveDevTools: false,
+          ),
+        ),
+        testSettings: TestSettings(
+          moduleFormat: provider.ddcModuleFormat,
+          canaryFeatures: provider.canaryFeatures,
+        ),
+      );
+    });
+
+    tearDown(() async {
+      await context.tearDown();
+    });
+
+    test('gives a good error if devtools is not served', () async {
+      // Try to open devtools and check for the alert.
+      await context.webDriver.driver.keyboard.sendChord([Keyboard.alt, 'd']);
+      await Future<void>.delayed(const Duration(seconds: 2));
+      final alert = context.webDriver.driver.switchTo.alert;
+      expect(alert, isNotNull);
+      expect(await alert.text, contains('--debug'));
+      await alert.accept();
+    });
+  });
+
+  group(
+    'Injected client with debug extension and without DevTools',
+    () {
+      setUp(() async {
+        await context.setUp(
+          debugSettings: const TestDebugSettings.noDevToolsLaunch().copyWith(
+            enableDebugExtension: true,
+          ),
+          testSettings: TestSettings(
+            moduleFormat: provider.ddcModuleFormat,
+            canaryFeatures: provider.canaryFeatures,
+          ),
+        );
+      });
+
+      tearDown(() async {
+        await context.tearDown();
+      });
+
+      test('gives a good error if devtools is not served', () async {
+        // Click on extension
+        await context.extensionConnection.sendCommand('Runtime.evaluate', {
+          'expression': 'fakeClick()',
+        });
+        // Try to open devtools and check for the alert.
+        await context.webDriver.driver.keyboard.sendChord([Keyboard.alt, 'd']);
+        await Future<void>.delayed(const Duration(seconds: 2));
+        final alert = context.webDriver.driver.switchTo.alert;
+        expect(alert, isNotNull);
+        expect(await alert.text, contains('--debug'));
+        await alert.accept();
+      });
+    },
+    tags: ['extension'],
+    skip: 'https://github.com/dart-lang/webdev/issues/2114',
+    timeout: const Timeout.factor(2),
+  );
+}
diff --git a/pkg/dwds/test/integration/devtools_ddc_library_bundle_test.dart b/pkg/dwds/test/integration/devtools_ddc_library_bundle_test.dart
new file mode 100644
index 0000000..b6ad5bb
--- /dev/null
+++ b/pkg/dwds/test/integration/devtools_ddc_library_bundle_test.dart
@@ -0,0 +1,23 @@
+// Copyright (c) 2026, 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.
+
+@Timeout(Duration(minutes: 5))
+@TestOn('vm')
+library;
+
+import 'package:dwds/expression_compiler.dart';
+import 'package:dwds_test_common/test_sdk_configuration.dart';
+import 'package:test/test.dart';
+
+import 'devtools_common.dart';
+
+void main() {
+  final provider = TestSdkConfigurationProvider(
+    ddcModuleFormat: ModuleFormat.ddc,
+    canaryFeatures: true,
+  );
+  tearDownAll(provider.dispose);
+
+  testAll(provider: provider);
+}
diff --git a/pkg/dwds/test/integration/handlers/asset_handler_amd_test.dart b/pkg/dwds/test/integration/handlers/asset_handler_amd_test.dart
index b759593..c5d84ba 100644
--- a/pkg/dwds/test/integration/handlers/asset_handler_amd_test.dart
+++ b/pkg/dwds/test/integration/handlers/asset_handler_amd_test.dart
@@ -5,13 +5,16 @@
 @Timeout(Duration(minutes: 2))
 library;
 
+import 'package:dwds/expression_compiler.dart';
 import 'package:dwds_test_common/test_sdk_configuration.dart';
 import 'package:test/test.dart';
 
 import 'asset_handler_common.dart';
 
 void main() {
-  final provider = TestSdkConfigurationProvider();
+  final provider = TestSdkConfigurationProvider(
+    ddcModuleFormat: ModuleFormat.amd,
+  );
   tearDownAll(provider.dispose);
 
   testAll(provider: provider);
diff --git a/pkg/dwds/test/integration/readers/proxy_server_asset_reader_amd_test.dart b/pkg/dwds/test/integration/readers/proxy_server_asset_reader_amd_test.dart
new file mode 100644
index 0000000..e7d2d05
--- /dev/null
+++ b/pkg/dwds/test/integration/readers/proxy_server_asset_reader_amd_test.dart
@@ -0,0 +1,21 @@
+// Copyright (c) 2026, 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.
+
+@Timeout(Duration(minutes: 2))
+library;
+
+import 'package:dwds/expression_compiler.dart';
+import 'package:dwds_test_common/test_sdk_configuration.dart';
+import 'package:test/test.dart';
+
+import 'proxy_server_asset_reader_common.dart';
+
+void main() {
+  final provider = TestSdkConfigurationProvider(
+    ddcModuleFormat: ModuleFormat.amd,
+  );
+  tearDownAll(provider.dispose);
+
+  testAll(provider: provider);
+}
diff --git a/pkg/dwds/test/integration/readers/proxy_server_asset_reader_common.dart b/pkg/dwds/test/integration/readers/proxy_server_asset_reader_common.dart
new file mode 100644
index 0000000..b1b04f7
--- /dev/null
+++ b/pkg/dwds/test/integration/readers/proxy_server_asset_reader_common.dart
@@ -0,0 +1,58 @@
+// Copyright (c) 2020, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:dwds/src/readers/proxy_server_asset_reader.dart';
+import 'package:dwds_test_common/test_sdk_configuration.dart';
+import 'package:test/test.dart';
+
+import '../fixtures/context.dart';
+import '../fixtures/project.dart';
+import '../fixtures/utilities.dart';
+
+void testAll({required TestSdkConfigurationProvider provider}) {
+  group('ProxyServerAssetReader', () {
+    final context = TestContext(TestProject.test, provider);
+
+    late ProxyServerAssetReader assetReader;
+    setUpAll(() async {
+      await context.setUp(
+        testSettings: TestSettings(
+          moduleFormat: provider.ddcModuleFormat,
+          canaryFeatures: provider.canaryFeatures,
+        ),
+      );
+      assetReader = context.testServer.assetReader as ProxyServerAssetReader;
+    });
+
+    tearDownAll(() async {
+      await context.tearDown();
+    });
+
+    test('returns null if the dart path does not exist', () async {
+      final result = await assetReader.dartSourceContents('some/path/foo.dart');
+      expect(result, isNull);
+    });
+
+    test('can read dart sources', () async {
+      final result = await assetReader.dartSourceContents(
+        'hello_world/main.dart',
+      );
+      expect(result, isNotNull);
+    });
+
+    test('can read source maps', () async {
+      final result = await assetReader.dartSourceContents(
+        'hello_world/main.ddc.js.map',
+      );
+      expect(result, isNotNull);
+    });
+
+    test('returns null if the source map path does not exist', () async {
+      final result = await assetReader.dartSourceContents(
+        'hello_world/foo.ddc.js.map',
+      );
+      expect(result, isNull);
+    });
+  });
+}
diff --git a/pkg/dwds/test/integration/readers/proxy_server_asset_reader_ddc_library_bundle_test.dart b/pkg/dwds/test/integration/readers/proxy_server_asset_reader_ddc_library_bundle_test.dart
new file mode 100644
index 0000000..ee42cfd
--- /dev/null
+++ b/pkg/dwds/test/integration/readers/proxy_server_asset_reader_ddc_library_bundle_test.dart
@@ -0,0 +1,22 @@
+// Copyright (c) 2026, 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.
+
+@Timeout(Duration(minutes: 2))
+library;
+
+import 'package:dwds/expression_compiler.dart';
+import 'package:dwds_test_common/test_sdk_configuration.dart';
+import 'package:test/test.dart';
+
+import 'proxy_server_asset_reader_common.dart';
+
+void main() {
+  final provider = TestSdkConfigurationProvider(
+    ddcModuleFormat: ModuleFormat.ddc,
+    canaryFeatures: true,
+  );
+  tearDownAll(provider.dispose);
+
+  testAll(provider: provider);
+}
diff --git a/pkg/dwds/test/integration/run_request_amd_test.dart b/pkg/dwds/test/integration/run_request_amd_test.dart
new file mode 100644
index 0000000..4f1edd3
--- /dev/null
+++ b/pkg/dwds/test/integration/run_request_amd_test.dart
@@ -0,0 +1,25 @@
+// Copyright (c) 2026, 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.
+
+@Timeout(Duration(minutes: 2))
+library;
+
+import 'package:dwds/expression_compiler.dart';
+import 'package:dwds_test_common/test_sdk_configuration.dart';
+import 'package:test/test.dart';
+
+import 'run_request_common.dart';
+
+void main() {
+  // Enable verbose logging for debugging.
+  const debug = false;
+
+  final provider = TestSdkConfigurationProvider(
+    verbose: debug,
+    ddcModuleFormat: ModuleFormat.amd,
+  );
+  tearDownAll(provider.dispose);
+
+  testAll(provider: provider);
+}
diff --git a/pkg/dwds/test/integration/run_request_common.dart b/pkg/dwds/test/integration/run_request_common.dart
new file mode 100644
index 0000000..9c35903
--- /dev/null
+++ b/pkg/dwds/test/integration/run_request_common.dart
@@ -0,0 +1,93 @@
+// 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.
+
+import 'dart:async';
+
+import 'package:dwds_test_common/logging.dart';
+import 'package:dwds_test_common/test_sdk_configuration.dart';
+import 'package:test/test.dart';
+import 'package:vm_service/vm_service.dart';
+import 'package:vm_service_interface/vm_service_interface.dart';
+
+import 'fixtures/context.dart';
+import 'fixtures/project.dart';
+import 'fixtures/utilities.dart';
+
+void testAll({required TestSdkConfigurationProvider provider}) {
+  final context = TestContext(TestProject.test, provider);
+
+  group('while debugger is attached', () {
+    late VmServiceInterface service;
+    setUp(() async {
+      setCurrentLogWriter(debug: provider.verbose);
+      await context.setUp(
+        testSettings: TestSettings(
+          autoRun: false,
+          verboseCompiler: provider.verbose,
+          moduleFormat: provider.ddcModuleFormat,
+          canaryFeatures: provider.canaryFeatures,
+        ),
+      );
+      service = context.service;
+    });
+
+    tearDown(() async {
+      await context.tearDown();
+    });
+
+    test('can resume while paused at the start', () async {
+      final vm = await service.getVM();
+      final isolate = await service.getIsolate(vm.isolates!.first.id!);
+      expect(isolate.pauseEvent!.kind, EventKind.kPauseStart);
+      final stream = service.onEvent('Debug');
+      final resumeCompleter = Completer<void>();
+      // The underlying stream is a broadcast stream so we need to add a
+      // listener before calling resume so that we don't miss events.
+      unawaited(
+        stream.firstWhere((event) => event.kind == EventKind.kResume).then((_) {
+          resumeCompleter.complete();
+        }),
+      );
+      await service.resume(isolate.id!);
+      await resumeCompleter.future;
+      expect(isolate.pauseEvent!.kind, EventKind.kResume);
+    });
+
+    test('correctly sets the isolate pauseEvent', () async {
+      final vm = await service.getVM();
+      final isolate = await service.getIsolate(vm.isolates!.first.id!);
+      expect(isolate.pauseEvent!.kind, EventKind.kPauseStart);
+      final stream = service.onEvent('Debug');
+      context.appConnection.runMain();
+      await stream.firstWhere((event) => event.kind == EventKind.kResume);
+      expect(isolate.pauseEvent!.kind, EventKind.kResume);
+    });
+  }, timeout: const Timeout.factor(2));
+
+  group('while debugger is not attached', () {
+    setUp(() async {
+      setCurrentLogWriter(debug: provider.verbose);
+      await context.setUp(
+        testSettings: TestSettings(
+          autoRun: false,
+          waitToDebug: true,
+          moduleFormat: provider.ddcModuleFormat,
+          canaryFeatures: provider.canaryFeatures,
+        ),
+      );
+    });
+
+    tearDown(() async {
+      await context.tearDown();
+    });
+    test('correctly sets the isolate pauseEvent if already running', () async {
+      context.appConnection.runMain();
+      await context.startDebugging();
+      final service = context.vmService;
+      final vm = await service.getVM();
+      final isolate = await service.getIsolate(vm.isolates!.first.id!);
+      expect(isolate.pauseEvent!.kind, EventKind.kResume);
+    });
+  });
+}
diff --git a/pkg/dwds/test/integration/run_request_ddc_library_bundle_test.dart b/pkg/dwds/test/integration/run_request_ddc_library_bundle_test.dart
new file mode 100644
index 0000000..4e51bb3
--- /dev/null
+++ b/pkg/dwds/test/integration/run_request_ddc_library_bundle_test.dart
@@ -0,0 +1,26 @@
+// Copyright (c) 2026, 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.
+
+@Timeout(Duration(minutes: 2))
+library;
+
+import 'package:dwds/expression_compiler.dart';
+import 'package:dwds_test_common/test_sdk_configuration.dart';
+import 'package:test/test.dart';
+
+import 'run_request_common.dart';
+
+void main() {
+  // Enable verbose logging for debugging.
+  const debug = false;
+
+  final provider = TestSdkConfigurationProvider(
+    verbose: debug,
+    ddcModuleFormat: ModuleFormat.ddc,
+    canaryFeatures: true,
+  );
+  tearDownAll(provider.dispose);
+
+  testAll(provider: provider);
+}
diff --git a/pkg/dwds/test/integration/screenshot_amd_test.dart b/pkg/dwds/test/integration/screenshot_amd_test.dart
index 7db972b..771e205 100644
--- a/pkg/dwds/test/integration/screenshot_amd_test.dart
+++ b/pkg/dwds/test/integration/screenshot_amd_test.dart
@@ -5,13 +5,16 @@
 @Timeout(Duration(minutes: 2))
 library;
 
+import 'package:dwds/expression_compiler.dart';
 import 'package:dwds_test_common/test_sdk_configuration.dart';
 import 'package:test/test.dart';
 
 import 'screenshot_common.dart';
 
 void main() {
-  final provider = TestSdkConfigurationProvider();
+  final provider = TestSdkConfigurationProvider(
+    ddcModuleFormat: ModuleFormat.amd,
+  );
   tearDownAll(provider.dispose);
 
   testAll(provider: provider);
diff --git a/pkg/dwds_test_common/test/test_sdk_configuration_test.dart b/pkg/dwds_test_common/test/test_sdk_configuration_test.dart
index da19953..3ff5fdd 100644
--- a/pkg/dwds_test_common/test/test_sdk_configuration_test.dart
+++ b/pkg/dwds_test_common/test/test_sdk_configuration_test.dart
@@ -22,7 +22,10 @@
     });
 
     test('Creates and deletes SDK directory copy', () async {
-      final provider = TestSdkConfigurationProvider(verbose: debug);
+      final provider = TestSdkConfigurationProvider(
+        verbose: debug,
+        ddcModuleFormat: ModuleFormat.amd,
+      );
       final sdkDirectory = provider.sdkLayout.sdkDirectory;
       final sdkSummary = provider.sdkLayout.summaryPath;
       try {
@@ -91,7 +94,10 @@
 
   group('Test SDK configuration | DDC with AMD modules |', () {
     setCurrentLogWriter(debug: debug);
-    final provider = TestSdkConfigurationProvider(verbose: debug);
+    final provider = TestSdkConfigurationProvider(
+      verbose: debug,
+      ddcModuleFormat: ModuleFormat.amd,
+    );
     tearDownAll(provider.dispose);
 
     test('Can validate configuration with generated assets', () async {
diff --git a/pkg/front_end/lib/src/base/incremental_compiler.dart b/pkg/front_end/lib/src/base/incremental_compiler.dart
index cd974d1..ab08af8 100644
--- a/pkg/front_end/lib/src/base/incremental_compiler.dart
+++ b/pkg/front_end/lib/src/base/incremental_compiler.dart
@@ -54,8 +54,6 @@
         TypeParameter,
         TypeParameterType,
         VariableDeclaration,
-        VariableGet,
-        VariableSet,
         VisitorDefault,
         VisitorVoidMixin;
 import 'package:kernel/kernel.dart' as kernel show Combinator;
@@ -93,7 +91,12 @@
 import '../kernel/benchmarker.dart' show BenchmarkPhases, Benchmarker;
 import '../kernel/dart_scope_calculator.dart' show DartScope, DartScopeBuilder2;
 import '../kernel/hierarchy/hierarchy_builder.dart' show ClassHierarchyBuilder;
-import '../kernel/internal_ast.dart' show VariableDeclarationImpl;
+import '../kernel/internal_ast.dart'
+    show
+        VariableDeclarationImpl,
+        InternalVariableGet,
+        InternalVariableSet,
+        InternalVariable;
 import '../kernel/kernel_target.dart' show BuildResult, KernelTarget;
 import '../source/check_helper.dart';
 import '../source/source_compilation_unit.dart' show SourceCompilationUnitImpl;
@@ -1937,7 +1940,8 @@
                     isConst: true,
                     hasDeclaredInitializer: true,
                     initializer: def.value.initializer,
-                  )..fileOffset = def.value.fileOffset,
+                    fileOffset: def.value.fileOffset,
+                  ),
                 );
               } else if (def.value.isInitializingFormal ||
                   def.value.isSuperInitializingFormal) {
@@ -1954,7 +1958,8 @@
                     def.key,
                     type: substitution.substituteType(def.value.type),
                     isConst: false,
-                  )..fileOffset = def.value.fileOffset,
+                    fileOffset: def.value.fileOffset,
+                  ),
                 );
               }
             } else if (existingType is DynamicType ||
@@ -2226,7 +2231,8 @@
           VariableDeclarationImpl variable = new VariableDeclarationImpl(
             def.key,
             type: def.value,
-          )..fileOffset = offsetToUse ?? libraryBuilder.library.fileOffset;
+            fileOffset: offsetToUse ?? libraryBuilder.library.fileOffset,
+          );
 
           if (isExtensionOrExtensionTypeInstanceMember &&
               isExtensionThisName(def.key) &&
@@ -2537,7 +2543,7 @@
 
 // Coverage-ignore(suite): Not run.
 class ExpressionEvaluationHelperImpl implements ExpressionEvaluationHelper {
-  final Set<VariableDeclarationImpl> knownButUnavailable = {};
+  final Set<InternalVariable> knownButUnavailable = {};
   final ClassHierarchy hierarchy;
 
   ExpressionEvaluationHelperImpl(
@@ -2555,8 +2561,8 @@
   }
 
   @override
-  ExpressionInferenceResult? visitVariableGet(
-    VariableGet node,
+  ExpressionInferenceResult? visitInternalVariableGet(
+    InternalVariableGet node,
     DartType typeContext,
     ProblemReporting problemReporting,
     CompilerContext compilerContext,
@@ -2575,8 +2581,8 @@
   }
 
   @override
-  ExpressionInferenceResult? visitVariableSet(
-    VariableSet node,
+  ExpressionInferenceResult? visitInternalVariableSet(
+    InternalVariableSet node,
     DartType typeContext,
     ProblemReporting problemReporting,
     CompilerContext compilerContext,
@@ -2596,7 +2602,7 @@
 
   ExpressionInferenceResult _returnKnownVariableUnavailable(
     Expression node,
-    VariableDeclaration variable,
+    InternalVariable variable,
     ProblemReporting problemReporting,
     CompilerContext compilerContext,
     Uri fileUri,
diff --git a/pkg/front_end/lib/src/base/lookup_result.dart b/pkg/front_end/lib/src/base/lookup_result.dart
index 72c4bff..8581667 100644
--- a/pkg/front_end/lib/src/base/lookup_result.dart
+++ b/pkg/front_end/lib/src/base/lookup_result.dart
@@ -9,6 +9,7 @@
 import '../builder/declaration_builders.dart';
 import '../builder/member_builder.dart';
 import '../codes/cfe_codes.dart';
+import '../kernel/external_ast_helper.dart' as extern;
 import 'compiler_context.dart';
 
 abstract class LookupResult {
@@ -66,7 +67,7 @@
           CfeSeverity.error,
         )
         .plain;
-    return new InvalidExpression(text)..fileOffset = fileOffset;
+    return extern.createInvalidExpression(text, fileOffset: fileOffset);
   }
 
   static LookupResult? createResult(
diff --git a/pkg/front_end/lib/src/builder/formal_parameter_builder.dart b/pkg/front_end/lib/src/builder/formal_parameter_builder.dart
index 1e1870b..bd03f8d 100644
--- a/pkg/front_end/lib/src/builder/formal_parameter_builder.dart
+++ b/pkg/front_end/lib/src/builder/formal_parameter_builder.dart
@@ -7,14 +7,10 @@
 import 'package:_fe_analyzer_shared/src/scanner/scanner.dart' show Token;
 import 'package:kernel/ast.dart'
     show
-        CatchVariable,
         DartType,
         DynamicType,
         Expression,
         InvalidExpression,
-        NamedParameter,
-        NullLiteral,
-        PositionalParameter,
         VariableDeclaration;
 import 'package:kernel/class_hierarchy.dart';
 
@@ -23,6 +19,7 @@
 import '../base/modifiers.dart';
 import '../base/scope.dart' show LookupScope;
 import '../kernel/body_builder_context.dart';
+import '../kernel/external_ast_helper.dart' as extern;
 import '../kernel/internal_ast.dart'
     show
         InternalCatchVariable,
@@ -46,34 +43,168 @@
 import 'type_builder.dart';
 import 'variable_builder.dart';
 
-abstract class ParameterBuilder {
-  TypeBuilder get type;
+/// A builder for a catch block parameter.
+class CatchParameterBuilder extends NamedBuilderImpl
+    with LookupResultMixin
+    implements ParameterVariableBuilder, InferredTypeListener {
+  @override
+  final int fileOffset;
 
-  /// The kind of this parameter, i.e. if it's required, positional optional,
-  /// or named optional.
-  FormalParameterKind get kind;
+  final Modifiers modifiers;
 
-  bool get isPositional;
+  @override
+  TypeBuilder type;
 
-  bool get isRequiredPositional;
+  @override
+  final String name;
 
-  bool get isNamed;
+  @override
+  final Uri fileUri;
 
-  bool get isRequiredNamed;
+  /// The variable declaration created for this catch parameter.
+  InternalVariable? _variable;
 
-  /// Whether this formal parameter is a wildcard variable.
-  bool get isWildcard;
+  /// If this is a wildcard variable, this holds the index used to create a
+  /// uniquely named kernel variable for it.
+  final int? _wildcardIndex;
 
-  String? get name;
+  final int? nameOffset;
 
-  int get fileOffset;
+  final bool isClosureContextLoweringEnabled;
 
-  VariableDeclaration build(SourceLibraryBuilder library);
+  CatchParameterBuilder({
+    required this.modifiers,
+    required this.type,
+    required this.name,
+    required this.fileOffset,
+    required this.fileUri,
+    Token? defaultValueToken,
+    int? wildcardIndex,
+    required this.nameOffset,
+    required this.isClosureContextLoweringEnabled,
+  }) : this._wildcardIndex = wildcardIndex {
+    type.registerInferredTypeListener(this);
+  }
+
+  @override
+  // Coverage-ignore(suite): Not run.
+  String get fullNameForErrors => name;
+
+  @override
+  NamedBuilder get getable => this;
+
+  @override
+  bool get isAssignable => false;
+
+  @override
+  bool get isConst => false;
+
+  @override
+  // Coverage-ignore(suite): Not run.
+  bool get isFinal => true;
+
+  @override
+  // Coverage-ignore(suite): Not run.
+  bool get isLate => false;
+
+  @override
+  // Coverage-ignore(suite): Not run.
+  bool get isNamed => false;
+
+  // Coverage-ignore(suite): Not run.
+  bool get isOptional => false;
+
+  // Coverage-ignore(suite): Not run.
+  // TODO(johnniwinther): This was previously named `isOptional` so we might
+  // have some uses that intended to use the now existing `isOptional` method.
+  bool get isOptionalPositional => false;
+
+  @override
+  // Coverage-ignore(suite): Not run.
+  bool get isPositional => false;
+
+  @override
+  bool get isPrimaryConstructorParameter => false;
+
+  @override
+  bool get isRequiredNamed => false;
+
+  @override
+  // Coverage-ignore(suite): Not run.
+  bool get isRequiredPositional => true;
+
+  @override
+  bool get isWildcard => _wildcardIndex != null;
+
+  @override
+  FormalParameterKind get kind {
+    throw new UnsupportedError("${this.runtimeType}.kind");
+  }
+
+  @override
+  // Coverage-ignore(suite): Not run.
+  Builder? get parent => null;
+
+  @override
+  NamedBuilder? get setable => isAssignable ? this : null;
+
+  @override
+  VariableDeclaration get variable => _variable!.asVariableDeclaration;
+
+  @override
+  VariableDeclaration build(SourceLibraryBuilder library) {
+    if (_variable == null) {
+      bool isTypeOmitted = type is OmittedTypeBuilder;
+      DartType? builtType = type.build(library, TypeUse.parameterType);
+      String variableName = _wildcardIndex != null
+          ? createWildcardFormalParameterName(_wildcardIndex)
+          : name;
+
+      if (isClosureContextLoweringEnabled) {
+        _variable = new InternalCatchVariable(
+          astVariable: extern.createCatchVariable(
+            name: variableName,
+            type: isTypeOmitted ? const DynamicType() : builtType,
+            isWildcard: isWildcard,
+            fileOffset: fileOffset,
+          ),
+          isImplicitlyTyped: isTypeOmitted,
+          fileOffset: fileOffset,
+        );
+      } else {
+        _variable = new VariableDeclarationImpl(
+          variableName,
+          // [VariableDeclarationImpl] uses `null` to signal an omitted type.
+          type: isTypeOmitted ? null : builtType,
+          isFinal: modifiers.isFinal,
+          isConst: false,
+          isInitializingFormal: false,
+          isSuperInitializingFormal: false,
+          isCovariantByDeclaration: false,
+          isRequired: isRequiredNamed,
+          hasDeclaredInitializer: false,
+          isLowered: false,
+          isSynthesized: false,
+          isWildcard: isWildcard,
+          fileOffset: fileOffset,
+        );
+      }
+    }
+    return _variable!.asVariableDeclaration;
+  }
+
+  @override
+  // Coverage-ignore(suite): Not run.
+  void onInferredType(DartType type) {
+    if (_variable != null) {
+      _variable!.type = type;
+    }
+  }
+
+  @override
+  String toString() => '$runtimeType($name)';
 }
 
-abstract class ParameterVariableBuilder
-    implements ParameterBuilder, VariableBuilder {}
-
 /// A builder for a formal parameter, i.e. a parameter on a method or
 /// constructor.
 class FormalParameterBuilder extends NamedBuilderImpl
@@ -167,38 +298,11 @@
   }
 
   @override
-  bool get isWildcard => _wildcardIndex != null;
-
-  @override
   // Coverage-ignore(suite): Not run.
-  Builder? get parent => null;
+  String get fullNameForErrors => name;
 
   @override
-  bool get isRequiredPositional => kind.isRequiredPositional;
-
-  // TODO(johnniwinther): This was previously named `isOptional` so we might
-  // have some uses that intended to use the now existing `isOptional` method.
-  bool get isOptionalPositional => !isRequiredPositional;
-
-  @override
-  bool get isRequiredNamed => kind.isRequiredNamed;
-
-  @override
-  bool get isPositional => kind.isPositional;
-
-  @override
-  bool get isNamed => kind.isNamed;
-
-  bool get isOptional => kind.isOptional;
-
-  bool get isInitializingFormal => modifiers.isInitializingFormal;
-
-  bool get isSuperInitializingFormal => modifiers.isSuperInitializingFormal;
-
-  bool get isCovariantByDeclaration => modifiers.isCovariant;
-
-  @override
-  bool get isConst => modifiers.isConst;
+  NamedBuilder get getable => this;
 
   // An initializing formal parameter might be final without its
   // VariableDeclaration being final. See
@@ -210,14 +314,50 @@
       !isSuperInitializingFormal;
 
   @override
-  NamedBuilder get getable => this;
+  bool get isConst => modifiers.isConst;
+
+  bool get isCovariantByDeclaration => modifiers.isCovariant;
+
+  @override
+  bool get isFinal => variable.isFinal;
+
+  bool get isInitializingFormal => modifiers.isInitializingFormal;
+
+  @override
+  bool get isLate => variable.isLate;
+
+  @override
+  bool get isNamed => kind.isNamed;
+
+  bool get isOptional => kind.isOptional;
+
+  // TODO(johnniwinther): This was previously named `isOptional` so we might
+  // have some uses that intended to use the now existing `isOptional` method.
+  bool get isOptionalPositional => !isRequiredPositional;
+
+  @override
+  bool get isPositional => kind.isPositional;
+
+  @override
+  bool get isRequiredNamed => kind.isRequiredNamed;
+
+  @override
+  bool get isRequiredPositional => kind.isRequiredPositional;
+
+  bool get isSuperInitializingFormal => modifiers.isSuperInitializingFormal;
+
+  @override
+  bool get isWildcard => _wildcardIndex != null;
+
+  @override
+  // Coverage-ignore(suite): Not run.
+  Builder? get parent => null;
 
   @override
   NamedBuilder? get setable => isAssignable ? this : null;
 
   @override
-  // Coverage-ignore(suite): Not run.
-  String get fullNameForErrors => name;
+  VariableDeclaration get variable => _variable!.asVariableDeclaration;
 
   @override
   VariableDeclaration build(SourceLibraryBuilder library) {
@@ -241,7 +381,7 @@
           case FormalParameterKind.requiredPositional:
           case FormalParameterKind.optionalPositional:
             _variable = new InternalPositionalParameter(
-              astVariable: new PositionalParameter(
+              astVariable: extern.createPositionalParameter(
                 cosmeticName: variableName,
                 type: isTypeOmitted ? const DynamicType() : builtType,
                 defaultValue: null,
@@ -252,14 +392,16 @@
                 isLowered: isExtensionThis,
                 isSynthesized: name == noNameSentinel,
                 isWildcard: isWildcard,
-              )..fileOffset = fileOffset,
+                fileOffset: fileOffset,
+              ),
               isImplicitlyTyped: isTypeOmitted,
-            )..fileOffset = fileOffset;
+              fileOffset: fileOffset,
+            );
           case FormalParameterKind.requiredNamed:
           // Coverage-ignore(suite): Not run.
           case FormalParameterKind.optionalNamed:
             _variable = new InternalNamedParameter(
-              astVariable: new NamedParameter(
+              astVariable: extern.createNamedParameter(
                 parameterName: variableName!,
                 type: isTypeOmitted ? const DynamicType() : builtType,
                 defaultValue: null,
@@ -270,9 +412,11 @@
                 hasDeclaredDefaultType: hasDeclaredInitializer,
                 isSynthesized: name == noNameSentinel,
                 isWildcard: isWildcard,
-              )..fileOffset = fileOffset,
+                fileOffset: fileOffset,
+              ),
               isImplicitlyTyped: isTypeOmitted,
-            )..fileOffset = fileOffset;
+              fileOffset: fileOffset,
+            );
         }
       } else {
         _variable = new VariableDeclarationImpl(
@@ -289,120 +433,13 @@
           isLowered: isExtensionThis,
           isSynthesized: name == noNameSentinel,
           isWildcard: isWildcard,
-        )..fileOffset = fileOffset;
+          fileOffset: fileOffset,
+        );
       }
     }
-    return _variable!.asExpressionVariable;
+    return _variable!.asVariableDeclaration;
   }
 
-  @override
-  VariableDeclaration get variable => _variable!.asExpressionVariable;
-
-  @override
-  void onInferredType(DartType type) {
-    _variable?.type = type;
-  }
-
-  /// Creates the [FormalParameterBuilder] for a parameter used in the formal
-  /// parameters in a primary constructor.
-  ///
-  /// If [isDeclaring] is `true` the parameter is marked as an initializing
-  /// formal whose type is inferred. Otherwise the parameter is marked as
-  /// final primary constructor parameter.
-  ///
-  /// The created parameter replaces the original parameter in the primary
-  /// constructor declaration.
-  FormalParameterBuilder forPrimaryConstructor(
-    FragmentFactory builderFactory, {
-    required bool isDeclaring,
-  }) {
-    assert(_variable == null);
-    return new FormalParameterBuilder(
-      kind: kind,
-      modifiers: isDeclaring
-          ? (modifiers | Modifiers.InitializingFormal)
-          : (modifiers | Modifiers.Final),
-      type: isDeclaring
-          ? builderFactory.addInferableType(InferenceDefaultType.NullableObject)
-          : type,
-      name: name,
-      fileOffset: fileOffset,
-      nameOffset: nameOffset,
-      fileUri: fileUri,
-      isExtensionThis: isExtensionThis,
-      defaultValueToken: copyDefaultValueToken(),
-      hasImmediatelyDeclaredInitializer: hasImmediatelyDeclaredInitializer,
-      publicName: publicName,
-      wildcardIndex: _wildcardIndex,
-      isClosureContextLoweringEnabled: isClosureContextLoweringEnabled,
-      isPrimaryConstructorParameter: !isDeclaring,
-    );
-  }
-
-  void finalizeInitializingFormal(
-    DeclarationBuilder declarationBuilder,
-    SourceConstructorBuilder constructorBuilder,
-    ClassHierarchyBase hierarchy,
-  ) {
-    String fieldName = isWildcardLoweredFormalParameter(name) ? '_' : name;
-    LookupResult? result = declarationBuilder.lookupLocalMember(fieldName);
-    Builder? fieldBuilder = result?.getable;
-    if (result is DuplicateMemberLookupResult) {
-      fieldBuilder = result.declarations.first;
-    }
-    if (fieldBuilder is SourcePropertyBuilder && fieldBuilder.hasField) {
-      DartType fieldType = fieldBuilder.inferFieldType(hierarchy);
-      fieldType = constructorBuilder.substituteFieldType(fieldType);
-      type.registerInferredType(fieldType);
-    } else {
-      type.registerInferredType(const DynamicType());
-    }
-  }
-
-  static bool _needsDefaultValuesBuiltAsOutlineExpressions(
-    SourceMemberBuilder memberBuilder,
-  ) {
-    // For modular compilation we need to include default values for optional
-    // and named parameters in several cases:
-    // * for const constructors to enable constant evaluation,
-    // * for instance methods because these might be needed to generated
-    //   noSuchMethod forwarders,
-    // * for generative constructors to support forwarding constructors
-    //   in mixin applications, and
-    // * for factories, to uphold the invariant that optional parameters always
-    //   have default values, even during modular compilation.
-    if (memberBuilder is SourceConstructorBuilder) {
-      return true;
-    } else if (memberBuilder is SourceFactoryBuilder) {
-      return true;
-    } else {
-      return memberBuilder.isClassInstanceMember;
-    }
-  }
-
-  /// Returns the [_defaultValueToken] field and clears it.
-  ///
-  /// This is used to transfer ownership of the token to the receiver. Tokens
-  /// need to be cleared during the outline phase to avoid holding the token
-  /// stream in memory.
-  Token? _takeDefaultValueToken() {
-    Token? initializerToken = _defaultValueToken;
-    _defaultValueToken = null;
-    return initializerToken;
-  }
-
-  /// Returns the [_defaultValueToken] field and without clearing it.
-  ///
-  /// This is used to copy ownership of the token to the receiver, such that
-  /// both this [FormalParameterBuilder] and the receiver owns a copy. Tokens
-  /// need to be cleared during the outline phase to avoid holding the token
-  /// stream in memory.
-  ///
-  /// This is used when creating primary constructor formal parameters, where
-  /// the default value should be used both to infer the field type and to
-  /// create the default value for the constructor parameter.
-  Token? copyDefaultValueToken() => _defaultValueToken;
-
   /// Builds the default value from this [initializerToken] if this is a
   /// formal parameter on a const constructor or instance method.
   void buildOutlineExpressions({
@@ -443,19 +480,119 @@
         initializerWasInferred = true;
       } else if (kind.isOptional) {
         // As done by BodyBuilder.endFormalParameter.
-        variable.initializer = new NullLiteral()..parent = variable;
+        variable.initializer = extern.createNullLiteral(fileOffset: fileOffset)
+          ..parent = variable;
       }
     }
   }
 
-  @override
-  bool get isFinal => variable.isFinal;
+  /// Returns the [_defaultValueToken] field and without clearing it.
+  ///
+  /// This is used to copy ownership of the token to the receiver, such that
+  /// both this [FormalParameterBuilder] and the receiver owns a copy. Tokens
+  /// need to be cleared during the outline phase to avoid holding the token
+  /// stream in memory.
+  ///
+  /// This is used when creating primary constructor formal parameters, where
+  /// the default value should be used both to infer the field type and to
+  /// create the default value for the constructor parameter.
+  Token? copyDefaultValueToken() => _defaultValueToken;
+
+  void finalizeInitializingFormal(
+    DeclarationBuilder declarationBuilder,
+    SourceConstructorBuilder constructorBuilder,
+    ClassHierarchyBase hierarchy,
+  ) {
+    String fieldName = isWildcardLoweredFormalParameter(name) ? '_' : name;
+    LookupResult? result = declarationBuilder.lookupLocalMember(fieldName);
+    Builder? fieldBuilder = result?.getable;
+    if (result is DuplicateMemberLookupResult) {
+      fieldBuilder = result.declarations.first;
+    }
+    if (fieldBuilder is SourcePropertyBuilder && fieldBuilder.hasField) {
+      DartType fieldType = fieldBuilder.inferFieldType(hierarchy);
+      fieldType = constructorBuilder.substituteFieldType(fieldType);
+      type.registerInferredType(fieldType);
+    } else {
+      type.registerInferredType(const DynamicType());
+    }
+  }
+
+  /// Creates the [FormalParameterBuilder] for a parameter used in the formal
+  /// parameters in a primary constructor.
+  ///
+  /// If [isDeclaring] is `true` the parameter is marked as an initializing
+  /// formal whose type is inferred. Otherwise the parameter is marked as
+  /// final primary constructor parameter.
+  ///
+  /// The created parameter replaces the original parameter in the primary
+  /// constructor declaration.
+  FormalParameterBuilder forPrimaryConstructor(
+    FragmentFactory builderFactory, {
+    required bool isDeclaring,
+  }) {
+    assert(_variable == null);
+    return new FormalParameterBuilder(
+      kind: kind,
+      modifiers: isDeclaring
+          ? (modifiers | Modifiers.InitializingFormal)
+          : (modifiers | Modifiers.Final),
+      type: isDeclaring
+          ? builderFactory.addInferableType(InferenceDefaultType.NullableObject)
+          : type,
+      name: name,
+      fileOffset: fileOffset,
+      nameOffset: nameOffset,
+      fileUri: fileUri,
+      isExtensionThis: isExtensionThis,
+      defaultValueToken: copyDefaultValueToken(),
+      hasImmediatelyDeclaredInitializer: hasImmediatelyDeclaredInitializer,
+      publicName: publicName,
+      wildcardIndex: _wildcardIndex,
+      isClosureContextLoweringEnabled: isClosureContextLoweringEnabled,
+      isPrimaryConstructorParameter: !isDeclaring,
+    );
+  }
 
   @override
-  bool get isLate => variable.isLate;
+  void onInferredType(DartType type) {
+    _variable?.type = type;
+  }
 
   @override
   String toString() => '$runtimeType($name)';
+
+  /// Returns the [_defaultValueToken] field and clears it.
+  ///
+  /// This is used to transfer ownership of the token to the receiver. Tokens
+  /// need to be cleared during the outline phase to avoid holding the token
+  /// stream in memory.
+  Token? _takeDefaultValueToken() {
+    Token? initializerToken = _defaultValueToken;
+    _defaultValueToken = null;
+    return initializerToken;
+  }
+
+  static bool _needsDefaultValuesBuiltAsOutlineExpressions(
+    SourceMemberBuilder memberBuilder,
+  ) {
+    // For modular compilation we need to include default values for optional
+    // and named parameters in several cases:
+    // * for const constructors to enable constant evaluation,
+    // * for instance methods because these might be needed to generated
+    //   noSuchMethod forwarders,
+    // * for generative constructors to support forwarding constructors
+    //   in mixin applications, and
+    // * for factories, to uphold the invariant that optional parameters always
+    //   have default values, even during modular compilation.
+    if (memberBuilder is SourceConstructorBuilder) {
+      return true;
+    } else if (memberBuilder is SourceFactoryBuilder) {
+      return true;
+    } else {
+      return memberBuilder.isClassInstanceMember;
+    }
+  }
 }
 
 class FunctionTypeParameterBuilder implements ParameterBuilder {
@@ -471,13 +608,18 @@
   FunctionTypeParameterBuilder(this.kind, this.type, this.name);
 
   @override
+  int get fileOffset {
+    throw new UnsupportedError("${this.runtimeType}.fileOffset");
+  }
+
+  @override
   bool get isNamed => kind.isNamed;
 
   @override
-  bool get isRequiredNamed => kind.isRequiredNamed;
+  bool get isPositional => kind.isPositional;
 
   @override
-  bool get isPositional => kind.isPositional;
+  bool get isRequiredNamed => kind.isRequiredNamed;
 
   @override
   bool get isRequiredPositional => kind.isRequiredPositional;
@@ -487,171 +629,35 @@
   bool get isWildcard => false;
 
   @override
-  int get fileOffset {
-    throw new UnsupportedError("${this.runtimeType}.fileOffset");
-  }
-
-  @override
   VariableDeclaration build(SourceLibraryBuilder library) {
     throw new UnsupportedError("${this.runtimeType}.build");
   }
 }
 
-/// A builder for a catch block parameter.
-class CatchParameterBuilder extends NamedBuilderImpl
-    with LookupResultMixin
-    implements ParameterVariableBuilder, InferredTypeListener {
-  @override
-  final int fileOffset;
+abstract class ParameterBuilder {
+  int get fileOffset;
 
-  final Modifiers modifiers;
+  bool get isNamed;
 
-  @override
-  TypeBuilder type;
+  bool get isPositional;
 
-  @override
-  final String name;
+  bool get isRequiredNamed;
 
-  @override
-  final Uri fileUri;
+  bool get isRequiredPositional;
 
-  /// The variable declaration created for this catch parameter.
-  InternalVariable? _variable;
+  /// Whether this formal parameter is a wildcard variable.
+  bool get isWildcard;
 
-  /// If this is a wildcard variable, this holds the index used to create a
-  /// uniquely named kernel variable for it.
-  final int? _wildcardIndex;
+  /// The kind of this parameter, i.e. if it's required, positional optional,
+  /// or named optional.
+  FormalParameterKind get kind;
 
-  final int? nameOffset;
+  String? get name;
 
-  final bool isClosureContextLoweringEnabled;
+  TypeBuilder get type;
 
-  CatchParameterBuilder({
-    required this.modifiers,
-    required this.type,
-    required this.name,
-    required this.fileOffset,
-    required this.fileUri,
-    Token? defaultValueToken,
-    int? wildcardIndex,
-    required this.nameOffset,
-    required this.isClosureContextLoweringEnabled,
-  }) : this._wildcardIndex = wildcardIndex {
-    type.registerInferredTypeListener(this);
-  }
-
-  @override
-  bool get isWildcard => _wildcardIndex != null;
-
-  @override
-  FormalParameterKind get kind {
-    throw new UnsupportedError("${this.runtimeType}.kind");
-  }
-
-  @override
-  // Coverage-ignore(suite): Not run.
-  Builder? get parent => null;
-
-  @override
-  // Coverage-ignore(suite): Not run.
-  bool get isRequiredPositional => true;
-
-  // Coverage-ignore(suite): Not run.
-  // TODO(johnniwinther): This was previously named `isOptional` so we might
-  // have some uses that intended to use the now existing `isOptional` method.
-  bool get isOptionalPositional => false;
-
-  @override
-  bool get isRequiredNamed => false;
-
-  @override
-  // Coverage-ignore(suite): Not run.
-  bool get isPositional => false;
-
-  @override
-  // Coverage-ignore(suite): Not run.
-  bool get isNamed => false;
-
-  // Coverage-ignore(suite): Not run.
-  bool get isOptional => false;
-
-  @override
-  bool get isConst => false;
-
-  @override
-  bool get isAssignable => false;
-
-  @override
-  NamedBuilder get getable => this;
-
-  @override
-  NamedBuilder? get setable => isAssignable ? this : null;
-
-  @override
-  // Coverage-ignore(suite): Not run.
-  String get fullNameForErrors => name;
-
-  @override
-  VariableDeclaration get variable => _variable!.asExpressionVariable;
-
-  @override
-  VariableDeclaration build(SourceLibraryBuilder library) {
-    if (_variable == null) {
-      bool isTypeOmitted = type is OmittedTypeBuilder;
-      DartType? builtType = type.build(library, TypeUse.parameterType);
-      String variableName = _wildcardIndex != null
-          ? createWildcardFormalParameterName(_wildcardIndex)
-          : name;
-
-      if (isClosureContextLoweringEnabled) {
-        _variable = new InternalCatchVariable(
-          astVariable: new CatchVariable(
-            name: variableName,
-            type: isTypeOmitted ? const DynamicType() : builtType,
-            isWildcard: isWildcard,
-          ),
-          isImplicitlyTyped: isTypeOmitted,
-        );
-      } else {
-        _variable = new VariableDeclarationImpl(
-          variableName,
-          // [VariableDeclarationImpl] uses `null` to signal an omitted type.
-          type: isTypeOmitted ? null : builtType,
-          isFinal: modifiers.isFinal,
-          isConst: false,
-          isInitializingFormal: false,
-          isSuperInitializingFormal: false,
-          isCovariantByDeclaration: false,
-          isRequired: isRequiredNamed,
-          hasDeclaredInitializer: false,
-          isLowered: false,
-          isSynthesized: false,
-          isWildcard: isWildcard,
-        )..fileOffset = fileOffset;
-      }
-    }
-    return _variable!.asExpressionVariable;
-  }
-
-  @override
-  // Coverage-ignore(suite): Not run.
-  void onInferredType(DartType type) {
-    if (_variable != null) {
-      _variable!.type = type;
-    }
-  }
-
-  @override
-  String toString() => '$runtimeType($name)';
-
-  @override
-  // Coverage-ignore(suite): Not run.
-  bool get isFinal => true;
-
-  @override
-  // Coverage-ignore(suite): Not run.
-  bool get isLate => false;
-
-  @override
-  bool get isPrimaryConstructorParameter => false;
+  VariableDeclaration build(SourceLibraryBuilder library);
 }
+
+abstract class ParameterVariableBuilder
+    implements ParameterBuilder, VariableBuilder {}
diff --git a/pkg/front_end/lib/src/builder/metadata_builder.dart b/pkg/front_end/lib/src/builder/metadata_builder.dart
index 8bc36d6..63a3f2d 100644
--- a/pkg/front_end/lib/src/builder/metadata_builder.dart
+++ b/pkg/front_end/lib/src/builder/metadata_builder.dart
@@ -15,6 +15,7 @@
 import '../base/loader.dart';
 import '../base/scope.dart' show LookupScope;
 import '../kernel/body_builder_context.dart';
+import '../kernel/external_ast_helper.dart' as extern;
 import '../kernel/macro/metadata.dart' hide ExtensionScope;
 import '../source/source_library_builder.dart' show SourceLibraryBuilder;
 
@@ -149,10 +150,11 @@
         );
         // Coverage-ignore(suite): Not run.
         if (createFileUriExpression && annotation is! FileUriExpression) {
-          annotation = new FileUriExpression(
-            annotation,
-            annotationBuilder.fileUri,
-          )..fileOffset = annotationBuilder.atOffset;
+          annotation = extern.createFileUriExpression(
+            expression: annotation,
+            fileUri: annotationBuilder.fileUri,
+            fileOffset: annotationBuilder.atOffset,
+          );
         }
         annotatable.addAnnotation(annotation);
       }
diff --git a/pkg/front_end/lib/src/codes/diagnostic.g.dart b/pkg/front_end/lib/src/codes/diagnostic.g.dart
index b7242d6..e7a0ba8 100644
--- a/pkg/front_end/lib/src/codes/diagnostic.g.dart
+++ b/pkg/front_end/lib/src/codes/diagnostic.g.dart
@@ -9925,6 +9925,15 @@
 );
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const MessageCode nonIdentifierForInElement = const MessageCode(
+  "NonIdentifierForInElement",
+  problemMessage:
+      """The element in a for-in loop must be an identifier or a local variable declaration.""",
+  correctionMessage:
+      """Try using an existing variable or a variable declaration.""",
+);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<Message Function({required DartType spreadType})>
 nonNullAwareSpreadIsNull = const Template(
   "NonNullAwareSpreadIsNull",
diff --git a/pkg/front_end/lib/src/fragment/constructor/body_builder_context.dart b/pkg/front_end/lib/src/fragment/constructor/body_builder_context.dart
index 2a63c71..11a47ca 100644
--- a/pkg/front_end/lib/src/fragment/constructor/body_builder_context.dart
+++ b/pkg/front_end/lib/src/fragment/constructor/body_builder_context.dart
@@ -26,8 +26,15 @@
 
   final Member _member;
 
-  ConstructorBodyBuilderContext(this._builder, this._declaration, this._member)
-    : super(
+  @override
+  final ConstructorContext constructorContext;
+
+  ConstructorBodyBuilderContext(
+    this._builder,
+    this._declaration,
+    this._member,
+    this.constructorContext,
+  ) : super(
         _builder.libraryBuilder,
         _builder.declarationBuilder,
         isDeclarationInstanceMember: false,
@@ -110,7 +117,7 @@
   }) {
     return typeInferrer.inferInitializer(
       fileUri: fileUri,
-      constructorBuilder: _builder,
+      constructorContext: constructorContext,
       initializer: initializer,
       parameters: parameters,
       internalThisVariable: internalThisVariable,
diff --git a/pkg/front_end/lib/src/fragment/constructor/encoding.dart b/pkg/front_end/lib/src/fragment/constructor/encoding.dart
index 085749e..1d10e09 100644
--- a/pkg/front_end/lib/src/fragment/constructor/encoding.dart
+++ b/pkg/front_end/lib/src/fragment/constructor/encoding.dart
@@ -16,6 +16,7 @@
 import '../../builder/type_builder.dart';
 import '../../kernel/body_builder_context.dart';
 import '../../kernel/constructor_tearoff_lowering.dart';
+import '../../kernel/external_ast_helper.dart' as extern;
 import '../../kernel/internal_ast.dart';
 import '../../kernel/kernel_helper.dart';
 import '../../source/name_scheme.dart';
@@ -29,6 +30,7 @@
 import '../../source/source_member_builder.dart';
 import '../../source/source_type_parameter_builder.dart';
 import '../../source/type_parameter_factory.dart';
+import '../../type_inference/type_inferrer.dart';
 import '../../type_inference/type_schema.dart';
 import '../fragment.dart';
 import 'body_builder_context.dart';
@@ -143,14 +145,14 @@
     if (body != null) {
       _constructor.function.registerFunctionBody(body);
     }
-    _constructor.function.scope = scope?..parent = _constructor.function;
+    _constructor.function.scope = scope;
     _constructor.function.thisVariable = thisVariable;
   }
 
   @override
   void registerNoBodyConstructor() {
     if (!_isExternal) {
-      registerFunctionBody(body: new EmptyStatement());
+      registerFunctionBody(body: extern.createEmptyStatement());
     }
   }
 
@@ -270,17 +272,20 @@
     required List<DelayedDefaultValueCloner> delayedDefaultValueCloners,
   }) {
     if (!_hasBeenBuilt) {
-      _constructor =
-          new Constructor(
-              new FunctionNode(_isExternal ? null : new EmptyStatement()),
-              name: dummyName,
-              fileUri: fileUri,
-              reference: constructorReferences?.constructorReference,
-              isSynthetic: isSynthetic,
-            )
-            ..startFileOffset = startOffset
-            ..fileOffset = fileOffset
-            ..fileEndOffset = endOffset;
+      _constructor = extern.createConstructor(
+        extern.createFunctionNode(
+          _isExternal ? null : extern.createEmptyStatement(),
+          fileOffset: fileOffset,
+          fileEndOffset: endOffset,
+        ),
+        name: dummyName,
+        fileUri: fileUri,
+        reference: constructorReferences?.constructorReference,
+        isSynthetic: isSynthetic,
+        fileStartOffset: startOffset,
+        fileOffset: fileOffset,
+        fileEndOffset: endOffset,
+      );
       nameScheme
           .getConstructorMemberName(name, isTearOff: false)
           .attachMember(_constructor);
@@ -460,6 +465,7 @@
       constructorBuilder,
       constructorDeclaration,
       _constructor,
+      new _RegularConstructorContext(constructorBuilder),
     );
   }
 
@@ -528,16 +534,14 @@
     if (body != null) {
       _constructor.function.registerFunctionBody(body);
     }
-    _constructor.function.scope =
-        // Coverage-ignore(suite): Not run.
-        scope?..parent = _constructor.function;
+    _constructor.function.scope = scope;
     _constructor.function.thisVariable = thisVariable;
   }
 
   @override
   void registerNoBodyConstructor() {
     if (!_hasBuiltBody && !_isExternal) {
-      registerFunctionBody(body: new EmptyStatement());
+      registerFunctionBody(body: extern.createEmptyStatement());
     }
   }
 
@@ -558,6 +562,7 @@
     required NameScheme nameScheme,
     required ConstructorReferences? constructorReferences,
     required Uri fileUri,
+    required int startOffset,
     required int fileOffset,
     required int formalsOffset,
     required int endOffset,
@@ -569,16 +574,20 @@
     required List<DelayedDefaultValueCloner> delayedDefaultValueCloners,
   }) {
     if (!_hasBeenBuilt) {
-      _constructor =
-          new Procedure(
-              dummyName,
-              ProcedureKind.Method,
-              new FunctionNode(_isExternal ? null : new EmptyStatement()),
-              fileUri: fileUri,
-              reference: constructorReferences?.constructorReference,
-            )
-            ..fileOffset = fileOffset
-            ..fileEndOffset = endOffset;
+      _constructor = extern.createProcedure(
+        dummyName,
+        ProcedureKind.Method,
+        extern.createFunctionNode(
+          _isExternal ? null : extern.createEmptyStatement(),
+          fileOffset: fileOffset,
+          fileEndOffset: endOffset,
+        ),
+        fileUri: fileUri,
+        reference: constructorReferences?.constructorReference,
+        fileStartOffset: startOffset,
+        fileOffset: fileOffset,
+        fileEndOffset: endOffset,
+      );
       nameScheme
           .getConstructorMemberName(name, isTearOff: false)
           .attachMember(_constructor);
@@ -642,12 +651,11 @@
               isLowered: true,
             )..fileOffset = fileOffset)
           : (new VariableDeclarationImpl(
-                syntheticThisName,
-                isFinal: true,
-                type: _computeThisType(declarationBuilder, typeArguments),
-              )
-              ..fileOffset = fileOffset
-              ..isLowered = true);
+              syntheticThisName,
+              isFinal: true,
+              type: _computeThisType(declarationBuilder, typeArguments),
+              fileOffset: fileOffset,
+            )..isLowered = true);
 
       List<DartType> typeParameterTypes = <DartType>[];
       for (int i = 0; i < _constructor.function.typeParameters.length; i++) {
@@ -779,13 +787,23 @@
       for (Initializer initializer in _initializers) {
         initializer.accept(visitor);
       }
-      if (_constructor.function.body != null &&
-          _constructor.function.body is! EmptyStatement) {
-        statements.add(_constructor.function.body!);
+      int fileOffset = _constructor.fileOffset;
+      int endOffset = _constructor.fileEndOffset;
+      if (_constructor.function.body case Statement body
+          when body is! EmptyStatement) {
+        statements.add(body);
       }
-      statements.add(new ReturnStatement(new VariableGet(thisVariable)));
+      statements.add(
+        extern.createReturnStatement(extern.createVariableGet(thisVariable)),
+      );
       // TODO(cstefantsova): Provide a scope here.
-      registerFunctionBody(body: new Block(statements));
+      registerFunctionBody(
+        body: extern.createBlock(
+          statements,
+          fileOffset: fileOffset,
+          fileEndOffset: endOffset,
+        ),
+      );
     }
     _hasBuiltBody = true;
   }
@@ -799,6 +817,7 @@
       constructorBuilder,
       constructorDeclaration,
       _constructor,
+      new _ExtensionTypeConstructorContext(constructorBuilder, thisVariable!),
     );
   }
 
@@ -845,19 +864,23 @@
   void visitAuxiliaryInitializer(AuxiliaryInitializer node) {
     if (node is ExtensionTypeRedirectingInitializer) {
       statements.add(
-        new ExpressionStatement(
-          new VariableSet(
+        extern.createExpressionStatement(
+          extern.createVariableSet(
             thisVariable,
-            new StaticInvocation(
+            extern.createStaticInvocation(
               node.target,
               node.arguments.toArguments(
                 node.inferredTypeArguments,
                 node.positional,
                 node.named,
               ),
-            )..fileOffset = node.fileOffset,
-          )..fileOffset = node.fileOffset,
-        )..fileOffset = node.fileOffset,
+              fileOffset: node.fileOffset,
+            ),
+            fileOffset: node.fileOffset,
+            // TODO(johnniwinther): Can we avoid this?
+            allowFinalAssignment: true,
+          ),
+        ),
       );
       return;
     } else if (node is ExtensionTypeRepresentationFieldInitializer) {
@@ -883,9 +906,12 @@
   @override
   void visitInvalidInitializer(InvalidInitializer node) {
     statements.add(
-      new ExpressionStatement(
-        new InvalidExpression(node.message)..fileOffset = node.fileOffset,
-      )..fileOffset,
+      extern.createExpressionStatement(
+        extern.createInvalidExpression(
+          node.message,
+          fileOffset: node.fileOffset,
+        ),
+      ),
     );
   }
 
@@ -965,6 +991,7 @@
       constructorReferences: constructorReferences,
       fileUri: fileUri,
       fileOffset: fileOffset,
+      startOffset: startOffset,
       formalsOffset: formalsOffset,
       endOffset: endOffset,
       forAbstractClassOrEnumOrMixin: forAbstractClassOrEnumOrMixin,
@@ -1063,6 +1090,7 @@
       constructorReferences: constructorReferences,
       fileUri: fileUri,
       fileOffset: fileOffset,
+      startOffset: startOffset,
       formalsOffset: formalsOffset,
       endOffset: endOffset,
       forAbstractClassOrEnumOrMixin: forAbstractClassOrEnumOrMixin,
@@ -1348,3 +1376,38 @@
     return new ExtensionTypeConstructorEncoding(isExternal: isExternal);
   }
 }
+
+class _RegularConstructorContext implements ConstructorContext {
+  final SourceConstructorBuilder _builder;
+
+  _RegularConstructorContext(this._builder);
+
+  @override
+  // Coverage-ignore(suite): Not run.
+  FunctionSignature get signature => _builder.signature;
+
+  @override
+  DartType substituteFieldType(DartType fieldType) {
+    return _builder.substituteFieldType(fieldType);
+  }
+
+  @override
+  VariableDeclaration? get thisVariable => null;
+}
+
+class _ExtensionTypeConstructorContext implements ConstructorContext {
+  final SourceConstructorBuilder _builder;
+
+  @override
+  final VariableDeclaration thisVariable;
+
+  _ExtensionTypeConstructorContext(this._builder, this.thisVariable);
+
+  @override
+  FunctionSignature get signature => _builder.signature;
+
+  @override
+  DartType substituteFieldType(DartType fieldType) {
+    return _builder.substituteFieldType(fieldType);
+  }
+}
diff --git a/pkg/front_end/lib/src/fragment/enum_element.dart b/pkg/front_end/lib/src/fragment/enum_element.dart
index d5ca1eb..64141f3 100644
--- a/pkg/front_end/lib/src/fragment/enum_element.dart
+++ b/pkg/front_end/lib/src/fragment/enum_element.dart
@@ -142,20 +142,19 @@
     PropertyReferences references, {
     required List<TypeParameter>? classTypeParameters,
   }) {
-    _field =
-        new Field.immutable(
-            dummyName,
-            type: _type,
-            isFinal: false,
-            isConst: true,
-            isStatic: true,
-            fileUri: fileUri,
-            fieldReference: references.fieldReference,
-            getterReference: references.getterReference,
-            isEnumElement: true,
-          )
-          ..fileOffset = nameOffset
-          ..fileEndOffset = nameOffset;
+    _field = extern.createImmutableField(
+      dummyName,
+      type: _type,
+      isFinal: false,
+      isConst: true,
+      isStatic: true,
+      fileUri: fileUri,
+      fieldReference: references.fieldReference,
+      getterReference: references.getterReference,
+      isEnumElement: true,
+      fileOffset: nameOffset,
+      fileEndOffset: nameOffset,
+    );
     nameScheme
         .getFieldMemberName(
           FieldNameType.Field,
@@ -329,8 +328,8 @@
     MemberBuilder? constructorBuilder = result?.getable;
 
     List<Expression> enumSyntheticArguments = <Expression>[
-      new IntLiteral(elementIndex),
-      new StringLiteral(constant),
+      extern.createIntLiteral(coreTypes, elementIndex, fileOffset: fileOffset),
+      extern.createStringLiteral(constant, fileOffset: fileOffset),
     ];
     TypeArguments? typeArguments;
     List<TypeBuilder>? typeArgumentBuilders =
@@ -388,7 +387,10 @@
         inferredFieldType = fieldType;
       }
     } else {
-      Arguments arguments = new Arguments(enumSyntheticArguments);
+      Arguments arguments = extern.createArguments(
+        enumSyntheticArguments,
+        fileOffset: fileOffset,
+      );
       if (constructorBuilder == null ||
           constructorBuilder is! SourceConstructorBuilder ||
           !constructorBuilder.isConst) {
@@ -408,15 +410,17 @@
           "Initializer has already been computed for $this: "
           "${_field!.initializer}.",
         );
-        _field!.initializer = new InvalidExpression(text)
-          ..fileOffset = nameOffset
-          ..parent = _field;
+        _field!.initializer =
+            extern.createInvalidExpression(text, fileOffset: nameOffset)
+              ..fileOffset = nameOffset
+              ..parent = _field;
       } else {
-        Expression initializer = new ConstructorInvocation(
+        Expression initializer = extern.createConstructorInvocation(
           constructorBuilder.invokeTarget as Constructor,
           arguments,
           isConst: true,
-        )..fileOffset = nameOffset;
+          fileOffset: fileOffset,
+        );
         assert(
           _field!.initializer == null,
           "Initializer has already been computed for $this: "
diff --git a/pkg/front_end/lib/src/fragment/factory/encoding.dart b/pkg/front_end/lib/src/fragment/factory/encoding.dart
index 4ad1d05..6687fb19 100644
--- a/pkg/front_end/lib/src/fragment/factory/encoding.dart
+++ b/pkg/front_end/lib/src/fragment/factory/encoding.dart
@@ -26,6 +26,7 @@
 import '../../fragment/fragment.dart';
 import '../../kernel/body_builder_context.dart';
 import '../../kernel/constructor_tearoff_lowering.dart';
+import '../../kernel/external_ast_helper.dart' as extern;
 import '../../kernel/kernel_helper.dart';
 import '../../source/name_scheme.dart';
 import '../../source/redirecting_factory_body.dart';
@@ -98,16 +99,24 @@
     required bool isConst,
   }) {
     _procedure =
-        new Procedure(
+        extern.createProcedure(
             dummyName,
             nameScheme.isExtensionTypeMember
                 ? ProcedureKind.Method
                 : ProcedureKind.Factory,
-            new FunctionNode(null)
-              ..asyncMarker = _asyncModifier.kind
-              ..dartAsyncMarker = _asyncModifier.kind,
+            extern.createFunctionNode(
+              null,
+              asyncMarker: _asyncModifier.kind,
+              dartAsyncMarker: _asyncModifier.kind,
+              fileOffset: _fragment.fullNameOffset,
+              fileEndOffset: _fragment.endOffset,
+            ),
             fileUri: _fragment.fileUri,
             reference: factoryReferences?.factoryReference,
+            fileStartOffset: _fragment.startOffset,
+            fileOffset: _fragment.fullNameOffset,
+            fileEndOffset: _fragment.endOffset,
+            isExtensionTypeMember: nameScheme.isExtensionTypeMember,
           )
           ..fileStartOffset = _fragment.startOffset
           ..fileOffset = _fragment.fullNameOffset
@@ -130,7 +139,7 @@
     if (_redirectionTarget == null &&
         !_fragment.modifiers.isAbstract &&
         !_fragment.modifiers.isExternal) {
-      _procedure.function.registerFunctionBody(new EmptyStatement());
+      _procedure.function.registerFunctionBody(extern.createEmptyStatement());
     }
     buildTypeParametersAndFormals(
       libraryBuilder,
@@ -845,9 +854,7 @@
         emittedValueType: emittedValueType,
       );
     }
-    _procedure.function.scope =
-        // Coverage-ignore(suite): Not run.
-        scope?..parent = _procedure.function;
+    _procedure.function.scope = scope;
     _procedure.function.thisVariable = thisVariable;
   }
 
diff --git a/pkg/front_end/lib/src/fragment/field/encoding.dart b/pkg/front_end/lib/src/fragment/field/encoding.dart
index 0643519..29edbf3 100644
--- a/pkg/front_end/lib/src/fragment/field/encoding.dart
+++ b/pkg/front_end/lib/src/fragment/field/encoding.dart
@@ -143,7 +143,7 @@
   }) {
     bool isImmutable = !hasSetter;
     _field = isImmutable
-        ? new Field.immutable(
+        ? extern.createImmutableField(
             dummyName,
             type: _type,
             isFinal: isFinal,
@@ -153,8 +153,10 @@
             fieldReference: references.fieldReference,
             getterReference: references.getterReference,
             isEnumElement: isEnumElement,
+            fileOffset: nameOffset,
+            fileEndOffset: endOffset,
           )
-        : new Field.mutable(
+        : extern.createMutableField(
             dummyName,
             type: _type,
             isFinal: isFinal,
@@ -163,13 +165,12 @@
             fieldReference: references.fieldReference,
             getterReference: references.getterReference,
             setterReference: references.setterReference,
+            fileOffset: nameOffset,
+            fileEndOffset: endOffset,
           );
     nameScheme
         .getFieldMemberName(FieldNameType.Field, name, isSynthesized: false)
         .attachMember(_field!);
-    _field!
-      ..fileOffset = nameOffset
-      ..fileEndOffset = endOffset;
     _field!..isCovariantByDeclaration = isCovariant;
     if (isExtensionMember) {
       _field!
@@ -205,7 +206,7 @@
     if (initializer != null) {
       _field!.initializer = initializer..parent = _field;
     }
-    _field!.scope = scopeProviderInfo?.scope?..parent = _field;
+    _field!.scope = scopeProviderInfo?.scope;
   }
 
   @override
@@ -215,9 +216,12 @@
     required bool isSynthetic,
   }) {
     return <Initializer>[
-      new FieldInitializer(_field!, value)
-        ..fileOffset = fileOffset
-        ..isSynthetic = isSynthetic,
+      extern.createFieldInitializer(
+        _field!,
+        value,
+        fileOffset: fileOffset,
+        isSynthetic: isSynthetic,
+      ),
     ];
   }
 
@@ -263,12 +267,19 @@
 
   @override
   void buildImplicitDefaultValue() {
-    _field!.initializer = new NullLiteral()..parent = _field;
+    _field!.initializer = extern.createNullLiteral(
+      fileOffset: _field!.fileOffset,
+    )..parent = _field;
   }
 
   @override
   Initializer buildImplicitInitializer() {
-    return new FieldInitializer(_field!, new NullLiteral())..isSynthetic = true;
+    return extern.createFieldInitializer(
+      _field!,
+      extern.createNullLiteral(fileOffset: _field!.fileOffset),
+      fileOffset: _field!.fileOffset,
+      isSynthetic: true,
+    );
   }
 
   @override
@@ -280,7 +291,12 @@
   Initializer takePrimaryConstructorFieldInitializer() {
     Expression value = _field!.initializer!;
     _field!.initializer = null;
-    return new FieldInitializer(_field!, value)..fileOffset = value.fileOffset;
+    return extern.createFieldInitializer(
+      _field!,
+      value,
+      fileOffset: value.fileOffset,
+      isSynthetic: false,
+    );
   }
 }
 
@@ -473,23 +489,25 @@
       "Type has not been computed for field ${_fragment.name}.",
     );
     if (isSetEncoding == late_lowering.IsSetEncoding.useSentinel) {
-      _field!.initializer =
-          new StaticInvocation(
-              coreTypes.createSentinelMethod,
-              new Arguments([], types: [_type!])
-                ..fileOffset = _fragment.nameOffset,
-            )
-            ..fileOffset = _fragment.nameOffset
-            ..parent = _field;
+      _field!.initializer = extern.createStaticInvocation(
+        coreTypes.createSentinelMethod,
+        extern.createArguments(
+          [],
+          types: [_type!],
+          fileOffset: _fragment.nameOffset,
+        ),
+        fileOffset: _fragment.nameOffset,
+      )..parent = _field;
     } else {
-      _field!.initializer = new NullLiteral()
-        ..fileOffset = _fragment.nameOffset
-        ..parent = _field;
+      _field!.initializer = extern.createNullLiteral(
+        fileOffset: _fragment.nameOffset,
+      )..parent = _field;
     }
     if (_lateIsSetField != null) {
-      _lateIsSetField!.initializer = new BoolLiteral(false)
-        ..fileOffset = _fragment.nameOffset
-        ..parent = _lateIsSetField;
+      _lateIsSetField!.initializer = extern.createBoolLiteral(
+        false,
+        fileOffset: _fragment.nameOffset,
+      )..parent = _lateIsSetField;
     }
     _lateGetter!.function.registerFunctionBody(
       _createGetterBody(coreTypes, _fragment.name, initializer),
@@ -509,7 +527,7 @@
     }
     _field?.scope =
         // Coverage-ignore(suite): Not run.
-        scopeProviderInfo?.scope?..parent = _field;
+        scopeProviderInfo?.scope;
   }
 
   @override
@@ -521,18 +539,21 @@
     List<Initializer> initializers = <Initializer>[];
     if (_lateIsSetField != null) {
       initializers.add(
-        new FieldInitializer(
-            _lateIsSetField!,
-            new BoolLiteral(true)..fileOffset = fileOffset,
-          )
-          ..fileOffset = fileOffset
-          ..isSynthetic = isSynthetic,
+        extern.createFieldInitializer(
+          _lateIsSetField!,
+          extern.createBoolLiteral(true, fileOffset: fileOffset),
+          fileOffset: fileOffset,
+          isSynthetic: isSynthetic,
+        ),
       );
     }
     initializers.add(
-      new FieldInitializer(_field!, value)
-        ..fileOffset = fileOffset
-        ..isSynthetic = isSynthetic,
+      extern.createFieldInitializer(
+        _field!,
+        value,
+        fileOffset: fileOffset,
+        isSynthetic: isSynthetic,
+      ),
     );
     return initializers;
   }
@@ -556,13 +577,13 @@
       "Type has not been computed for field ${_fragment.name}.",
     );
     if (needsPromotion) {
-      VariableDeclaration variable = new VariableDeclaration.forValue(
+      VariableDeclaration variable = extern.createVariableCache(
         _createFieldGet(_field!),
-        type: _type!.withDeclaredNullability(Nullability.nullable),
-      )..fileOffset = _fragment.nameOffset;
-      return new Let(
+        _type!.withDeclaredNullability(Nullability.nullable),
+      );
+      return extern.createLet(
         variable,
-        new VariableGet(variable, _type)..fileOffset = _fragment.nameOffset,
+        extern.createVariableGet(variable, promotedType: _type),
       );
     } else {
       return _createFieldGet(_field!);
@@ -572,32 +593,38 @@
   /// Creates an [Expression] that reads [field].
   Expression _createFieldGet(Field field) {
     if (field.isStatic) {
-      return new StaticGet(field)..fileOffset = _fragment.nameOffset;
+      return extern.createStaticGet(field, fileOffset: _fragment.nameOffset);
     } else {
       // No substitution needed for the result type, since any type parameters
       // in there are also in scope at the access site.
-      return new InstanceGet(
+      return extern.createInstanceGet(
         InstanceAccessKind.Instance,
-        new ThisExpression()..fileOffset = _fragment.nameOffset,
+        extern.createThisExpression(fileOffset: _fragment.nameOffset),
         field.name,
         interfaceTarget: field,
         resultType: field.type,
-      )..fileOffset = _fragment.nameOffset;
+        fileOffset: _fragment.nameOffset,
+      );
     }
   }
 
   /// Creates an [Expression] that writes [value] to [field].
   Expression _createFieldSet(Field field, Expression value) {
     if (field.isStatic) {
-      return new StaticSet(field, value)..fileOffset = _fragment.nameOffset;
+      return extern.createStaticSet(
+        field,
+        value,
+        fileOffset: _fragment.nameOffset,
+      );
     } else {
-      return new InstanceSet(
+      return extern.createInstanceSet(
         InstanceAccessKind.Instance,
-        new ThisExpression()..fileOffset = _fragment.nameOffset,
+        extern.createThisExpression(fileOffset: _fragment.nameOffset),
         field.name,
         value,
         interfaceTarget: field,
-      )..fileOffset = _fragment.nameOffset;
+        fileOffset: _fragment.nameOffset,
+      );
     }
   }
 
@@ -613,25 +640,26 @@
     Reference? reference, {
     required bool isCovariantByDeclaration,
   }) {
-    VariableDeclaration parameter =
-        new VariableDeclaration("${_fragment.name}#param")
-          ..isCovariantByDeclaration = isCovariantByDeclaration
-          ..fileOffset = _fragment.nameOffset;
-    return new Procedure(
-        dummyName,
-        ProcedureKind.Setter,
-        new FunctionNode(
-            null,
-            positionalParameters: [parameter],
-            returnType: const VoidType(),
-          )
-          ..fileOffset = charOffset
-          ..fileEndOffset = _fragment.endOffset,
-        fileUri: fileUri,
-        reference: reference,
-      )
-      ..fileOffset = charOffset
-      ..fileEndOffset = _fragment.endOffset;
+    VariableDeclaration parameter = extern.createParameterVariable(
+      "${_fragment.name}#param",
+      isCovariantByDeclaration: isCovariantByDeclaration,
+      fileOffset: _fragment.nameOffset,
+    );
+    return extern.createProcedure(
+      dummyName,
+      ProcedureKind.Setter,
+      extern.createFunctionNode(
+        null,
+        positionalParameters: [parameter],
+        returnType: const VoidType(),
+        fileOffset: charOffset,
+        fileEndOffset: _fragment.endOffset,
+      ),
+      fileUri: fileUri,
+      reference: reference,
+      fileOffset: charOffset,
+      fileEndOffset: _fragment.endOffset,
+    );
   }
 
   Statement _createSetterBody(
@@ -736,15 +764,14 @@
     required bool isAbstractOrExternal,
     required List<TypeParameter>? classTypeParameters,
   }) {
-    _field =
-        new Field.mutable(
-            dummyName,
-            fileUri: _fragment.fileUri,
-            fieldReference: references.fieldReference,
-          )
-          ..fileOffset = _fragment.nameOffset
-          ..fileEndOffset = _fragment.endOffset
-          ..isInternalImplementation = true;
+    _field = extern.createMutableField(
+      dummyName,
+      fileUri: _fragment.fileUri,
+      fieldReference: references.fieldReference,
+      fileOffset: _fragment.nameOffset,
+      fileEndOffset: _fragment.endOffset,
+      isInternalImplementation: true,
+    );
     nameScheme
         .getFieldMemberName(
           FieldNameType.Field,
@@ -759,11 +786,13 @@
         break;
       case late_lowering.IsSetStrategy.forceUseIsSetField:
       case late_lowering.IsSetStrategy.useIsSetFieldOrNull:
-        _lateIsSetField =
-            new Field.mutable(dummyName, fileUri: _fragment.fileUri)
-              ..fileOffset = _fragment.nameOffset
-              ..fileEndOffset = _fragment.endOffset
-              ..isInternalImplementation = true;
+        _lateIsSetField = extern.createMutableField(
+          dummyName,
+          fileUri: _fragment.fileUri,
+          fileOffset: _fragment.nameOffset,
+          fileEndOffset: _fragment.endOffset,
+          isInternalImplementation: true,
+        );
         nameScheme
             .getFieldMemberName(
               FieldNameType.IsSetField,
@@ -773,18 +802,19 @@
             .attachMember(_lateIsSetField!);
         break;
     }
-    _lateGetter =
-        new Procedure(
-            dummyName,
-            ProcedureKind.Getter,
-            new FunctionNode(null)
-              ..fileOffset = _fragment.nameOffset
-              ..fileEndOffset = _fragment.endOffset,
-            fileUri: _fragment.fileUri,
-            reference: references.getterReference,
-          )
-          ..fileOffset = _fragment.nameOffset
-          ..fileEndOffset = _fragment.endOffset;
+    _lateGetter = extern.createProcedure(
+      dummyName,
+      ProcedureKind.Getter,
+      extern.createFunctionNode(
+        null,
+        fileOffset: _fragment.nameOffset,
+        fileEndOffset: _fragment.endOffset,
+      ),
+      fileUri: _fragment.fileUri,
+      reference: references.getterReference,
+      fileOffset: _fragment.nameOffset,
+      fileEndOffset: _fragment.endOffset,
+    );
     nameScheme
         .getFieldMemberName(
           FieldNameType.Getter,
@@ -1233,71 +1263,77 @@
     required List<TypeParameter>? classTypeParameters,
   }) {
     if (_isExtensionInstanceMember || _isExtensionTypeInstanceMember) {
-      _getter =
-          new Procedure(
-              dummyName,
-              ProcedureKind.Method,
-              new FunctionNode(
-                  null,
-                  positionalParameters: [
-                    new VariableDeclaration(syntheticThisName)
-                      ..fileOffset = _fragment.nameOffset
-                      ..isLowered = true,
-                  ],
-                )
-                ..fileOffset = _fragment.nameOffset
-                ..fileEndOffset = _fragment.endOffset,
-              fileUri: _fragment.fileUri,
-              reference: references.getterReference,
-            )
-            ..fileOffset = _fragment.nameOffset
-            ..fileEndOffset = _fragment.endOffset;
+      _getter = extern.createProcedure(
+        dummyName,
+        ProcedureKind.Method,
+        extern.createFunctionNode(
+          null,
+          positionalParameters: [
+            extern.createParameterVariable(
+              syntheticThisName,
+              fileOffset: _fragment.nameOffset,
+              isLowered: true,
+            ),
+          ],
+
+          fileOffset: _fragment.nameOffset,
+          fileEndOffset: _fragment.endOffset,
+        ),
+        fileUri: _fragment.fileUri,
+        reference: references.getterReference,
+        fileOffset: _fragment.nameOffset,
+        fileEndOffset: _fragment.endOffset,
+      );
       nameScheme
           .getProcedureMemberName(ProcedureKind.Getter, _fragment.name)
           .attachMember(_getter!);
       if (_fragment.hasSetter) {
-        VariableDeclaration parameter =
-            new VariableDeclaration("#externalFieldValue", isSynthesized: true)
-              ..isCovariantByDeclaration = _fragment.modifiers.isCovariant
-              ..fileOffset = _fragment.nameOffset;
-        _setter =
-            new Procedure(
-                dummyName,
-                ProcedureKind.Method,
-                new FunctionNode(
-                    null,
-                    positionalParameters: [
-                      new VariableDeclaration(syntheticThisName)
-                        ..fileOffset = _fragment.nameOffset
-                        ..isLowered = true,
-                      parameter,
-                    ],
-                    returnType: const VoidType(),
-                  )
-                  ..fileOffset = _fragment.nameOffset
-                  ..fileEndOffset = _fragment.endOffset,
-                fileUri: _fragment.fileUri,
-                reference: references.setterReference,
-              )
-              ..fileOffset = _fragment.nameOffset
-              ..fileEndOffset = _fragment.endOffset;
+        VariableDeclaration parameter = extern.createParameterVariable(
+          "#externalFieldValue",
+          isSynthesized: true,
+          isCovariantByDeclaration: _fragment.modifiers.isCovariant,
+          fileOffset: _fragment.nameOffset,
+        );
+        _setter = extern.createProcedure(
+          dummyName,
+          ProcedureKind.Method,
+          extern.createFunctionNode(
+            null,
+            positionalParameters: [
+              extern.createParameterVariable(
+                syntheticThisName,
+                fileOffset: _fragment.nameOffset,
+                isLowered: true,
+              ),
+              parameter,
+            ],
+            returnType: const VoidType(),
+            fileOffset: _fragment.nameOffset,
+            fileEndOffset: _fragment.endOffset,
+          ),
+          fileUri: _fragment.fileUri,
+          reference: references.setterReference,
+          fileOffset: _fragment.nameOffset,
+          fileEndOffset: _fragment.endOffset,
+        );
         nameScheme
             .getProcedureMemberName(ProcedureKind.Setter, _fragment.name)
             .attachMember(_setter!);
       }
     } else {
-      _getter =
-          new Procedure(
-              dummyName,
-              ProcedureKind.Getter,
-              new FunctionNode(null)
-                ..fileOffset = _fragment.nameOffset
-                ..fileEndOffset = _fragment.endOffset,
-              fileUri: _fragment.fileUri,
-              reference: references.getterReference,
-            )
-            ..fileOffset = _fragment.nameOffset
-            ..fileEndOffset = _fragment.endOffset;
+      _getter = extern.createProcedure(
+        dummyName,
+        ProcedureKind.Getter,
+        extern.createFunctionNode(
+          null,
+          fileOffset: _fragment.nameOffset,
+          fileEndOffset: _fragment.endOffset,
+        ),
+        fileUri: _fragment.fileUri,
+        reference: references.getterReference,
+        fileOffset: _fragment.nameOffset,
+        fileEndOffset: _fragment.endOffset,
+      );
       nameScheme
           .getFieldMemberName(
             FieldNameType.Getter,
@@ -1321,9 +1357,11 @@
                 isSynthesized: true,
                 isCovariantByDeclaration: _fragment.modifiers.isCovariant,
               )..fileOffset = _fragment.nameOffset)
-            : (new VariableDeclaration(
+            : (extern.createParameterVariable(
                   "#externalFieldValue",
                   isSynthesized: true,
+                  isCovariantByDeclaration: _fragment.modifiers.isCovariant,
+                  fileOffset: _fragment.nameOffset,
                 )
                 ..isCovariantByDeclaration = _fragment.modifiers.isCovariant
                 ..fileOffset = _fragment.nameOffset);
@@ -1548,8 +1586,11 @@
     required bool isSynthetic,
   }) {
     return <Initializer>[
-      new ExtensionTypeRepresentationFieldInitializer(_getter, value)
-        ..fileOffset = fileOffset,
+      new ExtensionTypeRepresentationFieldInitializer(
+        _getter,
+        value,
+        fileOffset: fileOffset,
+      ),
     ];
   }
 
@@ -1561,17 +1602,20 @@
     required bool isAbstractOrExternal,
     required List<TypeParameter>? classTypeParameters,
   }) {
-    _getter =
-        new Procedure(
-            dummyName,
-            ProcedureKind.Getter,
-            new FunctionNode(null),
-            fileUri: _fragment.fileUri,
-            reference: references.getterReference,
-          )
-          ..stubKind = ProcedureStubKind.RepresentationField
-          ..fileOffset = _fragment.nameOffset
-          ..fileEndOffset = _fragment.nameOffset;
+    _getter = extern.createProcedure(
+      dummyName,
+      ProcedureKind.Getter,
+      extern.createFunctionNode(
+        null,
+        fileOffset: _fragment.nameOffset,
+        fileEndOffset: _fragment.nameOffset,
+      ),
+      fileUri: _fragment.fileUri,
+      reference: references.getterReference,
+      stubKind: ProcedureStubKind.RepresentationField,
+      fileOffset: _fragment.nameOffset,
+      fileEndOffset: _fragment.nameOffset,
+    );
     nameScheme
         .getFieldMemberName(
           FieldNameType.RepresentationField,
@@ -1656,8 +1700,9 @@
   Initializer buildImplicitInitializer() {
     return new ExtensionTypeRepresentationFieldInitializer(
       _getter,
-      new NullLiteral(),
-    )..fileOffset = _fragment.nameOffset;
+      extern.createNullLiteral(fileOffset: _fragment.nameOffset),
+      fileOffset: _fragment.nameOffset,
+    );
   }
 
   @override
@@ -1799,52 +1844,58 @@
     required bool isAbstractOrExternal,
     required List<TypeParameter>? classTypeParameters,
   }) {
-    _getter =
-        new Procedure(
-            dummyName,
-            ProcedureKind.Method,
-            new FunctionNode(
-              null,
-              positionalParameters: [
-                new VariableDeclaration(syntheticThisName)
-                  ..fileOffset = _fragment.nameOffset
-                  ..isLowered = true,
-              ],
-            ),
-            fileUri: _fragment.fileUri,
-            reference: references.getterReference,
-          )
-          ..fileOffset = _fragment.nameOffset
-          ..fileEndOffset = _fragment.endOffset;
+    _getter = extern.createProcedure(
+      dummyName,
+      ProcedureKind.Method,
+      extern.createFunctionNode(
+        null,
+        positionalParameters: [
+          extern.createParameterVariable(
+            syntheticThisName,
+            fileOffset: _fragment.nameOffset,
+            isLowered: true,
+          ),
+        ],
+        fileOffset: _fragment.nameOffset,
+        fileEndOffset: _fragment.endOffset,
+      ),
+      fileUri: _fragment.fileUri,
+      reference: references.getterReference,
+      fileOffset: _fragment.nameOffset,
+      fileEndOffset: _fragment.endOffset,
+    );
     nameScheme
         .getProcedureMemberName(ProcedureKind.Getter, _fragment.name)
         .attachMember(_getter!);
     if (_fragment.hasSetter) {
-      VariableDeclaration parameter =
-          new VariableDeclaration("#externalFieldValue", isSynthesized: true)
-            ..isCovariantByDeclaration = _fragment.modifiers.isCovariant
-            ..fileOffset = _fragment.nameOffset;
-      _setter =
-          new Procedure(
-              dummyName,
-              ProcedureKind.Method,
-              new FunctionNode(
-                  null,
-                  positionalParameters: [
-                    new VariableDeclaration(syntheticThisName)
-                      ..fileOffset = _fragment.nameOffset
-                      ..isLowered = true,
-                    parameter,
-                  ],
-                  returnType: const VoidType(),
-                )
-                ..fileOffset = _fragment.nameOffset
-                ..fileEndOffset = _fragment.endOffset,
-              fileUri: _fragment.fileUri,
-              reference: references.setterReference,
-            )
-            ..fileOffset = _fragment.nameOffset
-            ..fileEndOffset = _fragment.endOffset;
+      VariableDeclaration parameter = extern.createParameterVariable(
+        "#externalFieldValue",
+        isSynthesized: true,
+        isCovariantByDeclaration: _fragment.modifiers.isCovariant,
+        fileOffset: _fragment.nameOffset,
+      );
+      _setter = extern.createProcedure(
+        dummyName,
+        ProcedureKind.Method,
+        extern.createFunctionNode(
+          null,
+          positionalParameters: [
+            extern.createParameterVariable(
+              syntheticThisName,
+              fileOffset: _fragment.nameOffset,
+              isLowered: true,
+            ),
+            parameter,
+          ],
+          returnType: const VoidType(),
+          fileOffset: _fragment.nameOffset,
+          fileEndOffset: _fragment.endOffset,
+        ),
+        fileUri: _fragment.fileUri,
+        reference: references.setterReference,
+        fileOffset: _fragment.nameOffset,
+        fileEndOffset: _fragment.endOffset,
+      );
       nameScheme
           .getProcedureMemberName(ProcedureKind.Setter, _fragment.name)
           .attachMember(_setter!);
diff --git a/pkg/front_end/lib/src/fragment/fragment.dart b/pkg/front_end/lib/src/fragment/fragment.dart
index e407dae..6a27009 100644
--- a/pkg/front_end/lib/src/fragment/fragment.dart
+++ b/pkg/front_end/lib/src/fragment/fragment.dart
@@ -35,6 +35,7 @@
 import '../builder/type_builder.dart';
 import '../builder/variable_builder.dart';
 import '../kernel/body_builder_context.dart';
+import '../kernel/external_ast_helper.dart' as extern;
 import '../kernel/hierarchy/class_member.dart';
 import '../kernel/hierarchy/members_builder.dart';
 import '../kernel/implicit_field_type.dart';
diff --git a/pkg/front_end/lib/src/fragment/getter/encoding.dart b/pkg/front_end/lib/src/fragment/getter/encoding.dart
index c2cd51f..05e5a6f 100644
--- a/pkg/front_end/lib/src/fragment/getter/encoding.dart
+++ b/pkg/front_end/lib/src/fragment/getter/encoding.dart
@@ -19,6 +19,7 @@
 import '../../builder/type_builder.dart';
 import '../../builder/variable_builder.dart';
 import '../../kernel/body_builder_context.dart';
+import '../../kernel/external_ast_helper.dart' as extern;
 import '../../kernel/kernel_helper.dart';
 import '../../kernel/type_algorithms.dart';
 import '../../source/check_helper.dart';
@@ -293,13 +294,12 @@
     required bool isAbstractOrExternal,
     required List<TypeParameter>? classTypeParameters,
   }) {
-    FunctionNode function =
-        new FunctionNode(
-            isAbstractOrExternal ? null : new EmptyStatement(),
-            asyncMarker: _fragment.asyncModifier.kind,
-          )
-          ..fileOffset = _fragment.formalsOffset
-          ..fileEndOffset = _fragment.endOffset;
+    FunctionNode function = extern.createFunctionNode(
+      isAbstractOrExternal ? null : extern.createEmptyStatement(),
+      asyncMarker: _fragment.asyncModifier.kind,
+      fileOffset: _fragment.formalsOffset,
+      fileEndOffset: _fragment.endOffset,
+    );
     buildTypeParametersAndFormals(
       libraryBuilder,
       function,
@@ -322,23 +322,22 @@
       ProcedureKind.Getter,
       _fragment.name,
     );
-    Procedure procedure = _procedure =
-        new Procedure(
-            memberName.name,
-            ProcedureKind.Getter,
-            function,
-            reference: references?.getterReference,
-            fileUri: _fragment.fileUri,
-          )
-          ..fileStartOffset = _fragment.startOffset
-          ..fileOffset = _fragment.nameOffset
-          ..fileEndOffset = _fragment.endOffset
-          ..isAbstract = _fragment.modifiers.isAbstract
-          ..isExternal = _fragment.modifiers.isExternal
-          ..isConst = _fragment.modifiers.isConst
-          ..isStatic = _fragment.modifiers.isStatic
-          ..isExtensionMember = _isExtensionMember
-          ..isExtensionTypeMember = _isExtensionTypeMember;
+    Procedure procedure = _procedure = extern.createProcedure(
+      memberName.name,
+      ProcedureKind.Getter,
+      function,
+      reference: references?.getterReference,
+      fileUri: _fragment.fileUri,
+      fileStartOffset: _fragment.startOffset,
+      fileOffset: _fragment.nameOffset,
+      fileEndOffset: _fragment.endOffset,
+      isAbstract: _fragment.modifiers.isAbstract,
+      isExternal: _fragment.modifiers.isExternal,
+      isConst: _fragment.modifiers.isConst,
+      isStatic: _fragment.modifiers.isStatic,
+      isExtensionMember: _isExtensionMember,
+      isExtensionTypeMember: _isExtensionTypeMember,
+    );
     memberName.attachMember(procedure);
 
     f(kind: _builtMemberKind, member: procedure);
@@ -477,9 +476,7 @@
         emittedValueType: emittedValueType,
       );
     }
-    function.scope =
-        // Coverage-ignore(suite): Not run.
-        scope?..parent = function;
+    function.scope = scope;
     function.thisVariable = thisVariable;
   }
 }
@@ -617,15 +614,14 @@
           // Coverage-ignore(suite): Not run.
           _thisFormal.kind == FormalParameterKind.optionalPositional,
     );
-    FunctionNode function =
-        new FunctionNode(
-            isAbstractOrExternal ? null : new EmptyStatement(),
-            typeParameters: typeParameters,
-            positionalParameters: [_thisFormal.build(libraryBuilder)],
-            asyncMarker: _fragment.asyncModifier.kind,
-          )
-          ..fileOffset = _fragment.formalsOffset
-          ..fileEndOffset = _fragment.endOffset;
+    FunctionNode function = extern.createFunctionNode(
+      isAbstractOrExternal ? null : extern.createEmptyStatement(),
+      typeParameters: typeParameters,
+      positionalParameters: [_thisFormal.build(libraryBuilder)],
+      asyncMarker: _fragment.asyncModifier.kind,
+      fileOffset: _fragment.formalsOffset,
+      fileEndOffset: _fragment.endOffset,
+    );
     buildTypeParametersAndFormals(
       libraryBuilder,
       function,
@@ -648,23 +644,22 @@
       ProcedureKind.Getter,
       _fragment.name,
     );
-    Procedure procedure = _procedure =
-        new Procedure(
-            memberName.name,
-            ProcedureKind.Method,
-            function,
-            reference: references?.getterReference,
-            fileUri: _fragment.fileUri,
-          )
-          ..fileStartOffset = _fragment.startOffset
-          ..fileOffset = _fragment.nameOffset
-          ..fileEndOffset = _fragment.endOffset
-          ..isAbstract = _fragment.modifiers.isAbstract
-          ..isExternal = _fragment.modifiers.isExternal
-          ..isConst = _fragment.modifiers.isConst
-          ..isStatic = true
-          ..isExtensionMember = _isExtensionMember
-          ..isExtensionTypeMember = _isExtensionTypeMember;
+    Procedure procedure = _procedure = extern.createProcedure(
+      memberName.name,
+      ProcedureKind.Method,
+      function,
+      reference: references?.getterReference,
+      fileUri: _fragment.fileUri,
+      fileStartOffset: _fragment.startOffset,
+      fileOffset: _fragment.nameOffset,
+      fileEndOffset: _fragment.endOffset,
+      isAbstract: _fragment.modifiers.isAbstract,
+      isExternal: _fragment.modifiers.isExternal,
+      isConst: _fragment.modifiers.isConst,
+      isStatic: true,
+      isExtensionMember: _isExtensionMember,
+      isExtensionTypeMember: _isExtensionTypeMember,
+    );
     memberName.attachMember(procedure);
 
     f(kind: _builtMemberKind, member: procedure);
@@ -829,9 +824,7 @@
         emittedValueType: emittedValueType,
       );
     }
-    function.scope =
-        // Coverage-ignore(suite): Not run.
-        scope?..parent = function;
+    function.scope = scope;
     function.thisVariable = thisVariable;
   }
 }
diff --git a/pkg/front_end/lib/src/fragment/method/encoding.dart b/pkg/front_end/lib/src/fragment/method/encoding.dart
index 57d9d1a..6c0a6e0 100644
--- a/pkg/front_end/lib/src/fragment/method/encoding.dart
+++ b/pkg/front_end/lib/src/fragment/method/encoding.dart
@@ -19,6 +19,7 @@
 import '../../builder/type_builder.dart';
 import '../../builder/variable_builder.dart';
 import '../../kernel/body_builder_context.dart';
+import '../../kernel/external_ast_helper.dart' as extern;
 import '../../kernel/kernel_helper.dart';
 import '../../kernel/type_algorithms.dart';
 import '../../source/check_helper.dart';
@@ -222,13 +223,12 @@
     required bool isAbstractOrExternal,
     List<TypeParameter>? classTypeParameters,
   }) {
-    FunctionNode function =
-        new FunctionNode(
-            isAbstractOrExternal ? null : new EmptyStatement(),
-            asyncMarker: _fragment.asyncModifier.kind,
-          )
-          ..fileOffset = _fragment.formalsOffset
-          ..fileEndOffset = _fragment.endOffset;
+    FunctionNode function = extern.createFunctionNode(
+      isAbstractOrExternal ? null : extern.createEmptyStatement(),
+      asyncMarker: _fragment.asyncModifier.kind,
+      fileOffset: _fragment.formalsOffset,
+      fileEndOffset: _fragment.endOffset,
+    );
     buildTypeParametersAndFormals(
       libraryBuilder,
       function,
@@ -260,23 +260,22 @@
       _procedureKind,
       _fragment.name,
     );
-    Procedure procedure = _procedure =
-        new Procedure(
-            memberName.name,
-            _procedureKind,
-            function,
-            reference: reference,
-            fileUri: _fragment.fileUri,
-          )
-          ..fileStartOffset = _fragment.startOffset
-          ..fileOffset = _fragment.nameOffset
-          ..fileEndOffset = _fragment.endOffset
-          ..isAbstract = _fragment.modifiers.isAbstract
-          ..isExternal = _fragment.modifiers.isExternal
-          ..isConst = _fragment.modifiers.isConst
-          ..isStatic = _fragment.modifiers.isStatic
-          ..isExtensionMember = _isExtensionMember
-          ..isExtensionTypeMember = _isExtensionTypeMember;
+    Procedure procedure = _procedure = extern.createProcedure(
+      memberName.name,
+      _procedureKind,
+      function,
+      reference: reference,
+      fileUri: _fragment.fileUri,
+      fileStartOffset: _fragment.startOffset,
+      fileOffset: _fragment.nameOffset,
+      fileEndOffset: _fragment.endOffset,
+      isAbstract: _fragment.modifiers.isAbstract,
+      isExternal: _fragment.modifiers.isExternal,
+      isConst: _fragment.modifiers.isConst,
+      isStatic: _fragment.modifiers.isStatic,
+      isExtensionMember: _isExtensionMember,
+      isExtensionTypeMember: _isExtensionTypeMember,
+    );
     memberName.attachMember(procedure);
 
     f(kind: _builtMemberKind, member: procedure);
@@ -404,7 +403,7 @@
         emittedValueType: emittedValueType,
       );
     }
-    function.scope = scope?..parent = function;
+    function.scope = scope;
     function.thisVariable = thisVariable;
   }
 }
@@ -587,15 +586,14 @@
           // Coverage-ignore(suite): Not run.
           _thisFormal.kind == FormalParameterKind.optionalPositional,
     );
-    FunctionNode function =
-        new FunctionNode(
-            isAbstractOrExternal ? null : new EmptyStatement(),
-            typeParameters: typeParameters,
-            positionalParameters: [_thisFormal.build(libraryBuilder)],
-            asyncMarker: _fragment.asyncModifier.kind,
-          )
-          ..fileOffset = _fragment.formalsOffset
-          ..fileEndOffset = _fragment.endOffset;
+    FunctionNode function = extern.createFunctionNode(
+      isAbstractOrExternal ? null : extern.createEmptyStatement(),
+      typeParameters: typeParameters,
+      positionalParameters: [_thisFormal.build(libraryBuilder)],
+      asyncMarker: _fragment.asyncModifier.kind,
+      fileOffset: _fragment.formalsOffset,
+      fileEndOffset: _fragment.endOffset,
+    );
     buildTypeParametersAndFormals(
       libraryBuilder,
       function,
@@ -627,23 +625,22 @@
       ProcedureKind.Method,
       _fragment.name,
     );
-    Procedure procedure = _procedure =
-        new Procedure(
-            memberName.name,
-            ProcedureKind.Method,
-            function,
-            reference: reference,
-            fileUri: _fragment.fileUri,
-          )
-          ..fileStartOffset = _fragment.startOffset
-          ..fileOffset = _fragment.nameOffset
-          ..fileEndOffset = _fragment.endOffset
-          ..isAbstract = _fragment.modifiers.isAbstract
-          ..isExternal = _fragment.modifiers.isExternal
-          ..isConst = _fragment.modifiers.isConst
-          ..isStatic = true
-          ..isExtensionMember = _isExtensionMember
-          ..isExtensionTypeMember = _isExtensionTypeMember;
+    Procedure procedure = _procedure = extern.createProcedure(
+      memberName.name,
+      ProcedureKind.Method,
+      function,
+      reference: reference,
+      fileUri: _fragment.fileUri,
+      fileStartOffset: _fragment.startOffset,
+      fileOffset: _fragment.nameOffset,
+      fileEndOffset: _fragment.endOffset,
+      isAbstract: _fragment.modifiers.isAbstract,
+      isExternal: _fragment.modifiers.isExternal,
+      isConst: _fragment.modifiers.isConst,
+      isStatic: true,
+      isExtensionMember: _isExtensionMember,
+      isExtensionTypeMember: _isExtensionTypeMember,
+    );
     memberName.attachMember(procedure);
 
     if (!_isOperator) {
@@ -809,9 +806,7 @@
         emittedValueType: emittedValueType,
       );
     }
-    function.scope =
-        // Coverage-ignore(suite): Not run.
-        scope?..parent = function;
+    function.scope = scope;
     function.thisVariable = thisVariable;
   }
 
@@ -853,7 +848,10 @@
     Map<TypeParameter, DartType> substitutionMap = {};
     List<DartType> typeArguments = <DartType>[];
     for (TypeParameter typeParameter in procedure.function.typeParameters) {
-      TypeParameter newTypeParameter = new TypeParameter(typeParameter.name);
+      TypeParameter newTypeParameter = extern.createTypeParameter(
+        typeParameter.name,
+        fileOffset: typeParameter.fileOffset,
+      );
       typeParameters.add(newTypeParameter);
       typeArguments.add(
         substitutionMap[typeParameter] = new TypeParameterType(
@@ -905,13 +903,14 @@
             isRequired: parameter.isRequired,
           )..fileOffset = parameter.fileOffset;
         case VariableDeclaration():
-          newParameter = new VariableDeclaration(
+          newParameter = extern.createParameterVariable(
             parameter.name,
             type: type,
             isFinal: parameter.isFinal,
             isLowered: parameter.isLowered,
             isRequired: parameter.isRequired,
-          )..fileOffset = parameter.fileOffset;
+            fileOffset: parameter.fileOffset,
+          );
       }
       _extensionTearOffParameterMap![parameter] = newParameter;
       return newParameter;
@@ -940,14 +939,14 @@
       if (position == 0) {
         /// Pass `this` as a captured variable.
         closurePositionalArguments.add(
-          new VariableGet(extensionThis)..fileOffset = fileOffset,
+          extern.createVariableGet(extensionThis, fileOffset: fileOffset),
         );
       } else {
         DartType type = substitution.substituteType(parameter.type);
         VariableDeclaration newParameter = copyParameter(parameter, type);
         closurePositionalParameters.add(newParameter);
         closurePositionalArguments.add(
-          new VariableGet(newParameter)..fileOffset = fileOffset,
+          extern.createVariableGet(newParameter, fileOffset: fileOffset),
         );
       }
     }
@@ -958,79 +957,75 @@
       VariableDeclaration newParameter = copyParameter(parameter, type);
       closureNamedParameters.add(newParameter);
       closureNamedArguments.add(
-        new NamedExpression(
+        extern.createNamedExpression(
           parameter.name!,
-          new VariableGet(newParameter)..fileOffset = fileOffset,
+          extern.createVariableGet(newParameter, fileOffset: fileOffset),
         ),
       );
     }
 
-    Statement closureBody = new ReturnStatement(
-      new StaticInvocation(
-          procedure,
-          new Arguments(
-            closurePositionalArguments,
-            types: typeArguments,
-            named: closureNamedArguments,
-          ),
-        )
+    Statement closureBody = extern.createReturnStatement(
+      extern.createStaticInvocation(
+        procedure,
+        extern.createArguments(
+          closurePositionalArguments,
+          types: typeArguments,
+          named: closureNamedArguments,
+          fileOffset: fileOffset,
+        ),
         // We need to use the fileStartOffset on the StaticInvocation to
         // avoid a possible "fake coverage miss" on the name of the
         // extension method.
-        ..fileOffset = fileStartOffset,
-    )..fileOffset = fileOffset;
+        fileOffset: fileStartOffset,
+      ),
+      fileOffset: fileOffset,
+    );
 
-    FunctionExpression closure =
-        new FunctionExpression(
-            new FunctionNode(
-                closureBody,
-                typeParameters: closureTypeParameters,
-                positionalParameters: closurePositionalParameters,
-                namedParameters: closureNamedParameters,
-                requiredParameterCount:
-                    procedure.function.requiredParameterCount - 1,
-                returnType: closureReturnType,
-              )
-              ..fileOffset = fileOffset
-              ..fileEndOffset = fileEndOffset,
-          )
-          // We need to use the fileStartOffset on the FunctionExpression to
-          // avoid a possible "fake coverage miss" on the name of the
-          // extension method.
-          ..fileOffset = fileStartOffset;
+    FunctionExpression closure = extern.createFunctionExpression(
+      extern.createFunctionNode(
+        closureBody,
+        typeParameters: closureTypeParameters,
+        positionalParameters: closurePositionalParameters,
+        namedParameters: closureNamedParameters,
+        requiredParameterCount: procedure.function.requiredParameterCount - 1,
+        returnType: closureReturnType,
+        fileOffset: fileOffset,
+        fileEndOffset: fileEndOffset,
+      ),
 
-    FunctionNode function =
-        new FunctionNode(
-            new ReturnStatement(closure)..fileOffset = fileOffset,
-            typeParameters: tearOffTypeParameters,
-            positionalParameters: [extensionThis],
-            requiredParameterCount: 1,
-            returnType: closure.function.computeFunctionType(
-              Nullability.nonNullable,
-            ),
-          )
-          ..fileOffset = fileOffset
-          ..fileEndOffset = fileEndOffset;
+      // We need to use the fileStartOffset on the FunctionExpression to
+      // avoid a possible "fake coverage miss" on the name of the
+      // extension method.
+      fileOffset: fileStartOffset,
+    );
+
+    FunctionNode function = extern.createFunctionNode(
+      extern.createReturnStatement(closure, fileOffset: fileOffset),
+      typeParameters: tearOffTypeParameters,
+      positionalParameters: [extensionThis],
+      requiredParameterCount: 1,
+      returnType: closure.function.computeFunctionType(Nullability.nonNullable),
+      fileOffset: fileOffset,
+      fileEndOffset: fileEndOffset,
+    );
 
     MemberName tearOffName = nameScheme.getProcedureMemberName(
       ProcedureKind.Getter,
       _fragment.name,
     );
-    Procedure tearOff =
-        new Procedure(
-            tearOffName.name,
-            ProcedureKind.Method,
-            function,
-            isStatic: true,
-            isExtensionMember: _isExtensionMember,
-            isExtensionTypeMember: _isExtensionTypeMember,
-            reference: tearOffReference,
-            fileUri: _fragment.fileUri,
-          )
-          ..fileUri = _fragment.fileUri
-          ..fileOffset = fileOffset
-          ..fileStartOffset = _fragment.startOffset
-          ..fileEndOffset = fileEndOffset;
+    Procedure tearOff = extern.createProcedure(
+      tearOffName.name,
+      ProcedureKind.Method,
+      function,
+      isStatic: true,
+      isExtensionMember: _isExtensionMember,
+      isExtensionTypeMember: _isExtensionTypeMember,
+      reference: tearOffReference,
+      fileUri: _fragment.fileUri,
+      fileOffset: fileOffset,
+      fileStartOffset: _fragment.startOffset,
+      fileEndOffset: fileEndOffset,
+    );
     tearOffName.attachMember(tearOff);
     return tearOff;
   }
diff --git a/pkg/front_end/lib/src/fragment/mixin.dart b/pkg/front_end/lib/src/fragment/mixin.dart
index 9a5e64b..c86c92b 100644
--- a/pkg/front_end/lib/src/fragment/mixin.dart
+++ b/pkg/front_end/lib/src/fragment/mixin.dart
@@ -57,7 +57,6 @@
       modifiers.isAugment;
 
   @override
-  // Coverage-ignore(suite): Not run.
   DeclarationFragmentKind get kind => DeclarationFragmentKind.mixinDeclaration;
 
   @override
diff --git a/pkg/front_end/lib/src/fragment/setter/declaration.dart b/pkg/front_end/lib/src/fragment/setter/declaration.dart
index 916dfc5..33af73e 100644
--- a/pkg/front_end/lib/src/fragment/setter/declaration.dart
+++ b/pkg/front_end/lib/src/fragment/setter/declaration.dart
@@ -19,6 +19,7 @@
 import '../../builder/type_builder.dart';
 import '../../kernel/body_builder_context.dart';
 import '../../kernel/external_ast_helper.dart';
+import '../../kernel/external_ast_helper.dart' as extern;
 import '../../kernel/hierarchy/class_member.dart';
 import '../../kernel/hierarchy/members_builder.dart';
 import '../../kernel/type_algorithms.dart';
@@ -324,7 +325,7 @@
         declaredFormals.single.isOptionalPositional) {
       int fileOffset = _fragment.formalsOffset;
       if (body == null) {
-        body = new EmptyStatement()..fileOffset = fileOffset;
+        body = extern.createEmptyStatement(fileOffset: fileOffset);
       }
       if (declaredFormals != null) {
         // Illegal parameters were removed by the function builder.
diff --git a/pkg/front_end/lib/src/fragment/setter/encoding.dart b/pkg/front_end/lib/src/fragment/setter/encoding.dart
index ab5bc96..ecc0151 100644
--- a/pkg/front_end/lib/src/fragment/setter/encoding.dart
+++ b/pkg/front_end/lib/src/fragment/setter/encoding.dart
@@ -17,6 +17,7 @@
 import '../../builder/type_builder.dart';
 import '../../builder/variable_builder.dart';
 import '../../kernel/body_builder_context.dart';
+import '../../kernel/external_ast_helper.dart' as extern;
 import '../../kernel/internal_ast.dart';
 import '../../kernel/kernel_helper.dart';
 import '../../kernel/type_algorithms.dart';
@@ -294,13 +295,12 @@
     required bool isAbstractOrExternal,
     required List<TypeParameter>? classTypeParameters,
   }) {
-    FunctionNode function =
-        new FunctionNode(
-            isAbstractOrExternal ? null : new EmptyStatement(),
-            asyncMarker: _fragment.asyncModifier.kind,
-          )
-          ..fileOffset = _fragment.formalsOffset
-          ..fileEndOffset = _fragment.endOffset;
+    FunctionNode function = extern.createFunctionNode(
+      isAbstractOrExternal ? null : extern.createEmptyStatement(),
+      asyncMarker: _fragment.asyncModifier.kind,
+      fileOffset: _fragment.formalsOffset,
+      fileEndOffset: _fragment.endOffset,
+    );
     buildTypeParametersAndFormals(
       libraryBuilder,
       function,
@@ -333,7 +333,10 @@
       // Replace illegal parameters by single dummy parameter.
       // Do this after building the parameters, since the diet listener
       // assumes that parameters are built, even if illegal in number.
-      VariableDeclaration parameter = new VariableDeclarationImpl("#synthetic");
+      VariableDeclaration parameter = new VariableDeclarationImpl(
+        "#synthetic",
+        fileOffset: TreeNode.noOffset,
+      );
       function.positionalParameters.clear();
       function.positionalParameters.add(parameter);
       parameter.parent = function;
@@ -344,23 +347,22 @@
       ProcedureKind.Setter,
       _fragment.name,
     );
-    Procedure procedure = _procedure =
-        new Procedure(
-            memberName.name,
-            ProcedureKind.Setter,
-            function,
-            reference: references?.setterReference,
-            fileUri: _fragment.fileUri,
-          )
-          ..fileStartOffset = _fragment.startOffset
-          ..fileOffset = _fragment.nameOffset
-          ..fileEndOffset = _fragment.endOffset
-          ..isAbstract = _fragment.modifiers.isAbstract
-          ..isExternal = _fragment.modifiers.isExternal
-          ..isConst = _fragment.modifiers.isConst
-          ..isStatic = _fragment.modifiers.isStatic
-          ..isExtensionMember = _isExtensionMember
-          ..isExtensionTypeMember = _isExtensionTypeMember;
+    Procedure procedure = _procedure = extern.createProcedure(
+      memberName.name,
+      ProcedureKind.Setter,
+      function,
+      reference: references?.setterReference,
+      fileUri: _fragment.fileUri,
+      fileStartOffset: _fragment.startOffset,
+      fileOffset: _fragment.nameOffset,
+      fileEndOffset: _fragment.endOffset,
+      isAbstract: _fragment.modifiers.isAbstract,
+      isExternal: _fragment.modifiers.isExternal,
+      isConst: _fragment.modifiers.isConst,
+      isStatic: _fragment.modifiers.isStatic,
+      isExtensionMember: _isExtensionMember,
+      isExtensionTypeMember: _isExtensionTypeMember,
+    );
     memberName.attachMember(procedure);
 
     f(kind: _builtMemberKind, member: procedure);
@@ -491,9 +493,7 @@
         emittedValueType: emittedValueType,
       );
     }
-    function.scope =
-        // Coverage-ignore(suite): Not run.
-        scope?..parent = function;
+    function.scope = scope;
     function.thisVariable = thisVariable;
   }
 }
@@ -632,15 +632,14 @@
           // Coverage-ignore(suite): Not run.
           _thisFormal.kind == FormalParameterKind.optionalPositional,
     );
-    FunctionNode function =
-        new FunctionNode(
-            isAbstractOrExternal ? null : new EmptyStatement(),
-            typeParameters: typeParameters,
-            positionalParameters: [_thisFormal.build(libraryBuilder)],
-            asyncMarker: _fragment.asyncModifier.kind,
-          )
-          ..fileOffset = _fragment.formalsOffset
-          ..fileEndOffset = _fragment.endOffset;
+    FunctionNode function = extern.createFunctionNode(
+      isAbstractOrExternal ? null : extern.createEmptyStatement(),
+      typeParameters: typeParameters,
+      positionalParameters: [_thisFormal.build(libraryBuilder)],
+      asyncMarker: _fragment.asyncModifier.kind,
+      fileOffset: _fragment.formalsOffset,
+      fileEndOffset: _fragment.endOffset,
+    );
     buildTypeParametersAndFormals(
       libraryBuilder,
       function,
@@ -661,7 +660,10 @@
       // Do this after building the parameters, since the diet listener
       // assumes that parameters are built, even if illegal in number.
       VariableDeclaration thisParameter = function.positionalParameters[0];
-      VariableDeclaration parameter = new VariableDeclarationImpl("#synthetic");
+      VariableDeclaration parameter = new VariableDeclarationImpl(
+        "#synthetic",
+        fileOffset: TreeNode.noOffset,
+      );
       function.positionalParameters.clear();
       function.positionalParameters.add(thisParameter);
       function.positionalParameters.add(parameter);
@@ -690,23 +692,22 @@
       ProcedureKind.Setter,
       _fragment.name,
     );
-    Procedure procedure = _procedure =
-        new Procedure(
-            memberName.name,
-            ProcedureKind.Method,
-            function,
-            reference: references?.setterReference,
-            fileUri: _fragment.fileUri,
-          )
-          ..fileStartOffset = _fragment.startOffset
-          ..fileOffset = _fragment.nameOffset
-          ..fileEndOffset = _fragment.endOffset
-          ..isAbstract = _fragment.modifiers.isAbstract
-          ..isExternal = _fragment.modifiers.isExternal
-          ..isConst = _fragment.modifiers.isConst
-          ..isStatic = true
-          ..isExtensionMember = _isExtensionMember
-          ..isExtensionTypeMember = _isExtensionTypeMember;
+    Procedure procedure = _procedure = extern.createProcedure(
+      memberName.name,
+      ProcedureKind.Method,
+      function,
+      reference: references?.setterReference,
+      fileUri: _fragment.fileUri,
+      fileStartOffset: _fragment.startOffset,
+      fileOffset: _fragment.nameOffset,
+      fileEndOffset: _fragment.endOffset,
+      isAbstract: _fragment.modifiers.isAbstract,
+      isExternal: _fragment.modifiers.isExternal,
+      isConst: _fragment.modifiers.isConst,
+      isStatic: true,
+      isExtensionMember: _isExtensionMember,
+      isExtensionTypeMember: _isExtensionTypeMember,
+    );
     memberName.attachMember(procedure);
 
     f(kind: _builtMemberKind, member: procedure);
@@ -864,9 +865,7 @@
         emittedValueType: emittedValueType,
       );
     }
-    function.scope =
-        // Coverage-ignore(suite): Not run.
-        scope?..parent = function;
+    function.scope = scope;
     function.thisVariable = thisVariable;
   }
 }
diff --git a/pkg/front_end/lib/src/kernel/body_builder.dart b/pkg/front_end/lib/src/kernel/body_builder.dart
index e27afa3..51adcef 100644
--- a/pkg/front_end/lib/src/kernel/body_builder.dart
+++ b/pkg/front_end/lib/src/kernel/body_builder.dart
@@ -189,8 +189,6 @@
 
   final LocalScope enclosingScope;
 
-  final bool enableNative;
-
   // TODO(ahe): Consider renaming [uri] to 'partUri'.
   @override
   final Uri uri;
@@ -372,9 +370,6 @@
     required this.extensionScope,
     required ThisVariable? internalThisVariable,
   }) : _context = context,
-       enableNative = libraryBuilder.loader.target.backendTarget.enableNative(
-         libraryBuilder.importUri,
-       ),
        benchmarker = libraryBuilder.loader.target.benchmarker,
        _localScopes = new LocalStack([enclosingScope]),
        _labelScopes = new LocalStack([new LabelScopeImpl()]),
@@ -734,14 +729,14 @@
 
   Statement popBlock(int count, Token openBrace, Token? closeBrace) {
     return intern.createBlock(
-      offsetForToken(openBrace),
-      offsetForToken(closeBrace),
       const GrowableList<Statement>().popNonNullable(
             stack,
             count,
             dummyStatement,
           ) ??
           <Statement>[],
+      fileOffset: offsetForToken(openBrace),
+      fileEndOffset: offsetForToken(closeBrace),
     );
   }
 
@@ -760,16 +755,20 @@
 
   Statement _handleStatementNotStatement(Object? element, Token? token) {
     if (element is ParserRecovery) {
-      return new Block(<Statement>[
-        intern.createExpressionStatement(
-          element.charOffset,
-          ParserErrorGenerator.buildProblemExpression(
-            this,
-            diag.syntheticToken,
-            element.charOffset,
+      return intern.createBlock(
+        [
+          intern.createExpressionStatement(
+            fileOffset: element.charOffset,
+            ParserErrorGenerator.buildProblemExpression(
+              this,
+              diag.syntheticToken,
+              element.charOffset,
+            ),
           ),
-        ),
-      ])..fileOffset = element.charOffset;
+        ],
+        fileOffset: element.charOffset,
+        fileEndOffset: element.charOffset,
+      );
     } else {
       unhandled(
         "expected statement is ${element.runtimeType}: $element",
@@ -1130,8 +1129,10 @@
               initializers = createFieldInitializer(
                 formal.name,
                 formal.fileOffset,
-                new VariableGet(formal.variable)
-                  ..fileOffset = formal.fileOffset,
+                intern.createVariableGet(
+                  formal.variable,
+                  fileOffset: formal.fileOffset,
+                ),
                 formal: formal,
               );
             }
@@ -1311,7 +1312,7 @@
     debugEvent("ExpressionStatement");
     push(
       intern.createExpressionStatement(
-        offsetForToken(endToken),
+        fileOffset: offsetForToken(endToken),
         popForEffect(),
       ),
     );
@@ -1445,7 +1446,7 @@
     );
     debugEvent("ParenthesizedExpression");
     Expression value = popForValue();
-    if (value is ShadowLargeIntLiteral) {
+    if (value is LargeIntLiteral) {
       // We need to know that the expression was parenthesized because we will
       // treat -n differently from -(n).  If the expression occurs in a double
       // context, -n is a double literal and -(n) is an application of unary- to
@@ -2522,9 +2523,12 @@
   /// Helper method to create a [VariableGet] of the [variable] using
   /// [charOffset] as the file offset.
   @override
-  VariableGet createVariableGet(VariableDeclaration variable, int charOffset) {
+  InternalVariableGet createVariableGet(
+    VariableDeclaration variable,
+    int charOffset,
+  ) {
     registerVariableRead(variable);
-    return new VariableGet(variable)..fileOffset = charOffset;
+    return intern.createVariableGet(variable, fileOffset: charOffset);
   }
 
   /// Helper method to create a [ReadOnlyAccessGenerator] on the [variable]
@@ -2642,6 +2646,7 @@
           nameToken,
           memberName,
           thisVariable: thisVariable,
+          isThisExplicit: false,
         );
       } else {
         // [name] is unresolved.
@@ -2782,6 +2787,7 @@
             nameToken,
             memberName,
             thisVariable: thisVariable,
+            isThisExplicit: false,
           );
         } else {
           // [name] is an instance member but this is not an instance context.
@@ -2835,6 +2841,7 @@
           nameToken,
           getable,
           setable as MemberBuilder?,
+          isQualifiedAccess: false,
         );
       } else if (getable is PrefixBuilder) {
         // Wildcard import prefixes are non-binding and cannot be used.
@@ -2903,6 +2910,7 @@
             nameToken,
             memberName,
             thisVariable: thisVariable,
+            isThisExplicit: false,
           );
         } else {
           // [name] is an instance member but this is not an instance context.
@@ -2926,6 +2934,7 @@
           nameToken,
           null,
           setable,
+          isQualifiedAccess: false,
         );
       }
     }
@@ -3336,7 +3345,7 @@
     }
     pushNewLocalVariable(initializer, equalsToken: assignmentOperator);
     if (isLate) {
-      VariableInitializationBase node = peek() as VariableInitializationBase;
+      VariableDeclaration node = peek() as VariableDeclaration;
       // This is matched by the call to [beginNode] in
       // [beginVariableInitializer].
 
@@ -3395,43 +3404,45 @@
       name = createWildcardVariableName(wildcardVariableIndex);
       wildcardVariableIndex++;
     }
-    VariableInitializationBase variableInitialization;
+    VariableDeclaration variableInitialization;
     InternalVariable internalVariable;
     if (isClosureContextLoweringEnabled) {
       internalVariable = new InternalLocalVariable(
-        astVariable: new LocalVariable(
+        astVariable: intern.createLocalVariable(
           cosmeticName: name,
           type: currentLocalVariableType,
           isFinal: isFinal,
           isConst: isConst,
           isLate: isLate,
           isWildcard: isWildcard,
+          fileOffset: identifier.nameOffset,
         ),
         forSyntheticToken: identifier.token.isSynthetic,
         isImplicitlyTyped: currentLocalVariableType == null,
+        fileOffset: identifier.nameOffset,
       );
-      variableInitialization = new VariableInitializationBase(
-        variable: internalVariable.asExpressionVariable,
+      variableInitialization = intern.createVariableInitialization(
+        variable: internalVariable.asVariableDeclaration,
         initializer: initializer,
         hasDeclaredInitializer: initializer != null,
+        fileOffset: offsetForToken(equalsToken),
       );
     } else {
-      variableInitialization = internalVariable =
-          new VariableDeclarationImpl(
-              name,
-              forSyntheticToken: identifier.token.isSynthetic,
-              initializer: initializer,
-              type: currentLocalVariableType,
-              isFinal: isFinal,
-              isConst: isConst,
-              isLate: isLate,
-              isRequired: isRequired,
-              hasDeclaredInitializer: initializer != null,
-              isStaticLate: isFinal && initializer == null,
-              isWildcard: isWildcard,
-            )
-            ..fileOffset = identifier.nameOffset
-            ..fileEqualsOffset = offsetForToken(equalsToken);
+      variableInitialization = internalVariable = new VariableDeclarationImpl(
+        name,
+        forSyntheticToken: identifier.token.isSynthetic,
+        initializer: initializer,
+        type: currentLocalVariableType,
+        isFinal: isFinal,
+        isConst: isConst,
+        isLate: isLate,
+        isRequired: isRequired,
+        hasDeclaredInitializer: initializer != null,
+        isStaticLate: isFinal && initializer == null,
+        isWildcard: isWildcard,
+        fileOffset: identifier.nameOffset,
+        fileEqualsOffset: offsetForToken(equalsToken),
+      );
     }
     assignedVariables.declare(internalVariable.astVariable);
     push(variableInitialization);
@@ -3519,8 +3530,7 @@
       push(node);
       return;
     }
-    VariableInitializationBase variableInitialization =
-        node as VariableInitializationBase;
+    VariableDeclaration variableInitialization = node as VariableDeclaration;
     variableInitialization.fileOffset = nameToken.charOffset;
     push(variableInitialization);
 
@@ -3576,8 +3586,7 @@
         push(node);
         return;
       }
-      VariableInitializationBase variableInitialization =
-          node as VariableInitializationBase;
+      VariableDeclaration variableInitialization = node as VariableDeclaration;
       if (annotations != null) {
         for (int i = 0; i < annotations.length; i++) {
           variableInitialization.addAnnotation(annotations[i]);
@@ -3721,11 +3730,11 @@
     if (variableOrExpression is Generator) {
       variableOrExpression = variableOrExpression.buildForEffect();
     }
-    if (variableOrExpression is VariableInitializationBase) {
+    if (variableOrExpression is VariableDeclaration) {
       // Late for loop variables are not supported. An error has already been
       // reported by the parser.
       variableOrExpression.isLate = false;
-      return <VariableDeclaration>[variableOrExpression as VariableDeclaration];
+      return <VariableDeclaration>[variableOrExpression];
     } else if (variableOrExpression is Expression) {
       VariableDeclaration variable = new VariableDeclarationImpl.forEffect(
         variableOrExpression,
@@ -3836,9 +3845,13 @@
       for (VariableDeclaration variable in pattern.declaredVariables) {
         variable.isFinal |= isFinal;
 
+        // TODO(johnniwinther): Can we avoid creating synthetic variables here?
         VariableDeclaration intermediateVariable = intern
             .createVariableDeclarationForValue(
-              intern.createVariableGet(variable.fileOffset, variable),
+              intern.createVariableGet(
+                variable,
+                fileOffset: variable.fileOffset,
+              ),
             );
         intermediateVariables.add(intermediateVariable);
 
@@ -3846,8 +3859,8 @@
           variable.fileOffset,
           variable.name!,
           initializer: intern.createVariableGet(
-            variable.fileOffset,
             intermediateVariable,
+            fileOffset: variable.fileOffset,
           ),
           isFinal: isFinal,
         );
@@ -4117,8 +4130,8 @@
     }
     if (variableOrExpression is PatternVariableDeclaration) {
       result = intern.createBlock(
-        result.fileOffset,
-        result.fileOffset,
+        fileOffset: result.fileOffset,
+        fileEndOffset: result.fileOffset,
         <Statement>[variableOrExpression, ...intermediateVariables!, result],
       );
     }
@@ -5873,7 +5886,13 @@
     if (compileTimeErrors == null) {
       push(NullValues.Block);
     } else {
-      push(intern.createBlock(noLocation, noLocation, compileTimeErrors));
+      push(
+        intern.createBlock(
+          fileOffset: noLocation,
+          fileEndOffset: noLocation,
+          compileTimeErrors,
+        ),
+      );
     }
   }
 
@@ -5931,7 +5950,13 @@
 
     if (compileTimeErrors != null) {
       compileTimeErrors.add(result);
-      push(intern.createBlock(noLocation, noLocation, compileTimeErrors));
+      push(
+        intern.createBlock(
+          fileOffset: noLocation,
+          fileEndOffset: noLocation,
+          compileTimeErrors,
+        ),
+      );
     } else {
       push(result);
     }
@@ -6584,7 +6609,7 @@
           );
         }
         receiver = intern.createInstantiation(
-          instantiationOffset,
+          fileOffset: instantiationOffset,
           receiver,
           buildDartTypeArguments(
             typeArgumentBuilders,
@@ -7398,15 +7423,16 @@
           }
         } else {
           int offset = elseEntry.fileOffset;
-          node = new MapLiteralEntry(
+          node = intern.createMapLiteralEntry(
             buildProblem(
               message: diag.cantDisambiguateAmbiguousInformation,
               fileUri: uri,
               fileOffset: offset,
               length: 1,
             ),
-            new NullLiteral(),
-          )..fileOffset = offsetForToken(ifToken);
+            intern.createNullLiteral(TreeNode.noOffset),
+            fileOffset: offsetForToken(ifToken),
+          );
         }
       } else {
         int offset = elseEntry is Expression
@@ -7414,15 +7440,16 @@
             :
               // Coverage-ignore(suite): Not run.
               offsetForToken(ifToken);
-        node = new MapLiteralEntry(
+        node = intern.createMapLiteralEntry(
           buildProblem(
             message: diag.expectedAfterButGot.withArguments(expected: ':'),
             fileUri: uri,
             fileOffset: offset,
             length: 1,
           ),
-          new NullLiteral(),
-        )..fileOffset = offsetForToken(ifToken);
+          intern.createNullLiteral(TreeNode.noOffset),
+          fileOffset: offsetForToken(ifToken),
+        );
       }
     } else if (elseEntry is MapLiteralEntry) {
       if (thenEntry is ControlFlowElement) {
@@ -7450,15 +7477,16 @@
           }
         } else {
           int offset = thenEntry.fileOffset;
-          node = new MapLiteralEntry(
+          node = intern.createMapLiteralEntry(
             buildProblem(
               message: diag.cantDisambiguateAmbiguousInformation,
               fileUri: uri,
               fileOffset: offset,
               length: 1,
             ),
-            new NullLiteral(),
-          )..fileOffset = offsetForToken(ifToken);
+            intern.createNullLiteral(TreeNode.noOffset),
+            fileOffset: offsetForToken(ifToken),
+          );
         }
       } else {
         int offset = thenEntry is Expression
@@ -7466,15 +7494,16 @@
             :
               // Coverage-ignore(suite): Not run.
               offsetForToken(ifToken);
-        node = new MapLiteralEntry(
+        node = intern.createMapLiteralEntry(
           buildProblem(
             message: diag.expectedAfterButGot.withArguments(expected: ':'),
             fileUri: uri,
             fileOffset: offset,
             length: 1,
           ),
-          new NullLiteral(),
-        )..fileOffset = offsetForToken(ifToken);
+          intern.createNullLiteral(TreeNode.noOffset),
+          fileOffset: offsetForToken(ifToken),
+        );
       }
     } else {
       if (condition.patternGuard == null) {
@@ -7635,8 +7664,11 @@
     if (identifier is Identifier) {
       push(
         new NamedArgument(
-          new NamedExpression(identifier.name, value)
-            ..fileOffset = identifier.nameOffset,
+          intern.createNamedExpression(
+            identifier.name,
+            value,
+            fileOffset: identifier.nameOffset,
+          ),
         ),
       );
     } else {
@@ -7674,8 +7706,11 @@
     Object? identifier = pop();
     if (identifier is Identifier) {
       push(
-        new NamedExpression(identifier.name, value)
-          ..fileOffset = identifier.nameOffset,
+        intern.createNamedExpression(
+          identifier.name,
+          value,
+          fileOffset: identifier.nameOffset,
+        ),
       );
     } else {
       assert(
@@ -7721,7 +7756,8 @@
       isFinal: true,
       isLocalFunction: true,
       isWildcard: isWildcard,
-    )..fileOffset = name.nameOffset;
+      fileOffset: name.nameOffset,
+    );
     push(
       new FunctionDeclarationImpl(
         variable,
@@ -7857,14 +7893,17 @@
         // This must have been a compile-time error.
         assert(isErroneousNode(variable.initializer!));
 
-        statement = intern
-            .createBlock(declaration.fileOffset, noLocation, <Statement>[
-              intern.createExpressionStatement(
-                offsetForToken(token),
-                variable.initializer!,
-              ),
-              declaration,
-            ]);
+        statement = intern.createBlock(
+          fileOffset: declaration.fileOffset,
+          fileEndOffset: noLocation,
+          <Statement>[
+            intern.createExpressionStatement(
+              fileOffset: offsetForToken(token),
+              variable.initializer!,
+            ),
+            declaration,
+          ],
+        );
         variable.initializer = null;
       } else {
         statement = declaration;
@@ -7879,8 +7918,12 @@
         // function declaration instead. We wrap it in a [BlockExpression].
         exitLocalScope();
         push(
-          new BlockExpression(
-            intern.createBlock(declaration.fileOffset, noLocation, [statement]),
+          intern.createBlockExpression(
+            intern.createBlock(
+              fileOffset: declaration.fileOffset,
+              fileEndOffset: noLocation,
+              [statement],
+            ),
             buildProblem(
               message: diag.namedFunctionExpression,
               fileUri: uri,
@@ -7889,7 +7932,8 @@
               // Error has already been reported by the parser.
               errorHasBeenReported: true,
             ),
-          )..fileOffset = declaration.fileOffset,
+            fileOffset: declaration.fileOffset,
+          ),
         );
       } else {
         push(statement);
@@ -7959,8 +8003,10 @@
         length: formals.length,
       );
     } else {
-      result = new FunctionExpression(function)
-        ..fileOffset = offsetForToken(beginToken);
+      result = intern.createFunctionExpression(
+        function,
+        fileOffset: offsetForToken(beginToken),
+      );
     }
     push(result);
     // This is matched by the call to [beginNode] in [enterFunction].
@@ -8269,59 +8315,54 @@
     Object? lvalue = pop(); // lvalue
     exitLocalScope();
 
-    ForInElements elements = _computeForInElements(
-      forToken,
-      inToken,
-      lvalue,
-      null,
+    InternalForInElement element = _computeForInElement(
+      forToken: forToken,
+      inToken: inToken,
+      lvalue: lvalue,
     );
     assignedVariables.pushNode(assignedVariablesNodeInfo);
-    VariableDeclaration variable = elements.variable;
-    Expression? problem = elements.expressionProblem;
     if (entry is MapLiteralEntry) {
       ForInMapEntry result = intern.createForInMapEntry(
-        offsetForToken(forToken),
-        variable,
+        element,
         iterable,
-        elements.syntheticAssignment,
-        elements.expressionEffects,
         entry,
-        problem,
         isAsync: awaitToken != null,
+        fileOffset: awaitToken?.charOffset ?? forToken.charOffset,
+        forOffset: forToken.charOffset,
       );
       assignedVariables.endNode(result);
       push(result);
     } else {
       ForInElement result = intern.createForInElement(
-        offsetForToken(forToken),
-        variable,
+        element,
         iterable,
-        elements.syntheticAssignment,
-        elements.expressionEffects,
         toValue(entry),
-        problem,
         isAsync: awaitToken != null,
+        fileOffset: awaitToken?.charOffset ?? forToken.charOffset,
+        forOffset: forToken.charOffset,
       );
       assignedVariables.endNode(result);
       push(result);
     }
   }
 
-  ForInElements _computeForInElements(
-    Token forToken,
-    Token inToken,
-    Object? lvalue,
-    Statement? body,
-  ) {
-    ForInElements elements = new ForInElements();
+  InternalForInElement _computeForInElement({
+    required Token forToken,
+    required Token inToken,
+    required Object? lvalue,
+  }) {
     if (lvalue is VariableInitialization) {
+      // Variable initializers are not supported. An error has already been
+      // reported by the parser.
+      lvalue.initializer = null;
+      lvalue.hasDeclaredInitializer = false;
       // Late for-in variables are not supported. An error has already been
       // reported by the parser.
       lvalue.isLate = false;
-      elements.explicitVariableDeclaration = lvalue.variable;
+      InvalidExpression? error;
       if (lvalue.isConst) {
         // Coverage-ignore-block(suite): Not run.
-        elements.expressionProblem = buildProblem(
+        error = buildProblem(
           message: diag.forInLoopWithConstVariable,
           fileUri: uri,
           fileOffset: lvalue.fileOffset,
@@ -8331,13 +8372,21 @@
         // constant evaluator further in the pipeline.
         lvalue.isConst = false;
       }
+      return new VariableInitializationForInElement(
+        variableInitialization: lvalue,
+        error: error,
+      );
     } else if (lvalue is VariableDeclaration) {
+      // Variable initializers are not supported. An error has already been
+      // reported by the parser.
+      lvalue.initializer = null;
+      lvalue.hasDeclaredInitializer = false;
       // Late for-in variables are not supported. An error has already been
       // reported by the parser.
       lvalue.isLate = false;
-      elements.explicitVariableDeclaration = lvalue;
+      InvalidExpression? error;
       if (lvalue.isConst) {
-        elements.expressionProblem = buildProblem(
+        error = buildProblem(
           message: diag.forInLoopWithConstVariable,
           fileUri: uri,
           fileOffset: lvalue.fileOffset,
@@ -8347,117 +8396,73 @@
         // constant evaluator further in the pipeline.
         lvalue.isConst = false;
       }
-    } else {
-      VariableDeclaration astVariable;
-      VariableDeclaration variable;
-      if (isClosureContextLoweringEnabled) {
-        SyntheticVariable syntheticAstVariable = new SyntheticVariable(
-          type: const DynamicType(),
-        );
-        astVariable = syntheticAstVariable;
-        variable = new InternalSyntheticVariable(
-          astVariable: syntheticAstVariable,
-          isImplicitlyTyped: false,
-        );
-      } else {
-        variable = astVariable = intern.createVariableDeclaration(
-          offsetForToken(forToken),
-          null,
-          isFinal: true,
-          isSynthesized: true,
-        );
-      }
-      elements.syntheticVariableDeclaration = variable;
-      if (lvalue is Generator) {
-        /// We are in this case, where `lvalue` isn't a [VariableDeclaration]:
-        ///
-        ///     for (lvalue in expression) body
-        ///
-        /// This is normalized to:
-        ///
-        ///     for (final #t in expression) {
-        ///       lvalue = #t;
-        ///       body;
-        ///     }
-        ///
-        /// The value of [forOutput] is `true`, since the synthetic assignment
-        /// will not be inferred, but will present in the output directly as
-        /// generated.
-        elements.syntheticAssignment = lvalue.buildAssignment(
-          new VariableGet(astVariable)..fileOffset = inToken.offset,
-          voidContext: true,
-          forOutput: true,
-        );
-      } else if (lvalue is Pattern) {
-        /// We are in the case where `lvalue` is a pattern:
-        ///
-        ///     for (pattern in expression) body
-        ///
-        /// This is normalized to:
-        ///
-        ///     for (final #t in expression) {
-        ///       pattern = #t;
-        ///       body;
-        ///     }
-        elements.syntheticAssignment = null;
-        elements.expressionEffects = intern.createPatternVariableDeclaration(
-          inToken.offset,
-          lvalue,
-          new VariableGet(variable),
-          isFinal: false,
-        );
-      } else if (lvalue is InvalidExpression) {
-        // Coverage-ignore-block(suite): Not run.
-        elements.expressionProblem = lvalue;
-      } else if (lvalue is ParserRecovery) {
-        elements.expressionProblem = buildProblem(
+      return new SingleVariableDeclarationForInElement(
+        variableDeclaration: lvalue,
+        error: error,
+      );
+    } else if (lvalue is Generator) {
+      /// We are in this case, where `lvalue` isn't a [VariableDeclaration]:
+      ///
+      ///     for (lvalue in expression) body
+      ///
+      /// This is normalized to:
+      ///
+      ///     for (final #t in expression) {
+      ///       lvalue = #t;
+      ///       body;
+      ///     }
+      ///
+      return lvalue.buildForInElement(inOffset: inToken.offset);
+    } else if (lvalue is Pattern) {
+      /// We are in the case where `lvalue` is a pattern:
+      ///
+      ///     for (pattern in expression) body
+      ///
+      /// This is normalized to:
+      ///
+      ///     for (final #t in expression) {
+      ///       pattern = #t;
+      ///       body;
+      ///     }
+      return new PatternForInElement(pattern: lvalue, inOffset: inToken.offset);
+    } else if (lvalue is InvalidExpression) {
+      // Coverage-ignore-block(suite): Not run.
+      return new InvalidForInElement(error: lvalue, inOffset: inToken.offset);
+    } else if (lvalue is ParserRecovery) {
+      return new InvalidForInElement(
+        error: buildProblem(
           message: diag.syntheticToken,
           fileUri: uri,
           fileOffset: lvalue.charOffset,
           length: noLength,
-        );
-      } else {
-        Message message = intern.isVariablesDeclaration(lvalue)
-            ? diag.forInLoopExactlyOneVariable
-            : diag.forInLoopNotAssignable;
-        Token token = forToken.next!.next!;
-        elements.expressionProblem = buildProblem(
-          message: message,
-          fileUri: uri,
-          fileOffset: offsetForToken(token),
-          length: lengthForToken(token),
-        );
-        Statement effects;
-        if (intern.isVariablesDeclaration(lvalue)) {
-          effects = intern.createBlock(
-            noLocation,
-            noLocation,
-            // New list because the declarations are not a growable list.
-            new List<Statement>.of(
-              intern.variablesDeclarationExtractDeclarations(lvalue),
-            ),
-          );
-        } else {
-          effects = intern.createExpressionStatement(
-            noLocation,
-            lvalue as Expression,
-          );
-        }
-        elements.expressionEffects = combineStatements(
-          intern.createExpressionStatement(
-            noLocation,
-            buildProblem(
-              message: message,
-              fileUri: uri,
-              fileOffset: offsetForToken(token),
-              length: lengthForToken(token),
-            ),
-          ),
-          effects,
-        );
-      }
+        ),
+        inOffset: inToken.offset,
+      );
+    } else if (intern.isVariablesDeclaration(lvalue)) {
+      Token token = forToken.next!.next!;
+      InvalidExpression error = buildProblem(
+        message: diag.forInLoopExactlyOneVariable,
+        fileUri: uri,
+        fileOffset: offsetForToken(token),
+        length: lengthForToken(token),
+      );
+      return new MultiVariableDeclarationForInElement(
+        variableDeclarations: intern.variablesDeclarationExtractDeclarations(
+          lvalue,
+        ),
+        error: error,
+      );
+    } else {
+      lvalue as Expression;
+      Token token = forToken.next!.next!;
+      InvalidExpression error = buildProblem(
+        message: diag.forInLoopNotAssignable,
+        fileUri: uri,
+        fileOffset: offsetForToken(token),
+        length: lengthForToken(token),
+      );
+      return new UnassignableForInElement(expression: lvalue, error: error);
     }
-    return elements;
   }
 
   @override
@@ -8506,39 +8511,19 @@
       continueStatements = continueTarget.resolveContinues(labeledStatement);
       body = labeledStatement;
     }
-    ForInElements elements = _computeForInElements(
-      forToken,
-      inKeyword,
-      lvalue,
+    Statement forInStatement = new InternalForInStatement(
+      _computeForInElement(
+        forToken: forToken,
+        inToken: inKeyword,
+        lvalue: lvalue,
+      ),
+      expression,
       body,
+      isAsync: awaitToken != null,
+      fileOffset: awaitToken?.charOffset ?? forToken.charOffset,
+      bodyOffset: body.fileOffset,
     );
-    VariableDeclaration variable = elements.variable;
-    Expression? problem = elements.expressionProblem;
-    Statement forInStatement;
-    if (elements.explicitVariableDeclaration != null) {
-      forInStatement =
-          new ForInStatement(
-              variable,
-              expression,
-              body,
-              isAsync: awaitToken != null,
-            )
-            ..fileOffset = awaitToken?.charOffset ?? forToken.charOffset
-            ..bodyOffset = body.fileOffset; // TODO(ahe): Isn't this redundant?
-    } else {
-      forInStatement =
-          new ForInStatementWithSynthesizedVariable(
-              variable,
-              expression,
-              elements.syntheticAssignment,
-              elements.expressionEffects,
-              body,
-              isAsync: awaitToken != null,
-              hasProblem: problem != null,
-            )
-            ..fileOffset = awaitToken?.charOffset ?? forToken.charOffset
-            ..bodyOffset = body.fileOffset; // TODO(ahe): Isn't this redundant?
-    }
+
     assignedVariables.storeInfo(forInStatement, assignedVariablesNodeInfo);
     if (continueStatements != null) {
       for (BreakStatementImpl continueStatement in continueStatements) {
@@ -8551,12 +8536,6 @@
       breakTarget.resolveBreaks(labeledStatement, forInStatement);
       result = labeledStatement;
     }
-    if (problem != null) {
-      result = combineStatements(
-        intern.createExpressionStatement(noLocation, problem),
-        result,
-      );
-    }
     exitLoopOrSwitch(result);
   }
 
@@ -8651,14 +8630,15 @@
       );
     } else {
       push(
-        new ExpressionStatement(
+        intern.createExpressionStatement(
           buildProblem(
             message: diag.rethrowNotCatch,
             fileUri: uri,
             fileOffset: offsetForToken(rethrowToken),
             length: lengthForToken(rethrowToken),
           ),
-        )..fileOffset = offsetForToken(rethrowToken),
+          fileOffset: offsetForToken(rethrowToken),
+        ),
       );
     }
   }
@@ -9388,8 +9368,11 @@
         patternSwitchCases,
       );
     } else {
-      switchStatement = new SwitchStatement(expression, cases)
-        ..fileOffset = switchKeyword.charOffset;
+      switchStatement = intern.createSwitchStatement(
+        expression,
+        cases,
+        fileOffset: switchKeyword.charOffset,
+      );
     }
     Statement result = switchStatement;
     // We create a labeled statement enclosing the switch statement if it has
@@ -9699,9 +9682,10 @@
       }
       if (target.isGotoTarget &&
           target.functionNestingLevel == functionNestingLevel) {
-        ContinueSwitchStatement statement = new ContinueSwitchStatement(
-          dummySwitchCase,
-        )..fileOffset = continueKeyword.charOffset;
+        ContinueSwitchStatement statement = intern
+            .createContinueSwitchStatement(
+              fileOffset: continueKeyword.charOffset,
+            );
         target.addGoto(statement);
         push(statement);
         return;
@@ -9914,13 +9898,14 @@
   void handleInvalidStatement(Token token, Message message) {
     Statement statement = pop() as Statement;
     push(
-      new ExpressionStatement(
+      intern.createExpressionStatement(
         buildProblem(
           message: message,
           fileUri: uri,
           fileOffset: statement.fileOffset,
           length: noLength,
         ),
+        fileOffset: statement.fileOffset,
       ),
     );
   }
@@ -9950,16 +9935,23 @@
           CfeSeverity.error,
         )
         .plain;
-    return new InvalidExpression(text, expression)..fileOffset = fileOffset;
+    return extern.createInvalidExpression(
+      text,
+      expression: expression,
+      fileOffset: fileOffset,
+    );
   }
 
   Expression buildAbstractClassInstantiationError(
     Message message,
-    String className, [
-    int charOffset = -1,
-  ]) {
+    String className,
+    int charOffset,
+  ) {
     addProblemErrorIfConst(message, charOffset, className.length);
-    return new InvalidExpression(message.problemMessage);
+    return extern.createInvalidExpression(
+      message.problemMessage,
+      fileOffset: charOffset,
+    );
   }
 
   Statement buildProblemStatement(
@@ -9970,7 +9962,7 @@
     bool errorHasBeenReported = false,
   }) {
     length ??= noLength;
-    return new ExpressionStatement(
+    return intern.createExpressionStatement(
       buildProblem(
         message: message,
         fileUri: uri,
@@ -9979,6 +9971,7 @@
         context: context,
         errorHasBeenReported: errorHasBeenReported,
       ),
+      fileOffset: charOffset,
     );
   }
 
@@ -10060,7 +10053,7 @@
         // as we've already reported that the field isn't valid.
         return <Initializer>[
           extern.createInvalidInitializer(
-            new InvalidExpression(
+            extern.createInvalidExpression(
               compilerContext
                   .format(
                     diag.extensionTypeDeclaresInstanceField.withLocation(
@@ -10071,6 +10064,7 @@
                     cfe.CfeSeverity.error,
                   )
                   .plain,
+              fileOffset: builder.fileOffset,
             ),
           ),
         ];
@@ -10312,13 +10306,17 @@
       push(NullValues.FunctionBody);
     } else {
       push(
-        intern.createBlock(offsetForToken(token), noLocation, <Statement>[
-          buildProblemStatement(
-            diag.expectedFunctionBody.withArguments(lexeme: token),
-            token.charOffset,
-            length: token.length,
-          ),
-        ]),
+        intern.createBlock(
+          fileOffset: offsetForToken(token),
+          fileEndOffset: noLocation,
+          <Statement>[
+            buildProblemStatement(
+              diag.expectedFunctionBody.withArguments(lexeme: token),
+              token.charOffset,
+              length: token.length,
+            ),
+          ],
+        ),
       );
     }
   }
@@ -10359,14 +10357,15 @@
         );
       } else {
         push(
-          new Instantiation(
+          intern.createInstantiation(
             toValue(operand),
             buildDartTypeArguments(
               typeArguments,
               TypeUse.tearOffTypeArgument,
               allowPotentiallyConstantType: true,
             ),
-          )..fileOffset = openAngleBracket.charOffset,
+            fileOffset: openAngleBracket.charOffset,
+          ),
         );
       }
     } else {
@@ -10501,13 +10500,11 @@
   ) {
     if (arguments == null) return expression;
     for (Argument argument in arguments.argumentList.reversed) {
-      expression = new Let(
-        new VariableDeclaration.forValue(
-          argument.expression,
-          isFinal: true,
-          type: coreTypes.objectRawType(Nullability.nullable),
-        ),
-        expression,
+      expression = intern.createLetForEffect(
+        effect: argument.expression,
+        // TODO(johnniwinther): Should we use `void` instead?
+        effectType: coreTypes.objectRawType(Nullability.nullable),
+        expression: expression,
       );
     }
     return expression;
@@ -10595,11 +10592,12 @@
         length: noLength,
       );
     } else {
-      Expression receiver = new SuperPropertyGet(
-        new ThisExpression(),
+      Expression receiver = intern.createSuperPropertyGet(
+        intern.createThisExpression(fileOffset: offset),
         name,
         target,
-      )..fileOffset = offset;
+        fileOffset: offset,
+      );
       return intern.createExpressionInvocation(
         arguments.fileOffset,
         receiver,
@@ -10675,8 +10673,10 @@
           CfeSeverity.error,
         )
         .plain;
-    InvalidExpression expression = new InvalidExpression(text)
-      ..fileOffset = charOffset;
+    InvalidExpression expression = extern.createInvalidExpression(
+      text,
+      fileOffset: charOffset,
+    );
     return expression;
   }
 
@@ -10716,10 +10716,10 @@
     PrefixBuilder prefix,
     int charOffset,
   ) {
-    VariableDeclaration check = new VariableDeclaration.forValue(
+    VariableDeclaration check = intern.createVariableDeclarationForValue(
       intern.checkLibraryIsLoaded(charOffset, prefix.dependency!),
     );
-    return new DeferredCheck(check, expression)..fileOffset = charOffset;
+    return new DeferredCheck(check, expression, fileOffset: charOffset);
   }
 
   bool isErroneousNode(TreeNode node) {
@@ -11050,7 +11050,10 @@
     if (inAssignmentPattern) {
       // Error has already been reported.
       pattern = intern.createInvalidPattern(
-        new InvalidExpression('declared variable pattern in assignment'),
+        extern.createInvalidExpression(
+          'declared variable pattern in assignment',
+          fileOffset: variable.charOffset,
+        ),
         declaredVariables: const [],
       );
     } else {
diff --git a/pkg/front_end/lib/src/kernel/body_builder_context.dart b/pkg/front_end/lib/src/kernel/body_builder_context.dart
index 15260f8..7d90d09 100644
--- a/pkg/front_end/lib/src/kernel/body_builder_context.dart
+++ b/pkg/front_end/lib/src/kernel/body_builder_context.dart
@@ -27,9 +27,10 @@
 import '../source/stack_listener_impl.dart' show AsyncModifier;
 import '../type_inference/context_allocation_strategy.dart';
 import '../type_inference/type_inferrer.dart'
-    show InferredConstructorInitializer, TypeInferrer;
+    show InferredConstructorInitializer, TypeInferrer, ConstructorContext;
 import '../util/helpers.dart';
 import 'internal_ast.dart';
+import 'internal_ast_helper.dart' as intern;
 
 /// Interface that defines the interface between the [BodyBuilder] and the
 /// member/declaration whose AST is being built.
@@ -155,6 +156,10 @@
   /// constructor declaration.
   bool get isConstructor => false;
 
+  /// Returns the [ConstructorContext] used for inferring constructor
+  /// initializers and body.
+  ConstructorContext? get constructorContext => null;
+
   // Coverage-ignore(suite): Not run.
   /// Returns `true` if the member whose body is being built is a non-factory
   /// constructor declaration marked as `external`.
@@ -412,7 +417,10 @@
   /// as a parameter in that case.
   ThisVariable? createInternalThisVariable() {
     return thisType != null && isDeclarationInstanceContext
-        ? new ThisVariable(type: thisType!)
+        ? intern.createThisVariable(
+            type: thisType!,
+            fileOffset: memberNameOffset,
+          )
         : null;
   }
 }
diff --git a/pkg/front_end/lib/src/kernel/body_builder_helpers.dart b/pkg/front_end/lib/src/kernel/body_builder_helpers.dart
index abf586c..e6bbf0a 100644
--- a/pkg/front_end/lib/src/kernel/body_builder_helpers.dart
+++ b/pkg/front_end/lib/src/kernel/body_builder_helpers.dart
@@ -318,17 +318,17 @@
         t.bound?.build(library, TypeUse.typeParameterBound);
       }
     }
-    return new FunctionNode(
-        body,
-        typeParameters: typeParameters,
-        positionalParameters: positionalParameters,
-        namedParameters: namedParameters,
-        requiredParameterCount: requiredParameterCount,
-        returnType: returnType,
-        asyncMarker: asyncModifier.kind,
-      )
-      ..fileOffset = charOffset
-      ..fileEndOffset = fileEndOffset;
+    return extern.createFunctionNode(
+      body,
+      typeParameters: typeParameters,
+      positionalParameters: positionalParameters,
+      namedParameters: namedParameters,
+      requiredParameterCount: requiredParameterCount,
+      returnType: returnType,
+      asyncMarker: asyncModifier.kind,
+      fileOffset: charOffset,
+      fileEndOffset: fileEndOffset,
+    );
   }
 
   @override
@@ -362,32 +362,6 @@
   }
 }
 
-/// Returns a block like this:
-///
-///     {
-///       statement;
-///       body;
-///     }
-///
-/// If [body] is a [Block], it's returned with [statement] prepended to it.
-Block combineStatements(Statement statement, Statement body) {
-  if (body is Block) {
-    if (statement is Block) {
-      body.statements.insertAll(0, statement.statements);
-      setParents(statement.statements, body);
-    } else {
-      body.statements.insert(0, statement);
-      statement.parent = body;
-    }
-    return body;
-  } else {
-    return new Block(<Statement>[
-      if (statement is Block) ...statement.statements else statement,
-      body,
-    ])..fileOffset = statement.fileOffset;
-  }
-}
-
 /// DartDocTest(
 ///   debugName("myClassName", "myName"),
 ///   "myClassName.myName"
@@ -416,17 +390,6 @@
   String toString() => "label($name)";
 }
 
-class ForInElements {
-  VariableDeclaration? explicitVariableDeclaration;
-  VariableDeclaration? syntheticVariableDeclaration;
-  Expression? syntheticAssignment;
-  Expression? expressionProblem;
-  Statement? expressionEffects;
-
-  VariableDeclaration get variable =>
-      (explicitVariableDeclaration ?? syntheticVariableDeclaration)!;
-}
-
 class Condition {
   final Expression expression;
   final PatternGuard? patternGuard;
diff --git a/pkg/front_end/lib/src/kernel/collections.dart b/pkg/front_end/lib/src/kernel/collections.dart
index bc93ca5..c0865b7 100644
--- a/pkg/front_end/lib/src/kernel/collections.dart
+++ b/pkg/front_end/lib/src/kernel/collections.dart
@@ -13,6 +13,7 @@
 import '../source/check_helper.dart';
 import '../type_inference/inference_results.dart';
 import '../type_inference/inference_visitor.dart';
+import 'external_ast_helper.dart' as extern;
 import 'internal_ast.dart';
 
 /// Base class for all control-flow elements.
@@ -70,7 +71,8 @@
 }
 
 /// A spread element in a list or set literal.
-class SpreadElement extends ControlFlowElement with ControlFlowElementMixin {
+class SpreadElement extends ControlFlowElement
+    with InternalTreeNode, ControlFlowElementMixin {
   Expression expression;
   bool isNullAware;
 
@@ -128,7 +130,8 @@
   }
 }
 
-class NullAwareElement extends ControlFlowElement with ControlFlowElementMixin {
+class NullAwareElement extends ControlFlowElement
+    with InternalTreeNode, ControlFlowElementMixin {
   Expression expression;
 
   NullAwareElement(this.expression);
@@ -149,33 +152,14 @@
   }
 
   @override
-  // Coverage-ignore(suite): Not run.
-  void transformChildren(Transformer v) {
-    expression = v.transform(expression);
-    expression.parent = this;
-  }
-
-  @override
-  // Coverage-ignore(suite): Not run.
-  void transformOrRemoveChildren(RemovingTransformer v) {
-    expression = v.transform(expression);
-    expression.parent = this;
-  }
-
-  @override
-  // Coverage-ignore(suite): Not run.
-  void visitChildren(Visitor v) {
-    expression.accept(v);
-  }
-
-  @override
   String toString() {
     return "NullAwareElement(${toStringInternal()})";
   }
 }
 
 /// An 'if' element in a list or set literal.
-class IfElement extends ControlFlowElement with ControlFlowElementMixin {
+class IfElement extends ControlFlowElement
+    with InternalTreeNode, ControlFlowElementMixin {
   Expression condition;
   Expression then;
   Expression? otherwise;
@@ -187,40 +171,6 @@
   }
 
   @override
-  // Coverage-ignore(suite): Not run.
-  void visitChildren(Visitor v) {
-    condition.accept(v);
-    then.accept(v);
-    otherwise?.accept(v);
-  }
-
-  @override
-  // Coverage-ignore(suite): Not run.
-  void transformChildren(Transformer v) {
-    condition = v.transform(condition);
-    condition.parent = this;
-    then = v.transform(then);
-    then.parent = this;
-    if (otherwise != null) {
-      otherwise = v.transform(otherwise!);
-      otherwise?.parent = this;
-    }
-  }
-
-  @override
-  // Coverage-ignore(suite): Not run.
-  void transformOrRemoveChildren(RemovingTransformer v) {
-    condition = v.transform(condition);
-    condition.parent = this;
-    then = v.transform(then);
-    then.parent = this;
-    if (otherwise != null) {
-      otherwise = v.transformOrRemoveExpression(otherwise!);
-      otherwise?.parent = this;
-    }
-  }
-
-  @override
   MapLiteralEntry? toMapLiteralEntry(
     void onConvertElement(TreeNode from, TreeNode to),
   ) {
@@ -268,11 +218,11 @@
 
 /// A 'for' element in a list or set literal.
 class ForElement extends ControlFlowElement
-    with ControlFlowElementMixin
+    with InternalTreeNode, ControlFlowElementMixin
     implements ForElementBase {
   // May be empty, but not null.
   @override
-  final List<VariableInitializationBase> variableInitializations;
+  final List<VariableDeclaration> variableInitializations;
 
   @override
   List<VariableDeclaration> get variables => variableInitializations.cast();
@@ -299,41 +249,6 @@
   }
 
   @override
-  // Coverage-ignore(suite): Not run.
-  void visitChildren(Visitor v) {
-    visitList(variableInitializations, v);
-    condition?.accept(v);
-    visitList(updates, v);
-    body.accept(v);
-  }
-
-  @override
-  // Coverage-ignore(suite): Not run.
-  void transformChildren(Transformer v) {
-    v.transformList(variableInitializations, this);
-    if (condition != null) {
-      condition = v.transform(condition!);
-      condition?.parent = this;
-    }
-    v.transformList(updates, this);
-    body = v.transform(body);
-    body.parent = this;
-  }
-
-  @override
-  // Coverage-ignore(suite): Not run.
-  void transformOrRemoveChildren(RemovingTransformer v) {
-    v.transformVariableInitializationList(variableInitializations, this);
-    if (condition != null) {
-      condition = v.transformOrRemoveExpression(condition!);
-      condition?.parent = this;
-    }
-    v.transformExpressionList(updates, this);
-    body = v.transform(body);
-    body.parent = this;
-  }
-
-  @override
   MapLiteralEntry? toMapLiteralEntry(
     void onConvertElement(TreeNode from, TreeNode to),
   ) {
@@ -384,15 +299,15 @@
 }
 
 /// A 'for-in' element in a list or set literal.
-class ForInElement extends ControlFlowElement with ControlFlowElementMixin {
-  // Has no initializer.
-  VariableDeclaration variable;
+class ForInElement extends ControlFlowElement
+    with InternalTreeNode, ControlFlowElementMixin {
+  final InternalForInElement element;
   Expression iterable;
-  Expression? syntheticAssignment; // May be null.
-  Statement? expressionEffects; // May be null.
   Expression body;
-  Expression? problem; // May be null.
-  bool isAsync; // True if this is an 'await for' loop.
+  final bool isAsync; // True if this is an 'await for' loop.
+
+  /// File offset for the `for` keyword.
+  final int forOffset;
 
   /// Variable [Scope] of this [ForInElement].
   ///
@@ -400,109 +315,29 @@
   /// [ScopeProvider] nodes in the output.
   Scope? scope;
 
+  VariableDeclaration? variable;
+
+  ForInEncoding? encoding;
+
   ForInElement(
-    this.variable,
+    this.element,
     this.iterable,
-    this.syntheticAssignment,
-    this.expressionEffects,
-    this.body,
-    this.problem, {
-    this.isAsync = false,
+    this.body, {
+    required this.isAsync,
+    required int fileOffset,
+    required this.forOffset,
+    this.variable,
+    this.encoding,
   }) {
-    variable.parent = this;
+    this.fileOffset = fileOffset;
     iterable.parent = this;
-    syntheticAssignment?.parent = this;
-    expressionEffects?.parent = this;
     body.parent = this;
-    problem
-            // Coverage-ignore(suite): Not run.
-            ?.parent =
-        this;
-  }
-
-  Statement? get prologue => syntheticAssignment != null
-      ? (new ExpressionStatement(syntheticAssignment!)
-          ..fileOffset = syntheticAssignment!.fileOffset)
-      : expressionEffects;
-
-  @override
-  // Coverage-ignore(suite): Not run.
-  void visitChildren(Visitor v) {
-    variable.accept(v);
-    iterable.accept(v);
-    syntheticAssignment?.accept(v);
-    expressionEffects?.accept(v);
-    body.accept(v);
-    problem?.accept(v);
   }
 
   @override
   // Coverage-ignore(suite): Not run.
-  void transformChildren(Transformer v) {
-    variable = v.transform(variable);
-    variable.parent = this;
-    iterable = v.transform(iterable);
-    iterable.parent = this;
-    if (syntheticAssignment != null) {
-      syntheticAssignment = v.transform(syntheticAssignment!);
-      syntheticAssignment?.parent = this;
-    }
-    if (expressionEffects != null) {
-      expressionEffects = v.transform(expressionEffects!);
-      expressionEffects?.parent = this;
-    }
-    body = v.transform(body);
-    body.parent = this;
-    if (problem != null) {
-      problem = v.transform(problem!);
-      problem?.parent = this;
-    }
-  }
-
-  @override
-  // Coverage-ignore(suite): Not run.
-  void transformOrRemoveChildren(RemovingTransformer v) {
-    variable = v.transform(variable);
-    variable.parent = this;
-    iterable = v.transform(iterable);
-    iterable.parent = this;
-    if (syntheticAssignment != null) {
-      syntheticAssignment = v.transformOrRemoveExpression(syntheticAssignment!);
-      syntheticAssignment?.parent = this;
-    }
-    if (expressionEffects != null) {
-      expressionEffects = v.transformOrRemoveStatement(expressionEffects!);
-      expressionEffects?.parent = this;
-    }
-    body = v.transform(body);
-    body.parent = this;
-    if (problem != null) {
-      problem = v.transformOrRemoveExpression(problem!);
-      problem?.parent = this;
-    }
-  }
-
-  @override
-  MapLiteralEntry? toMapLiteralEntry(
-    void onConvertElement(TreeNode from, TreeNode to),
-  ) {
-    MapLiteralEntry? bodyEntry;
-    Expression body = this.body;
-    if (body is ControlFlowElement) {
-      bodyEntry = body.toMapLiteralEntry(onConvertElement);
-    }
-    if (bodyEntry == null) return null;
-    ForInMapEntry result = new ForInMapEntry(
-      variable,
-      iterable,
-      syntheticAssignment,
-      expressionEffects,
-      bodyEntry,
-      problem,
-      isAsync: isAsync,
-    )..fileOffset = fileOffset;
-    onConvertElement(this, result);
-    return result;
+  void toTextInternal(AstPrinter state) {
+    // TODO(johnniwinther): Implement this.
   }
 
   @override
@@ -511,9 +346,27 @@
   }
 
   @override
-  // Coverage-ignore(suite): Not run.
-  void toTextInternal(AstPrinter state) {
-    // TODO(johnniwinther): Implement this.
+  MapLiteralEntry? toMapLiteralEntry(
+    void Function(TreeNode from, TreeNode to) onConvertElement,
+  ) {
+    MapLiteralEntry? bodyEntry;
+    Expression body = this.body;
+    if (body is ControlFlowElement) {
+      bodyEntry = body.toMapLiteralEntry(onConvertElement);
+    }
+    if (bodyEntry == null) return null;
+    ForInMapEntry result = new ForInMapEntry(
+      element,
+      iterable,
+      bodyEntry,
+      isAsync: isAsync,
+      fileOffset: fileOffset,
+      forOffset: forOffset,
+      variable: variable,
+      encoding: encoding,
+    );
+    onConvertElement(this, result);
+    return result;
   }
 }
 
@@ -609,7 +462,7 @@
 }
 
 abstract interface class ForElementBase implements AuxiliaryExpression {
-  List<VariableInitializationBase> get variableInitializations;
+  List<VariableDeclaration> get variableInitializations;
 
   List<VariableDeclaration> get variables;
 
@@ -628,7 +481,7 @@
 
   // May be empty, but not null.
   @override
-  final List<VariableInitializationBase> variableInitializations;
+  final List<VariableDeclaration> variableInitializations;
 
   @override
   List<VariableDeclaration> get variables => variableInitializations.cast();
@@ -645,7 +498,7 @@
   PatternForElement({
     required this.patternVariableDeclaration,
     required this.intermediateVariables,
-    required List<VariableInitializationBase> variables,
+    required List<VariableDeclaration> variables,
     required this.condition,
     required this.updates,
     required this.body,
@@ -736,7 +589,7 @@
 
 /// A null-aware entry in a map literal.
 class NullAwareMapEntry extends TreeNode
-    with ControlFlowMapEntryMixin
+    with InternalTreeNode, ControlFlowMapEntryMixin
     implements ControlFlowMapEntry {
   /// `true` if the key expression is null-aware, that is, marked with `?`.
   bool isKeyNullAware;
@@ -770,36 +623,11 @@
     }
     value.toTextInternal(printer);
   }
-
-  @override
-  // Coverage-ignore(suite): Not run.
-  void transformChildren(Transformer v) {
-    key = v.transform(key);
-    key.parent = this;
-    value = v.transform(value);
-    value.parent = this;
-  }
-
-  @override
-  // Coverage-ignore(suite): Not run.
-  void transformOrRemoveChildren(RemovingTransformer v) {
-    key = v.transform(key);
-    key.parent = this;
-    value = v.transform(value);
-    value.parent = this;
-  }
-
-  @override
-  // Coverage-ignore(suite): Not run.
-  void visitChildren(Visitor v) {
-    key.accept(v);
-    value.accept(v);
-  }
 }
 
 /// A spread element in a map literal.
 class SpreadMapEntry extends TreeNode
-    with ControlFlowMapEntryMixin
+    with InternalTreeNode, ControlFlowMapEntryMixin
     implements ControlFlowMapEntry {
   Expression expression;
   bool isNullAware;
@@ -815,26 +643,6 @@
   }
 
   @override
-  // Coverage-ignore(suite): Not run.
-  void visitChildren(Visitor v) {
-    expression.accept(v);
-  }
-
-  @override
-  // Coverage-ignore(suite): Not run.
-  void transformChildren(Transformer v) {
-    expression = v.transform(expression);
-    expression.parent = this;
-  }
-
-  @override
-  // Coverage-ignore(suite): Not run.
-  void transformOrRemoveChildren(RemovingTransformer v) {
-    expression = v.transform(expression);
-    expression.parent = this;
-  }
-
-  @override
   String toString() {
     return "SpreadMapEntry(${toStringInternal()})";
   }
@@ -849,7 +657,7 @@
 
 /// An 'if' element in a map literal.
 class IfMapEntry extends TreeNode
-    with ControlFlowMapEntryMixin
+    with InternalTreeNode, ControlFlowMapEntryMixin
     implements ControlFlowMapEntry {
   Expression condition;
   MapLiteralEntry then;
@@ -862,40 +670,6 @@
   }
 
   @override
-  // Coverage-ignore(suite): Not run.
-  void visitChildren(Visitor v) {
-    condition.accept(v);
-    then.accept(v);
-    otherwise?.accept(v);
-  }
-
-  @override
-  // Coverage-ignore(suite): Not run.
-  void transformChildren(Transformer v) {
-    condition = v.transform(condition);
-    condition.parent = this;
-    then = v.transform(then);
-    then.parent = this;
-    if (otherwise != null) {
-      otherwise = v.transform(otherwise!);
-      otherwise?.parent = this;
-    }
-  }
-
-  @override
-  // Coverage-ignore(suite): Not run.
-  void transformOrRemoveChildren(RemovingTransformer v) {
-    condition = v.transform(condition);
-    condition.parent = this;
-    then = v.transform(then);
-    then.parent = this;
-    if (otherwise != null) {
-      otherwise = v.transformOrRemove(otherwise!, dummyMapLiteralEntry);
-      otherwise?.parent = this;
-    }
-  }
-
-  @override
   String toString() {
     return "IfMapEntry(${toStringInternal()})";
   }
@@ -926,7 +700,7 @@
 
 /// A 'for' element in a map literal.
 class ForMapEntry extends TreeNode
-    with ControlFlowMapEntryMixin
+    with InternalTreeNode, ControlFlowMapEntryMixin
     implements ForMapEntryBase, ControlFlowMapEntry {
   // May be empty, but not null.
   @override
@@ -949,41 +723,6 @@
   }
 
   @override
-  // Coverage-ignore(suite): Not run.
-  void visitChildren(Visitor v) {
-    visitList(variables, v);
-    condition?.accept(v);
-    visitList(updates, v);
-    body.accept(v);
-  }
-
-  @override
-  // Coverage-ignore(suite): Not run.
-  void transformChildren(Transformer v) {
-    v.transformList(variables, this);
-    if (condition != null) {
-      condition = v.transform(condition!);
-      condition?.parent = this;
-    }
-    v.transformList(updates, this);
-    body = v.transform(body);
-    body.parent = this;
-  }
-
-  @override
-  // Coverage-ignore(suite): Not run.
-  void transformOrRemoveChildren(RemovingTransformer v) {
-    v.transformVariableInitializationList(variables, this);
-    if (condition != null) {
-      condition = v.transformOrRemoveExpression(condition!);
-      condition?.parent = this;
-    }
-    v.transformExpressionList(updates, this);
-    body = v.transform(body);
-    body.parent = this;
-  }
-
-  @override
   String toString() {
     return "ForMapEntry(${toStringInternal()})";
   }
@@ -1071,16 +810,15 @@
 
 /// A 'for-in' element in a map literal.
 class ForInMapEntry extends TreeNode
-    with ControlFlowMapEntryMixin
+    with InternalTreeNode, ControlFlowMapEntryMixin
     implements ControlFlowMapEntry {
-  // Has no initializer.
-  VariableDeclaration variable;
+  final InternalForInElement element;
   Expression iterable;
-  Expression? syntheticAssignment; // May be null.
-  Statement? expressionEffects; // May be null.
   MapLiteralEntry body;
-  Expression? problem; // May be null.
-  bool isAsync; // True if this is an 'await for' loop.
+  final bool isAsync; // True if this is an 'await for' loop.
+
+  /// File offset for the `for` keyword.
+  final int forOffset;
 
   /// Variable [Scope] of this [ForInMapEntry].
   ///
@@ -1088,91 +826,23 @@
   /// [ScopeProvider] nodes in the output.
   Scope? scope;
 
+  VariableDeclaration? variable;
+
+  ForInEncoding? encoding;
+
   ForInMapEntry(
-    this.variable,
+    this.element,
     this.iterable,
-    this.syntheticAssignment,
-    this.expressionEffects,
-    this.body,
-    this.problem, {
+    this.body, {
     required this.isAsync,
+    required int fileOffset,
+    required this.forOffset,
+    this.variable,
+    this.encoding,
   }) {
-    variable.parent = this;
+    this.fileOffset = fileOffset;
     iterable.parent = this;
-    syntheticAssignment?.parent = this;
-    expressionEffects?.parent = this;
     body.parent = this;
-    problem
-            // Coverage-ignore(suite): Not run.
-            ?.parent =
-        this;
-  }
-
-  Statement? get prologue => syntheticAssignment != null
-      ? (new ExpressionStatement(syntheticAssignment!)
-          ..fileOffset = syntheticAssignment!.fileOffset)
-      : expressionEffects;
-
-  @override
-  // Coverage-ignore(suite): Not run.
-  void visitChildren(Visitor v) {
-    variable.accept(v);
-    iterable.accept(v);
-    syntheticAssignment?.accept(v);
-    expressionEffects?.accept(v);
-    body.accept(v);
-    problem?.accept(v);
-  }
-
-  @override
-  // Coverage-ignore(suite): Not run.
-  void transformChildren(Transformer v) {
-    variable = v.transform(variable);
-    variable.parent = this;
-    iterable = v.transform(iterable);
-    iterable.parent = this;
-    if (syntheticAssignment != null) {
-      syntheticAssignment = v.transform(syntheticAssignment!);
-      syntheticAssignment?.parent = this;
-    }
-    if (expressionEffects != null) {
-      expressionEffects = v.transform(expressionEffects!);
-      expressionEffects?.parent = this;
-    }
-    body = v.transform(body);
-    body.parent = this;
-    if (problem != null) {
-      problem = v.transform(problem!);
-      problem?.parent = this;
-    }
-  }
-
-  @override
-  // Coverage-ignore(suite): Not run.
-  void transformOrRemoveChildren(RemovingTransformer v) {
-    variable = v.transform(variable);
-    variable.parent = this;
-    iterable = v.transform(iterable);
-    iterable.parent = this;
-    if (syntheticAssignment != null) {
-      syntheticAssignment = v.transformOrRemoveExpression(syntheticAssignment!);
-      syntheticAssignment?.parent = this;
-    }
-    if (expressionEffects != null) {
-      expressionEffects = v.transformOrRemoveStatement(expressionEffects!);
-      expressionEffects?.parent = this;
-    }
-    body = v.transform(body);
-    body.parent = this;
-    if (problem != null) {
-      problem = v.transformOrRemoveExpression(problem!);
-      problem?.parent = this;
-    }
-  }
-
-  @override
-  String toString() {
-    return "ForInMapEntry(${toStringInternal()})";
   }
 
   @override
@@ -1180,6 +850,11 @@
   void toTextInternal(AstPrinter state) {
     // TODO(johnniwinther): Implement this.
   }
+
+  @override
+  String toString() {
+    return "ForInMapEntry(${toStringInternal()})";
+  }
 }
 
 class IfCaseMapEntry extends TreeNode
@@ -1375,10 +1050,8 @@
 
       case ForInElement():
         ForInMapEntry result = new ForInMapEntry(
-          element.variable,
+          element.element,
           element.iterable,
-          element.syntheticAssignment,
-          element.expressionEffects,
           convertToMapEntry(
             element.body,
             problemReporting,
@@ -1386,9 +1059,12 @@
             fileUri,
             onConvertElement,
           ),
-          element.problem,
+          fileOffset: element.fileOffset,
+          forOffset: element.forOffset,
           isAsync: element.isAsync,
-        )..fileOffset = element.fileOffset;
+          variable: element.variable,
+          encoding: element.encoding,
+        );
         onConvertElement(element, result);
         return result;
     }
@@ -1410,7 +1086,7 @@
   CompilerContext compilerContext,
   Uri fileUri,
 ) {
-  return new MapLiteralEntry(
+  return extern.createMapLiteralEntry(
     problemReporting.buildProblem(
       compilerContext: compilerContext,
       message: diag.expectedAfterButGot.withArguments(expected: ':'),
@@ -1419,6 +1095,7 @@
       // TODO(danrubel): what is the length of the expression?
       length: noLength,
     ),
-    new NullLiteral()..fileOffset = element.fileOffset,
-  )..fileOffset = element.fileOffset;
+    extern.createNullLiteral(fileOffset: element.fileOffset),
+    fileOffset: element.fileOffset,
+  );
 }
diff --git a/pkg/front_end/lib/src/kernel/combined_member_signature.dart b/pkg/front_end/lib/src/kernel/combined_member_signature.dart
index 1979341..99bea0a 100644
--- a/pkg/front_end/lib/src/kernel/combined_member_signature.dart
+++ b/pkg/front_end/lib/src/kernel/combined_member_signature.dart
@@ -14,6 +14,7 @@
 import '../base/problems.dart' show unhandled;
 import '../builder/declaration_builders.dart';
 import '../source/source_class_builder.dart';
+import 'external_ast_helper.dart' as extern;
 import 'hierarchy/class_member.dart';
 import 'hierarchy/hierarchy_builder.dart';
 import 'hierarchy/members_builder.dart';
@@ -492,33 +493,37 @@
     Reference? reference = indexedContainer?.lookupGetterReference(member.name);
 
     Uri fileUri;
-    int startFileOffset;
+    int fileStartOffset;
     int fileOffset;
+    int fileEndOffset;
     if (copyLocation) {
       // Coverage-ignore-block(suite): Not run.
       fileUri = member.fileUri;
-      startFileOffset = member is Procedure
+      fileStartOffset = member is Procedure
           ? member.fileStartOffset
           : member.fileOffset;
       fileOffset = member.fileOffset;
+      fileEndOffset = member is Procedure
+          ? member.fileEndOffset
+          : member.fileOffset;
     } else {
       fileUri = declarationNode.fileUri;
-      fileOffset = startFileOffset = declarationNode.fileOffset;
+      fileOffset = fileStartOffset = fileEndOffset = declarationNode.fileOffset;
     }
-    return new Procedure(
-        member.name,
-        ProcedureKind.Getter,
-        new FunctionNode(null, returnType: type),
-        isAbstract: true,
-        fileUri: fileUri,
-        reference: reference,
-        isSynthetic: true,
-        stubKind: ProcedureStubKind.MemberSignature,
-        stubTarget: member.memberSignatureOrigin ?? member,
-      )
-      ..fileStartOffset = startFileOffset
-      ..fileOffset = fileOffset
-      ..parent = declarationNode;
+    return extern.createProcedure(
+      member.name,
+      ProcedureKind.Getter,
+      extern.createFunctionNode(null, returnType: type, fileOffset: fileOffset),
+      isAbstract: true,
+      fileUri: fileUri,
+      reference: reference,
+      isSynthetic: true,
+      stubKind: ProcedureStubKind.MemberSignature,
+      stubTarget: member.memberSignatureOrigin ?? member,
+      fileStartOffset: fileStartOffset,
+      fileOffset: fileOffset,
+      fileEndOffset: fileEndOffset,
+    )..parent = declarationNode;
   }
 
   /// Creates a setter member signature for [member] with the given
@@ -537,18 +542,22 @@
   }) {
     Reference? reference = indexedContainer?.lookupSetterReference(member.name);
     Uri fileUri;
-    int startFileOffset;
+    int fileStartOffset;
     int fileOffset;
+    int fileEndOffset;
     if (copyLocation) {
       // Coverage-ignore-block(suite): Not run.
       fileUri = member.fileUri;
-      startFileOffset = member is Procedure
+      fileStartOffset = member is Procedure
           ? member.fileStartOffset
           : member.fileOffset;
       fileOffset = member.fileOffset;
+      fileEndOffset = member is Procedure
+          ? member.fileEndOffset
+          : member.fileOffset;
     } else {
       fileUri = declarationNode.fileUri;
-      fileOffset = startFileOffset = declarationNode.fileOffset;
+      fileOffset = fileStartOffset = fileEndOffset = declarationNode.fileOffset;
     }
     VariableDeclaration setterParameter;
     if (_isClosureContextLoweringEnabled) {
@@ -564,37 +573,36 @@
                 ? parameter?.fileOffset ?? fileOffset
                 : fileOffset;
     } else {
-      setterParameter =
-          new VariableDeclaration(
-              parameter?.name ?? 'value',
-              type: type,
-              isCovariantByDeclaration: isCovariantByDeclaration,
-            )
-            ..isCovariantByClass = isCovariantByClass
-            ..fileOffset = copyLocation
-                ?
-                  // Coverage-ignore(suite): Not run.
-                  parameter?.fileOffset ?? fileOffset
-                : fileOffset;
+      setterParameter = extern.createParameterVariable(
+        parameter?.name ?? 'value',
+        type: type,
+        isCovariantByDeclaration: isCovariantByDeclaration,
+        isCovariantByClass: isCovariantByClass,
+        fileOffset: copyLocation
+            ?
+              // Coverage-ignore(suite): Not run.
+              parameter?.fileOffset ?? fileOffset
+            : fileOffset,
+      );
     }
-    return new Procedure(
-        member.name,
-        ProcedureKind.Setter,
-        new FunctionNode(
-          null,
-          returnType: const VoidType(),
-          positionalParameters: [setterParameter],
-        ),
-        isAbstract: true,
-        fileUri: fileUri,
-        reference: reference,
-        isSynthetic: true,
-        stubKind: ProcedureStubKind.MemberSignature,
-        stubTarget: member.memberSignatureOrigin ?? member,
-      )
-      ..fileStartOffset = startFileOffset
-      ..fileOffset = fileOffset
-      ..parent = declarationNode;
+    return extern.createProcedure(
+      member.name,
+      ProcedureKind.Setter,
+      new FunctionNode(
+        null,
+        returnType: const VoidType(),
+        positionalParameters: [setterParameter],
+      ),
+      isAbstract: true,
+      fileUri: fileUri,
+      reference: reference,
+      isSynthetic: true,
+      stubKind: ProcedureStubKind.MemberSignature,
+      stubTarget: member.memberSignatureOrigin ?? member,
+      fileStartOffset: fileStartOffset,
+      fileOffset: fileOffset,
+      fileEndOffset: fileEndOffset,
+    )..parent = declarationNode;
   }
 
   Procedure _createMethodSignature(
@@ -608,16 +616,18 @@
       procedure.name,
     );
     Uri fileUri;
-    int startFileOffset;
+    int fileStartOffset;
     int fileOffset;
+    int fileEndOffset;
     if (copyLocation) {
       // Coverage-ignore-block(suite): Not run.
       fileUri = procedure.fileUri;
-      startFileOffset = procedure.fileStartOffset;
+      fileStartOffset = procedure.fileStartOffset;
       fileOffset = procedure.fileOffset;
+      fileEndOffset = procedure.fileEndOffset;
     } else {
       fileUri = declarationNode.fileUri;
-      fileOffset = startFileOffset = declarationNode.fileOffset;
+      fileOffset = fileStartOffset = fileEndOffset = declarationNode.fileOffset;
     }
     FunctionNode function = procedure.function;
     List<VariableDeclaration> positionalParameters = [];
@@ -645,20 +655,19 @@
               ..isCovariantByClass = parameter.isCovariantByClass
               ..fileOffset = copyLocation ? parameter.fileOffset : fileOffset;
       } else {
-        positionalParameter =
-            new VariableDeclaration(
-                parameter.name,
-                type: parameterType,
-                isCovariantByDeclaration: parameter.isCovariantByDeclaration,
-                initializer: cloner.cloneOptional(parameter.initializer),
-              )
-              ..hasDeclaredInitializer = parameter.hasDeclaredInitializer
-              ..isCovariantByClass = parameter.isCovariantByClass
-              ..fileOffset = copyLocation
-                  ?
-                    // Coverage-ignore(suite): Not run.
-                    parameter.fileOffset
-                  : fileOffset;
+        positionalParameter = extern.createParameterVariable(
+          parameter.name,
+          type: parameterType,
+          isCovariantByDeclaration: parameter.isCovariantByDeclaration,
+          initializer: cloner.cloneOptional(parameter.initializer),
+          hasDeclaredInitializer: parameter.hasDeclaredInitializer,
+          isCovariantByClass: parameter.isCovariantByClass,
+          fileOffset: copyLocation
+              ?
+                // Coverage-ignore(suite): Not run.
+                parameter.fileOffset
+              : fileOffset,
+        );
       }
       positionalParameters.add(positionalParameter);
     }
@@ -680,20 +689,20 @@
           ..isCovariantByClass = parameter.isCovariantByClass
           ..fileOffset = copyLocation ? parameter.fileOffset : fileOffset;
       } else {
-        return new VariableDeclaration(
-            parameter.name,
-            type: freshTypeParameters.substitute(namedType.type),
-            isRequired: namedType.isRequired,
-            isCovariantByDeclaration: parameter.isCovariantByDeclaration,
-            initializer: cloner.cloneOptional(parameter.initializer),
-          )
-          ..hasDeclaredInitializer = parameter.hasDeclaredInitializer
-          ..isCovariantByClass = parameter.isCovariantByClass
-          ..fileOffset = copyLocation
+        return extern.createParameterVariable(
+          parameter.name,
+          type: freshTypeParameters.substitute(namedType.type),
+          isRequired: namedType.isRequired,
+          isCovariantByDeclaration: parameter.isCovariantByDeclaration,
+          initializer: cloner.cloneOptional(parameter.initializer),
+          hasDeclaredInitializer: parameter.hasDeclaredInitializer,
+          isCovariantByClass: parameter.isCovariantByClass,
+          fileOffset: copyLocation
               ?
                 // Coverage-ignore(suite): Not run.
                 parameter.fileOffset
-              : fileOffset;
+              : fileOffset,
+        );
       }
     }
 
@@ -714,27 +723,28 @@
         namedParameters.add(cloneNamedParameter(parameter, namedParameterType));
       }
     }
-    return new Procedure(
-        procedure.name,
-        procedure.kind,
-        new FunctionNode(
-          null,
-          typeParameters: freshTypeParameters.freshTypeParameters,
-          returnType: freshTypeParameters.substitute(functionType.returnType),
-          positionalParameters: positionalParameters,
-          namedParameters: namedParameters,
-          requiredParameterCount: function.requiredParameterCount,
-        ),
-        isAbstract: true,
-        fileUri: fileUri,
-        reference: reference,
-        isSynthetic: true,
-        stubKind: ProcedureStubKind.MemberSignature,
-        stubTarget: procedure.memberSignatureOrigin ?? procedure,
-      )
-      ..fileStartOffset = startFileOffset
-      ..fileOffset = fileOffset
-      ..parent = declarationNode;
+    return extern.createProcedure(
+      procedure.name,
+      procedure.kind,
+      extern.createFunctionNode(
+        null,
+        typeParameters: freshTypeParameters.freshTypeParameters,
+        returnType: freshTypeParameters.substitute(functionType.returnType),
+        positionalParameters: positionalParameters,
+        namedParameters: namedParameters,
+        requiredParameterCount: function.requiredParameterCount,
+        fileOffset: fileOffset,
+      ),
+      isAbstract: true,
+      fileUri: fileUri,
+      reference: reference,
+      isSynthetic: true,
+      stubKind: ProcedureStubKind.MemberSignature,
+      stubTarget: procedure.memberSignatureOrigin ?? procedure,
+      fileStartOffset: fileStartOffset,
+      fileOffset: fileOffset,
+      fileEndOffset: fileEndOffset,
+    )..parent = declarationNode;
   }
 
   DartType _computeMemberType(Member member) {
diff --git a/pkg/front_end/lib/src/kernel/const_conditional_simplifier.dart b/pkg/front_end/lib/src/kernel/const_conditional_simplifier.dart
index bae47e1..cf1f630 100644
--- a/pkg/front_end/lib/src/kernel/const_conditional_simplifier.dart
+++ b/pkg/front_end/lib/src/kernel/const_conditional_simplifier.dart
@@ -8,6 +8,7 @@
 import 'package:kernel/target/targets.dart';
 import 'package:kernel/type_environment.dart';
 
+import 'external_ast_helper.dart' as extern;
 import 'try_constant_evaluator.dart';
 
 class ConstConditionalSimplifier extends RemovingTransformer {
@@ -81,7 +82,7 @@
     } else {
       return node.otherwise ??
           removalSentinel ?? // Coverage-ignore(suite): Not run.
-          new EmptyStatement();
+          extern.createEmptyStatement();
     }
   }
 
@@ -89,7 +90,7 @@
   // Coverage-ignore(suite): Not run.
   TreeNode visitAssertBlock(AssertBlock node, TreeNode? removalSentinel) {
     if (_removeAsserts) {
-      return removalSentinel ?? new EmptyStatement();
+      return removalSentinel ?? extern.createEmptyStatement();
     } else {
       return super.visitAssertBlock(node, removalSentinel);
     }
@@ -117,7 +118,7 @@
     TreeNode? removalSentinel,
   ) {
     if (_removeAsserts) {
-      return removalSentinel ?? new EmptyStatement();
+      return removalSentinel ?? extern.createEmptyStatement();
     } else {
       return super.visitAssertStatement(node, removalSentinel);
     }
diff --git a/pkg/front_end/lib/src/kernel/constant_evaluator.dart b/pkg/front_end/lib/src/kernel/constant_evaluator.dart
index e08b353..c5a3804 100644
--- a/pkg/front_end/lib/src/kernel/constant_evaluator.dart
+++ b/pkg/front_end/lib/src/kernel/constant_evaluator.dart
@@ -531,9 +531,9 @@
     Expression left = transform(node.left);
     Expression right = transform(node.right);
     if (_isNull(left)) {
-      return new EqualsNull(right)..fileOffset = node.fileOffset;
+      return extern.createEqualsNull(right, fileOffset: node.fileOffset);
     } else if (_isNull(right)) {
-      return new EqualsNull(left)..fileOffset = node.fileOffset;
+      return extern.createEqualsNull(left, fileOffset: node.fileOffset);
     }
     node.left = left..parent = node;
     node.right = right..parent = node;
@@ -958,18 +958,20 @@
               patternGuard.pattern as ConstantPattern;
           expressionOffsets.add(constantPattern.fileOffset);
           expressions.add(
-            new ConstantExpression(
+            extern.createConstantExpression(
               constantPattern.value!,
               constantPattern.expressionType!,
-            )..fileOffset = constantPattern.expression.fileOffset,
+              fileOffset: constantPattern.expression.fileOffset,
+            ),
           );
         }
-        SwitchCase switchCase = new SwitchCase(
+        SwitchCase switchCase = extern.createSwitchCase(
           expressions,
           expressionOffsets,
           patternSwitchCase.body,
           isDefault: patternSwitchCase.isDefault,
-        )..fileOffset = patternSwitchCase.fileOffset;
+          fileOffset: patternSwitchCase.fileOffset,
+        );
         switchCases.add(switchCase);
         for (Statement labelUser in patternSwitchCase.labelUsers) {
           (labelUser as ContinueSwitchStatement).target = switchCase;
@@ -1288,8 +1290,9 @@
           if (node.parent is LabeledStatement) {
             target = node.parent as LabeledStatement;
           } else {
-            target = outerLabeledStatement = new LabeledStatement(
+            target = outerLabeledStatement = extern.createLabeledStatement(
               dummyStatement,
+              fileOffset: node.fileOffset,
             );
           }
           breakStatement = extern.createBreakStatement(
@@ -1378,8 +1381,10 @@
         // Coverage-ignore-block(suite): Not run.
         replacement = replacementStatements.first;
       } else {
-        replacement = new Block(replacementStatements)
-          ..fileOffset = node.fileOffset;
+        replacement = extern.createBlock(
+          replacementStatements,
+          fileOffset: node.fileOffset,
+        );
       }
     }
     if (outerLabeledStatement != null) {
@@ -1962,33 +1967,32 @@
             patternGuard.pattern as ConstantPattern;
         expressionOffsets.add(constantPattern.fileOffset);
         expressions.add(
-          new ConstantExpression(
+          extern.createConstantExpression(
             constantPattern.value!,
             constantPattern.expressionType!,
-          )..fileOffset = constantPattern.expression.fileOffset,
+            fileOffset: constantPattern.expression.fileOffset,
+          ),
         );
 
-        SwitchCase switchCase =
-            new SwitchCase(
-                expressions,
-                expressionOffsets,
-                extern.createBlock([
-                  extern.createExpressionStatement(
-                    extern.createVariableSet(
-                      valueVariable,
-                      switchExpressionCase.expression,
-                      fileOffset: switchExpressionCase.expression.fileOffset,
-                    ),
-                  ),
-                  extern.createBreakStatement(
-                    labeledStatement,
-                    fileOffset: switchExpressionCase.expression.fileOffset,
-                  ),
-                ], fileOffset: switchExpressionCase.fileOffset),
-                isDefault: false,
-              )
-              ..fileOffset = switchExpressionCase.fileOffset
-              ..fileOffset;
+        SwitchCase switchCase = extern.createSwitchCase(
+          expressions,
+          expressionOffsets,
+          extern.createBlock([
+            extern.createExpressionStatement(
+              extern.createVariableSet(
+                valueVariable,
+                switchExpressionCase.expression,
+                fileOffset: switchExpressionCase.expression.fileOffset,
+              ),
+            ),
+            extern.createBreakStatement(
+              labeledStatement,
+              fileOffset: switchExpressionCase.expression.fileOffset,
+            ),
+          ], fileOffset: switchExpressionCase.fileOffset),
+          isDefault: false,
+          fileOffset: switchExpressionCase.fileOffset,
+        );
         switchCases.add(switchCase);
       }
 
@@ -2455,22 +2459,25 @@
         constant.expression is InvalidExpression) {
       return constant.expression;
     }
-    ConstantExpression constantExpression = new ConstantExpression(
+    ConstantExpression constantExpression = extern.createConstantExpression(
       constant,
       node.getStaticType(staticTypeContext),
-    )..fileOffset = node.fileOffset;
+      fileOffset: node.fileOffset,
+    );
     if (node is FileUriExpression) {
-      return new FileUriConstantExpression(
+      return extern.createFileUriConstantExpression(
         constantExpression.constant,
         type: constantExpression.type,
         fileUri: node.fileUri,
-      )..fileOffset = node.fileOffset;
+        fileOffset: node.fileOffset,
+      );
     } else if (node is FileUriConstantExpression) {
-      return new FileUriConstantExpression(
+      return extern.createFileUriConstantExpression(
         constantExpression.constant,
         type: constantExpression.type,
         fileUri: node.fileUri,
-      )..fileOffset = node.fileOffset;
+        fileOffset: node.fileOffset,
+      );
     }
     return constantExpression;
   }
@@ -2763,21 +2770,30 @@
             errorReporter.report(locatedMessage, contextMessages);
           }
           return new UnevaluatedConstant(
-            new InvalidExpression(message.problemMessage),
+            extern.createInvalidExpression(
+              message.problemMessage,
+              fileOffset: result.node.fileOffset,
+            ),
           );
         case _AbortDueToInvalidExpressionConstant():
           return new UnevaluatedConstant(
             // Create a new [InvalidExpression] without the expression, which
             // might now have lost the needed context. For instance references
             // to variables no longer in scope.
-            new InvalidExpression(result.node.message),
+            extern.createInvalidExpression(
+              result.node.message,
+              fileOffset: result.node.fileOffset,
+            ),
           );
         case _AbortDueToInvalidInitializerConstant():
           return new UnevaluatedConstant(
             // Create a new [InvalidExpression] without the expression, which
             // might now have lost the needed context. For instance references
             // to variables no longer in scope.
-            new InvalidExpression(result.node.message),
+            extern.createInvalidExpression(
+              result.node.message,
+              fileOffset: result.node.fileOffset,
+            ),
           );
       }
     }
@@ -2904,8 +2920,11 @@
   Constant unevaluated(Expression original, Expression replacement) {
     replacement.fileOffset = original.fileOffset;
     return new UnevaluatedConstant(
-      new FileUriExpression(replacement, getFileUri(original)!)
-        ..fileOffset = original.fileOffset,
+      extern.createFileUriExpression(
+        expression: replacement,
+        fileUri: getFileUri(original)!,
+        fileOffset: original.fileOffset,
+      ),
     );
   }
 
@@ -3448,10 +3467,11 @@
       // Coverage-ignore-block(suite): Not run.
       return unevaluated(
         node,
-        new ConstructorInvocation(
+        extern.createConstructorInvocation(
           constructor,
           unevaluatedArguments(positional, named, node.arguments.types),
           isConst: true,
+          fileOffset: node.fileOffset,
         ),
       );
     }
@@ -3796,11 +3816,12 @@
           leaveLazy();
         }
         instanceBuilder!.asserts.add(
-          new AssertStatement(
+          extern.createAssertStatement(
             _wrap(condition),
             message: message,
             conditionStartOffset: statement.conditionStartOffset,
             conditionEndOffset: statement.conditionEndOffset,
+            fileOffset: statement.fileOffset,
           ),
         );
       } else {
@@ -3820,11 +3841,12 @@
         if (shouldBeUnevaluated) {
           // Coverage-ignore-block(suite): Not run.
           instanceBuilder!.asserts.add(
-            new AssertStatement(
+            extern.createAssertStatement(
               _wrap(condition),
               message: _wrap(message),
               conditionStartOffset: statement.conditionStartOffset,
               conditionEndOffset: statement.conditionEndOffset,
+              fileOffset: statement.fileOffset,
             ),
           );
         } else if (message is StringConstant) {
@@ -3907,14 +3929,14 @@
       // Coverage-ignore-block(suite): Not run.
       return unevaluated(
         node,
-        new DynamicInvocation(
-            node.kind,
-            _wrap(receiver),
-            node.name,
-            unevaluatedArguments(positionalArguments, {}, node.arguments.types),
-          )
-          ..fileOffset = node.fileOffset
-          ..flags = node.flags,
+        extern.createDynamicInvocation(
+          node.kind,
+          _wrap(receiver),
+          node.name,
+          unevaluatedArguments(positionalArguments, {}, node.arguments.types),
+          fileOffset: node.fileOffset,
+          flags: node.flags,
+        ),
       );
     }
 
@@ -4091,12 +4113,13 @@
       // Coverage-ignore-block(suite): Not run.
       return unevaluated(
         node,
-        new EqualsCall(
+        extern.createEqualsCall(
           _wrap(left),
           _wrap(right),
           functionType: node.functionType,
           interfaceTarget: node.interfaceTarget,
-        )..fileOffset = node.fileOffset,
+          fileOffset: node.fileOffset,
+        ),
       );
     }
 
@@ -4111,7 +4134,7 @@
     if (shouldBeUnevaluated) {
       return unevaluated(
         node,
-        new EqualsNull(_wrap(expression))..fileOffset = node.fileOffset,
+        extern.createEqualsNull(_wrap(expression), fileOffset: node.fileOffset),
       );
     }
 
@@ -4567,11 +4590,12 @@
       leaveLazy();
       return unevaluated(
         node,
-        new ConditionalExpression(
+        extern.createConditionalExpression(
           _wrap(condition),
           _wrap(then),
           _wrap(otherwise),
-          env.substituteType(node.staticType),
+          staticType: env.substituteType(node.staticType),
+          fileOffset: node.fileOffset,
         ),
       );
     } else {
@@ -4626,12 +4650,13 @@
       // Coverage-ignore-block(suite): Not run.
       return unevaluated(
         node,
-        new InstanceGet(
+        extern.createInstanceGet(
           node.kind,
           _wrap(receiver),
           node.name,
           resultType: node.resultType,
           interfaceTarget: node.interfaceTarget,
+          fileOffset: node.fileOffset,
         ),
       );
     } else if (receiver is NullConstant) {
@@ -6120,7 +6145,7 @@
 
   @override
   ExecutionStatus visitForStatement(ForStatement node) {
-    for (VariableInitializationBase variable in node.variables) {
+    for (VariableDeclaration variable in node.variables) {
       final ExecutionStatus status = variable.accept(this);
       if (status is! ProceedStatus) return status;
     }
diff --git a/pkg/front_end/lib/src/kernel/constructor_tearoff_lowering.dart b/pkg/front_end/lib/src/kernel/constructor_tearoff_lowering.dart
index 6d69121..f508dc5 100644
--- a/pkg/front_end/lib/src/kernel/constructor_tearoff_lowering.dart
+++ b/pkg/front_end/lib/src/kernel/constructor_tearoff_lowering.dart
@@ -9,6 +9,7 @@
 import '../builder/library_builder.dart';
 import '../source/name_scheme.dart';
 import '../source/source_library_builder.dart';
+import 'external_ast_helper.dart' as extern;
 import 'kernel_helper.dart';
 
 // TODO(johnniwinther): move all lowering predicates to `package:kernel`.
@@ -316,19 +317,18 @@
   int fileOffset,
   Reference? reference,
 ) {
-  Procedure tearOff =
-      new Procedure(
-          dummyName,
-          ProcedureKind.Method,
-          new FunctionNode(null),
-          fileUri: fileUri,
-          isStatic: true,
-          isSynthetic: true,
-          reference: reference,
-        )
-        ..fileStartOffset = fileOffset
-        ..fileOffset = fileOffset
-        ..fileEndOffset = fileOffset;
+  Procedure tearOff = extern.createProcedure(
+    dummyName,
+    ProcedureKind.Method,
+    extern.createFunctionNode(null, fileOffset: fileOffset),
+    fileUri: fileUri,
+    isStatic: true,
+    isSynthetic: true,
+    reference: reference,
+    fileStartOffset: fileOffset,
+    fileOffset: fileOffset,
+    fileEndOffset: fileOffset,
+  );
   tearOffName.attachMember(tearOff);
   return tearOff;
 }
@@ -392,11 +392,12 @@
         )..fileOffset = constructorParameter.fileOffset;
       }
     } else {
-      return new VariableDeclaration(
+      return extern.createParameterVariable(
         constructorParameter.name,
         type: substitution.substituteType(constructorParameter.type),
         isRequired: !isPositional && constructorParameter.isRequired,
-      )..fileOffset = constructorParameter.fileOffset;
+        fileOffset: constructorParameter.fileOffset,
+      );
     }
   }
 
@@ -449,24 +450,25 @@
   for (VariableDeclaration tearOffParameter
       in tearOff.function.positionalParameters) {
     positionalArguments.add(
-      new VariableGet(tearOffParameter)..fileOffset = fileOffset,
+      extern.createVariableGet(tearOffParameter, fileOffset: fileOffset),
     );
   }
   List<NamedExpression> namedArguments = [];
   for (VariableDeclaration tearOffParameter
       in tearOff.function.namedParameters) {
     namedArguments.add(
-      new NamedExpression(
+      extern.createNamedExpression(
         tearOffParameter.name!,
-        new VariableGet(tearOffParameter)..fileOffset = fileOffset,
-      )..fileOffset = fileOffset,
+        extern.createVariableGet(tearOffParameter, fileOffset: fileOffset),
+      ),
     );
   }
-  Arguments arguments = new Arguments(
+  Arguments arguments = extern.createArguments(
     positionalArguments,
     named: namedArguments,
     types: typeArguments,
-  )..fileOffset = tearOff.fileOffset;
+    fileOffset: tearOff.fileOffset,
+  );
   return arguments;
 }
 
@@ -480,14 +482,20 @@
   );
   Expression constructorInvocation;
   if (target is Constructor) {
-    constructorInvocation = new ConstructorInvocation(target, arguments)
-      ..fileOffset = tearOff.fileOffset;
+    constructorInvocation = extern.createConstructorInvocation(
+      target,
+      arguments,
+      fileOffset: tearOff.fileOffset,
+    );
   } else {
-    constructorInvocation = new StaticInvocation(target as Procedure, arguments)
-      ..fileOffset = tearOff.fileOffset;
+    constructorInvocation = extern.createStaticInvocation(
+      target as Procedure,
+      arguments,
+      fileOffset: tearOff.fileOffset,
+    );
   }
   tearOff.function.registerFunctionBody(
-    new ReturnStatement(constructorInvocation)..fileOffset = tearOff.fileOffset,
+    extern.createReturnStatement(constructorInvocation),
   );
 }
 
@@ -537,9 +545,15 @@
           if (target is Constructor ||
               target is Procedure && target.isFactory) {
             // Coverage-ignore-block(suite): Not run.
-            targetTearOff = new ConstructorTearOff(target!);
+            targetTearOff = extern.createConstructorTearOff(
+              target!,
+              fileOffset: expression.fileOffset,
+            );
           } else {
-            targetTearOff = new StaticTearOff(target as Procedure);
+            targetTearOff = extern.createStaticTearOff(
+              target as Procedure,
+              fileOffset: expression.fileOffset,
+            );
           }
           return new LoweredTypedefTearOff(
             typedefTearOff,
diff --git a/pkg/front_end/lib/src/kernel/dart_scope_calculator.dart b/pkg/front_end/lib/src/kernel/dart_scope_calculator.dart
index 44649bc..cbcb0fb 100644
--- a/pkg/front_end/lib/src/kernel/dart_scope_calculator.dart
+++ b/pkg/front_end/lib/src/kernel/dart_scope_calculator.dart
@@ -4,6 +4,8 @@
 
 import 'package:kernel/ast.dart';
 
+import '../api_prototype/lowering_predicates.dart';
+
 // Coverage-ignore(suite): Not run.
 /// Dart scope
 ///
@@ -121,6 +123,12 @@
             !decl.isSynthesized &&
             !hoistedUnwritten.contains(decl) &&
             !decl.isWildcard) {
+          // Rename late lowered - but not the #set and #get variants - to the
+          // original name.
+          // See also https://github.com/dart-lang/sdk/issues/55918.
+          if (decl.isLowered && isLateLoweredLocalName(name)) {
+            name = extractLocalNameFromLateLoweredLocal(name);
+          }
           definitions[name] = decl;
         }
       }
diff --git a/pkg/front_end/lib/src/kernel/expression_generator.dart b/pkg/front_end/lib/src/kernel/expression_generator.dart
index 7e3a30d..72ed799 100644
--- a/pkg/front_end/lib/src/kernel/expression_generator.dart
+++ b/pkg/front_end/lib/src/kernel/expression_generator.dart
@@ -107,15 +107,11 @@
   ///
   /// The returned expression evaluates to the assigned value, unless
   /// [voidContext] is true, in which case it may evaluate to anything.
-  ///
-  /// If [forOutput] is true, the assignment is emitted in the form it will be
-  /// given to the backends, skipping the internal representation stage, which
-  /// might be required, for example, by type inference.
-  Expression buildAssignment(
-    Expression value, {
-    bool voidContext = false,
-    bool forOutput = false,
-  });
+  Expression buildAssignment(Expression value, {bool voidContext = false});
+
+  /// Builds a [InternalForInElement] for the use of this generator as the
+  /// element in a for-in loop.
+  InternalForInElement buildForInElement({required int inOffset});
 
   /// Returns an [Expression] representing a null-aware assignment (`??=`) with
   /// the generator on the LHS and [value] on the RHS.
@@ -181,7 +177,7 @@
   /// Returns an [Expression] representing a compile-time error.
   ///
   /// At runtime, an exception will be thrown.
-  Expression _makeInvalidRead({
+  InvalidExpression _makeInvalidRead({
     required UnresolvedKind unresolvedKind,
     bool errorHasBeenReported = false,
   }) {
@@ -197,7 +193,7 @@
   /// [value].
   ///
   /// At runtime, [value] will be evaluated before throwing an exception.
-  Expression _makeInvalidWrite({bool errorHasBeenReported = false}) {
+  InvalidExpression _makeInvalidWrite({bool errorHasBeenReported = false}) {
     return _helper.buildUnresolvedError(
       _plainNameForRead,
       fileOffset,
@@ -318,14 +314,15 @@
     int fileOffset,
     List<TypeBuilder>? typeArguments,
   ) {
-    return new Instantiation(
+    return intern.createInstantiation(
       buildSimpleRead(),
       _helper.buildDartTypeArguments(
         typeArguments,
         TypeUse.tearOffTypeArgument,
         allowPotentiallyConstantType: true,
       ),
-    )..fileOffset = fileOffset;
+      fileOffset: fileOffset,
+    );
   }
 
   /// Returns a [TypeBuilder] for this subexpression instantiated with the
@@ -465,12 +462,8 @@
   }
 
   @override
-  Expression buildAssignment(
-    Expression value, {
-    bool voidContext = false,
-    bool forOutput = false,
-  }) {
-    return _createWrite(fileOffset, value, forOutput: forOutput);
+  Expression buildAssignment(Expression value, {bool voidContext = false}) {
+    return _createWrite(fileOffset, value);
   }
 
   void _checkAssignment(int offset) {
@@ -484,18 +477,21 @@
     }
   }
 
-  Expression _createWrite(
-    int offset,
-    Expression value, {
-    bool forOutput = false,
-  }) {
+  Expression _createWrite(int offset, Expression value) {
     _checkAssignment(offset);
     _helper.registerVariableAssignment(variable);
-    if (variable case InternalVariable(:var astVariable) when forOutput) {
-      return new VariableSet(astVariable, value)..fileOffset = offset;
-    } else {
-      return new VariableSet(variable, value)..fileOffset = offset;
-    }
+    return intern.createVariableSet(variable, value, fileOffset: offset);
+  }
+
+  @override
+  InternalForInElement buildForInElement({required int inOffset}) {
+    _checkAssignment(fileOffset);
+    _helper.registerVariableAssignment(variable);
+    return new ExistingVariableForInElement(
+      variable: variable,
+      nameOffset: fileOffset,
+      inOffset: inOffset,
+    );
   }
 
   @override
@@ -653,19 +649,22 @@
   String get _debugName => "ForInLateFinalVariableUseGenerator";
 
   @override
-  Expression buildAssignment(
-    Expression value, {
-    bool voidContext = false,
-    bool forOutput = false,
-  }) {
-    InvalidExpression error = _helper.buildProblem(
+  InvalidExpression _makeInvalidWrite({bool errorHasBeenReported = false}) {
+    return _helper.buildProblem(
       message: diag.cannotAssignToFinalVariable.withArguments(
         variableName: variable.cosmeticName!,
       ),
       fileUri: _helper.uri,
       fileOffset: fileOffset,
       length: lengthForToken(token),
-    )..parent = variable;
+      errorHasBeenReported: errorHasBeenReported,
+    );
+  }
+
+  @override
+  // Coverage-ignore(suite): Not run.
+  Expression buildAssignment(Expression value, {bool voidContext = false}) {
+    InvalidExpression error = _makeInvalidWrite()..parent = variable;
     Expression assignment = super.buildAssignment(
       value,
       voidContext: voidContext,
@@ -675,6 +674,16 @@
     }
     return assignment;
   }
+
+  @override
+  InternalForInElement buildForInElement({required int inOffset}) {
+    return new ExistingVariableForInElement(
+      variable: variable,
+      nameOffset: fileOffset,
+      error: _makeInvalidWrite(),
+      inOffset: inOffset,
+    );
+  }
 }
 
 /// A [PropertyAccessGenerator] represents a subexpression whose prefix is
@@ -755,11 +764,7 @@
   }
 
   @override
-  Expression buildAssignment(
-    Expression value, {
-    bool voidContext = false,
-    bool forOutput = false,
-  }) {
+  Expression buildAssignment(Expression value, {bool voidContext = false}) {
     return intern.createPropertySet(
       fileOffset,
       receiver,
@@ -771,6 +776,20 @@
   }
 
   @override
+  InternalForInElement buildForInElement({required int inOffset}) {
+    return new InvalidForInElement(
+      error: _helper.buildProblem(
+        message: diag.nonIdentifierForInElement,
+        fileUri: _helper.uri,
+        fileOffset: fileOffset,
+        length: noLength,
+        errorHasBeenReported: true,
+      ),
+      inOffset: inOffset,
+    );
+  }
+
+  @override
   Expression buildIfNullAssignment(
     Expression value,
     DartType type,
@@ -888,6 +907,7 @@
         thisVariable: helper.thisVariable,
         thisOffset: receiver.fileOffset,
         isNullAware: isNullAware,
+        isThisExplicit: true,
       );
     } else {
       return isNullAware
@@ -935,6 +955,8 @@
   final int? thisOffset;
   final bool isNullAware;
 
+  final bool isThisExplicit;
+
   /// The synthetic variable used for 'this' in instance extension members
   /// and instance extension type members/constructor bodies.
   VariableDeclaration? thisVariable;
@@ -946,6 +968,7 @@
     this.thisVariable,
     this.thisOffset,
     this.isNullAware = false,
+    required this.isThisExplicit,
   }) : super(helper, nameToken);
 
   @override
@@ -959,8 +982,11 @@
   int get _nameOffset => fileOffset;
 
   Expression get _thisExpression => thisVariable != null
-      ? intern.createVariableGet(thisOffset ?? fileOffset, thisVariable!)
-      : intern.createThisExpression(thisOffset ?? fileOffset);
+      ? intern.createVariableGet(
+          thisVariable!,
+          fileOffset: thisOffset ?? fileOffset,
+        )
+      : intern.createThisExpression(fileOffset: thisOffset ?? fileOffset);
 
   @override
   Expression buildSimpleRead() {
@@ -978,11 +1004,7 @@
   }
 
   @override
-  Expression buildAssignment(
-    Expression value, {
-    bool voidContext = false,
-    bool forOutput = false,
-  }) {
+  Expression buildAssignment(Expression value, {bool voidContext = false}) {
     return _createWrite(fileOffset, value, forEffect: voidContext);
   }
 
@@ -1003,6 +1025,28 @@
   }
 
   @override
+  InternalForInElement buildForInElement({required int inOffset}) {
+    if (isThisExplicit) {
+      return new InvalidForInElement(
+        error: _helper.buildProblem(
+          message: diag.nonIdentifierForInElement,
+          fileUri: _helper.uri,
+          fileOffset: fileOffset,
+          length: noLength,
+          errorHasBeenReported: true,
+        ),
+        inOffset: inOffset,
+      );
+    }
+    return new PropertyForInElement(
+      receiver: _thisExpression,
+      name: name,
+      nameOffset: _nameOffset,
+      inOffset: inOffset,
+    );
+  }
+
+  @override
   Expression buildIfNullAssignment(
     Expression value,
     DartType type,
@@ -1156,11 +1200,7 @@
   }
 
   @override
-  Expression buildAssignment(
-    Expression value, {
-    bool voidContext = false,
-    bool forOutput = false,
-  }) {
+  Expression buildAssignment(Expression value, {bool voidContext = false}) {
     return intern.createPropertySet(
       fileOffset,
       receiver,
@@ -1172,6 +1212,20 @@
   }
 
   @override
+  InternalForInElement buildForInElement({required int inOffset}) {
+    return new InvalidForInElement(
+      error: _helper.buildProblem(
+        message: diag.nonIdentifierForInElement,
+        fileUri: _helper.uri,
+        fileOffset: fileOffset,
+        length: noLength,
+        errorHasBeenReported: true,
+      ),
+      inOffset: inOffset,
+    );
+  }
+
+  @override
   Expression buildIfNullAssignment(
     Expression value,
     DartType type,
@@ -1335,17 +1389,17 @@
       );
     } else {
       _helper.readInternalThisVariable();
-      return new SuperPropertyGet(new ThisExpression(), name, getter)
-        ..fileOffset = fileOffset;
+      return intern.createSuperPropertyGet(
+        intern.createThisExpression(fileOffset: fileOffset),
+        name,
+        getter,
+        fileOffset: fileOffset,
+      );
     }
   }
 
   @override
-  Expression buildAssignment(
-    Expression value, {
-    bool voidContext = false,
-    bool forOutput = false,
-  }) {
+  Expression buildAssignment(Expression value, {bool voidContext = false}) {
     return _createWrite(fileOffset, value);
   }
 
@@ -1360,12 +1414,31 @@
       );
     } else {
       _helper.readInternalThisVariable();
-      return new SuperPropertySet(new ThisExpression(), name, value, setter)
-        ..fileOffset = offset;
+      return intern.createSuperPropertySet(
+        intern.createThisExpression(fileOffset: fileOffset),
+        name,
+        setter,
+        value,
+        fileOffset: offset,
+      );
     }
   }
 
   @override
+  InternalForInElement buildForInElement({required int inOffset}) {
+    return new InvalidForInElement(
+      error: _helper.buildProblem(
+        message: diag.nonIdentifierForInElement,
+        fileUri: _helper.uri,
+        fileOffset: fileOffset,
+        length: noLength,
+        errorHasBeenReported: true,
+      ),
+      inOffset: inOffset,
+    );
+  }
+
+  @override
   Expression buildCompoundAssignment(
     Name binaryOperator,
     Expression value, {
@@ -1567,11 +1640,7 @@
   }
 
   @override
-  Expression buildAssignment(
-    Expression value, {
-    bool voidContext = false,
-    bool forOutput = false,
-  }) {
+  Expression buildAssignment(Expression value, {bool voidContext = false}) {
     return intern.createIndexSet(
       fileOffset,
       receiver,
@@ -1583,6 +1652,20 @@
   }
 
   @override
+  InternalForInElement buildForInElement({required int inOffset}) {
+    return new InvalidForInElement(
+      error: _helper.buildProblem(
+        message: diag.nonIdentifierForInElement,
+        fileUri: _helper.uri,
+        fileOffset: fileOffset,
+        length: noLength,
+        errorHasBeenReported: true,
+      ),
+      inOffset: inOffset,
+    );
+  }
+
+  @override
   Expression buildIfNullAssignment(
     Expression value,
     DartType type,
@@ -1738,7 +1821,7 @@
   @override
   Expression buildSimpleRead() {
     _helper.readInternalThisVariable();
-    Expression receiver = intern.createThisExpression(fileOffset);
+    Expression receiver = intern.createThisExpression(fileOffset: fileOffset);
     return intern.createIndexGet(
       fileOffset,
       receiver,
@@ -1748,13 +1831,9 @@
   }
 
   @override
-  Expression buildAssignment(
-    Expression value, {
-    bool voidContext = false,
-    bool forOutput = false,
-  }) {
+  Expression buildAssignment(Expression value, {bool voidContext = false}) {
     _helper.readInternalThisVariable();
-    Expression receiver = intern.createThisExpression(fileOffset);
+    Expression receiver = intern.createThisExpression(fileOffset: fileOffset);
     return intern.createIndexSet(
       fileOffset,
       receiver,
@@ -1766,6 +1845,20 @@
   }
 
   @override
+  InternalForInElement buildForInElement({required int inOffset}) {
+    return new InvalidForInElement(
+      error: _helper.buildProblem(
+        message: diag.nonIdentifierForInElement,
+        fileUri: _helper.uri,
+        fileOffset: fileOffset,
+        length: noLength,
+        errorHasBeenReported: true,
+      ),
+      inOffset: inOffset,
+    );
+  }
+
+  @override
   Expression buildIfNullAssignment(
     Expression value,
     DartType type,
@@ -1773,7 +1866,7 @@
     bool voidContext = false,
   }) {
     _helper.readInternalThisVariable();
-    Expression receiver = intern.createThisExpression(fileOffset);
+    Expression receiver = intern.createThisExpression(fileOffset: fileOffset);
     return new IfNullIndexSet(
       receiver: receiver,
       index: index,
@@ -1796,7 +1889,7 @@
     bool isPostIncDec = false,
   }) {
     _helper.readInternalThisVariable();
-    Expression receiver = intern.createThisExpression(fileOffset);
+    Expression receiver = intern.createThisExpression(fileOffset: fileOffset);
     return new CompoundIndexSet(
       receiver: receiver,
       index: index,
@@ -1920,11 +2013,7 @@
   }
 
   @override
-  Expression buildAssignment(
-    Expression value, {
-    bool voidContext = false,
-    bool forOutput = false,
-  }) {
+  Expression buildAssignment(Expression value, {bool voidContext = false}) {
     Procedure? setter = this.setter;
     if (setter == null) {
       return _helper.buildUnresolvedError(
@@ -1960,6 +2049,20 @@
   }
 
   @override
+  InternalForInElement buildForInElement({required int inOffset}) {
+    return new InvalidForInElement(
+      error: _helper.buildProblem(
+        message: diag.nonIdentifierForInElement,
+        fileUri: _helper.uri,
+        fileOffset: fileOffset,
+        length: noLength,
+        errorHasBeenReported: true,
+      ),
+      inOffset: inOffset,
+    );
+  }
+
+  @override
   Expression buildIfNullAssignment(
     Expression value,
     DartType type,
@@ -2134,6 +2237,8 @@
   final int? typeOffset;
   final bool isNullAware;
 
+  final bool isQualifiedAccess;
+
   StaticAccessGenerator(
     ExpressionGeneratorHelper helper,
     Token nameToken,
@@ -2143,6 +2248,7 @@
     this.writeTarget, {
     this.typeOffset,
     this.isNullAware = false,
+    required this.isQualifiedAccess,
   }) : assert(
          readTarget != null || invokeTarget != null || writeTarget != null,
          "No targets for $targetName.",
@@ -2157,6 +2263,7 @@
     MemberBuilder? setterBuilder, {
     int? typeOffset,
     bool isNullAware = false,
+    required bool isQualifiedAccess,
   }) {
     // If both [getterBuilder] and [setterBuilder] exist, they must both be
     // either top level (potentially from different libraries) or from the same
@@ -2176,6 +2283,7 @@
       setterBuilder?.writeTarget,
       typeOffset: typeOffset,
       isNullAware: isNullAware,
+      isQualifiedAccess: isQualifiedAccess,
     );
   }
 
@@ -2209,22 +2317,45 @@
   }
 
   @override
-  Expression buildAssignment(
-    Expression value, {
-    bool voidContext = false,
-    bool forOutput = false,
-  }) {
+  Expression buildAssignment(Expression value, {bool voidContext = false}) {
     return _createWrite(fileOffset, value);
   }
 
   Expression _createWrite(int offset, Expression value) {
-    Expression write;
-    if (writeTarget == null) {
-      write = _makeInvalidWrite();
+    Member? target = writeTarget;
+    if (target == null) {
+      return _makeInvalidWrite();
     } else {
-      write = new StaticSet(writeTarget!, value)..fileOffset = offset;
+      return intern.createStaticSet(writeTarget!, value, fileOffset: offset);
     }
-    return write;
+  }
+
+  @override
+  InternalForInElement buildForInElement({required int inOffset}) {
+    if (isQualifiedAccess) {
+      return new InvalidForInElement(
+        error: _helper.buildProblem(
+          message: diag.nonIdentifierForInElement,
+          fileUri: _helper.uri,
+          fileOffset: fileOffset,
+          length: noLength,
+          errorHasBeenReported: true,
+        ),
+        inOffset: inOffset,
+      );
+    }
+    Member? target = writeTarget;
+    if (target == null) {
+      return new InvalidForInElement(
+        error: _makeInvalidWrite(),
+        inOffset: inOffset,
+      );
+    }
+    return new StaticForInElement(
+      target: target,
+      nameOffset: _nameOffset,
+      inOffset: inOffset,
+    );
   }
 
   @override
@@ -2576,11 +2707,7 @@
   }
 
   @override
-  Expression buildAssignment(
-    Expression value, {
-    bool voidContext = false,
-    bool forOutput = false,
-  }) {
+  Expression buildAssignment(Expression value, {bool voidContext = false}) {
     return _createWrite(fileOffset, value, forEffect: voidContext);
   }
 
@@ -2606,6 +2733,26 @@
   }
 
   @override
+  InternalForInElement buildForInElement({required int inOffset}) {
+    Procedure? setter = writeTarget;
+    if (setter == null) {
+      return new InvalidForInElement(
+        error: _makeInvalidWrite(),
+        inOffset: inOffset,
+      );
+    }
+    return new ExtensionForInElement(
+      extension: extension,
+      thisTypeArguments: _createThisTypeArguments(),
+      thisAccess: _createThisAccess(),
+      name: targetName,
+      setter: setter,
+      nameOffset: fileOffset,
+      inOffset: inOffset,
+    );
+  }
+
+  @override
   Expression buildIfNullAssignment(
     Expression value,
     DartType type,
@@ -3010,11 +3157,7 @@
   }
 
   @override
-  Expression buildAssignment(
-    Expression value, {
-    bool voidContext = false,
-    bool forOutput = false,
-  }) {
+  Expression buildAssignment(Expression value, {bool voidContext = false}) {
     return _createWrite(
       fileOffset,
       receiver,
@@ -3051,6 +3194,20 @@
   }
 
   @override
+  InternalForInElement buildForInElement({required int inOffset}) {
+    return new InvalidForInElement(
+      error: _helper.buildProblem(
+        message: diag.nonIdentifierForInElement,
+        fileUri: _helper.uri,
+        fileOffset: fileOffset,
+        length: noLength,
+        errorHasBeenReported: true,
+      ),
+      inOffset: inOffset,
+    );
+  }
+
+  @override
   Expression buildIfNullAssignment(
     Expression value,
     DartType type,
@@ -3364,11 +3521,7 @@
   }
 
   @override
-  Expression buildAssignment(
-    Expression value, {
-    bool voidContext = false,
-    bool forOutput = false,
-  }) {
+  Expression buildAssignment(Expression value, {bool voidContext = false}) {
     Procedure? setter = writeTarget;
     if (setter == null) {
       // Coverage-ignore-block(suite): Not run.
@@ -3388,6 +3541,20 @@
   }
 
   @override
+  InternalForInElement buildForInElement({required int inOffset}) {
+    return new InvalidForInElement(
+      error: _helper.buildProblem(
+        message: diag.nonIdentifierForInElement,
+        fileUri: _helper.uri,
+        fileOffset: fileOffset,
+        length: noLength,
+        errorHasBeenReported: true,
+      ),
+      inOffset: inOffset,
+    );
+  }
+
+  @override
   Expression buildIfNullAssignment(
     Expression value,
     DartType type,
@@ -3576,16 +3743,21 @@
 
   @override
   // Coverage-ignore(suite): Not run.
-  Expression buildAssignment(
-    Expression value, {
-    bool voidContext = false,
-    bool forOutput = false,
-  }) {
+  Expression buildAssignment(Expression value, {bool voidContext = false}) {
     return _makeInvalidWrite();
   }
 
   @override
   // Coverage-ignore(suite): Not run.
+  InternalForInElement buildForInElement({required int inOffset}) {
+    return new InvalidForInElement(
+      error: _makeInvalidWrite(),
+      inOffset: inOffset,
+    );
+  }
+
+  @override
+  // Coverage-ignore(suite): Not run.
   Expression buildIfNullAssignment(
     Expression value,
     DartType type,
@@ -3750,7 +3922,7 @@
   }
 
   @override
-  Expression _makeInvalidRead({
+  InvalidExpression _makeInvalidRead({
     UnresolvedKind? unresolvedKind,
     bool errorHasBeenReported = false,
   }) {
@@ -3765,7 +3937,7 @@
 
   @override
   // Coverage-ignore(suite): Not run.
-  Expression _makeInvalidWrite({bool errorHasBeenReported = false}) {
+  InvalidExpression _makeInvalidWrite({bool errorHasBeenReported = false}) {
     return _helper.buildProblem(
       message: diag.explicitExtensionAsLvalue,
       fileUri: _helper.uri,
@@ -3856,16 +4028,21 @@
 
   @override
   // Coverage-ignore(suite): Not run.
-  Expression buildAssignment(
-    Expression value, {
-    bool voidContext = false,
-    bool forOutput = false,
-  }) {
+  Expression buildAssignment(Expression value, {bool voidContext = false}) {
     return _makeInvalidWrite();
   }
 
   @override
   // Coverage-ignore(suite): Not run.
+  InternalForInElement buildForInElement({required int inOffset}) {
+    return new InvalidForInElement(
+      error: _makeInvalidWrite(),
+      inOffset: inOffset,
+    );
+  }
+
+  @override
+  // Coverage-ignore(suite): Not run.
   Expression buildIfNullAssignment(
     Expression value,
     DartType type,
@@ -3972,11 +4149,7 @@
   }
 
   @override
-  Expression buildAssignment(
-    Expression value, {
-    bool voidContext = false,
-    bool forOutput = false,
-  }) {
+  Expression buildAssignment(Expression value, {bool voidContext = false}) {
     return _helper.wrapInDeferredCheck(
       suffixGenerator.buildAssignment(value, voidContext: voidContext),
       prefixGenerator.prefix,
@@ -3985,6 +4158,20 @@
   }
 
   @override
+  InternalForInElement buildForInElement({required int inOffset}) {
+    return new InvalidForInElement(
+      error: _helper.buildProblem(
+        message: diag.nonIdentifierForInElement,
+        fileUri: _helper.uri,
+        fileOffset: fileOffset,
+        length: noLength,
+        errorHasBeenReported: true,
+      ),
+      inOffset: inOffset,
+    );
+  }
+
+  @override
   // Coverage-ignore(suite): Not run.
   Expression buildIfNullAssignment(
     Expression value,
@@ -4684,7 +4871,7 @@
                   builtTypeArguments = unaliasTypes(builtTypeArguments)!;
 
                   tearOffExpression = intern.createInstantiation(
-                    token.charOffset,
+                    fileOffset: token.charOffset,
                     tearOffExpression,
                     builtTypeArguments,
                   );
@@ -4717,6 +4904,7 @@
                 memberLookupResult.setable,
                 typeOffset: fileOffset,
                 isNullAware: isNullAware,
+                isQualifiedAccess: true,
               );
             }
           } else {
@@ -4777,6 +4965,7 @@
                     memberLookupResult.setable,
                     typeOffset: fileOffset,
                     isNullAware: isNullAware,
+                    isQualifiedAccess: true,
                   );
                 }
               } else {
@@ -4806,6 +4995,7 @@
               setable is MemberBuilder ? setable : null,
               typeOffset: fileOffset,
               isNullAware: isNullAware,
+              isQualifiedAccess: true,
             );
           }
         } else {
@@ -4817,6 +5007,7 @@
             setable is MemberBuilder ? setable : null,
             typeOffset: fileOffset,
             isNullAware: isNullAware,
+            isQualifiedAccess: true,
           );
         }
       }
@@ -4995,7 +5186,7 @@
   Expression _createRead() => expression;
 
   @override
-  Expression _makeInvalidWrite({bool errorHasBeenReported = false}) {
+  InvalidExpression _makeInvalidWrite({bool errorHasBeenReported = false}) {
     switch (kind) {
       case ReadOnlyAccessKind.ConstVariable:
         return _helper.buildProblem(
@@ -5057,15 +5248,19 @@
   }
 
   @override
-  Expression buildAssignment(
-    Expression value, {
-    bool voidContext = false,
-    bool forOutput = false,
-  }) {
+  Expression buildAssignment(Expression value, {bool voidContext = false}) {
     return _makeInvalidWrite();
   }
 
   @override
+  InternalForInElement buildForInElement({required int inOffset}) {
+    return new InvalidForInElement(
+      error: _makeInvalidWrite(),
+      inOffset: inOffset,
+    );
+  }
+
+  @override
   Expression buildIfNullAssignment(
     Expression value,
     DartType type,
@@ -5207,15 +5402,19 @@
   }
 
   @override
-  Expression buildAssignment(
-    Expression value, {
-    bool voidContext = false,
-    bool forOutput = false,
-  }) {
+  Expression buildAssignment(Expression value, {bool voidContext = false}) {
     return buildError(kind: UnresolvedKind.Setter);
   }
 
   @override
+  InternalForInElement buildForInElement({required int inOffset}) {
+    return new InvalidForInElement(
+      error: buildError(kind: UnresolvedKind.Setter),
+      inOffset: inOffset,
+    );
+  }
+
+  @override
   // Coverage-ignore(suite): Not run.
   Expression buildCompoundAssignment(
     Name binaryOperator,
@@ -5264,7 +5463,7 @@
 
   @override
   // Coverage-ignore(suite): Not run.
-  Expression _makeInvalidRead({
+  InvalidExpression _makeInvalidRead({
     required UnresolvedKind unresolvedKind,
     bool errorHasBeenReported = false,
   }) {
@@ -5276,7 +5475,7 @@
 
   @override
   // Coverage-ignore(suite): Not run.
-  Expression _makeInvalidWrite({bool errorHasBeenReported = false}) {
+  InvalidExpression _makeInvalidWrite({bool errorHasBeenReported = false}) {
     return buildError(
       kind: UnresolvedKind.Setter,
       errorHasBeenReported: errorHasBeenReported,
@@ -5364,7 +5563,7 @@
 
   @override
   // Coverage-ignore(suite): Not run.
-  Expression _makeInvalidRead({
+  InvalidExpression _makeInvalidRead({
     UnresolvedKind? unresolvedKind,
     bool errorHasBeenReported = false,
   }) {
@@ -5373,7 +5572,7 @@
 
   @override
   // Coverage-ignore(suite): Not run.
-  Expression _makeInvalidWrite({bool errorHasBeenReported = false}) {
+  InvalidExpression _makeInvalidWrite({bool errorHasBeenReported = false}) {
     return _createInvalidExpression();
   }
 
@@ -5511,12 +5710,16 @@
   }
 
   @override
-  Expression buildAssignment(
-    Expression value, {
-    bool voidContext = false,
-    bool forOutput = false,
-  }) {
-    return _buildUnresolvedVariableAssignment(false, value);
+  Expression buildAssignment(Expression value, {bool voidContext = false}) {
+    return _buildUnresolvedVariableAssignment(isCompound: false);
+  }
+
+  @override
+  InternalForInElement buildForInElement({required int inOffset}) {
+    return new InvalidForInElement(
+      error: _buildUnresolvedVariableAssignment(isCompound: false),
+      inOffset: inOffset,
+    );
   }
 
   @override
@@ -5528,7 +5731,7 @@
     bool isPreIncDec = false,
     bool isPostIncDec = false,
   }) {
-    return _buildUnresolvedVariableAssignment(true, value);
+    return _buildUnresolvedVariableAssignment(isCompound: true);
   }
 
   @override
@@ -5546,10 +5749,9 @@
     sink.write(name.text);
   }
 
-  Expression _buildUnresolvedVariableAssignment(
-    bool isCompound,
-    Expression value,
-  ) {
+  InvalidExpression _buildUnresolvedVariableAssignment({
+    required bool isCompound,
+  }) {
     return buildError(
       kind: UnresolvedKind.Setter,
       errorHasBeenReported: errorHasBeenReported,
@@ -5601,16 +5803,21 @@
 
   @override
   // Coverage-ignore(suite): Not run.
-  Expression buildAssignment(
-    Expression value, {
-    bool voidContext = false,
-    bool forOutput = false,
-  }) {
+  Expression buildAssignment(Expression value, {bool voidContext = false}) {
     return _makeInvalidWrite();
   }
 
   @override
   // Coverage-ignore(suite): Not run.
+  InternalForInElement buildForInElement({required int inOffset}) {
+    return new InvalidForInElement(
+      error: _makeInvalidWrite(),
+      inOffset: inOffset,
+    );
+  }
+
+  @override
+  // Coverage-ignore(suite): Not run.
   Expression buildIfNullAssignment(
     Expression value,
     DartType type,
@@ -5664,7 +5871,7 @@
 
   @override
   // Coverage-ignore(suite): Not run.
-  Expression _makeInvalidWrite({bool errorHasBeenReported = false}) {
+  InvalidExpression _makeInvalidWrite({bool errorHasBeenReported = false}) {
     return _helper.buildProblem(
       message: diag.illegalAssignmentToNonAssignable,
       fileUri: _helper.uri,
@@ -5916,15 +6123,20 @@
   Expression buildSimpleRead() => _makeInvalidRead();
 
   @override
-  Expression buildAssignment(
-    Expression value, {
-    bool voidContext = false,
-    bool forOutput = false,
-  }) {
+  // Coverage-ignore(suite): Not run.
+  Expression buildAssignment(Expression value, {bool voidContext = false}) {
     return _makeInvalidWrite();
   }
 
   @override
+  InternalForInElement buildForInElement({required int inOffset}) {
+    return new InvalidForInElement(
+      error: _makeInvalidWrite(),
+      inOffset: inOffset,
+    );
+  }
+
+  @override
   // Coverage-ignore(suite): Not run.
   Expression buildIfNullAssignment(
     Expression value,
@@ -6046,7 +6258,7 @@
   }
 
   @override
-  Expression _makeInvalidRead({
+  InvalidExpression _makeInvalidRead({
     UnresolvedKind? unresolvedKind,
     bool errorHasBeenReported = false,
   }) {
@@ -6060,7 +6272,7 @@
   }
 
   @override
-  Expression _makeInvalidWrite({bool errorHasBeenReported = false}) =>
+  InvalidExpression _makeInvalidWrite({bool errorHasBeenReported = false}) =>
       _makeInvalidRead(errorHasBeenReported: errorHasBeenReported);
 
   @override
@@ -6118,16 +6330,21 @@
 
   @override
   // Coverage-ignore(suite): Not run.
-  Expression buildAssignment(
-    Expression value, {
-    bool voidContext = false,
-    bool forOutput = false,
-  }) {
+  Expression buildAssignment(Expression value, {bool voidContext = false}) {
     return _makeInvalidWrite(errorHasBeenReported: errorHasBeenReported);
   }
 
   @override
   // Coverage-ignore(suite): Not run.
+  InternalForInElement buildForInElement({required int inOffset}) {
+    return new InvalidForInElement(
+      error: _makeInvalidWrite(errorHasBeenReported: errorHasBeenReported),
+      inOffset: inOffset,
+    );
+  }
+
+  @override
+  // Coverage-ignore(suite): Not run.
   Expression buildIfNullAssignment(
     Expression value,
     DartType type,
@@ -6309,15 +6526,16 @@
   Expression buildSimpleRead() => buildProblem();
 
   @override
-  Expression buildAssignment(
-    Expression value, {
-    bool voidContext = false,
-    bool forOutput = false,
-  }) {
+  Expression buildAssignment(Expression value, {bool voidContext = false}) {
     return buildProblem();
   }
 
   @override
+  InternalForInElement buildForInElement({required int inOffset}) {
+    return new InvalidForInElement(error: buildProblem(), inOffset: inOffset);
+  }
+
+  @override
   // Coverage-ignore(suite): Not run.
   Expression buildIfNullAssignment(
     Expression value,
@@ -6363,14 +6581,14 @@
 
   @override
   // Coverage-ignore(suite): Not run.
-  Expression _makeInvalidRead({
+  InvalidExpression _makeInvalidRead({
     UnresolvedKind? unresolvedKind,
     bool errorHasBeenReported = false,
   }) => buildProblem();
 
   @override
   // Coverage-ignore(suite): Not run.
-  Expression _makeInvalidWrite({bool errorHasBeenReported = false}) =>
+  InvalidExpression _makeInvalidWrite({bool errorHasBeenReported = false}) =>
       buildProblem();
 
   @override
@@ -6552,7 +6770,7 @@
         _helper.readInternalThisVariable();
         return _helper.thisVariable != null
             ? _helper.createVariableGet(_helper.thisVariable!, fileOffset)
-            : intern.createThisExpression(fileOffset);
+            : intern.createThisExpression(fileOffset: fileOffset);
       }
     } else {
       return _helper.buildProblem(
@@ -6624,7 +6842,7 @@
         return _helper.buildMethodInvocation(
           _helper.thisVariable != null
               ? _helper.createVariableGet(_helper.thisVariable!, fileOffset)
-              : intern.createThisExpression(fileOffset),
+              : intern.createThisExpression(fileOffset: fileOffset),
           name,
           selector.typeArguments,
           selector.arguments,
@@ -6652,6 +6870,7 @@
           thisVariable: _helper.thisVariable,
           thisOffset: fileOffset,
           isNullAware: isNullAware,
+          isThisExplicit: true,
         );
       }
     }
@@ -6682,7 +6901,7 @@
         offset,
         _helper.thisVariable != null
             ? _helper.createVariableGet(_helper.thisVariable!, fileOffset)
-            : intern.createThisExpression(fileOffset),
+            : intern.createThisExpression(fileOffset: fileOffset),
         typeArguments,
         arguments,
       );
@@ -6829,16 +7048,21 @@
 
   @override
   // Coverage-ignore(suite): Not run.
-  Expression buildAssignment(
-    Expression value, {
-    bool voidContext = false,
-    bool forOutput = false,
-  }) {
+  Expression buildAssignment(Expression value, {bool voidContext = false}) {
     return buildAssignmentError();
   }
 
   @override
   // Coverage-ignore(suite): Not run.
+  InternalForInElement buildForInElement({required int inOffset}) {
+    return new InvalidForInElement(
+      error: buildAssignmentError(),
+      inOffset: inOffset,
+    );
+  }
+
+  @override
+  // Coverage-ignore(suite): Not run.
   Expression buildIfNullAssignment(
     Expression value,
     DartType type,
@@ -6907,7 +7131,7 @@
   }
 
   // Coverage-ignore(suite): Not run.
-  Expression buildAssignmentError() {
+  InvalidExpression buildAssignmentError() {
     return _helper.buildProblem(
       message: isSuper ? diag.cannotAssignToSuper : diag.notAnLvalue,
       fileUri: _helper.uri,
diff --git a/pkg/front_end/lib/src/kernel/external_ast_helper.dart b/pkg/front_end/lib/src/kernel/external_ast_helper.dart
index 11eea36..9992bff 100644
--- a/pkg/front_end/lib/src/kernel/external_ast_helper.dart
+++ b/pkg/front_end/lib/src/kernel/external_ast_helper.dart
@@ -10,44 +10,114 @@
 
 import 'internal_ast.dart';
 
-/// Creates an invocation of the [target] constructor with the given
-/// [arguments].
-ConstructorInvocation createConstructorInvocation(
-  Constructor target,
-  Arguments arguments, {
+/// Returns a block like this:
+///
+///     {
+///       statement;
+///       body;
+///     }
+///
+/// If [body] is a [Block], it's returned with [statement] prepended to it.
+Block combineStatements(Statement statement, Statement body) {
+  if (body is Block) {
+    if (statement is Block) {
+      body.statements.insertAll(0, statement.statements);
+      setParents(statement.statements, body);
+    } else {
+      body.statements.insert(0, statement);
+      statement.parent = body;
+    }
+    return body;
+  } else {
+    return createBlock(
+      [if (statement is Block) ...statement.statements else statement, body],
+      fileOffset: statement.fileOffset,
+      fileEndOffset: body.fileOffset,
+    );
+  }
+}
+
+/// Creates a logical and expression of [left] and [right].
+LogicalExpression createAndExpression(
+  Expression left,
+  Expression right, {
   required int fileOffset,
-  bool isConst = false,
 }) {
-  return new ConstructorInvocation(target, arguments, isConst: isConst)
+  return new LogicalExpression(left, LogicalExpressionOperator.AND, right)
     ..fileOffset = fileOffset;
 }
 
-/// Creates a static invocation of [target] with the given arguments.
-StaticInvocation createStaticInvocation(
-  Procedure target,
-  Arguments arguments, {
+/// Creates an [Arguments] object for the [positional] and [named] arguments,
+/// and [types] as the type arguments.
+Arguments createArguments(
+  List<Expression> positional, {
+  List<DartType>? types,
+  List<NamedExpression>? named,
   required int fileOffset,
-  bool isConst = false,
 }) {
-  return new StaticInvocation(target, arguments, isConst: isConst)
+  return new Arguments(positional, types: types, named: named)
     ..fileOffset = fileOffset;
 }
 
-/// Creates a super method invocation of [target] with the given arguments.
-SuperMethodInvocation createSuperMethodInvocation(
-  Expression receiver,
-  Name name,
-  Procedure target,
-  Arguments arguments, {
+Arguments createArgumentsForwarded(
+  FunctionNode function, {
   required int fileOffset,
 }) {
-  return new SuperMethodInvocation(receiver, name, arguments, target)
-    ..fileOffset = fileOffset;
+  return new Arguments.forwarded(function)..fileOffset = fileOffset;
 }
 
-/// Creates a `== null` test on [expression].
-EqualsNull createEqualsNull(Expression expression, {required int fileOffset}) {
-  return new EqualsNull(expression)..fileOffset = fileOffset;
+/// Creates an as-cast on [operand] against [type].
+AsExpression createAsExpression(
+  Expression operand,
+  DartType type, {
+  bool isUnchecked = false,
+  bool isCovarianceCheck = false,
+  bool isTypeError = false,
+  bool isForDynamic = false,
+  required int fileOffset,
+}) {
+  return new AsExpression(operand, type)
+    ..fileOffset = fileOffset
+    ..isUnchecked = isUnchecked
+    ..isCovarianceCheck = isCovarianceCheck
+    ..isTypeError = isTypeError
+    ..isForDynamic = isForDynamic;
+}
+
+AssertStatement createAssertStatement(
+  Expression condition, {
+  Expression? message,
+  required int conditionStartOffset,
+  required int conditionEndOffset,
+  required int fileOffset,
+}) {
+  return new AssertStatement(
+    condition,
+    message: message,
+    conditionStartOffset: conditionStartOffset,
+    conditionEndOffset: conditionEndOffset,
+  )..fileOffset = fileOffset;
+}
+
+/// Creates a block containing the [statements].
+Block createBlock(
+  List<Statement> statements, {
+  required int fileOffset,
+  int? fileEndOffset,
+}) {
+  return new Block(statements)
+    ..fileOffset = fileOffset
+    ..fileEndOffset = fileEndOffset ?? fileOffset;
+}
+
+/// Creates a block expression using [body] as the body and [value] as the
+/// resulting value.
+BlockExpression createBlockExpression(
+  Block body,
+  Expression value, {
+  required int fileOffset,
+}) {
+  return new BlockExpression(body, value)..fileOffset = fileOffset;
 }
 
 /// Creates a boolean literal of [value].
@@ -55,36 +125,22 @@
   return new BoolLiteral(value)..fileOffset = fileOffset;
 }
 
-/// Creates an integer literal of [value].
-Expression createIntLiteral(
-  CoreTypes coreTypes,
-  int value, {
+/// Creates a break statement with the given [target].
+BreakStatement createBreakStatement(
+  LabeledStatement target, {
   required int fileOffset,
 }) {
-  if (value < 0) {
-    /// The web backends need this to be encoded as a unary minus on the
-    /// positive value.
-    return new InstanceInvocation(
-      InstanceAccessKind.Instance,
-      new IntLiteral(-value)..fileOffset = fileOffset,
-      unaryMinusName,
-      new Arguments([])..fileOffset = fileOffset,
-      interfaceTarget: coreTypes.intUnaryMinus,
-      functionType: coreTypes.intUnaryMinus.getterType as FunctionType,
-    )..fileOffset = fileOffset;
-  } else {
-    return new IntLiteral(value)..fileOffset = fileOffset;
-  }
+  return new BreakStatement(target)..fileOffset = fileOffset;
 }
 
-/// Creates a string literal of [value].
-StringLiteral createStringLiteral(String value, {required int fileOffset}) {
-  return new StringLiteral(value)..fileOffset = fileOffset;
-}
-
-/// Creates a null literal.
-NullLiteral createNullLiteral({required int fileOffset}) {
-  return new NullLiteral()..fileOffset = fileOffset;
+CatchVariable createCatchVariable({
+  required String name,
+  required DartType? type,
+  bool isWildcard = false,
+  required int fileOffset,
+}) {
+  return new CatchVariable(name: name, type: type, isWildcard: isWildcard)
+    ..fileOffset = fileOffset;
 }
 
 /// Creates a conditional expression of the [condition] and the [then] and
@@ -101,36 +157,206 @@
     ..fileOffset = fileOffset;
 }
 
-/// Creates a [Let] of [variable] with the given [body] using
-/// `variable.fileOffset` as the file offset for the let.
-Let createLet(VariableDeclaration variable, Expression body) {
-  return new Let(variable, body)..fileOffset = variable.fileOffset;
-}
-
-/// Creates a [Let] with the [effect] as the variable initializer and the
-/// [result] as the body of the [Let] expression and using
-/// `effect.fileOffset` as the file offset for the let.
-Let createLetEffect({required Expression effect, required Expression result}) {
-  return new Let(createVariableCache(effect, const DynamicType()), result)
-    ..fileOffset = effect.fileOffset;
-}
-
-/// Creates a [VariableDeclaration] for caching [expression] of the static
-/// [type] using `expression.fileOffset` as the file offset for the declaration.
-VariableDeclaration createVariableCache(Expression expression, DartType type) {
-  return new VariableDeclaration.forValue(expression, type: type)
-    ..fileOffset = expression.fileOffset;
-}
-
-/// Creates an uninitialized [VariableDeclaration] of the static [type].
-VariableDeclaration createUninitializedVariable(
+ConstantExpression createConstantExpression(
+  Constant constant,
   DartType type, {
   required int fileOffset,
 }) {
-  return new VariableDeclaration(null, type: type, isSynthesized: true)
+  return new ConstantExpression(constant, type)..fileOffset = fileOffset;
+}
+
+Constructor createConstructor(
+  FunctionNode function, {
+  required Name name,
+  Reference? reference,
+  bool isSynthetic = false,
+  required Uri fileUri,
+  required int fileOffset,
+  required int fileStartOffset,
+  required int fileEndOffset,
+}) {
+  return new Constructor(
+      function,
+      name: name,
+      reference: reference,
+      fileUri: fileUri,
+      isSynthetic: isSynthetic,
+    )
+    ..fileOffset = fileOffset
+    ..startFileOffset = fileStartOffset
+    ..fileEndOffset = fileEndOffset;
+}
+
+/// Creates an invocation of the [target] constructor with the given
+/// [arguments].
+ConstructorInvocation createConstructorInvocation(
+  Constructor target,
+  Arguments arguments, {
+  required int fileOffset,
+  bool isConst = false,
+}) {
+  return new ConstructorInvocation(target, arguments, isConst: isConst)
     ..fileOffset = fileOffset;
 }
 
+// Coverage-ignore(suite): Not run.
+ConstructorTearOff createConstructorTearOff(
+  Member target, {
+  required int fileOffset,
+}) {
+  return new ConstructorTearOff(target)..fileOffset = fileOffset;
+}
+
+// Coverage-ignore(suite): Not run.
+DynamicInvocation createDynamicInvocation(
+  DynamicAccessKind kind,
+  Expression receiver,
+  Name name,
+  Arguments arguments, {
+  int flags = 0,
+  required int fileOffset,
+}) {
+  return new DynamicInvocation(kind, receiver, name, arguments)
+    ..flags = flags
+    ..fileOffset = fileOffset;
+}
+
+// TODO(johnniwinther): Should [fileOffset] be required?
+Statement createEmptyStatement({int fileOffset = TreeNode.noOffset}) {
+  return new EmptyStatement()..fileOffset = fileOffset;
+}
+
+// Coverage-ignore(suite): Not run.
+EqualsCall createEqualsCall(
+  Expression left,
+  Expression right, {
+  required FunctionType functionType,
+  required Procedure interfaceTarget,
+  required int fileOffset,
+}) {
+  return new EqualsCall(
+    left,
+    right,
+    functionType: functionType,
+    interfaceTarget: interfaceTarget,
+  )..fileOffset = fileOffset;
+}
+
+/// Creates a `== null` test on [expression].
+EqualsNull createEqualsNull(Expression expression, {required int fileOffset}) {
+  return new EqualsNull(expression)..fileOffset = fileOffset;
+}
+
+/// Creates an [ExpressionStatement] of [expression] using the file offset of
+/// [expression] for the file offset of the statement.
+ExpressionStatement createExpressionStatement(Expression expression) {
+  return new ExpressionStatement(expression)
+    ..fileOffset = expression.fileOffset;
+}
+
+FieldInitializer createFieldInitializer(
+  Field field,
+  Expression value, {
+  required int fileOffset,
+  required bool isSynthetic,
+}) {
+  return new FieldInitializer(field, value)
+    ..fileOffset = fileOffset
+    ..isSynthetic = isSynthetic;
+}
+
+FileUriConstantExpression createFileUriConstantExpression(
+  Constant constant, {
+  DartType type = const DynamicType(),
+  required Uri fileUri,
+  required int fileOffset,
+}) {
+  return new FileUriConstantExpression(constant, type: type, fileUri: fileUri)
+    ..fileOffset = fileOffset;
+}
+
+FileUriExpression createFileUriExpression({
+  required Expression expression,
+  required Uri fileUri,
+  required int fileOffset,
+}) {
+  return new FileUriExpression(expression, fileUri)..fileOffset = fileOffset;
+}
+
+FunctionExpression createFunctionExpression(
+  FunctionNode function, {
+  required int fileOffset,
+}) {
+  return new FunctionExpression(function)..fileOffset = fileOffset;
+}
+
+FunctionNode createFunctionNode(
+  Statement? body, {
+  List<TypeParameter>? typeParameters,
+  List<VariableDeclaration>? positionalParameters,
+  List<VariableDeclaration>? namedParameters,
+  int? requiredParameterCount,
+  DartType returnType = const DynamicType(),
+  required int fileOffset,
+  int? fileEndOffset,
+  AsyncMarker asyncMarker = AsyncMarker.Sync,
+  AsyncMarker? dartAsyncMarker,
+}) {
+  return new FunctionNode(
+      body,
+      typeParameters: typeParameters,
+      positionalParameters: positionalParameters,
+      namedParameters: namedParameters,
+      returnType: returnType,
+      requiredParameterCount: requiredParameterCount,
+      asyncMarker: asyncMarker,
+      dartAsyncMarker: dartAsyncMarker,
+    )
+    ..fileOffset = fileOffset
+    ..fileEndOffset = fileEndOffset ?? fileOffset;
+}
+
+/// Creates an if statement with the [condition], [then] branch and [otherwise]
+/// as the optional else branch.
+IfStatement createIfStatement(
+  Expression condition,
+  Statement then, {
+  Statement? otherwise,
+  required int fileOffset,
+}) {
+  return new IfStatement(condition, then, otherwise)..fileOffset = fileOffset;
+}
+
+Field createImmutableField(
+  Name name, {
+  required DartType type,
+  bool isLate = false,
+  bool isFinal = false,
+  bool isConst = false,
+  bool isStatic = false,
+  required Uri fileUri,
+  Reference? fieldReference,
+  Reference? getterReference,
+  bool isEnumElement = false,
+  required int fileOffset,
+  required int fileEndOffset,
+}) {
+  return new Field.immutable(
+      name,
+      type: type,
+      isLate: isLate,
+      isFinal: isFinal,
+      isConst: isConst,
+      isStatic: isStatic,
+      fileUri: fileUri,
+      fieldReference: fieldReference,
+      getterReference: getterReference,
+      isEnumElement: isEnumElement,
+    )
+    ..fileOffset = fileOffset
+    ..fileEndOffset = fileEndOffset;
+}
+
 /// Creates an initialized (but mutable) [VariableDeclaration] of the static
 /// [type].
 VariableDeclaration createInitializedVariable(
@@ -147,48 +373,136 @@
   )..fileOffset = fileOffset;
 }
 
-/// Creates a [VariableDeclaration] for [expression] with the static [type]
-/// using `expression.fileOffset` as the file offset for the declaration.
-// TODO(johnniwinther): Merge the use of this with [createVariableCache].
-VariableDeclaration createVariable(Expression expression, DartType type) {
-  assert(expression is! ThisExpression);
-  return new VariableDeclaration.forValue(expression, type: type)
-    ..fileOffset = expression.fileOffset;
-}
-
-/// Creates a [VariableGet] of [variable] using `variable.fileOffset` as the
-/// file offset for the expression.
-VariableGet createVariableGet(
-  VariableDeclaration variable, {
-  DartType? promotedType,
-}) {
-  return new VariableGet(variable)
-    ..fileOffset = variable.fileOffset
-    ..promotedType = promotedType != variable.type ? promotedType : null;
-}
-
-/// Creates a [VariableSet] of [variable] with the [value].
-Expression createVariableSet(
-  VariableDeclaration variable,
-  Expression value, {
-  bool allowFinalAssignment = false,
+InstanceGet createInstanceGet(
+  InstanceAccessKind kind,
+  Expression receiver,
+  Name name, {
+  required Member interfaceTarget,
+  required DartType resultType,
   required int fileOffset,
 }) {
-  if (variable is VariableDeclarationImpl && variable.lateSetter != null) {
-    return createLocalFunctionInvocation(
-      variable.lateSetter!,
-      arguments: createArguments([value], fileOffset: fileOffset),
-      fileOffset: fileOffset,
-    );
+  return new InstanceGet(
+    kind,
+    receiver,
+    name,
+    interfaceTarget: interfaceTarget,
+    resultType: resultType,
+  )..fileOffset = fileOffset;
+}
+
+InstanceInvocation createInstanceInvocation(
+  InstanceAccessKind kind,
+  Expression receiver,
+  Name name,
+  Arguments arguments, {
+  required Procedure interfaceTarget,
+  required FunctionType functionType,
+  required int fileOffset,
+}) {
+  return new InstanceInvocation(
+    kind,
+    receiver,
+    name,
+    arguments,
+    interfaceTarget: interfaceTarget,
+    functionType: functionType,
+  )..fileOffset = fileOffset;
+}
+
+InstanceSet createInstanceSet(
+  InstanceAccessKind kind,
+  Expression receiver,
+  Name name,
+  Expression value, {
+  required Member interfaceTarget,
+  required int fileOffset,
+}) {
+  return new InstanceSet(
+    kind,
+    receiver,
+    name,
+    value,
+    interfaceTarget: interfaceTarget,
+  )..fileOffset = fileOffset;
+}
+
+/// Creates an integer literal of [value].
+///
+/// If [encodeForWeb] is `true`, negative values are encoded using unary-. This
+/// should be done if the [value] isn't known to be a valid negative number in
+/// the web encoding.
+Expression createIntLiteral(
+  CoreTypes coreTypes,
+  int value, {
+  required int fileOffset,
+  bool encodeForWeb = true,
+}) {
+  if (encodeForWeb && value < 0) {
+    /// The web backends need this to be encoded as a unary minus on the
+    /// positive value.
+    return new InstanceInvocation(
+      InstanceAccessKind.Instance,
+      new IntLiteral(-value)..fileOffset = fileOffset,
+      unaryMinusName,
+      new Arguments([])..fileOffset = fileOffset,
+      interfaceTarget: coreTypes.intUnaryMinus,
+      functionType: coreTypes.intUnaryMinus.getterType as FunctionType,
+    )..fileOffset = fileOffset;
   } else {
-    assert(
-      allowFinalAssignment || variable.isAssignable,
-      "Cannot assign to variable $variable",
-    );
-    return new VariableSet(variable, value)..fileOffset = fileOffset;
+    return new IntLiteral(value)..fileOffset = fileOffset;
   }
 }
 
+InvalidExpression createInvalidExpression(
+  String message, {
+  Expression? expression,
+  required int fileOffset,
+}) {
+  return new InvalidExpression(message, expression)..fileOffset = fileOffset;
+}
+
+InvalidInitializer createInvalidInitializer(
+  InvalidExpression expression, {
+  bool isSuperInitializer = false,
+  bool isRedirectingInitializer = false,
+}) {
+  return new InvalidInitializer(expression.message)
+    ..fileOffset = expression.fileOffset
+    ..isSuperInitializer = isSuperInitializer
+    ..isRedirectingInitializer = isRedirectingInitializer;
+}
+
+/// Creates an is-test on [operand] against [type].
+IsExpression createIsExpression(
+  Expression operand,
+  DartType type, {
+  required int fileOffset,
+}) {
+  return new IsExpression(operand, type)..fileOffset = fileOffset;
+}
+
+/// Creates a labeled statement that serves as a label for [statement].
+LabeledStatement createLabeledStatement(
+  Statement statement, {
+  required int fileOffset,
+}) {
+  return new LabeledStatement(statement)..fileOffset = fileOffset;
+}
+
+/// Creates a [Let] of [variable] with the given [body] using
+/// `variable.fileOffset` as the file offset for the let.
+Let createLet(VariableDeclaration variable, Expression body) {
+  return new Let(variable, body)..fileOffset = variable.fileOffset;
+}
+
+/// Creates a [Let] with the [effect] as the variable initializer and the
+/// [result] as the body of the [Let] expression and using
+/// `effect.fileOffset` as the file offset for the let.
+Let createLetEffect({required Expression effect, required Expression result}) {
+  return new Let(createVariableCache(effect, const DynamicType()), result)
+    ..fileOffset = effect.fileOffset;
+}
+
 /// Creates an invocation of the local function [variable] with the provided
 /// [arguments].
 LocalFunctionInvocation createLocalFunctionInvocation(
@@ -205,19 +519,98 @@
   )..fileOffset = fileOffset;
 }
 
+// Coverage-ignore(suite): Not run.
+MapLiteralEntry createMapLiteralEntry(
+  Expression key,
+  Expression value, {
+  required int fileOffset,
+}) {
+  return new MapLiteralEntry(key, value)..fileOffset = fileOffset;
+}
+
+Field createMutableField(
+  Name name, {
+  DartType type = const DynamicType(),
+  bool isLate = false,
+  bool isFinal = false,
+  bool isStatic = false,
+  required Uri fileUri,
+  Reference? fieldReference,
+  Reference? getterReference,
+  Reference? setterReference,
+  required int fileOffset,
+  required int fileEndOffset,
+  bool isInternalImplementation = false,
+}) {
+  return new Field.mutable(
+      name,
+      type: type,
+      isLate: isLate,
+      isFinal: isFinal,
+      isStatic: isStatic,
+      fileUri: fileUri,
+      fieldReference: fieldReference,
+      getterReference: getterReference,
+      setterReference: setterReference,
+    )
+    ..fileOffset = fileOffset
+    ..fileEndOffset = fileEndOffset
+    ..isInternalImplementation = isInternalImplementation;
+}
+
+NamedExpression createNamedExpression(
+  String name,
+  Expression expression, {
+  int? fileOffset,
+}) {
+  return new NamedExpression(name, expression)
+    ..fileOffset = fileOffset ?? expression.fileOffset;
+}
+
+NamedParameter createNamedParameter({
+  required String parameterName,
+  required DartType type,
+  Expression? defaultValue,
+  bool isCovariantByDeclaration = false,
+  bool isRequired = false,
+  bool isInitializingFormal = false,
+  bool isSuperInitializingFormal = false,
+  bool isFinal = false,
+  bool hasDeclaredDefaultType = false,
+  bool isLowered = false,
+  bool isSynthesized = false,
+  bool isWildcard = false,
+  required int fileOffset,
+}) {
+  return new NamedParameter(
+    parameterName: parameterName,
+    type: type,
+    defaultValue: defaultValue,
+    isCovariantByDeclaration: isCovariantByDeclaration,
+    isRequired: isRequired,
+    isInitializingFormal: isInitializingFormal,
+    isSuperInitializingFormal: isSuperInitializingFormal,
+    isFinal: isFinal,
+    hasDeclaredDefaultType: hasDeclaredDefaultType,
+    isLowered: isLowered,
+    isSynthesized: isSynthesized,
+    isWildcard: isWildcard,
+  )..fileOffset = fileOffset;
+}
+
 /// Creates a [Not] of [operand].
 Not createNot(Expression operand) {
   return new Not(operand)..fileOffset = operand.fileOffset;
 }
 
-/// Creates a logical and expression of [left] and [right].
-LogicalExpression createAndExpression(
-  Expression left,
-  Expression right, {
-  required int fileOffset,
-}) {
-  return new LogicalExpression(left, LogicalExpressionOperator.AND, right)
-    ..fileOffset = fileOffset;
+/// Creates a [NullCheck] of [expression].
+NullCheck createNullCheck(Expression expression, {required int fileOffset}) {
+  return new NullCheck(expression)..fileOffset = fileOffset;
+}
+
+/// Creates a null literal.
+NullLiteral createNullLiteral({required int fileOffset}) {
+  return new NullLiteral()..fileOffset = fileOffset;
 }
 
 /// Creates a logical or expression of [left] and [right].
@@ -230,95 +623,175 @@
     ..fileOffset = fileOffset;
 }
 
-/// Creates an is-test on [operand] against [type].
-IsExpression createIsExpression(
-  Expression operand,
-  DartType type, {
+// TODO(johnniwinther): Should this require a type?
+VariableDeclaration createParameterVariable(
+  String? name, {
+  DartType type = const DynamicType(),
   required int fileOffset,
+  bool isCovariantByDeclaration = false,
+  bool isCovariantByClass = false,
+  bool isLowered = false,
+  bool isSynthesized = false,
+  bool isFinal = false,
+  bool isRequired = false,
+  Expression? initializer,
+  bool hasDeclaredInitializer = false,
 }) {
-  return new IsExpression(operand, type)..fileOffset = fileOffset;
-}
-
-/// Creates an as-cast on [operand] against [type].
-AsExpression createAsExpression(
-  Expression operand,
-  DartType type, {
-  required bool forNonNullableByDefault,
-  bool isUnchecked = false,
-  bool isCovarianceCheck = false,
-  required int fileOffset,
-}) {
-  return new AsExpression(operand, type)
+  return new VariableDeclaration(
+      name,
+      type: type,
+      isCovariantByDeclaration: isCovariantByDeclaration,
+      isLowered: isLowered,
+      isSynthesized: isSynthesized,
+      isFinal: isFinal,
+      isRequired: isRequired,
+      initializer: initializer,
+      hasDeclaredInitializer: hasDeclaredInitializer,
+    )
     ..fileOffset = fileOffset
-    ..isUnchecked = isUnchecked
-    ..isCovarianceCheck = isCovarianceCheck;
+    ..isCovariantByClass = isCovariantByClass;
 }
 
-/// Creates a [NullCheck] of [expression].
-NullCheck createNullCheck(Expression expression, {required int fileOffset}) {
-  return new NullCheck(expression)..fileOffset = fileOffset;
+PositionalParameter createPositionalParameter({
+  String? cosmeticName,
+  required DartType type,
+  Expression? defaultValue,
+  bool isCovariantByDeclaration = false,
+  bool isRequired = false,
+  bool isInitializingFormal = false,
+  bool isSuperInitializingFormal = false,
+  bool isFinal = false,
+  bool hasDeclaredDefaultType = false,
+  bool isLowered = false,
+  bool isSynthesized = false,
+  bool isWildcard = false,
+  required int fileOffset,
+}) {
+  return new PositionalParameter(
+    cosmeticName: cosmeticName,
+    type: type,
+    defaultValue: defaultValue,
+    isCovariantByDeclaration: isCovariantByDeclaration,
+    isRequired: isRequired,
+    isInitializingFormal: isInitializingFormal,
+    isSuperInitializingFormal: isSuperInitializingFormal,
+    isFinal: isFinal,
+    hasDeclaredDefaultType: hasDeclaredDefaultType,
+    isLowered: isLowered,
+    isSynthesized: isSynthesized,
+    isWildcard: isWildcard,
+  )..fileOffset = fileOffset;
 }
 
-/// Creates a block expression using [body] as the body and [value] as the
-/// resulting value.
-BlockExpression createBlockExpression(
-  Block body,
+Procedure createProcedure(
+  Name name,
+  ProcedureKind kind,
+  FunctionNode function, {
+  Reference? reference,
+  ProcedureStubKind stubKind = ProcedureStubKind.Regular,
+  Member? stubTarget,
+  required Uri fileUri,
+  required int fileOffset,
+  int fileStartOffset = TreeNode.noOffset,
+  required int fileEndOffset,
+  bool isAbstract = false,
+  bool isExternal = false,
+  bool isStatic = false,
+  bool isConst = false,
+  bool isExtensionMember = false,
+  bool isExtensionTypeMember = false,
+  bool isSynthetic = false,
+}) {
+  return new Procedure(
+      name,
+      kind,
+      function,
+      stubKind: stubKind,
+      stubTarget: stubTarget,
+      fileUri: fileUri,
+      reference: reference,
+      isAbstract: isAbstract,
+      isExternal: isExternal,
+      isConst: isConst,
+      isStatic: isStatic,
+      isExtensionMember: isExtensionMember,
+      isExtensionTypeMember: isExtensionTypeMember,
+      isSynthetic: isSynthetic,
+    )
+    ..fileStartOffset = fileStartOffset
+    ..fileOffset = fileOffset
+    ..fileEndOffset = fileEndOffset;
+}
+
+ReturnStatement createReturnStatement(
+  Expression expression, {
+  int? fileOffset,
+}) {
+  return new ReturnStatement(expression)
+    ..fileOffset = fileOffset ?? expression.fileOffset;
+}
+
+StaticGet createStaticGet(Member member, {required int fileOffset}) {
+  return new StaticGet(member)..fileOffset = fileOffset;
+}
+
+/// Creates a static invocation of [target] with the given arguments.
+StaticInvocation createStaticInvocation(
+  Procedure target,
+  Arguments arguments, {
+  required int fileOffset,
+  bool isConst = false,
+}) {
+  return new StaticInvocation(target, arguments, isConst: isConst)
+    ..fileOffset = fileOffset;
+}
+
+StaticSet createStaticSet(
+  Member member,
   Expression value, {
   required int fileOffset,
 }) {
-  return new BlockExpression(body, value)..fileOffset = fileOffset;
+  return new StaticSet(member, value)..fileOffset = fileOffset;
 }
 
-/// Creates a throw of [expression] using the file offset of [expression] for
-/// the throw expression.
-Throw createThrow(Expression expression, {bool forErrorHandling = false}) {
-  return new Throw(expression)
-    ..fileOffset = expression.fileOffset
-    ..forErrorHandling = forErrorHandling;
+StaticTearOff createStaticTearOff(Procedure target, {required int fileOffset}) {
+  return new StaticTearOff(target)..fileOffset = fileOffset;
 }
 
-/// Creates an [ExpressionStatement] of [expression] using the file offset of
-/// [expression] for the file offset of the statement.
-ExpressionStatement createExpressionStatement(Expression expression) {
-  return new ExpressionStatement(expression)
-    ..fileOffset = expression.fileOffset;
+/// Creates a string literal of [value].
+StringLiteral createStringLiteral(String value, {required int fileOffset}) {
+  return new StringLiteral(value)..fileOffset = fileOffset;
 }
 
-/// Creates an if statement with the [condition], [then] branch and [otherwise]
-/// as the optional else branch.
-IfStatement createIfStatement(
-  Expression condition,
-  Statement then, {
-  Statement? otherwise,
+/// Creates a super method invocation of [target] with the given arguments.
+SuperMethodInvocation createSuperMethodInvocation(
+  Expression receiver,
+  Name name,
+  Procedure target,
+  Arguments arguments, {
   required int fileOffset,
 }) {
-  return new IfStatement(condition, then, otherwise)..fileOffset = fileOffset;
+  return new SuperMethodInvocation(receiver, name, arguments, target)
+    ..fileOffset = fileOffset;
 }
 
-/// Creates a break statement with the given [target].
-BreakStatement createBreakStatement(
-  LabeledStatement target, {
+SuperPropertyGet createSuperPropertyGet(
+  Expression receiver,
+  Name name,
+  Member target, {
   required int fileOffset,
 }) {
-  return new BreakStatement(target)..fileOffset = fileOffset;
+  return new SuperPropertyGet(receiver, name, target)..fileOffset = fileOffset;
 }
 
-/// Creates a block containing the [statements].
-Block createBlock(List<Statement> statements, {required int fileOffset}) {
-  return new Block(statements)
-    ..fileOffset = fileOffset
-    ..fileEndOffset = fileOffset;
-}
-
-/// Creates an [Arguments] object for the [positional] and [named] arguments,
-/// and [types] as the type arguments.
-Arguments createArguments(
-  List<Expression> positional, {
-  List<DartType>? types,
-  List<NamedExpression>? named,
+SuperPropertySet createSuperPropertySet(
+  Expression receiver,
+  Name name,
+  Member target,
+  Expression value, {
   required int fileOffset,
 }) {
-  return new Arguments(positional, types: types, named: named)
+  return new SuperPropertySet(receiver, name, value, target)
     ..fileOffset = fileOffset;
 }
 
@@ -360,21 +833,86 @@
     ..fileOffset = fileOffset;
 }
 
-/// Creates a labeled statement that serves as a label for [statement].
-LabeledStatement createLabeledStatement(
-  Statement statement, {
-  required int fileOffset,
-}) {
-  return new LabeledStatement(statement)..fileOffset = fileOffset;
+ThisExpression createThisExpression({required int fileOffset}) {
+  return new ThisExpression()..fileOffset = fileOffset;
 }
 
-InvalidInitializer createInvalidInitializer(
-  InvalidExpression expression, {
-  bool isSuperInitializer = false,
-  bool isRedirectingInitializer = false,
+/// Creates a throw of [expression] using the file offset of [expression] for
+/// the throw expression.
+Throw createThrow(
+  Expression expression, {
+  bool forErrorHandling = false,
+  int? fileOffset,
 }) {
-  return new InvalidInitializer(expression.message)
-    ..fileOffset = expression.fileOffset
-    ..isSuperInitializer = isSuperInitializer
-    ..isRedirectingInitializer = isRedirectingInitializer;
+  return new Throw(expression)
+    ..fileOffset = fileOffset ?? expression.fileOffset
+    ..forErrorHandling = forErrorHandling;
+}
+
+TypeParameter createTypeParameter(String? name, {required int fileOffset}) {
+  return new TypeParameter(name)..fileOffset = fileOffset;
+}
+
+/// Creates an uninitialized [VariableDeclaration] of the static [type].
+VariableDeclaration createUninitializedVariable(
+  DartType type, {
+  required int fileOffset,
+  bool isFinal = false,
+}) {
+  return new VariableDeclaration(
+    null,
+    type: type,
+    isSynthesized: true,
+    isFinal: isFinal,
+  )..fileOffset = fileOffset;
+}
+
+/// Creates a [VariableDeclaration] for [expression] with the static [type]
+/// using `expression.fileOffset` as the file offset for the declaration.
+// TODO(johnniwinther): Merge the use of this with [createVariableCache].
+VariableDeclaration createVariable(Expression expression, DartType type) {
+  assert(expression is! ThisExpression);
+  return new VariableDeclaration.forValue(expression, type: type)
+    ..fileOffset = expression.fileOffset;
+}
+
+/// Creates a [VariableDeclaration] for caching [expression] of the static
+/// [type] using `expression.fileOffset` as the file offset for the declaration.
+VariableDeclaration createVariableCache(Expression expression, DartType type) {
+  return new VariableDeclaration.forValue(expression, type: type)
+    ..fileOffset = expression.fileOffset;
+}
+
+/// Creates a [VariableGet] of [variable] using `variable.fileOffset` as the
+/// file offset for the expression.
+VariableGet createVariableGet(
+  VariableDeclaration variable, {
+  DartType? promotedType,
+  int? fileOffset,
+}) {
+  return new VariableGet(variable)
+    ..fileOffset = fileOffset ?? variable.fileOffset
+    ..promotedType = promotedType != variable.type ? promotedType : null;
+}
+
+/// Creates a [VariableSet] of [variable] with the [value].
+Expression createVariableSet(
+  VariableDeclaration variable,
+  Expression value, {
+  bool allowFinalAssignment = false,
+  required int fileOffset,
+}) {
+  if (variable is VariableDeclarationImpl && variable.lateSetter != null) {
+    return createLocalFunctionInvocation(
+      variable.lateSetter!,
+      arguments: createArguments([value], fileOffset: fileOffset),
+      fileOffset: fileOffset,
+    );
+  } else {
+    assert(
+      allowFinalAssignment || variable.isAssignable,
+      "Cannot assign to variable $variable",
+    );
+    return new VariableSet(variable, value)..fileOffset = fileOffset;
+  }
 }
diff --git a/pkg/front_end/lib/src/kernel/forwarding_node.dart b/pkg/front_end/lib/src/kernel/forwarding_node.dart
index dee458c..7713f10 100644
--- a/pkg/front_end/lib/src/kernel/forwarding_node.dart
+++ b/pkg/front_end/lib/src/kernel/forwarding_node.dart
@@ -13,6 +13,7 @@
 import '../builder/declaration_builders.dart';
 import '../source/source_library_builder.dart';
 import 'combined_member_signature.dart';
+import 'external_ast_helper.dart' as extern;
 import 'hierarchy/class_member.dart';
 import 'kernel_helper.dart';
 import 'kernel_target.dart';
@@ -354,8 +355,7 @@
             VariableDeclaration parameter =
                 function.positionalParameters[index];
             int fileOffset = parameter.fileOffset;
-            Expression expression = new VariableGet(parameter)
-              ..fileOffset = fileOffset;
+            Expression expression = extern.createVariableGet(parameter);
             DartType superParameterType = type.positionalParameters[index];
             if (isForwardingSemiStub) {
               if (parameter.type != superParameterType) {
@@ -367,8 +367,11 @@
                 parameter.type,
                 superParameterType,
               )) {
-                expression = new AsExpression(expression, superParameterType)
-                  ..fileOffset = fileOffset;
+                expression = extern.createAsExpression(
+                  expression,
+                  superParameterType,
+                  fileOffset: fileOffset,
+                );
               }
             }
             return expression;
@@ -380,8 +383,7 @@
           (int index) {
             VariableDeclaration parameter = function.namedParameters[index];
             int fileOffset = parameter.fileOffset;
-            Expression expression = new VariableGet(parameter)
-              ..fileOffset = fileOffset;
+            Expression expression = extern.createVariableGet(parameter);
             DartType superParameterType = type.namedParameters
                 .singleWhere(
                   (NamedType namedType) => namedType.name == parameter.name,
@@ -397,11 +399,14 @@
                 parameter.type,
                 superParameterType,
               )) {
-                expression = new AsExpression(expression, superParameterType)
-                  ..fileOffset = fileOffset;
+                expression = extern.createAsExpression(
+                  expression,
+                  superParameterType,
+                  fileOffset: fileOffset,
+                );
               }
             }
-            return new NamedExpression(parameter.name!, expression);
+            return extern.createNamedExpression(parameter.name!, expression);
           },
           growable: true,
         );
@@ -411,23 +416,26 @@
                   new TypeParameterType.withDefaultNullability(typeParameter),
             )
             .toList();
-        Arguments arguments = new Arguments(
+        Arguments arguments = extern.createArguments(
           positionalArguments,
           types: typeArguments,
           named: namedArguments,
+          fileOffset: procedure.fileOffset,
         );
-        superCall = new SuperMethodInvocation(
-          new ThisExpression(),
+        superCall = extern.createSuperMethodInvocation(
+          extern.createThisExpression(fileOffset: procedure.fileOffset),
           name,
-          arguments,
           superTarget as Procedure,
+          arguments,
+          fileOffset: procedure.fileOffset,
         );
         break;
       case ProcedureKind.Getter:
-        superCall = new SuperPropertyGet(
-          new ThisExpression(),
+        superCall = extern.createSuperPropertyGet(
+          extern.createThisExpression(fileOffset: procedure.fileOffset),
           name,
           superTarget,
+          fileOffset: procedure.fileOffset,
         );
         break;
       case ProcedureKind.Setter:
@@ -435,8 +443,7 @@
             .getMemberTypeForTarget(superTarget);
         VariableDeclaration parameter = function.positionalParameters[0];
         int fileOffset = parameter.fileOffset;
-        Expression expression = new VariableGet(parameter)
-          ..fileOffset = fileOffset;
+        Expression expression = extern.createVariableGet(parameter);
         if (isForwardingSemiStub) {
           if (parameter.type != superParameterType) {
             parameter.type = superParameterType;
@@ -447,15 +454,19 @@
             parameter.type,
             superParameterType,
           )) {
-            expression = new AsExpression(expression, superParameterType)
-              ..fileOffset = fileOffset;
+            expression = extern.createAsExpression(
+              expression,
+              superParameterType,
+              fileOffset: fileOffset,
+            );
           }
         }
-        superCall = new SuperPropertySet(
-          new ThisExpression(),
+        superCall = extern.createSuperPropertySet(
+          extern.createThisExpression(fileOffset: fileOffset),
           name,
-          expression,
           superTarget,
+          expression,
+          fileOffset: fileOffset,
         );
         break;
       // Coverage-ignore(suite): Not run.
@@ -463,7 +474,7 @@
         unhandled('$kind', '_createForwardingImplIfNeeded', -1, null);
     }
     function.registerFunctionBody(
-      new ReturnStatement(superCall)..fileOffset = procedure.fileOffset,
+      extern.createReturnStatement(superCall, fileOffset: procedure.fileOffset),
     );
     procedure.transformerFlags |= TransformerFlag.superCalls;
     procedure.stubKind = isForwardingStub
@@ -505,38 +516,48 @@
     CoreTypes coreTypes = target.loader.coreTypes;
     Expression invocation = target.backendTarget.instantiateInvocation(
       coreTypes,
-      new ThisExpression(),
+      extern.createThisExpression(fileOffset: procedure.fileOffset),
       invocationName,
-      new Arguments.forwarded(procedure.function, libraryBuilder.library),
+      extern.createArgumentsForwarded(
+        procedure.function,
+        fileOffset: procedure.fileOffset,
+      ),
       procedure.fileOffset,
       /*isSuper=*/ false,
     );
     if (shouldThrow) {
       // Build `throw new NoSuchMethodError(this, invocation)`.
-      result =
-          new Throw(
-              new StaticInvocation(
-                coreTypes.noSuchMethodErrorDefaultConstructor,
-                new Arguments([new ThisExpression(), invocation]),
-              ),
-            )
-            ..fileOffset = procedure.fileOffset
-            ..forErrorHandling = true;
+      result = extern.createThrow(
+        extern.createStaticInvocation(
+          coreTypes.noSuchMethodErrorDefaultConstructor,
+          extern.createArguments([
+            extern.createThisExpression(fileOffset: procedure.fileOffset),
+            invocation,
+          ], fileOffset: procedure.fileOffset),
+          fileOffset: procedure.fileOffset,
+        ),
+        fileOffset: procedure.fileOffset,
+        forErrorHandling: true,
+      );
     } else {
       // Build `this.noSuchMethod(invocation)`.
-      result = new InstanceInvocation(
+      result = extern.createInstanceInvocation(
         InstanceAccessKind.Instance,
-        new ThisExpression(),
+        extern.createThisExpression(fileOffset: procedure.fileOffset),
         noSuchMethodName,
-        new Arguments([invocation]),
+        extern.createArguments([invocation], fileOffset: procedure.fileOffset),
         functionType: noSuchMethodInterface.getterType as FunctionType,
         interfaceTarget: noSuchMethodInterface,
-      )..fileOffset = procedure.fileOffset;
+        fileOffset: procedure.fileOffset,
+      );
       if (procedure.function.returnType is! VoidType) {
-        result = new AsExpression(result, procedure.function.returnType)
-          ..isTypeError = true
-          ..isForDynamic = true
-          ..fileOffset = procedure.fileOffset;
+        result = extern.createAsExpression(
+          result,
+          procedure.function.returnType,
+          isTypeError: true,
+          isForDynamic: true,
+          fileOffset: procedure.fileOffset,
+        );
       }
     }
 
@@ -587,7 +608,7 @@
       procedure.signatureType = signatureType;
     }
     procedure.function.registerFunctionBody(
-      new ReturnStatement(result)..fileOffset = procedure.fileOffset,
+      extern.createReturnStatement(result, fileOffset: procedure.fileOffset),
     );
 
     procedure.isAbstract = false;
diff --git a/pkg/front_end/lib/src/kernel/internal_ast.dart b/pkg/front_end/lib/src/kernel/internal_ast.dart
index fde6f01..f25b4ce 100644
--- a/pkg/front_end/lib/src/kernel/internal_ast.dart
+++ b/pkg/front_end/lib/src/kernel/internal_ast.dart
@@ -21,6 +21,7 @@
 
 import 'package:_fe_analyzer_shared/src/type_inference/type_analysis_result.dart'
     as shared;
+import 'package:_fe_analyzer_shared/src/types/shared_type.dart';
 import 'package:kernel/ast.dart';
 import 'package:kernel/names.dart';
 import 'package:kernel/src/printer.dart';
@@ -29,8 +30,14 @@
 
 import '../base/problems.dart' show unsupported;
 import '../builder/declaration_builders.dart';
+import '../codes/diagnostic.dart' as diag;
 import '../type_inference/inference_results.dart';
 import '../type_inference/inference_visitor.dart';
+import '../type_inference/inference_visitor_base.dart';
+import '../type_inference/type_schema.dart';
+import 'external_ast_helper.dart' as extern;
+
+/// @docImport 'package:_fe_analyzer_shared/src/flow_analysis/flow_analysis.dart';
 
 typedef SharedMatchContext =
     shared.MatchContext<TreeNode, Expression, Pattern, VariableDeclaration>;
@@ -98,49 +105,6 @@
   StatementInferenceResult acceptInference(InferenceVisitorImpl visitor);
 }
 
-class ForInStatementWithSynthesizedVariable extends InternalStatement {
-  VariableDeclaration? variable;
-  Expression iterable;
-  Expression? syntheticAssignment;
-  Statement? expressionEffects;
-  Statement body;
-  final bool isAsync;
-  final bool hasProblem;
-  int bodyOffset = TreeNode.noOffset;
-
-  ForInStatementWithSynthesizedVariable(
-    this.variable,
-    this.iterable,
-    this.syntheticAssignment,
-    this.expressionEffects,
-    this.body, {
-    required this.isAsync,
-    required this.hasProblem,
-  }) {
-    variable?.parent = this;
-    iterable.parent = this;
-    syntheticAssignment?.parent = this;
-    expressionEffects?.parent = this;
-    body.parent = this;
-  }
-
-  @override
-  StatementInferenceResult acceptInference(InferenceVisitorImpl visitor) {
-    return visitor.visitForInStatementWithSynthesizedVariable(this);
-  }
-
-  @override
-  String toString() {
-    return "ForInStatementWithSynthesizedVariable(${toStringInternal()})";
-  }
-
-  @override
-  // Coverage-ignore(suite): Not run.
-  void toTextInternal(AstPrinter state) {
-    // TODO(johnniwinther): Implement this.
-  }
-}
-
 class TryStatement extends InternalStatement {
   Statement tryBlock;
   List<Catch> catchBlocks;
@@ -246,8 +210,9 @@
       unsupported("${runtimeType}.transformChildren", -1, null);
 
   @override
-  void transformOrRemoveChildren(RemovingTransformer v) =>
-      unsupported("${runtimeType}.transformOrRemoveChildren", -1, null);
+  void transformOrRemoveChildren(RemovingTransformer v) {
+    unsupported("${runtimeType}.transformOrRemoveChildren", -1, null);
+  }
 
   ExpressionInferenceResult acceptInference(
     InferenceVisitorImpl visitor,
@@ -439,11 +404,12 @@
     List<Expression> positionalArguments,
     List<NamedExpression> namedArguments,
   ) {
-    return new Arguments(
+    return extern.createArguments(
       positionalArguments,
       types: typeArguments,
       named: namedArguments,
-    )..fileOffset = fileOffset;
+      fileOffset: fileOffset,
+    );
   }
 
   @override
@@ -551,9 +517,10 @@
 class AnonymousMethodExpression extends InternalExpression {
   VariableDeclaration variable;
   Expression body;
+  final bool isCascade;
   final bool isImplicitlyTyped;
   final bool isNullAware;
-  final bool isCascade;
+  final bool isParameterless;
   final int typeOffset;
 
   AnonymousMethodExpression(
@@ -563,7 +530,7 @@
     required this.isNullAware,
     required this.isCascade,
     required this.typeOffset,
-  }) {
+  }) : isParameterless = variable.isSynthesized {
     variable.parent = this;
     body.parent = this;
   }
@@ -598,9 +565,10 @@
   VariableDeclaration variable;
   Expression expression;
 
-  DeferredCheck(this.variable, this.expression) {
+  DeferredCheck(this.variable, this.expression, {required int fileOffset}) {
     variable.parent = this;
     expression.parent = this;
+    this.fileOffset = fileOffset;
   }
 
   @override
@@ -626,17 +594,6 @@
   }
 }
 
-/// Common base class for shadow objects representing expressions in kernel
-/// form.
-abstract class ExpressionJudgment extends AuxiliaryExpression {
-  /// Calls back to [inferrer] to perform type inference for whatever concrete
-  /// type of [Expression] this is.
-  ExpressionInferenceResult acceptInference(
-    InferenceVisitorImpl visitor,
-    DartType typeContext,
-  );
-}
-
 /// Internal expression for an invocation of a factory constructor.
 class FactoryConstructorInvocation extends InternalExpression {
   bool hasBeenInferred = false;
@@ -850,13 +807,17 @@
 }
 
 /// Concrete shadow object representing an integer literal in kernel form.
-class IntJudgment extends IntLiteral implements ExpressionJudgment {
+class InternalIntLiteral extends InternalExpression {
+  final int value;
+
   /// The literal text of the number, as it appears in the source, which may
   /// include digit separators (and may not be safe for parsing with
   /// `int.parse`).
   final String? literal;
 
-  IntJudgment(int value, this.literal) : super(value);
+  InternalIntLiteral(this.value, this.literal, {required int fileOffset}) {
+    this.fileOffset = fileOffset;
+  }
 
   double? asDouble({bool negated = false}) {
     if (value == 0 && negated) {
@@ -872,12 +833,12 @@
     InferenceVisitorImpl visitor,
     DartType typeContext,
   ) {
-    return visitor.visitIntJudgment(this, typeContext);
+    return visitor.visitInternalIntLiteral(this, typeContext);
   }
 
   @override
   String toString() {
-    return "IntJudgment(${toStringInternal()})";
+    return "InternalIntLiteral(${toStringInternal()})";
   }
 
   @override
@@ -891,18 +852,22 @@
   }
 }
 
-class ShadowLargeIntLiteral extends IntLiteral implements ExpressionJudgment {
+class LargeIntLiteral extends InternalExpression {
   /// The parsable String source, stripped of any digit separators.
   final String _strippedLiteral;
 
   /// The original textual source, possibly with digit separators.
   final String literal;
-  @override
-  final int fileOffset;
+
   bool isParenthesized = false;
 
-  ShadowLargeIntLiteral(this._strippedLiteral, this.literal, this.fileOffset)
-    : super(0);
+  LargeIntLiteral(
+    this._strippedLiteral,
+    this.literal, {
+    required int fileOffset,
+  }) {
+    this.fileOffset = fileOffset;
+  }
 
   double? asDouble({bool negated = false}) {
     BigInt? intValue = BigInt.tryParse(
@@ -928,12 +893,12 @@
     InferenceVisitorImpl visitor,
     DartType typeContext,
   ) {
-    return visitor.visitShadowLargeIntLiteral(this, typeContext);
+    return visitor.visitLargeIntLiteral(this, typeContext);
   }
 
   @override
   String toString() {
-    return "ShadowLargeIntLiteral(${toStringInternal()})";
+    return "LargeIntLiteral(${toStringInternal()})";
   }
 
   @override
@@ -1038,6 +1003,8 @@
     bool isStaticLate = false,
     bool isWildcard = false,
     bool isLateFinalWithoutInitializer = false,
+    required int fileOffset,
+    int fileEqualsOffset = TreeNode.noOffset,
   }) : isImplicitlyTyped = type == null,
        isLocalFunction = isLocalFunction,
        super(
@@ -1058,6 +1025,8 @@
        ) {
     this.isStaticLate = isStaticLate;
     this.isLateFinalWithoutInitializer = isLateFinalWithoutInitializer;
+    this.fileOffset = fileOffset;
+    this.fileEqualsOffset = fileEqualsOffset;
   }
 
   VariableDeclarationImpl.forEffect(Expression initializer)
@@ -1119,7 +1088,10 @@
     required this.isImplicitlyTyped,
     this.forSyntheticToken = false,
     this.isLocalFunction = false,
-  });
+    required int fileOffset,
+  }) {
+    this.fileOffset = fileOffset;
+  }
 
   @override
   // Coverage-ignore(suite): Not run.
@@ -1166,7 +1138,6 @@
   int fileEqualsOffset = TreeNode.noOffset;
 
   @override
-  // Coverage-ignore(suite): Not run.
   VariableDeclaration get variable => this;
 
   @override
@@ -1201,16 +1172,19 @@
     required this.isImplicitlyTyped,
     this.forSyntheticToken = false,
     this.isLocalFunction = false,
-  });
+    required int fileOffset,
+  }) {
+    this.fileOffset = fileOffset;
+  }
 
   @override
-  // TODO(62620): Conforming to [VariableInitialization] interface. Remove this.
+  // TODO(62620): Conforming to [VariableDeclaration] interface. Remove this.
   List<VariableContext>? get capturedContexts {
     throw new UnsupportedError("${this.runtimeType}.capturedContexts");
   }
 
   @override
-  // TODO(62620): Conforming to [VariableInitialization] interface. Remove this.
+  // TODO(62620): Conforming to [VariableDeclaration] interface. Remove this.
   void set capturedContexts(List<VariableContext>? value) {
     throw new UnsupportedError("${this.runtimeType}.capturedContexts=");
   }
@@ -1304,16 +1278,19 @@
     required this.isImplicitlyTyped,
     this.forSyntheticToken = false,
     this.isLocalFunction = false,
-  });
+    required int fileOffset,
+  }) {
+    this.fileOffset = fileOffset;
+  }
 
   @override
-  // TODO(62620): Conforming to [VariableInitialization] interface. Remove this.
+  // TODO(62620): Conforming to [VariableDeclaration] interface. Remove this.
   List<VariableContext>? get capturedContexts {
     throw new UnsupportedError("${this.runtimeType}.capturedContexts");
   }
 
   @override
-  // TODO(62620): Conforming to [VariableInitialization] interface. Remove this.
+  // TODO(62620): Conforming to [VariableDeclaration] interface. Remove this.
   void set capturedContexts(List<VariableContext>? value) {
     throw new UnsupportedError("${this.runtimeType}.capturedContexts=");
   }
@@ -1426,7 +1403,10 @@
     required this.isImplicitlyTyped,
     this.forSyntheticToken = false,
     this.isLocalFunction = false,
-  });
+    required int fileOffset,
+  }) {
+    this.fileOffset = fileOffset;
+  }
 
   @override
   String toString() {
@@ -1452,6 +1432,7 @@
   String get catchVariableName => astVariable.catchVariableName;
 }
 
+// Coverage-ignore(suite): Not run.
 class InternalSyntheticVariable extends TreeNode
     with InternalVariableMixin, DelegatingVariableMixin
     implements SyntheticVariable, InternalVariable {
@@ -1472,7 +1453,10 @@
     required this.isImplicitlyTyped,
     this.forSyntheticToken = false,
     this.isLocalFunction = false,
-  });
+    required int fileOffset,
+  }) {
+    this.fileOffset = fileOffset;
+  }
 
   @override
   String toString() {
@@ -1480,7 +1464,6 @@
   }
 
   @override
-  // Coverage-ignore(suite): Not run.
   void toTextInternal(AstPrinter printer) {
     printer.writeExpressionVariable(astVariable);
     List<String> modifiers = [
@@ -1500,6 +1483,7 @@
   String? get cosmeticName => astVariable.cosmeticName;
 
   @override
+  // Coverage-ignore(suite): Not run.
   TreeNode? get parent => astVariable.parent;
 
   @override
@@ -1675,11 +1659,11 @@
 
   @override
   // Coverage-ignore(suite): Not run.
-  VariableInitializationBase? get variableInitialization =>
+  VariableDeclaration? get variableInitialization =>
       astVariable.variableInitialization;
 
   @override
-  void set variableInitialization(VariableInitializationBase? value) {
+  void set variableInitialization(VariableDeclaration? value) {
     astVariable.variableInitialization = value;
   }
 
@@ -1756,6 +1740,7 @@
   }
 
   @override
+  // Coverage-ignore(suite): Not run.
   R accept1<R, A>(StatementVisitor1<R, A> v, A arg) {
     return astVariable.accept1(v, arg);
   }
@@ -1767,8 +1752,14 @@
     astVariable.cosmeticName = value;
   }
 
-  VariableContext get context {
-    throw new UnsupportedError("${this.runtimeType}");
+  @override
+  // Coverage-ignore(suite): Not run.
+  VariableContext get context => astVariable.context;
+
+  @override
+  // Coverage-ignore(suite): Not run.
+  void set context(VariableContext value) {
+    astVariable.context = value;
   }
 
   @override
@@ -1975,7 +1966,7 @@
   String? lateName;
 
   @override
-  VariableDeclaration get asExpressionVariable => this as VariableDeclaration;
+  VariableDeclaration get asVariableDeclaration => this as VariableDeclaration;
 }
 
 /// Front end specific implementation of [LoadLibrary].
@@ -4972,15 +4963,18 @@
 /// This assumes that `isPureExpression(node)` is `true`.
 Expression clonePureExpression(Expression node) {
   if (node is ThisExpression) {
-    return new ThisExpression()..fileOffset = node.fileOffset;
+    return extern.createThisExpression(fileOffset: node.fileOffset);
   } else if (node is VariableGet) {
     assert(
       node.variable.isFinal && !node.variable.isLate,
       "Trying to clone VariableGet of non-final variable"
       " ${node.variable}.",
     );
-    return new VariableGet(node.variable, node.promotedType)
-      ..fileOffset = node.fileOffset;
+    return extern.createVariableGet(
+      node.variable,
+      promotedType: node.promotedType,
+      fileOffset: node.fileOffset,
+    );
   }
   // Coverage-ignore-block(suite): Not run.
   throw new UnsupportedError("Clone not supported for ${node.runtimeType}.");
@@ -5300,10 +5294,14 @@
   Reference fieldReference;
   Expression value;
 
-  ExtensionTypeRepresentationFieldInitializer(Procedure field, this.value)
-    : assert(field.stubKind == ProcedureStubKind.RepresentationField),
-      this.fieldReference = field.reference {
+  ExtensionTypeRepresentationFieldInitializer(
+    Procedure field,
+    this.value, {
+    required int fileOffset,
+  }) : assert(field.stubKind == ProcedureStubKind.RepresentationField),
+       this.fieldReference = field.reference {
     value.parent = this;
+    this.fileOffset = fileOffset;
   }
 
   @override
@@ -5647,3 +5645,976 @@
     return "InternalSuperInitializer(${toStringInternal()})";
   }
 }
+
+// Coverage-ignore(suite): Not run.
+/// Internal node for encoding the "element" of a for-in loop.
+///
+/// The element is the part before "in" which can either an identifier or
+/// a single variable declaration.
+sealed class InternalForInElement {
+  /// Infers the for-in element and the [iterable].
+  ForInHeaderResult inferForInHeader(
+    InferenceVisitorBase visitor, {
+    required TreeNode node,
+    required Expression iterable,
+    required bool isAsync,
+    required int forOffset,
+    required bool isClosureContextLoweringEnabled,
+  });
+
+  void toTextInternal(AstPrinter printer);
+
+  String toText(AstTextStrategy strategy) {
+    AstPrinter printer = new AstPrinter(strategy);
+    toTextInternal(printer);
+    return printer.getText();
+  }
+
+  @override
+  String toString() {
+    return '$runtimeType(${toText(defaultAstTextStrategy)})';
+  }
+}
+
+/// Base implementation for non-pattern for-in elements.
+sealed class _BaseForInElement extends InternalForInElement {
+  /// Computes the type context from the element. This is type context used for
+  /// inferring the for-in iterable.
+  DartType _computeElementTypeContext(InferenceVisitorBase visitor);
+
+  /// Computes the [VariableDeclaration] that will be used in the emitted
+  /// [ForInStatement].
+  ///
+  /// This can be the variable declared as the for-in element or a synthetic
+  /// variable, when there is no declared variable or it doesn't suffice for
+  /// the correct runtime behavior.
+  VariableDeclaration _computeLoopVariable(
+    InferenceVisitorBase visitor,
+    DartType type, {
+    required int forOffset,
+    required bool isClosureContextLoweringEnabled,
+  });
+
+  /// Computes the [ForInEncoding] for the additional nodes needed for the
+  /// assignment to the for-in element.
+  ForInEncoding _computeEncoding(
+    InferenceVisitorBase visitor, {
+    required VariableDeclaration loopVariable,
+  });
+
+  /// Helper for creating a synthetic variable declaration for the emitted
+  /// [ForInStatement].
+  VariableDeclaration _createSyntheticVariableDeclaration(
+    DartType type, {
+    required int forOffset,
+    required bool isClosureContextLoweringEnabled,
+  }) {
+    if (isClosureContextLoweringEnabled) {
+      return new SyntheticVariable(type: type)..fileOffset = forOffset;
+    }
+    return extern.createUninitializedVariable(
+      type,
+      fileOffset: forOffset,
+      isFinal: true,
+    );
+  }
+
+  @override
+  ForInHeaderResult inferForInHeader(
+    InferenceVisitorBase visitor, {
+    required TreeNode node,
+    required Expression iterable,
+    required bool isAsync,
+    required int forOffset,
+    required bool isClosureContextLoweringEnabled,
+  }) {
+    DartType elementTypeContext = _computeElementTypeContext(visitor);
+
+    ExpressionInferenceResult iterableResult = visitor.inferForInIterable(
+      iterable,
+      elementTypeContext,
+      isAsync: isAsync,
+    );
+    DartType inferredType = iterableResult.inferredType;
+    VariableDeclaration variable = _computeLoopVariable(
+      visitor,
+      inferredType,
+      forOffset: forOffset,
+      isClosureContextLoweringEnabled: isClosureContextLoweringEnabled,
+    );
+
+    return new ForInHeaderResult(
+      loopVariable: variable,
+      iterable: iterableResult.expression,
+      computeEncoding: () => _computeEncoding(visitor, loopVariable: variable),
+    );
+  }
+}
+
+/// Base implementation for declared variable for-in elements.
+sealed class _VariableForInElement extends _BaseForInElement {
+  /// Error that must be emitted prior to the generated for-in statement.
+  ///
+  /// This is used for instance for constant loop variables.
+  final InvalidExpression? error;
+
+  _VariableForInElement({required this.error});
+
+  VariableDeclaration get _variableDeclaration;
+
+  /// If the assignment to [variableDeclaration] needs additional steps, like
+  /// a type coercion, this holds a synthetic variable declaration used as an
+  /// intermediate step.
+  VariableDeclaration? _variableForSideEffect;
+
+  @override
+  VariableDeclaration _computeLoopVariable(
+    InferenceVisitorBase visitor,
+    DartType type, {
+    required int forOffset,
+    required bool isClosureContextLoweringEnabled,
+  }) {
+    VariableDeclaration loopVariable;
+    DartType loopVariableType;
+    bool checkAssignment = true;
+    if (_variableDeclaration.variable case InternalVariable variable) {
+      loopVariable = variable.astVariable;
+      if (variable.isImplicitlyTyped) {
+        loopVariableType = variable.type = type;
+        checkAssignment = false;
+      } else {
+        loopVariableType = variable.type;
+      }
+    } else {
+      // Coverage-ignore-block(suite): Not run.
+      loopVariable = _variableDeclaration;
+      loopVariableType = _variableDeclaration.type;
+    }
+    if (checkAssignment) {
+      VariableDeclaration tempVariable = _createSyntheticVariableDeclaration(
+        type,
+        forOffset: forOffset,
+        isClosureContextLoweringEnabled: isClosureContextLoweringEnabled,
+      );
+      ExpressionInferenceResult canary = new ExpressionInferenceResult(
+        type,
+        extern.createVariableGet(
+          tempVariable,
+          fileOffset: loopVariable.fileOffset,
+        ),
+      );
+      ExpressionInferenceResult assignmentResult = visitor
+          .ensureAssignableResult(
+            loopVariableType,
+            canary,
+            isVoidAllowed: true,
+            errorTemplate: diag.forInLoopElementTypeNotAssignable,
+          );
+      if (!identical(assignmentResult, canary)) {
+        // Something happened during assignment, like an error or a type
+        // coercion, so we need to use the temp variable as the loop variable
+        // and assign to the declared variable in the loop.
+        loopVariable.initializer = assignmentResult.expression
+          ..parent = loopVariable;
+        visitor.flowAnalysis.declare(
+          loopVariable,
+          new SharedTypeView(loopVariableType),
+          initialized: true,
+        );
+        _variableForSideEffect = loopVariable;
+        loopVariable = tempVariable;
+      }
+    }
+    return loopVariable;
+  }
+
+  @override
+  ForInEncoding _computeEncoding(
+    InferenceVisitorBase visitor, {
+    required VariableDeclaration loopVariable,
+  }) {
+    return new ForInEncoding(
+      preLoopError: error,
+      bodyPrologue: _variableForSideEffect,
+    );
+  }
+}
+
+/// For-in element for a single declared variable.
+class VariableInitializationForInElement extends _VariableForInElement {
+  /// The variable declaration.
+  final VariableInitialization variableInitialization;
+
+  VariableInitializationForInElement({
+    required this.variableInitialization,
+    required super.error,
+  });
+
+  @override
+  VariableDeclaration get _variableDeclaration =>
+      variableInitialization.variable;
+
+  @override
+  // Coverage-ignore(suite): Not run.
+  void toTextInternal(AstPrinter printer) {
+    printer.writeVariableInitialization(
+      variableInitialization,
+      includeInitializer: false,
+      isImplicitlyTyped:
+          (variableInitialization.variable is InternalVariable) &&
+          (variableInitialization.variable as InternalVariable)
+              .isImplicitlyTyped,
+    );
+  }
+
+  @override
+  DartType _computeElementTypeContext(InferenceVisitorBase visitor) {
+    if (variableInitialization.variable case InternalVariable variable) {
+      if (variable.isImplicitlyTyped) {
+        return const UnknownType();
+      }
+    }
+    return variableInitialization.variable.type;
+  }
+}
+
+/// For-in element for a single declared variable.
+class SingleVariableDeclarationForInElement extends _VariableForInElement {
+  /// The declared variable.
+  final VariableDeclaration variableDeclaration;
+
+  SingleVariableDeclarationForInElement({
+    required this.variableDeclaration,
+    required super.error,
+  });
+
+  @override
+  VariableDeclaration get _variableDeclaration => variableDeclaration;
+
+  @override
+  // Coverage-ignore(suite): Not run.
+  void toTextInternal(AstPrinter printer) {
+    printer.writeVariableInitialization(
+      variableDeclaration,
+      includeInitializer: false,
+      isImplicitlyTyped:
+          variableDeclaration.variable is InternalVariable &&
+          (variableDeclaration.variable as InternalVariable).isImplicitlyTyped,
+    );
+  }
+
+  @override
+  DartType _computeElementTypeContext(InferenceVisitorBase visitor) {
+    if (variableDeclaration case InternalVariable variable) {
+      if (variable.isImplicitlyTyped) {
+        return const UnknownType();
+      }
+    }
+    return variableDeclaration.type;
+  }
+}
+
+/// For-in element for a multi-variable declaration, like
+/// `for (var a, b in [])`. This is an error case.
+class MultiVariableDeclarationForInElement extends _BaseForInElement {
+  /// The declared variables.
+  final List<VariableDeclaration> variableDeclarations;
+
+  /// The error that should be emitted prior to the for-in statement.
+  final InvalidExpression error;
+
+  MultiVariableDeclarationForInElement({
+    required this.variableDeclarations,
+    required this.error,
+  });
+
+  @override
+  // Coverage-ignore(suite): Not run.
+  void toTextInternal(AstPrinter printer) {
+    for (int i = 0; i < variableDeclarations.length; i++) {
+      VariableDeclaration variableDeclaration = variableDeclarations[i];
+      if (i == 0) {
+        printer.writeVariableInitialization(
+          variableDeclaration,
+          includeModifiersAndType: true,
+          includeInitializer: false,
+          isImplicitlyTyped:
+              variableDeclaration is InternalVariable &&
+              (variableDeclaration as InternalVariable).isImplicitlyTyped,
+        );
+      } else {
+        printer.write(', ');
+        printer.writeVariableInitialization(
+          variableDeclaration,
+          includeModifiersAndType: false,
+          includeInitializer: false,
+        );
+      }
+    }
+  }
+
+  @override
+  DartType _computeElementTypeContext(InferenceVisitorBase visitor) =>
+      const UnknownType();
+
+  @override
+  ForInEncoding _computeEncoding(
+    InferenceVisitorBase visitor, {
+    required VariableDeclaration loopVariable,
+  }) {
+    return new ForInEncoding(
+      preLoopError: error,
+      bodyPrologue: extern.createBlock([
+        ...variableDeclarations,
+      ], fileOffset: TreeNode.noOffset),
+    );
+  }
+
+  @override
+  VariableDeclaration _computeLoopVariable(
+    InferenceVisitorBase visitor,
+    DartType type, {
+    required int forOffset,
+    required bool isClosureContextLoweringEnabled,
+  }) {
+    return _createSyntheticVariableDeclaration(
+      type,
+      forOffset: forOffset,
+      isClosureContextLoweringEnabled: isClosureContextLoweringEnabled,
+    );
+  }
+}
+
+/// For-in element for an unassignable expression, like `for (1 in [])`. This is
+/// an error case.
+class UnassignableForInElement extends _BaseForInElement {
+  /// The unassignable expression.
+  final Expression expression;
+
+  /// The error that should be emitted prior to the for-in statement.
+  final InvalidExpression error;
+
+  UnassignableForInElement({required this.expression, required this.error});
+
+  @override
+  // Coverage-ignore(suite): Not run.
+  void toTextInternal(AstPrinter printer) {
+    printer.writeExpression(expression);
+  }
+
+  @override
+  DartType _computeElementTypeContext(InferenceVisitorBase visitor) =>
+      const UnknownType();
+
+  @override
+  ForInEncoding _computeEncoding(
+    InferenceVisitorBase visitor, {
+    required VariableDeclaration loopVariable,
+  }) {
+    return new ForInEncoding(
+      preLoopError: error,
+      bodyPrologue: extern.createBlock([
+        extern.createExpressionStatement(
+          visitor.inferExpression(expression, const UnknownType()).expression,
+        ),
+      ], fileOffset: TreeNode.noOffset),
+    );
+  }
+
+  @override
+  VariableDeclaration _computeLoopVariable(
+    InferenceVisitorBase visitor,
+    DartType type, {
+    required int forOffset,
+    required bool isClosureContextLoweringEnabled,
+  }) {
+    return _createSyntheticVariableDeclaration(
+      type,
+      forOffset: forOffset,
+      isClosureContextLoweringEnabled: isClosureContextLoweringEnabled,
+    );
+  }
+}
+
+/// For-in element for a pattern variable declaration.
+class PatternForInElement extends InternalForInElement {
+  /// The pattern used in the variable declaration.
+  final Pattern pattern;
+
+  /// The file offset of the `in` keyword.
+  final int inOffset;
+
+  PatternForInElement({required this.pattern, required this.inOffset});
+
+  @override
+  ForInHeaderResult inferForInHeader(
+    InferenceVisitorBase visitor, {
+    required TreeNode node,
+    required Expression iterable,
+    required bool isAsync,
+    required int forOffset,
+    required bool isClosureContextLoweringEnabled,
+  }) {
+    PatternForInData data = visitor.inferPatternForInHeader(
+      node: node,
+      pattern: pattern,
+      iterable: iterable,
+      isAsync: isAsync,
+      inOffset: inOffset,
+    );
+    return new ForInHeaderResult(
+      loopVariable: data.loopVariable,
+      iterable: data.iterable,
+      computeEncoding: () => new ForInEncoding(
+        bodyPrologue: data.computePatternVariableDeclaration(),
+      ),
+    );
+  }
+
+  @override
+  // Coverage-ignore(suite): Not run.
+  void toTextInternal(AstPrinter printer) {
+    printer.write('var ');
+    pattern.toTextInternal(printer);
+  }
+}
+
+/// For-in element for an erroneous expression.
+class InvalidForInElement extends _BaseForInElement {
+  /// The error for the erroneous expression.
+  final InvalidExpression error;
+
+  /// The file offset of the `in` keyword.
+  final int inOffset;
+
+  InvalidForInElement({required this.error, required this.inOffset});
+
+  @override
+  // Coverage-ignore(suite): Not run.
+  void toTextInternal(AstPrinter printer) {
+    printer.writeExpression(error);
+  }
+
+  @override
+  DartType _computeElementTypeContext(InferenceVisitorBase visitor) =>
+      const UnknownType();
+
+  @override
+  ForInEncoding _computeEncoding(
+    InferenceVisitorBase visitor, {
+    required VariableDeclaration loopVariable,
+  }) {
+    return new ForInEncoding(
+      bodyPrologue: extern.createBlock([
+        extern.createExpressionStatement(error),
+      ], fileOffset: TreeNode.noOffset),
+    );
+  }
+
+  @override
+  VariableDeclaration _computeLoopVariable(
+    InferenceVisitorBase visitor,
+    DartType type, {
+    required int forOffset,
+    required bool isClosureContextLoweringEnabled,
+  }) {
+    return _createSyntheticVariableDeclaration(
+      type,
+      forOffset: forOffset,
+      isClosureContextLoweringEnabled: isClosureContextLoweringEnabled,
+    );
+  }
+}
+
+/// For-in element for an existing variable, like `for (a in [])` where `a` is
+/// an already defined local variable.
+class ExistingVariableForInElement extends _BaseForInElement {
+  /// The variable used as the for-in element.
+  final VariableDeclaration variable;
+
+  /// The file offset of the variable name.
+  final int nameOffset;
+
+  /// The file offset of the `in` keyword.
+  final int inOffset;
+
+  /// Error that must be emitted prior to the generated for-in statement.
+  ///
+  /// This is used for instance for a final local variable.
+  final InvalidExpression? error;
+
+  ExistingVariableForInElement({
+    required this.variable,
+    required this.nameOffset,
+    required this.inOffset,
+    this.error,
+  });
+  @override
+  // Coverage-ignore(suite): Not run.
+  void toTextInternal(AstPrinter printer) {
+    printer.write(variable.name!);
+  }
+
+  @override
+  DartType _computeElementTypeContext(InferenceVisitorBase visitor) {
+    DartType? promotedType = visitor.flowAnalysis
+        .promotedType(variable)
+        ?.unwrapTypeView();
+    return promotedType ?? variable.type;
+  }
+
+  @override
+  ForInEncoding _computeEncoding(
+    InferenceVisitorBase visitor, {
+    required VariableDeclaration loopVariable,
+  }) {
+    ExpressionInferenceResult result = visitor.inferVariableSet(
+      variable: variable as InternalVariable,
+      variableType: variable.type,
+      rhsResult: new ExpressionInferenceResult(
+        loopVariable.type,
+        error ?? extern.createVariableGet(loopVariable),
+      ),
+      assignOffset: inOffset,
+      nameOffset: nameOffset,
+    );
+    return new ForInEncoding(
+      bodyPrologue: extern.createExpressionStatement(result.expression),
+    );
+  }
+
+  @override
+  VariableDeclaration _computeLoopVariable(
+    InferenceVisitorBase visitor,
+    DartType type, {
+    required int forOffset,
+    required bool isClosureContextLoweringEnabled,
+  }) {
+    return _createSyntheticVariableDeclaration(
+      type,
+      forOffset: inOffset,
+      isClosureContextLoweringEnabled: isClosureContextLoweringEnabled,
+    );
+  }
+}
+
+/// For-in element for a property access, like `for (a in [])` where `a` is an
+/// instance field in the enclosing class.
+class PropertyForInElement extends _BaseForInElement {
+  /// The implicit `this` expression on which the property write is performed.
+  final Expression receiver;
+
+  /// The name of the accessed instance member.
+  final Name name;
+
+  /// The file offset of the property name.
+  final int nameOffset;
+
+  /// The file offset of the `in` keyword.
+  final int inOffset;
+
+  /// Data computed during [_computeElementTypeContext] for use in
+  /// [_computeEncoding].
+  late final PropertySetData _data;
+
+  PropertyForInElement({
+    required this.receiver,
+    required this.name,
+    required this.nameOffset,
+    required this.inOffset,
+  });
+
+  @override
+  // Coverage-ignore(suite): Not run.
+  void toTextInternal(AstPrinter printer) {
+    printer.writeName(name);
+  }
+
+  @override
+  DartType _computeElementTypeContext(InferenceVisitorBase visitor) {
+    _data = visitor.computePropertySetData(
+      receiver: receiver,
+      name: name,
+      fileOffset: nameOffset,
+      isNullAware: false,
+    );
+    return _data.writeContext;
+  }
+
+  @override
+  ForInEncoding _computeEncoding(
+    InferenceVisitorBase visitor, {
+    required VariableDeclaration loopVariable,
+  }) {
+    ExpressionInferenceResult result = visitor.inferPropertySet(
+      fileOffset: nameOffset,
+      receiver: _data.receiver,
+      receiverType: _data.receiverType,
+      propertyName: name,
+      writeTarget: _data.target,
+      writeContext: _data.writeContext,
+      valueResult: new ExpressionInferenceResult(
+        loopVariable.type,
+        extern.createVariableGet(loopVariable),
+      ),
+      forEffect: true,
+    );
+    return new ForInEncoding(
+      bodyPrologue: extern.createExpressionStatement(result.expression),
+    );
+  }
+
+  @override
+  VariableDeclaration _computeLoopVariable(
+    InferenceVisitorBase visitor,
+    DartType type, {
+    required int forOffset,
+    required bool isClosureContextLoweringEnabled,
+  }) {
+    return _createSyntheticVariableDeclaration(
+      type,
+      forOffset: inOffset,
+      isClosureContextLoweringEnabled: isClosureContextLoweringEnabled,
+    );
+  }
+}
+
+/// For-in element for a property access, like `for (a in [])` where `a` is a
+/// top-level field.
+class StaticForInElement extends _BaseForInElement {
+  /// The accessed property.
+  final Member target;
+
+  /// The file offset of the property name.
+  final int nameOffset;
+
+  /// The file offset of the `in` keyword.
+  final int inOffset;
+
+  /// The property type computed during [_computeElementTypeContext] for use in
+  /// [_computeEncoding].
+  late final DartType _writeContext;
+
+  StaticForInElement({
+    required this.target,
+    required this.nameOffset,
+    required this.inOffset,
+  });
+
+  @override
+  // Coverage-ignore(suite): Not run.
+  void toTextInternal(AstPrinter printer) {
+    printer.writeName(target.name);
+  }
+
+  @override
+  DartType _computeElementTypeContext(InferenceVisitorBase visitor) {
+    return _writeContext = visitor.computeStaticSetWriteContext(target);
+  }
+
+  @override
+  ForInEncoding _computeEncoding(
+    InferenceVisitorBase visitor, {
+    required VariableDeclaration loopVariable,
+  }) {
+    ExpressionInferenceResult result = visitor.inferStaticSet(
+      member: target,
+      rhsResult: new ExpressionInferenceResult(
+        loopVariable.type,
+        extern.createVariableGet(loopVariable),
+      ),
+      writeContext: _writeContext,
+      assignOffset: inOffset,
+      nameOffset: nameOffset,
+    );
+    return new ForInEncoding(
+      bodyPrologue: extern.createExpressionStatement(result.expression),
+    );
+  }
+
+  @override
+  VariableDeclaration _computeLoopVariable(
+    InferenceVisitorBase visitor,
+    DartType type, {
+    required int forOffset,
+    required bool isClosureContextLoweringEnabled,
+  }) {
+    return _createSyntheticVariableDeclaration(
+      type,
+      forOffset: inOffset,
+      isClosureContextLoweringEnabled: isClosureContextLoweringEnabled,
+    );
+  }
+}
+
+/// For-in element for a property access, like `for (a in [])` where `a` is an
+/// instance getter in the enclosing extension.
+class ExtensionForInElement extends _BaseForInElement {
+  /// The extension in which the [setter] is declared.
+  final Extension extension;
+
+  /// The known type arguments for the type parameters declared in
+  /// [extension], either explicitly provided like `E<int>(o).a = b` or
+  /// implied as in `a = b` from within the extension `E`.
+  final List<DartType>? thisTypeArguments;
+
+  /// The receiver for the assignment.
+  Expression thisAccess;
+
+  /// The name of setter.
+  ///
+  /// This is the name of the access and _not_ the name of the lowered method.
+  final Name name;
+
+  /// The extension member called for the assignment.
+  Procedure setter;
+
+  /// The file offset of the property name.
+  final int nameOffset;
+
+  /// The file offset of the `in` keyword.
+  final int inOffset;
+
+  /// Data computed during [_computeElementTypeContext] for use in
+  /// [_computeEncoding].
+  late final ExtensionSetData _data;
+
+  ExtensionForInElement({
+    required this.extension,
+    required this.thisTypeArguments,
+    required this.thisAccess,
+    required this.name,
+    required this.setter,
+    required this.nameOffset,
+    required this.inOffset,
+  }) : assert(
+         thisTypeArguments == null ||
+             // Coverage-ignore(suite): Not run.
+             extension.typeParameters.isNotEmpty &&
+                 thisTypeArguments.length == extension.typeParameters.length,
+       );
+
+  @override
+  // Coverage-ignore(suite): Not run.
+  void toTextInternal(AstPrinter printer) {
+    printer.writeName(name);
+  }
+
+  @override
+  DartType _computeElementTypeContext(InferenceVisitorBase visitor) {
+    _data = visitor.computeExtensionSetData(
+      extension: extension,
+      knownTypeArguments: thisTypeArguments,
+      receiver: thisAccess,
+      extensionTypeArgumentOffset: null,
+      setter: setter,
+      isNullAware: false,
+      fileOffset: nameOffset,
+    );
+    return _data.valueType;
+  }
+
+  @override
+  ForInEncoding _computeEncoding(
+    InferenceVisitorBase visitor, {
+    required VariableDeclaration loopVariable,
+  }) {
+    ExpressionInferenceResult result = visitor.inferExtensionSet(
+      data: _data,
+      valueResult: new ExpressionInferenceResult(
+        loopVariable.type,
+        extern.createVariableGet(loopVariable),
+      ),
+      forEffect: true,
+      fileOffset: nameOffset,
+    );
+    return new ForInEncoding(
+      bodyPrologue: extern.createExpressionStatement(result.expression),
+    );
+  }
+
+  @override
+  VariableDeclaration _computeLoopVariable(
+    InferenceVisitorBase visitor,
+    DartType type, {
+    required int forOffset,
+    required bool isClosureContextLoweringEnabled,
+  }) {
+    return _createSyntheticVariableDeclaration(
+      type,
+      forOffset: inOffset,
+      isClosureContextLoweringEnabled: isClosureContextLoweringEnabled,
+    );
+  }
+}
+
+/// Encoding of additional nodes need for correct runtime behavior of a for-in
+/// loop.
+class ForInEncoding {
+  /// Error that needs to be thrown before trying to execute the loop.
+  final InvalidExpression? preLoopError;
+
+  /// Statement that needs to be executed before the loop body.
+  ///
+  /// This can contain variable declarations for variables used in the loop and
+  /// must therefore be emitted in the same block as the body content.
+  final Statement? bodyPrologue;
+
+  ForInEncoding({this.preLoopError, this.bodyPrologue});
+
+  @override
+  String toString() => 'ForInStatementResult($preLoopError,$bodyPrologue)';
+}
+
+/// The result of inferring a for-in loop element and iterable.
+class ForInHeaderResult {
+  /// The [VariableDeclaration] that should be used as the variable in the
+  /// emitted [ForInStatement].
+  final VariableDeclaration loopVariable;
+
+  /// The [Expression] that should be used as the iterable in the emitted
+  /// [ForInStatement].
+  final Expression iterable;
+
+  /// Function that computes the [ForInEncoding] need for the for-in element.
+  ///
+  /// This must be called between [FlowAnalysis.forEach_bodyBegin] and
+  /// [FlowAnalysis.forEach_end] to ensure the effect of the encoding is seen
+  /// as being part of the loop body.
+  final ForInEncoding Function() computeEncoding;
+
+  ForInHeaderResult({
+    required this.loopVariable,
+    required this.iterable,
+    required this.computeEncoding,
+  });
+
+  @override
+  String toString() =>
+      'ForInHeaderResult($loopVariable,$iterable,$computeEncoding)';
+}
+
+/// Internal node for a for-in loop statement.
+class InternalForInStatement extends InternalStatement
+    implements LoopStatement {
+  /// The element of the for-in loop.
+  ///
+  /// For instance 'x' and 'var x' in
+  ///
+  ///     for (x in list) {}
+  ///     for (var x in list) {}
+  ///
+  final InternalForInElement element;
+
+  /// The iterable of the for-in loop.
+  ///
+  /// For instance 'x' in
+  ///
+  ///     for (var e in x) {}
+  ///     await for (var e in x) {}
+  ///
+  final Expression iterable;
+
+  /// The for-in loop body.
+  @override
+  Statement body;
+
+  /// Whether the for-in loop is asynchronous.
+  final bool isAsync;
+
+  /// The file offset for the for-in body.
+  final int bodyOffset;
+
+  InternalForInStatement(
+    this.element,
+    this.iterable,
+    this.body, {
+    required this.isAsync,
+    required int fileOffset,
+    required this.bodyOffset,
+  }) {
+    this.fileOffset = fileOffset;
+  }
+
+  @override
+  StatementInferenceResult acceptInference(InferenceVisitorImpl visitor) {
+    return visitor.visitInternalForInStatement(this);
+  }
+
+  @override
+  // Coverage-ignore(suite): Not run.
+  void toTextInternal(AstPrinter printer) {
+    if (isAsync) {
+      printer.write('async ');
+    }
+    printer.write('for (');
+    element.toTextInternal(printer);
+    printer.write(' in ');
+    printer.writeExpression(iterable);
+    printer.write(') ');
+    printer.writeStatement(body);
+  }
+
+  @override
+  String toString() {
+    return "$runtimeType(${toStringInternal()})";
+  }
+}
+
+class InternalVariableGet extends InternalExpression {
+  /// The target variable.
+  final InternalVariable variable;
+
+  InternalVariableGet(this.variable);
+
+  @override
+  ExpressionInferenceResult acceptInference(
+    InferenceVisitorImpl visitor,
+    DartType typeContext,
+  ) {
+    return visitor.visitInternalVariableGet(this, typeContext);
+  }
+
+  @override
+  // Coverage-ignore(suite): Not run.
+  void toTextInternal(AstPrinter printer) {
+    printer.write(variable.cosmeticName ?? '<unnamed-variable>');
+  }
+
+  @override
+  String toString() {
+    return "InternalVariableGet(${toStringInternal()})";
+  }
+}
+
+class InternalVariableSet extends InternalExpression {
+  /// The target variable.
+  final InternalVariable variable;
+
+  Expression value;
+
+  InternalVariableSet(this.variable, this.value) {
+    value.parent = this;
+  }
+
+  @override
+  ExpressionInferenceResult acceptInference(
+    InferenceVisitorImpl visitor,
+    DartType typeContext,
+  ) {
+    return visitor.visitInternalVariableSet(this, typeContext);
+  }
+
+  @override
+  // Coverage-ignore(suite): Not run.
+  void toTextInternal(AstPrinter printer) {
+    printer.write(variable.cosmeticName ?? '<unnamed-variable>');
+    printer.write(' = ');
+    printer.writeExpression(value);
+  }
+
+  @override
+  String toString() {
+    return "InternalVariableSet(${toStringInternal()})";
+  }
+}
diff --git a/pkg/front_end/lib/src/kernel/internal_ast_helper.dart b/pkg/front_end/lib/src/kernel/internal_ast_helper.dart
index 0b6747d..21c79b0 100644
--- a/pkg/front_end/lib/src/kernel/internal_ast_helper.dart
+++ b/pkg/front_end/lib/src/kernel/internal_ast_helper.dart
@@ -2,8 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:kernel/ast.dart';
 import 'package:kernel/ast.dart' as ast_helper show isThisExpression;
+import 'package:kernel/ast.dart';
 import 'package:kernel/src/printer.dart';
 
 import '../base/problems.dart' show unsupported;
@@ -25,6 +25,14 @@
         SpreadElement;
 import 'internal_ast.dart';
 
+Expression checkLibraryIsLoaded(int fileOffset, LibraryDependency dependency) {
+  return new CheckLibraryIsLoaded(dependency)..fileOffset = fileOffset;
+}
+
+AndPattern createAndPattern(int fileOffset, Pattern left, Pattern right) {
+  return new AndPattern(left, right)..fileOffset = fileOffset;
+}
+
 ActualArguments createArguments(
   int fileOffset, {
   required List<Argument> arguments,
@@ -47,162 +55,6 @@
   );
 }
 
-/// Return a representation of a boolean literal at the given [fileOffset].
-/// The literal has the given [value].
-BoolLiteral createBoolLiteral(int fileOffset, bool value) {
-  return new BoolLiteral(value)..fileOffset = fileOffset;
-}
-
-/// Return a representation of a double literal at the given [fileOffset]. The
-/// literal has the given [value].
-DoubleLiteral createDoubleLiteral(int fileOffset, double value) {
-  return new DoubleLiteral(value)..fileOffset = fileOffset;
-}
-
-/// Return a representation of an integer literal at the given [fileOffset].
-/// The literal has the given [value].
-IntLiteral createIntLiteral(int fileOffset, int value, [String? literal]) {
-  return new IntJudgment(value, literal)..fileOffset = fileOffset;
-}
-
-IntLiteral createIntLiteralLarge(
-  int fileOffset,
-  String strippedLiteral,
-  String literal,
-) {
-  return new ShadowLargeIntLiteral(strippedLiteral, literal, fileOffset);
-}
-
-/// Return a representation of a list literal at the given [fileOffset]. The
-/// [isConst] is `true` if the literal is either explicitly or implicitly a
-/// constant. The [typeArgument] is the representation of the single valid
-/// type argument preceding the list literal, or `null` if there is no type
-/// argument, there is more than one type argument, or if the type argument
-/// cannot be resolved. The list of [expressions] is a list of the
-/// representations of the list elements.
-ListLiteral createListLiteral(
-  int fileOffset,
-  DartType typeArgument,
-  List<Expression> expressions, {
-  required bool isConst,
-}) {
-  return new ListLiteral(
-    expressions,
-    typeArgument: typeArgument,
-    isConst: isConst,
-  )..fileOffset = fileOffset;
-}
-
-/// Return a representation of a set literal at the given [fileOffset]. The
-/// [isConst] is `true` if the literal is either explicitly or implicitly a
-/// constant. The [typeArgument] is the representation of the single valid
-/// type argument preceding the set literal, or `null` if there is no type
-/// argument, there is more than one type argument, or if the type argument
-/// cannot be resolved. The list of [expressions] is a list of the
-/// representations of the set elements.
-SetLiteral createSetLiteral(
-  int fileOffset,
-  DartType typeArgument,
-  List<Expression> expressions, {
-  required bool isConst,
-}) {
-  return new SetLiteral(
-    expressions,
-    typeArgument: typeArgument,
-    isConst: isConst,
-  )..fileOffset = fileOffset;
-}
-
-/// Return a representation of a map literal at the given [fileOffset]. The
-/// [isConst] is `true` if the literal is either explicitly or implicitly a
-/// constant. The [keyType] is the representation of the first type argument
-/// preceding the map literal, or `null` if there are not exactly two type
-/// arguments or if the first type argument cannot be resolved. The
-/// [valueType] is the representation of the second type argument preceding
-/// the map literal, or `null` if there are not exactly two type arguments or
-/// if the second type argument cannot be resolved. The list of [entries] is a
-/// list of the representations of the map entries.
-MapLiteral createMapLiteral(
-  int fileOffset,
-  DartType keyType,
-  DartType valueType,
-  List<MapLiteralEntry> entries, {
-  required bool isConst,
-}) {
-  return new MapLiteral(
-    entries,
-    keyType: keyType,
-    valueType: valueType,
-    isConst: isConst,
-  )..fileOffset = fileOffset;
-}
-
-/// Return a representation of a null literal at the given [fileOffset].
-NullLiteral createNullLiteral(int fileOffset) {
-  return new NullLiteral()..fileOffset = fileOffset;
-}
-
-/// Return a representation of a simple string literal at the given
-/// [fileOffset]. The literal has the given [value]. This does not include
-/// either adjacent strings or interpolated strings.
-StringLiteral createStringLiteral(int fileOffset, String value) {
-  return new StringLiteral(value)..fileOffset = fileOffset;
-}
-
-/// Return a representation of a symbol literal defined by [value] at the
-/// given [fileOffset].
-SymbolLiteral createSymbolLiteral(int fileOffset, String value) {
-  return new SymbolLiteral(value)..fileOffset = fileOffset;
-}
-
-TypeLiteral createTypeLiteral(int fileOffset, DartType type) {
-  return new TypeLiteral(type)..fileOffset = fileOffset;
-}
-
-/// Return a representation of a key/value pair in a literal map at the given
-/// [fileOffset]. The [key] is the representation of the expression used to
-/// compute the key. The [value] is the representation of the expression used
-/// to compute the value.
-MapLiteralEntry createMapEntry(
-  int fileOffset,
-  Expression key,
-  Expression value,
-) {
-  return new MapLiteralEntry(key, value)..fileOffset = fileOffset;
-}
-
-/// Return a representation of a null-aware key/value pair, were either the
-/// key or the value might be `null`, in a literal map at the given
-/// [fileOffset]. The [key] is the representation of the expression used to
-/// compute the key. The [value] is the representation of the expression used
-/// to compute the value.
-NullAwareMapEntry createNullAwareMapEntry(
-  int fileOffset, {
-  required bool isKeyNullAware,
-  required Expression key,
-  required bool isValueNullAware,
-  required Expression value,
-}) {
-  return new NullAwareMapEntry(
-    isKeyNullAware: isKeyNullAware,
-    key: key,
-    isValueNullAware: isValueNullAware,
-    value: value,
-  )..fileOffset = fileOffset;
-}
-
-LoadLibrary createLoadLibrary(
-  int fileOffset,
-  LibraryDependency dependency,
-  ActualArguments? arguments,
-) {
-  return new LoadLibraryImpl(dependency, arguments)..fileOffset = fileOffset;
-}
-
-Expression checkLibraryIsLoaded(int fileOffset, LibraryDependency dependency) {
-  return new CheckLibraryIsLoaded(dependency)..fileOffset = fileOffset;
-}
-
 Expression createAsExpression(
   int fileOffset,
   Expression expression,
@@ -214,173 +66,6 @@
     ..isForDynamic = forDynamic;
 }
 
-Expression createSpreadElement(
-  int fileOffset,
-  Expression expression, {
-  required bool isNullAware,
-}) {
-  return new SpreadElement(expression, isNullAware: isNullAware)
-    ..fileOffset = fileOffset;
-}
-
-Expression createNullAwareElement(int fileOffset, Expression expression) {
-  return new NullAwareElement(expression)..fileOffset = fileOffset;
-}
-
-Expression createIfElement(
-  int fileOffset,
-  Expression condition,
-  Expression then, [
-  Expression? otherwise,
-]) {
-  return new IfElement(condition, then, otherwise)..fileOffset = fileOffset;
-}
-
-Expression createIfCaseElement(
-  int fileOffset, {
-  required List<Statement> prelude,
-  required Expression expression,
-  required PatternGuard patternGuard,
-  required Expression then,
-  Expression? otherwise,
-}) {
-  return new IfCaseElement(
-    prelude: prelude,
-    expression: expression,
-    patternGuard: patternGuard,
-    then: then,
-    otherwise: otherwise,
-  )..fileOffset = fileOffset;
-}
-
-MapLiteralEntry createIfMapEntry(
-  int fileOffset,
-  Expression condition,
-  MapLiteralEntry then, [
-  MapLiteralEntry? otherwise,
-]) {
-  return new IfMapEntry(condition, then, otherwise)..fileOffset = fileOffset;
-}
-
-MapLiteralEntry createIfCaseMapEntry(
-  int fileOffset, {
-  required List<Statement> prelude,
-  required Expression expression,
-  required PatternGuard patternGuard,
-  required MapLiteralEntry then,
-  MapLiteralEntry? otherwise,
-}) {
-  return new IfCaseMapEntry(
-    prelude: prelude,
-    expression: expression,
-    patternGuard: patternGuard,
-    then: then,
-    otherwise: otherwise,
-  )..fileOffset = fileOffset;
-}
-
-ForElement createForElement(
-  int fileOffset,
-  List<VariableInitializationBase> variables,
-  Expression? condition,
-  List<Expression> updates,
-  Expression body,
-) {
-  return new ForElement(variables, condition, updates, body)
-    ..fileOffset = fileOffset;
-}
-
-PatternForElement createPatternForElement(
-  int fileOffset, {
-  required PatternVariableDeclaration patternVariableDeclaration,
-  required List<VariableDeclaration> intermediateVariables,
-  required List<VariableInitializationBase> variables,
-  required Expression? condition,
-  required List<Expression> updates,
-  required Expression body,
-}) {
-  return new PatternForElement(
-    patternVariableDeclaration: patternVariableDeclaration,
-    intermediateVariables: intermediateVariables,
-    variables: variables,
-    condition: condition,
-    updates: updates,
-    body: body,
-  )..fileOffset = fileOffset;
-}
-
-ForMapEntry createForMapEntry(
-  int fileOffset,
-  List<VariableDeclaration> variables,
-  Expression? condition,
-  List<Expression> updates,
-  MapLiteralEntry body,
-) {
-  return new ForMapEntry(variables, condition, updates, body)
-    ..fileOffset = fileOffset;
-}
-
-PatternForMapEntry createPatternForMapEntry(
-  int fileOffset, {
-  required PatternVariableDeclaration patternVariableDeclaration,
-  required List<VariableDeclaration> intermediateVariables,
-  required List<VariableDeclaration> variableInitializations,
-  required Expression? condition,
-  required List<Expression> updates,
-  required MapLiteralEntry body,
-}) {
-  return new PatternForMapEntry(
-    patternVariableDeclaration: patternVariableDeclaration,
-    intermediateVariables: intermediateVariables,
-    variables: variableInitializations,
-    condition: condition,
-    updates: updates,
-    body: body,
-  )..fileOffset = fileOffset;
-}
-
-ForInElement createForInElement(
-  int fileOffset,
-  VariableDeclaration variable,
-  Expression iterable,
-  Expression? synthesizedAssignment,
-  Statement? expressionEffects,
-  Expression body,
-  Expression? problem, {
-  bool isAsync = false,
-}) {
-  return new ForInElement(
-    variable,
-    iterable,
-    synthesizedAssignment,
-    expressionEffects,
-    body,
-    problem,
-    isAsync: isAsync,
-  )..fileOffset = fileOffset;
-}
-
-ForInMapEntry createForInMapEntry(
-  int fileOffset,
-  VariableDeclaration variable,
-  Expression iterable,
-  Expression? synthesizedAssignment,
-  Statement? expressionEffects,
-  MapLiteralEntry body,
-  Expression? problem, {
-  bool isAsync = false,
-}) {
-  return new ForInMapEntry(
-    variable,
-    iterable,
-    synthesizedAssignment,
-    expressionEffects,
-    body,
-    problem,
-    isAsync: isAsync,
-  )..fileOffset = fileOffset;
-}
-
 /// Return a representation of an assert that appears in a constructor's
 /// initializer list.
 AssertInitializer createAssertInitializer(
@@ -406,17 +91,33 @@
   )..fileOffset = fileOffset;
 }
 
+AssignedVariablePattern createAssignedVariablePattern(
+  int fileOffset,
+  VariableDeclaration variable,
+) {
+  return new AssignedVariablePattern(variable)..fileOffset = fileOffset;
+}
+
 Expression createAwaitExpression(int fileOffset, Expression operand) {
   return new AwaitExpression(operand)..fileOffset = fileOffset;
 }
 
+BinaryExpression createBinary(
+  int fileOffset,
+  Expression left,
+  Name binaryName,
+  Expression right,
+) {
+  return new BinaryExpression(left, binaryName, right)..fileOffset = fileOffset;
+}
+
 /// Return a representation of a block of [statements] at the given
 /// [fileOffset].
 Block createBlock(
-  int fileOffset,
-  int fileEndOffset,
-  List<Statement> statements,
-) {
+  List<Statement> statements, {
+  required int fileOffset,
+  required int fileEndOffset,
+}) {
   List<Statement>? copy;
   for (int i = 0; i < statements.length; i++) {
     Statement statement = statements[i];
@@ -432,6 +133,20 @@
     ..fileEndOffset = fileEndOffset;
 }
 
+BlockExpression createBlockExpression(
+  Block body,
+  Expression value, {
+  required int fileOffset,
+}) {
+  return new BlockExpression(body, value)..fileOffset = fileOffset;
+}
+
+/// Return a representation of a boolean literal at the given [fileOffset].
+/// The literal has the given [value].
+BoolLiteral createBoolLiteral(int fileOffset, bool value) {
+  return new BoolLiteral(value)..fileOffset = fileOffset;
+}
+
 /// Return a representation of a break statement.
 Statement createBreakStatement(int fileOffset, Object? label) {
   // TODO(johnniwinther): Use [label]?
@@ -440,6 +155,10 @@
     ..target = label is LabeledStatement ? label : dummyLabeledStatement;
 }
 
+CastPattern createCastPattern(int fileOffset, Pattern pattern, DartType type) {
+  return new CastPattern(pattern, type)..fileOffset = fileOffset;
+}
+
 /// Return a representation of a catch clause.
 Catch createCatch(
   int fileOffset,
@@ -475,12 +194,30 @@
   )..fileOffset = fileOffset;
 }
 
+ConstantPattern createConstantPattern(Expression expression) {
+  return new ConstantPattern(expression)..fileOffset = expression.fileOffset;
+}
+
+ConstructorTearOff createConstructorTearOff(int fileOffset, Member target) {
+  assert(
+    target is Constructor || (target is Procedure && target.isFactory),
+    "Unexpected constructor tear off target: $target",
+  );
+  return new ConstructorTearOff(target)..fileOffset = fileOffset;
+}
+
 /// Return a representation of a continue statement.
 Statement createContinueStatement(int fileOffset, Object? label) {
   // TODO(johnniwinther): Use [label]?
   return new BreakStatementImpl(isContinue: true)..fileOffset = fileOffset;
 }
 
+ContinueSwitchStatement createContinueSwitchStatement({
+  required int fileOffset,
+}) {
+  return new ContinueSwitchStatement(dummySwitchCase)..fileOffset = fileOffset;
+}
+
 /// Return a representation of a do statement.
 Statement createDoStatement(
   int fileOffset,
@@ -490,10 +227,43 @@
   return new DoStatement(body, condition)..fileOffset = fileOffset;
 }
 
-/// Return a representation of an expression statement at the given
-/// [fileOffset] containing the [expression].
-Statement createExpressionStatement(int fileOffset, Expression expression) {
-  return new ExpressionStatement(expression)..fileOffset = fileOffset;
+DotShorthand createDotShorthandContext(
+  int fileOffset,
+  Expression innerExpression,
+) {
+  return new DotShorthand(innerExpression)..fileOffset = fileOffset;
+}
+
+DotShorthandInvocation createDotShorthandInvocation(
+  int fileOffset,
+  Name name,
+  TypeArguments? typeArguments,
+  ActualArguments arguments, {
+  required int nameOffset,
+  required bool isConst,
+}) {
+  return new DotShorthandInvocation(
+    name,
+    typeArguments,
+    arguments,
+    nameOffset: nameOffset,
+    isConst: isConst,
+  )..fileOffset = fileOffset;
+}
+
+DotShorthandPropertyGet createDotShorthandPropertyGet(
+  int fileOffset,
+  Name name, {
+  required int nameOffset,
+}) {
+  return new DotShorthandPropertyGet(name, nameOffset: nameOffset)
+    ..fileOffset = fileOffset;
+}
+
+/// Return a representation of a double literal at the given [fileOffset]. The
+/// literal has the given [value].
+DoubleLiteral createDoubleLiteral(int fileOffset, double value) {
+  return new DoubleLiteral(value)..fileOffset = fileOffset;
 }
 
 /// Return a representation of an empty statement  at the given [fileOffset].
@@ -501,6 +271,107 @@
   return new EmptyStatement()..fileOffset = fileOffset;
 }
 
+EqualsExpression createEquals(
+  int fileOffset,
+  Expression left,
+  Expression right, {
+  required bool isNot,
+}) {
+  return new EqualsExpression(left, right, isNot: isNot)
+    ..fileOffset = fileOffset;
+}
+
+Expression createExpressionInvocation(
+  int fileOffset,
+  Expression expression,
+  TypeArguments? typeArguments,
+  ActualArguments arguments,
+) {
+  return new ExpressionInvocation(expression, typeArguments, arguments)
+    ..fileOffset = fileOffset;
+}
+
+/// Return a representation of an expression statement at the given
+/// [fileOffset] containing the [expression].
+Statement createExpressionStatement(
+  Expression expression, {
+  required int fileOffset,
+}) {
+  return new ExpressionStatement(expression)..fileOffset = fileOffset;
+}
+
+ForElement createForElement(
+  int fileOffset,
+  List<VariableDeclaration> variables,
+  Expression? condition,
+  List<Expression> updates,
+  Expression body,
+) {
+  return new ForElement(variables, condition, updates, body)
+    ..fileOffset = fileOffset;
+}
+
+ForInElement createForInElement(
+  InternalForInElement element,
+  Expression iterable,
+  Expression body, {
+  required bool isAsync,
+  required int forOffset,
+  required int fileOffset,
+}) {
+  return new ForInElement(
+    element,
+    iterable,
+    body,
+    isAsync: isAsync,
+    forOffset: forOffset,
+    fileOffset: fileOffset,
+  );
+}
+
+ForInMapEntry createForInMapEntry(
+  InternalForInElement element,
+  Expression iterable,
+  MapLiteralEntry body, {
+  required bool isAsync,
+  required int forOffset,
+  required int fileOffset,
+}) {
+  return new ForInMapEntry(
+    element,
+    iterable,
+    body,
+    isAsync: isAsync,
+    forOffset: forOffset,
+    fileOffset: fileOffset,
+  );
+}
+
+// Coverage-ignore(suite): Not run.
+ForInStatement createForInStatement(
+  VariableDeclaration variable,
+  Expression expression,
+  Statement body, {
+  required bool isAsync,
+  required int fileOffset,
+  required int bodyOffset,
+}) {
+  return new ForInStatement(variable, expression, body, isAsync: isAsync)
+    ..fileOffset = fileOffset
+    ..bodyOffset = bodyOffset;
+}
+
+ForMapEntry createForMapEntry(
+  int fileOffset,
+  List<VariableDeclaration> variables,
+  Expression? condition,
+  List<Expression> updates,
+  MapLiteralEntry body,
+) {
+  return new ForMapEntry(variables, condition, updates, body)
+    ..fileOffset = fileOffset;
+}
+
 /// Return a representation of a for statement.
 Statement createForStatement(
   int fileOffset,
@@ -518,6 +389,76 @@
   )..fileOffset = fileOffset;
 }
 
+FunctionExpression createFunctionExpression(
+  FunctionNode function, {
+  required int fileOffset,
+}) {
+  return new FunctionExpression(function)..fileOffset = fileOffset;
+}
+
+Expression createIfCaseElement(
+  int fileOffset, {
+  required List<Statement> prelude,
+  required Expression expression,
+  required PatternGuard patternGuard,
+  required Expression then,
+  Expression? otherwise,
+}) {
+  return new IfCaseElement(
+    prelude: prelude,
+    expression: expression,
+    patternGuard: patternGuard,
+    then: then,
+    otherwise: otherwise,
+  )..fileOffset = fileOffset;
+}
+
+MapLiteralEntry createIfCaseMapEntry(
+  int fileOffset, {
+  required List<Statement> prelude,
+  required Expression expression,
+  required PatternGuard patternGuard,
+  required MapLiteralEntry then,
+  MapLiteralEntry? otherwise,
+}) {
+  return new IfCaseMapEntry(
+    prelude: prelude,
+    expression: expression,
+    patternGuard: patternGuard,
+    then: then,
+    otherwise: otherwise,
+  )..fileOffset = fileOffset;
+}
+
+IfCaseStatement createIfCaseStatement(
+  int fileOffset,
+  Expression expression,
+  PatternGuard patternGuard,
+  Statement then,
+  Statement? otherwise,
+) {
+  return new IfCaseStatement(expression, patternGuard, then, otherwise)
+    ..fileOffset = fileOffset;
+}
+
+Expression createIfElement(
+  int fileOffset,
+  Expression condition,
+  Expression then, [
+  Expression? otherwise,
+]) {
+  return new IfElement(condition, then, otherwise)..fileOffset = fileOffset;
+}
+
+MapLiteralEntry createIfMapEntry(
+  int fileOffset,
+  Expression condition,
+  MapLiteralEntry then, [
+  MapLiteralEntry? otherwise,
+]) {
+  return new IfMapEntry(condition, then, otherwise)..fileOffset = fileOffset;
+}
+
 /// Return a representation of an `if` statement.
 Statement createIfStatement(
   int fileOffset,
@@ -529,294 +470,6 @@
     ..fileOffset = fileOffset;
 }
 
-/// Return a representation of an `is` expression at the given [fileOffset].
-/// The [operand] is the representation of the left operand. The [type] is a
-/// representation of the type that is the right operand. If [notFileOffset]
-/// is non-null the test is negated the that file offset.
-Expression createIsExpression(
-  int fileOffset,
-  Expression operand,
-  DartType type, {
-  int? notFileOffset,
-}) {
-  Expression result = new IsExpression(operand, type)..fileOffset = fileOffset;
-  if (notFileOffset != null) {
-    result = createNot(notFileOffset, result);
-  }
-  return result;
-}
-
-/// Return a representation of a logical expression at the given [fileOffset]
-/// having the [leftOperand], [rightOperand] and the [operatorString]
-/// (either `&&` or `||`).
-Expression createLogicalExpression(
-  int fileOffset,
-  Expression leftOperand,
-  String operatorString,
-  Expression rightOperand,
-) {
-  LogicalExpressionOperator operator;
-  if (operatorString == '&&') {
-    operator = LogicalExpressionOperator.AND;
-  } else if (operatorString == '||') {
-    operator = LogicalExpressionOperator.OR;
-  } else {
-    throw new UnsupportedError("Unhandled logical operator '$operatorString'");
-  }
-
-  return new LogicalExpression(leftOperand, operator, rightOperand)
-    ..fileOffset = fileOffset;
-}
-
-Expression createNot(int fileOffset, Expression operand) {
-  return new Not(operand)..fileOffset = fileOffset;
-}
-
-/// Return a representation of a rethrow statement consisting of the
-/// rethrow at [rethrowFileOffset] and the statement at [statementFileOffset].
-Statement createRethrowStatement(
-  int rethrowFileOffset,
-  int statementFileOffset,
-) {
-  return new ExpressionStatement(new Rethrow()..fileOffset = rethrowFileOffset)
-    ..fileOffset = statementFileOffset;
-}
-
-/// Return a representation of a return statement.
-Statement createReturnStatement(
-  int fileOffset,
-  Expression? expression, {
-  bool isArrow = true,
-}) {
-  return new ReturnStatementImpl(isArrow, expression)..fileOffset = fileOffset;
-}
-
-Expression createStringConcatenation(
-  int fileOffset,
-  List<Expression> expressions,
-) {
-  assert(fileOffset != TreeNode.noOffset);
-  return new StringConcatenation(expressions)..fileOffset = fileOffset;
-}
-
-/// The given [statement] is being used as the target of either a break or
-/// continue statement. Return the statement that should be used as the actual
-/// target.
-LabeledStatement createLabeledStatement(Statement statement) {
-  return new LabeledStatement(statement)..fileOffset = statement.fileOffset;
-}
-
-Expression createThisExpression(int fileOffset) {
-  return new ThisExpression()..fileOffset = fileOffset;
-}
-
-/// Return a representation of a throw expression at the given [fileOffset].
-Expression createThrow(int fileOffset, Expression expression) {
-  return new Throw(expression)..fileOffset = fileOffset;
-}
-
-Statement createTryStatement(
-  int fileOffset,
-  Statement tryBlock,
-  List<Catch>? catchBlocks,
-  Statement? finallyBlock,
-) {
-  return new TryStatement(tryBlock, catchBlocks ?? <Catch>[], finallyBlock)
-    ..fileOffset = fileOffset;
-}
-
-_VariablesDeclaration variablesDeclaration(
-  List<VariableDeclaration> declarations,
-  Uri uri,
-) {
-  return new _VariablesDeclaration(declarations, uri);
-}
-
-List<VariableDeclaration> variablesDeclarationExtractDeclarations(
-  Object? variablesDeclaration,
-) {
-  return (variablesDeclaration as _VariablesDeclaration).declarations;
-}
-
-Statement wrapVariables(Statement statement) {
-  if (statement is _VariablesDeclaration) {
-    return new Block(
-      new List<Statement>.of(statement.declarations, growable: true),
-    )..fileOffset = statement.fileOffset;
-  } else if (statement is VariableDeclaration) {
-    return new Block(<Statement>[statement])..fileOffset = statement.fileOffset;
-  } else {
-    return statement;
-  }
-}
-
-/// Return a representation of a while statement at the given [fileOffset]
-/// consisting of the given [condition] and [body].
-Statement createWhileStatement(
-  int fileOffset,
-  Expression condition,
-  Statement body,
-) {
-  return new WhileStatement(condition, body)..fileOffset = fileOffset;
-}
-
-/// Return a representation of a yield statement at the given [fileOffset]
-/// of the given [expression]. If [isYieldStar] is `true` the created
-/// statement is a yield* statement.
-Statement createYieldStatement(
-  int fileOffset,
-  Expression expression, {
-  required bool isYieldStar,
-}) {
-  return new YieldStatement(expression, isYieldStar: isYieldStar)
-    ..fileOffset = fileOffset;
-}
-
-bool isErroneousNode(Object? node) {
-  if (node is ExpressionStatement) {
-    // Coverage-ignore-block(suite): Not run.
-    ExpressionStatement statement = node;
-    node = statement.expression;
-  }
-  if (node is VariableDeclaration) {
-    // Coverage-ignore-block(suite): Not run.
-    VariableDeclaration variable = node;
-    node = variable.initializer;
-  }
-  if (node is Let) {
-    // Coverage-ignore-block(suite): Not run.
-    Let let = node;
-    node = let.variable.initializer;
-  }
-  return node is InvalidExpression;
-}
-
-bool isThisExpression(Object node) =>
-    node is Expression && ast_helper.isThisExpression(node);
-
-bool isVariablesDeclaration(Object? node) => node is _VariablesDeclaration;
-
-/// Creates [VariableDeclaration] for a variable named [name] at the given
-/// [functionNestingLevel].
-VariableDeclaration createVariableDeclaration(
-  int fileOffset,
-  String? name, {
-  Expression? initializer,
-  DartType? type,
-  bool isFinal = false,
-  bool isConst = false,
-  bool isInitializingFormal = false,
-  bool isSuperInitializingFormal = false,
-  bool isCovariantByDeclaration = false,
-  bool isLocalFunction = false,
-  bool isSynthesized = false,
-}) {
-  return new VariableDeclarationImpl(
-    name,
-    type: type,
-    initializer: initializer,
-    isFinal: isFinal,
-    isConst: isConst,
-    isInitializingFormal: isInitializingFormal,
-    isSuperInitializingFormal: isSuperInitializingFormal,
-    isCovariantByDeclaration: isCovariantByDeclaration,
-    isLocalFunction: isLocalFunction,
-    isSynthesized: isSynthesized,
-    hasDeclaredInitializer: initializer != null,
-  )..fileOffset = fileOffset;
-}
-
-VariableDeclarationImpl createVariableDeclarationForValue(
-  Expression initializer, {
-  DartType type = const DynamicType(),
-}) {
-  return new VariableDeclarationImpl.forValue(initializer)
-    ..type = type
-    ..fileOffset = initializer.fileOffset;
-}
-
-TypeParameterType createTypeParameterTypeWithDefaultNullabilityForLibrary(
-  TypeParameter typeParameter,
-  Library library,
-) {
-  return new TypeParameterType.withDefaultNullability(typeParameter);
-}
-
-Expression createExpressionInvocation(
-  int fileOffset,
-  Expression expression,
-  TypeArguments? typeArguments,
-  ActualArguments arguments,
-) {
-  return new ExpressionInvocation(expression, typeArguments, arguments)
-    ..fileOffset = fileOffset;
-}
-
-Expression createMethodInvocation(
-  int fileOffset,
-  Expression expression,
-  Name name,
-  TypeArguments? typeArguments,
-  ActualArguments arguments, {
-  required bool isNullAware,
-}) {
-  return new MethodInvocation(
-    expression,
-    name,
-    typeArguments,
-    arguments,
-    isNullAware: isNullAware,
-  )..fileOffset = fileOffset;
-}
-
-Expression createSuperMethodInvocation(
-  int fileOffset,
-  Name name,
-  Procedure procedure,
-  TypeArguments? typeArguments,
-  ActualArguments arguments,
-) {
-  return new InternalSuperMethodInvocation(
-    name,
-    typeArguments,
-    arguments,
-    procedure,
-  )..fileOffset = fileOffset;
-}
-
-NullCheck createNullCheck(int fileOffset, Expression expression) {
-  return new NullCheck(expression)..fileOffset = fileOffset;
-}
-
-Expression createPropertyGet(
-  int fileOffset,
-  Expression receiver,
-  Name name, {
-  required bool isNullAware,
-}) {
-  return new PropertyGet(receiver, name, isNullAware: isNullAware)
-    ..fileOffset = fileOffset;
-}
-
-Expression createPropertySet(
-  int fileOffset,
-  Expression receiver,
-  Name name,
-  Expression value, {
-  required bool forEffect,
-  bool readOnlyReceiver = false,
-  required bool isNullAware,
-}) {
-  return new PropertySet(
-    receiver,
-    name,
-    value,
-    forEffect: forEffect,
-    readOnlyReceiver: readOnlyReceiver,
-    isNullAware: isNullAware,
-  )..fileOffset = fileOffset;
-}
-
 IndexGet createIndexGet(
   int fileOffset,
   Expression receiver,
@@ -844,112 +497,26 @@
   )..fileOffset = fileOffset;
 }
 
-VariableGet createVariableGet(int fileOffset, VariableDeclaration variable) {
-  return new VariableGet(variable)..fileOffset = fileOffset;
-}
-
-EqualsExpression createEquals(
-  int fileOffset,
-  Expression left,
-  Expression right, {
-  required bool isNot,
-}) {
-  return new EqualsExpression(left, right, isNot: isNot)
-    ..fileOffset = fileOffset;
-}
-
-BinaryExpression createBinary(
-  int fileOffset,
-  Expression left,
-  Name binaryName,
-  Expression right,
-) {
-  return new BinaryExpression(left, binaryName, right)..fileOffset = fileOffset;
-}
-
-UnaryExpression createUnary(
-  int fileOffset,
-  Name unaryName,
-  Expression expression,
-) {
-  return new UnaryExpression(unaryName, expression)..fileOffset = fileOffset;
-}
-
-ParenthesizedExpression createParenthesized(
-  int fileOffset,
-  Expression expression,
-) {
-  return new ParenthesizedExpression(expression)..fileOffset = fileOffset;
-}
-
-ConstructorTearOff createConstructorTearOff(int fileOffset, Member target) {
-  assert(
-    target is Constructor || (target is Procedure && target.isFactory),
-    "Unexpected constructor tear off target: $target",
-  );
-  return new ConstructorTearOff(target)..fileOffset = fileOffset;
-}
-
-StaticTearOff createStaticTearOff(int fileOffset, Procedure procedure) {
-  assert(
-    procedure.kind == ProcedureKind.Method,
-    "Unexpected static tear off target: $procedure",
-  );
-  assert(
-    !procedure.isRedirectingFactory,
-    "Unexpected static tear off target: $procedure",
-  );
-  return new StaticTearOff(procedure)..fileOffset = fileOffset;
-}
-
-StaticGet createStaticGet(int fileOffset, Member target) {
-  assert(target is Field || (target is Procedure && target.isGetter));
-  return new StaticGet(target)..fileOffset = fileOffset;
-}
-
-RedirectingFactoryTearOff createRedirectingFactoryTearOff(
-  int fileOffset,
-  Procedure procedure,
-) {
-  assert(procedure.isRedirectingFactory);
-  return new RedirectingFactoryTearOff(procedure)..fileOffset = fileOffset;
-}
-
 Instantiation createInstantiation(
-  int fileOffset,
   Expression expression,
-  List<DartType> typeArguments,
-) {
+  List<DartType> typeArguments, {
+  required int fileOffset,
+}) {
   return new Instantiation(expression, typeArguments)..fileOffset = fileOffset;
 }
 
-TypedefTearOff createTypedefTearOff(
+/// Return a representation of an integer literal at the given [fileOffset].
+/// The literal has the given [value].
+Expression createIntLiteral(int fileOffset, int value, [String? literal]) {
+  return new InternalIntLiteral(value, literal, fileOffset: fileOffset);
+}
+
+Expression createIntLiteralLarge(
   int fileOffset,
-  List<StructuralParameter> typeParameters,
-  Expression expression,
-  List<DartType> typeArguments,
+  String strippedLiteral,
+  String literal,
 ) {
-  return new TypedefTearOff(typeParameters, expression, typeArguments)
-    ..fileOffset = fileOffset;
-}
-
-AndPattern createAndPattern(int fileOffset, Pattern left, Pattern right) {
-  return new AndPattern(left, right)..fileOffset = fileOffset;
-}
-
-AssignedVariablePattern createAssignedVariablePattern(
-  int fileOffset,
-  VariableDeclaration variable,
-) {
-  return new AssignedVariablePattern(variable)..fileOffset = fileOffset;
-}
-
-CastPattern createCastPattern(int fileOffset, Pattern pattern, DartType type) {
-  return new CastPattern(pattern, type)..fileOffset = fileOffset;
-}
-
-ConstantPattern createConstantPattern(Expression expression) {
-  return new ConstantPattern(expression)..fileOffset = expression.fileOffset;
+  return new LargeIntLiteral(strippedLiteral, literal, fileOffset: fileOffset);
 }
 
 InvalidPattern createInvalidPattern(
@@ -960,6 +527,61 @@
     ..fileOffset = expression.fileOffset;
 }
 
+/// Return a representation of an `is` expression at the given [fileOffset].
+/// The [operand] is the representation of the left operand. The [type] is a
+/// representation of the type that is the right operand. If [notFileOffset]
+/// is non-null the test is negated the that file offset.
+Expression createIsExpression(
+  int fileOffset,
+  Expression operand,
+  DartType type, {
+  int? notFileOffset,
+}) {
+  Expression result = new IsExpression(operand, type)..fileOffset = fileOffset;
+  if (notFileOffset != null) {
+    result = createNot(notFileOffset, result);
+  }
+  return result;
+}
+
+/// The given [statement] is being used as the target of either a break or
+/// continue statement. Return the statement that should be used as the actual
+/// target.
+LabeledStatement createLabeledStatement(Statement statement) {
+  return new LabeledStatement(statement)..fileOffset = statement.fileOffset;
+}
+
+Let createLetForEffect({
+  required Expression effect,
+  required DartType effectType,
+  required Expression expression,
+}) {
+  return new Let(
+    createVariableDeclarationForValue(effect, type: effectType),
+    expression,
+  )..fileOffset = effect.fileOffset;
+}
+
+/// Return a representation of a list literal at the given [fileOffset]. The
+/// [isConst] is `true` if the literal is either explicitly or implicitly a
+/// constant. The [typeArgument] is the representation of the single valid
+/// type argument preceding the list literal, or `null` if there is no type
+/// argument, there is more than one type argument, or if the type argument
+/// cannot be resolved. The list of [expressions] is a list of the
+/// representations of the list elements.
+ListLiteral createListLiteral(
+  int fileOffset,
+  DartType typeArgument,
+  List<Expression> expressions, {
+  required bool isConst,
+}) {
+  return new ListLiteral(
+    expressions,
+    typeArgument: typeArgument,
+    isConst: isConst,
+  )..fileOffset = fileOffset;
+}
+
 ListPattern createListPattern(
   int fileOffset,
   DartType? typeArgument,
@@ -968,6 +590,99 @@
   return new ListPattern(typeArgument, patterns)..fileOffset = fileOffset;
 }
 
+LoadLibrary createLoadLibrary(
+  int fileOffset,
+  LibraryDependency dependency,
+  ActualArguments? arguments,
+) {
+  return new LoadLibraryImpl(dependency, arguments)..fileOffset = fileOffset;
+}
+
+LocalVariable createLocalVariable({
+  required String? cosmeticName,
+  required DartType? type,
+  bool isFinal = false,
+  bool isConst = false,
+  bool isLate = false,
+  bool isWildcard = false,
+  required int fileOffset,
+}) {
+  return new LocalVariable(
+    cosmeticName: cosmeticName,
+    type: type,
+    isFinal: isFinal,
+    isConst: isConst,
+    isLate: isLate,
+    isWildcard: isWildcard,
+  )..fileOffset = fileOffset;
+}
+
+/// Return a representation of a logical expression at the given [fileOffset]
+/// having the [leftOperand], [rightOperand] and the [operatorString]
+/// (either `&&` or `||`).
+Expression createLogicalExpression(
+  int fileOffset,
+  Expression leftOperand,
+  String operatorString,
+  Expression rightOperand,
+) {
+  LogicalExpressionOperator operator;
+  if (operatorString == '&&') {
+    operator = LogicalExpressionOperator.AND;
+  } else if (operatorString == '||') {
+    operator = LogicalExpressionOperator.OR;
+  } else {
+    throw new UnsupportedError("Unhandled logical operator '$operatorString'");
+  }
+
+  return new LogicalExpression(leftOperand, operator, rightOperand)
+    ..fileOffset = fileOffset;
+}
+
+/// Return a representation of a key/value pair in a literal map at the given
+/// [fileOffset]. The [key] is the representation of the expression used to
+/// compute the key. The [value] is the representation of the expression used
+/// to compute the value.
+MapLiteralEntry createMapEntry(
+  int fileOffset,
+  Expression key,
+  Expression value,
+) {
+  return new MapLiteralEntry(key, value)..fileOffset = fileOffset;
+}
+
+/// Return a representation of a map literal at the given [fileOffset]. The
+/// [isConst] is `true` if the literal is either explicitly or implicitly a
+/// constant. The [keyType] is the representation of the first type argument
+/// preceding the map literal, or `null` if there are not exactly two type
+/// arguments or if the first type argument cannot be resolved. The
+/// [valueType] is the representation of the second type argument preceding
+/// the map literal, or `null` if there are not exactly two type arguments or
+/// if the second type argument cannot be resolved. The list of [entries] is a
+/// list of the representations of the map entries.
+MapLiteral createMapLiteral(
+  int fileOffset,
+  DartType keyType,
+  DartType valueType,
+  List<MapLiteralEntry> entries, {
+  required bool isConst,
+}) {
+  return new MapLiteral(
+    entries,
+    keyType: keyType,
+    valueType: valueType,
+    isConst: isConst,
+  )..fileOffset = fileOffset;
+}
+
+MapLiteralEntry createMapLiteralEntry(
+  Expression key,
+  Expression value, {
+  required int fileOffset,
+}) {
+  return new MapLiteralEntry(key, value)..fileOffset = fileOffset;
+}
+
 MapPattern createMapPattern(
   int fileOffset,
   DartType? keyType,
@@ -989,18 +704,80 @@
   return new MapPatternRestEntry()..fileOffset = fileOffset;
 }
 
+Expression createMethodInvocation(
+  int fileOffset,
+  Expression expression,
+  Name name,
+  TypeArguments? typeArguments,
+  ActualArguments arguments, {
+  required bool isNullAware,
+}) {
+  return new MethodInvocation(
+    expression,
+    name,
+    typeArguments,
+    arguments,
+    isNullAware: isNullAware,
+  )..fileOffset = fileOffset;
+}
+
+NamedExpression createNamedExpression(
+  String name,
+  Expression value, {
+  required int fileOffset,
+}) {
+  return new NamedExpression(name, value)..fileOffset = fileOffset;
+}
+
 NamedPattern createNamedPattern(int fileOffset, String name, Pattern pattern) {
   return new NamedPattern(name, pattern)..fileOffset = fileOffset;
 }
 
+Expression createNot(int fileOffset, Expression operand) {
+  return new Not(operand)..fileOffset = fileOffset;
+}
+
 NullAssertPattern createNullAssertPattern(int fileOffset, Pattern pattern) {
   return new NullAssertPattern(pattern)..fileOffset = fileOffset;
 }
 
+Expression createNullAwareElement(int fileOffset, Expression expression) {
+  return new NullAwareElement(expression)..fileOffset = fileOffset;
+}
+
+/// Return a representation of a null-aware key/value pair, were either the
+/// key or the value might be `null`, in a literal map at the given
+/// [fileOffset]. The [key] is the representation of the expression used to
+/// compute the key. The [value] is the representation of the expression used
+/// to compute the value.
+NullAwareMapEntry createNullAwareMapEntry(
+  int fileOffset, {
+  required bool isKeyNullAware,
+  required Expression key,
+  required bool isValueNullAware,
+  required Expression value,
+}) {
+  return new NullAwareMapEntry(
+    isKeyNullAware: isKeyNullAware,
+    key: key,
+    isValueNullAware: isValueNullAware,
+    value: value,
+  )..fileOffset = fileOffset;
+}
+
+NullCheck createNullCheck(int fileOffset, Expression expression) {
+  return new NullCheck(expression)..fileOffset = fileOffset;
+}
+
 NullCheckPattern createNullCheckPattern(int fileOffset, Pattern pattern) {
   return new NullCheckPattern(pattern)..fileOffset = fileOffset;
 }
 
+/// Return a representation of a null literal at the given [fileOffset].
+NullLiteral createNullLiteral(int fileOffset) {
+  return new NullLiteral()..fileOffset = fileOffset;
+}
+
 OrPattern createOrPattern(
   int fileOffset,
   Pattern left,
@@ -1014,32 +791,57 @@
   )..fileOffset = fileOffset;
 }
 
-RecordPattern createRecordPattern(int fileOffset, List<Pattern> patterns) {
-  return new RecordPattern(patterns)..fileOffset = fileOffset;
-}
-
-RelationalPattern createRelationalPattern(
+ParenthesizedExpression createParenthesized(
   int fileOffset,
-  RelationalPatternKind kind,
   Expression expression,
 ) {
-  return new RelationalPattern(kind, expression)..fileOffset = fileOffset;
+  return new ParenthesizedExpression(expression)..fileOffset = fileOffset;
 }
 
-RestPattern createRestPattern(int fileOffset, Pattern? subPattern) {
-  return new RestPattern(subPattern)..fileOffset = fileOffset;
-}
-
-VariablePattern createVariablePattern(
+PatternAssignment createPatternAssignment(
   int fileOffset,
-  DartType? type,
-  VariableDeclaration variable,
+  Pattern pattern,
+  Expression expression,
 ) {
-  return new VariablePattern(type, variable)..fileOffset = fileOffset;
+  return new PatternAssignment(pattern, expression)..fileOffset = fileOffset;
 }
 
-WildcardPattern createWildcardPattern(int fileOffset, DartType? type) {
-  return new WildcardPattern(type)..fileOffset = fileOffset;
+PatternForElement createPatternForElement(
+  int fileOffset, {
+  required PatternVariableDeclaration patternVariableDeclaration,
+  required List<VariableDeclaration> intermediateVariables,
+  required List<VariableDeclaration> variables,
+  required Expression? condition,
+  required List<Expression> updates,
+  required Expression body,
+}) {
+  return new PatternForElement(
+    patternVariableDeclaration: patternVariableDeclaration,
+    intermediateVariables: intermediateVariables,
+    variables: variables,
+    condition: condition,
+    updates: updates,
+    body: body,
+  )..fileOffset = fileOffset;
+}
+
+PatternForMapEntry createPatternForMapEntry(
+  int fileOffset, {
+  required PatternVariableDeclaration patternVariableDeclaration,
+  required List<VariableDeclaration> intermediateVariables,
+  required List<VariableDeclaration> variableInitializations,
+  required Expression? condition,
+  required List<Expression> updates,
+  required MapLiteralEntry body,
+}) {
+  return new PatternForMapEntry(
+    patternVariableDeclaration: patternVariableDeclaration,
+    intermediateVariables: intermediateVariables,
+    variables: variableInitializations,
+    condition: condition,
+    updates: updates,
+    body: body,
+  )..fileOffset = fileOffset;
 }
 
 PatternGuard createPatternGuard(
@@ -1079,12 +881,190 @@
   return new PatternSwitchStatement(expression, cases)..fileOffset = fileOffset;
 }
 
-SwitchExpressionCase createSwitchExpressionCase(
+PatternVariableDeclaration createPatternVariableDeclaration(
   int fileOffset,
-  PatternGuard patternGuard,
+  Pattern pattern,
+  Expression initializer, {
+  required bool isFinal,
+}) {
+  return new PatternVariableDeclaration(pattern, initializer, isFinal: isFinal)
+    ..fileOffset = fileOffset;
+}
+
+Expression createPropertyGet(
+  int fileOffset,
+  Expression receiver,
+  Name name, {
+  required bool isNullAware,
+}) {
+  return new PropertyGet(receiver, name, isNullAware: isNullAware)
+    ..fileOffset = fileOffset;
+}
+
+Expression createPropertySet(
+  int fileOffset,
+  Expression receiver,
+  Name name,
+  Expression value, {
+  required bool forEffect,
+  bool readOnlyReceiver = false,
+  required bool isNullAware,
+}) {
+  return new PropertySet(
+    receiver,
+    name,
+    value,
+    forEffect: forEffect,
+    readOnlyReceiver: readOnlyReceiver,
+    isNullAware: isNullAware,
+  )..fileOffset = fileOffset;
+}
+
+RecordPattern createRecordPattern(int fileOffset, List<Pattern> patterns) {
+  return new RecordPattern(patterns)..fileOffset = fileOffset;
+}
+
+RedirectingFactoryTearOff createRedirectingFactoryTearOff(
+  int fileOffset,
+  Procedure procedure,
+) {
+  assert(procedure.isRedirectingFactory);
+  return new RedirectingFactoryTearOff(procedure)..fileOffset = fileOffset;
+}
+
+RelationalPattern createRelationalPattern(
+  int fileOffset,
+  RelationalPatternKind kind,
   Expression expression,
 ) {
-  return new SwitchExpressionCase(patternGuard, expression)
+  return new RelationalPattern(kind, expression)..fileOffset = fileOffset;
+}
+
+RestPattern createRestPattern(int fileOffset, Pattern? subPattern) {
+  return new RestPattern(subPattern)..fileOffset = fileOffset;
+}
+
+/// Return a representation of a rethrow statement consisting of the
+/// rethrow at [rethrowFileOffset] and the statement at [statementFileOffset].
+Statement createRethrowStatement(
+  int rethrowFileOffset,
+  int statementFileOffset,
+) {
+  return new ExpressionStatement(new Rethrow()..fileOffset = rethrowFileOffset)
+    ..fileOffset = statementFileOffset;
+}
+
+/// Return a representation of a return statement.
+Statement createReturnStatement(
+  int fileOffset,
+  Expression? expression, {
+  bool isArrow = true,
+}) {
+  return new ReturnStatementImpl(isArrow, expression)..fileOffset = fileOffset;
+}
+
+/// Return a representation of a set literal at the given [fileOffset]. The
+/// [isConst] is `true` if the literal is either explicitly or implicitly a
+/// constant. The [typeArgument] is the representation of the single valid
+/// type argument preceding the set literal, or `null` if there is no type
+/// argument, there is more than one type argument, or if the type argument
+/// cannot be resolved. The list of [expressions] is a list of the
+/// representations of the set elements.
+SetLiteral createSetLiteral(
+  int fileOffset,
+  DartType typeArgument,
+  List<Expression> expressions, {
+  required bool isConst,
+}) {
+  return new SetLiteral(
+    expressions,
+    typeArgument: typeArgument,
+    isConst: isConst,
+  )..fileOffset = fileOffset;
+}
+
+Expression createSpreadElement(
+  int fileOffset,
+  Expression expression, {
+  required bool isNullAware,
+}) {
+  return new SpreadElement(expression, isNullAware: isNullAware)
+    ..fileOffset = fileOffset;
+}
+
+StaticGet createStaticGet(int fileOffset, Member target) {
+  assert(target is Field || (target is Procedure && target.isGetter));
+  return new StaticGet(target)..fileOffset = fileOffset;
+}
+
+StaticSet createStaticSet(
+  Member target,
+  Expression value, {
+  required int fileOffset,
+}) {
+  assert(target is Field || (target is Procedure && target.isSetter));
+  return new StaticSet(target, value)..fileOffset = fileOffset;
+}
+
+StaticTearOff createStaticTearOff(int fileOffset, Procedure procedure) {
+  assert(
+    procedure.kind == ProcedureKind.Method,
+    "Unexpected static tear off target: $procedure",
+  );
+  assert(
+    !procedure.isRedirectingFactory,
+    "Unexpected static tear off target: $procedure",
+  );
+  return new StaticTearOff(procedure)..fileOffset = fileOffset;
+}
+
+Expression createStringConcatenation(
+  int fileOffset,
+  List<Expression> expressions,
+) {
+  assert(fileOffset != TreeNode.noOffset);
+  return new StringConcatenation(expressions)..fileOffset = fileOffset;
+}
+
+/// Return a representation of a simple string literal at the given
+/// [fileOffset]. The literal has the given [value]. This does not include
+/// either adjacent strings or interpolated strings.
+StringLiteral createStringLiteral(int fileOffset, String value) {
+  return new StringLiteral(value)..fileOffset = fileOffset;
+}
+
+Expression createSuperMethodInvocation(
+  int fileOffset,
+  Name name,
+  Procedure procedure,
+  TypeArguments? typeArguments,
+  ActualArguments arguments,
+) {
+  return new InternalSuperMethodInvocation(
+    name,
+    typeArguments,
+    arguments,
+    procedure,
+  )..fileOffset = fileOffset;
+}
+
+SuperPropertyGet createSuperPropertyGet(
+  Expression receiver,
+  Name name,
+  Member target, {
+  required int fileOffset,
+}) {
+  return new SuperPropertyGet(receiver, name, target)..fileOffset = fileOffset;
+}
+
+SuperPropertySet createSuperPropertySet(
+  Expression receiver,
+  Name name,
+  Member target,
+  Expression value, {
+  required int fileOffset,
+}) {
+  return new SuperPropertySet(receiver, name, value, target)
     ..fileOffset = fileOffset;
 }
 
@@ -1096,68 +1076,245 @@
   return new SwitchExpression(expression, cases)..fileOffset = fileOffset;
 }
 
-PatternVariableDeclaration createPatternVariableDeclaration(
+SwitchExpressionCase createSwitchExpressionCase(
   int fileOffset,
-  Pattern pattern,
-  Expression initializer, {
-  required bool isFinal,
-}) {
-  return new PatternVariableDeclaration(pattern, initializer, isFinal: isFinal)
-    ..fileOffset = fileOffset;
-}
-
-PatternAssignment createPatternAssignment(
-  int fileOffset,
-  Pattern pattern,
-  Expression expression,
-) {
-  return new PatternAssignment(pattern, expression)..fileOffset = fileOffset;
-}
-
-IfCaseStatement createIfCaseStatement(
-  int fileOffset,
-  Expression expression,
   PatternGuard patternGuard,
-  Statement then,
-  Statement? otherwise,
+  Expression expression,
 ) {
-  return new IfCaseStatement(expression, patternGuard, then, otherwise)
+  return new SwitchExpressionCase(patternGuard, expression)
     ..fileOffset = fileOffset;
 }
 
-DotShorthand createDotShorthandContext(
-  int fileOffset,
-  Expression innerExpression,
-) {
-  return new DotShorthand(innerExpression)..fileOffset = fileOffset;
+SwitchStatement createSwitchStatement(
+  Expression expression,
+  List<SwitchCase> cases, {
+  required int fileOffset,
+}) {
+  return new SwitchStatement(expression, cases)..fileOffset = fileOffset;
 }
 
-DotShorthandInvocation createDotShorthandInvocation(
-  int fileOffset,
-  Name name,
-  TypeArguments? typeArguments,
-  ActualArguments arguments, {
-  required int nameOffset,
-  required bool isConst,
+/// Return a representation of a symbol literal defined by [value] at the
+/// given [fileOffset].
+SymbolLiteral createSymbolLiteral(int fileOffset, String value) {
+  return new SymbolLiteral(value)..fileOffset = fileOffset;
+}
+
+// Coverage-ignore(suite): Not run.
+SyntheticVariable createSyntheticVariable({
+  required DartType type,
+  required int fileOffset,
 }) {
-  return new DotShorthandInvocation(
+  return new SyntheticVariable(type: type)..fileOffset = fileOffset;
+}
+
+Expression createThisExpression({required int fileOffset}) {
+  return new ThisExpression()..fileOffset = fileOffset;
+}
+
+ThisVariable createThisVariable({
+  required DartType type,
+  required int fileOffset,
+}) {
+  return new ThisVariable(type: type)..fileOffset = fileOffset;
+}
+
+/// Return a representation of a throw expression at the given [fileOffset].
+Expression createThrow(int fileOffset, Expression expression) {
+  return new Throw(expression)..fileOffset = fileOffset;
+}
+
+Statement createTryStatement(
+  int fileOffset,
+  Statement tryBlock,
+  List<Catch>? catchBlocks,
+  Statement? finallyBlock,
+) {
+  return new TryStatement(tryBlock, catchBlocks ?? <Catch>[], finallyBlock)
+    ..fileOffset = fileOffset;
+}
+
+TypedefTearOff createTypedefTearOff(
+  int fileOffset,
+  List<StructuralParameter> typeParameters,
+  Expression expression,
+  List<DartType> typeArguments,
+) {
+  return new TypedefTearOff(typeParameters, expression, typeArguments)
+    ..fileOffset = fileOffset;
+}
+
+TypeLiteral createTypeLiteral(int fileOffset, DartType type) {
+  return new TypeLiteral(type)..fileOffset = fileOffset;
+}
+
+TypeParameterType createTypeParameterTypeWithDefaultNullabilityForLibrary(
+  TypeParameter typeParameter,
+  Library library,
+) {
+  return new TypeParameterType.withDefaultNullability(typeParameter);
+}
+
+UnaryExpression createUnary(
+  int fileOffset,
+  Name unaryName,
+  Expression expression,
+) {
+  return new UnaryExpression(unaryName, expression)..fileOffset = fileOffset;
+}
+
+/// Creates [VariableDeclaration] for a variable named [name] at the given
+/// [functionNestingLevel].
+VariableDeclaration createVariableDeclaration(
+  int fileOffset,
+  String? name, {
+  Expression? initializer,
+  DartType? type,
+  bool isFinal = false,
+  bool isConst = false,
+  bool isInitializingFormal = false,
+  bool isSuperInitializingFormal = false,
+  bool isCovariantByDeclaration = false,
+  bool isLocalFunction = false,
+  bool isSynthesized = false,
+}) {
+  return new VariableDeclarationImpl(
     name,
-    typeArguments,
-    arguments,
-    nameOffset: nameOffset,
+    type: type,
+    initializer: initializer,
+    isFinal: isFinal,
     isConst: isConst,
+    isInitializingFormal: isInitializingFormal,
+    isSuperInitializingFormal: isSuperInitializingFormal,
+    isCovariantByDeclaration: isCovariantByDeclaration,
+    isLocalFunction: isLocalFunction,
+    isSynthesized: isSynthesized,
+    hasDeclaredInitializer: initializer != null,
+    fileOffset: fileOffset,
+  );
+}
+
+VariableDeclarationImpl createVariableDeclarationForValue(
+  Expression initializer, {
+  DartType type = const DynamicType(),
+}) {
+  return new VariableDeclarationImpl.forValue(initializer)
+    ..type = type
+    ..fileOffset = initializer.fileOffset;
+}
+
+InternalVariableGet createVariableGet(
+  VariableDeclaration variable, {
+  required int fileOffset,
+}) {
+  return new InternalVariableGet(variable as InternalVariable)
+    ..fileOffset = fileOffset;
+}
+
+VariableInitialization createVariableInitialization({
+  required VariableDeclaration variable,
+  required Expression? initializer,
+  required bool hasDeclaredInitializer,
+  required int fileOffset,
+}) {
+  return new VariableInitialization(
+    variable: variable,
+    initializer: initializer,
+    hasDeclaredInitializer: hasDeclaredInitializer,
   )..fileOffset = fileOffset;
 }
 
-DotShorthandPropertyGet createDotShorthandPropertyGet(
+VariablePattern createVariablePattern(
   int fileOffset,
-  Name name, {
-  required int nameOffset,
+  DartType? type,
+  VariableDeclaration variable,
+) {
+  return new VariablePattern(type, variable)..fileOffset = fileOffset;
+}
+
+InternalVariableSet createVariableSet(
+  VariableDeclaration variable,
+  Expression value, {
+  required int fileOffset,
 }) {
-  return new DotShorthandPropertyGet(name, nameOffset: nameOffset)
+  return new InternalVariableSet(variable as InternalVariable, value)
     ..fileOffset = fileOffset;
 }
 
+/// Return a representation of a while statement at the given [fileOffset]
+/// consisting of the given [condition] and [body].
+Statement createWhileStatement(
+  int fileOffset,
+  Expression condition,
+  Statement body,
+) {
+  return new WhileStatement(condition, body)..fileOffset = fileOffset;
+}
+
+WildcardPattern createWildcardPattern(int fileOffset, DartType? type) {
+  return new WildcardPattern(type)..fileOffset = fileOffset;
+}
+
+/// Return a representation of a yield statement at the given [fileOffset]
+/// of the given [expression]. If [isYieldStar] is `true` the created
+/// statement is a yield* statement.
+Statement createYieldStatement(
+  int fileOffset,
+  Expression expression, {
+  required bool isYieldStar,
+}) {
+  return new YieldStatement(expression, isYieldStar: isYieldStar)
+    ..fileOffset = fileOffset;
+}
+
+bool isErroneousNode(Object? node) {
+  if (node is ExpressionStatement) {
+    // Coverage-ignore-block(suite): Not run.
+    ExpressionStatement statement = node;
+    node = statement.expression;
+  }
+  if (node is VariableDeclaration) {
+    // Coverage-ignore-block(suite): Not run.
+    VariableDeclaration variable = node;
+    node = variable.initializer;
+  }
+  if (node is Let) {
+    // Coverage-ignore-block(suite): Not run.
+    Let let = node;
+    node = let.variable.initializer;
+  }
+  return node is InvalidExpression;
+}
+
+bool isThisExpression(Object node) =>
+    node is Expression && ast_helper.isThisExpression(node);
+
+bool isVariablesDeclaration(Object? node) => node is _VariablesDeclaration;
+
+_VariablesDeclaration variablesDeclaration(
+  List<VariableDeclaration> declarations,
+  Uri uri,
+) {
+  return new _VariablesDeclaration(declarations, uri);
+}
+
+List<VariableDeclaration> variablesDeclarationExtractDeclarations(
+  Object? variablesDeclaration,
+) {
+  return (variablesDeclaration as _VariablesDeclaration).declarations;
+}
+
+Statement wrapVariables(Statement statement) {
+  if (statement is _VariablesDeclaration) {
+    return new Block(
+      new List<Statement>.of(statement.declarations, growable: true),
+    )..fileOffset = statement.fileOffset;
+  } else if (statement is VariableDeclaration) {
+    return new Block(<Statement>[statement])..fileOffset = statement.fileOffset;
+  } else {
+    return statement;
+  }
+}
+
 class _VariablesDeclaration extends AuxiliaryStatement {
   final List<VariableDeclaration> declarations;
   final Uri uri;
@@ -1179,24 +1336,6 @@
   }
 
   @override
-  // Coverage-ignore(suite): Not run.
-  Never visitChildren(v) {
-    throw unsupported("visitChildren", fileOffset, uri);
-  }
-
-  @override
-  // Coverage-ignore(suite): Not run.
-  Never transformChildren(v) {
-    throw unsupported("transformChildren", fileOffset, uri);
-  }
-
-  @override
-  // Coverage-ignore(suite): Not run.
-  Never transformOrRemoveChildren(v) {
-    throw unsupported("transformOrRemoveChildren", fileOffset, uri);
-  }
-
-  @override
   String toString() {
     return "_VariablesDeclaration(${toStringInternal()})";
   }
@@ -1215,4 +1354,22 @@
     }
     printer.write(';');
   }
+
+  @override
+  // Coverage-ignore(suite): Not run.
+  Never transformChildren(v) {
+    throw unsupported("transformChildren", fileOffset, uri);
+  }
+
+  @override
+  // Coverage-ignore(suite): Not run.
+  Never transformOrRemoveChildren(v) {
+    throw unsupported("transformOrRemoveChildren", fileOffset, uri);
+  }
+
+  @override
+  // Coverage-ignore(suite): Not run.
+  Never visitChildren(v) {
+    throw unsupported("visitChildren", fileOffset, uri);
+  }
 }
diff --git a/pkg/front_end/lib/src/kernel/resolver.dart b/pkg/front_end/lib/src/kernel/resolver.dart
index 50b1032..fb03243 100644
--- a/pkg/front_end/lib/src/kernel/resolver.dart
+++ b/pkg/front_end/lib/src/kernel/resolver.dart
@@ -1004,6 +1004,7 @@
           scopeProviderInfo: null,
           contextAllocationStrategy:
               InferenceVisitorBase.createContextAllocationStrategy(),
+          constructorContext: null,
         );
     assert(
       fakeReturn == inferredFunctionBody.body,
@@ -1234,7 +1235,7 @@
 
   /// Helper method to create a [VariableGet] of the [variable] using
   /// [fileOffset] as the file offset.
-  VariableGet _createVariableGet({
+  Expression _createVariableGet({
     required AssignedVariables assignedVariables,
     required InternalVariable variable,
     required int fileOffset,
@@ -1242,8 +1243,10 @@
     if (!variable.isLocalFunction && !variable.isWildcard) {
       assignedVariables.read(variable.astVariable);
     }
-    return new VariableGet(variable.asExpressionVariable)
-      ..fileOffset = fileOffset;
+    return intern.createVariableGet(
+      variable as VariableDeclaration,
+      fileOffset: fileOffset,
+    );
   }
 
   void _declareFormals({
@@ -1483,6 +1486,7 @@
         internalThisVariable: internalThisVariable,
         scopeProviderInfo: scopeProviderInfo,
         contextAllocationStrategy: contextAllocationStrategy,
+        constructorContext: bodyBuilderContext.constructorContext,
       );
       body = inferredFunctionBody.body;
       scopeProviderInfo = inferredFunctionBody.scopeProviderInfo;
diff --git a/pkg/front_end/lib/src/kernel/resolver_helpers.dart b/pkg/front_end/lib/src/kernel/resolver_helpers.dart
index 767a21b..478ab71 100644
--- a/pkg/front_end/lib/src/kernel/resolver_helpers.dart
+++ b/pkg/front_end/lib/src/kernel/resolver_helpers.dart
@@ -300,10 +300,14 @@
                       _bodyBuilderContext.formals!;
                   ActualArguments arguments = initializer.arguments;
                   List<Expression> enumSyntheticArguments = [
-                    new VariableGet(formals[0].variable)
-                      ..parent = initializer.arguments,
-                    new VariableGet(formals[1].variable)
-                      ..parent = initializer.arguments,
+                    intern.createVariableGet(
+                      formals[0].variable,
+                      fileOffset: formals[0].fileOffset,
+                    )..parent = initializer.arguments,
+                    intern.createVariableGet(
+                      formals[1].variable,
+                      fileOffset: formals[1].fileOffset,
+                    )..parent = initializer.arguments,
                   ];
                   arguments.prependArguments([
                     new PositionalArgument(enumSyntheticArguments[0]),
@@ -646,8 +650,14 @@
             formals[0].name == "#index" &&
             formals[1].name == "#name",
       );
-      Expression indexExpression = new VariableGet(formals[0].variable);
-      Expression nameExpression = new VariableGet(formals[1].variable);
+      Expression indexExpression = intern.createVariableGet(
+        formals[0].variable,
+        fileOffset: formals[0].fileOffset,
+      );
+      Expression nameExpression = intern.createVariableGet(
+        formals[1].variable,
+        fileOffset: formals[1].fileOffset,
+      );
       (argumentsOriginalOrder ??= []).insertAll(0, [
         new PositionalArgument(indexExpression),
         new PositionalArgument(nameExpression),
diff --git a/pkg/front_end/lib/src/source/check_helper.dart b/pkg/front_end/lib/src/source/check_helper.dart
index 8d4acf8..e8fdc28 100644
--- a/pkg/front_end/lib/src/source/check_helper.dart
+++ b/pkg/front_end/lib/src/source/check_helper.dart
@@ -873,6 +873,7 @@
     // See [issue 29717](https://github.com/dart-lang/sdk/issues/29717)
     int offset = expression.fileOffset;
     if (offset == -1) {
+      // Coverage-ignore-block(suite): Not run.
       offset = message.charOffset;
     }
     return buildProblem(
diff --git a/pkg/front_end/lib/src/source/outline_builder.dart b/pkg/front_end/lib/src/source/outline_builder.dart
index f4177a9..a85c5ed 100644
--- a/pkg/front_end/lib/src/source/outline_builder.dart
+++ b/pkg/front_end/lib/src/source/outline_builder.dart
@@ -4475,6 +4475,7 @@
   void beginFactory(
     DeclarationKind declarationKind,
     Token lastConsumed,
+    Token? augmentToken,
     Token? externalToken,
     Token? constToken,
   ) {
@@ -4502,7 +4503,13 @@
 
     pushDeclarationContext(declarationContext);
     _builderFactory.beginFactoryMethod();
-    push(Modifiers.from(externalToken: externalToken, constToken: constToken));
+    push(
+      Modifiers.from(
+        augmentToken: augmentToken,
+        externalToken: externalToken,
+        constToken: constToken,
+      ),
+    );
   }
 
   void _endFactoryMethod(
diff --git a/pkg/front_end/lib/src/source/source_enum_builder.dart b/pkg/front_end/lib/src/source/source_enum_builder.dart
index bc71a2c..c670f52 100644
--- a/pkg/front_end/lib/src/source/source_enum_builder.dart
+++ b/pkg/front_end/lib/src/source/source_enum_builder.dart
@@ -432,10 +432,7 @@
           constructor.initializers.add(
             new SuperInitializer.byReference(
               superConstructor.invokeTargetReference!,
-              new Arguments.forwarded(
-                constructor.function,
-                libraryBuilder.library,
-              ),
+              new Arguments.forwarded(constructor.function),
             )..parent = constructor,
           );
         }
diff --git a/pkg/front_end/lib/src/type_inference/body_inference_context.dart b/pkg/front_end/lib/src/type_inference/body_inference_context.dart
index 2d6dd5c..598d317 100644
--- a/pkg/front_end/lib/src/type_inference/body_inference_context.dart
+++ b/pkg/front_end/lib/src/type_inference/body_inference_context.dart
@@ -18,6 +18,10 @@
 
 /// Keeps track of information about the innermost function body being inferred.
 abstract class BodyInferenceContext implements SharedBodyInferenceContext {
+  /// Returns `true` if this the root body context, i.e. the method or
+  /// constructor itself and _not_ a nested local function.
+  final bool isRoot;
+
   @override
   bool get isAsync;
 
@@ -47,9 +51,10 @@
   factory BodyInferenceContext(
     InferenceVisitorBase inferrer,
     AsyncMarker asyncMarker,
-    DartType returnContext,
-    bool needToInferReturnType,
-  ) {
+    DartType returnContext, {
+    required bool needToInferReturnType,
+    required bool isRoot,
+  }) {
     DartType declaredReturnType = inferrer.computeGreatestClosure(
       returnContext,
     );
@@ -70,6 +75,7 @@
           yieldContext,
           declaredReturnType,
           needToInferReturnType,
+          isRoot,
         );
       } else {
         DartType yieldContext = inferrer.getTypeArgumentOf(
@@ -81,6 +87,7 @@
           yieldContext,
           declaredReturnType,
           needToInferReturnType,
+          isRoot,
         );
       }
     } else if (isAsync) {
@@ -100,6 +107,7 @@
         declaredReturnType,
         needToInferReturnType,
         futureValueType,
+        isRoot,
       );
     } else {
       return new _SyncContext(
@@ -107,11 +115,12 @@
         returnContext,
         declaredReturnType,
         needToInferReturnType,
+        isRoot,
       );
     }
   }
 
-  BodyInferenceContext._();
+  BodyInferenceContext._(this.isRoot);
 
   @override
   SharedTypeSchemaView get sharedYieldContext =>
@@ -205,6 +214,7 @@
     this._returnContext,
     this._declaredReturnType,
     this._needToInferReturnType,
+    super.isRoot,
   ) : super._() {
     if (_needToInferReturnType) {
       _returnStatements = [];
@@ -486,6 +496,7 @@
     this._declaredReturnType,
     this._needToInferReturnType,
     this.emittedValueType,
+    super.isRoot,
   ) : super._() {
     if (_needToInferReturnType) {
       _returnStatements = [];
@@ -787,6 +798,7 @@
     this._yieldElementContext,
     this._declaredReturnType,
     this._needToInferReturnType,
+    super.isRoot,
   ) : super._() {
     if (_needToInferReturnType) {
       _yieldElementTypes = [];
@@ -947,6 +959,7 @@
     this._yieldElementContext,
     this._declaredReturnType,
     this._needToInferReturnType,
+    super.isRoot,
   ) : super._() {
     if (_needToInferReturnType) {
       _yieldElementTypes = [];
diff --git a/pkg/front_end/lib/src/type_inference/delayed_expressions.dart b/pkg/front_end/lib/src/type_inference/delayed_expressions.dart
index 05251e8..136dbd9 100644
--- a/pkg/front_end/lib/src/type_inference/delayed_expressions.dart
+++ b/pkg/front_end/lib/src/type_inference/delayed_expressions.dart
@@ -827,7 +827,6 @@
       return createAsExpression(
         operand,
         _type,
-        forNonNullableByDefault: true,
         isCovarianceCheck: true,
         fileOffset: fileOffset,
       );
@@ -840,7 +839,6 @@
     return createAsExpression(
       operand,
       _type,
-      forNonNullableByDefault: true,
       isUnchecked: isUnchecked,
       fileOffset: fileOffset,
     );
diff --git a/pkg/front_end/lib/src/type_inference/for_in.dart b/pkg/front_end/lib/src/type_inference/for_in.dart
deleted file mode 100644
index f23026a..0000000
--- a/pkg/front_end/lib/src/type_inference/for_in.dart
+++ /dev/null
@@ -1,360 +0,0 @@
-// Copyright (c) 2022, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import 'package:_fe_analyzer_shared/src/types/shared_type.dart';
-import 'package:front_end/src/codes/diagnostic.dart' as diag;
-import 'package:kernel/ast.dart';
-
-import '../kernel/hierarchy/class_member.dart';
-import '../kernel/internal_ast.dart';
-import 'inference_results.dart';
-import 'inference_visitor.dart';
-import 'inference_visitor_base.dart';
-import 'object_access_target.dart';
-import 'type_schema.dart' show UnknownType;
-
-class ForInResult {
-  final VariableDeclaration variable;
-  final Expression iterable;
-  final Expression? syntheticAssignment;
-  final Statement? expressionSideEffects;
-
-  ForInResult(
-    this.variable,
-    this.iterable,
-    this.syntheticAssignment,
-    this.expressionSideEffects,
-  );
-
-  @override
-  String toString() =>
-      'ForInResult($variable,$iterable,'
-      '$syntheticAssignment,$expressionSideEffects)';
-}
-
-abstract class ForInVariable {
-  /// Computes the type of the elements expected for this for-in variable.
-  DartType computeElementType(InferenceVisitorBase visitor);
-
-  /// Infers the assignment to this for-in variable with a value of type
-  /// [rhsType]. The resulting expression is returned.
-  Expression? inferAssignment(InferenceVisitorBase visitor, DartType rhsType);
-}
-
-class LocalForInVariable implements ForInVariable {
-  VariableSet variableSet;
-
-  LocalForInVariable(this.variableSet);
-
-  @override
-  DartType computeElementType(InferenceVisitorBase visitor) {
-    VariableDeclaration variable = variableSet.variable;
-    DartType? promotedType = visitor.flowAnalysis
-        .promotedType(variable)
-        // Coverage-ignore(suite): Not run.
-        ?.unwrapTypeView();
-    return promotedType ?? variable.type;
-  }
-
-  @override
-  Expression inferAssignment(InferenceVisitorBase visitor, DartType rhsType) {
-    DartType variableType = visitor.computeGreatestClosure(
-      variableSet.variable.type,
-    );
-    Expression rhs = visitor.ensureAssignable(
-      variableType,
-      rhsType,
-      variableSet.value,
-      errorTemplate: diag.forInLoopElementTypeNotAssignable,
-      isVoidAllowed: true,
-    );
-
-    variableSet.value = rhs..parent = variableSet;
-    visitor.flowAnalysis.storeExpressionInfo(
-      variableSet,
-      visitor.flowAnalysis.write(
-        variableSet,
-        variableSet.variable,
-        new SharedTypeView(rhsType),
-        null,
-      ),
-    );
-    return variableSet;
-  }
-}
-
-class PatternVariableDeclarationForInVariable implements ForInVariable {
-  PatternVariableDeclaration patternVariableDeclaration;
-
-  PatternVariableDeclarationForInVariable(this.patternVariableDeclaration);
-
-  @override
-  // Coverage-ignore(suite): Not run.
-  DartType computeElementType(InferenceVisitorBase visitor) {
-    return (patternVariableDeclaration.initializer as VariableGet)
-        .variable
-        .type;
-  }
-
-  @override
-  Expression? inferAssignment(InferenceVisitorBase visitor, DartType rhsType) {
-    return null;
-  }
-}
-
-class PropertyForInVariable implements ForInVariable {
-  final PropertySet propertySet;
-
-  DartType? _writeType;
-
-  Expression? _rhs;
-
-  PropertyForInVariable(this.propertySet);
-
-  @override
-  DartType computeElementType(InferenceVisitorBase visitor) {
-    ExpressionInferenceResult receiverResult = visitor.inferExpression(
-      propertySet.receiver,
-      const UnknownType(),
-    );
-    propertySet.receiver = receiverResult.expression..parent = propertySet;
-    DartType receiverType = receiverResult.inferredType;
-    ObjectAccessTarget writeTarget = visitor.findInterfaceMember(
-      receiverType,
-      propertySet.name,
-      propertySet.fileOffset,
-      isSetter: true,
-      instrumented: true,
-      includeExtensionMethods: true,
-    );
-    DartType elementType = _writeType = writeTarget.getSetterType(visitor);
-    Expression? error = visitor.reportMissingInterfaceMember(
-      writeTarget,
-      receiverType,
-      propertySet.name,
-      propertySet.fileOffset,
-    );
-    if (error != null) {
-      _rhs = error;
-    } else {
-      _rhs = propertySet.value;
-    }
-    return elementType;
-  }
-
-  @override
-  Expression inferAssignment(InferenceVisitorBase visitor, DartType rhsType) {
-    Expression rhs = visitor.ensureAssignable(
-      visitor.computeGreatestClosure(_writeType!),
-      rhsType,
-      _rhs!,
-      errorTemplate: diag.forInLoopElementTypeNotAssignable,
-      isVoidAllowed: true,
-    );
-
-    propertySet.value = rhs..parent = propertySet;
-    ExpressionInferenceResult result = visitor.inferExpression(
-      propertySet,
-      const UnknownType(),
-      isVoidAllowed: true,
-    );
-    return result.expression;
-  }
-}
-
-// Coverage-ignore(suite): Not run.
-class AbstractSuperPropertyForInVariable implements ForInVariable {
-  final AbstractSuperPropertySet superPropertySet;
-
-  DartType? _writeType;
-
-  AbstractSuperPropertyForInVariable(this.superPropertySet);
-
-  @override
-  DartType computeElementType(InferenceVisitorBase visitor) {
-    DartType receiverType = visitor.thisType!;
-    ObjectAccessTarget writeTarget = visitor.findInterfaceMember(
-      receiverType,
-      superPropertySet.name,
-      superPropertySet.fileOffset,
-      isSetter: true,
-      instrumented: true,
-    );
-    assert(writeTarget.isInstanceMember || writeTarget.isObjectMember);
-    return _writeType = writeTarget.getSetterType(visitor);
-  }
-
-  @override
-  Expression inferAssignment(InferenceVisitorBase visitor, DartType rhsType) {
-    Expression rhs = visitor.ensureAssignable(
-      visitor.computeGreatestClosure(_writeType!),
-      rhsType,
-      superPropertySet.value,
-      errorTemplate: diag.forInLoopElementTypeNotAssignable,
-      isVoidAllowed: true,
-    );
-    superPropertySet.value = rhs..parent = superPropertySet;
-    ExpressionInferenceResult result = visitor.inferExpression(
-      superPropertySet,
-      const UnknownType(),
-      isVoidAllowed: true,
-    );
-    return result.expression;
-  }
-}
-
-class SuperPropertyForInVariable implements ForInVariable {
-  final SuperPropertySet superPropertySet;
-
-  DartType? _writeType;
-
-  SuperPropertyForInVariable(this.superPropertySet);
-
-  @override
-  DartType computeElementType(InferenceVisitorBase visitor) {
-    DartType receiverType = visitor.thisType!;
-    ObjectAccessTarget writeTarget = visitor.findInterfaceMember(
-      receiverType,
-      superPropertySet.name,
-      superPropertySet.fileOffset,
-      isSetter: true,
-      instrumented: true,
-    );
-    assert(
-      writeTarget.isInstanceMember ||
-          // Coverage-ignore(suite): Not run.
-          writeTarget.isObjectMember,
-    );
-    return _writeType = writeTarget.getSetterType(visitor);
-  }
-
-  @override
-  Expression inferAssignment(InferenceVisitorBase visitor, DartType rhsType) {
-    Expression rhs = visitor.ensureAssignable(
-      visitor.computeGreatestClosure(_writeType!),
-      rhsType,
-      superPropertySet.value,
-      errorTemplate: diag.forInLoopElementTypeNotAssignable,
-      isVoidAllowed: true,
-    );
-    superPropertySet.value = rhs..parent = superPropertySet;
-    ExpressionInferenceResult result = visitor.inferExpression(
-      superPropertySet,
-      const UnknownType(),
-      isVoidAllowed: true,
-    );
-    return result.expression;
-  }
-}
-
-class StaticForInVariable implements ForInVariable {
-  final StaticSet staticSet;
-
-  StaticForInVariable(this.staticSet);
-
-  @override
-  DartType computeElementType(InferenceVisitorBase visitor) =>
-      staticSet.target.setterType;
-
-  @override
-  Expression inferAssignment(InferenceVisitorBase visitor, DartType rhsType) {
-    DartType setterType = visitor.computeGreatestClosure(
-      staticSet.target.setterType,
-    );
-    Expression rhs = visitor.ensureAssignable(
-      setterType,
-      rhsType,
-      staticSet.value,
-      errorTemplate: diag.forInLoopElementTypeNotAssignable,
-      isVoidAllowed: true,
-    );
-
-    staticSet.value = rhs..parent = staticSet;
-    ExpressionInferenceResult result = visitor.inferExpression(
-      staticSet,
-      const UnknownType(),
-      isVoidAllowed: true,
-    );
-    return result.expression;
-  }
-}
-
-class ExtensionSetForInVariable implements ForInVariable {
-  final ExtensionSet extensionSet;
-  DartType? setterType;
-
-  ExtensionSetForInVariable(this.extensionSet);
-
-  @override
-  DartType computeElementType(InferenceVisitorBase visitor) {
-    DartType receiverContextType = visitor
-        .computeExplicitExtensionReceiverContextType(
-          extensionSet.extension,
-          extensionSet.knownTypeArguments,
-        );
-
-    ExpressionInferenceResult receiverResult = visitor.inferExpression(
-      extensionSet.receiver,
-      receiverContextType,
-      isVoidAllowed: false,
-    );
-
-    List<DartType> extensionTypeArguments = visitor
-        .computeExtensionTypeArgument(
-          extensionSet.extension,
-          extensionSet.knownTypeArguments,
-          receiverResult.inferredType,
-          treeNodeForTesting: extensionSet,
-        );
-
-    DartType receiverType = visitor.getExtensionReceiverType(
-      extensionSet.extension,
-      extensionTypeArguments,
-    );
-
-    ObjectAccessTarget target = new ExtensionAccessTarget(
-      receiverType,
-      extensionSet.setter,
-      null,
-      ClassMemberKind.Setter,
-      extensionTypeArguments,
-    );
-
-    setterType = target.getSetterType(visitor);
-    return setterType!;
-  }
-
-  @override
-  Expression inferAssignment(InferenceVisitorBase visitor, DartType rhsType) {
-    assert(setterType != null);
-    Expression rhs = visitor.ensureAssignable(
-      setterType!,
-      rhsType,
-      extensionSet.value,
-      errorTemplate: diag.forInLoopElementTypeNotAssignable,
-      isVoidAllowed: true,
-    );
-
-    extensionSet.value = rhs..parent = extensionSet;
-    ExpressionInferenceResult result = visitor.inferExpression(
-      extensionSet,
-      const UnknownType(),
-      isVoidAllowed: true,
-    );
-    return result.expression;
-  }
-}
-
-class InvalidForInVariable implements ForInVariable {
-  final Expression? expression;
-
-  InvalidForInVariable(this.expression);
-
-  @override
-  DartType computeElementType(InferenceVisitor visitor) => const UnknownType();
-
-  @override
-  Expression? inferAssignment(InferenceVisitor visitor, DartType rhsType) =>
-      expression;
-}
diff --git a/pkg/front_end/lib/src/type_inference/inference_visitor.dart b/pkg/front_end/lib/src/type_inference/inference_visitor.dart
index ec421d4..37be2a7 100644
--- a/pkg/front_end/lib/src/type_inference/inference_visitor.dart
+++ b/pkg/front_end/lib/src/type_inference/inference_visitor.dart
@@ -17,7 +17,6 @@
 import 'package:_fe_analyzer_shared/src/util/null_value.dart';
 import 'package:_fe_analyzer_shared/src/util/stack_checker.dart';
 import 'package:_fe_analyzer_shared/src/util/value_kind.dart';
-import 'package:front_end/src/codes/diagnostic.dart' as diag;
 import 'package:kernel/ast.dart';
 import 'package:kernel/names.dart';
 import 'package:kernel/src/non_null.dart';
@@ -31,8 +30,8 @@
     show internalProblem, unhandled, unimplemented, unsupported;
 import '../base/uri_offset.dart';
 import '../builder/library_builder.dart';
+import '../codes/diagnostic.dart' as diag;
 import '../dill/dill_library_builder.dart';
-import '../kernel/body_builder.dart' show combineStatements;
 import '../kernel/collections.dart'
     show
         ControlFlowElement,
@@ -53,18 +52,17 @@
         PatternForMapEntry,
         SpreadElement,
         SpreadMapEntry;
+import '../kernel/external_ast_helper.dart' as extern;
 import '../kernel/external_ast_helper.dart';
 import '../kernel/hierarchy/class_member.dart';
 import '../kernel/implicit_type_argument.dart' show ImplicitTypeArgument;
 import '../kernel/internal_ast.dart';
 import '../kernel/late_lowering.dart' as late_lowering;
 import '../source/check_helper.dart';
-import '../source/source_constructor_builder.dart';
 import '../source/source_library_builder.dart';
 import '../util/helpers.dart';
 import 'body_inference_context.dart';
 import 'context_allocation_strategy.dart';
-import 'for_in.dart';
 import 'inference_results.dart';
 import 'inference_visitor_base.dart';
 import 'object_access_target.dart';
@@ -72,6 +70,7 @@
 import 'stack_values.dart';
 import 'type_constraint_gatherer.dart';
 import 'type_inference_engine.dart';
+import 'type_inferrer.dart';
 import 'type_schema.dart' show UnknownType, isKnown;
 
 abstract class InferenceVisitor {
@@ -167,7 +166,7 @@
   @override
   final TypeAnalyzerOptions typeAnalyzerOptions;
 
-  final SourceConstructorBuilder? _constructorBuilder;
+  final ConstructorContext? _constructorContext;
 
   @override
   late final SharedTypeAnalyzerErrors errors = new SharedTypeAnalyzerErrors(
@@ -197,7 +196,7 @@
   InferenceVisitorImpl(
     super.inferrer,
     super.fileUri,
-    this._constructorBuilder,
+    this._constructorContext,
     this.operations,
     this.typeAnalyzerOptions,
     super.expressionEvaluationHelper, {
@@ -387,9 +386,7 @@
     registerIfUnreachableForTesting(expression);
 
     ExpressionInferenceResult result;
-    if (expression is ExpressionJudgment) {
-      result = expression.acceptInference(this, typeContext);
-    } else if (expression is InternalExpression) {
+    if (expression is InternalExpression) {
       result = expression.acceptInference(this, typeContext);
     } else {
       result = expression.accept1(this, typeContext);
@@ -540,7 +537,7 @@
     if (scopeProviderInfo != null) {
       // Coverage-ignore-block(suite): Not run.
       _contextAllocationStrategy.exitScopeProvider(scopeProviderInfo);
-      node.scope = scopeProviderInfo.scope?..parent = node;
+      node.scope = scopeProviderInfo.scope;
     }
     return new ExpressionInferenceResult(valueResult.inferredType, node);
   }
@@ -555,6 +552,7 @@
   }
 
   @override
+  // Coverage-ignore(suite): Not run.
   ExpressionInferenceResult visitDynamicGet(
     DynamicGet node,
     DartType typeContext,
@@ -567,7 +565,6 @@
         resultType = const DynamicType();
         break;
       case DynamicAccessKind.Never:
-        // Coverage-ignore(suite): Not run.
         resultType = NeverType.fromNullability(Nullability.nonNullable);
         break;
       case DynamicAccessKind.Invalid:
@@ -1278,8 +1275,13 @@
     registerIfUnreachableForTesting(node);
     List<Statement>? result = _visitStatements<Statement>(node.statements);
     StatementInferenceResult statementInferenceResult;
+    Block replacement = node;
     if (result != null) {
-      Block block = new Block(result)..fileOffset = node.fileOffset;
+      Block block = replacement = extern.createBlock(
+        result,
+        fileOffset: node.fileOffset,
+        fileEndOffset: node.fileEndOffset,
+      );
       libraryBuilder.loader.dataForTesting
       // Coverage-ignore(suite): Not run.
       ?.registerAlias(node, block);
@@ -1289,7 +1291,7 @@
     }
     if (scopeProviderInfo != null) {
       _contextAllocationStrategy.exitScopeProvider(scopeProviderInfo);
-      node.scope = scopeProviderInfo.scope?..parent = node;
+      replacement.scope = scopeProviderInfo.scope;
     }
     return statementInferenceResult;
   }
@@ -1738,21 +1740,54 @@
     ExtensionSet node,
     DartType typeContext,
   ) {
-    DartType receiverContextType = computeExplicitExtensionReceiverContextType(
-      node.extension,
-      node.knownTypeArguments,
+    ExtensionSetData data = computeExtensionSetData(
+      extension: node.extension,
+      knownTypeArguments: node.knownTypeArguments,
+      receiver: node.receiver,
+      extensionTypeArgumentOffset: node.extensionTypeArgumentOffset,
+      setter: node.setter,
+      isNullAware: node.isNullAware,
+      fileOffset: node.fileOffset,
+      nodeForTesting: node,
     );
+    ExpressionInferenceResult valueResult = inferExpression(
+      node.value,
+      data.valueType,
+      isVoidAllowed: false,
+    );
+    return inferExtensionSet(
+      data: data,
+      valueResult: valueResult,
+      forEffect: node.forEffect,
+      fileOffset: node.fileOffset,
+    );
+  }
 
+  @override
+  ExtensionSetData computeExtensionSetData({
+    required Extension extension,
+    required List<DartType>? knownTypeArguments,
+    required Expression receiver,
+    required int? extensionTypeArgumentOffset,
+    required Procedure setter,
+    required bool isNullAware,
+    required int fileOffset,
+    TreeNode? nodeForTesting,
+  }) {
+    DartType receiverContextType = computeExplicitExtensionReceiverContextType(
+      extension,
+      knownTypeArguments,
+    );
     ExpressionInferenceResult receiverResult = inferExpression(
-      node.receiver,
+      receiver,
       receiverContextType,
       isVoidAllowed: false,
     );
 
-    Expression receiver = receiverResult.expression;
+    receiver = receiverResult.expression;
     DartType receiverType = receiverResult.inferredType;
 
-    if (node.isNullAware) {
+    if (isNullAware) {
       DartType nonNullReceiverType = receiverType.toNonNull();
       receiver = _createNonNullReceiver(
         receiver,
@@ -1763,30 +1798,30 @@
     }
 
     List<DartType> extensionTypeArguments = computeExtensionTypeArgument(
-      node.extension,
-      node.knownTypeArguments,
+      extension,
+      knownTypeArguments,
       receiverType,
-      treeNodeForTesting: node,
+      treeNodeForTesting: nodeForTesting,
     );
     problemReporting.checkBoundsInStaticInvocation(
       problemReportingHelper: problemReportingHelper,
       libraryFeatures: libraryFeatures,
-      targetName: node.extension.name,
+      targetName: extension.name,
       typeEnvironment: typeSchemaEnvironment,
       fileUri: fileUri,
-      fileOffset: node.extensionTypeArgumentOffset ?? node.fileOffset,
-      hasInferredTypeArguments: node.knownTypeArguments == null,
-      typeParameters: node.extension.typeParameters,
+      fileOffset: extensionTypeArgumentOffset ?? fileOffset,
+      hasInferredTypeArguments: knownTypeArguments == null,
+      typeParameters: extension.typeParameters,
       explicitOrInferredTypeArguments: extensionTypeArguments,
     );
 
     DartType extensionOnType = getExtensionReceiverType(
-      node.extension,
+      extension,
       extensionTypeArguments,
     );
     ObjectAccessTarget target = new ExtensionAccessTarget(
       extensionOnType,
-      node.setter,
+      setter,
       null,
       ClassMemberKind.Setter,
       extensionTypeArguments,
@@ -1796,17 +1831,30 @@
     receiverType = extensionOnType;
 
     DartType valueType = target.getSetterType(this);
-
-    ExpressionInferenceResult valueResult = inferExpression(
-      node.value,
-      valueType,
-      isVoidAllowed: false,
+    return new ExtensionSetData(
+      receiver: receiver,
+      inferredReceiverType: receiverResult.inferredType,
+      valueType: valueType,
+      extensionTypeArguments: extensionTypeArguments,
+      setter: setter,
     );
+  }
+
+  @override
+  ExpressionInferenceResult inferExtensionSet({
+    required ExtensionSetData data,
+    required ExpressionInferenceResult valueResult,
+    required bool forEffect,
+    required int fileOffset,
+  }) {
+    Expression receiver = data.receiver;
+
+    DartType valueType = data.valueType;
     valueResult = ensureAssignableResult(valueType, valueResult);
     Expression value = valueResult.expression;
 
     VariableDeclaration? valueVariable;
-    if (node.forEffect) {
+    if (forEffect) {
       // No need for value variable.
     } else {
       valueVariable = createVariable(value, valueResult.inferredType);
@@ -1814,22 +1862,22 @@
     }
 
     VariableDeclaration? receiverVariable;
-    if (node.forEffect || isPureExpression(receiver)) {
+    if (forEffect || isPureExpression(receiver)) {
       // No need for receiver variable.
     } else {
-      receiverVariable = createVariable(receiver, receiverResult.inferredType);
+      receiverVariable = createVariable(receiver, data.inferredReceiverType);
       receiver = createVariableGet(receiverVariable);
     }
 
     StaticInvocation assignment = createStaticInvocation(
-      node.setter,
-      new Arguments([receiver, value], types: extensionTypeArguments)
-        ..fileOffset = node.fileOffset,
-      fileOffset: node.fileOffset,
+      data.setter,
+      new Arguments([receiver, value], types: data.extensionTypeArguments)
+        ..fileOffset = fileOffset,
+      fileOffset: fileOffset,
     );
 
     Expression replacement;
-    if (node.forEffect) {
+    if (forEffect) {
       assert(receiverVariable == null);
       assert(valueVariable == null);
       replacement = assignment;
@@ -1847,7 +1895,7 @@
         replacement = createLet(receiverVariable, replacement);
       }
     }
-    replacement.fileOffset = node.fileOffset;
+    replacement.fileOffset = fileOffset;
     return new ExpressionInferenceResult(valueResult.inferredType, replacement);
   }
 
@@ -2313,21 +2361,18 @@
     );
     flowAnalysis.ifNullExpression_end();
 
-    rhsResult = ensureAssignableResult(writeContext, rhsResult);
-    Expression rhs = rhsResult.expression;
-
-    DartType writeType = rhsResult.inferredType;
-    ExpressionInferenceResult writeResult = _computePropertySet(
-      node.writeOffset,
-      writeReceiver,
-      receiverType,
-      node.propertyName,
-      writeTarget,
-      rhs,
+    ExpressionInferenceResult writeResult = inferPropertySet(
+      fileOffset: node.writeOffset,
+      receiver: writeReceiver,
+      receiverType: receiverType,
+      propertyName: node.propertyName,
+      writeTarget: writeTarget,
+      writeContext: writeContext,
+      valueResult: rhsResult,
       forEffect: node.forEffect,
-      valueType: writeType,
     );
     Expression write = writeResult.expression;
+    DartType writeType = writeResult.inferredType;
 
     DartType nonNullableReadType = readType.toNonNull();
     DartType inferredType = _analyzeIfNullTypes(
@@ -3176,7 +3221,7 @@
   @override
   InitializerInferenceResult visitFieldInitializer(FieldInitializer node) {
     DartType fieldType = node.field.type;
-    fieldType = _constructorBuilder!.substituteFieldType(fieldType);
+    fieldType = _constructorContext!.substituteFieldType(fieldType);
     ExpressionInferenceResult initializerResult = inferExpression(
       node.value,
       fieldType,
@@ -3192,108 +3237,11 @@
     return new SuccessfulInitializerInferenceResult(node);
   }
 
-  ForInResult handleForInDeclaringVariable(
-    TreeNode node,
-    VariableDeclaration variable,
-    Expression iterable,
-    Statement? expressionEffects, {
-    bool isAsync = false,
-  }) {
-    DartType elementType;
-    bool isVariableTypeNeeded = false;
-    VariableDeclaration astVariable;
-    if (variable case InternalVariable variable) {
-      if (variable.isImplicitlyTyped) {
-        isVariableTypeNeeded = true;
-        elementType = const UnknownType();
-      } else {
-        elementType = variable.type;
-      }
-      astVariable = variable.astVariable;
-    } else {
-      // Coverage-ignore-block(suite): Not run.
-      elementType = variable.type;
-      astVariable = variable;
-    }
-
-    ExpressionInferenceResult iterableResult = inferForInIterable(
-      iterable,
-      elementType,
-      isAsync: isAsync,
-    );
-    DartType inferredType = iterableResult.inferredType;
-    if (isVariableTypeNeeded) {
-      variable.type = inferredType;
-    }
-
-    // This is matched by the call to [forEach_end] in
-    // [inferElement], [inferMapEntry] or [inferForInStatement].
-    flowAnalysis.declare(
-      astVariable,
-      new SharedTypeView(astVariable.type),
-      initialized: true,
-    );
-    flowAnalysis.forEach_bodyBegin(node);
-
-    VariableDeclaration tempVariable = new VariableDeclaration(
-      null,
-      type: inferredType,
-      isFinal: true,
-      isSynthesized: true,
-    );
-    VariableGet variableGet = new VariableGet(tempVariable)
-      ..fileOffset = variable.fileOffset;
-    TreeNode parent = variable.parent!;
-    Expression implicitDowncast = ensureAssignable(
-      variable.type,
-      inferredType,
-      variableGet,
-      isVoidAllowed: true,
-      fileOffset: parent.fileOffset,
-      errorTemplate: diag.forInLoopElementTypeNotAssignable,
-    );
-    Statement? expressionEffect;
-    if (!identical(implicitDowncast, variableGet)) {
-      if (!isClosureContextLoweringEnabled) {
-        variable.initializer = implicitDowncast..parent = variable;
-        expressionEffect = variable;
-        variable = tempVariable;
-      } else {
-        // Coverage-ignore-block(suite): Not run.
-        expressionEffect = new VariableInitializationBase(
-          variable: variable,
-          initializer: implicitDowncast,
-        );
-        variable = tempVariable;
-      }
-    }
-    if (expressionEffects != null) {
-      // Coverage-ignore-block(suite): Not run.
-      StatementInferenceResult bodyResult = inferStatement(expressionEffects);
-      if (bodyResult.hasChanged) {
-        expressionEffects = bodyResult.statement;
-      }
-      if (expressionEffect != null) {
-        expressionEffects = combineStatements(
-          expressionEffect,
-          expressionEffects,
-        );
-      }
-    } else {
-      expressionEffects = expressionEffect;
-    }
-    return new ForInResult(
-      variable,
-      iterableResult.expression,
-      null,
-      expressionEffects,
-    );
-  }
-
+  @override
   ExpressionInferenceResult inferForInIterable(
     Expression iterable,
     DartType elementType, {
-    bool isAsync = false,
+    required bool isAsync,
   }) {
     Class iterableClass = isAsync
         ? coreTypes.streamClass
@@ -3330,95 +3278,19 @@
     return new ExpressionInferenceResult(inferredType, iterable);
   }
 
-  ForInVariable computeForInVariable(
-    Expression? syntheticAssignment,
-    bool hasProblem,
-  ) {
-    if (syntheticAssignment is VariableSet) {
-      return new LocalForInVariable(syntheticAssignment);
-    } else if (syntheticAssignment is PropertySet) {
-      return new PropertyForInVariable(syntheticAssignment);
-    } else if (syntheticAssignment is AbstractSuperPropertySet) {
-      // Coverage-ignore-block(suite): Not run.
-      return new AbstractSuperPropertyForInVariable(syntheticAssignment);
-    } else if (syntheticAssignment is SuperPropertySet) {
-      return new SuperPropertyForInVariable(syntheticAssignment);
-    } else if (syntheticAssignment is StaticSet) {
-      return new StaticForInVariable(syntheticAssignment);
-    } else if (syntheticAssignment is ExtensionSet) {
-      return new ExtensionSetForInVariable(syntheticAssignment);
-    } else if (syntheticAssignment is InvalidExpression || hasProblem) {
-      return new InvalidForInVariable(syntheticAssignment);
-    } else {
-      // Coverage-ignore-block(suite): Not run.
-      UriOffset uriOffset = _computeUriOffset(syntheticAssignment!);
-      return problems.unhandled(
-        "${syntheticAssignment.runtimeType}",
-        "handleForInStatementWithoutVariable",
-        uriOffset.fileOffset,
-        uriOffset.fileUri,
-      );
-    }
+  @override
+  // Coverage-ignore(suite): Not run.
+  StatementInferenceResult visitForInStatement(ForInStatement node) {
+    return _unhandledStatement(node);
   }
 
-  ForInResult _handleForInWithoutVariable(
-    TreeNode node,
-    VariableDeclaration variable,
-    Expression iterable,
-    Expression? syntheticAssignment,
-    Statement? expressionEffects, {
-    bool isAsync = false,
-    required bool hasProblem,
-  }) {
-    ForInVariable forInVariable = computeForInVariable(
-      syntheticAssignment,
-      hasProblem,
-    );
-    DartType elementType = forInVariable.computeElementType(this);
-    ExpressionInferenceResult iterableResult = inferForInIterable(
-      iterable,
-      elementType,
-      isAsync: isAsync,
-    );
-    DartType inferredType = iterableResult.inferredType;
-    variable.type = inferredType;
-    // This is matched by the call to [forEach_end] in
-    // [inferElement], [inferMapEntry] or [inferForInStatement].
-    flowAnalysis.forEach_bodyBegin(node);
-    syntheticAssignment = forInVariable.inferAssignment(this, inferredType);
-    if (syntheticAssignment is VariableSet) {
-      flowAnalysis.write(
-        node,
-        variable,
-        new SharedTypeView(inferredType),
-        null,
-      );
-    }
-    if (expressionEffects != null) {
-      StatementInferenceResult result = inferStatement(expressionEffects);
-      expressionEffects = result.hasChanged
-          ?
-            // Coverage-ignore(suite): Not run.
-            result.statement
-          : expressionEffects;
-    }
-
-    return new ForInResult(
-      variable,
-      iterableResult.expression,
-      syntheticAssignment,
-      expressionEffects,
-    );
-  }
-
-  ForInResult _handlePatternForIn(
-    TreeNode node,
-    VariableDeclaration variable,
-    Expression iterable,
-    Expression? syntheticAssignment,
-    PatternVariableDeclaration patternVariableDeclaration, {
-    bool isAsync = false,
-    required bool hasProblem,
+  @override
+  PatternForInData inferPatternForInHeader({
+    required TreeNode node,
+    required Pattern pattern,
+    required Expression iterable,
+    required bool isAsync,
+    required int inOffset,
   }) {
     int? stackBase;
     assert(checkStackBase(node, stackBase = stackHeight));
@@ -3426,12 +3298,11 @@
     PatternForInResult<InvalidExpression> result = analyzePatternForIn(
       node: node,
       hasAwait: isAsync,
-      pattern: patternVariableDeclaration.pattern,
+      pattern: pattern,
       expression: iterable,
       dispatchBody: () {},
     );
-    patternVariableDeclaration.matchedValueType = result.elementType
-        .unwrapTypeView();
+    DartType matchedValueType = result.elementType.unwrapTypeView();
     if (result.patternForInExpressionIsNotIterableError != null) {
       assert(
         libraryBuilder.loader.assertProblemReportedElsewhere(
@@ -3450,22 +3321,16 @@
     );
 
     Object? rewrite = popRewrite();
-    if (!identical(rewrite, patternVariableDeclaration.pattern)) {
-      // Coverage-ignore-block(suite): Not run.
-      patternVariableDeclaration.pattern = (rewrite as Pattern)
-        ..parent = patternVariableDeclaration;
+    if (!identical(rewrite, pattern)) {
+      pattern = rewrite as Pattern;
     }
 
     rewrite = popRewrite();
-    if (!identical(rewrite, patternVariableDeclaration.initializer)) {
-      iterable = (rewrite as Expression)..parent = node;
+    if (!identical(rewrite, iterable)) {
+      iterable = rewrite as Expression;
     }
 
-    ForInVariable forInVariable = new PatternVariableDeclarationForInVariable(
-      patternVariableDeclaration,
-    );
-
-    variable.type = result.elementType.unwrapTypeView();
+    DartType elementType = result.elementType.unwrapTypeView();
     iterable = ensureAssignable(
       wrapType(
         const DynamicType(),
@@ -3476,85 +3341,65 @@
       iterable,
       errorTemplate: diag.forInLoopTypeNotIterable,
     );
-    // This is matched by the call to [forEach_end] in
-    // [inferElement], [inferMapEntry] or [inferForInStatement].
-    flowAnalysis.forEach_bodyBegin(node);
-    syntheticAssignment = forInVariable.inferAssignment(
-      this,
-      result.elementType.unwrapTypeView(),
-    );
-    if (syntheticAssignment is VariableSet) {
-      // Coverage-ignore-block(suite): Not run.
-      flowAnalysis.write(node, variable, result.elementType, null);
-    }
 
-    return new ForInResult(
-      variable,
-      /*iterableResult.expression*/ iterable,
-      syntheticAssignment,
-      patternVariableDeclaration,
+    VariableDeclaration loopVariable = extern.createUninitializedVariable(
+      elementType,
+      fileOffset: node.fileOffset,
+      isFinal: true,
+    );
+
+    return new PatternForInData(
+      loopVariable: loopVariable,
+      iterable: iterable,
+      computePatternVariableDeclaration: () =>
+          new PatternVariableDeclaration(
+              pattern,
+              extern.createVariableGet(loopVariable, fileOffset: inOffset),
+              isFinal: false,
+            )
+            ..fileOffset = inOffset
+            ..matchedValueType = matchedValueType,
     );
   }
 
-  ForInResult handleForInWithoutVariable(
-    TreeNode node,
-    VariableDeclaration variable,
-    Expression iterable,
-    Expression? syntheticAssignment,
-    Statement? expressionEffects, {
-    bool isAsync = false,
-    required bool hasProblem,
-  }) {
-    if (expressionEffects is PatternVariableDeclaration) {
-      return _handlePatternForIn(
-        node,
-        variable,
-        iterable,
-        syntheticAssignment,
-        expressionEffects,
-        isAsync: isAsync,
-        hasProblem: hasProblem,
-      );
-    } else {
-      return _handleForInWithoutVariable(
-        node,
-        variable,
-        iterable,
-        syntheticAssignment,
-        expressionEffects,
-        isAsync: isAsync,
-        hasProblem: hasProblem,
-      );
-    }
-  }
-
-  @override
-  StatementInferenceResult visitForInStatement(ForInStatement node) {
+  StatementInferenceResult visitInternalForInStatement(
+    InternalForInStatement node,
+  ) {
     ScopeProviderInfo? scopeProviderInfo;
     if (isClosureContextLoweringEnabled) {
       scopeProviderInfo = _contextAllocationStrategy.enterScopeProvider(
         scopeProviderInfoKind: ScopeProviderInfoKind.Loop,
       );
     }
-    assert(node.variable.cosmeticName != null);
-    ForInResult result = handleForInDeclaringVariable(
-      node,
-      node.variable,
-      node.iterable,
-      null,
+
+    ForInHeaderResult headerResult = node.element.inferForInHeader(
+      this,
+      node: node,
+      iterable: node.iterable,
       isAsync: node.isAsync,
+      forOffset: node.fileOffset,
+      isClosureContextLoweringEnabled: isClosureContextLoweringEnabled,
     );
-    VariableDeclaration astVariable = result.variable is InternalVariable
-        ? (result.variable as InternalVariable).astVariable
-        : result.variable;
-    node.variable = astVariable..parent = node;
+    VariableDeclaration variable = headerResult.loopVariable;
+    Expression iterable = headerResult.iterable;
+
+    flowAnalysis.forEach_bodyBegin(node);
+
+    flowAnalysis.declare(
+      variable,
+      new SharedTypeView(variable.type),
+      initialized: true,
+    );
+
     if (isClosureContextLoweringEnabled) {
       _contextAllocationStrategy.handleDeclarationOfVariable(
-        astVariable,
-        captureKind: _captureKindForVariable(astVariable),
+        variable,
+        captureKind: _captureKindForVariable(variable),
       );
     }
 
+    ForInEncoding encoding = headerResult.computeEncoding();
+
     StatementInferenceResult bodyResult = inferStatement(node.body);
 
     // This is matched by the call to [forEach_bodyBegin] in
@@ -3562,72 +3407,30 @@
     flowAnalysis.forEach_end();
 
     Statement body = bodyResult.hasChanged ? bodyResult.statement : node.body;
-    if (result.expressionSideEffects != null) {
-      body = combineStatements(result.expressionSideEffects!, body);
+    Statement? bodyPrologue = encoding.bodyPrologue;
+    if (bodyPrologue != null) {
+      body = combineStatements(bodyPrologue, body);
     }
-    if (result.syntheticAssignment != null) {
-      // Coverage-ignore-block(suite): Not run.
-      body = combineStatements(
-        createExpressionStatement(result.syntheticAssignment!),
-        body,
-      );
-    }
-    node.iterable = result.iterable..parent = node;
-    node.body = body..parent = node;
-    if (scopeProviderInfo != null) {
-      _contextAllocationStrategy.exitScopeProvider(scopeProviderInfo);
-      node.scope = scopeProviderInfo.scope?..parent = node;
-    }
-    return const StatementInferenceResult();
-  }
-
-  StatementInferenceResult visitForInStatementWithSynthesizedVariable(
-    ForInStatementWithSynthesizedVariable node,
-  ) {
-    assert(node.variable!.cosmeticName == null);
-    ForInResult result = handleForInWithoutVariable(
-      node,
-      node.variable!,
-      node.iterable,
-      node.syntheticAssignment,
-      node.expressionEffects,
-      isAsync: node.isAsync,
-      hasProblem: node.hasProblem,
-    );
-
-    StatementInferenceResult bodyResult = inferStatement(node.body);
-
-    // This is matched by the call to [forEach_bodyBegin] in
-    // [handleForInWithoutVariable] or [handleForInDeclaringVariable].
-    flowAnalysis.forEach_end();
-
-    Statement body = bodyResult.hasChanged
-        ?
-          // Coverage-ignore(suite): Not run.
-          bodyResult.statement
-        : node.body;
-    if (result.expressionSideEffects != null) {
-      body = combineStatements(result.expressionSideEffects!, body);
-    }
-    if (result.syntheticAssignment != null) {
-      body = combineStatements(
-        createExpressionStatement(result.syntheticAssignment!),
-        body,
-      );
-    }
-    Statement replacement =
-        new ForInStatement(
-            result.variable,
-            result.iterable,
-            body,
-            isAsync: node.isAsync,
-          )
+    ForInStatement forInStatement =
+        new ForInStatement(variable, iterable, body, isAsync: node.isAsync)
           ..fileOffset = node.fileOffset
           ..bodyOffset = node.bodyOffset;
+    if (scopeProviderInfo != null) {
+      _contextAllocationStrategy.exitScopeProvider(scopeProviderInfo);
+      forInStatement.scope = scopeProviderInfo.scope;
+    }
+    Statement result = forInStatement;
+    InvalidExpression? preLoopError = encoding.preLoopError;
+    if (preLoopError != null) {
+      result = createBlock([
+        createExpressionStatement(preLoopError),
+        forInStatement,
+      ], fileOffset: node.fileOffset);
+    }
     libraryBuilder.loader.dataForTesting
     // Coverage-ignore(suite): Not run.
-    ?.registerAlias(node, replacement);
-    return new StatementInferenceResult.single(replacement);
+    ?.registerAlias(node, forInStatement);
+    return new StatementInferenceResult.single(result);
   }
 
   @override
@@ -3717,7 +3520,7 @@
     flowAnalysis.for_end();
     if (scopeProviderInfo != null) {
       _contextAllocationStrategy.exitScopeProvider(scopeProviderInfo);
-      node.scope = scopeProviderInfo.scope?..parent = node;
+      node.scope = scopeProviderInfo.scope;
     }
     return const StatementInferenceResult();
   }
@@ -3861,7 +3664,7 @@
     _inTryOrLocalFunction = oldInTryOrLocalFunction;
     if (scopeProviderInfo != null) {
       _contextAllocationStrategy.exitScopeProvider(scopeProviderInfo);
-      node.function.scope = scopeProviderInfo.scope?..parent = node.function;
+      node.function.scope = scopeProviderInfo.scope;
     }
     return new ExpressionInferenceResult(inferredType, node);
   }
@@ -4071,8 +3874,8 @@
     return const StatementInferenceResult();
   }
 
-  ExpressionInferenceResult visitIntJudgment(
-    IntJudgment node,
+  ExpressionInferenceResult visitInternalIntLiteral(
+    InternalIntLiteral node,
     DartType typeContext,
   ) {
     if (isDoubleContext(typeContext)) {
@@ -4096,11 +3899,20 @@
       return new ExpressionInferenceResult(const DynamicType(), error);
     }
     DartType inferredType = coreTypes.intRawType(Nullability.nonNullable);
-    return new ExpressionInferenceResult(inferredType, node);
+    Expression result = extern.createIntLiteral(
+      coreTypes,
+      node.value,
+      fileOffset: node.fileOffset,
+      encodeForWeb: false,
+    );
+    libraryBuilder.loader.dataForTesting
+    // Coverage-ignore(suite): Not run.
+    ?.registerAlias(node, result);
+    return new ExpressionInferenceResult(inferredType, result);
   }
 
-  ExpressionInferenceResult visitShadowLargeIntLiteral(
-    ShadowLargeIntLiteral node,
+  ExpressionInferenceResult visitLargeIntLiteral(
+    LargeIntLiteral node,
     DartType typeContext,
   ) {
     if (isDoubleContext(typeContext)) {
@@ -4111,6 +3923,9 @@
         DartType inferredType = coreTypes.doubleRawType(
           Nullability.nonNullable,
         );
+        libraryBuilder.loader.dataForTesting
+        // Coverage-ignore(suite): Not run.
+        ?.registerAlias(node, replacement);
         return new ExpressionInferenceResult(inferredType, replacement);
       }
     }
@@ -4137,7 +3952,15 @@
       // Coverage-ignore-block(suite): Not run.
       return new ExpressionInferenceResult(const DynamicType(), error);
     }
-    Expression replacement = new IntLiteral(intValue);
+    Expression replacement = extern.createIntLiteral(
+      coreTypes,
+      intValue,
+      fileOffset: node.fileOffset,
+      encodeForWeb: false,
+    );
+    libraryBuilder.loader.dataForTesting
+    // Coverage-ignore(suite): Not run.
+    ?.registerAlias(node, replacement);
     DartType inferredType = coreTypes.intRawType(Nullability.nonNullable);
     return new ExpressionInferenceResult(inferredType, replacement);
   }
@@ -4435,13 +4258,11 @@
 
     Object? rewrite = popRewrite(NullValues.Expression);
     if (!identical(element.otherwise, rewrite)) {
-      // Coverage-ignore-block(suite): Not run.
       element.otherwise = (rewrite as Expression?)?..parent = element;
     }
 
     rewrite = popRewrite();
     if (!identical(element.then, rewrite)) {
-      // Coverage-ignore-block(suite): Not run.
       element.then = (rewrite as Expression)..parent = element;
     }
 
@@ -4472,7 +4293,6 @@
 
     rewrite = popRewrite();
     if (!identical(element.expression, rewrite)) {
-      // Coverage-ignore-block(suite): Not run.
       element.expression = (rewrite as Expression)..parent = patternGuard;
     }
 
@@ -4538,7 +4358,16 @@
     assert(declaredVariables.length == element.variableInitializations.length);
     for (int i = 0; i < declaredVariables.length; i++) {
       DartType type = declaredVariables[i].type;
-      element.intermediateVariables[i].type = type;
+
+      VariableDeclaration intermediateVariable =
+          element.intermediateVariables[i];
+      intermediateVariable.initializer = inferExpression(
+        intermediateVariable.initializer!,
+        type,
+        isVoidAllowed: true,
+      ).expression..parent = intermediateVariable;
+      intermediateVariable.type = type;
+
       element.variableInitializations[i].type = type;
     }
 
@@ -4571,14 +4400,13 @@
     Map<Expression, DartType> inferredConditionTypes,
   ) {
     // TODO(johnniwinther): Use _visitStatements instead.
-    List<VariableInitializationBase>? variables;
+    List<VariableDeclaration>? variables;
     for (
       int index = 0;
       index < element.variableInitializations.length;
       index++
     ) {
-      VariableInitializationBase variable =
-          element.variableInitializations[index];
+      VariableDeclaration variable = element.variableInitializations[index];
       if (variable.name == null) {
         if (variable.initializer != null) {
           ExpressionInferenceResult initializerResult = inferExpression(
@@ -4659,7 +4487,7 @@
   }
 
   ExpressionInferenceResult _inferForInElement(
-    ForInElement element,
+    ForInElement node,
     DartType inferredTypeArgument,
     Map<TreeNode, DartType> inferredSpreadTypes,
     Map<Expression, DartType> inferredConditionTypes,
@@ -4674,60 +4502,41 @@
         scopeProviderInfoKind: ScopeProviderInfoKind.Loop,
       );
     }
-    ForInResult result;
-    if (element.variable.cosmeticName == null) {
-      result = handleForInWithoutVariable(
-        element,
-        element.variable,
-        element.iterable,
-        element.syntheticAssignment,
-        element.expressionEffects,
-        isAsync: element.isAsync,
-        hasProblem: element.problem != null,
-      );
-    } else {
-      result = handleForInDeclaringVariable(
-        element,
-        element.variable,
-        element.iterable,
-        element.expressionEffects,
-        isAsync: element.isAsync,
-      );
-    }
-    VariableDeclaration astVariable = result.variable is InternalVariable
-        ? (result.variable as InternalVariable).astVariable
-        : result.variable;
-    element.variable = astVariable..parent = element;
+    ForInHeaderResult result = node.element.inferForInHeader(
+      this,
+      node: node,
+      iterable: node.iterable,
+      isAsync: node.isAsync,
+      forOffset: node.forOffset,
+      isClosureContextLoweringEnabled: isClosureContextLoweringEnabled,
+    );
+
+    VariableDeclaration variable = node.variable = result.loopVariable;
+    node.iterable = result.iterable..parent = node;
+
+    flowAnalysis.forEach_bodyBegin(node);
+
+    flowAnalysis.declare(
+      variable,
+      new SharedTypeView(variable.type),
+      initialized: true,
+    );
     if (isClosureContextLoweringEnabled) {
       _contextAllocationStrategy.handleDeclarationOfVariable(
-        astVariable,
-        captureKind: _captureKindForVariable(astVariable),
+        variable,
+        captureKind: _captureKindForVariable(variable),
       );
     }
-    element.iterable = result.iterable..parent = element;
-    // TODO(johnniwinther): Use ?.. here instead.
-    element.syntheticAssignment = result.syntheticAssignment;
-    result.syntheticAssignment?.parent = element;
-    // TODO(johnniwinther): Use ?.. here instead.
-    element.expressionEffects = result.expressionSideEffects;
-    result.expressionSideEffects?.parent = element;
 
-    if (element.problem != null) {
-      // Coverage-ignore-block(suite): Not run.
-      ExpressionInferenceResult problemResult = inferExpression(
-        element.problem!,
-        const UnknownType(),
-        isVoidAllowed: true,
-      );
-      element.problem = problemResult.expression..parent = element;
-    }
+    node.encoding = result.computeEncoding();
+
     ExpressionInferenceResult bodyResult = inferElement(
-      element.body,
+      node.body,
       inferredTypeArgument,
       inferredSpreadTypes,
       inferredConditionTypes,
     );
-    element.body = bodyResult.expression..parent = element;
+    node.body = bodyResult.expression..parent = node;
     // This is matched by the call to [forEach_bodyBegin] in
     // [handleForInWithoutVariable] or [handleForInDeclaringVariable].
     flowAnalysis.forEach_end();
@@ -4735,9 +4544,9 @@
       _contextAllocationStrategy.exitScopeProvider(scopeProviderInfo);
       // The scope will later be passed to the [ForInStatement] the [element]
       // is desugared into.
-      element.scope = scopeProviderInfo.scope?..parent = element;
+      node.scope = scopeProviderInfo.scope;
     }
-    return new ExpressionInferenceResult(bodyResult.inferredType, element);
+    return new ExpressionInferenceResult(bodyResult.inferredType, node);
   }
 
   ExpressionInferenceResult inferElement(
@@ -5513,7 +5322,7 @@
   }
 
   void _translateForInElement(
-    ForInElement element,
+    ForInElement node,
     InterfaceType receiverType,
     DartType elementType,
     VariableDeclaration result,
@@ -5521,18 +5330,16 @@
     required bool isSet,
   }) {
     List<Statement> statements;
-    Statement? prologue = element.prologue;
-    if (prologue == null) {
-      statements = <Statement>[];
+    Statement? bodyPrologue = node.encoding!.bodyPrologue;
+    if (bodyPrologue == null) {
+      statements = [];
     } else {
-      statements = prologue is Block
-          ?
-            // Coverage-ignore(suite): Not run.
-            prologue.statements
-          : <Statement>[prologue];
+      statements = bodyPrologue is Block
+          ? bodyPrologue.statements
+          : [bodyPrologue];
     }
     _translateElement(
-      element.body,
+      node.body,
       receiverType,
       elementType,
       result,
@@ -5542,21 +5349,24 @@
     Statement loopBody = statements.length == 1
         ? statements.first
         : _createBlock(statements);
-    if (element.problem != null) {
-      // Coverage-ignore-block(suite): Not run.
-      body.add(_createExpressionStatement(element.problem!));
-    }
-    ForInStatement loop = _createForInStatement(
-      element.fileOffset,
-      element.variable,
-      element.iterable,
+    Statement loop = _createForInStatement(
+      node.fileOffset,
+      node.variable!,
+      node.iterable,
       loopBody,
-      isAsync: element.isAsync,
-    );
-    loop.scope = element.scope;
+      isAsync: node.isAsync,
+    )..scope = node.scope;
     libraryBuilder.loader.dataForTesting
     // Coverage-ignore(suite): Not run.
-    ?.registerAlias(element, loop);
+    ?.registerAlias(node, loop);
+
+    InvalidExpression? preLoopError = node.encoding!.preLoopError;
+    if (preLoopError != null) {
+      loop = createBlock([
+        createExpressionStatement(preLoopError),
+        loop,
+      ], fileOffset: node.fileOffset);
+    }
     body.add(loop);
   }
 
@@ -5905,7 +5715,7 @@
             body,
           );
         case ForInMapEntry():
-          _translateForInEntry(
+          _translateForInEntry2(
             entry,
             receiverType,
             keyType,
@@ -6113,8 +5923,8 @@
     body.add(loop);
   }
 
-  void _translateForInEntry(
-    ForInMapEntry entry,
+  void _translateForInEntry2(
+    ForInMapEntry node,
     InterfaceType receiverType,
     DartType keyType,
     DartType valueType,
@@ -6122,18 +5932,16 @@
     List<Statement> body,
   ) {
     List<Statement> statements;
-    Statement? prologue = entry.prologue;
-    if (prologue == null) {
-      statements = <Statement>[];
+    Statement? bodyPrologue = node.encoding!.bodyPrologue;
+    if (bodyPrologue == null) {
+      statements = [];
     } else {
-      statements = prologue is Block
-          ?
-            // Coverage-ignore(suite): Not run.
-            prologue.statements
-          : <Statement>[prologue];
+      statements = bodyPrologue is Block
+          ? bodyPrologue.statements
+          : [bodyPrologue];
     }
     _translateEntry(
-      entry.body,
+      node.body,
       receiverType,
       keyType,
       valueType,
@@ -6143,21 +5951,25 @@
     Statement loopBody = statements.length == 1
         ? statements.first
         : _createBlock(statements);
-    if (entry.problem != null) {
-      // Coverage-ignore-block(suite): Not run.
-      body.add(_createExpressionStatement(entry.problem!));
-    }
-    ForInStatement loop = _createForInStatement(
-      entry.fileOffset,
-      entry.variable,
-      entry.iterable,
+    Statement loop = _createForInStatement(
+      node.fileOffset,
+      node.variable!,
+      node.iterable,
       loopBody,
-      isAsync: entry.isAsync,
-    );
-    loop.scope = entry.scope;
+      isAsync: node.isAsync,
+    )..scope = node.scope;
     libraryBuilder.loader.dataForTesting
     // Coverage-ignore(suite): Not run.
-    ?.registerAlias(entry, loop);
+    ?.registerAlias(node, loop);
+
+    InvalidExpression? preLoopError = node.encoding!.preLoopError;
+    if (preLoopError != null) {
+      loop = createBlock([
+        createExpressionStatement(preLoopError),
+        loop,
+      ], fileOffset: node.fileOffset);
+    }
+
     body.add(loop);
   }
 
@@ -7617,7 +7429,6 @@
 
     rewrite = popRewrite();
     if (!identical(entry.expression, rewrite)) {
-      // Coverage-ignore-block(suite): Not run.
       entry.expression = (rewrite as Expression)..parent = patternGuard;
     }
 
@@ -7677,7 +7488,15 @@
     assert(declaredVariables.length == entry.variables.length);
     for (int i = 0; i < declaredVariables.length; i++) {
       DartType type = declaredVariables[i].type;
-      entry.intermediateVariables[i].type = type;
+
+      VariableDeclaration intermediateVariable = entry.intermediateVariables[i];
+      intermediateVariable.initializer = inferExpression(
+        intermediateVariable.initializer!,
+        type,
+        isVoidAllowed: true,
+      ).expression..parent = intermediateVariable;
+      intermediateVariable.type = type;
+
       entry.variables[i].type = type;
     }
 
@@ -7823,7 +7642,7 @@
   }
 
   MapLiteralEntry _inferForInMapEntry(
-    ForInMapEntry entry,
+    ForInMapEntry node,
     TreeNode parent,
     DartType inferredKeyType,
     DartType inferredValueType,
@@ -7844,58 +7663,37 @@
         scopeProviderInfoKind: ScopeProviderInfoKind.Loop,
       );
     }
-    ForInResult result;
-    if (entry.variable.cosmeticName == null) {
-      result = handleForInWithoutVariable(
-        entry,
-        entry.variable,
-        entry.iterable,
-        entry.syntheticAssignment,
-        entry.expressionEffects,
-        isAsync: entry.isAsync,
-        hasProblem: entry.problem != null,
-      );
-    } else {
-      result = handleForInDeclaringVariable(
-        entry,
-        entry.variable,
-        entry.iterable,
-        entry.expressionEffects,
-        isAsync: entry.isAsync,
-      );
-    }
-    VariableDeclaration astVariable = result.variable is InternalVariable
-        ? (result.variable as InternalVariable).astVariable
-        :
-          // Coverage-ignore(suite): Not run.
-          result.variable;
-    entry.variable = astVariable..parent = entry;
+    ForInHeaderResult result = node.element.inferForInHeader(
+      this,
+      node: node,
+      iterable: node.iterable,
+      isAsync: node.isAsync,
+      forOffset: node.forOffset,
+      isClosureContextLoweringEnabled: isClosureContextLoweringEnabled,
+    );
+    VariableDeclaration variable = node.variable = result.loopVariable;
+    node.iterable = result.iterable..parent = node;
+
+    flowAnalysis.forEach_bodyBegin(node);
+
+    flowAnalysis.declare(
+      variable,
+      new SharedTypeView(variable.type),
+      initialized: true,
+    );
     if (isClosureContextLoweringEnabled) {
       _contextAllocationStrategy.handleDeclarationOfVariable(
-        astVariable,
-        captureKind: _captureKindForVariable(astVariable),
+        variable,
+        captureKind: _captureKindForVariable(variable),
       );
     }
-    entry.iterable = result.iterable..parent = entry;
-    // TODO(johnniwinther): Use ?.. here instead.
-    entry.syntheticAssignment = result.syntheticAssignment;
-    result.syntheticAssignment?.parent = entry;
-    // TODO(johnniwinther): Use ?.. here instead.
-    entry.expressionEffects = result.expressionSideEffects;
-    result.expressionSideEffects?.parent = entry;
-    if (entry.problem != null) {
-      // Coverage-ignore-block(suite): Not run.
-      ExpressionInferenceResult problemResult = inferExpression(
-        entry.problem!,
-        const UnknownType(),
-        isVoidAllowed: true,
-      );
-      entry.problem = problemResult.expression..parent = entry;
-    }
+
+    node.encoding = result.computeEncoding();
+
     // Actual types are added by the recursive call.
     MapLiteralEntry body = inferMapEntry(
-      entry.body,
-      entry,
+      node.body,
+      node,
       inferredKeyType,
       inferredValueType,
       spreadContext,
@@ -7905,7 +7703,7 @@
       inferredConditionTypes,
       offsets,
     );
-    entry.body = body..parent = entry;
+    node.body = body..parent = node;
     // This is matched by the call to [forEach_bodyBegin] in
     // [handleForInWithoutVariable] or [handleForInDeclaringVariable].
     flowAnalysis.forEach_end();
@@ -7913,9 +7711,9 @@
       _contextAllocationStrategy.exitScopeProvider(scopeProviderInfo);
       // The scope will later be passed to the [ForInStatement] the [entry]
       // is desugared into.
-      entry.scope = scopeProviderInfo.scope?..parent = entry;
+      node.scope = scopeProviderInfo.scope;
     }
-    return entry;
+    return node;
   }
 
   // Note that inferMapEntry adds exactly two elements to actualTypes -- the
@@ -8566,14 +8364,15 @@
           return result;
         case ForInMapEntry():
           ForInElement result = new ForInElement(
-            entry.variable,
+            entry.element,
             entry.iterable,
-            entry.syntheticAssignment,
-            entry.expressionEffects,
             convertToElement(entry.body, onConvertMapEntry),
-            entry.problem,
             isAsync: entry.isAsync,
-          )..fileOffset = entry.fileOffset;
+            fileOffset: entry.fileOffset,
+            forOffset: entry.forOffset,
+            variable: entry.variable,
+            encoding: entry.encoding,
+          );
           onConvertMapEntry(entry, result);
           return result;
       }
@@ -8986,18 +8785,14 @@
       null,
     );
 
-    binaryResult = ensureAssignableResult(writeType, binaryResult);
-    DartType binaryType = binaryResult.inferredType;
-    Expression binary = binaryResult.expression;
-
-    ExpressionInferenceResult writeResult = _computePropertySet(
-      node.nameOffset,
-      writeReceiver,
-      receiverType,
-      node.name,
-      writeTarget,
-      binary,
-      valueType: binaryType,
+    ExpressionInferenceResult writeResult = inferPropertySet(
+      fileOffset: node.nameOffset,
+      receiver: writeReceiver,
+      receiverType: receiverType,
+      propertyName: node.name,
+      writeTarget: writeTarget,
+      writeContext: writeType,
+      valueResult: binaryResult,
       // For prefix expressions like `a = ++o.b` we need the result of the
       // assignment as the result of the expression.
       forEffect: node.isPost || node.forEffect,
@@ -9031,7 +8826,7 @@
       // For postfix expressions the expression type is the type of the read
       // value. For prefix expressions the expression type is the type of the
       // assignment value.
-      node.isPost ? readType : binaryType,
+      node.isPost ? readType : writeResult.inferredType,
       replacement,
     );
   }
@@ -9112,18 +8907,14 @@
       null,
     );
 
-    binaryResult = ensureAssignableResult(writeType, binaryResult);
-    DartType binaryType = binaryResult.inferredType;
-    Expression binary = binaryResult.expression;
-
-    ExpressionInferenceResult writeResult = _computePropertySet(
-      node.writeOffset,
-      writeReceiver,
-      receiverType,
-      node.propertyName,
-      writeTarget,
-      binary,
-      valueType: binaryType,
+    ExpressionInferenceResult writeResult = inferPropertySet(
+      fileOffset: node.writeOffset,
+      receiver: writeReceiver,
+      receiverType: receiverType,
+      propertyName: node.propertyName,
+      writeTarget: writeTarget,
+      valueResult: binaryResult,
+      writeContext: writeType,
       forEffect: node.forEffect,
     );
     Expression write = writeResult.expression;
@@ -9139,7 +8930,7 @@
       }
     }
     replacement.fileOffset = node.fileOffset;
-    return new ExpressionInferenceResult(binaryType, replacement);
+    return new ExpressionInferenceResult(writeResult.inferredType, replacement);
   }
 
   ExpressionInferenceResult visitIfNullPropertySet(
@@ -9207,21 +8998,18 @@
     );
     flowAnalysis.ifNullExpression_end();
 
-    rhsResult = ensureAssignableResult(writeContext, rhsResult);
-    Expression rhs = rhsResult.expression;
-
-    DartType writeType = rhsResult.inferredType;
-    ExpressionInferenceResult writeResult = _computePropertySet(
-      node.writeOffset,
-      writeReceiver,
-      receiverType,
-      node.propertyName,
-      writeTarget,
-      rhs,
+    ExpressionInferenceResult writeResult = inferPropertySet(
+      fileOffset: node.writeOffset,
+      receiver: writeReceiver,
+      receiverType: receiverType,
+      propertyName: node.propertyName,
+      writeTarget: writeTarget,
+      writeContext: writeContext,
+      valueResult: rhsResult,
       forEffect: node.forEffect,
-      valueType: writeType,
     );
     Expression write = writeResult.expression;
+    DartType writeType = writeResult.inferredType;
 
     DartType nonNullableReadType = readType.toNonNull();
     DartType inferredType = _analyzeIfNullTypes(
@@ -11364,185 +11152,6 @@
     );
   }
 
-  /// Creates a property set operation of [writeTarget] on [receiver] using
-  /// [value] as the right-hand side.
-  ///
-  /// [fileOffset] is used as the file offset for created nodes. [propertyName]
-  /// is used for error reporting. [receiverType] is the already inferred type
-  /// of the [receiver] expression. The inferred type of [value] must already
-  /// have been computed.
-  ///
-  /// If [forEffect] the resulting expression is ensured to return the [value]
-  /// of static type [valueType]. This is needed for extension setters which are
-  /// encoded as static method calls that do not implicitly return the value.
-  ///
-  /// The returned [ExpressionInferenceResult] holds the generated expression
-  /// and the type of this expression. Normally this is the [valueType] but
-  /// for setter extension for effect, the generated expression has type
-  /// `void`.
-  ExpressionInferenceResult _computePropertySet(
-    int fileOffset,
-    Expression receiver,
-    DartType receiverType,
-    Name propertyName,
-    ObjectAccessTarget writeTarget,
-    Expression value, {
-    required DartType valueType,
-    required bool forEffect,
-  }) {
-    if (expressionEvaluationHelper != null) {
-      // Coverage-ignore-block(suite): Not run.
-      OverwrittenInterfaceMember? overWritten = expressionEvaluationHelper
-          ?.overwriteFindInterfaceMember(
-            target: writeTarget,
-            name: propertyName,
-            receiverType: receiverType,
-            setter: true,
-          );
-      if (overWritten != null) {
-        writeTarget = overWritten.target;
-        propertyName = overWritten.name;
-      }
-    }
-    Expression write;
-    DartType writeType = valueType;
-    switch (writeTarget.kind) {
-      case ObjectAccessTargetKind.missing:
-        write = createMissingPropertySet(
-          fileOffset,
-          receiver,
-          receiverType,
-          propertyName,
-          value,
-          forEffect: forEffect,
-        );
-        break;
-      case ObjectAccessTargetKind.ambiguous:
-        write = createMissingPropertySet(
-          fileOffset,
-          receiver,
-          receiverType,
-          propertyName,
-          value,
-          forEffect: forEffect,
-          extensionAccessCandidates: writeTarget.candidates,
-        );
-        break;
-      case ObjectAccessTargetKind.extensionMember:
-      case ObjectAccessTargetKind.nullableExtensionMember:
-      case ObjectAccessTargetKind.extensionTypeMember:
-      case ObjectAccessTargetKind.nullableExtensionTypeMember:
-        if (forEffect) {
-          write = new StaticInvocation(
-            writeTarget.member as Procedure,
-            new Arguments(
-              <Expression>[receiver, value],
-              types: writeTarget.receiverTypeArguments,
-            )..fileOffset = fileOffset,
-          )..fileOffset = fileOffset;
-          // The generate invocation has a void return type.
-          writeType = const VoidType();
-        } else {
-          VariableDeclaration valueVariable = createVariable(value, valueType);
-          VariableDeclaration assignmentVariable = createVariable(
-            new StaticInvocation(
-              writeTarget.member as Procedure,
-              new Arguments(
-                <Expression>[receiver, createVariableGet(valueVariable)],
-                types: writeTarget.receiverTypeArguments,
-              )..fileOffset = fileOffset,
-            )..fileOffset = fileOffset,
-            const VoidType(),
-          );
-          write = createLet(
-            valueVariable,
-            createLet(assignmentVariable, createVariableGet(valueVariable)),
-          )..fileOffset = fileOffset;
-        }
-        break;
-      case ObjectAccessTargetKind.invalid:
-        write = new DynamicSet(
-          DynamicAccessKind.Invalid,
-          receiver,
-          propertyName,
-          value,
-        )..fileOffset = fileOffset;
-        break;
-      case ObjectAccessTargetKind.never:
-        write = new DynamicSet(
-          DynamicAccessKind.Never,
-          receiver,
-          propertyName,
-          value,
-        )..fileOffset = fileOffset;
-        break;
-      case ObjectAccessTargetKind.callFunction:
-      case ObjectAccessTargetKind.nullableCallFunction:
-      case ObjectAccessTargetKind.dynamic:
-        write = new DynamicSet(
-          DynamicAccessKind.Dynamic,
-          receiver,
-          propertyName,
-          value,
-        )..fileOffset = fileOffset;
-        break;
-      case ObjectAccessTargetKind.instanceMember:
-      case ObjectAccessTargetKind.objectMember:
-      case ObjectAccessTargetKind.nullableInstanceMember:
-      // Coverage-ignore(suite): Not run.
-      case ObjectAccessTargetKind.superMember:
-        InstanceAccessKind kind;
-        switch (writeTarget.kind) {
-          case ObjectAccessTargetKind.instanceMember:
-            kind = InstanceAccessKind.Instance;
-            break;
-          case ObjectAccessTargetKind.nullableInstanceMember:
-            kind = InstanceAccessKind.Nullable;
-            break;
-          // Coverage-ignore(suite): Not run.
-          case ObjectAccessTargetKind.objectMember:
-            kind = InstanceAccessKind.Object;
-            break;
-          // Coverage-ignore(suite): Not run.
-          default:
-            throw new UnsupportedError('Unexpected target kind $writeTarget');
-        }
-        write = new InstanceSet(
-          kind,
-          receiver,
-          propertyName,
-          value,
-          interfaceTarget: writeTarget.classMember!,
-        )..fileOffset = fileOffset;
-        break;
-      // Coverage-ignore(suite): Not run.
-      case ObjectAccessTargetKind.recordIndexed:
-      case ObjectAccessTargetKind.recordNamed:
-      case ObjectAccessTargetKind.extensionTypeRepresentation:
-      case ObjectAccessTargetKind.nullableRecordIndexed:
-      case ObjectAccessTargetKind.nullableRecordNamed:
-      case ObjectAccessTargetKind.nullableExtensionTypeRepresentation:
-        throw new UnsupportedError('Unexpected write target ${writeTarget}');
-    }
-    Expression result;
-    if (writeTarget.isNullable) {
-      result = problemReporting.wrapInProblem(
-        compilerContext: compilerContext,
-        expression: write,
-        message: diag.nullablePropertyAccessError.withArguments(
-          propertyName: propertyName.text,
-          receiverType: receiverType,
-        ),
-        fileUri: fileUri,
-        fileOffset: write.fileOffset,
-        length: propertyName.text.length,
-      );
-    } else {
-      result = write;
-    }
-    return new ExpressionInferenceResult(writeType, result);
-  }
-
   ExpressionInferenceResult visitCompoundIndexSet(
     CompoundIndexSet node,
     DartType typeContext,
@@ -12260,7 +11869,16 @@
     flowAnalysis.declare(
       node.variable,
       new SharedTypeView(node.variable.type),
-      initialized: true,
+      initialized: false,
+    );
+    flowAnalysis.initialize(
+      node.variable,
+      new SharedTypeView(node.variable.type),
+      flowAnalysis.getExpressionInfo(node.variable.initializer!),
+      isFinal: false,
+      isLate: false,
+      isImplicitlyTyped: node.isImplicitlyTyped,
+      inheritPromotableProperties: node.isParameterless,
     );
     if (node.isNullAware) {
       flow.nullAwareAccess_rightBegin(
@@ -12270,11 +11888,19 @@
       );
     }
 
+    if (node.isParameterless) {
+      flow.thisBinding_begin(
+        flowAnalysis.getExpressionInfo(node.variable.initializer!),
+      );
+    }
     ExpressionInferenceResult bodyResult = inferExpression(
       node.body,
       typeContext,
       isVoidAllowed: true,
     );
+    if (node.isParameterless) {
+      flow.thisBinding_end();
+    }
 
     if (node.isNullAware) {
       flow.nullAwareAccess_end();
@@ -12336,6 +11962,13 @@
       replacement = new Let(node.variable, body)..fileOffset = node.fileOffset;
     }
 
+    if (node.isParameterless) {
+      flowAnalysis.storeExpressionInfo(
+        replacement,
+        flowAnalysis.getExpressionInfo(node.body),
+      );
+    }
+
     return new ExpressionInferenceResult(inferredType, replacement);
   }
 
@@ -12343,17 +11976,57 @@
     PropertySet node,
     DartType typeContext,
   ) {
+    PropertySetData data = computePropertySetData(
+      receiver: node.receiver,
+      name: node.name,
+      isNullAware: node.isNullAware,
+      fileOffset: node.fileOffset,
+    );
+    DartType writeContext = data.writeContext;
+    Expression receiver = data.receiver;
+    DartType receiverType = data.receiverType;
+    ObjectAccessTarget target = data.target;
+
+    ExpressionInferenceResult rhsResult = inferExpression(
+      node.value,
+      writeContext,
+      isVoidAllowed: true,
+    );
+
+    ExpressionInferenceResult replacementResult = inferPropertySet(
+      fileOffset: node.fileOffset,
+      receiver: receiver,
+      receiverType: receiverType,
+      propertyName: node.name,
+      writeTarget: target,
+      writeContext: writeContext,
+      valueResult: rhsResult,
+      forEffect: node.forEffect,
+    );
+    Expression replacement = replacementResult.expression;
+    DartType replacementType = replacementResult.inferredType;
+
+    return new ExpressionInferenceResult(replacementType, replacement);
+  }
+
+  @override
+  PropertySetData computePropertySetData({
+    required Expression receiver,
+    required Name name,
+    required bool isNullAware,
+    required int fileOffset,
+  }) {
     ExpressionInferenceResult receiverResult = inferExpression(
-      node.receiver,
+      receiver,
       const UnknownType(),
       isVoidAllowed: false,
       continueNullShorting: true,
     );
 
-    Expression receiver = receiverResult.expression;
+    receiver = receiverResult.expression;
     DartType receiverType = receiverResult.inferredType;
 
-    if (node.isNullAware) {
+    if (isNullAware) {
       DartType nonNullReceiverType = receiverType.toNonNull();
       receiver = _createNonNullReceiver(
         receiver,
@@ -12365,41 +12038,19 @@
 
     ObjectAccessTarget target = findInterfaceMember(
       receiverType,
-      node.name,
-      node.fileOffset,
+      name,
+      fileOffset,
       isSetter: true,
       instrumented: true,
       includeExtensionMethods: true,
     );
     DartType writeContext = target.getSetterType(this);
-    ExpressionInferenceResult rhsResult = inferExpression(
-      node.value,
-      writeContext,
-      isVoidAllowed: true,
+    return new PropertySetData(
+      receiver: receiver,
+      receiverType: receiverType,
+      writeContext: writeContext,
+      target: target,
     );
-    rhsResult = ensureAssignableResult(
-      writeContext,
-      rhsResult,
-      fileOffset: node.fileOffset,
-      isVoidAllowed: writeContext is VoidType,
-    );
-    Expression rhs = rhsResult.expression;
-    DartType rhsType = rhsResult.inferredType;
-
-    ExpressionInferenceResult replacementResult = _computePropertySet(
-      node.fileOffset,
-      receiver,
-      receiverType,
-      node.name,
-      target,
-      rhs,
-      valueType: rhsType,
-      forEffect: node.forEffect,
-    );
-    Expression replacement = replacementResult.expression;
-    DartType replacementType = replacementResult.inferredType;
-
-    return new ExpressionInferenceResult(replacementType, replacement);
   }
 
   ExpressionInferenceResult visitPropertyGet(
@@ -12625,7 +12276,7 @@
   ) {
     ensureMemberType(node.target);
     List<TypeParameter> constructorTypeParameters =
-        _constructorBuilder!.signature.typeParameters;
+        _constructorContext!.signature.typeParameters;
     // The redirecting initializer syntax doesn't include type arguments passed
     // to the target constructor so we synthesize them for calling
     // [inferInvocation].
@@ -12684,7 +12335,7 @@
     ExtensionTypeRepresentationFieldInitializer node,
   ) {
     DartType fieldType = node.field.getterType;
-    fieldType = _constructorBuilder!.substituteFieldType(fieldType);
+    fieldType = _constructorContext!.substituteFieldType(fieldType);
     ExpressionInferenceResult initializerResult = inferExpression(
       node.value,
       fieldType,
@@ -12712,7 +12363,17 @@
   ) {
     DartType typeContext = bodyContext.returnContext;
     DartType inferredType;
-    if (node.expression != null) {
+    VariableDeclaration? thisVariable = _constructorContext?.thisVariable;
+    if (bodyContext.isRoot && thisVariable != null) {
+      // The constructor is lowered with an explicit variable for `this`. This
+      // means that `return;` should be encoded as `return #this;` where `#this`
+      // is the [thisVariable].
+      node.expression = extern.createVariableGet(
+        thisVariable,
+        fileOffset: node.fileOffset,
+      )..parent = node;
+      inferredType = thisVariable.type;
+    } else if (node.expression != null) {
       ExpressionInferenceResult expressionResult = inferExpression(
         node.expression!,
         typeContext,
@@ -13342,7 +13003,6 @@
 
     Object? rewrite = popRewrite();
     if (!identical(expression, rewrite)) {
-      // Coverage-ignore-block(suite): Not run.
       expression = rewrite as Expression;
       node.expression = expression..parent = node;
     }
@@ -13595,6 +13255,7 @@
           exceptionCatchVariable,
           captureKind: _captureKindForVariable(exceptionCatchVariable),
         );
+        node.exception = exceptionCatchVariable;
       }
       if (node.stackTrace case CatchVariable stackTraceCatchVariable?) {
         // TODO(62401): Remove the casts when the flow analysis uses
@@ -13606,6 +13267,7 @@
           stackTraceCatchVariable,
           captureKind: _captureKindForVariable(stackTraceCatchVariable),
         );
+        node.stackTrace = stackTraceCatchVariable;
       }
     }
     StatementInferenceResult bodyResult = inferStatement(node.body);
@@ -13615,7 +13277,7 @@
     }
     if (scopeProviderInfo != null) {
       _contextAllocationStrategy.exitScopeProvider(scopeProviderInfo);
-      node.scope = scopeProviderInfo.scope?..parent = node;
+      node.scope = scopeProviderInfo.scope;
     }
   }
 
@@ -13692,14 +13354,22 @@
   }
 
   @override
+  // Coverage-ignore(suite): Not run.
   ExpressionInferenceResult visitVariableSet(
     VariableSet node,
     DartType typeContext,
   ) {
+    _unhandledExpression(node, typeContext);
+  }
+
+  ExpressionInferenceResult visitInternalVariableSet(
+    InternalVariableSet node,
+    DartType typeContext,
+  ) {
     if (expressionEvaluationHelper != null) {
       // Coverage-ignore-block(suite): Not run.
       ExpressionInferenceResult? result = expressionEvaluationHelper
-          ?.visitVariableSet(
+          ?.visitInternalVariableSet(
             node,
             typeContext,
             problemReporting,
@@ -13710,7 +13380,7 @@
         return result;
       }
     }
-    InternalVariable variable = node.variable as InternalVariable;
+    InternalVariable variable = node.variable;
     var (DartType variableType, DartType writeContext) =
         computeVariableSetTypeAndWriteContext(variable);
     ExpressionInferenceResult rhsResult = inferExpression(
@@ -13718,14 +13388,17 @@
       writeContext,
       isVoidAllowed: true,
     );
-    return inferVariableSet(
+    ExpressionInferenceResult result = inferVariableSet(
       variable: variable,
       variableType: variableType,
       rhsResult: rhsResult,
       assignOffset: node.fileOffset,
       nameOffset: node.fileOffset,
-      node: node,
     );
+    libraryBuilder.loader.dataForTesting
+    // Coverage-ignore(suite): Not run.
+    ?.registerAlias(node, result.expression);
+    return result;
   }
 
   @override
@@ -13776,14 +13449,22 @@
   }
 
   @override
+  // Coverage-ignore(suite): Not run.
   ExpressionInferenceResult visitVariableGet(
     VariableGet node,
     DartType typeContext,
   ) {
+    _unhandledExpression(node, typeContext);
+  }
+
+  ExpressionInferenceResult visitInternalVariableGet(
+    InternalVariableGet node,
+    DartType typeContext,
+  ) {
     if (expressionEvaluationHelper != null) {
       // Coverage-ignore-block(suite): Not run.
       ExpressionInferenceResult? result = expressionEvaluationHelper
-          ?.visitVariableGet(
+          ?.visitInternalVariableGet(
             node,
             typeContext,
             problemReporting,
@@ -13794,12 +13475,15 @@
         return result;
       }
     }
-    return inferVariableGet(
-      variable: node.variable as InternalVariable,
+    ExpressionInferenceResult result = inferVariableGet(
+      variable: node.variable,
       typeContext: typeContext,
       nameOffset: node.fileOffset,
-      node: node,
     );
+    libraryBuilder.loader.dataForTesting
+    // Coverage-ignore(suite): Not run.
+    ?.registerAlias(node, result.expression);
+    return result;
   }
 
   @override
@@ -13834,10 +13518,7 @@
     flowAnalysis.whileStatement_end();
     if (scopeProviderInfo != null) {
       _contextAllocationStrategy.exitScopeProvider(scopeProviderInfo);
-      node.scope =
-          scopeProviderInfo
-              .scope // Coverage-ignore(suite): Not run.
-            ?..parent = node;
+      node.scope = scopeProviderInfo.scope;
     }
     return const StatementInferenceResult();
   }
@@ -13968,8 +13649,7 @@
       // integer literal -9223372036854775808 which should be a positive number,
       // and negated 9223372036854775808 represented as
       // -9223372036854775808.unary-() which should be a negative number.
-      if (node.expression is IntJudgment) {
-        IntJudgment receiver = node.expression as IntJudgment;
+      if (node.expression case InternalIntLiteral receiver) {
         if (isDoubleContext(typeContext)) {
           double? doubleValue = receiver.asDouble(negated: true);
           if (doubleValue != null) {
@@ -13990,9 +13670,7 @@
           // Coverage-ignore-block(suite): Not run.
           return new ExpressionInferenceResult(const DynamicType(), error);
         }
-      } else if (node.expression is ShadowLargeIntLiteral) {
-        ShadowLargeIntLiteral receiver =
-            node.expression as ShadowLargeIntLiteral;
+      } else if (node.expression case LargeIntLiteral receiver) {
         if (!receiver.isParenthesized) {
           if (isDoubleContext(typeContext)) {
             double? doubleValue = receiver.asDouble(negated: true);
@@ -15326,77 +15004,70 @@
       requiredType: requiredType,
     );
 
-    DartType lookupType;
     if (node.needsCheck) {
-      lookupType = node.lookupType = requiredType;
+      node.lookupType = requiredType;
     } else {
-      lookupType = node.lookupType = matchedValueType;
+      node.lookupType = matchedValueType;
     }
 
     ObjectAccessTarget lengthTarget = findInterfaceMember(
-      lookupType,
+      requiredType,
       lengthName,
       node.fileOffset,
       includeExtensionMethods: true,
       isSetter: false,
     );
-    DartType lengthType;
-    if (lengthTarget.isNever) {
-      lengthType = const NeverType.nonNullable();
-      node.isNeverPattern = true;
-    } else {
-      assert(lengthTarget.isInstanceMember);
+    assert(lengthTarget.isInstanceMember);
 
-      lengthType = node.lengthType = lengthTarget.getGetterType(this);
-      node.lengthTarget = lengthTarget.classMember!;
+    DartType lengthType = node.lengthType = lengthTarget.getGetterType(this);
+    node.lengthTarget = lengthTarget.classMember!;
 
-      ObjectAccessTarget sublistInvokeTarget = findInterfaceMember(
-        lookupType,
-        sublistName,
-        node.fileOffset,
-        includeExtensionMethods: true,
-        isSetter: false,
-      );
-      assert(sublistInvokeTarget.isInstanceMember);
+    ObjectAccessTarget sublistInvokeTarget = findInterfaceMember(
+      requiredType,
+      sublistName,
+      node.fileOffset,
+      includeExtensionMethods: true,
+      isSetter: false,
+    );
+    assert(sublistInvokeTarget.isInstanceMember);
 
-      node.sublistTarget = sublistInvokeTarget.classMember as Procedure;
-      node.sublistType = sublistInvokeTarget
-          .getFunctionType(this)
-          .sublistFunctionType;
+    node.sublistTarget = sublistInvokeTarget.classMember as Procedure;
+    node.sublistType = sublistInvokeTarget
+        .getFunctionType(this)
+        .sublistFunctionType;
 
-      ObjectAccessTarget minusTarget = findInterfaceMember(
+    ObjectAccessTarget minusTarget = findInterfaceMember(
+      lengthType,
+      minusName,
+      node.fileOffset,
+      includeExtensionMethods: true,
+      isSetter: false,
+    );
+    assert(minusTarget.isInstanceMember);
+    assert(minusTarget.isSpecialCasedBinaryOperator(this));
+
+    node.minusTarget = minusTarget.classMember as Procedure;
+    node.minusType = replaceReturnType(
+      minusTarget.getFunctionType(this).minusFunctionType,
+      typeSchemaEnvironment.getTypeOfSpecialCasedBinaryOperator(
         lengthType,
-        minusName,
-        node.fileOffset,
-        includeExtensionMethods: true,
-        isSetter: false,
-      );
-      assert(minusTarget.isInstanceMember);
-      assert(minusTarget.isSpecialCasedBinaryOperator(this));
+        coreTypes.intNonNullableRawType,
+      ),
+    );
 
-      node.minusTarget = minusTarget.classMember as Procedure;
-      node.minusType = replaceReturnType(
-        minusTarget.getFunctionType(this).minusFunctionType,
-        typeSchemaEnvironment.getTypeOfSpecialCasedBinaryOperator(
-          lengthType,
-          coreTypes.intNonNullableRawType,
-        ),
-      );
+    ObjectAccessTarget indexGetTarget = findInterfaceMember(
+      requiredType,
+      indexGetName,
+      node.fileOffset,
+      includeExtensionMethods: true,
+      isSetter: false,
+    );
+    assert(indexGetTarget.isInstanceMember);
 
-      ObjectAccessTarget indexGetTarget = findInterfaceMember(
-        lookupType,
-        indexGetName,
-        node.fileOffset,
-        includeExtensionMethods: true,
-        isSetter: false,
-      );
-      assert(indexGetTarget.isInstanceMember);
-
-      node.indexGetTarget = indexGetTarget.classMember as Procedure;
-      node.indexGetType = indexGetTarget
-          .getFunctionType(this)
-          .indexGetFunctionType;
-    }
+    node.indexGetTarget = indexGetTarget.classMember as Procedure;
+    node.indexGetType = indexGetTarget
+        .getFunctionType(this)
+        .indexGetFunctionType;
 
     for (Pattern pattern in node.patterns) {
       if (pattern is RestPattern) {
@@ -15405,52 +15076,50 @@
       }
     }
 
-    if (!node.isNeverPattern) {
-      if (node.hasRestPattern) {
-        ObjectAccessTarget greaterThanOrEqualTarget = findInterfaceMember(
-          lengthType,
-          greaterThanOrEqualsName,
-          node.fileOffset,
-          includeExtensionMethods: true,
-          isSetter: false,
-        );
-        assert(greaterThanOrEqualTarget.isInstanceMember);
+    if (node.hasRestPattern) {
+      ObjectAccessTarget greaterThanOrEqualTarget = findInterfaceMember(
+        lengthType,
+        greaterThanOrEqualsName,
+        node.fileOffset,
+        includeExtensionMethods: true,
+        isSetter: false,
+      );
+      assert(greaterThanOrEqualTarget.isInstanceMember);
 
-        node.lengthCheckTarget =
-            greaterThanOrEqualTarget.classMember as Procedure;
-        node.lengthCheckType = greaterThanOrEqualTarget
-            .getFunctionType(this)
-            .greaterThanOrEqualsFunctionType;
-      } else if (node.patterns.isEmpty) {
-        ObjectAccessTarget lessThanOrEqualsInvokeTarget = findInterfaceMember(
-          lengthType,
-          lessThanOrEqualsName,
-          node.fileOffset,
-          includeExtensionMethods: true,
-          isSetter: false,
-        );
-        assert(lessThanOrEqualsInvokeTarget.isInstanceMember);
+      node.lengthCheckTarget =
+          greaterThanOrEqualTarget.classMember as Procedure;
+      node.lengthCheckType = greaterThanOrEqualTarget
+          .getFunctionType(this)
+          .greaterThanOrEqualsFunctionType;
+    } else if (node.patterns.isEmpty) {
+      ObjectAccessTarget lessThanOrEqualsInvokeTarget = findInterfaceMember(
+        lengthType,
+        lessThanOrEqualsName,
+        node.fileOffset,
+        includeExtensionMethods: true,
+        isSetter: false,
+      );
+      assert(lessThanOrEqualsInvokeTarget.isInstanceMember);
 
-        node.lengthCheckTarget =
-            lessThanOrEqualsInvokeTarget.classMember as Procedure;
-        node.lengthCheckType = lessThanOrEqualsInvokeTarget
-            .getFunctionType(this)
-            .lessThanOrEqualsFunctionType;
-      } else {
-        ObjectAccessTarget equalsInvokeTarget = findInterfaceMember(
-          lengthType,
-          equalsName,
-          node.fileOffset,
-          includeExtensionMethods: true,
-          isSetter: false,
-        );
-        assert(equalsInvokeTarget.isInstanceMember);
+      node.lengthCheckTarget =
+          lessThanOrEqualsInvokeTarget.classMember as Procedure;
+      node.lengthCheckType = lessThanOrEqualsInvokeTarget
+          .getFunctionType(this)
+          .lessThanOrEqualsFunctionType;
+    } else {
+      ObjectAccessTarget equalsInvokeTarget = findInterfaceMember(
+        lengthType,
+        equalsName,
+        node.fileOffset,
+        includeExtensionMethods: true,
+        isSetter: false,
+      );
+      assert(equalsInvokeTarget.isInstanceMember);
 
-        node.lengthCheckTarget = equalsInvokeTarget.classMember as Procedure;
-        node.lengthCheckType = equalsInvokeTarget
-            .getFunctionType(this)
-            .equalsFunctionType;
-      }
+      node.lengthCheckTarget = equalsInvokeTarget.classMember as Procedure;
+      node.lengthCheckType = equalsInvokeTarget
+          .getFunctionType(this)
+          .equalsFunctionType;
     }
 
     pushRewrite(replacement ?? node);
@@ -15905,44 +15574,40 @@
       requiredType: requiredType,
     );
 
-    DartType lookupType;
     if (node.needsCheck) {
-      lookupType = node.lookupType = requiredType;
+      node.lookupType = requiredType;
     } else {
-      lookupType = node.lookupType = matchedValueType;
+      node.lookupType = matchedValueType;
     }
 
     ObjectAccessTarget containsKeyTarget = findInterfaceMember(
-      lookupType,
+      requiredType,
       containsKeyName,
       node.fileOffset,
       includeExtensionMethods: true,
       isSetter: false,
     );
-    if (containsKeyTarget.isNever) {
-      node.isNeverPattern = true;
-    } else {
-      assert(containsKeyTarget.isInstanceMember);
 
-      node.containsKeyTarget = containsKeyTarget.classMember as Procedure;
-      node.containsKeyType = containsKeyTarget
-          .getFunctionType(this)
-          .containsKeyFunctionType;
+    assert(containsKeyTarget.isInstanceMember);
 
-      ObjectAccessTarget indexGetTarget = findInterfaceMember(
-        lookupType,
-        indexGetName,
-        node.fileOffset,
-        includeExtensionMethods: true,
-        isSetter: false,
-      );
-      assert(indexGetTarget.isInstanceMember);
+    node.containsKeyTarget = containsKeyTarget.classMember as Procedure;
+    node.containsKeyType = containsKeyTarget
+        .getFunctionType(this)
+        .containsKeyFunctionType;
 
-      node.indexGetTarget = indexGetTarget.classMember as Procedure;
-      node.indexGetType = indexGetTarget
-          .getFunctionType(this)
-          .indexGetFunctionType;
-    }
+    ObjectAccessTarget indexGetTarget = findInterfaceMember(
+      requiredType,
+      indexGetName,
+      node.fileOffset,
+      includeExtensionMethods: true,
+      isSetter: false,
+    );
+    assert(indexGetTarget.isInstanceMember);
+
+    node.indexGetTarget = indexGetTarget.classMember as Procedure;
+    node.indexGetType = indexGetTarget
+        .getFunctionType(this)
+        .indexGetFunctionType;
 
     assert(
       checkStack(node, stackBase, [
@@ -17091,7 +16756,7 @@
 
   @override
   StatementInferenceResult visitVariableInitialization(
-    VariableInitializationBase node,
+    VariableInitialization node,
   ) {
     InternalVariable nodeVariable = node.variable as InternalVariable;
     StatementInferenceResult statementInferenceResult =
@@ -17107,7 +16772,7 @@
   }
 
   StatementInferenceResult _inferInternalExpressionVariableDeclaration(
-    VariableInitializationBase node,
+    VariableDeclaration node,
     InternalVariable nodeVariable,
   ) {
     DartType declaredType = nodeVariable.isImplicitlyTyped
@@ -17469,16 +17134,16 @@
 }
 
 abstract class ExpressionEvaluationHelper {
-  ExpressionInferenceResult? visitVariableGet(
-    VariableGet node,
+  ExpressionInferenceResult? visitInternalVariableGet(
+    InternalVariableGet node,
     DartType typeContext,
     ProblemReporting problemReporting,
     CompilerContext compilerContext,
     Uri fileUri,
   );
 
-  ExpressionInferenceResult? visitVariableSet(
-    VariableSet node,
+  ExpressionInferenceResult? visitInternalVariableSet(
+    InternalVariableSet node,
     DartType typeContext,
     ProblemReporting problemReporting,
     CompilerContext compilerContext,
diff --git a/pkg/front_end/lib/src/type_inference/inference_visitor_base.dart b/pkg/front_end/lib/src/type_inference/inference_visitor_base.dart
index 0e8f6e8..d188701 100644
--- a/pkg/front_end/lib/src/type_inference/inference_visitor_base.dart
+++ b/pkg/front_end/lib/src/type_inference/inference_visitor_base.dart
@@ -1016,6 +1016,28 @@
     );
   }
 
+  /// Computes [ExtensionSetData] used for explicit writes to extension setter
+  /// as an expression or as a for-in element.
+  ExtensionSetData computeExtensionSetData({
+    required Extension extension,
+    required List<DartType>? knownTypeArguments,
+    required Expression receiver,
+    required int? extensionTypeArgumentOffset,
+    required Procedure setter,
+    required bool isNullAware,
+    required int fileOffset,
+    TreeNode? nodeForTesting,
+  });
+
+  /// Infers a write to an extension setter using the [ExtensionSetData]
+  /// computed in [computeExtensionSetData] with the inferred [valueResult].
+  ExpressionInferenceResult inferExtensionSet({
+    required ExtensionSetData data,
+    required ExpressionInferenceResult valueResult,
+    required bool forEffect,
+    required int fileOffset,
+  });
+
   /// Computes the type arguments for an access to an extension instance member
   /// on [extension] with the static [receiverType]. If [explicitTypeArguments]
   /// are provided, these are returned, otherwise type arguments are inferred
@@ -1053,7 +1075,7 @@
     Extension extension,
     List<DartType>? explicitTypeArguments,
     DartType receiverType, {
-    required TreeNode treeNodeForTesting,
+    required TreeNode? treeNodeForTesting,
   }) {
     if (explicitTypeArguments != null) {
       assert(explicitTypeArguments.length == extension.typeParameters.length);
@@ -1526,35 +1548,6 @@
     }
   }
 
-  /// If target is missing on a non-dynamic receiver, an error is reported
-  /// using [diag.undefinedSetter] and an invalid expression is returned.
-  Expression? reportMissingInterfaceMember(
-    ObjectAccessTarget target,
-    DartType receiverType,
-    Name name,
-    int fileOffset,
-  ) {
-    assert(isKnown(receiverType));
-    if (target.isMissing) {
-      int length = name.text.length;
-      if (identical(name.text, callName.text) ||
-          identical(name.text, unaryMinusName.text)) {
-        length = 1;
-      }
-      return problemReporting.buildProblem(
-        compilerContext: compilerContext,
-        message: diag.undefinedSetter.withArguments(
-          name: name.text,
-          type: receiverType.nonTypeParameterBound,
-        ),
-        fileUri: fileUri,
-        fileOffset: fileOffset,
-        length: length,
-      );
-    }
-    return null;
-  }
-
   /// Returns the getter type of [interfaceMember] on a receiver of type
   /// [receiverType].
   ///
@@ -2449,7 +2442,8 @@
       this,
       function.asyncMarker,
       returnContext,
-      needToSetReturnType,
+      needToInferReturnType: needToSetReturnType,
+      isRoot: false,
     );
     StatementInferenceResult bodyResult = visitor.inferStatement(
       function.body!,
@@ -4228,9 +4222,9 @@
     required InternalVariable variable,
     required DartType typeContext,
     required int nameOffset,
-    VariableGet? node,
   }) {
-    node ??= new VariableGet(variable.astVariable)..fileOffset = nameOffset;
+    VariableGet result = new VariableGet(variable.astVariable)
+      ..fileOffset = nameOffset;
     DartType? promotedType;
     DartType declaredOrInferredType = variable.lateType ?? variable.type;
     ExpressionInfo? expressionInfo;
@@ -4247,27 +4241,27 @@
       );
       promotedType = wrappedPromotedType?.unwrapTypeView();
     }
-    flowAnalysis.storeExpressionInfo(node, expressionInfo);
-    node.promotedType = promotedType;
+    flowAnalysis.storeExpressionInfo(result, expressionInfo);
+    result.promotedType = promotedType;
     DartType resultType = promotedType ?? declaredOrInferredType;
     Expression resultExpression;
     if (variable.isLocalFunction) {
-      return instantiateTearOff(resultType, typeContext, node);
+      return instantiateTearOff(resultType, typeContext, result);
     } else if (variable.lateGetter != null) {
       resultExpression = new LocalFunctionInvocation(
         variable.lateGetter!,
-        new Arguments(<Expression>[])..fileOffset = node.fileOffset,
+        new Arguments(<Expression>[])..fileOffset = result.fileOffset,
         functionType: variable.lateGetter!.type as FunctionType,
-      )..fileOffset = node.fileOffset;
+      )..fileOffset = result.fileOffset;
       // Future calls to flow analysis will be using `resultExpression` to refer
       // to the variable get, so instruct flow analysis to forward the
       // expression information.
       flowAnalysis.storeExpressionInfo(
         resultExpression,
-        flowAnalysis.getExpressionInfo(node),
+        flowAnalysis.getExpressionInfo(result),
       );
     } else {
-      resultExpression = node..variable = variable.astVariable;
+      resultExpression = result..variable = variable.astVariable;
     }
 
     bool isUnassigned = !flowAnalysis.isAssigned(variable.astVariable);
@@ -4276,7 +4270,7 @@
           // Coverage-ignore(suite): Not run.
           ?.flowAnalysisResult // Coverage-ignore(suite): Not run.
           .potentiallyUnassignedNodes // Coverage-ignore(suite): Not run.
-          .add(node);
+          .add(result);
     }
     bool isDefinitelyUnassigned = flowAnalysis.isUnassigned(
       variable.astVariable,
@@ -4286,7 +4280,7 @@
           // Coverage-ignore(suite): Not run.
           ?.flowAnalysisResult // Coverage-ignore(suite): Not run.
           .definitelyUnassignedNodes // Coverage-ignore(suite): Not run.
-          .add(node);
+          .add(result);
     }
     // Synthetic variables, local functions, and variables with
     // invalid types aren't checked.
@@ -4305,7 +4299,7 @@
                 variableName: name,
               ),
               fileUri: fileUri,
-              fileOffset: node.fileOffset,
+              fileOffset: result.fileOffset,
               length: name.length,
             ),
           );
@@ -4319,11 +4313,11 @@
                 compilerContext: compilerContext,
                 expression: resultExpression,
                 message: diag.finalNotAssignedError.withArguments(
-                  variableName: node.variable.cosmeticName!,
+                  variableName: result.variable.cosmeticName!,
                 ),
                 fileUri: fileUri,
-                fileOffset: node.fileOffset,
-                length: node.variable.cosmeticName!.length,
+                fileOffset: result.fileOffset,
+                length: result.variable.cosmeticName!.length,
               ),
             );
           } else if (declaredOrInferredType.isPotentiallyNonNullable) {
@@ -4333,11 +4327,11 @@
                 compilerContext: compilerContext,
                 expression: resultExpression,
                 message: diag.nonNullableNotAssignedError.withArguments(
-                  variableName: node.variable.cosmeticName!,
+                  variableName: result.variable.cosmeticName!,
                 ),
                 fileUri: fileUri,
-                fileOffset: node.fileOffset,
-                length: node.variable.cosmeticName!.length,
+                fileOffset: result.fileOffset,
+                length: result.variable.cosmeticName!.length,
               ),
             );
           }
@@ -4370,7 +4364,6 @@
     required ExpressionInferenceResult rhsResult,
     required int assignOffset,
     required int nameOffset,
-    VariableSet? node,
   }) {
     bool isDefinitelyAssigned = flowAnalysis.isAssigned(variable.astVariable);
     bool isDefinitelyUnassigned = flowAnalysis.isUnassigned(
@@ -4383,12 +4376,12 @@
       isVoidAllowed: variableType is VoidType,
     );
     Expression rhs = rhsResult.expression;
-    node ??= new VariableSet(variable.astVariable, rhs)
+    VariableSet result = new VariableSet(variable.astVariable, rhs)
       ..fileOffset = nameOffset;
     flowAnalysis.storeExpressionInfo(
-      node,
+      result,
       flowAnalysis.write(
-        node,
+        result,
         variable.astVariable,
         new SharedTypeView(rhsResult.inferredType),
         flowAnalysis.getExpressionInfo(rhsResult.expression),
@@ -4399,19 +4392,19 @@
     if (variable.lateSetter != null) {
       resultExpression = new LocalFunctionInvocation(
         variable.lateSetter!,
-        new Arguments(<Expression>[rhs])..fileOffset = node.fileOffset,
+        new Arguments(<Expression>[rhs])..fileOffset = result.fileOffset,
         functionType: variable.lateSetter!.type as FunctionType,
-      )..fileOffset = node.fileOffset;
+      )..fileOffset = result.fileOffset;
       // Future calls to flow analysis will be using `resultExpression` to refer
       // to the variable set, so instruct flow analysis to forward the
       // expression information.
       flowAnalysis.storeExpressionInfo(
         resultExpression,
-        flowAnalysis.getExpressionInfo(node),
+        flowAnalysis.getExpressionInfo(result),
       );
     } else {
-      node.value = rhs..parent = node;
-      resultExpression = node..variable = variable.astVariable;
+      result.value = rhs..parent = result;
+      resultExpression = result..variable = variable.astVariable;
     }
     // Synthetic variables, local functions, and variables with
     // invalid types aren't checked.
@@ -4427,11 +4420,11 @@
               compilerContext: compilerContext,
               expression: resultExpression,
               message: diag.lateDefinitelyAssignedError.withArguments(
-                variableName: node.variable.cosmeticName!,
+                variableName: result.variable.cosmeticName!,
               ),
               fileUri: fileUri,
-              fileOffset: node.fileOffset,
-              length: node.variable.cosmeticName!.length,
+              fileOffset: result.fileOffset,
+              length: result.variable.cosmeticName!.length,
             ),
           );
         }
@@ -4443,11 +4436,11 @@
               compilerContext: compilerContext,
               expression: resultExpression,
               message: diag.finalPossiblyAssignedError.withArguments(
-                variableName: node.variable.cosmeticName!,
+                variableName: result.variable.cosmeticName!,
               ),
               fileUri: fileUri,
-              fileOffset: node.fileOffset,
-              length: node.variable.cosmeticName!.length,
+              fileOffset: result.fileOffset,
+              length: result.variable.cosmeticName!.length,
             ),
           );
         }
@@ -4456,6 +4449,198 @@
     return new ExpressionInferenceResult(resultType, resultExpression);
   }
 
+  /// Computes [PropertySetData] used for writes to an instance setter as an
+  /// expression or as a for-in element.
+  PropertySetData computePropertySetData({
+    required Expression receiver,
+    required Name name,
+    required bool isNullAware,
+    required int fileOffset,
+  });
+
+  /// Creates a property set operation of [writeTarget] on [receiver] using
+  /// [valueResult] as the right-hand side. [valueResult] is created for
+  /// assignability to [writeContext].
+  ///
+  /// [fileOffset] is used as the file offset for created nodes. [propertyName]
+  /// is used for error reporting. [receiverType] is the already inferred type
+  /// of the [receiver] expression. The inferred type of [value] must already
+  /// have been computed.
+  ///
+  /// If [forEffect] the resulting expression is ensured to return the assigned
+  /// value. This is needed for extension setters which are encoded as static
+  /// method calls that do not implicitly return the value.
+  ///
+  /// The returned [ExpressionInferenceResult] holds the generated expression
+  /// and the type of this expression.
+  ExpressionInferenceResult inferPropertySet({
+    required int fileOffset,
+    required Expression receiver,
+    required DartType receiverType,
+    required Name propertyName,
+    required ObjectAccessTarget writeTarget,
+    required DartType writeContext,
+    required ExpressionInferenceResult valueResult,
+    required bool forEffect,
+  }) {
+    valueResult = ensureAssignableResult(
+      writeContext,
+      valueResult,
+      fileOffset: fileOffset,
+      isVoidAllowed: writeContext is VoidType,
+    );
+    Expression value = valueResult.expression;
+    DartType valueType = valueResult.inferredType;
+    if (expressionEvaluationHelper != null) {
+      // Coverage-ignore-block(suite): Not run.
+      OverwrittenInterfaceMember? overWritten = expressionEvaluationHelper
+          ?.overwriteFindInterfaceMember(
+            target: writeTarget,
+            name: propertyName,
+            receiverType: receiverType,
+            setter: true,
+          );
+      if (overWritten != null) {
+        writeTarget = overWritten.target;
+        propertyName = overWritten.name;
+      }
+    }
+    Expression write;
+    switch (writeTarget.kind) {
+      case ObjectAccessTargetKind.missing:
+        write = createMissingPropertySet(
+          fileOffset,
+          receiver,
+          receiverType,
+          propertyName,
+          value,
+          forEffect: forEffect,
+        );
+        break;
+      case ObjectAccessTargetKind.ambiguous:
+        write = createMissingPropertySet(
+          fileOffset,
+          receiver,
+          receiverType,
+          propertyName,
+          value,
+          forEffect: forEffect,
+          extensionAccessCandidates: writeTarget.candidates,
+        );
+        break;
+      case ObjectAccessTargetKind.extensionMember:
+      case ObjectAccessTargetKind.nullableExtensionMember:
+      case ObjectAccessTargetKind.extensionTypeMember:
+      case ObjectAccessTargetKind.nullableExtensionTypeMember:
+        if (forEffect) {
+          write = new StaticInvocation(
+            writeTarget.member as Procedure,
+            new Arguments(
+              <Expression>[receiver, value],
+              types: writeTarget.receiverTypeArguments,
+            )..fileOffset = fileOffset,
+          )..fileOffset = fileOffset;
+        } else {
+          VariableDeclaration valueVariable = createVariable(value, valueType);
+          VariableDeclaration assignmentVariable = createVariable(
+            new StaticInvocation(
+              writeTarget.member as Procedure,
+              new Arguments(
+                <Expression>[receiver, createVariableGet(valueVariable)],
+                types: writeTarget.receiverTypeArguments,
+              )..fileOffset = fileOffset,
+            )..fileOffset = fileOffset,
+            const VoidType(),
+          );
+          write = createLet(
+            valueVariable,
+            createLet(assignmentVariable, createVariableGet(valueVariable)),
+          )..fileOffset = fileOffset;
+        }
+        break;
+      case ObjectAccessTargetKind.invalid:
+        write = new DynamicSet(
+          DynamicAccessKind.Invalid,
+          receiver,
+          propertyName,
+          value,
+        )..fileOffset = fileOffset;
+        break;
+      case ObjectAccessTargetKind.never:
+        write = new DynamicSet(
+          DynamicAccessKind.Never,
+          receiver,
+          propertyName,
+          value,
+        )..fileOffset = fileOffset;
+        break;
+      case ObjectAccessTargetKind.callFunction:
+      case ObjectAccessTargetKind.nullableCallFunction:
+      case ObjectAccessTargetKind.dynamic:
+        write = new DynamicSet(
+          DynamicAccessKind.Dynamic,
+          receiver,
+          propertyName,
+          value,
+        )..fileOffset = fileOffset;
+        break;
+      case ObjectAccessTargetKind.instanceMember:
+      case ObjectAccessTargetKind.objectMember:
+      case ObjectAccessTargetKind.nullableInstanceMember:
+      // Coverage-ignore(suite): Not run.
+      case ObjectAccessTargetKind.superMember:
+        InstanceAccessKind kind;
+        switch (writeTarget.kind) {
+          case ObjectAccessTargetKind.instanceMember:
+            kind = InstanceAccessKind.Instance;
+            break;
+          case ObjectAccessTargetKind.nullableInstanceMember:
+            kind = InstanceAccessKind.Nullable;
+            break;
+          // Coverage-ignore(suite): Not run.
+          case ObjectAccessTargetKind.objectMember:
+            kind = InstanceAccessKind.Object;
+            break;
+          // Coverage-ignore(suite): Not run.
+          default:
+            throw new UnsupportedError('Unexpected target kind $writeTarget');
+        }
+        write = new InstanceSet(
+          kind,
+          receiver,
+          propertyName,
+          value,
+          interfaceTarget: writeTarget.classMember!,
+        )..fileOffset = fileOffset;
+        break;
+      // Coverage-ignore(suite): Not run.
+      case ObjectAccessTargetKind.recordIndexed:
+      case ObjectAccessTargetKind.recordNamed:
+      case ObjectAccessTargetKind.extensionTypeRepresentation:
+      case ObjectAccessTargetKind.nullableRecordIndexed:
+      case ObjectAccessTargetKind.nullableRecordNamed:
+      case ObjectAccessTargetKind.nullableExtensionTypeRepresentation:
+        throw new UnsupportedError('Unexpected write target ${writeTarget}');
+    }
+    Expression result;
+    if (writeTarget.isNullable) {
+      result = problemReporting.wrapInProblem(
+        compilerContext: compilerContext,
+        expression: write,
+        message: diag.nullablePropertyAccessError.withArguments(
+          propertyName: propertyName.text,
+          receiverType: receiverType,
+        ),
+        fileUri: fileUri,
+        fileOffset: write.fileOffset,
+        length: propertyName.text.length,
+      );
+    } else {
+      result = write;
+    }
+    return new ExpressionInferenceResult(valueType, result);
+  }
+
   /// Computes the implicit instantiation from an expression of [tearOffType]
   /// to the [context] type. Return `null` if an implicit instantiation is not
   /// necessary or possible.
@@ -4514,6 +4699,24 @@
     return null;
   }
 
+  /// Infers [iterable] as the iterable of a for-in loop with the given
+  /// [elementType].
+  ExpressionInferenceResult inferForInIterable(
+    Expression iterable,
+    DartType elementType, {
+    required bool isAsync,
+  });
+
+  /// Infers the [pattern] occurring as the element in for-in header with the
+  /// given [iterable].
+  PatternForInData inferPatternForInHeader({
+    required TreeNode node,
+    required Pattern pattern,
+    required Expression iterable,
+    required bool isAsync,
+    required int inOffset,
+  });
+
   ExpressionInferenceResult _applyImplicitInstantiation(
     ImplicitInstantiation? implicitInstantiation,
     DartType tearOffType,
@@ -6183,3 +6386,48 @@
     }
   }
 }
+
+/// Data needed for the inference of a write to an instance property.
+class PropertySetData {
+  final Expression receiver;
+  final DartType receiverType;
+  final DartType writeContext;
+  final ObjectAccessTarget target;
+
+  PropertySetData({
+    required this.receiver,
+    required this.receiverType,
+    required this.writeContext,
+    required this.target,
+  });
+}
+
+/// Data needed for the inference of a write to an extension setter.
+class ExtensionSetData {
+  final Expression receiver;
+  final DartType inferredReceiverType;
+  final DartType valueType;
+  final List<DartType> extensionTypeArguments;
+  final Procedure setter;
+
+  ExtensionSetData({
+    required this.receiver,
+    required this.inferredReceiverType,
+    required this.valueType,
+    required this.extensionTypeArguments,
+    required this.setter,
+  });
+}
+
+/// Data resulting from the inference of a pattern in a for-in element.
+class PatternForInData {
+  final VariableDeclaration loopVariable;
+  final Expression iterable;
+  final PatternVariableDeclaration Function() computePatternVariableDeclaration;
+
+  PatternForInData({
+    required this.loopVariable,
+    required this.iterable,
+    required this.computePatternVariableDeclaration,
+  });
+}
diff --git a/pkg/front_end/lib/src/type_inference/matching_cache.dart b/pkg/front_end/lib/src/type_inference/matching_cache.dart
index d8709f3..0aec636 100644
--- a/pkg/front_end/lib/src/type_inference/matching_cache.dart
+++ b/pkg/front_end/lib/src/type_inference/matching_cache.dart
@@ -1080,7 +1080,6 @@
         result = createAsExpression(
           result,
           _promotedType,
-          forNonNullableByDefault: true,
           isUnchecked: true,
           fileOffset: result.fileOffset,
         );
@@ -1150,7 +1149,6 @@
     return createAsExpression(
       result,
       _checkedType,
-      forNonNullableByDefault: true,
       fileOffset: fileOffset,
       isCovarianceCheck: true,
     );
diff --git a/pkg/front_end/lib/src/type_inference/matching_expressions.dart b/pkg/front_end/lib/src/type_inference/matching_expressions.dart
index ee15fbc..0ae0f83 100644
--- a/pkg/front_end/lib/src/type_inference/matching_expressions.dart
+++ b/pkg/front_end/lib/src/type_inference/matching_expressions.dart
@@ -119,221 +119,212 @@
     ListPattern node,
     CacheableExpression matchedExpression,
   ) {
-    if (node.isNeverPattern) {
-      return matchedExpression;
+    matchedExpression = matchedExpression.promote(node.matchedValueType!);
+
+    CacheableExpression? isExpression;
+    CacheableExpression typedMatchedExpression;
+    if (node.needsCheck) {
+      isExpression = matchingCache.createIsExpression(
+        matchedExpression,
+        node.requiredType!,
+        fileOffset: node.fileOffset,
+      );
+      typedMatchedExpression = new PromotedCacheableExpression(
+        matchedExpression,
+        node.requiredType!,
+      );
     } else {
-      matchedExpression = matchedExpression.promote(node.matchedValueType!);
+      typedMatchedExpression = matchedExpression;
+    }
 
-      CacheableExpression? isExpression;
-      CacheableExpression typedMatchedExpression;
-      if (node.needsCheck) {
-        isExpression = matchingCache.createIsExpression(
-          matchedExpression,
-          node.requiredType!,
-          fileOffset: node.fileOffset,
-        );
-        typedMatchedExpression = new PromotedCacheableExpression(
-          matchedExpression,
-          node.requiredType!,
-        );
-      } else {
-        typedMatchedExpression = matchedExpression;
-      }
-
-      CacheableExpression lengthGet = matchingCache.createPropertyGetExpression(
+    CacheableExpression lengthGet = matchingCache.createPropertyGetExpression(
+      typedMatchedExpression,
+      lengthName.text,
+      new DelayedInstanceGet(
         typedMatchedExpression,
-        lengthName.text,
-        new DelayedInstanceGet(
-          typedMatchedExpression,
-          node.lengthTarget,
-          node.lengthType!,
+        node.lengthTarget,
+        node.lengthType!,
+        fileOffset: node.fileOffset,
+      ),
+      fileOffset: node.fileOffset,
+    );
+
+    CacheableExpression? lengthCheck;
+    if (node.hasRestPattern) {
+      int minLength = node.patterns.length - 1;
+      if (minLength > 0) {
+        CacheableExpression constExpression = matchingCache.createIntConstant(
+          minLength,
           fileOffset: node.fileOffset,
-        ),
+        );
+
+        lengthCheck = matchingCache.createComparisonExpression(
+          lengthGet,
+          greaterThanOrEqualsName.text,
+          constExpression,
+          new DelayedInstanceInvocation(
+            lengthGet,
+            node.lengthCheckTarget,
+            node.lengthCheckType!,
+            [constExpression],
+            fileOffset: node.fileOffset,
+          ),
+          fileOffset: node.fileOffset,
+        );
+      }
+    } else {
+      int length = node.patterns.length;
+      CacheableExpression constExpression = matchingCache.createIntConstant(
+        length,
         fileOffset: node.fileOffset,
       );
 
-      CacheableExpression? lengthCheck;
-      if (node.hasRestPattern) {
-        int minLength = node.patterns.length - 1;
-        if (minLength > 0) {
-          CacheableExpression constExpression = matchingCache.createIntConstant(
-            minLength,
+      if (length == 0) {
+        lengthCheck = matchingCache.createComparisonExpression(
+          lengthGet,
+          lessThanOrEqualsName.text,
+          constExpression,
+          new DelayedInstanceInvocation(
+            lengthGet,
+            node.lengthCheckTarget,
+            node.lengthCheckType!,
+            [constExpression],
+            fileOffset: node.fileOffset,
+          ),
+          fileOffset: node.fileOffset,
+        );
+      } else {
+        lengthCheck = matchingCache.createEqualsExpression(
+          lengthGet,
+          constExpression,
+          new DelayedEqualsExpression(
+            lengthGet,
+            constExpression,
+            node.lengthCheckTarget,
+            node.lengthCheckType!,
+            fileOffset: node.fileOffset,
+          ),
+          fileOffset: node.fileOffset,
+        );
+      }
+    }
+
+    DelayedExpression? matchingExpression;
+    if (isExpression != null && lengthCheck != null) {
+      matchingExpression = matchingCache.createAndExpression(
+        isExpression,
+        lengthCheck,
+        fileOffset: node.fileOffset,
+      );
+    } else if (isExpression != null) {
+      matchingExpression = isExpression;
+    } else if (lengthCheck != null) {
+      matchingExpression = lengthCheck;
+    }
+
+    bool hasSeenRestPattern = false;
+    for (int i = 0; i < node.patterns.length; i++) {
+      CacheableExpression elementExpression;
+      Pattern elementPattern = node.patterns[i];
+      if (elementPattern is RestPattern) {
+        hasSeenRestPattern = true;
+        Pattern? subPattern = elementPattern.subPattern;
+        if (subPattern == null) {
+          continue;
+        }
+
+        int nextIndex = i + 1;
+        int headSize = i;
+        int tailSize = node.patterns.length - nextIndex;
+
+        DelayedExpression expression;
+        if (tailSize > 0) {
+          expression = new DelayedInstanceInvocation(
+            typedMatchedExpression,
+            node.sublistTarget,
+            node.sublistType!,
+            [
+              new IntegerExpression(headSize, fileOffset: node.fileOffset),
+              new DelayedInstanceInvocation(
+                lengthGet,
+                node.minusTarget,
+                node.minusType!,
+                [new IntegerExpression(tailSize, fileOffset: node.fileOffset)],
+                fileOffset: node.fileOffset,
+              ),
+            ],
             fileOffset: node.fileOffset,
           );
-
-          lengthCheck = matchingCache.createComparisonExpression(
-            lengthGet,
-            greaterThanOrEqualsName.text,
-            constExpression,
-            new DelayedInstanceInvocation(
-              lengthGet,
-              node.lengthCheckTarget,
-              node.lengthCheckType!,
-              [constExpression],
-              fileOffset: node.fileOffset,
-            ),
+        } else {
+          expression = new DelayedInstanceInvocation(
+            typedMatchedExpression,
+            node.sublistTarget,
+            node.sublistType!,
+            [new IntegerExpression(headSize, fileOffset: node.fileOffset)],
             fileOffset: node.fileOffset,
           );
         }
-      } else {
-        int length = node.patterns.length;
-        CacheableExpression constExpression = matchingCache.createIntConstant(
-          length,
+        elementExpression = matchingCache.createSublistExpression(
+          typedMatchedExpression,
+          lengthGet,
+          headSize,
+          tailSize,
+          expression,
           fileOffset: node.fileOffset,
         );
-
-        if (length == 0) {
-          lengthCheck = matchingCache.createComparisonExpression(
-            lengthGet,
-            lessThanOrEqualsName.text,
-            constExpression,
+      } else {
+        if (!hasSeenRestPattern) {
+          int index = i;
+          elementExpression = matchingCache.createHeadIndexExpression(
+            typedMatchedExpression,
+            index,
             new DelayedInstanceInvocation(
-              lengthGet,
-              node.lengthCheckTarget,
-              node.lengthCheckType!,
-              [constExpression],
+              typedMatchedExpression,
+              node.indexGetTarget,
+              node.indexGetType!,
+              [new IntegerExpression(index, fileOffset: node.fileOffset)],
               fileOffset: node.fileOffset,
             ),
             fileOffset: node.fileOffset,
           );
         } else {
-          lengthCheck = matchingCache.createEqualsExpression(
+          int index = node.patterns.length - i;
+          elementExpression = matchingCache.createTailIndexExpression(
+            typedMatchedExpression,
             lengthGet,
-            constExpression,
-            new DelayedEqualsExpression(
-              lengthGet,
-              constExpression,
-              node.lengthCheckTarget,
-              node.lengthCheckType!,
-              fileOffset: node.fileOffset,
-            ),
-            fileOffset: node.fileOffset,
-          );
-        }
-      }
-
-      DelayedExpression? matchingExpression;
-      if (isExpression != null && lengthCheck != null) {
-        matchingExpression = matchingCache.createAndExpression(
-          isExpression,
-          lengthCheck,
-          fileOffset: node.fileOffset,
-        );
-      } else if (isExpression != null) {
-        matchingExpression = isExpression;
-      } else if (lengthCheck != null) {
-        matchingExpression = lengthCheck;
-      }
-
-      bool hasSeenRestPattern = false;
-      for (int i = 0; i < node.patterns.length; i++) {
-        CacheableExpression elementExpression;
-        Pattern elementPattern = node.patterns[i];
-        if (elementPattern is RestPattern) {
-          hasSeenRestPattern = true;
-          Pattern? subPattern = elementPattern.subPattern;
-          if (subPattern == null) {
-            continue;
-          }
-
-          int nextIndex = i + 1;
-          int headSize = i;
-          int tailSize = node.patterns.length - nextIndex;
-
-          DelayedExpression expression;
-          if (tailSize > 0) {
-            expression = new DelayedInstanceInvocation(
+            index,
+            new DelayedInstanceInvocation(
               typedMatchedExpression,
-              node.sublistTarget,
-              node.sublistType!,
+              node.indexGetTarget,
+              node.indexGetType!,
               [
-                new IntegerExpression(headSize, fileOffset: node.fileOffset),
                 new DelayedInstanceInvocation(
                   lengthGet,
                   node.minusTarget,
                   node.minusType!,
-                  [
-                    new IntegerExpression(
-                      tailSize,
-                      fileOffset: node.fileOffset,
-                    ),
-                  ],
+                  [new IntegerExpression(index, fileOffset: node.fileOffset)],
                   fileOffset: node.fileOffset,
                 ),
               ],
               fileOffset: node.fileOffset,
-            );
-          } else {
-            expression = new DelayedInstanceInvocation(
-              typedMatchedExpression,
-              node.sublistTarget,
-              node.sublistType!,
-              [new IntegerExpression(headSize, fileOffset: node.fileOffset)],
-              fileOffset: node.fileOffset,
-            );
-          }
-          elementExpression = matchingCache.createSublistExpression(
-            typedMatchedExpression,
-            lengthGet,
-            headSize,
-            tailSize,
-            expression,
+            ),
             fileOffset: node.fileOffset,
           );
-        } else {
-          if (!hasSeenRestPattern) {
-            int index = i;
-            elementExpression = matchingCache.createHeadIndexExpression(
-              typedMatchedExpression,
-              index,
-              new DelayedInstanceInvocation(
-                typedMatchedExpression,
-                node.indexGetTarget,
-                node.indexGetType!,
-                [new IntegerExpression(index, fileOffset: node.fileOffset)],
-                fileOffset: node.fileOffset,
-              ),
-              fileOffset: node.fileOffset,
-            );
-          } else {
-            int index = node.patterns.length - i;
-            elementExpression = matchingCache.createTailIndexExpression(
-              typedMatchedExpression,
-              lengthGet,
-              index,
-              new DelayedInstanceInvocation(
-                typedMatchedExpression,
-                node.indexGetTarget,
-                node.indexGetType!,
-                [
-                  new DelayedInstanceInvocation(
-                    lengthGet,
-                    node.minusTarget,
-                    node.minusType!,
-                    [new IntegerExpression(index, fileOffset: node.fileOffset)],
-                    fileOffset: node.fileOffset,
-                  ),
-                ],
-                fileOffset: node.fileOffset,
-              ),
-              fileOffset: node.fileOffset,
-            );
-          }
         }
-
-        DelayedExpression elementMatcher = visitPattern(
-          elementPattern,
-          elementExpression,
-        );
-        matchingExpression = DelayedAndExpression.merge(
-          matchingExpression,
-          elementMatcher,
-          fileOffset: node.fileOffset,
-        );
       }
-      return matchingExpression ??
-          new BooleanExpression(true, fileOffset: node.fileOffset);
+
+      DelayedExpression elementMatcher = visitPattern(
+        elementPattern,
+        elementExpression,
+      );
+      matchingExpression = DelayedAndExpression.merge(
+        matchingExpression,
+        elementMatcher,
+        fileOffset: node.fileOffset,
+      );
     }
+    return matchingExpression ??
+        new BooleanExpression(true, fileOffset: node.fileOffset);
   }
 
   @override
@@ -341,123 +332,118 @@
     MapPattern node,
     CacheableExpression matchedExpression,
   ) {
-    if (node.isNeverPattern) {
-      return matchedExpression;
-    } else {
-      matchedExpression = matchedExpression.promote(node.matchedValueType!);
+    matchedExpression = matchedExpression.promote(node.matchedValueType!);
 
-      CacheableExpression? isExpression;
-      CacheableExpression typedMatchedExpression;
-      if (node.needsCheck) {
-        isExpression = matchingCache.createIsExpression(
-          matchedExpression,
-          node.requiredType!,
-          fileOffset: node.fileOffset,
-        );
-        typedMatchedExpression = new PromotedCacheableExpression(
-          matchedExpression,
-          node.requiredType!,
-        );
-      } else {
-        typedMatchedExpression = matchedExpression;
-      }
-
-      DelayedExpression? matchingExpression;
-      if (isExpression != null) {
-        matchingExpression = isExpression;
-      }
-
-      InterfaceType requiredType = node.requiredType as InterfaceType;
-      assert(
-        requiredType.classNode == coreTypes.mapClass &&
-            requiredType.typeArguments.length == 2,
+    CacheableExpression? isExpression;
+    CacheableExpression typedMatchedExpression;
+    if (node.needsCheck) {
+      isExpression = matchingCache.createIsExpression(
+        matchedExpression,
+        node.requiredType!,
+        fileOffset: node.fileOffset,
       );
-      DartType valueType = requiredType.typeArguments[1];
-      for (MapPatternEntry entry in node.entries) {
-        if (entry is MapPatternRestEntry) continue;
-        CacheableExpression keyExpression = matchingCache
-            .createConstantExpression(
-              entry.keyValue!,
-              entry.keyType!,
-              fileOffset: entry.key.fileOffset,
-            );
-        CacheableExpression containsExpression = matchingCache
-            .createContainsKeyExpression(
+      typedMatchedExpression = new PromotedCacheableExpression(
+        matchedExpression,
+        node.requiredType!,
+      );
+    } else {
+      typedMatchedExpression = matchedExpression;
+    }
+
+    DelayedExpression? matchingExpression;
+    if (isExpression != null) {
+      matchingExpression = isExpression;
+    }
+
+    InterfaceType requiredType = node.requiredType as InterfaceType;
+    assert(
+      requiredType.classNode == coreTypes.mapClass &&
+          requiredType.typeArguments.length == 2,
+    );
+    DartType valueType = requiredType.typeArguments[1];
+    for (MapPatternEntry entry in node.entries) {
+      if (entry is MapPatternRestEntry) continue;
+      CacheableExpression keyExpression = matchingCache
+          .createConstantExpression(
+            entry.keyValue!,
+            entry.keyType!,
+            fileOffset: entry.key.fileOffset,
+          );
+      CacheableExpression containsExpression = matchingCache
+          .createContainsKeyExpression(
+            typedMatchedExpression,
+            keyExpression,
+            new DelayedInstanceInvocation(
               typedMatchedExpression,
-              keyExpression,
-              new DelayedInstanceInvocation(
-                typedMatchedExpression,
-                node.containsKeyTarget,
-                node.containsKeyType!,
-                [keyExpression],
-                fileOffset: entry.fileOffset,
-              ),
-              fileOffset: entry.fileOffset,
-            );
-        CacheableExpression valueExpression = matchingCache
-            .createIndexExpression(
-              typedMatchedExpression,
-              keyExpression,
-              new DelayedInstanceInvocation(
-                typedMatchedExpression,
-                node.indexGetTarget,
-                node.indexGetType!,
-                [keyExpression],
-                fileOffset: entry.fileOffset,
-              ),
-              fileOffset: entry.fileOffset,
-            );
-        matchingExpression = DelayedAndExpression.merge(
-          matchingExpression,
-          new DelayedOrExpression(
-            new DelayedNullCheckExpression(
-              valueExpression,
-              fileOffset: entry.fileOffset,
-            ),
-            new DelayedAndExpression(
-              new DelayedIsExpression(
-                new FixedExpression(
-                  createNullLiteral(fileOffset: entry.fileOffset),
-                  const NullType(),
-                ),
-                valueType,
-                fileOffset: entry.fileOffset,
-              ),
-              containsExpression,
+              node.containsKeyTarget,
+              node.containsKeyType!,
+              [keyExpression],
               fileOffset: entry.fileOffset,
             ),
             fileOffset: entry.fileOffset,
+          );
+      CacheableExpression valueExpression = matchingCache.createIndexExpression(
+        typedMatchedExpression,
+        keyExpression,
+        new DelayedInstanceInvocation(
+          typedMatchedExpression,
+          node.indexGetTarget,
+          node.indexGetType!,
+          [keyExpression],
+          fileOffset: entry.fileOffset,
+        ),
+        fileOffset: entry.fileOffset,
+      );
+      matchingExpression = DelayedAndExpression.merge(
+        matchingExpression,
+        new DelayedOrExpression(
+          new DelayedNullCheckExpression(
+            valueExpression,
+            fileOffset: entry.fileOffset,
+          ),
+          new DelayedAndExpression(
+            new DelayedIsExpression(
+              new FixedExpression(
+                createNullLiteral(fileOffset: entry.fileOffset),
+                const NullType(),
+              ),
+              valueType,
+              fileOffset: entry.fileOffset,
+            ),
+            containsExpression,
+            fileOffset: entry.fileOffset,
           ),
           fileOffset: entry.fileOffset,
-        );
-        valueExpression = new PromotedCacheableExpression(
-          valueExpression,
-          valueType,
-        );
+        ),
+        fileOffset: entry.fileOffset,
+      );
+      valueExpression = new PromotedCacheableExpression(
+        valueExpression,
+        valueType,
+      );
 
-        DelayedExpression subExpression = visitPattern(
-          entry.value,
-          valueExpression,
+      DelayedExpression subExpression = visitPattern(
+        entry.value,
+        valueExpression,
+      );
+      if (!subExpression.uses(valueExpression)) {
+        // Ensure that we perform the lookup even if we don't use the result.
+        matchingExpression = DelayedAndExpression.merge(
+          matchingExpression,
+          new EffectExpression(valueExpression, subExpression),
+          fileOffset: node.fileOffset,
         );
-        if (!subExpression.uses(valueExpression)) {
-          // Ensure that we perform the lookup even if we don't use the result.
-          matchingExpression = DelayedAndExpression.merge(
-            matchingExpression,
-            new EffectExpression(valueExpression, subExpression),
-            fileOffset: node.fileOffset,
-          );
-        } else {
-          matchingExpression = DelayedAndExpression.merge(
-            matchingExpression,
-            subExpression,
-            fileOffset: node.fileOffset,
-          );
-        }
+      } else {
+        matchingExpression = DelayedAndExpression.merge(
+          matchingExpression,
+          subExpression,
+          fileOffset: node.fileOffset,
+        );
       }
-      // Coverage-ignore(suite): Not run.
-      return matchingExpression ??
-          new BooleanExpression(true, fileOffset: node.fileOffset);
     }
+    // Coverage-ignore(suite): Not run.
+    return matchingExpression ??
+        new BooleanExpression(true, fileOffset: node.fileOffset);
   }
 
   @override
diff --git a/pkg/front_end/lib/src/type_inference/type_inferrer.dart b/pkg/front_end/lib/src/type_inference/type_inferrer.dart
index ee2ed8c..88a6b58 100644
--- a/pkg/front_end/lib/src/type_inference/type_inferrer.dart
+++ b/pkg/front_end/lib/src/type_inference/type_inferrer.dart
@@ -10,10 +10,11 @@
 import 'package:kernel/type_environment.dart';
 
 import '../base/extension_scope.dart';
+import '../builder/function_signature.dart';
 import '../kernel/assigned_variables_impl.dart';
 import '../kernel/benchmarker.dart' show BenchmarkSubdivides, Benchmarker;
 import '../kernel/internal_ast.dart';
-import '../source/source_constructor_builder.dart';
+import '../kernel/internal_ast_helper.dart' as intern;
 import '../source/source_library_builder.dart' show SourceLibraryBuilder;
 import '../source/stack_listener_impl.dart' show AsyncModifier;
 import '../util/helpers.dart';
@@ -69,13 +70,14 @@
     required ThisVariable? internalThisVariable,
     required ScopeProviderInfo? scopeProviderInfo,
     required ContextAllocationStrategy contextAllocationStrategy,
+    required ConstructorContext? constructorContext,
     ExpressionEvaluationHelper? expressionEvaluationHelper,
   });
 
   /// Performs type inference on the given constructor initializer.
   InferredConstructorInitializer inferInitializer({
     required Uri fileUri,
-    required SourceConstructorBuilder constructorBuilder,
+    required ConstructorContext constructorContext,
     required Initializer initializer,
     required List<VariableDeclaration> parameters,
     required ThisVariable? internalThisVariable,
@@ -190,7 +192,7 @@
 
   InferenceVisitorBase _createInferenceVisitor({
     required Uri fileUri,
-    SourceConstructorBuilder? constructorBuilder,
+    ConstructorContext? constructorContext,
     ExpressionEvaluationHelper? expressionEvaluationHelper,
     required ContextAllocationStrategy contextAllocationStrategy,
   }) {
@@ -199,7 +201,7 @@
     return new InferenceVisitorImpl(
       this,
       fileUri,
-      constructorBuilder,
+      constructorContext,
       operations,
       typeAnalyzerOptions,
       expressionEvaluationHelper,
@@ -267,10 +269,12 @@
     required ThisVariable? internalThisVariable,
     required ScopeProviderInfo? scopeProviderInfo,
     required ContextAllocationStrategy contextAllocationStrategy,
+    required ConstructorContext? constructorContext,
     ExpressionEvaluationHelper? expressionEvaluationHelper,
   }) {
     InferenceVisitorBase visitor = _createInferenceVisitor(
       fileUri: fileUri,
+      constructorContext: constructorContext,
       expressionEvaluationHelper: expressionEvaluationHelper,
       contextAllocationStrategy: contextAllocationStrategy,
     );
@@ -278,7 +282,8 @@
       visitor,
       asyncModifier.kind,
       returnType,
-      false,
+      needToInferReturnType: false,
+      isRoot: true,
     );
     if (isClosureContextLoweringEnabled) {
       scopeProviderInfo = visitor.beginFunctionBodyInference(
@@ -341,14 +346,19 @@
       );
       Expression variableGet;
       if (isClosureContextLoweringEnabled) {
-        variableGet = new VariableGet(
+        variableGet = intern.createVariableGet(
           new InternalPositionalParameter(
             astVariable: parameter as PositionalParameter,
             isImplicitlyTyped: false,
+            fileOffset: parameter.fileOffset,
           ),
-        )..fileOffset = parameter.fileOffset;
+          fileOffset: parameter.fileOffset,
+        );
       } else {
-        variableGet = new VariableGet(parameter);
+        variableGet = intern.createVariableGet(
+          parameter,
+          fileOffset: parameter.fileOffset,
+        );
       }
       arguments.add(new PositionalArgument(variableGet));
       positionalCount++;
@@ -364,17 +374,19 @@
       if (isClosureContextLoweringEnabled) {
         namedExpression = new NamedExpression(
           parameter.name!,
-          new VariableGet(
+          intern.createVariableGet(
             new InternalNamedParameter(
               astVariable: parameter as NamedParameter,
               isImplicitlyTyped: false,
-            )..fileOffset = parameter.fileOffset,
+              fileOffset: parameter.fileOffset,
+            ),
+            fileOffset: parameter.fileOffset,
           ),
         );
       } else {
         namedExpression = new NamedExpression(
           parameter.name!,
-          new VariableGet(parameter),
+          intern.createVariableGet(parameter, fileOffset: parameter.fileOffset),
         );
       }
       arguments.add(new NamedArgument(namedExpression));
@@ -408,7 +420,7 @@
   @override
   InferredConstructorInitializer inferInitializer({
     required Uri fileUri,
-    required SourceConstructorBuilder constructorBuilder,
+    required ConstructorContext constructorContext,
     required Initializer initializer,
     required List<VariableDeclaration> parameters,
     required ThisVariable? internalThisVariable,
@@ -423,7 +435,7 @@
     // checks).
     InferenceVisitorBase visitor = _createInferenceVisitor(
       fileUri: fileUri,
-      constructorBuilder: constructorBuilder,
+      constructorContext: constructorContext,
       contextAllocationStrategy: contextAllocationStrategy,
     );
     if (isClosureContextLoweringEnabled) {
@@ -553,6 +565,7 @@
     required ThisVariable? internalThisVariable,
     required ScopeProviderInfo? scopeProviderInfo,
     required ContextAllocationStrategy contextAllocationStrategy,
+    required ConstructorContext? constructorContext,
     ExpressionEvaluationHelper? expressionEvaluationHelper,
   }) {
     benchmarker.beginSubdivide(BenchmarkSubdivides.inferFunctionBody);
@@ -567,6 +580,7 @@
       internalThisVariable: internalThisVariable,
       scopeProviderInfo: scopeProviderInfo,
       contextAllocationStrategy: contextAllocationStrategy,
+      constructorContext: constructorContext,
     );
     benchmarker.endSubdivide();
     return result;
@@ -575,7 +589,7 @@
   @override
   InferredConstructorInitializer inferInitializer({
     required Uri fileUri,
-    required SourceConstructorBuilder constructorBuilder,
+    required ConstructorContext constructorContext,
     required Initializer initializer,
     required List<VariableDeclaration> parameters,
     required ThisVariable? internalThisVariable,
@@ -585,7 +599,7 @@
     benchmarker.beginSubdivide(BenchmarkSubdivides.inferInitializer);
     InferredConstructorInitializer result = impl.inferInitializer(
       fileUri: fileUri,
-      constructorBuilder: constructorBuilder,
+      constructorContext: constructorContext,
       initializer: initializer,
       parameters: parameters,
       internalThisVariable: internalThisVariable,
@@ -685,3 +699,20 @@
     this.scopeProviderInfo,
   );
 }
+
+/// Contextual information used to infer constructor initializers and body.
+abstract class ConstructorContext {
+  /// Computes the type of a field with the declared [fieldType] as used in
+  /// the context of this constructor.
+  ///
+  /// This is used for lowered constructors where the declared field type uses
+  /// type parameters declared in the declaration which must be replace with the
+  /// type parameters on the lowered procedure.
+  DartType substituteFieldType(DartType fieldType);
+
+  /// The signature of the constructor.
+  FunctionSignature get signature;
+
+  /// The variable used for `this`, if any.
+  VariableDeclaration? get thisVariable;
+}
diff --git a/pkg/front_end/lib/src/util/parser_ast_helper.dart b/pkg/front_end/lib/src/util/parser_ast_helper.dart
index ffdfc8b..4db94d1 100644
--- a/pkg/front_end/lib/src/util/parser_ast_helper.dart
+++ b/pkg/front_end/lib/src/util/parser_ast_helper.dart
@@ -879,6 +879,7 @@
   void beginFactory(
     DeclarationKind declarationKind,
     Token lastConsumed,
+    Token? augmentToken,
     Token? externalToken,
     Token? constToken,
   ) {
@@ -886,6 +887,7 @@
       ParserAstType.BEGIN,
       declarationKind: declarationKind,
       lastConsumed: lastConsumed,
+      augmentToken: augmentToken,
       externalToken: externalToken,
       constToken: constToken,
     );
@@ -5445,6 +5447,7 @@
 class FactoryBegin extends ParserAstNode {
   final DeclarationKind declarationKind;
   final Token lastConsumed;
+  final Token? augmentToken;
   final Token? externalToken;
   final Token? constToken;
 
@@ -5452,6 +5455,7 @@
     ParserAstType type, {
     required this.declarationKind,
     required this.lastConsumed,
+    this.augmentToken,
     this.externalToken,
     this.constToken,
   }) : super("Factory", type);
@@ -5460,6 +5464,7 @@
   Map<String, Object?> get deprecatedArguments => {
     "declarationKind": declarationKind,
     "lastConsumed": lastConsumed,
+    "augmentToken": augmentToken,
     "externalToken": externalToken,
     "constToken": constToken,
   };
diff --git a/pkg/front_end/messages.status b/pkg/front_end/messages.status
index c5b131c..3559c3f 100644
--- a/pkg/front_end/messages.status
+++ b/pkg/front_end/messages.status
@@ -136,6 +136,7 @@
 front_end/NeverReachableSwitchExpressionError/example: missingExample # No coverage.
 front_end/NeverReachableSwitchStatementError/example: missingExample # No coverage.
 front_end/NeverValueError/example: missingExample # No coverage.
+front_end/NonIdentifierForInElement/example: missingExample # TODO(johnniwinther): Use this error in the parser.
 front_end/NonPartOfDirectiveInPart/script1: hasOnlyUnrelatedMessages # Specifically ignored in `isIgnoredParserError`?!?
 front_end/NoUnnamedConstructorInObject/example: missingExample # No coverage.
 front_end/PatchClassTypeParametersMismatch/example: missingExample # Patching.
diff --git a/pkg/front_end/messages.yaml b/pkg/front_end/messages.yaml
index 935ed8c..00d589a 100644
--- a/pkg/front_end/messages.yaml
+++ b/pkg/front_end/messages.yaml
@@ -7768,6 +7768,11 @@
   statement:
     - '"".(int i) => 1;'
 
+nonIdentifierForInElement:
+  parameters: none
+  problemMessage: "The element in a for-in loop must be an identifier or a local variable declaration."
+  correctionMessage: "Try using an existing variable or a variable declaration."
+
 dartExternalEffectNotMethod:
   parameters: none
   problemMessage: "The 'external-effect' pragma can only be applied to methods."
diff --git a/pkg/front_end/parser_testcases/general/new_as_identifier.dart.expect b/pkg/front_end/parser_testcases/general/new_as_identifier.dart.expect
index 8930987..6e0c4f4 100644
--- a/pkg/front_end/parser_testcases/general/new_as_identifier.dart.expect
+++ b/pkg/front_end/parser_testcases/general/new_as_identifier.dart.expect
@@ -130,7 +130,7 @@
         beginMetadataStar(factory)
         endMetadataStar(0)
         beginMember()
-          beginFactory(DeclarationKind.Class, {, null, null)
+          beginFactory(DeclarationKind.Class, {, null, null, null)
             handleIdentifier(D, methodDeclaration)
             handleNewAsIdentifier(new)
             handleIdentifier(new, methodDeclarationContinuation)
@@ -150,7 +150,7 @@
         beginMetadataStar(factory)
         endMetadataStar(0)
         beginMember()
-          beginFactory(DeclarationKind.Class, ;, null, null)
+          beginFactory(DeclarationKind.Class, ;, null, null, null)
             handleIdentifier(D, methodDeclaration)
             handleIdentifier(factory_redirection, methodDeclarationContinuation)
             handleQualified(.)
@@ -173,7 +173,7 @@
         beginMetadataStar(factory)
         endMetadataStar(0)
         beginMember()
-          beginFactory(DeclarationKind.Class, ;, null, null)
+          beginFactory(DeclarationKind.Class, ;, null, null, null)
             handleIdentifier(D, methodDeclaration)
             handleIdentifier(factory_redirection_generic, methodDeclarationContinuation)
             handleQualified(.)
@@ -198,7 +198,7 @@
         beginMetadataStar(factory)
         endMetadataStar(0)
         beginMember()
-          beginFactory(DeclarationKind.Class, ;, null, null)
+          beginFactory(DeclarationKind.Class, ;, null, null, null)
             handleIdentifier(D, methodDeclaration)
             handleIdentifier(factory_redirection_prefixed, methodDeclarationContinuation)
             handleQualified(.)
@@ -221,7 +221,7 @@
         beginMetadataStar(factory)
         endMetadataStar(0)
         beginMember()
-          beginFactory(DeclarationKind.Class, ;, null, null)
+          beginFactory(DeclarationKind.Class, ;, null, null, null)
             handleIdentifier(D, methodDeclaration)
             handleIdentifier(factory_redirection_prefixed_generic, methodDeclarationContinuation)
             handleQualified(.)
diff --git a/pkg/front_end/parser_testcases/general/new_as_identifier.dart.intertwined.expect b/pkg/front_end/parser_testcases/general/new_as_identifier.dart.intertwined.expect
index df3f478..d785e29 100644
--- a/pkg/front_end/parser_testcases/general/new_as_identifier.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/general/new_as_identifier.dart.intertwined.expect
@@ -227,8 +227,8 @@
                 listener: beginMetadataStar(factory)
                 listener: endMetadataStar(0)
               listener: beginMember()
-              parseFactoryMethod({, DeclarationKind.Class, {, null, null, null, true)
-                listener: beginFactory(DeclarationKind.Class, {, null, null)
+              parseFactoryMethod({, DeclarationKind.Class, {, null, null, null, null, true)
+                listener: beginFactory(DeclarationKind.Class, {, null, null, null)
                 ensureIdentifier(factory, methodDeclaration)
                   listener: handleIdentifier(D, methodDeclaration)
                 parseQualifiedRestOpt(D, methodDeclarationContinuation)
@@ -280,8 +280,8 @@
                 listener: beginMetadataStar(factory)
                 listener: endMetadataStar(0)
               listener: beginMember()
-              parseFactoryMethod(;, DeclarationKind.Class, ;, null, null, null, true)
-                listener: beginFactory(DeclarationKind.Class, ;, null, null)
+              parseFactoryMethod(;, DeclarationKind.Class, ;, null, null, null, null, true)
+                listener: beginFactory(DeclarationKind.Class, ;, null, null, null)
                 ensureIdentifier(factory, methodDeclaration)
                   listener: handleIdentifier(D, methodDeclaration)
                 parseQualifiedRestOpt(D, methodDeclarationContinuation)
@@ -325,8 +325,8 @@
                 listener: beginMetadataStar(factory)
                 listener: endMetadataStar(0)
               listener: beginMember()
-              parseFactoryMethod(;, DeclarationKind.Class, ;, null, null, null, true)
-                listener: beginFactory(DeclarationKind.Class, ;, null, null)
+              parseFactoryMethod(;, DeclarationKind.Class, ;, null, null, null, null, true)
+                listener: beginFactory(DeclarationKind.Class, ;, null, null, null)
                 ensureIdentifier(factory, methodDeclaration)
                   listener: handleIdentifier(D, methodDeclaration)
                 parseQualifiedRestOpt(D, methodDeclarationContinuation)
@@ -371,8 +371,8 @@
                 listener: beginMetadataStar(factory)
                 listener: endMetadataStar(0)
               listener: beginMember()
-              parseFactoryMethod(;, DeclarationKind.Class, ;, null, null, null, true)
-                listener: beginFactory(DeclarationKind.Class, ;, null, null)
+              parseFactoryMethod(;, DeclarationKind.Class, ;, null, null, null, null, true)
+                listener: beginFactory(DeclarationKind.Class, ;, null, null, null)
                 ensureIdentifier(factory, methodDeclaration)
                   listener: handleIdentifier(D, methodDeclaration)
                 parseQualifiedRestOpt(D, methodDeclarationContinuation)
@@ -417,8 +417,8 @@
                 listener: beginMetadataStar(factory)
                 listener: endMetadataStar(0)
               listener: beginMember()
-              parseFactoryMethod(;, DeclarationKind.Class, ;, null, null, null, true)
-                listener: beginFactory(DeclarationKind.Class, ;, null, null)
+              parseFactoryMethod(;, DeclarationKind.Class, ;, null, null, null, null, true)
+                listener: beginFactory(DeclarationKind.Class, ;, null, null, null)
                 ensureIdentifier(factory, methodDeclaration)
                   listener: handleIdentifier(D, methodDeclaration)
                 parseQualifiedRestOpt(D, methodDeclarationContinuation)
diff --git a/pkg/front_end/parser_testcases/inline_class/extension_type.dart.expect b/pkg/front_end/parser_testcases/inline_class/extension_type.dart.expect
index d21e02e..b1abe94 100644
--- a/pkg/front_end/parser_testcases/inline_class/extension_type.dart.expect
+++ b/pkg/front_end/parser_testcases/inline_class/extension_type.dart.expect
@@ -174,7 +174,7 @@
         beginMetadataStar(factory)
         endMetadataStar(0)
         beginMember()
-          beginFactory(DeclarationKind.ExtensionType, ;, null, null)
+          beginFactory(DeclarationKind.ExtensionType, ;, null, null, null)
             handleIdentifier(ExtensionType4, methodDeclaration)
             handleIdentifier(fact, methodDeclarationContinuation)
             handleQualified(.)
@@ -207,7 +207,7 @@
         beginMetadataStar(factory)
         endMetadataStar(0)
         beginMember()
-          beginFactory(DeclarationKind.ExtensionType, ;, null, null)
+          beginFactory(DeclarationKind.ExtensionType, ;, null, null, null)
             handleIdentifier(ExtensionType4, methodDeclaration)
             handleIdentifier(redirectingFactory, methodDeclarationContinuation)
             handleQualified(.)
diff --git a/pkg/front_end/parser_testcases/inline_class/extension_type.dart.intertwined.expect b/pkg/front_end/parser_testcases/inline_class/extension_type.dart.intertwined.expect
index aa48a0f..d6dfab9 100644
--- a/pkg/front_end/parser_testcases/inline_class/extension_type.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/inline_class/extension_type.dart.intertwined.expect
@@ -286,8 +286,8 @@
                 listener: beginMetadataStar(factory)
                 listener: endMetadataStar(0)
               listener: beginMember()
-              parseFactoryMethod(;, DeclarationKind.ExtensionType, ;, null, null, null, true)
-                listener: beginFactory(DeclarationKind.ExtensionType, ;, null, null)
+              parseFactoryMethod(;, DeclarationKind.ExtensionType, ;, null, null, null, null, true)
+                listener: beginFactory(DeclarationKind.ExtensionType, ;, null, null, null)
                 ensureIdentifier(factory, methodDeclaration)
                   listener: handleIdentifier(ExtensionType4, methodDeclaration)
                 parseQualifiedRestOpt(ExtensionType4, methodDeclarationContinuation)
@@ -355,8 +355,8 @@
                 listener: beginMetadataStar(factory)
                 listener: endMetadataStar(0)
               listener: beginMember()
-              parseFactoryMethod(;, DeclarationKind.ExtensionType, ;, null, null, null, true)
-                listener: beginFactory(DeclarationKind.ExtensionType, ;, null, null)
+              parseFactoryMethod(;, DeclarationKind.ExtensionType, ;, null, null, null, null, true)
+                listener: beginFactory(DeclarationKind.ExtensionType, ;, null, null, null)
                 ensureIdentifier(factory, methodDeclaration)
                   listener: handleIdentifier(ExtensionType4, methodDeclaration)
                 parseQualifiedRestOpt(ExtensionType4, methodDeclarationContinuation)
diff --git a/pkg/front_end/parser_testcases/inline_class/extension_type_const.dart.expect b/pkg/front_end/parser_testcases/inline_class/extension_type_const.dart.expect
index 4ee09f5..384029d 100644
--- a/pkg/front_end/parser_testcases/inline_class/extension_type_const.dart.expect
+++ b/pkg/front_end/parser_testcases/inline_class/extension_type_const.dart.expect
@@ -174,7 +174,7 @@
         beginMetadataStar(factory)
         endMetadataStar(0)
         beginMember()
-          beginFactory(DeclarationKind.ExtensionType, ;, null, null)
+          beginFactory(DeclarationKind.ExtensionType, ;, null, null, null)
             handleIdentifier(ExtensionType4, methodDeclaration)
             handleIdentifier(fact, methodDeclarationContinuation)
             handleQualified(.)
@@ -207,7 +207,7 @@
         beginMetadataStar(const)
         endMetadataStar(0)
         beginMember()
-          beginFactory(DeclarationKind.ExtensionType, ;, null, const)
+          beginFactory(DeclarationKind.ExtensionType, ;, null, null, const)
             handleIdentifier(ExtensionType4, methodDeclaration)
             handleIdentifier(redirectingFactory, methodDeclarationContinuation)
             handleQualified(.)
diff --git a/pkg/front_end/parser_testcases/inline_class/extension_type_const.dart.intertwined.expect b/pkg/front_end/parser_testcases/inline_class/extension_type_const.dart.intertwined.expect
index d25d5c1..9cefeca 100644
--- a/pkg/front_end/parser_testcases/inline_class/extension_type_const.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/inline_class/extension_type_const.dart.intertwined.expect
@@ -284,8 +284,8 @@
                 listener: beginMetadataStar(factory)
                 listener: endMetadataStar(0)
               listener: beginMember()
-              parseFactoryMethod(;, DeclarationKind.ExtensionType, ;, null, null, null, true)
-                listener: beginFactory(DeclarationKind.ExtensionType, ;, null, null)
+              parseFactoryMethod(;, DeclarationKind.ExtensionType, ;, null, null, null, null, true)
+                listener: beginFactory(DeclarationKind.ExtensionType, ;, null, null, null)
                 ensureIdentifier(factory, methodDeclaration)
                   listener: handleIdentifier(ExtensionType4, methodDeclaration)
                 parseQualifiedRestOpt(ExtensionType4, methodDeclarationContinuation)
@@ -353,8 +353,8 @@
                 listener: beginMetadataStar(const)
                 listener: endMetadataStar(0)
               listener: beginMember()
-              parseFactoryMethod(const, DeclarationKind.ExtensionType, ;, null, null, const, true)
-                listener: beginFactory(DeclarationKind.ExtensionType, ;, null, const)
+              parseFactoryMethod(const, DeclarationKind.ExtensionType, ;, null, null, null, const, true)
+                listener: beginFactory(DeclarationKind.ExtensionType, ;, null, null, const)
                 ensureIdentifier(factory, methodDeclaration)
                   listener: handleIdentifier(ExtensionType4, methodDeclaration)
                 parseQualifiedRestOpt(ExtensionType4, methodDeclarationContinuation)
diff --git a/pkg/front_end/parser_testcases/primary_constructors/factory_constructor_head.dart.expect b/pkg/front_end/parser_testcases/primary_constructors/factory_constructor_head.dart.expect
index 397a962..0e0d781 100644
--- a/pkg/front_end/parser_testcases/primary_constructors/factory_constructor_head.dart.expect
+++ b/pkg/front_end/parser_testcases/primary_constructors/factory_constructor_head.dart.expect
@@ -15,7 +15,7 @@
         beginMetadataStar(external)
         endMetadataStar(0)
         beginMember()
-          beginFactory(DeclarationKind.Class, {, external, null)
+          beginFactory(DeclarationKind.Class, {, null, external, null)
             handleNoIdentifier(factory, methodDeclaration)
             handleNoTypeVariables(()
             beginFormalParameters((, MemberKind.Factory)
@@ -27,7 +27,7 @@
         beginMetadataStar(external)
         endMetadataStar(0)
         beginMember()
-          beginFactory(DeclarationKind.Class, ;, external, null)
+          beginFactory(DeclarationKind.Class, ;, null, external, null)
             handleIdentifier(C, methodDeclaration)
             handleNoTypeVariables(()
             beginFormalParameters((, MemberKind.Factory)
@@ -39,7 +39,7 @@
         beginMetadataStar(external)
         endMetadataStar(0)
         beginMember()
-          beginFactory(DeclarationKind.Class, ;, external, null)
+          beginFactory(DeclarationKind.Class, ;, null, external, null)
             handleIdentifier(name, methodDeclaration)
             handleNoTypeVariables(()
             beginFormalParameters((, MemberKind.Factory)
@@ -51,7 +51,7 @@
         beginMetadataStar(external)
         endMetadataStar(0)
         beginMember()
-          beginFactory(DeclarationKind.Class, ;, external, null)
+          beginFactory(DeclarationKind.Class, ;, null, external, null)
             handleIdentifier(C, methodDeclaration)
             handleIdentifier(name, methodDeclarationContinuation)
             handleQualified(.)
@@ -65,7 +65,7 @@
         beginMetadataStar(factory)
         endMetadataStar(0)
         beginMember()
-          beginFactory(DeclarationKind.Class, ;, null, null)
+          beginFactory(DeclarationKind.Class, ;, null, null, null)
             handleNoIdentifier(factory, methodDeclaration)
             handleNoTypeVariables(()
             beginFormalParameters((, MemberKind.Factory)
@@ -82,7 +82,7 @@
         beginMetadataStar(factory)
         endMetadataStar(0)
         beginMember()
-          beginFactory(DeclarationKind.Class, ;, null, null)
+          beginFactory(DeclarationKind.Class, ;, null, null, null)
             handleIdentifier(C, methodDeclaration)
             handleNoTypeVariables(()
             beginFormalParameters((, MemberKind.Factory)
@@ -99,7 +99,7 @@
         beginMetadataStar(factory)
         endMetadataStar(0)
         beginMember()
-          beginFactory(DeclarationKind.Class, ;, null, null)
+          beginFactory(DeclarationKind.Class, ;, null, null, null)
             handleIdentifier(name, methodDeclaration)
             handleNoTypeVariables(()
             beginFormalParameters((, MemberKind.Factory)
@@ -116,7 +116,7 @@
         beginMetadataStar(factory)
         endMetadataStar(0)
         beginMember()
-          beginFactory(DeclarationKind.Class, ;, null, null)
+          beginFactory(DeclarationKind.Class, ;, null, null, null)
             handleIdentifier(C, methodDeclaration)
             handleIdentifier(name, methodDeclarationContinuation)
             handleQualified(.)
@@ -135,7 +135,7 @@
         beginMetadataStar(factory)
         endMetadataStar(0)
         beginMember()
-          beginFactory(DeclarationKind.Class, ;, null, null)
+          beginFactory(DeclarationKind.Class, ;, null, null, null)
             handleNoIdentifier(factory, methodDeclaration)
             handleNoTypeVariables(()
             beginFormalParameters((, MemberKind.Factory)
@@ -148,7 +148,7 @@
         beginMetadataStar(factory)
         endMetadataStar(0)
         beginMember()
-          beginFactory(DeclarationKind.Class, }, null, null)
+          beginFactory(DeclarationKind.Class, }, null, null, null)
             handleIdentifier(C, methodDeclaration)
             handleNoTypeVariables(()
             beginFormalParameters((, MemberKind.Factory)
@@ -161,7 +161,7 @@
         beginMetadataStar(factory)
         endMetadataStar(0)
         beginMember()
-          beginFactory(DeclarationKind.Class, }, null, null)
+          beginFactory(DeclarationKind.Class, }, null, null, null)
             handleIdentifier(name, methodDeclaration)
             handleNoTypeVariables(()
             beginFormalParameters((, MemberKind.Factory)
@@ -174,7 +174,7 @@
         beginMetadataStar(factory)
         endMetadataStar(0)
         beginMember()
-          beginFactory(DeclarationKind.Class, }, null, null)
+          beginFactory(DeclarationKind.Class, }, null, null, null)
             handleIdentifier(C, methodDeclaration)
             handleIdentifier(name, methodDeclarationContinuation)
             handleQualified(.)
@@ -189,7 +189,7 @@
         beginMetadataStar(factory)
         endMetadataStar(0)
         beginMember()
-          beginFactory(DeclarationKind.Class, }, null, null)
+          beginFactory(DeclarationKind.Class, }, null, null, null)
             handleNoIdentifier(factory, methodDeclaration)
             handleNoTypeVariables(()
             beginFormalParameters((, MemberKind.Factory)
@@ -207,7 +207,7 @@
         beginMetadataStar(factory)
         endMetadataStar(0)
         beginMember()
-          beginFactory(DeclarationKind.Class, ;, null, null)
+          beginFactory(DeclarationKind.Class, ;, null, null, null)
             handleIdentifier(C, methodDeclaration)
             handleNoTypeVariables(()
             beginFormalParameters((, MemberKind.Factory)
@@ -225,7 +225,7 @@
         beginMetadataStar(factory)
         endMetadataStar(0)
         beginMember()
-          beginFactory(DeclarationKind.Class, ;, null, null)
+          beginFactory(DeclarationKind.Class, ;, null, null, null)
             handleIdentifier(name, methodDeclaration)
             handleNoTypeVariables(()
             beginFormalParameters((, MemberKind.Factory)
@@ -243,7 +243,7 @@
         beginMetadataStar(factory)
         endMetadataStar(0)
         beginMember()
-          beginFactory(DeclarationKind.Class, ;, null, null)
+          beginFactory(DeclarationKind.Class, ;, null, null, null)
             handleIdentifier(C, methodDeclaration)
             handleIdentifier(name, methodDeclarationContinuation)
             handleQualified(.)
@@ -263,7 +263,7 @@
         beginMetadataStar(external)
         endMetadataStar(0)
         beginMember()
-          beginFactory(DeclarationKind.Class, ;, external, const)
+          beginFactory(DeclarationKind.Class, ;, null, external, const)
             handleNoIdentifier(factory, methodDeclaration)
             handleNoTypeVariables(()
             beginFormalParameters((, MemberKind.Factory)
@@ -275,7 +275,7 @@
         beginMetadataStar(external)
         endMetadataStar(0)
         beginMember()
-          beginFactory(DeclarationKind.Class, ;, external, const)
+          beginFactory(DeclarationKind.Class, ;, null, external, const)
             handleIdentifier(C, methodDeclaration)
             handleNoTypeVariables(()
             beginFormalParameters((, MemberKind.Factory)
@@ -287,7 +287,7 @@
         beginMetadataStar(external)
         endMetadataStar(0)
         beginMember()
-          beginFactory(DeclarationKind.Class, ;, external, const)
+          beginFactory(DeclarationKind.Class, ;, null, external, const)
             handleIdentifier(name, methodDeclaration)
             handleNoTypeVariables(()
             beginFormalParameters((, MemberKind.Factory)
@@ -299,7 +299,7 @@
         beginMetadataStar(external)
         endMetadataStar(0)
         beginMember()
-          beginFactory(DeclarationKind.Class, ;, external, const)
+          beginFactory(DeclarationKind.Class, ;, null, external, const)
             handleIdentifier(C, methodDeclaration)
             handleIdentifier(name, methodDeclarationContinuation)
             handleQualified(.)
@@ -313,7 +313,7 @@
         beginMetadataStar(const)
         endMetadataStar(0)
         beginMember()
-          beginFactory(DeclarationKind.Class, ;, null, const)
+          beginFactory(DeclarationKind.Class, ;, null, null, const)
             handleNoIdentifier(factory, methodDeclaration)
             handleNoTypeVariables(()
             beginFormalParameters((, MemberKind.Factory)
@@ -331,7 +331,7 @@
         beginMetadataStar(const)
         endMetadataStar(0)
         beginMember()
-          beginFactory(DeclarationKind.Class, ;, null, const)
+          beginFactory(DeclarationKind.Class, ;, null, null, const)
             handleIdentifier(C, methodDeclaration)
             handleNoTypeVariables(()
             beginFormalParameters((, MemberKind.Factory)
@@ -349,7 +349,7 @@
         beginMetadataStar(const)
         endMetadataStar(0)
         beginMember()
-          beginFactory(DeclarationKind.Class, ;, null, const)
+          beginFactory(DeclarationKind.Class, ;, null, null, const)
             handleIdentifier(name, methodDeclaration)
             handleNoTypeVariables(()
             beginFormalParameters((, MemberKind.Factory)
@@ -367,7 +367,7 @@
         beginMetadataStar(const)
         endMetadataStar(0)
         beginMember()
-          beginFactory(DeclarationKind.Class, ;, null, const)
+          beginFactory(DeclarationKind.Class, ;, null, null, const)
             handleIdentifier(C, methodDeclaration)
             handleIdentifier(name, methodDeclarationContinuation)
             handleQualified(.)
@@ -387,7 +387,7 @@
         beginMetadataStar(const)
         endMetadataStar(0)
         beginMember()
-          beginFactory(DeclarationKind.Class, ;, null, const)
+          beginFactory(DeclarationKind.Class, ;, null, null, const)
             handleNoIdentifier(factory, methodDeclaration)
             handleNoTypeVariables(()
             beginFormalParameters((, MemberKind.Factory)
@@ -401,7 +401,7 @@
         beginMetadataStar(const)
         endMetadataStar(0)
         beginMember()
-          beginFactory(DeclarationKind.Class, }, null, const)
+          beginFactory(DeclarationKind.Class, }, null, null, const)
             handleIdentifier(C, methodDeclaration)
             handleNoTypeVariables(()
             beginFormalParameters((, MemberKind.Factory)
@@ -415,7 +415,7 @@
         beginMetadataStar(const)
         endMetadataStar(0)
         beginMember()
-          beginFactory(DeclarationKind.Class, }, null, const)
+          beginFactory(DeclarationKind.Class, }, null, null, const)
             handleIdentifier(name, methodDeclaration)
             handleNoTypeVariables(()
             beginFormalParameters((, MemberKind.Factory)
@@ -429,7 +429,7 @@
         beginMetadataStar(const)
         endMetadataStar(0)
         beginMember()
-          beginFactory(DeclarationKind.Class, }, null, const)
+          beginFactory(DeclarationKind.Class, }, null, null, const)
             handleIdentifier(C, methodDeclaration)
             handleIdentifier(name, methodDeclarationContinuation)
             handleQualified(.)
@@ -445,7 +445,7 @@
         beginMetadataStar(const)
         endMetadataStar(0)
         beginMember()
-          beginFactory(DeclarationKind.Class, }, null, const)
+          beginFactory(DeclarationKind.Class, }, null, null, const)
             handleNoIdentifier(factory, methodDeclaration)
             handleNoTypeVariables(()
             beginFormalParameters((, MemberKind.Factory)
@@ -463,7 +463,7 @@
         beginMetadataStar(const)
         endMetadataStar(0)
         beginMember()
-          beginFactory(DeclarationKind.Class, ;, null, const)
+          beginFactory(DeclarationKind.Class, ;, null, null, const)
             handleIdentifier(C, methodDeclaration)
             handleNoTypeVariables(()
             beginFormalParameters((, MemberKind.Factory)
@@ -481,7 +481,7 @@
         beginMetadataStar(const)
         endMetadataStar(0)
         beginMember()
-          beginFactory(DeclarationKind.Class, ;, null, const)
+          beginFactory(DeclarationKind.Class, ;, null, null, const)
             handleIdentifier(name, methodDeclaration)
             handleNoTypeVariables(()
             beginFormalParameters((, MemberKind.Factory)
@@ -499,7 +499,7 @@
         beginMetadataStar(const)
         endMetadataStar(0)
         beginMember()
-          beginFactory(DeclarationKind.Class, ;, null, const)
+          beginFactory(DeclarationKind.Class, ;, null, null, const)
             handleIdentifier(C, methodDeclaration)
             handleIdentifier(name, methodDeclarationContinuation)
             handleQualified(.)
diff --git a/pkg/front_end/parser_testcases/primary_constructors/factory_constructor_head.dart.intertwined.expect b/pkg/front_end/parser_testcases/primary_constructors/factory_constructor_head.dart.intertwined.expect
index 7d833a5..65cda28 100644
--- a/pkg/front_end/parser_testcases/primary_constructors/factory_constructor_head.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/primary_constructors/factory_constructor_head.dart.intertwined.expect
@@ -33,8 +33,8 @@
                 listener: beginMetadataStar(external)
                 listener: endMetadataStar(0)
               listener: beginMember()
-              parseFactoryMethod(external, DeclarationKind.Class, {, external, null, null, false)
-                listener: beginFactory(DeclarationKind.Class, {, external, null)
+              parseFactoryMethod(external, DeclarationKind.Class, {, null, external, null, null, false)
+                listener: beginFactory(DeclarationKind.Class, {, null, external, null)
                 listener: handleNoIdentifier(factory, methodDeclaration)
                 parseMethodTypeVar(factory)
                   listener: handleNoTypeVariables(()
@@ -56,8 +56,8 @@
                 listener: beginMetadataStar(external)
                 listener: endMetadataStar(0)
               listener: beginMember()
-              parseFactoryMethod(external, DeclarationKind.Class, ;, external, null, null, true)
-                listener: beginFactory(DeclarationKind.Class, ;, external, null)
+              parseFactoryMethod(external, DeclarationKind.Class, ;, null, external, null, null, true)
+                listener: beginFactory(DeclarationKind.Class, ;, null, external, null)
                 ensureIdentifier(factory, methodDeclaration)
                   listener: handleIdentifier(C, methodDeclaration)
                 parseQualifiedRestOpt(C, methodDeclarationContinuation)
@@ -81,8 +81,8 @@
                 listener: beginMetadataStar(external)
                 listener: endMetadataStar(0)
               listener: beginMember()
-              parseFactoryMethod(external, DeclarationKind.Class, ;, external, null, null, true)
-                listener: beginFactory(DeclarationKind.Class, ;, external, null)
+              parseFactoryMethod(external, DeclarationKind.Class, ;, null, external, null, null, true)
+                listener: beginFactory(DeclarationKind.Class, ;, null, external, null)
                 ensureIdentifier(factory, methodDeclaration)
                   listener: handleIdentifier(name, methodDeclaration)
                 parseQualifiedRestOpt(name, methodDeclarationContinuation)
@@ -106,8 +106,8 @@
                 listener: beginMetadataStar(external)
                 listener: endMetadataStar(0)
               listener: beginMember()
-              parseFactoryMethod(external, DeclarationKind.Class, ;, external, null, null, true)
-                listener: beginFactory(DeclarationKind.Class, ;, external, null)
+              parseFactoryMethod(external, DeclarationKind.Class, ;, null, external, null, null, true)
+                listener: beginFactory(DeclarationKind.Class, ;, null, external, null)
                 ensureIdentifier(factory, methodDeclaration)
                   listener: handleIdentifier(C, methodDeclaration)
                 parseQualifiedRestOpt(C, methodDeclarationContinuation)
@@ -135,8 +135,8 @@
                 listener: beginMetadataStar(factory)
                 listener: endMetadataStar(0)
               listener: beginMember()
-              parseFactoryMethod(;, DeclarationKind.Class, ;, null, null, null, false)
-                listener: beginFactory(DeclarationKind.Class, ;, null, null)
+              parseFactoryMethod(;, DeclarationKind.Class, ;, null, null, null, null, false)
+                listener: beginFactory(DeclarationKind.Class, ;, null, null, null)
                 listener: handleNoIdentifier(factory, methodDeclaration)
                 parseMethodTypeVar(factory)
                   listener: handleNoTypeVariables(()
@@ -180,8 +180,8 @@
                 listener: beginMetadataStar(factory)
                 listener: endMetadataStar(0)
               listener: beginMember()
-              parseFactoryMethod(;, DeclarationKind.Class, ;, null, null, null, true)
-                listener: beginFactory(DeclarationKind.Class, ;, null, null)
+              parseFactoryMethod(;, DeclarationKind.Class, ;, null, null, null, null, true)
+                listener: beginFactory(DeclarationKind.Class, ;, null, null, null)
                 ensureIdentifier(factory, methodDeclaration)
                   listener: handleIdentifier(C, methodDeclaration)
                 parseQualifiedRestOpt(C, methodDeclarationContinuation)
@@ -227,8 +227,8 @@
                 listener: beginMetadataStar(factory)
                 listener: endMetadataStar(0)
               listener: beginMember()
-              parseFactoryMethod(;, DeclarationKind.Class, ;, null, null, null, true)
-                listener: beginFactory(DeclarationKind.Class, ;, null, null)
+              parseFactoryMethod(;, DeclarationKind.Class, ;, null, null, null, null, true)
+                listener: beginFactory(DeclarationKind.Class, ;, null, null, null)
                 ensureIdentifier(factory, methodDeclaration)
                   listener: handleIdentifier(name, methodDeclaration)
                 parseQualifiedRestOpt(name, methodDeclarationContinuation)
@@ -274,8 +274,8 @@
                 listener: beginMetadataStar(factory)
                 listener: endMetadataStar(0)
               listener: beginMember()
-              parseFactoryMethod(;, DeclarationKind.Class, ;, null, null, null, true)
-                listener: beginFactory(DeclarationKind.Class, ;, null, null)
+              parseFactoryMethod(;, DeclarationKind.Class, ;, null, null, null, null, true)
+                listener: beginFactory(DeclarationKind.Class, ;, null, null, null)
                 ensureIdentifier(factory, methodDeclaration)
                   listener: handleIdentifier(C, methodDeclaration)
                 parseQualifiedRestOpt(C, methodDeclarationContinuation)
@@ -325,8 +325,8 @@
                 listener: beginMetadataStar(factory)
                 listener: endMetadataStar(0)
               listener: beginMember()
-              parseFactoryMethod(;, DeclarationKind.Class, ;, null, null, null, false)
-                listener: beginFactory(DeclarationKind.Class, ;, null, null)
+              parseFactoryMethod(;, DeclarationKind.Class, ;, null, null, null, null, false)
+                listener: beginFactory(DeclarationKind.Class, ;, null, null, null)
                 listener: handleNoIdentifier(factory, methodDeclaration)
                 parseMethodTypeVar(factory)
                   listener: handleNoTypeVariables(()
@@ -350,8 +350,8 @@
                 listener: beginMetadataStar(factory)
                 listener: endMetadataStar(0)
               listener: beginMember()
-              parseFactoryMethod(}, DeclarationKind.Class, }, null, null, null, true)
-                listener: beginFactory(DeclarationKind.Class, }, null, null)
+              parseFactoryMethod(}, DeclarationKind.Class, }, null, null, null, null, true)
+                listener: beginFactory(DeclarationKind.Class, }, null, null, null)
                 ensureIdentifier(factory, methodDeclaration)
                   listener: handleIdentifier(C, methodDeclaration)
                 parseQualifiedRestOpt(C, methodDeclarationContinuation)
@@ -377,8 +377,8 @@
                 listener: beginMetadataStar(factory)
                 listener: endMetadataStar(0)
               listener: beginMember()
-              parseFactoryMethod(}, DeclarationKind.Class, }, null, null, null, true)
-                listener: beginFactory(DeclarationKind.Class, }, null, null)
+              parseFactoryMethod(}, DeclarationKind.Class, }, null, null, null, null, true)
+                listener: beginFactory(DeclarationKind.Class, }, null, null, null)
                 ensureIdentifier(factory, methodDeclaration)
                   listener: handleIdentifier(name, methodDeclaration)
                 parseQualifiedRestOpt(name, methodDeclarationContinuation)
@@ -404,8 +404,8 @@
                 listener: beginMetadataStar(factory)
                 listener: endMetadataStar(0)
               listener: beginMember()
-              parseFactoryMethod(}, DeclarationKind.Class, }, null, null, null, true)
-                listener: beginFactory(DeclarationKind.Class, }, null, null)
+              parseFactoryMethod(}, DeclarationKind.Class, }, null, null, null, null, true)
+                listener: beginFactory(DeclarationKind.Class, }, null, null, null)
                 ensureIdentifier(factory, methodDeclaration)
                   listener: handleIdentifier(C, methodDeclaration)
                 parseQualifiedRestOpt(C, methodDeclarationContinuation)
@@ -435,8 +435,8 @@
                 listener: beginMetadataStar(factory)
                 listener: endMetadataStar(0)
               listener: beginMember()
-              parseFactoryMethod(}, DeclarationKind.Class, }, null, null, null, false)
-                listener: beginFactory(DeclarationKind.Class, }, null, null)
+              parseFactoryMethod(}, DeclarationKind.Class, }, null, null, null, null, false)
+                listener: beginFactory(DeclarationKind.Class, }, null, null, null)
                 listener: handleNoIdentifier(factory, methodDeclaration)
                 parseMethodTypeVar(factory)
                   listener: handleNoTypeVariables(()
@@ -468,8 +468,8 @@
                 listener: beginMetadataStar(factory)
                 listener: endMetadataStar(0)
               listener: beginMember()
-              parseFactoryMethod(;, DeclarationKind.Class, ;, null, null, null, true)
-                listener: beginFactory(DeclarationKind.Class, ;, null, null)
+              parseFactoryMethod(;, DeclarationKind.Class, ;, null, null, null, null, true)
+                listener: beginFactory(DeclarationKind.Class, ;, null, null, null)
                 ensureIdentifier(factory, methodDeclaration)
                   listener: handleIdentifier(C, methodDeclaration)
                 parseQualifiedRestOpt(C, methodDeclarationContinuation)
@@ -503,8 +503,8 @@
                 listener: beginMetadataStar(factory)
                 listener: endMetadataStar(0)
               listener: beginMember()
-              parseFactoryMethod(;, DeclarationKind.Class, ;, null, null, null, true)
-                listener: beginFactory(DeclarationKind.Class, ;, null, null)
+              parseFactoryMethod(;, DeclarationKind.Class, ;, null, null, null, null, true)
+                listener: beginFactory(DeclarationKind.Class, ;, null, null, null)
                 ensureIdentifier(factory, methodDeclaration)
                   listener: handleIdentifier(name, methodDeclaration)
                 parseQualifiedRestOpt(name, methodDeclarationContinuation)
@@ -538,8 +538,8 @@
                 listener: beginMetadataStar(factory)
                 listener: endMetadataStar(0)
               listener: beginMember()
-              parseFactoryMethod(;, DeclarationKind.Class, ;, null, null, null, true)
-                listener: beginFactory(DeclarationKind.Class, ;, null, null)
+              parseFactoryMethod(;, DeclarationKind.Class, ;, null, null, null, null, true)
+                listener: beginFactory(DeclarationKind.Class, ;, null, null, null)
                 ensureIdentifier(factory, methodDeclaration)
                   listener: handleIdentifier(C, methodDeclaration)
                 parseQualifiedRestOpt(C, methodDeclarationContinuation)
@@ -577,8 +577,8 @@
                 listener: beginMetadataStar(external)
                 listener: endMetadataStar(0)
               listener: beginMember()
-              parseFactoryMethod(const, DeclarationKind.Class, ;, external, null, const, false)
-                listener: beginFactory(DeclarationKind.Class, ;, external, const)
+              parseFactoryMethod(const, DeclarationKind.Class, ;, null, external, null, const, false)
+                listener: beginFactory(DeclarationKind.Class, ;, null, external, const)
                 listener: handleNoIdentifier(factory, methodDeclaration)
                 parseMethodTypeVar(factory)
                   listener: handleNoTypeVariables(()
@@ -600,8 +600,8 @@
                 listener: beginMetadataStar(external)
                 listener: endMetadataStar(0)
               listener: beginMember()
-              parseFactoryMethod(const, DeclarationKind.Class, ;, external, null, const, true)
-                listener: beginFactory(DeclarationKind.Class, ;, external, const)
+              parseFactoryMethod(const, DeclarationKind.Class, ;, null, external, null, const, true)
+                listener: beginFactory(DeclarationKind.Class, ;, null, external, const)
                 ensureIdentifier(factory, methodDeclaration)
                   listener: handleIdentifier(C, methodDeclaration)
                 parseQualifiedRestOpt(C, methodDeclarationContinuation)
@@ -625,8 +625,8 @@
                 listener: beginMetadataStar(external)
                 listener: endMetadataStar(0)
               listener: beginMember()
-              parseFactoryMethod(const, DeclarationKind.Class, ;, external, null, const, true)
-                listener: beginFactory(DeclarationKind.Class, ;, external, const)
+              parseFactoryMethod(const, DeclarationKind.Class, ;, null, external, null, const, true)
+                listener: beginFactory(DeclarationKind.Class, ;, null, external, const)
                 ensureIdentifier(factory, methodDeclaration)
                   listener: handleIdentifier(name, methodDeclaration)
                 parseQualifiedRestOpt(name, methodDeclarationContinuation)
@@ -650,8 +650,8 @@
                 listener: beginMetadataStar(external)
                 listener: endMetadataStar(0)
               listener: beginMember()
-              parseFactoryMethod(const, DeclarationKind.Class, ;, external, null, const, true)
-                listener: beginFactory(DeclarationKind.Class, ;, external, const)
+              parseFactoryMethod(const, DeclarationKind.Class, ;, null, external, null, const, true)
+                listener: beginFactory(DeclarationKind.Class, ;, null, external, const)
                 ensureIdentifier(factory, methodDeclaration)
                   listener: handleIdentifier(C, methodDeclaration)
                 parseQualifiedRestOpt(C, methodDeclarationContinuation)
@@ -679,8 +679,8 @@
                 listener: beginMetadataStar(const)
                 listener: endMetadataStar(0)
               listener: beginMember()
-              parseFactoryMethod(const, DeclarationKind.Class, ;, null, null, const, false)
-                listener: beginFactory(DeclarationKind.Class, ;, null, const)
+              parseFactoryMethod(const, DeclarationKind.Class, ;, null, null, null, const, false)
+                listener: beginFactory(DeclarationKind.Class, ;, null, null, const)
                 listener: handleNoIdentifier(factory, methodDeclaration)
                 parseMethodTypeVar(factory)
                   listener: handleNoTypeVariables(()
@@ -725,8 +725,8 @@
                 listener: beginMetadataStar(const)
                 listener: endMetadataStar(0)
               listener: beginMember()
-              parseFactoryMethod(const, DeclarationKind.Class, ;, null, null, const, true)
-                listener: beginFactory(DeclarationKind.Class, ;, null, const)
+              parseFactoryMethod(const, DeclarationKind.Class, ;, null, null, null, const, true)
+                listener: beginFactory(DeclarationKind.Class, ;, null, null, const)
                 ensureIdentifier(factory, methodDeclaration)
                   listener: handleIdentifier(C, methodDeclaration)
                 parseQualifiedRestOpt(C, methodDeclarationContinuation)
@@ -773,8 +773,8 @@
                 listener: beginMetadataStar(const)
                 listener: endMetadataStar(0)
               listener: beginMember()
-              parseFactoryMethod(const, DeclarationKind.Class, ;, null, null, const, true)
-                listener: beginFactory(DeclarationKind.Class, ;, null, const)
+              parseFactoryMethod(const, DeclarationKind.Class, ;, null, null, null, const, true)
+                listener: beginFactory(DeclarationKind.Class, ;, null, null, const)
                 ensureIdentifier(factory, methodDeclaration)
                   listener: handleIdentifier(name, methodDeclaration)
                 parseQualifiedRestOpt(name, methodDeclarationContinuation)
@@ -821,8 +821,8 @@
                 listener: beginMetadataStar(const)
                 listener: endMetadataStar(0)
               listener: beginMember()
-              parseFactoryMethod(const, DeclarationKind.Class, ;, null, null, const, true)
-                listener: beginFactory(DeclarationKind.Class, ;, null, const)
+              parseFactoryMethod(const, DeclarationKind.Class, ;, null, null, null, const, true)
+                listener: beginFactory(DeclarationKind.Class, ;, null, null, const)
                 ensureIdentifier(factory, methodDeclaration)
                   listener: handleIdentifier(C, methodDeclaration)
                 parseQualifiedRestOpt(C, methodDeclarationContinuation)
@@ -873,8 +873,8 @@
                 listener: beginMetadataStar(const)
                 listener: endMetadataStar(0)
               listener: beginMember()
-              parseFactoryMethod(const, DeclarationKind.Class, ;, null, null, const, false)
-                listener: beginFactory(DeclarationKind.Class, ;, null, const)
+              parseFactoryMethod(const, DeclarationKind.Class, ;, null, null, null, const, false)
+                listener: beginFactory(DeclarationKind.Class, ;, null, null, const)
                 listener: handleNoIdentifier(factory, methodDeclaration)
                 parseMethodTypeVar(factory)
                   listener: handleNoTypeVariables(()
@@ -899,8 +899,8 @@
                 listener: beginMetadataStar(const)
                 listener: endMetadataStar(0)
               listener: beginMember()
-              parseFactoryMethod(const, DeclarationKind.Class, }, null, null, const, true)
-                listener: beginFactory(DeclarationKind.Class, }, null, const)
+              parseFactoryMethod(const, DeclarationKind.Class, }, null, null, null, const, true)
+                listener: beginFactory(DeclarationKind.Class, }, null, null, const)
                 ensureIdentifier(factory, methodDeclaration)
                   listener: handleIdentifier(C, methodDeclaration)
                 parseQualifiedRestOpt(C, methodDeclarationContinuation)
@@ -927,8 +927,8 @@
                 listener: beginMetadataStar(const)
                 listener: endMetadataStar(0)
               listener: beginMember()
-              parseFactoryMethod(const, DeclarationKind.Class, }, null, null, const, true)
-                listener: beginFactory(DeclarationKind.Class, }, null, const)
+              parseFactoryMethod(const, DeclarationKind.Class, }, null, null, null, const, true)
+                listener: beginFactory(DeclarationKind.Class, }, null, null, const)
                 ensureIdentifier(factory, methodDeclaration)
                   listener: handleIdentifier(name, methodDeclaration)
                 parseQualifiedRestOpt(name, methodDeclarationContinuation)
@@ -955,8 +955,8 @@
                 listener: beginMetadataStar(const)
                 listener: endMetadataStar(0)
               listener: beginMember()
-              parseFactoryMethod(const, DeclarationKind.Class, }, null, null, const, true)
-                listener: beginFactory(DeclarationKind.Class, }, null, const)
+              parseFactoryMethod(const, DeclarationKind.Class, }, null, null, null, const, true)
+                listener: beginFactory(DeclarationKind.Class, }, null, null, const)
                 ensureIdentifier(factory, methodDeclaration)
                   listener: handleIdentifier(C, methodDeclaration)
                 parseQualifiedRestOpt(C, methodDeclarationContinuation)
@@ -987,8 +987,8 @@
                 listener: beginMetadataStar(const)
                 listener: endMetadataStar(0)
               listener: beginMember()
-              parseFactoryMethod(const, DeclarationKind.Class, }, null, null, const, false)
-                listener: beginFactory(DeclarationKind.Class, }, null, const)
+              parseFactoryMethod(const, DeclarationKind.Class, }, null, null, null, const, false)
+                listener: beginFactory(DeclarationKind.Class, }, null, null, const)
                 listener: handleNoIdentifier(factory, methodDeclaration)
                 parseMethodTypeVar(factory)
                   listener: handleNoTypeVariables(()
@@ -1020,8 +1020,8 @@
                 listener: beginMetadataStar(const)
                 listener: endMetadataStar(0)
               listener: beginMember()
-              parseFactoryMethod(const, DeclarationKind.Class, ;, null, null, const, true)
-                listener: beginFactory(DeclarationKind.Class, ;, null, const)
+              parseFactoryMethod(const, DeclarationKind.Class, ;, null, null, null, const, true)
+                listener: beginFactory(DeclarationKind.Class, ;, null, null, const)
                 ensureIdentifier(factory, methodDeclaration)
                   listener: handleIdentifier(C, methodDeclaration)
                 parseQualifiedRestOpt(C, methodDeclarationContinuation)
@@ -1055,8 +1055,8 @@
                 listener: beginMetadataStar(const)
                 listener: endMetadataStar(0)
               listener: beginMember()
-              parseFactoryMethod(const, DeclarationKind.Class, ;, null, null, const, true)
-                listener: beginFactory(DeclarationKind.Class, ;, null, const)
+              parseFactoryMethod(const, DeclarationKind.Class, ;, null, null, null, const, true)
+                listener: beginFactory(DeclarationKind.Class, ;, null, null, const)
                 ensureIdentifier(factory, methodDeclaration)
                   listener: handleIdentifier(name, methodDeclaration)
                 parseQualifiedRestOpt(name, methodDeclarationContinuation)
@@ -1090,8 +1090,8 @@
                 listener: beginMetadataStar(const)
                 listener: endMetadataStar(0)
               listener: beginMember()
-              parseFactoryMethod(const, DeclarationKind.Class, ;, null, null, const, true)
-                listener: beginFactory(DeclarationKind.Class, ;, null, const)
+              parseFactoryMethod(const, DeclarationKind.Class, ;, null, null, null, const, true)
+                listener: beginFactory(DeclarationKind.Class, ;, null, null, const)
                 ensureIdentifier(factory, methodDeclaration)
                   listener: handleIdentifier(C, methodDeclaration)
                 parseQualifiedRestOpt(C, methodDeclarationContinuation)
diff --git a/pkg/front_end/parser_testcases/primary_constructors/factory_constructor_head_pre_feature.dart.expect b/pkg/front_end/parser_testcases/primary_constructors/factory_constructor_head_pre_feature.dart.expect
index 59bb27d..5234708 100644
--- a/pkg/front_end/parser_testcases/primary_constructors/factory_constructor_head_pre_feature.dart.expect
+++ b/pkg/front_end/parser_testcases/primary_constructors/factory_constructor_head_pre_feature.dart.expect
@@ -55,7 +55,7 @@
         beginMetadataStar(external)
         endMetadataStar(0)
         beginMember()
-          beginFactory(DeclarationKind.Class, ;, external, null)
+          beginFactory(DeclarationKind.Class, ;, null, external, null)
             handleIdentifier(C, methodDeclaration)
             handleNoTypeVariables(()
             beginFormalParameters((, MemberKind.Factory)
@@ -67,7 +67,7 @@
         beginMetadataStar(external)
         endMetadataStar(0)
         beginMember()
-          beginFactory(DeclarationKind.Class, ;, external, null)
+          beginFactory(DeclarationKind.Class, ;, null, external, null)
             handleIdentifier(name, methodDeclaration)
             handleNoTypeVariables(()
             beginFormalParameters((, MemberKind.Factory)
@@ -79,7 +79,7 @@
         beginMetadataStar(external)
         endMetadataStar(0)
         beginMember()
-          beginFactory(DeclarationKind.Class, ;, external, null)
+          beginFactory(DeclarationKind.Class, ;, null, external, null)
             handleIdentifier(C, methodDeclaration)
             handleIdentifier(name, methodDeclarationContinuation)
             handleQualified(.)
@@ -112,7 +112,7 @@
         beginMetadataStar(factory)
         endMetadataStar(0)
         beginMember()
-          beginFactory(DeclarationKind.Class, ;, null, null)
+          beginFactory(DeclarationKind.Class, ;, null, null, null)
             handleIdentifier(C, methodDeclaration)
             handleNoTypeVariables(()
             beginFormalParameters((, MemberKind.Factory)
@@ -129,7 +129,7 @@
         beginMetadataStar(factory)
         endMetadataStar(0)
         beginMember()
-          beginFactory(DeclarationKind.Class, ;, null, null)
+          beginFactory(DeclarationKind.Class, ;, null, null, null)
             handleIdentifier(name, methodDeclaration)
             handleNoTypeVariables(()
             beginFormalParameters((, MemberKind.Factory)
@@ -146,7 +146,7 @@
         beginMetadataStar(factory)
         endMetadataStar(0)
         beginMember()
-          beginFactory(DeclarationKind.Class, ;, null, null)
+          beginFactory(DeclarationKind.Class, ;, null, null, null)
             handleIdentifier(C, methodDeclaration)
             handleIdentifier(name, methodDeclarationContinuation)
             handleQualified(.)
@@ -180,7 +180,7 @@
         beginMetadataStar(factory)
         endMetadataStar(0)
         beginMember()
-          beginFactory(DeclarationKind.Class, }, null, null)
+          beginFactory(DeclarationKind.Class, }, null, null, null)
             handleIdentifier(C, methodDeclaration)
             handleNoTypeVariables(()
             beginFormalParameters((, MemberKind.Factory)
@@ -193,7 +193,7 @@
         beginMetadataStar(factory)
         endMetadataStar(0)
         beginMember()
-          beginFactory(DeclarationKind.Class, }, null, null)
+          beginFactory(DeclarationKind.Class, }, null, null, null)
             handleIdentifier(name, methodDeclaration)
             handleNoTypeVariables(()
             beginFormalParameters((, MemberKind.Factory)
@@ -206,7 +206,7 @@
         beginMetadataStar(factory)
         endMetadataStar(0)
         beginMember()
-          beginFactory(DeclarationKind.Class, }, null, null)
+          beginFactory(DeclarationKind.Class, }, null, null, null)
             handleIdentifier(C, methodDeclaration)
             handleIdentifier(name, methodDeclarationContinuation)
             handleQualified(.)
@@ -242,7 +242,7 @@
         beginMetadataStar(factory)
         endMetadataStar(0)
         beginMember()
-          beginFactory(DeclarationKind.Class, ;, null, null)
+          beginFactory(DeclarationKind.Class, ;, null, null, null)
             handleIdentifier(C, methodDeclaration)
             handleNoTypeVariables(()
             beginFormalParameters((, MemberKind.Factory)
@@ -260,7 +260,7 @@
         beginMetadataStar(factory)
         endMetadataStar(0)
         beginMember()
-          beginFactory(DeclarationKind.Class, ;, null, null)
+          beginFactory(DeclarationKind.Class, ;, null, null, null)
             handleIdentifier(name, methodDeclaration)
             handleNoTypeVariables(()
             beginFormalParameters((, MemberKind.Factory)
@@ -278,7 +278,7 @@
         beginMetadataStar(factory)
         endMetadataStar(0)
         beginMember()
-          beginFactory(DeclarationKind.Class, ;, null, null)
+          beginFactory(DeclarationKind.Class, ;, null, null, null)
             handleIdentifier(C, methodDeclaration)
             handleIdentifier(name, methodDeclarationContinuation)
             handleQualified(.)
@@ -313,7 +313,7 @@
         beginMetadataStar(external)
         endMetadataStar(0)
         beginMember()
-          beginFactory(DeclarationKind.Class, ;, external, const)
+          beginFactory(DeclarationKind.Class, ;, null, external, const)
             handleIdentifier(C, methodDeclaration)
             handleNoTypeVariables(()
             beginFormalParameters((, MemberKind.Factory)
@@ -325,7 +325,7 @@
         beginMetadataStar(external)
         endMetadataStar(0)
         beginMember()
-          beginFactory(DeclarationKind.Class, ;, external, const)
+          beginFactory(DeclarationKind.Class, ;, null, external, const)
             handleIdentifier(name, methodDeclaration)
             handleNoTypeVariables(()
             beginFormalParameters((, MemberKind.Factory)
@@ -337,7 +337,7 @@
         beginMetadataStar(external)
         endMetadataStar(0)
         beginMember()
-          beginFactory(DeclarationKind.Class, ;, external, const)
+          beginFactory(DeclarationKind.Class, ;, null, external, const)
             handleIdentifier(C, methodDeclaration)
             handleIdentifier(name, methodDeclarationContinuation)
             handleQualified(.)
@@ -371,7 +371,7 @@
         beginMetadataStar(const)
         endMetadataStar(0)
         beginMember()
-          beginFactory(DeclarationKind.Class, ;, null, const)
+          beginFactory(DeclarationKind.Class, ;, null, null, const)
             handleIdentifier(C, methodDeclaration)
             handleNoTypeVariables(()
             beginFormalParameters((, MemberKind.Factory)
@@ -389,7 +389,7 @@
         beginMetadataStar(const)
         endMetadataStar(0)
         beginMember()
-          beginFactory(DeclarationKind.Class, ;, null, const)
+          beginFactory(DeclarationKind.Class, ;, null, null, const)
             handleIdentifier(name, methodDeclaration)
             handleNoTypeVariables(()
             beginFormalParameters((, MemberKind.Factory)
@@ -407,7 +407,7 @@
         beginMetadataStar(const)
         endMetadataStar(0)
         beginMember()
-          beginFactory(DeclarationKind.Class, ;, null, const)
+          beginFactory(DeclarationKind.Class, ;, null, null, const)
             handleIdentifier(C, methodDeclaration)
             handleIdentifier(name, methodDeclarationContinuation)
             handleQualified(.)
@@ -443,7 +443,7 @@
         beginMetadataStar(const)
         endMetadataStar(0)
         beginMember()
-          beginFactory(DeclarationKind.Class, }, null, const)
+          beginFactory(DeclarationKind.Class, }, null, null, const)
             handleIdentifier(C, methodDeclaration)
             handleNoTypeVariables(()
             beginFormalParameters((, MemberKind.Factory)
@@ -457,7 +457,7 @@
         beginMetadataStar(const)
         endMetadataStar(0)
         beginMember()
-          beginFactory(DeclarationKind.Class, }, null, const)
+          beginFactory(DeclarationKind.Class, }, null, null, const)
             handleIdentifier(name, methodDeclaration)
             handleNoTypeVariables(()
             beginFormalParameters((, MemberKind.Factory)
@@ -471,7 +471,7 @@
         beginMetadataStar(const)
         endMetadataStar(0)
         beginMember()
-          beginFactory(DeclarationKind.Class, }, null, const)
+          beginFactory(DeclarationKind.Class, }, null, null, const)
             handleIdentifier(C, methodDeclaration)
             handleIdentifier(name, methodDeclarationContinuation)
             handleQualified(.)
@@ -509,7 +509,7 @@
         beginMetadataStar(const)
         endMetadataStar(0)
         beginMember()
-          beginFactory(DeclarationKind.Class, ;, null, const)
+          beginFactory(DeclarationKind.Class, ;, null, null, const)
             handleIdentifier(C, methodDeclaration)
             handleNoTypeVariables(()
             beginFormalParameters((, MemberKind.Factory)
@@ -527,7 +527,7 @@
         beginMetadataStar(const)
         endMetadataStar(0)
         beginMember()
-          beginFactory(DeclarationKind.Class, ;, null, const)
+          beginFactory(DeclarationKind.Class, ;, null, null, const)
             handleIdentifier(name, methodDeclaration)
             handleNoTypeVariables(()
             beginFormalParameters((, MemberKind.Factory)
@@ -545,7 +545,7 @@
         beginMetadataStar(const)
         endMetadataStar(0)
         beginMember()
-          beginFactory(DeclarationKind.Class, ;, null, const)
+          beginFactory(DeclarationKind.Class, ;, null, null, const)
             handleIdentifier(C, methodDeclaration)
             handleIdentifier(name, methodDeclarationContinuation)
             handleQualified(.)
diff --git a/pkg/front_end/parser_testcases/primary_constructors/factory_constructor_head_pre_feature.dart.intertwined.expect b/pkg/front_end/parser_testcases/primary_constructors/factory_constructor_head_pre_feature.dart.intertwined.expect
index ca123e5..7ce9560 100644
--- a/pkg/front_end/parser_testcases/primary_constructors/factory_constructor_head_pre_feature.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/primary_constructors/factory_constructor_head_pre_feature.dart.intertwined.expect
@@ -62,8 +62,8 @@
                 listener: beginMetadataStar(external)
                 listener: endMetadataStar(0)
               listener: beginMember()
-              parseFactoryMethod(external, DeclarationKind.Class, ;, external, null, null, true)
-                listener: beginFactory(DeclarationKind.Class, ;, external, null)
+              parseFactoryMethod(external, DeclarationKind.Class, ;, null, external, null, null, true)
+                listener: beginFactory(DeclarationKind.Class, ;, null, external, null)
                 ensureIdentifier(factory, methodDeclaration)
                   listener: handleIdentifier(C, methodDeclaration)
                 parseQualifiedRestOpt(C, methodDeclarationContinuation)
@@ -87,8 +87,8 @@
                 listener: beginMetadataStar(external)
                 listener: endMetadataStar(0)
               listener: beginMember()
-              parseFactoryMethod(external, DeclarationKind.Class, ;, external, null, null, true)
-                listener: beginFactory(DeclarationKind.Class, ;, external, null)
+              parseFactoryMethod(external, DeclarationKind.Class, ;, null, external, null, null, true)
+                listener: beginFactory(DeclarationKind.Class, ;, null, external, null)
                 ensureIdentifier(factory, methodDeclaration)
                   listener: handleIdentifier(name, methodDeclaration)
                 parseQualifiedRestOpt(name, methodDeclarationContinuation)
@@ -112,8 +112,8 @@
                 listener: beginMetadataStar(external)
                 listener: endMetadataStar(0)
               listener: beginMember()
-              parseFactoryMethod(external, DeclarationKind.Class, ;, external, null, null, true)
-                listener: beginFactory(DeclarationKind.Class, ;, external, null)
+              parseFactoryMethod(external, DeclarationKind.Class, ;, null, external, null, null, true)
+                listener: beginFactory(DeclarationKind.Class, ;, null, external, null)
                 ensureIdentifier(factory, methodDeclaration)
                   listener: handleIdentifier(C, methodDeclaration)
                 parseQualifiedRestOpt(C, methodDeclarationContinuation)
@@ -192,8 +192,8 @@
                 listener: beginMetadataStar(factory)
                 listener: endMetadataStar(0)
               listener: beginMember()
-              parseFactoryMethod(;, DeclarationKind.Class, ;, null, null, null, true)
-                listener: beginFactory(DeclarationKind.Class, ;, null, null)
+              parseFactoryMethod(;, DeclarationKind.Class, ;, null, null, null, null, true)
+                listener: beginFactory(DeclarationKind.Class, ;, null, null, null)
                 ensureIdentifier(factory, methodDeclaration)
                   listener: handleIdentifier(C, methodDeclaration)
                 parseQualifiedRestOpt(C, methodDeclarationContinuation)
@@ -239,8 +239,8 @@
                 listener: beginMetadataStar(factory)
                 listener: endMetadataStar(0)
               listener: beginMember()
-              parseFactoryMethod(;, DeclarationKind.Class, ;, null, null, null, true)
-                listener: beginFactory(DeclarationKind.Class, ;, null, null)
+              parseFactoryMethod(;, DeclarationKind.Class, ;, null, null, null, null, true)
+                listener: beginFactory(DeclarationKind.Class, ;, null, null, null)
                 ensureIdentifier(factory, methodDeclaration)
                   listener: handleIdentifier(name, methodDeclaration)
                 parseQualifiedRestOpt(name, methodDeclarationContinuation)
@@ -286,8 +286,8 @@
                 listener: beginMetadataStar(factory)
                 listener: endMetadataStar(0)
               listener: beginMember()
-              parseFactoryMethod(;, DeclarationKind.Class, ;, null, null, null, true)
-                listener: beginFactory(DeclarationKind.Class, ;, null, null)
+              parseFactoryMethod(;, DeclarationKind.Class, ;, null, null, null, null, true)
+                listener: beginFactory(DeclarationKind.Class, ;, null, null, null)
                 ensureIdentifier(factory, methodDeclaration)
                   listener: handleIdentifier(C, methodDeclaration)
                 parseQualifiedRestOpt(C, methodDeclarationContinuation)
@@ -368,8 +368,8 @@
                 listener: beginMetadataStar(factory)
                 listener: endMetadataStar(0)
               listener: beginMember()
-              parseFactoryMethod(}, DeclarationKind.Class, }, null, null, null, true)
-                listener: beginFactory(DeclarationKind.Class, }, null, null)
+              parseFactoryMethod(}, DeclarationKind.Class, }, null, null, null, null, true)
+                listener: beginFactory(DeclarationKind.Class, }, null, null, null)
                 ensureIdentifier(factory, methodDeclaration)
                   listener: handleIdentifier(C, methodDeclaration)
                 parseQualifiedRestOpt(C, methodDeclarationContinuation)
@@ -395,8 +395,8 @@
                 listener: beginMetadataStar(factory)
                 listener: endMetadataStar(0)
               listener: beginMember()
-              parseFactoryMethod(}, DeclarationKind.Class, }, null, null, null, true)
-                listener: beginFactory(DeclarationKind.Class, }, null, null)
+              parseFactoryMethod(}, DeclarationKind.Class, }, null, null, null, null, true)
+                listener: beginFactory(DeclarationKind.Class, }, null, null, null)
                 ensureIdentifier(factory, methodDeclaration)
                   listener: handleIdentifier(name, methodDeclaration)
                 parseQualifiedRestOpt(name, methodDeclarationContinuation)
@@ -422,8 +422,8 @@
                 listener: beginMetadataStar(factory)
                 listener: endMetadataStar(0)
               listener: beginMember()
-              parseFactoryMethod(}, DeclarationKind.Class, }, null, null, null, true)
-                listener: beginFactory(DeclarationKind.Class, }, null, null)
+              parseFactoryMethod(}, DeclarationKind.Class, }, null, null, null, null, true)
+                listener: beginFactory(DeclarationKind.Class, }, null, null, null)
                 ensureIdentifier(factory, methodDeclaration)
                   listener: handleIdentifier(C, methodDeclaration)
                 parseQualifiedRestOpt(C, methodDeclarationContinuation)
@@ -493,8 +493,8 @@
                 listener: beginMetadataStar(factory)
                 listener: endMetadataStar(0)
               listener: beginMember()
-              parseFactoryMethod(;, DeclarationKind.Class, ;, null, null, null, true)
-                listener: beginFactory(DeclarationKind.Class, ;, null, null)
+              parseFactoryMethod(;, DeclarationKind.Class, ;, null, null, null, null, true)
+                listener: beginFactory(DeclarationKind.Class, ;, null, null, null)
                 ensureIdentifier(factory, methodDeclaration)
                   listener: handleIdentifier(C, methodDeclaration)
                 parseQualifiedRestOpt(C, methodDeclarationContinuation)
@@ -528,8 +528,8 @@
                 listener: beginMetadataStar(factory)
                 listener: endMetadataStar(0)
               listener: beginMember()
-              parseFactoryMethod(;, DeclarationKind.Class, ;, null, null, null, true)
-                listener: beginFactory(DeclarationKind.Class, ;, null, null)
+              parseFactoryMethod(;, DeclarationKind.Class, ;, null, null, null, null, true)
+                listener: beginFactory(DeclarationKind.Class, ;, null, null, null)
                 ensureIdentifier(factory, methodDeclaration)
                   listener: handleIdentifier(name, methodDeclaration)
                 parseQualifiedRestOpt(name, methodDeclarationContinuation)
@@ -563,8 +563,8 @@
                 listener: beginMetadataStar(factory)
                 listener: endMetadataStar(0)
               listener: beginMember()
-              parseFactoryMethod(;, DeclarationKind.Class, ;, null, null, null, true)
-                listener: beginFactory(DeclarationKind.Class, ;, null, null)
+              parseFactoryMethod(;, DeclarationKind.Class, ;, null, null, null, null, true)
+                listener: beginFactory(DeclarationKind.Class, ;, null, null, null)
                 ensureIdentifier(factory, methodDeclaration)
                   listener: handleIdentifier(C, methodDeclaration)
                 parseQualifiedRestOpt(C, methodDeclarationContinuation)
@@ -633,8 +633,8 @@
                 listener: beginMetadataStar(external)
                 listener: endMetadataStar(0)
               listener: beginMember()
-              parseFactoryMethod(const, DeclarationKind.Class, ;, external, null, const, true)
-                listener: beginFactory(DeclarationKind.Class, ;, external, const)
+              parseFactoryMethod(const, DeclarationKind.Class, ;, null, external, null, const, true)
+                listener: beginFactory(DeclarationKind.Class, ;, null, external, const)
                 ensureIdentifier(factory, methodDeclaration)
                   listener: handleIdentifier(C, methodDeclaration)
                 parseQualifiedRestOpt(C, methodDeclarationContinuation)
@@ -658,8 +658,8 @@
                 listener: beginMetadataStar(external)
                 listener: endMetadataStar(0)
               listener: beginMember()
-              parseFactoryMethod(const, DeclarationKind.Class, ;, external, null, const, true)
-                listener: beginFactory(DeclarationKind.Class, ;, external, const)
+              parseFactoryMethod(const, DeclarationKind.Class, ;, null, external, null, const, true)
+                listener: beginFactory(DeclarationKind.Class, ;, null, external, const)
                 ensureIdentifier(factory, methodDeclaration)
                   listener: handleIdentifier(name, methodDeclaration)
                 parseQualifiedRestOpt(name, methodDeclarationContinuation)
@@ -683,8 +683,8 @@
                 listener: beginMetadataStar(external)
                 listener: endMetadataStar(0)
               listener: beginMember()
-              parseFactoryMethod(const, DeclarationKind.Class, ;, external, null, const, true)
-                listener: beginFactory(DeclarationKind.Class, ;, external, const)
+              parseFactoryMethod(const, DeclarationKind.Class, ;, null, external, null, const, true)
+                listener: beginFactory(DeclarationKind.Class, ;, null, external, const)
                 ensureIdentifier(factory, methodDeclaration)
                   listener: handleIdentifier(C, methodDeclaration)
                 parseQualifiedRestOpt(C, methodDeclarationContinuation)
@@ -765,8 +765,8 @@
                 listener: beginMetadataStar(const)
                 listener: endMetadataStar(0)
               listener: beginMember()
-              parseFactoryMethod(const, DeclarationKind.Class, ;, null, null, const, true)
-                listener: beginFactory(DeclarationKind.Class, ;, null, const)
+              parseFactoryMethod(const, DeclarationKind.Class, ;, null, null, null, const, true)
+                listener: beginFactory(DeclarationKind.Class, ;, null, null, const)
                 ensureIdentifier(factory, methodDeclaration)
                   listener: handleIdentifier(C, methodDeclaration)
                 parseQualifiedRestOpt(C, methodDeclarationContinuation)
@@ -813,8 +813,8 @@
                 listener: beginMetadataStar(const)
                 listener: endMetadataStar(0)
               listener: beginMember()
-              parseFactoryMethod(const, DeclarationKind.Class, ;, null, null, const, true)
-                listener: beginFactory(DeclarationKind.Class, ;, null, const)
+              parseFactoryMethod(const, DeclarationKind.Class, ;, null, null, null, const, true)
+                listener: beginFactory(DeclarationKind.Class, ;, null, null, const)
                 ensureIdentifier(factory, methodDeclaration)
                   listener: handleIdentifier(name, methodDeclaration)
                 parseQualifiedRestOpt(name, methodDeclarationContinuation)
@@ -861,8 +861,8 @@
                 listener: beginMetadataStar(const)
                 listener: endMetadataStar(0)
               listener: beginMember()
-              parseFactoryMethod(const, DeclarationKind.Class, ;, null, null, const, true)
-                listener: beginFactory(DeclarationKind.Class, ;, null, const)
+              parseFactoryMethod(const, DeclarationKind.Class, ;, null, null, null, const, true)
+                listener: beginFactory(DeclarationKind.Class, ;, null, null, const)
                 ensureIdentifier(factory, methodDeclaration)
                   listener: handleIdentifier(C, methodDeclaration)
                 parseQualifiedRestOpt(C, methodDeclarationContinuation)
@@ -946,8 +946,8 @@
                 listener: beginMetadataStar(const)
                 listener: endMetadataStar(0)
               listener: beginMember()
-              parseFactoryMethod(const, DeclarationKind.Class, }, null, null, const, true)
-                listener: beginFactory(DeclarationKind.Class, }, null, const)
+              parseFactoryMethod(const, DeclarationKind.Class, }, null, null, null, const, true)
+                listener: beginFactory(DeclarationKind.Class, }, null, null, const)
                 ensureIdentifier(factory, methodDeclaration)
                   listener: handleIdentifier(C, methodDeclaration)
                 parseQualifiedRestOpt(C, methodDeclarationContinuation)
@@ -974,8 +974,8 @@
                 listener: beginMetadataStar(const)
                 listener: endMetadataStar(0)
               listener: beginMember()
-              parseFactoryMethod(const, DeclarationKind.Class, }, null, null, const, true)
-                listener: beginFactory(DeclarationKind.Class, }, null, const)
+              parseFactoryMethod(const, DeclarationKind.Class, }, null, null, null, const, true)
+                listener: beginFactory(DeclarationKind.Class, }, null, null, const)
                 ensureIdentifier(factory, methodDeclaration)
                   listener: handleIdentifier(name, methodDeclaration)
                 parseQualifiedRestOpt(name, methodDeclarationContinuation)
@@ -1002,8 +1002,8 @@
                 listener: beginMetadataStar(const)
                 listener: endMetadataStar(0)
               listener: beginMember()
-              parseFactoryMethod(const, DeclarationKind.Class, }, null, null, const, true)
-                listener: beginFactory(DeclarationKind.Class, }, null, const)
+              parseFactoryMethod(const, DeclarationKind.Class, }, null, null, null, const, true)
+                listener: beginFactory(DeclarationKind.Class, }, null, null, const)
                 ensureIdentifier(factory, methodDeclaration)
                   listener: handleIdentifier(C, methodDeclaration)
                 parseQualifiedRestOpt(C, methodDeclarationContinuation)
@@ -1076,8 +1076,8 @@
                 listener: beginMetadataStar(const)
                 listener: endMetadataStar(0)
               listener: beginMember()
-              parseFactoryMethod(const, DeclarationKind.Class, ;, null, null, const, true)
-                listener: beginFactory(DeclarationKind.Class, ;, null, const)
+              parseFactoryMethod(const, DeclarationKind.Class, ;, null, null, null, const, true)
+                listener: beginFactory(DeclarationKind.Class, ;, null, null, const)
                 ensureIdentifier(factory, methodDeclaration)
                   listener: handleIdentifier(C, methodDeclaration)
                 parseQualifiedRestOpt(C, methodDeclarationContinuation)
@@ -1111,8 +1111,8 @@
                 listener: beginMetadataStar(const)
                 listener: endMetadataStar(0)
               listener: beginMember()
-              parseFactoryMethod(const, DeclarationKind.Class, ;, null, null, const, true)
-                listener: beginFactory(DeclarationKind.Class, ;, null, const)
+              parseFactoryMethod(const, DeclarationKind.Class, ;, null, null, null, const, true)
+                listener: beginFactory(DeclarationKind.Class, ;, null, null, const)
                 ensureIdentifier(factory, methodDeclaration)
                   listener: handleIdentifier(name, methodDeclaration)
                 parseQualifiedRestOpt(name, methodDeclarationContinuation)
@@ -1146,8 +1146,8 @@
                 listener: beginMetadataStar(const)
                 listener: endMetadataStar(0)
               listener: beginMember()
-              parseFactoryMethod(const, DeclarationKind.Class, ;, null, null, const, true)
-                listener: beginFactory(DeclarationKind.Class, ;, null, const)
+              parseFactoryMethod(const, DeclarationKind.Class, ;, null, null, null, const, true)
+                listener: beginFactory(DeclarationKind.Class, ;, null, null, const)
                 ensureIdentifier(factory, methodDeclaration)
                   listener: handleIdentifier(C, methodDeclaration)
                 parseQualifiedRestOpt(C, methodDeclarationContinuation)
diff --git a/pkg/front_end/parser_testcases/primary_constructors/factory_new.dart.expect b/pkg/front_end/parser_testcases/primary_constructors/factory_new.dart.expect
index 213c0cc..ba9d6e0 100644
--- a/pkg/front_end/parser_testcases/primary_constructors/factory_new.dart.expect
+++ b/pkg/front_end/parser_testcases/primary_constructors/factory_new.dart.expect
@@ -65,7 +65,7 @@
         beginMetadataStar(external)
         endMetadataStar(0)
         beginMember()
-          beginFactory(DeclarationKind.Class, {, external, null)
+          beginFactory(DeclarationKind.Class, {, null, external, null)
             handleRecoverableError(FactoryConstructorNewName, new, new)
             handleIdentifier(new, methodDeclaration)
             handleNoTypeVariables(()
@@ -78,7 +78,7 @@
         beginMetadataStar(external)
         endMetadataStar(0)
         beginMember()
-          beginFactory(DeclarationKind.Class, ;, external, const)
+          beginFactory(DeclarationKind.Class, ;, null, external, const)
             handleRecoverableError(FactoryConstructorNewName, new, new)
             handleIdentifier(new, methodDeclaration)
             handleNoTypeVariables(()
@@ -91,7 +91,7 @@
         beginMetadataStar(factory)
         endMetadataStar(0)
         beginMember()
-          beginFactory(DeclarationKind.Class, ;, null, null)
+          beginFactory(DeclarationKind.Class, ;, null, null, null)
             handleRecoverableError(FactoryConstructorNewName, new, new)
             handleIdentifier(new, methodDeclaration)
             handleNoTypeVariables(()
@@ -105,7 +105,7 @@
         beginMetadataStar(const)
         endMetadataStar(0)
         beginMember()
-          beginFactory(DeclarationKind.Class, ;, null, const)
+          beginFactory(DeclarationKind.Class, ;, null, null, const)
             handleRecoverableError(FactoryConstructorNewName, new, new)
             handleIdentifier(new, methodDeclaration)
             handleNoTypeVariables(()
@@ -120,7 +120,7 @@
         beginMetadataStar(factory)
         endMetadataStar(0)
         beginMember()
-          beginFactory(DeclarationKind.Class, ;, null, null)
+          beginFactory(DeclarationKind.Class, ;, null, null, null)
             handleRecoverableError(FactoryConstructorNewName, new, new)
             handleIdentifier(new, methodDeclaration)
             handleNoTypeVariables(()
@@ -139,7 +139,7 @@
         beginMetadataStar(const)
         endMetadataStar(0)
         beginMember()
-          beginFactory(DeclarationKind.Class, ;, null, const)
+          beginFactory(DeclarationKind.Class, ;, null, null, const)
             handleRecoverableError(FactoryConstructorNewName, new, new)
             handleIdentifier(new, methodDeclaration)
             handleNoTypeVariables(()
@@ -158,7 +158,7 @@
         beginMetadataStar(external)
         endMetadataStar(0)
         beginMember()
-          beginFactory(DeclarationKind.Class, ;, external, null)
+          beginFactory(DeclarationKind.Class, ;, null, external, null)
             handleRecoverableError(Message[Template(ExpectedIdentifierButGotKeyword), 'new' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: new}], new, new)
             handleIdentifier(new, methodDeclaration)
             handleIdentifier(named, methodDeclarationContinuation)
@@ -173,7 +173,7 @@
         beginMetadataStar(external)
         endMetadataStar(0)
         beginMember()
-          beginFactory(DeclarationKind.Class, ;, external, const)
+          beginFactory(DeclarationKind.Class, ;, null, external, const)
             handleRecoverableError(Message[Template(ExpectedIdentifierButGotKeyword), 'new' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: new}], new, new)
             handleIdentifier(new, methodDeclaration)
             handleIdentifier(named, methodDeclarationContinuation)
@@ -188,7 +188,7 @@
         beginMetadataStar(factory)
         endMetadataStar(0)
         beginMember()
-          beginFactory(DeclarationKind.Class, ;, null, null)
+          beginFactory(DeclarationKind.Class, ;, null, null, null)
             handleRecoverableError(Message[Template(ExpectedIdentifierButGotKeyword), 'new' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: new}], new, new)
             handleIdentifier(new, methodDeclaration)
             handleIdentifier(named, methodDeclarationContinuation)
@@ -204,7 +204,7 @@
         beginMetadataStar(const)
         endMetadataStar(0)
         beginMember()
-          beginFactory(DeclarationKind.Class, ;, null, const)
+          beginFactory(DeclarationKind.Class, ;, null, null, const)
             handleRecoverableError(Message[Template(ExpectedIdentifierButGotKeyword), 'new' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: new}], new, new)
             handleIdentifier(new, methodDeclaration)
             handleIdentifier(named, methodDeclarationContinuation)
@@ -221,7 +221,7 @@
         beginMetadataStar(factory)
         endMetadataStar(0)
         beginMember()
-          beginFactory(DeclarationKind.Class, ;, null, null)
+          beginFactory(DeclarationKind.Class, ;, null, null, null)
             handleRecoverableError(Message[Template(ExpectedIdentifierButGotKeyword), 'new' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: new}], new, new)
             handleIdentifier(new, methodDeclaration)
             handleIdentifier(named, methodDeclarationContinuation)
@@ -242,7 +242,7 @@
         beginMetadataStar(const)
         endMetadataStar(0)
         beginMember()
-          beginFactory(DeclarationKind.Class, ;, null, const)
+          beginFactory(DeclarationKind.Class, ;, null, null, const)
             handleRecoverableError(Message[Template(ExpectedIdentifierButGotKeyword), 'new' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: new}], new, new)
             handleIdentifier(new, methodDeclaration)
             handleIdentifier(named, methodDeclarationContinuation)
diff --git a/pkg/front_end/parser_testcases/primary_constructors/factory_new.dart.intertwined.expect b/pkg/front_end/parser_testcases/primary_constructors/factory_new.dart.intertwined.expect
index f8e170b..4d105e6 100644
--- a/pkg/front_end/parser_testcases/primary_constructors/factory_new.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/primary_constructors/factory_new.dart.intertwined.expect
@@ -33,8 +33,8 @@
                 listener: beginMetadataStar(external)
                 listener: endMetadataStar(0)
               listener: beginMember()
-              parseFactoryMethod(external, DeclarationKind.Class, {, external, null, null, true)
-                listener: beginFactory(DeclarationKind.Class, {, external, null)
+              parseFactoryMethod(external, DeclarationKind.Class, {, null, external, null, null, true)
+                listener: beginFactory(DeclarationKind.Class, {, null, external, null)
                 reportRecoverableError(new, FactoryConstructorNewName)
                   listener: handleRecoverableError(FactoryConstructorNewName, new, new)
                 listener: handleIdentifier(new, methodDeclaration)
@@ -58,8 +58,8 @@
                 listener: beginMetadataStar(external)
                 listener: endMetadataStar(0)
               listener: beginMember()
-              parseFactoryMethod(const, DeclarationKind.Class, ;, external, null, const, true)
-                listener: beginFactory(DeclarationKind.Class, ;, external, const)
+              parseFactoryMethod(const, DeclarationKind.Class, ;, null, external, null, const, true)
+                listener: beginFactory(DeclarationKind.Class, ;, null, external, const)
                 reportRecoverableError(new, FactoryConstructorNewName)
                   listener: handleRecoverableError(FactoryConstructorNewName, new, new)
                 listener: handleIdentifier(new, methodDeclaration)
@@ -83,8 +83,8 @@
                 listener: beginMetadataStar(factory)
                 listener: endMetadataStar(0)
               listener: beginMember()
-              parseFactoryMethod(;, DeclarationKind.Class, ;, null, null, null, true)
-                listener: beginFactory(DeclarationKind.Class, ;, null, null)
+              parseFactoryMethod(;, DeclarationKind.Class, ;, null, null, null, null, true)
+                listener: beginFactory(DeclarationKind.Class, ;, null, null, null)
                 reportRecoverableError(new, FactoryConstructorNewName)
                   listener: handleRecoverableError(FactoryConstructorNewName, new, new)
                 listener: handleIdentifier(new, methodDeclaration)
@@ -119,8 +119,8 @@
                 listener: beginMetadataStar(const)
                 listener: endMetadataStar(0)
               listener: beginMember()
-              parseFactoryMethod(const, DeclarationKind.Class, ;, null, null, const, true)
-                listener: beginFactory(DeclarationKind.Class, ;, null, const)
+              parseFactoryMethod(const, DeclarationKind.Class, ;, null, null, null, const, true)
+                listener: beginFactory(DeclarationKind.Class, ;, null, null, const)
                 reportRecoverableError(new, FactoryConstructorNewName)
                   listener: handleRecoverableError(FactoryConstructorNewName, new, new)
                 listener: handleIdentifier(new, methodDeclaration)
@@ -156,8 +156,8 @@
                 listener: beginMetadataStar(factory)
                 listener: endMetadataStar(0)
               listener: beginMember()
-              parseFactoryMethod(;, DeclarationKind.Class, ;, null, null, null, true)
-                listener: beginFactory(DeclarationKind.Class, ;, null, null)
+              parseFactoryMethod(;, DeclarationKind.Class, ;, null, null, null, null, true)
+                listener: beginFactory(DeclarationKind.Class, ;, null, null, null)
                 reportRecoverableError(new, FactoryConstructorNewName)
                   listener: handleRecoverableError(FactoryConstructorNewName, new, new)
                 listener: handleIdentifier(new, methodDeclaration)
@@ -191,8 +191,8 @@
                 listener: beginMetadataStar(const)
                 listener: endMetadataStar(0)
               listener: beginMember()
-              parseFactoryMethod(const, DeclarationKind.Class, ;, null, null, const, true)
-                listener: beginFactory(DeclarationKind.Class, ;, null, const)
+              parseFactoryMethod(const, DeclarationKind.Class, ;, null, null, null, const, true)
+                listener: beginFactory(DeclarationKind.Class, ;, null, null, const)
                 reportRecoverableError(new, FactoryConstructorNewName)
                   listener: handleRecoverableError(FactoryConstructorNewName, new, new)
                 listener: handleIdentifier(new, methodDeclaration)
@@ -226,8 +226,8 @@
                 listener: beginMetadataStar(external)
                 listener: endMetadataStar(0)
               listener: beginMember()
-              parseFactoryMethod(external, DeclarationKind.Class, ;, external, null, null, true)
-                listener: beginFactory(DeclarationKind.Class, ;, external, null)
+              parseFactoryMethod(external, DeclarationKind.Class, ;, null, external, null, null, true)
+                listener: beginFactory(DeclarationKind.Class, ;, null, external, null)
                 ensureIdentifier(factory, methodDeclaration)
                   reportRecoverableErrorWithToken(new, Template(ExpectedIdentifierButGotKeyword))
                     listener: handleRecoverableError(Message[Template(ExpectedIdentifierButGotKeyword), 'new' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: new}], new, new)
@@ -257,8 +257,8 @@
                 listener: beginMetadataStar(external)
                 listener: endMetadataStar(0)
               listener: beginMember()
-              parseFactoryMethod(const, DeclarationKind.Class, ;, external, null, const, true)
-                listener: beginFactory(DeclarationKind.Class, ;, external, const)
+              parseFactoryMethod(const, DeclarationKind.Class, ;, null, external, null, const, true)
+                listener: beginFactory(DeclarationKind.Class, ;, null, external, const)
                 ensureIdentifier(factory, methodDeclaration)
                   reportRecoverableErrorWithToken(new, Template(ExpectedIdentifierButGotKeyword))
                     listener: handleRecoverableError(Message[Template(ExpectedIdentifierButGotKeyword), 'new' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: new}], new, new)
@@ -288,8 +288,8 @@
                 listener: beginMetadataStar(factory)
                 listener: endMetadataStar(0)
               listener: beginMember()
-              parseFactoryMethod(;, DeclarationKind.Class, ;, null, null, null, true)
-                listener: beginFactory(DeclarationKind.Class, ;, null, null)
+              parseFactoryMethod(;, DeclarationKind.Class, ;, null, null, null, null, true)
+                listener: beginFactory(DeclarationKind.Class, ;, null, null, null)
                 ensureIdentifier(factory, methodDeclaration)
                   reportRecoverableErrorWithToken(new, Template(ExpectedIdentifierButGotKeyword))
                     listener: handleRecoverableError(Message[Template(ExpectedIdentifierButGotKeyword), 'new' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: new}], new, new)
@@ -330,8 +330,8 @@
                 listener: beginMetadataStar(const)
                 listener: endMetadataStar(0)
               listener: beginMember()
-              parseFactoryMethod(const, DeclarationKind.Class, ;, null, null, const, true)
-                listener: beginFactory(DeclarationKind.Class, ;, null, const)
+              parseFactoryMethod(const, DeclarationKind.Class, ;, null, null, null, const, true)
+                listener: beginFactory(DeclarationKind.Class, ;, null, null, const)
                 ensureIdentifier(factory, methodDeclaration)
                   reportRecoverableErrorWithToken(new, Template(ExpectedIdentifierButGotKeyword))
                     listener: handleRecoverableError(Message[Template(ExpectedIdentifierButGotKeyword), 'new' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: new}], new, new)
@@ -373,8 +373,8 @@
                 listener: beginMetadataStar(factory)
                 listener: endMetadataStar(0)
               listener: beginMember()
-              parseFactoryMethod(;, DeclarationKind.Class, ;, null, null, null, true)
-                listener: beginFactory(DeclarationKind.Class, ;, null, null)
+              parseFactoryMethod(;, DeclarationKind.Class, ;, null, null, null, null, true)
+                listener: beginFactory(DeclarationKind.Class, ;, null, null, null)
                 ensureIdentifier(factory, methodDeclaration)
                   reportRecoverableErrorWithToken(new, Template(ExpectedIdentifierButGotKeyword))
                     listener: handleRecoverableError(Message[Template(ExpectedIdentifierButGotKeyword), 'new' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: new}], new, new)
@@ -414,8 +414,8 @@
                 listener: beginMetadataStar(const)
                 listener: endMetadataStar(0)
               listener: beginMember()
-              parseFactoryMethod(const, DeclarationKind.Class, ;, null, null, const, true)
-                listener: beginFactory(DeclarationKind.Class, ;, null, const)
+              parseFactoryMethod(const, DeclarationKind.Class, ;, null, null, null, const, true)
+                listener: beginFactory(DeclarationKind.Class, ;, null, null, const)
                 ensureIdentifier(factory, methodDeclaration)
                   reportRecoverableErrorWithToken(new, Template(ExpectedIdentifierButGotKeyword))
                     listener: handleRecoverableError(Message[Template(ExpectedIdentifierButGotKeyword), 'new' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: new}], new, new)
diff --git a/pkg/front_end/test/dart_scope_calculator_test.dart b/pkg/front_end/test/dart_scope_calculator_test.dart
index 89824ef..5558d3f 100644
--- a/pkg/front_end/test/dart_scope_calculator_test.dart
+++ b/pkg/front_end/test/dart_scope_calculator_test.dart
@@ -4,6 +4,7 @@
 
 import 'dart:io';
 
+import 'package:front_end/src/api_prototype/lowering_predicates.dart';
 import 'package:kernel/ast.dart';
 import 'package:kernel/binary/ast_from_binary.dart';
 import 'package:kernel/binary/ast_to_binary.dart';
@@ -386,6 +387,11 @@
             // A wildcard variable doesn't really exist so we'll ignore it,
             // see https://github.com/dart-lang/sdk/issues/60841.
           } else {
+            // The scope calculator renames late lowered local names, so we have
+            // to expect the same here.
+            if (variable.isLowered && isLateLoweredLocalName(name)) {
+              name = extractLocalNameFromLateLoweredLocal(name);
+            }
             expectedVariablesMap[name] = variable.type;
           }
         }
diff --git a/pkg/front_end/test/generator_to_string_test.dart b/pkg/front_end/test/generator_to_string_test.dart
index 689827a..28c892d 100644
--- a/pkg/front_end/test/generator_to_string_test.dart
+++ b/pkg/front_end/test/generator_to_string_test.dart
@@ -257,7 +257,12 @@
     );
     check(
       "ThisPropertyAccessGenerator(offset: 4, name: bar)",
-      new ThisPropertyAccessGenerator(helper, token, name),
+      new ThisPropertyAccessGenerator(
+        helper,
+        token,
+        name,
+        isThisExplicit: false,
+      ),
     );
     check(
       "NullAwarePropertyAccessGenerator(offset: 4,"
@@ -300,6 +305,7 @@
         getter,
         null,
         setter,
+        isQualifiedAccess: true,
       ),
     );
     check(
diff --git a/pkg/front_end/test/id_tests/definite_assignment_test.dart b/pkg/front_end/test/id_tests/definite_assignment_test.dart
index e2ae596..28de773 100644
--- a/pkg/front_end/test/id_tests/definite_assignment_test.dart
+++ b/pkg/front_end/test/id_tests/definite_assignment_test.dart
@@ -6,7 +6,6 @@
 
 import 'package:_fe_analyzer_shared/src/testing/id.dart' show ActualData, Id;
 import 'package:_fe_analyzer_shared/src/testing/id_testing.dart';
-import 'package:front_end/src/source/source_loader.dart';
 import 'package:front_end/src/source/source_member_builder.dart';
 import 'package:front_end/src/testing/id_testing_helper.dart';
 import 'package:front_end/src/testing/id_testing_utils.dart';
@@ -66,22 +65,18 @@
 }
 
 class DefiniteAssignmentDataExtractor extends CfeDataExtractor<String> {
-  final SourceLoaderDataForTesting _sourceLoaderDataForTesting;
   final FlowAnalysisResult _flowResult;
 
   DefiniteAssignmentDataExtractor(
     InternalCompilerResult compilerResult,
     Map<Id, ActualData<String>> actualMap,
     this._flowResult,
-  ) : _sourceLoaderDataForTesting =
-          compilerResult.kernelTargetForTesting!.loader.dataForTesting!,
-      super(compilerResult, actualMap);
+  ) : super(compilerResult, actualMap);
 
   @override
   String? computeNodeValue(Id id, TreeNode node) {
     if (node is VariableGet) {
-      TreeNode alias = _sourceLoaderDataForTesting.toOriginal(node);
-      if (_flowResult.potentiallyUnassignedNodes.contains(alias)) {
+      if (_flowResult.potentiallyUnassignedNodes.contains(node)) {
         return 'unassigned';
       }
     }
diff --git a/pkg/front_end/test/id_tests/definite_unassignment_test.dart b/pkg/front_end/test/id_tests/definite_unassignment_test.dart
index 377d1b0..a862e1b 100644
--- a/pkg/front_end/test/id_tests/definite_unassignment_test.dart
+++ b/pkg/front_end/test/id_tests/definite_unassignment_test.dart
@@ -6,7 +6,6 @@
 
 import 'package:_fe_analyzer_shared/src/testing/id.dart' show ActualData, Id;
 import 'package:_fe_analyzer_shared/src/testing/id_testing.dart';
-import 'package:front_end/src/source/source_loader.dart';
 import 'package:front_end/src/source/source_member_builder.dart';
 import 'package:front_end/src/testing/id_testing_helper.dart';
 import 'package:front_end/src/testing/id_testing_utils.dart';
@@ -66,22 +65,18 @@
 }
 
 class DefiniteUnassignmentDataExtractor extends CfeDataExtractor<String> {
-  final SourceLoaderDataForTesting _sourceLoaderDataForTesting;
   final FlowAnalysisResult _flowResult;
 
   DefiniteUnassignmentDataExtractor(
     InternalCompilerResult compilerResult,
     Map<Id, ActualData<String>> actualMap,
     this._flowResult,
-  ) : _sourceLoaderDataForTesting =
-          compilerResult.kernelTargetForTesting!.loader.dataForTesting!,
-      super(compilerResult, actualMap);
+  ) : super(compilerResult, actualMap);
 
   @override
   String? computeNodeValue(Id id, TreeNode node) {
     if (node is VariableGet) {
-      TreeNode alias = _sourceLoaderDataForTesting.toOriginal(node);
-      if (_flowResult.definitelyUnassignedNodes.contains(alias)) {
+      if (_flowResult.definitelyUnassignedNodes.contains(node)) {
         return 'unassigned';
       }
     }
diff --git a/pkg/front_end/test/parser_test_listener.dart b/pkg/front_end/test/parser_test_listener.dart
index 1e4ee4c..a7c19d1 100644
--- a/pkg/front_end/test/parser_test_listener.dart
+++ b/pkg/front_end/test/parser_test_listener.dart
@@ -975,16 +975,19 @@
   void beginFactory(
     DeclarationKind declarationKind,
     Token lastConsumed,
+    Token? augmentToken,
     Token? externalToken,
     Token? constToken,
   ) {
     seen(lastConsumed);
+    seen(augmentToken);
     seen(externalToken);
     seen(constToken);
     doPrint(
       'beginFactory('
       '$declarationKind, '
       '$lastConsumed, '
+      '$augmentToken, '
       '$externalToken, '
       '$constToken)',
     );
diff --git a/pkg/front_end/test/parser_test_parser.dart b/pkg/front_end/test/parser_test_parser.dart
index c80042e..0d45388 100644
--- a/pkg/front_end/test/parser_test_parser.dart
+++ b/pkg/front_end/test/parser_test_parser.dart
@@ -1941,6 +1941,7 @@
     Token token,
     DeclarationKind kind,
     Token beforeStart,
+    Token? augmentToken,
     Token? externalToken,
     Token? staticOrCovariant,
     Token? varFinalOrConst,
@@ -1951,6 +1952,7 @@
       '$token, '
       '$kind, '
       '$beforeStart, '
+      '$augmentToken, '
       '$externalToken, '
       '$staticOrCovariant, '
       '$varFinalOrConst, '
@@ -1961,6 +1963,7 @@
       token,
       kind,
       beforeStart,
+      augmentToken,
       externalToken,
       staticOrCovariant,
       varFinalOrConst,
diff --git a/pkg/front_end/test/scanner_cfe_test.dart b/pkg/front_end/test/scanner_cfe_test.dart
index 1f1f0b9..c4b37d9 100644
--- a/pkg/front_end/test/scanner_cfe_test.dart
+++ b/pkg/front_end/test/scanner_cfe_test.dart
@@ -5,7 +5,6 @@
 import 'dart:convert';
 import 'dart:typed_data' show Uint8List;
 
-import 'package:_fe_analyzer_shared/src/base/errors.dart';
 import 'package:_fe_analyzer_shared/src/scanner/error_token.dart';
 import 'package:_fe_analyzer_shared/src/scanner/scanner.dart'
     as usedForFuzzTesting;
@@ -13,6 +12,7 @@
 import 'package:_fe_analyzer_shared/src/scanner/token.dart';
 import 'package:_fe_analyzer_shared/src/scanner/token_constants.dart';
 import 'package:analyzer/src/dart/scanner/translate_error_token.dart';
+import 'package:analyzer/src/diagnostic/diagnostic.dart' show LocatedDiagnostic;
 import 'package:analyzer/src/diagnostic/diagnostic.dart' as diag;
 import 'package:front_end/src/codes/diagnostic.dart' as fe_diag;
 import 'package:test/test.dart';
diff --git a/pkg/front_end/test/scanner_replacement_test.dart b/pkg/front_end/test/scanner_replacement_test.dart
index 82999e3..7693a92 100644
--- a/pkg/front_end/test/scanner_replacement_test.dart
+++ b/pkg/front_end/test/scanner_replacement_test.dart
@@ -2,12 +2,12 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:_fe_analyzer_shared/src/base/errors.dart';
 import 'package:_fe_analyzer_shared/src/scanner/error_token.dart';
 import 'package:_fe_analyzer_shared/src/scanner/scanner.dart';
 import 'package:_fe_analyzer_shared/src/scanner/token.dart';
 import 'package:analyzer/src/dart/scanner/translate_error_token.dart'
     show translateErrorToken;
+import 'package:analyzer/src/diagnostic/diagnostic.dart' show LocatedDiagnostic;
 import 'package:analyzer/src/diagnostic/diagnostic.dart' as diag;
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
diff --git a/pkg/front_end/test/static_types/data/null_aware_for_in.dart b/pkg/front_end/test/static_types/data/null_aware_for_in.dart
index 6697bcb..8776f5a 100644
--- a/pkg/front_end/test/static_types/data/null_aware_for_in.dart
+++ b/pkg/front_end/test/static_types/data/null_aware_for_in.dart
@@ -7,10 +7,9 @@
 main() {
   var o;
   /*current: dynamic*/
-  /*as: Class!*/
   for (
   // ignore: UNUSED_LOCAL_VARIABLE
-  Class c
+  Class /*as: Class!*/ c
       in
       /*as: Iterable<dynamic>!*/
       /*dynamic|dynamic*/ o?. /*dynamic*/ iterable) {}
diff --git a/pkg/front_end/test/static_types/static_type_test.dart b/pkg/front_end/test/static_types/static_type_test.dart
index c70c77a..b2355eb 100644
--- a/pkg/front_end/test/static_types/static_type_test.dart
+++ b/pkg/front_end/test/static_types/static_type_test.dart
@@ -158,7 +158,11 @@
       isThrowReachabilityError(object) ||
       isNewReachabilityErrorArgument(object) ||
       isNewReachabilityError(object) ||
-      object is BlockExpression;
+      object is BlockExpression ||
+      (object is NullLiteral &&
+          // Skip implicit initializers/default values.
+          (object.parent is VariableDeclaration || object.parent is Field) &&
+          object.fileOffset == object.parent?.fileOffset);
 
   @override
   ActualData<String> mergeData(
diff --git a/pkg/front_end/test/static_types/type_arguments_test.dart b/pkg/front_end/test/static_types/type_arguments_test.dart
index 3a80246..8fc3bd8 100644
--- a/pkg/front_end/test/static_types/type_arguments_test.dart
+++ b/pkg/front_end/test/static_types/type_arguments_test.dart
@@ -70,7 +70,7 @@
           uri: astUri,
         );
         InterfaceType variableInitializationType = interface
-            .createInterfaceType('VariableInitializationBase', uri: astUri);
+            .createInterfaceType('VariableDeclaration', uri: astUri);
         DartType typeArgument = receiver.arguments.types.single;
         if (interface.isSubtypeOf(typeArgument, expressionType) &&
             typeArgument != expressionType) {
diff --git a/pkg/front_end/test/text_representation/internal_ast_text_representation_test.dart b/pkg/front_end/test/text_representation/internal_ast_text_representation_test.dart
index f0970f1..8cb4f904 100644
--- a/pkg/front_end/test/text_representation/internal_ast_text_representation_test.dart
+++ b/pkg/front_end/test/text_representation/internal_ast_text_representation_test.dart
@@ -123,7 +123,7 @@
   ) async {
     _testVariableDeclarations();
     _testTryStatement();
-    _testForInStatementWithSynthesizedVariable();
+    _testInternalForInStatement();
     _testSwitchCaseImpl();
     _testBreakStatementImpl();
     _testCascade();
@@ -344,8 +344,222 @@
   );
 }
 
-void _testForInStatementWithSynthesizedVariable() {
-  // TODO(johnniwinther): Test ForInStatementWithSynthesizedVariable
+void _testInternalForInStatement() {
+  testStatement(
+    new InternalForInStatement(
+      new SingleVariableDeclarationForInElement(
+        variableDeclaration: new VariableDeclarationImpl('e', fileOffset: -1),
+        error: null,
+      ),
+      new NullLiteral(),
+      new Block([]),
+      isAsync: false,
+      fileOffset: -1,
+      bodyOffset: -1,
+    ),
+    '''
+for (var e in null) {}''',
+  );
+
+  testStatement(
+    new InternalForInStatement(
+      new SingleVariableDeclarationForInElement(
+        variableDeclaration: new VariableDeclarationImpl(
+          'e',
+          type: const VoidType(),
+          fileOffset: -1,
+        ),
+        error: null,
+      ),
+      new NullLiteral(),
+      new Block([]),
+      isAsync: false,
+      fileOffset: -1,
+      bodyOffset: -1,
+    ),
+    '''
+for (void e in null) {}''',
+  );
+
+  testStatement(
+    new InternalForInStatement(
+      new PatternForInElement(
+        pattern: new RecordPattern([
+          new VariablePattern(
+            const VoidType(),
+            new VariableDeclarationImpl('a', fileOffset: -1),
+          ),
+          new VariablePattern(
+            null,
+            new VariableDeclarationImpl('b', fileOffset: -1),
+          ),
+        ]),
+        inOffset: -1,
+      ),
+      new NullLiteral(),
+      new Block([]),
+      isAsync: false,
+      fileOffset: -1,
+      bodyOffset: -1,
+    ),
+    '''
+for (var (void a, var b) in null) {}''',
+  );
+
+  testStatement(
+    new InternalForInStatement(
+      new ExistingVariableForInElement(
+        variable: new VariableDeclarationImpl('a', fileOffset: -1),
+        nameOffset: -1,
+        inOffset: -1,
+      ),
+      new NullLiteral(),
+      new Block([]),
+      isAsync: false,
+      fileOffset: -1,
+      bodyOffset: -1,
+    ),
+    '''
+for (a in null) {}''',
+  );
+
+  // TODO(johnniwinther,cstefantsova): Test toTextInternal for
+  //  [VariableInitializationForInElement].
+
+  testStatement(
+    new InternalForInStatement(
+      new InvalidForInElement(
+        error: new InvalidExpression('error'),
+        inOffset: -1,
+      ),
+      new NullLiteral(),
+      new Block([]),
+      isAsync: false,
+      fileOffset: -1,
+      bodyOffset: -1,
+    ),
+    '''
+for (<invalid:error> in null) {}''',
+  );
+
+  testStatement(
+    new InternalForInStatement(
+      new StaticForInElement(
+        target: new Field.mutable(new Name('a'), fileUri: dummyUri),
+        nameOffset: -1,
+        inOffset: -1,
+      ),
+      new NullLiteral(),
+      new Block([]),
+      isAsync: false,
+      fileOffset: -1,
+      bodyOffset: -1,
+    ),
+    '''
+for (a in null) {}''',
+  );
+
+  testStatement(
+    new InternalForInStatement(
+      new PropertyForInElement(
+        receiver: new ThisExpression(),
+        name: new Name('a'),
+        nameOffset: -1,
+        inOffset: -1,
+      ),
+      new NullLiteral(),
+      new Block([]),
+      isAsync: false,
+      fileOffset: -1,
+      bodyOffset: -1,
+    ),
+    '''
+for (a in null) {}''',
+  );
+
+  testStatement(
+    new InternalForInStatement(
+      new UnassignableForInElement(
+        expression: new NullLiteral(),
+        error: new InvalidExpression('error'),
+      ),
+      new NullLiteral(),
+      new Block([]),
+      isAsync: false,
+      fileOffset: -1,
+      bodyOffset: -1,
+    ),
+    '''
+for (null in null) {}''',
+  );
+
+  testStatement(
+    new InternalForInStatement(
+      new MultiVariableDeclarationForInElement(
+        variableDeclarations: [
+          new VariableDeclarationImpl('a', fileOffset: -1),
+          new VariableDeclarationImpl('b', fileOffset: -1),
+        ],
+        error: new InvalidExpression('error'),
+      ),
+      new NullLiteral(),
+      new Block([]),
+      isAsync: false,
+      fileOffset: -1,
+      bodyOffset: -1,
+    ),
+    '''
+for (var a, b in null) {}''',
+  );
+
+  testStatement(
+    new InternalForInStatement(
+      new MultiVariableDeclarationForInElement(
+        variableDeclarations: [
+          new VariableDeclarationImpl(
+            'a',
+            type: const VoidType(),
+            fileOffset: -1,
+          ),
+          new VariableDeclarationImpl('b', fileOffset: -1),
+        ],
+        error: new InvalidExpression('error'),
+      ),
+      new NullLiteral(),
+      new Block([]),
+      isAsync: false,
+      fileOffset: -1,
+      bodyOffset: -1,
+    ),
+    '''
+for (void a, b in null) {}''',
+  );
+
+  testStatement(
+    new InternalForInStatement(
+      new ExtensionForInElement(
+        extension: new Extension(name: 'Extension', fileUri: dummyUri),
+        thisTypeArguments: null,
+        thisAccess: new ThisExpression(),
+        name: new Name('a'),
+        setter: new Procedure(
+          new Name('Extension|a'),
+          ProcedureKind.Method,
+          new FunctionNode(null),
+          fileUri: dummyUri,
+        ),
+        nameOffset: -1,
+        inOffset: -1,
+      ),
+      new NullLiteral(),
+      new Block([]),
+      isAsync: false,
+      fileOffset: -1,
+      bodyOffset: -1,
+    ),
+    '''
+for (a in null) {}''',
+  );
 }
 
 void _testSwitchCaseImpl() {
@@ -628,8 +842,11 @@
   VariableDeclaration check = new VariableDeclaration.forValue(
     new CheckLibraryIsLoaded(dependency),
   );
-  testExpression(new DeferredCheck(check, new IntLiteral(0)), '''
-let final dynamic #0 = pre.checkLibraryIsLoaded() in 0''');
+  testExpression(
+    new DeferredCheck(check, new IntLiteral(0), fileOffset: TreeNode.noOffset),
+    '''
+let final dynamic #0 = pre.checkLibraryIsLoaded() in 0''',
+  );
 }
 
 void _testFactoryConstructorInvocation() {
@@ -956,7 +1173,7 @@
 void _testFunctionDeclarationImpl() {
   testStatement(
     new FunctionDeclarationImpl(
-      new VariableDeclarationImpl('foo'),
+      new VariableDeclarationImpl('foo', fileOffset: TreeNode.noOffset),
       new FunctionNode(new Block([])),
     ),
     '''
@@ -970,10 +1187,16 @@
 }
 
 void _testIntLiterals() {
-  testExpression(new IntJudgment(0, null), '0');
-  testExpression(new IntJudgment(0, 'foo'), 'foo');
   testExpression(
-    new ShadowLargeIntLiteral('bar', 'bar', TreeNode.noOffset),
+    new InternalIntLiteral(0, null, fileOffset: TreeNode.noOffset),
+    '0',
+  );
+  testExpression(
+    new InternalIntLiteral(0, 'foo', fileOffset: TreeNode.noOffset),
+    'foo',
+  );
+  testExpression(
+    new LargeIntLiteral('bar', 'bar', fileOffset: TreeNode.noOffset),
     'bar',
   );
 }
@@ -1172,10 +1395,17 @@
 }
 
 void _testVariableDeclarationImpl() {
-  testStatement(new VariableDeclarationImpl('foo'), '''
-dynamic foo;''');
   testStatement(
-    new VariableDeclarationImpl('foo', initializer: new IntLiteral(0)),
+    new VariableDeclarationImpl('foo', fileOffset: TreeNode.noOffset),
+    '''
+dynamic foo;''',
+  );
+  testStatement(
+    new VariableDeclarationImpl(
+      'foo',
+      initializer: new IntLiteral(0),
+      fileOffset: TreeNode.noOffset,
+    ),
     '''
 dynamic foo = 0;''',
   );
@@ -1186,6 +1416,7 @@
       initializer: new IntLiteral(0),
       isFinal: true,
       isRequired: true,
+      fileOffset: TreeNode.noOffset,
     ),
     '''
 required final void foo;''',
@@ -1196,26 +1427,36 @@
       type: const VoidType(),
       initializer: new IntLiteral(0),
       isLate: true,
+      fileOffset: TreeNode.noOffset,
     ),
     '''
 late void foo = 0;''',
   );
   testStatement(
     new VariableDeclarationImpl(
-      'foo',
-      type: const VoidType(),
-      initializer: new IntLiteral(0),
-    )..lateGetter = new VariableDeclarationImpl('foo#getter'),
-    '''
-late void foo = 0;''',
-  );
-  testStatement(
-    new VariableDeclarationImpl(
         'foo',
         type: const VoidType(),
         initializer: new IntLiteral(0),
+        fileOffset: TreeNode.noOffset,
       )
-      ..lateGetter = new VariableDeclarationImpl('foo#getter')
+      ..lateGetter = new VariableDeclarationImpl(
+        'foo#getter',
+        fileOffset: TreeNode.noOffset,
+      ),
+    '''
+late void foo = 0;''',
+  );
+  testStatement(
+    new VariableDeclarationImpl(
+        'foo',
+        type: const VoidType(),
+        initializer: new IntLiteral(0),
+        fileOffset: TreeNode.noOffset,
+      )
+      ..lateGetter = new VariableDeclarationImpl(
+        'foo#getter',
+        fileOffset: TreeNode.noOffset,
+      )
       ..lateType = const DynamicType(),
     '''
 late dynamic foo = 0;''',
@@ -1632,7 +1873,10 @@
 }
 
 void _testLocalIncDec() {
-  VariableDeclarationImpl variable = new VariableDeclarationImpl('foo');
+  VariableDeclarationImpl variable = new VariableDeclarationImpl(
+    'foo',
+    fileOffset: TreeNode.noOffset,
+  );
 
   testExpression(
     new LocalIncDec(
diff --git a/pkg/front_end/test/text_representation/text_representation_test.dart b/pkg/front_end/test/text_representation/text_representation_test.dart
index eb2c247..0385bf1 100644
--- a/pkg/front_end/test/text_representation/text_representation_test.dart
+++ b/pkg/front_end/test/text_representation/text_representation_test.dart
@@ -193,4 +193,21 @@
     }
     return null;
   }
+
+  @override
+  ActualData<String>? mergeData(
+    ActualData<String> value1,
+    ActualData<String> value2,
+  ) {
+    // Prefer [VariableDeclaration] over [ConstantExpression]. This is done to
+    // avoid conflict between a parameter and its implicit initializer.
+    if (value1.object is ConstantExpression &&
+        value2.object is VariableDeclaration) {
+      return value2;
+    } else if (value2.object is ConstantExpression &&
+        value1.object is VariableDeclaration) {
+      return value1;
+    }
+    return super.mergeData(value1, value2);
+  }
 }
diff --git a/pkg/front_end/testcases/closure_context_lowering/synthetic_variables.dart.strong.expect b/pkg/front_end/testcases/closure_context_lowering/synthetic_variables.dart.strong.expect
index c461791..2d4352e 100644
--- a/pkg/front_end/testcases/closure_context_lowering/synthetic_variables.dart.strong.expect
+++ b/pkg/front_end/testcases/closure_context_lowering/synthetic_variables.dart.strong.expect
@@ -6,9 +6,17 @@
   #ctx1: not-captured VariableContext([
     positional-parameter list;
   ]),
+] */ /* scope=[
+  #ctx2: not-captured VariableContext([
+    local-variable s;
+  ]),
 ] */ {
   s := "";
-  for (synthetic-variable #t1 in list) {
+  for /* scope=[
+    #ctx3: not-captured VariableContext([
+      SyntheticVariable
+    ]),
+  ] */ (synthetic-variable #t1 in list) {
     s = #t1;
     if(s.{core::String::isNotEmpty}{core::bool}) {
       return s;
diff --git a/pkg/front_end/testcases/closure_context_lowering/synthetic_variables.dart.strong.modular.expect b/pkg/front_end/testcases/closure_context_lowering/synthetic_variables.dart.strong.modular.expect
index c461791..2d4352e 100644
--- a/pkg/front_end/testcases/closure_context_lowering/synthetic_variables.dart.strong.modular.expect
+++ b/pkg/front_end/testcases/closure_context_lowering/synthetic_variables.dart.strong.modular.expect
@@ -6,9 +6,17 @@
   #ctx1: not-captured VariableContext([
     positional-parameter list;
   ]),
+] */ /* scope=[
+  #ctx2: not-captured VariableContext([
+    local-variable s;
+  ]),
 ] */ {
   s := "";
-  for (synthetic-variable #t1 in list) {
+  for /* scope=[
+    #ctx3: not-captured VariableContext([
+      SyntheticVariable
+    ]),
+  ] */ (synthetic-variable #t1 in list) {
     s = #t1;
     if(s.{core::String::isNotEmpty}{core::bool}) {
       return s;
diff --git a/pkg/front_end/testcases/constructor_tearoffs/lowering/inferred_non_proper_rename.dart.strong.outline.expect b/pkg/front_end/testcases/constructor_tearoffs/lowering/inferred_non_proper_rename.dart.strong.outline.expect
index 4f62a19..6c45b91 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/lowering/inferred_non_proper_rename.dart.strong.outline.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/lowering/inferred_non_proper_rename.dart.strong.outline.expect
@@ -64,17 +64,17 @@
 Extra constant evaluation status:
 Evaluated: Instantiation @ org-dartlang-testcase:///inferred_non_proper_rename.dart:17:13 -> InstantiationConstant(A._#new#tearOff<int>)
 Evaluated: Instantiation @ org-dartlang-testcase:///inferred_non_proper_rename.dart:18:13 -> InstantiationConstant(A._#new#tearOff<int>)
-Evaluated: Instantiation @ org-dartlang-testcase:///inferred_non_proper_rename.dart:19:25 -> InstantiationConstant(A._#new#tearOff<int>)
+Evaluated: Instantiation @ org-dartlang-testcase:///inferred_non_proper_rename.dart:19:31 -> InstantiationConstant(A._#new#tearOff<int>)
 Evaluated: Instantiation @ org-dartlang-testcase:///inferred_non_proper_rename.dart:20:13 -> InstantiationConstant(A._#fact#tearOff<int>)
 Evaluated: Instantiation @ org-dartlang-testcase:///inferred_non_proper_rename.dart:21:13 -> InstantiationConstant(A._#fact#tearOff<int>)
-Evaluated: Instantiation @ org-dartlang-testcase:///inferred_non_proper_rename.dart:22:25 -> InstantiationConstant(A._#fact#tearOff<int>)
+Evaluated: Instantiation @ org-dartlang-testcase:///inferred_non_proper_rename.dart:22:31 -> InstantiationConstant(A._#fact#tearOff<int>)
 Evaluated: Instantiation @ org-dartlang-testcase:///inferred_non_proper_rename.dart:23:13 -> InstantiationConstant(A._#redirect#tearOff<int>)
 Evaluated: Instantiation @ org-dartlang-testcase:///inferred_non_proper_rename.dart:24:13 -> InstantiationConstant(A._#redirect#tearOff<int>)
-Evaluated: Instantiation @ org-dartlang-testcase:///inferred_non_proper_rename.dart:25:25 -> InstantiationConstant(A._#redirect#tearOff<int>)
+Evaluated: Instantiation @ org-dartlang-testcase:///inferred_non_proper_rename.dart:25:31 -> InstantiationConstant(A._#redirect#tearOff<int>)
 Evaluated: Instantiation @ org-dartlang-testcase:///inferred_non_proper_rename.dart:27:13 -> InstantiationConstant(A._#new#tearOff<int>)
 Evaluated: Instantiation @ org-dartlang-testcase:///inferred_non_proper_rename.dart:28:13 -> InstantiationConstant(A._#new#tearOff<int>)
-Evaluated: Instantiation @ org-dartlang-testcase:///inferred_non_proper_rename.dart:29:25 -> InstantiationConstant(A._#new#tearOff<int>)
+Evaluated: Instantiation @ org-dartlang-testcase:///inferred_non_proper_rename.dart:29:31 -> InstantiationConstant(A._#new#tearOff<int>)
 Evaluated: Instantiation @ org-dartlang-testcase:///inferred_non_proper_rename.dart:31:13 -> InstantiationConstant(A._#new#tearOff<int>)
 Evaluated: Instantiation @ org-dartlang-testcase:///inferred_non_proper_rename.dart:32:13 -> InstantiationConstant(A._#new#tearOff<int>)
-Evaluated: Instantiation @ org-dartlang-testcase:///inferred_non_proper_rename.dart:33:25 -> InstantiationConstant(A._#new#tearOff<int>)
+Evaluated: Instantiation @ org-dartlang-testcase:///inferred_non_proper_rename.dart:33:31 -> InstantiationConstant(A._#new#tearOff<int>)
 Extra constant evaluation: evaluated: 28, effectively constant: 15
diff --git a/pkg/front_end/testcases/coverage/from_co19/for_syntax_t09.dart.strong.expect b/pkg/front_end/testcases/coverage/from_co19/for_syntax_t09.dart.strong.expect
index 16cc633..25243fe 100644
--- a/pkg/front_end/testcases/coverage/from_co19/for_syntax_t09.dart.strong.expect
+++ b/pkg/front_end/testcases/coverage/from_co19/for_syntax_t09.dart.strong.expect
@@ -14,15 +14,12 @@
 import "dart:core" as core;
 
 static method foo() → void {
+  #L1:
   {
     invalid-expression "pkg/front_end/testcases/coverage/from_co19/for_syntax_t09.dart:9:5: Error: A for-in loop can't have more than one loop variable.
     var x, // Error
     ^^^";
-    #L1:
     for (final core::String #t1 in core::List::filled<core::String>(10, "")) {
-      invalid-expression "pkg/front_end/testcases/coverage/from_co19/for_syntax_t09.dart:9:5: Error: A for-in loop can't have more than one loop variable.
-    var x, // Error
-    ^^^";
       dynamic x;
       dynamic y;
       break #L1;
diff --git a/pkg/front_end/testcases/coverage/from_co19/for_syntax_t09.dart.strong.modular.expect b/pkg/front_end/testcases/coverage/from_co19/for_syntax_t09.dart.strong.modular.expect
index 16cc633..25243fe 100644
--- a/pkg/front_end/testcases/coverage/from_co19/for_syntax_t09.dart.strong.modular.expect
+++ b/pkg/front_end/testcases/coverage/from_co19/for_syntax_t09.dart.strong.modular.expect
@@ -14,15 +14,12 @@
 import "dart:core" as core;
 
 static method foo() → void {
+  #L1:
   {
     invalid-expression "pkg/front_end/testcases/coverage/from_co19/for_syntax_t09.dart:9:5: Error: A for-in loop can't have more than one loop variable.
     var x, // Error
     ^^^";
-    #L1:
     for (final core::String #t1 in core::List::filled<core::String>(10, "")) {
-      invalid-expression "pkg/front_end/testcases/coverage/from_co19/for_syntax_t09.dart:9:5: Error: A for-in loop can't have more than one loop variable.
-    var x, // Error
-    ^^^";
       dynamic x;
       dynamic y;
       break #L1;
diff --git a/pkg/front_end/testcases/coverage/from_co19/for_syntax_t09.dart.strong.transformed.expect b/pkg/front_end/testcases/coverage/from_co19/for_syntax_t09.dart.strong.transformed.expect
index f86ec16..d92eb66 100644
--- a/pkg/front_end/testcases/coverage/from_co19/for_syntax_t09.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/coverage/from_co19/for_syntax_t09.dart.strong.transformed.expect
@@ -14,19 +14,16 @@
 import "dart:core" as core;
 
 static method foo() → void {
+  #L1:
   {
     invalid-expression "pkg/front_end/testcases/coverage/from_co19/for_syntax_t09.dart:9:5: Error: A for-in loop can't have more than one loop variable.
     var x, // Error
     ^^^";
-    #L1:
     {
       synthesized core::Iterator<core::String> :sync-for-iterator = core::_List::filled<core::String>(10, "").{core::Iterable::iterator}{core::Iterator<core::String>};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
         final core::String #t1 = :sync-for-iterator.{core::Iterator::current}{core::String};
         {
-          invalid-expression "pkg/front_end/testcases/coverage/from_co19/for_syntax_t09.dart:9:5: Error: A for-in loop can't have more than one loop variable.
-    var x, // Error
-    ^^^";
           dynamic x;
           dynamic y;
           break #L1;
diff --git a/pkg/front_end/testcases/dart2wasm/yield.dart.strong.transformed.expect b/pkg/front_end/testcases/dart2wasm/yield.dart.strong.transformed.expect
index 7ea2824..dd0b23c 100644
--- a/pkg/front_end/testcases/dart2wasm/yield.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/dart2wasm/yield.dart.strong.transformed.expect
@@ -9,22 +9,35 @@
   yield* iterable;
 }
 static method asyncMethod(final asy::Stream<core::int> stream) → asy::Stream<core::int> {
-  final synthesized asy::StreamController<core::int> #controller = asy::StreamController::•<core::int>(sync: #C1);
+  synthesized asy::Completer<void>? #paused;
+  synthesized asy::Completer<void>? #cancelCompleter;
+  synthesized core::bool #isDone = #C1;
+  final dynamic #onCancelCallback = () → FutureOr<void> {
+    if(#isDone)
+      return #C2;
+    if(#paused == null) {
+    }
+    else {
+      #paused.{asy::Completer::complete}(#C2){([FutureOr<void>?]) → void};
+      #paused = #C2;
+    }
+    if(#cancelCompleter == null)
+      #cancelCompleter = asy::Completer::sync<void>();
+    return #cancelCompleter.{asy::Completer::future}{asy::Future<void>};
+  };
+  final dynamic #onResumeCallback = () → void
+    if(#paused == null) {
+    }
+    else {
+      #paused.{asy::Completer::complete}(#C2){([FutureOr<void>?]) → void};
+      #paused = #C2;
+    }
+;
+  final synthesized asy::StreamController<core::int> #controller = asy::StreamController::•<core::int>(sync: #C3, onCancel: #onCancelCallback, onResume: #onResumeCallback);
   final synthesized () → asy::Future<void> #body = () → asy::Future<void> async /* emittedValueType= void */ {
     void :async_temporary_0;
     void :async_temporary_1;
     dynamic :async_temporary_2;
-    synthesized asy::Completer<void>? #paused;
-    final dynamic #onCancelCallback = () → void {
-      if(#paused == null) {
-      }
-      else {
-        #paused.{asy::Completer::complete}(#C2){([FutureOr<void>?]) → void};
-        #paused = #C2;
-      }
-    };
-    #controller.{asy::StreamController::onResume} = #onCancelCallback;
-    #controller.{asy::StreamController::onCancel} = #onCancelCallback;
     {
       core::int #t1 = 0;
       core::Object #t2;
@@ -63,12 +76,20 @@
           }
         }
         on dynamic catch(final dynamic #t4, final core::StackTrace #t5) {
-          #controller.{asy::StreamController::addError}(#t4, #t5){(core::Object, [core::StackTrace?]) → void};
+          if(#cancelCompleter == null)
+            #controller.{asy::StreamController::addError}(#t4, #t5){(core::Object, [core::StackTrace?]) → void};
+          else {
+            #cancelCompleter.{asy::Completer::completeError}(#t4, #t5){(core::Object, [core::StackTrace?]) → void};
+            #cancelCompleter = #C2;
+          }
           #t4;
           #t5;
         }
       finally {
+        #isDone = #C3;
         #controller.{asy::StreamController::close}(){() → asy::Future<dynamic>};
+        if(!(#cancelCompleter == null))
+          #cancelCompleter.{asy::Completer::complete}(#C2){([FutureOr<void>?]) → void};
         #t1;
         #t2;
         #t3;
@@ -82,6 +103,7 @@
 }
 
 constants  {
-  #C1 = true
+  #C1 = false
   #C2 = null
+  #C3 = true
 }
diff --git a/pkg/front_end/testcases/extension_types/constructor_explicit_return.dart b/pkg/front_end/testcases/extension_types/constructor_explicit_return.dart
new file mode 100644
index 0000000..9f0d19a
--- /dev/null
+++ b/pkg/front_end/testcases/extension_types/constructor_explicit_return.dart
@@ -0,0 +1,32 @@
+// Copyright (c) 2026, 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.
+
+main() {
+  final a = A();
+  final v = View.a(a);
+  expect(0, v.a.value);
+}
+
+class A {
+  static int counter = 0;
+
+  final int value;
+
+  A() : value = counter++;
+}
+
+extension type View(A a) {
+  View.a(this.a) {
+    assert(() {
+      return true;
+    }());
+    return;
+  }
+}
+
+expect(expected, actual) {
+  if (expected != actual) {
+    throw 'Expected $expected, actual $actual';
+  }
+}
diff --git a/pkg/front_end/testcases/extension_types/constructor_explicit_return.dart.strong.expect b/pkg/front_end/testcases/extension_types/constructor_explicit_return.dart.strong.expect
new file mode 100644
index 0000000..3ac41aa
--- /dev/null
+++ b/pkg/front_end/testcases/extension_types/constructor_explicit_return.dart.strong.expect
@@ -0,0 +1,46 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  static field core::int counter = 0;
+  final field core::int value;
+  constructor •() → self::A
+    : self::A::value = let final core::int #t1 = self::A::counter in let final void #t2 = self::A::counter = #t1.{core::num::+}(1){(core::num) → core::int} in #t1, super core::Object::•()
+    ;
+}
+extension type View(self::A a) {
+  abstract extension-type-member representation-field get a() → self::A;
+  constructor a = self::View|constructor#a;
+  constructor tearoff a = self::View|constructor#_#a#tearOff;
+  constructor • = self::View|constructor#;
+  constructor tearoff • = self::View|constructor#_#new#tearOff;
+}
+static method main() → dynamic {
+  final self::A a = new self::A::•();
+  final self::View% /* erasure=self::A, declared=! */ v = self::View|constructor#a(a);
+  self::expect(0, (v as{Unchecked} self::A).{self::A::value}{core::int});
+}
+static extension-type-member method View|constructor#(initializing-formal self::A a) → self::View% /* erasure=self::A, declared=! */ {
+  lowered final self::View% /* erasure=self::A, declared=! */ #this = a;
+  return #this;
+}
+static extension-type-member synthetic method View|constructor#_#new#tearOff(self::A a) → self::View% /* erasure=self::A, declared=! */
+  return self::View|constructor#(a);
+static extension-type-member method View|constructor#a(initializing-formal self::A a) → self::View% /* erasure=self::A, declared=! */ {
+  lowered final self::View% /* erasure=self::A, declared=! */ #this = a;
+  {
+    assert((() → core::bool {
+      return true;
+    })(){() → core::bool});
+    return #this;
+  }
+  return #this;
+}
+static extension-type-member synthetic method View|constructor#_#a#tearOff(self::A a) → self::View% /* erasure=self::A, declared=! */
+  return self::View|constructor#a(a);
+static method expect(dynamic expected, dynamic actual) → dynamic {
+  if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual)) {
+    throw "Expected ${expected}, actual ${actual}";
+  }
+}
diff --git a/pkg/front_end/testcases/extension_types/constructor_explicit_return.dart.strong.modular.expect b/pkg/front_end/testcases/extension_types/constructor_explicit_return.dart.strong.modular.expect
new file mode 100644
index 0000000..3ac41aa
--- /dev/null
+++ b/pkg/front_end/testcases/extension_types/constructor_explicit_return.dart.strong.modular.expect
@@ -0,0 +1,46 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  static field core::int counter = 0;
+  final field core::int value;
+  constructor •() → self::A
+    : self::A::value = let final core::int #t1 = self::A::counter in let final void #t2 = self::A::counter = #t1.{core::num::+}(1){(core::num) → core::int} in #t1, super core::Object::•()
+    ;
+}
+extension type View(self::A a) {
+  abstract extension-type-member representation-field get a() → self::A;
+  constructor a = self::View|constructor#a;
+  constructor tearoff a = self::View|constructor#_#a#tearOff;
+  constructor • = self::View|constructor#;
+  constructor tearoff • = self::View|constructor#_#new#tearOff;
+}
+static method main() → dynamic {
+  final self::A a = new self::A::•();
+  final self::View% /* erasure=self::A, declared=! */ v = self::View|constructor#a(a);
+  self::expect(0, (v as{Unchecked} self::A).{self::A::value}{core::int});
+}
+static extension-type-member method View|constructor#(initializing-formal self::A a) → self::View% /* erasure=self::A, declared=! */ {
+  lowered final self::View% /* erasure=self::A, declared=! */ #this = a;
+  return #this;
+}
+static extension-type-member synthetic method View|constructor#_#new#tearOff(self::A a) → self::View% /* erasure=self::A, declared=! */
+  return self::View|constructor#(a);
+static extension-type-member method View|constructor#a(initializing-formal self::A a) → self::View% /* erasure=self::A, declared=! */ {
+  lowered final self::View% /* erasure=self::A, declared=! */ #this = a;
+  {
+    assert((() → core::bool {
+      return true;
+    })(){() → core::bool});
+    return #this;
+  }
+  return #this;
+}
+static extension-type-member synthetic method View|constructor#_#a#tearOff(self::A a) → self::View% /* erasure=self::A, declared=! */
+  return self::View|constructor#a(a);
+static method expect(dynamic expected, dynamic actual) → dynamic {
+  if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual)) {
+    throw "Expected ${expected}, actual ${actual}";
+  }
+}
diff --git a/pkg/front_end/testcases/extension_types/constructor_explicit_return.dart.strong.outline.expect b/pkg/front_end/testcases/extension_types/constructor_explicit_return.dart.strong.outline.expect
new file mode 100644
index 0000000..a077c81
--- /dev/null
+++ b/pkg/front_end/testcases/extension_types/constructor_explicit_return.dart.strong.outline.expect
@@ -0,0 +1,29 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  static field core::int counter;
+  final field core::int value;
+  constructor •() → self::A
+    ;
+}
+extension type View(self::A a) {
+  abstract extension-type-member representation-field get a() → self::A;
+  constructor a = self::View|constructor#a;
+  constructor tearoff a = self::View|constructor#_#a#tearOff;
+  constructor • = self::View|constructor#;
+  constructor tearoff • = self::View|constructor#_#new#tearOff;
+}
+static method main() → dynamic
+  ;
+static extension-type-member method View|constructor#(initializing-formal self::A a) → self::View% /* erasure=self::A, declared=! */
+  ;
+static extension-type-member synthetic method View|constructor#_#new#tearOff(self::A a) → self::View% /* erasure=self::A, declared=! */
+  return self::View|constructor#(a);
+static extension-type-member method View|constructor#a(initializing-formal self::A a) → self::View% /* erasure=self::A, declared=! */
+  ;
+static extension-type-member synthetic method View|constructor#_#a#tearOff(self::A a) → self::View% /* erasure=self::A, declared=! */
+  return self::View|constructor#a(a);
+static method expect(dynamic expected, dynamic actual) → dynamic
+  ;
diff --git a/pkg/front_end/testcases/extension_types/constructor_explicit_return.dart.strong.transformed.expect b/pkg/front_end/testcases/extension_types/constructor_explicit_return.dart.strong.transformed.expect
new file mode 100644
index 0000000..3ac41aa
--- /dev/null
+++ b/pkg/front_end/testcases/extension_types/constructor_explicit_return.dart.strong.transformed.expect
@@ -0,0 +1,46 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  static field core::int counter = 0;
+  final field core::int value;
+  constructor •() → self::A
+    : self::A::value = let final core::int #t1 = self::A::counter in let final void #t2 = self::A::counter = #t1.{core::num::+}(1){(core::num) → core::int} in #t1, super core::Object::•()
+    ;
+}
+extension type View(self::A a) {
+  abstract extension-type-member representation-field get a() → self::A;
+  constructor a = self::View|constructor#a;
+  constructor tearoff a = self::View|constructor#_#a#tearOff;
+  constructor • = self::View|constructor#;
+  constructor tearoff • = self::View|constructor#_#new#tearOff;
+}
+static method main() → dynamic {
+  final self::A a = new self::A::•();
+  final self::View% /* erasure=self::A, declared=! */ v = self::View|constructor#a(a);
+  self::expect(0, (v as{Unchecked} self::A).{self::A::value}{core::int});
+}
+static extension-type-member method View|constructor#(initializing-formal self::A a) → self::View% /* erasure=self::A, declared=! */ {
+  lowered final self::View% /* erasure=self::A, declared=! */ #this = a;
+  return #this;
+}
+static extension-type-member synthetic method View|constructor#_#new#tearOff(self::A a) → self::View% /* erasure=self::A, declared=! */
+  return self::View|constructor#(a);
+static extension-type-member method View|constructor#a(initializing-formal self::A a) → self::View% /* erasure=self::A, declared=! */ {
+  lowered final self::View% /* erasure=self::A, declared=! */ #this = a;
+  {
+    assert((() → core::bool {
+      return true;
+    })(){() → core::bool});
+    return #this;
+  }
+  return #this;
+}
+static extension-type-member synthetic method View|constructor#_#a#tearOff(self::A a) → self::View% /* erasure=self::A, declared=! */
+  return self::View|constructor#a(a);
+static method expect(dynamic expected, dynamic actual) → dynamic {
+  if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual)) {
+    throw "Expected ${expected}, actual ${actual}";
+  }
+}
diff --git a/pkg/front_end/testcases/extension_types/constructor_explicit_return.dart.textual_outline.expect b/pkg/front_end/testcases/extension_types/constructor_explicit_return.dart.textual_outline.expect
new file mode 100644
index 0000000..b6e6a82
--- /dev/null
+++ b/pkg/front_end/testcases/extension_types/constructor_explicit_return.dart.textual_outline.expect
@@ -0,0 +1,13 @@
+main() {}
+
+class A {
+  static int counter = 0;
+  final int value;
+  A() : value = counter++;
+}
+
+extension type View(A a) {
+  View.a(this.a) {}
+}
+
+expect(expected, actual) {}
diff --git a/pkg/front_end/testcases/extension_types/constructor_explicit_return.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/extension_types/constructor_explicit_return.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..66a74fc
--- /dev/null
+++ b/pkg/front_end/testcases/extension_types/constructor_explicit_return.dart.textual_outline_modelled.expect
@@ -0,0 +1,13 @@
+class A {
+  A() : value = counter++;
+  final int value;
+  static int counter = 0;
+}
+
+expect(expected, actual) {}
+
+extension type View(A a) {
+  View.a(this.a) {}
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/extensions/extension_setter.dart.strong.expect b/pkg/front_end/testcases/extensions/extension_setter.dart.strong.expect
index 993dac8..8068be9 100644
--- a/pkg/front_end/testcases/extensions/extension_setter.dart.strong.expect
+++ b/pkg/front_end/testcases/extensions/extension_setter.dart.strong.expect
@@ -159,9 +159,9 @@
   self::expect(5, let final self::Class? #t56 = cn in #t56 == null ?{core::int?} null : #t56{self::Class}.{self::Class::field}{core::int});
   self::expect(6, let final self::Class #t57 = c in let final core::int #t58 = 6 in let final void #t59 = self::Extension|set#mutatingSetter(#t57, #t58) in #t58);
   self::expect(7, let final self::Class? #t60 = cn in #t60 == null ?{core::int?} null : #t60{self::Class}.{self::Class::field}{core::int});
-  let final self::Class? #t61 = cn in #t61 == null ?{void} null : self::Extension|set#setterWithReturn(#t61{self::Class}, 1);
+  let final self::Class? #t61 = cn in #t61 == null ?{core::int?} null : self::Extension|set#setterWithReturn(#t61{self::Class}, 1);
   self::expect(1, let final self::Class? #t62 = cn in #t62 == null ?{core::int?} null : #t62{self::Class}.{self::Class::field}{core::int});
-  let final self::Class? #t63 = cn in #t63 == null ?{void} null : self::Extension|set#setterWithReturn(#t63{self::Class}, 2.{core::int::unary-}(){() → core::int});
+  let final self::Class? #t63 = cn in #t63 == null ?{core::int?} null : self::Extension|set#setterWithReturn(#t63{self::Class}, 2.{core::int::unary-}(){() → core::int});
   self::expect(2, let final self::Class? #t64 = cn in #t64 == null ?{core::int?} null : #t64{self::Class}.{self::Class::field}{core::int});
   self::expect(3, let final self::Class? #t65 = cn in #t65 == null ?{core::int?} null : let final core::int #t66 = 3 in let final void #t67 = self::Extension|set#setterWithReturn(#t65{self::Class}, #t66) in #t66);
   self::expect(3, let final self::Class? #t68 = cn in #t68 == null ?{core::int?} null : #t68{self::Class}.{self::Class::field}{core::int});
@@ -175,9 +175,9 @@
   self::expect(7, let final self::Class? #t78 = cn in #t78 == null ?{core::int?} null : #t78{self::Class}.{self::Class::field}{core::int});
   self::expect(8.{core::int::unary-}(){() → core::int}, let final self::Class #t79 = c in let final core::int #t80 = 8.{core::int::unary-}(){() → core::int} in let final void #t81 = self::Extension|set#setterWithReturn(#t79, #t80) in #t80);
   self::expect(8, let final self::Class? #t82 = cn in #t82 == null ?{core::int?} null : #t82{self::Class}.{self::Class::field}{core::int});
-  let final self::Class? #t83 = cn in #t83 == null ?{void} null : self::Extension|set#setterWithClosure(#t83{self::Class}, 1);
+  let final self::Class? #t83 = cn in #t83 == null ?{core::int?} null : self::Extension|set#setterWithClosure(#t83{self::Class}, 1);
   self::expect(1, let final self::Class? #t84 = cn in #t84 == null ?{core::int?} null : #t84{self::Class}.{self::Class::field}{core::int});
-  let final self::Class? #t85 = cn in #t85 == null ?{void} null : self::Extension|set#setterWithClosure(#t85{self::Class}, 2.{core::int::unary-}(){() → core::int});
+  let final self::Class? #t85 = cn in #t85 == null ?{core::int?} null : self::Extension|set#setterWithClosure(#t85{self::Class}, 2.{core::int::unary-}(){() → core::int});
   self::expect(2, let final self::Class? #t86 = cn in #t86 == null ?{core::int?} null : #t86{self::Class}.{self::Class::field}{core::int});
   self::expect(3, let final self::Class? #t87 = cn in #t87 == null ?{core::int?} null : let final core::int #t88 = 3 in let final void #t89 = self::Extension|set#setterWithClosure(#t87{self::Class}, #t88) in #t88);
   self::expect(3, let final self::Class? #t90 = cn in #t90 == null ?{core::int?} null : #t90{self::Class}.{self::Class::field}{core::int});
diff --git a/pkg/front_end/testcases/extensions/extension_setter.dart.strong.modular.expect b/pkg/front_end/testcases/extensions/extension_setter.dart.strong.modular.expect
index 993dac8..8068be9 100644
--- a/pkg/front_end/testcases/extensions/extension_setter.dart.strong.modular.expect
+++ b/pkg/front_end/testcases/extensions/extension_setter.dart.strong.modular.expect
@@ -159,9 +159,9 @@
   self::expect(5, let final self::Class? #t56 = cn in #t56 == null ?{core::int?} null : #t56{self::Class}.{self::Class::field}{core::int});
   self::expect(6, let final self::Class #t57 = c in let final core::int #t58 = 6 in let final void #t59 = self::Extension|set#mutatingSetter(#t57, #t58) in #t58);
   self::expect(7, let final self::Class? #t60 = cn in #t60 == null ?{core::int?} null : #t60{self::Class}.{self::Class::field}{core::int});
-  let final self::Class? #t61 = cn in #t61 == null ?{void} null : self::Extension|set#setterWithReturn(#t61{self::Class}, 1);
+  let final self::Class? #t61 = cn in #t61 == null ?{core::int?} null : self::Extension|set#setterWithReturn(#t61{self::Class}, 1);
   self::expect(1, let final self::Class? #t62 = cn in #t62 == null ?{core::int?} null : #t62{self::Class}.{self::Class::field}{core::int});
-  let final self::Class? #t63 = cn in #t63 == null ?{void} null : self::Extension|set#setterWithReturn(#t63{self::Class}, 2.{core::int::unary-}(){() → core::int});
+  let final self::Class? #t63 = cn in #t63 == null ?{core::int?} null : self::Extension|set#setterWithReturn(#t63{self::Class}, 2.{core::int::unary-}(){() → core::int});
   self::expect(2, let final self::Class? #t64 = cn in #t64 == null ?{core::int?} null : #t64{self::Class}.{self::Class::field}{core::int});
   self::expect(3, let final self::Class? #t65 = cn in #t65 == null ?{core::int?} null : let final core::int #t66 = 3 in let final void #t67 = self::Extension|set#setterWithReturn(#t65{self::Class}, #t66) in #t66);
   self::expect(3, let final self::Class? #t68 = cn in #t68 == null ?{core::int?} null : #t68{self::Class}.{self::Class::field}{core::int});
@@ -175,9 +175,9 @@
   self::expect(7, let final self::Class? #t78 = cn in #t78 == null ?{core::int?} null : #t78{self::Class}.{self::Class::field}{core::int});
   self::expect(8.{core::int::unary-}(){() → core::int}, let final self::Class #t79 = c in let final core::int #t80 = 8.{core::int::unary-}(){() → core::int} in let final void #t81 = self::Extension|set#setterWithReturn(#t79, #t80) in #t80);
   self::expect(8, let final self::Class? #t82 = cn in #t82 == null ?{core::int?} null : #t82{self::Class}.{self::Class::field}{core::int});
-  let final self::Class? #t83 = cn in #t83 == null ?{void} null : self::Extension|set#setterWithClosure(#t83{self::Class}, 1);
+  let final self::Class? #t83 = cn in #t83 == null ?{core::int?} null : self::Extension|set#setterWithClosure(#t83{self::Class}, 1);
   self::expect(1, let final self::Class? #t84 = cn in #t84 == null ?{core::int?} null : #t84{self::Class}.{self::Class::field}{core::int});
-  let final self::Class? #t85 = cn in #t85 == null ?{void} null : self::Extension|set#setterWithClosure(#t85{self::Class}, 2.{core::int::unary-}(){() → core::int});
+  let final self::Class? #t85 = cn in #t85 == null ?{core::int?} null : self::Extension|set#setterWithClosure(#t85{self::Class}, 2.{core::int::unary-}(){() → core::int});
   self::expect(2, let final self::Class? #t86 = cn in #t86 == null ?{core::int?} null : #t86{self::Class}.{self::Class::field}{core::int});
   self::expect(3, let final self::Class? #t87 = cn in #t87 == null ?{core::int?} null : let final core::int #t88 = 3 in let final void #t89 = self::Extension|set#setterWithClosure(#t87{self::Class}, #t88) in #t88);
   self::expect(3, let final self::Class? #t90 = cn in #t90 == null ?{core::int?} null : #t90{self::Class}.{self::Class::field}{core::int});
diff --git a/pkg/front_end/testcases/extensions/extension_setter.dart.strong.transformed.expect b/pkg/front_end/testcases/extensions/extension_setter.dart.strong.transformed.expect
index ead3e73..dc9bceb 100644
--- a/pkg/front_end/testcases/extensions/extension_setter.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/extensions/extension_setter.dart.strong.transformed.expect
@@ -159,9 +159,9 @@
   self::expect(5, let final self::Class? #t56 = cn in #t56 == null ?{core::int?} null : #t56{self::Class}.{self::Class::field}{core::int});
   self::expect(6, let final self::Class #t57 = c in let final core::int #t58 = 6 in let final void #t59 = self::Extension|set#mutatingSetter(#t57, #t58) in #t58);
   self::expect(7, let final self::Class? #t60 = cn in #t60 == null ?{core::int?} null : #t60{self::Class}.{self::Class::field}{core::int});
-  let final self::Class? #t61 = cn in #t61 == null ?{void} null : self::Extension|set#setterWithReturn(#t61{self::Class}, 1);
+  let final self::Class? #t61 = cn in #t61 == null ?{core::int?} null : self::Extension|set#setterWithReturn(#t61{self::Class}, 1);
   self::expect(1, let final self::Class? #t62 = cn in #t62 == null ?{core::int?} null : #t62{self::Class}.{self::Class::field}{core::int});
-  let final self::Class? #t63 = cn in #t63 == null ?{void} null : self::Extension|set#setterWithReturn(#t63{self::Class}, 2.{core::int::unary-}(){() → core::int});
+  let final self::Class? #t63 = cn in #t63 == null ?{core::int?} null : self::Extension|set#setterWithReturn(#t63{self::Class}, 2.{core::int::unary-}(){() → core::int});
   self::expect(2, let final self::Class? #t64 = cn in #t64 == null ?{core::int?} null : #t64{self::Class}.{self::Class::field}{core::int});
   self::expect(3, let final self::Class? #t65 = cn in #t65 == null ?{core::int?} null : let final core::int #t66 = 3 in let final void #t67 = self::Extension|set#setterWithReturn(#t65{self::Class}, #t66) in #t66);
   self::expect(3, let final self::Class? #t68 = cn in #t68 == null ?{core::int?} null : #t68{self::Class}.{self::Class::field}{core::int});
@@ -175,9 +175,9 @@
   self::expect(7, let final self::Class? #t78 = cn in #t78 == null ?{core::int?} null : #t78{self::Class}.{self::Class::field}{core::int});
   self::expect(8.{core::int::unary-}(){() → core::int}, let final self::Class #t79 = c in let final core::int #t80 = 8.{core::int::unary-}(){() → core::int} in let final void #t81 = self::Extension|set#setterWithReturn(#t79, #t80) in #t80);
   self::expect(8, let final self::Class? #t82 = cn in #t82 == null ?{core::int?} null : #t82{self::Class}.{self::Class::field}{core::int});
-  let final self::Class? #t83 = cn in #t83 == null ?{void} null : self::Extension|set#setterWithClosure(#t83{self::Class}, 1);
+  let final self::Class? #t83 = cn in #t83 == null ?{core::int?} null : self::Extension|set#setterWithClosure(#t83{self::Class}, 1);
   self::expect(1, let final self::Class? #t84 = cn in #t84 == null ?{core::int?} null : #t84{self::Class}.{self::Class::field}{core::int});
-  let final self::Class? #t85 = cn in #t85 == null ?{void} null : self::Extension|set#setterWithClosure(#t85{self::Class}, 2.{core::int::unary-}(){() → core::int});
+  let final self::Class? #t85 = cn in #t85 == null ?{core::int?} null : self::Extension|set#setterWithClosure(#t85{self::Class}, 2.{core::int::unary-}(){() → core::int});
   self::expect(2, let final self::Class? #t86 = cn in #t86 == null ?{core::int?} null : #t86{self::Class}.{self::Class::field}{core::int});
   self::expect(3, let final self::Class? #t87 = cn in #t87 == null ?{core::int?} null : let final core::int #t88 = 3 in let final void #t89 = self::Extension|set#setterWithClosure(#t87{self::Class}, #t88) in #t88);
   self::expect(3, let final self::Class? #t90 = cn in #t90 == null ?{core::int?} null : #t90{self::Class}.{self::Class::field}{core::int});
diff --git a/pkg/front_end/testcases/extensions/if_null.dart.strong.expect b/pkg/front_end/testcases/extensions/if_null.dart.strong.expect
index acf9b6b..e091954 100644
--- a/pkg/front_end/testcases/extensions/if_null.dart.strong.expect
+++ b/pkg/front_end/testcases/extensions/if_null.dart.strong.expect
@@ -34,7 +34,7 @@
 static method test(self::Class? c) → dynamic {
   let final core::int? #t2 = let final self::Class? #t3 = c in #t3 == null ?{core::int?} null : self::Extension|get#property(#t3{self::Class}) in #t2 == null ?{core::int} 0 : #t2{core::int};
   let final core::int? #t4 = let final self::Class? #t5 = c in #t5 == null ?{core::int?} null : self::Extension|get#property(#t5{self::Class}) in #t4 == null ?{core::int} 0 : #t4{core::int};
-  let final self::Class? #t6 = c in #t6 == null ?{void} null : self::Extension|set#property(#t6{self::Class}, let final core::int? #t7 = self::value in #t7 == null ?{core::int} 0 : #t7{core::int});
+  let final self::Class? #t6 = c in #t6 == null ?{core::int?} null : self::Extension|set#property(#t6{self::Class}, let final core::int? #t7 = self::value in #t7 == null ?{core::int} 0 : #t7{core::int});
   let final self::Class? #t8 = c in #t8 == null ?{core::int?} null : self::Extension|set#property(#t8{self::Class}, let final core::int? #t9 = self::value in #t9 == null ?{core::int} 0 : #t9{core::int});
   let final core::int? #t10 = let final self::Class? #t11 = c in #t11 == null ?{core::int?} null : let final core::int #t12 = 42 in let final void #t13 = self::Extension|set#property(#t11{self::Class}, #t12) in #t12 in #t10 == null ?{core::int} 0 : #t10{core::int};
   let final core::int? #t14 = let final self::Class? #t15 = c in #t15 == null ?{core::int?} null : let final core::int? #t16 = self::value in let final void #t17 = self::Extension|set#property(#t15{self::Class}, #t16) in #t16 in #t14 == null ?{core::int} 0 : #t14{core::int};
diff --git a/pkg/front_end/testcases/extensions/if_null.dart.strong.modular.expect b/pkg/front_end/testcases/extensions/if_null.dart.strong.modular.expect
index acf9b6b..e091954 100644
--- a/pkg/front_end/testcases/extensions/if_null.dart.strong.modular.expect
+++ b/pkg/front_end/testcases/extensions/if_null.dart.strong.modular.expect
@@ -34,7 +34,7 @@
 static method test(self::Class? c) → dynamic {
   let final core::int? #t2 = let final self::Class? #t3 = c in #t3 == null ?{core::int?} null : self::Extension|get#property(#t3{self::Class}) in #t2 == null ?{core::int} 0 : #t2{core::int};
   let final core::int? #t4 = let final self::Class? #t5 = c in #t5 == null ?{core::int?} null : self::Extension|get#property(#t5{self::Class}) in #t4 == null ?{core::int} 0 : #t4{core::int};
-  let final self::Class? #t6 = c in #t6 == null ?{void} null : self::Extension|set#property(#t6{self::Class}, let final core::int? #t7 = self::value in #t7 == null ?{core::int} 0 : #t7{core::int});
+  let final self::Class? #t6 = c in #t6 == null ?{core::int?} null : self::Extension|set#property(#t6{self::Class}, let final core::int? #t7 = self::value in #t7 == null ?{core::int} 0 : #t7{core::int});
   let final self::Class? #t8 = c in #t8 == null ?{core::int?} null : self::Extension|set#property(#t8{self::Class}, let final core::int? #t9 = self::value in #t9 == null ?{core::int} 0 : #t9{core::int});
   let final core::int? #t10 = let final self::Class? #t11 = c in #t11 == null ?{core::int?} null : let final core::int #t12 = 42 in let final void #t13 = self::Extension|set#property(#t11{self::Class}, #t12) in #t12 in #t10 == null ?{core::int} 0 : #t10{core::int};
   let final core::int? #t14 = let final self::Class? #t15 = c in #t15 == null ?{core::int?} null : let final core::int? #t16 = self::value in let final void #t17 = self::Extension|set#property(#t15{self::Class}, #t16) in #t16 in #t14 == null ?{core::int} 0 : #t14{core::int};
diff --git a/pkg/front_end/testcases/extensions/if_null.dart.strong.transformed.expect b/pkg/front_end/testcases/extensions/if_null.dart.strong.transformed.expect
index 2ece684..6b8a0fa 100644
--- a/pkg/front_end/testcases/extensions/if_null.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/extensions/if_null.dart.strong.transformed.expect
@@ -34,7 +34,7 @@
 static method test(self::Class? c) → dynamic {
   let final core::int? #t2 = let final self::Class? #t3 = c in #t3 == null ?{core::int?} null : self::Extension|get#property(#t3{self::Class}) in #t2 == null ?{core::int} 0 : #t2{core::int};
   let final core::int? #t4 = let final self::Class? #t5 = c in #t5 == null ?{core::int?} null : self::Extension|get#property(#t5{self::Class}) in #t4 == null ?{core::int} 0 : #t4{core::int};
-  let final self::Class? #t6 = c in #t6 == null ?{void} null : self::Extension|set#property(#t6{self::Class}, let final core::int? #t7 = self::value in #t7 == null ?{core::int} 0 : #t7{core::int});
+  let final self::Class? #t6 = c in #t6 == null ?{core::int?} null : self::Extension|set#property(#t6{self::Class}, let final core::int? #t7 = self::value in #t7 == null ?{core::int} 0 : #t7{core::int});
   let final self::Class? #t8 = c in #t8 == null ?{core::int?} null : self::Extension|set#property(#t8{self::Class}, let final core::int? #t9 = self::value in #t9 == null ?{core::int} 0 : #t9{core::int});
   let final core::int? #t10 = let final self::Class? #t11 = c in #t11 == null ?{core::int?} null : let final core::int #t12 = 42 in let final void #t13 = self::Extension|set#property(#t11{self::Class}, #t12) in #t12 in #t10 == null ?{core::int} 0 : #t10{core::int};
   let final core::int? #t14 = let final self::Class? #t15 = c in #t15 == null ?{core::int?} null : let final core::int? #t16 = self::value in let final void #t17 = self::Extension|set#property(#t15{self::Class}, #t16) in #t16 in #t14 == null ?{core::int} 0 : #t14{core::int};
diff --git a/pkg/front_end/testcases/extensions/null_aware.dart.strong.expect b/pkg/front_end/testcases/extensions/null_aware.dart.strong.expect
index 61025dc..62a7452 100644
--- a/pkg/front_end/testcases/extensions/null_aware.dart.strong.expect
+++ b/pkg/front_end/testcases/extensions/null_aware.dart.strong.expect
@@ -52,7 +52,7 @@
   self::expect(42, tearOff{() → core::int?}(){() → core::int?});
   self::expect(null, let final self::Class? #t23 = c in #t23 == null ?{Null} null : let final has-declared-initializer Null #t24 = null in let final void #t25 = self::Extension|set#property(#t23{self::Class}, #t24) in #t24);
   self::expect(42, let final self::Class? #t26 = c in #t26 == null ?{core::int?} null : let final core::int #t27 = 42 in let final void #t28 = self::Extension|set#property(#t26{self::Class}, #t27) in #t27);
-  let final self::Class? #t29 = c in #t29 == null ?{void} null : self::Extension|set#property(#t29{self::Class}, null);
+  let final self::Class? #t29 = c in #t29 == null ?{Null} null : self::Extension|set#property(#t29{self::Class}, null);
   self::expect(null, let final self::Class? #t30 = c in #t30 == null ?{core::int?} null : self::Extension|get#property(#t30{self::Class}));
   self::expect(42, let final self::Class? #t31 = c in #t31 == null ?{core::int?} null : let final core::int? #t32 = self::Extension|get#property(#t31{self::Class}) in #t32 == null ?{core::int} let final core::int #t33 = 42 in let final void #t34 = self::Extension|set#property(#t31{self::Class}, #t33) in #t33 : #t32{core::int});
   self::expect(42, let final self::Class? #t35 = c in #t35 == null ?{core::int?} null : let final core::int? #t36 = self::Extension|get#property(#t35{self::Class}) in #t36 == null ?{core::int} let final core::int #t37 = 87 in let final void #t38 = self::Extension|set#property(#t35{self::Class}, #t37) in #t37 : #t36{core::int});
@@ -61,17 +61,17 @@
   self::expect(42, let final self::Class? #t43 = c in #t43 == null ?{core::int?} null : self::Extension|get#property(#t43{self::Class}));
   let final self::Class? #t44 = c in #t44 == null ?{core::int?} null : self::Extension|get#property(#t44{self::Class}) == null ?{core::int?} self::Extension|set#property(#t44{self::Class}, 87) : null;
   self::expect(42, let final self::Class? #t45 = c in #t45 == null ?{core::int?} null : self::Extension|get#property(#t45{self::Class}));
-  let final self::Class? #t46 = c in #t46 == null ?{void} null : self::Extension|set#property(#t46{self::Class}, null);
+  let final self::Class? #t46 = c in #t46 == null ?{Null} null : self::Extension|set#property(#t46{self::Class}, null);
   self::expect(null, let final self::Class? #t47 = c in #t47 == null ?{core::int?} null : self::Extension|get#property(#t47{self::Class}));
   self::expect(42, let final self::Class? #t48 = c in #t48 == null ?{core::int?} null : let final core::int? #t49 = self::Extension|get#property(#t48{self::Class}) in #t49 == null ?{core::int} let final core::int #t50 = 42 in let final void #t51 = self::Extension|set#property(#t48{self::Class}, #t50) in #t50 : #t49{core::int});
   self::expect(42, let final self::Class? #t52 = c in #t52 == null ?{core::int?} null : let final core::int? #t53 = self::Extension|get#property(#t52{self::Class}) in #t53 == null ?{core::int} let final core::int #t54 = 87 in let final void #t55 = self::Extension|set#property(#t52{self::Class}, #t54) in #t54 : #t53{core::int});
-  let final self::Class? #t56 = c in #t56 == null ?{void} null : self::Extension|set#property(#t56{self::Class}, null);
+  let final self::Class? #t56 = c in #t56 == null ?{Null} null : self::Extension|set#property(#t56{self::Class}, null);
   self::expect(null, let final self::Class? #t57 = c in #t57 == null ?{core::int?} null : self::Extension|get#property(#t57{self::Class}));
   let final self::Class? #t58 = c in #t58 == null ?{core::int?} null : self::Extension|get#property(#t58{self::Class}) == null ?{core::int?} self::Extension|set#property(#t58{self::Class}, 42) : null;
   self::expect(42, let final self::Class? #t59 = c in #t59 == null ?{core::int?} null : self::Extension|get#property(#t59{self::Class}));
   let final self::Class? #t60 = c in #t60 == null ?{core::int?} null : self::Extension|get#property(#t60{self::Class}) == null ?{core::int?} self::Extension|set#property(#t60{self::Class}, 87) : null;
   self::expect(42, let final self::Class? #t61 = c in #t61 == null ?{core::int?} null : self::Extension|get#property(#t61{self::Class}));
-  let final self::Class? #t62 = c in #t62 == null ?{void} null : self::Extension|set#property(#t62{self::Class}, null);
+  let final self::Class? #t62 = c in #t62 == null ?{Null} null : self::Extension|set#property(#t62{self::Class}, null);
   let final self::Class? #t63 = c in #t63 == null ?{dynamic} null : self::Extension|testImplicitThis(#t63{self::Class});
 }
 static method expect(dynamic expected, dynamic actual) → dynamic {
diff --git a/pkg/front_end/testcases/extensions/null_aware.dart.strong.modular.expect b/pkg/front_end/testcases/extensions/null_aware.dart.strong.modular.expect
index 61025dc..62a7452 100644
--- a/pkg/front_end/testcases/extensions/null_aware.dart.strong.modular.expect
+++ b/pkg/front_end/testcases/extensions/null_aware.dart.strong.modular.expect
@@ -52,7 +52,7 @@
   self::expect(42, tearOff{() → core::int?}(){() → core::int?});
   self::expect(null, let final self::Class? #t23 = c in #t23 == null ?{Null} null : let final has-declared-initializer Null #t24 = null in let final void #t25 = self::Extension|set#property(#t23{self::Class}, #t24) in #t24);
   self::expect(42, let final self::Class? #t26 = c in #t26 == null ?{core::int?} null : let final core::int #t27 = 42 in let final void #t28 = self::Extension|set#property(#t26{self::Class}, #t27) in #t27);
-  let final self::Class? #t29 = c in #t29 == null ?{void} null : self::Extension|set#property(#t29{self::Class}, null);
+  let final self::Class? #t29 = c in #t29 == null ?{Null} null : self::Extension|set#property(#t29{self::Class}, null);
   self::expect(null, let final self::Class? #t30 = c in #t30 == null ?{core::int?} null : self::Extension|get#property(#t30{self::Class}));
   self::expect(42, let final self::Class? #t31 = c in #t31 == null ?{core::int?} null : let final core::int? #t32 = self::Extension|get#property(#t31{self::Class}) in #t32 == null ?{core::int} let final core::int #t33 = 42 in let final void #t34 = self::Extension|set#property(#t31{self::Class}, #t33) in #t33 : #t32{core::int});
   self::expect(42, let final self::Class? #t35 = c in #t35 == null ?{core::int?} null : let final core::int? #t36 = self::Extension|get#property(#t35{self::Class}) in #t36 == null ?{core::int} let final core::int #t37 = 87 in let final void #t38 = self::Extension|set#property(#t35{self::Class}, #t37) in #t37 : #t36{core::int});
@@ -61,17 +61,17 @@
   self::expect(42, let final self::Class? #t43 = c in #t43 == null ?{core::int?} null : self::Extension|get#property(#t43{self::Class}));
   let final self::Class? #t44 = c in #t44 == null ?{core::int?} null : self::Extension|get#property(#t44{self::Class}) == null ?{core::int?} self::Extension|set#property(#t44{self::Class}, 87) : null;
   self::expect(42, let final self::Class? #t45 = c in #t45 == null ?{core::int?} null : self::Extension|get#property(#t45{self::Class}));
-  let final self::Class? #t46 = c in #t46 == null ?{void} null : self::Extension|set#property(#t46{self::Class}, null);
+  let final self::Class? #t46 = c in #t46 == null ?{Null} null : self::Extension|set#property(#t46{self::Class}, null);
   self::expect(null, let final self::Class? #t47 = c in #t47 == null ?{core::int?} null : self::Extension|get#property(#t47{self::Class}));
   self::expect(42, let final self::Class? #t48 = c in #t48 == null ?{core::int?} null : let final core::int? #t49 = self::Extension|get#property(#t48{self::Class}) in #t49 == null ?{core::int} let final core::int #t50 = 42 in let final void #t51 = self::Extension|set#property(#t48{self::Class}, #t50) in #t50 : #t49{core::int});
   self::expect(42, let final self::Class? #t52 = c in #t52 == null ?{core::int?} null : let final core::int? #t53 = self::Extension|get#property(#t52{self::Class}) in #t53 == null ?{core::int} let final core::int #t54 = 87 in let final void #t55 = self::Extension|set#property(#t52{self::Class}, #t54) in #t54 : #t53{core::int});
-  let final self::Class? #t56 = c in #t56 == null ?{void} null : self::Extension|set#property(#t56{self::Class}, null);
+  let final self::Class? #t56 = c in #t56 == null ?{Null} null : self::Extension|set#property(#t56{self::Class}, null);
   self::expect(null, let final self::Class? #t57 = c in #t57 == null ?{core::int?} null : self::Extension|get#property(#t57{self::Class}));
   let final self::Class? #t58 = c in #t58 == null ?{core::int?} null : self::Extension|get#property(#t58{self::Class}) == null ?{core::int?} self::Extension|set#property(#t58{self::Class}, 42) : null;
   self::expect(42, let final self::Class? #t59 = c in #t59 == null ?{core::int?} null : self::Extension|get#property(#t59{self::Class}));
   let final self::Class? #t60 = c in #t60 == null ?{core::int?} null : self::Extension|get#property(#t60{self::Class}) == null ?{core::int?} self::Extension|set#property(#t60{self::Class}, 87) : null;
   self::expect(42, let final self::Class? #t61 = c in #t61 == null ?{core::int?} null : self::Extension|get#property(#t61{self::Class}));
-  let final self::Class? #t62 = c in #t62 == null ?{void} null : self::Extension|set#property(#t62{self::Class}, null);
+  let final self::Class? #t62 = c in #t62 == null ?{Null} null : self::Extension|set#property(#t62{self::Class}, null);
   let final self::Class? #t63 = c in #t63 == null ?{dynamic} null : self::Extension|testImplicitThis(#t63{self::Class});
 }
 static method expect(dynamic expected, dynamic actual) → dynamic {
diff --git a/pkg/front_end/testcases/extensions/null_aware.dart.strong.transformed.expect b/pkg/front_end/testcases/extensions/null_aware.dart.strong.transformed.expect
index 21296d9..874a830 100644
--- a/pkg/front_end/testcases/extensions/null_aware.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/extensions/null_aware.dart.strong.transformed.expect
@@ -52,7 +52,7 @@
   self::expect(42, tearOff{() → core::int?}(){() → core::int?});
   self::expect(null, let final self::Class? #t23 = c in #t23 == null ?{Null} null : let final has-declared-initializer Null #t24 = null in let final void #t25 = self::Extension|set#property(#t23{self::Class}, #t24) in #t24);
   self::expect(42, let final self::Class? #t26 = c in #t26 == null ?{core::int?} null : let final core::int #t27 = 42 in let final void #t28 = self::Extension|set#property(#t26{self::Class}, #t27) in #t27);
-  let final self::Class? #t29 = c in #t29 == null ?{void} null : self::Extension|set#property(#t29{self::Class}, null);
+  let final self::Class? #t29 = c in #t29 == null ?{Null} null : self::Extension|set#property(#t29{self::Class}, null);
   self::expect(null, let final self::Class? #t30 = c in #t30 == null ?{core::int?} null : self::Extension|get#property(#t30{self::Class}));
   self::expect(42, let final self::Class? #t31 = c in #t31 == null ?{core::int?} null : let final core::int? #t32 = self::Extension|get#property(#t31{self::Class}) in #t32 == null ?{core::int} let final core::int #t33 = 42 in let final void #t34 = self::Extension|set#property(#t31{self::Class}, #t33) in #t33 : #t32{core::int});
   self::expect(42, let final self::Class? #t35 = c in #t35 == null ?{core::int?} null : let final core::int? #t36 = self::Extension|get#property(#t35{self::Class}) in #t36 == null ?{core::int} let final core::int #t37 = 87 in let final void #t38 = self::Extension|set#property(#t35{self::Class}, #t37) in #t37 : #t36{core::int});
@@ -61,17 +61,17 @@
   self::expect(42, let final self::Class? #t43 = c in #t43 == null ?{core::int?} null : self::Extension|get#property(#t43{self::Class}));
   let final self::Class? #t44 = c in #t44 == null ?{core::int?} null : self::Extension|get#property(#t44{self::Class}) == null ?{core::int?} self::Extension|set#property(#t44{self::Class}, 87) : null;
   self::expect(42, let final self::Class? #t45 = c in #t45 == null ?{core::int?} null : self::Extension|get#property(#t45{self::Class}));
-  let final self::Class? #t46 = c in #t46 == null ?{void} null : self::Extension|set#property(#t46{self::Class}, null);
+  let final self::Class? #t46 = c in #t46 == null ?{Null} null : self::Extension|set#property(#t46{self::Class}, null);
   self::expect(null, let final self::Class? #t47 = c in #t47 == null ?{core::int?} null : self::Extension|get#property(#t47{self::Class}));
   self::expect(42, let final self::Class? #t48 = c in #t48 == null ?{core::int?} null : let final core::int? #t49 = self::Extension|get#property(#t48{self::Class}) in #t49 == null ?{core::int} let final core::int #t50 = 42 in let final void #t51 = self::Extension|set#property(#t48{self::Class}, #t50) in #t50 : #t49{core::int});
   self::expect(42, let final self::Class? #t52 = c in #t52 == null ?{core::int?} null : let final core::int? #t53 = self::Extension|get#property(#t52{self::Class}) in #t53 == null ?{core::int} let final core::int #t54 = 87 in let final void #t55 = self::Extension|set#property(#t52{self::Class}, #t54) in #t54 : #t53{core::int});
-  let final self::Class? #t56 = c in #t56 == null ?{void} null : self::Extension|set#property(#t56{self::Class}, null);
+  let final self::Class? #t56 = c in #t56 == null ?{Null} null : self::Extension|set#property(#t56{self::Class}, null);
   self::expect(null, let final self::Class? #t57 = c in #t57 == null ?{core::int?} null : self::Extension|get#property(#t57{self::Class}));
   let final self::Class? #t58 = c in #t58 == null ?{core::int?} null : self::Extension|get#property(#t58{self::Class}) == null ?{core::int?} self::Extension|set#property(#t58{self::Class}, 42) : null;
   self::expect(42, let final self::Class? #t59 = c in #t59 == null ?{core::int?} null : self::Extension|get#property(#t59{self::Class}));
   let final self::Class? #t60 = c in #t60 == null ?{core::int?} null : self::Extension|get#property(#t60{self::Class}) == null ?{core::int?} self::Extension|set#property(#t60{self::Class}, 87) : null;
   self::expect(42, let final self::Class? #t61 = c in #t61 == null ?{core::int?} null : self::Extension|get#property(#t61{self::Class}));
-  let final self::Class? #t62 = c in #t62 == null ?{void} null : self::Extension|set#property(#t62{self::Class}, null);
+  let final self::Class? #t62 = c in #t62 == null ?{Null} null : self::Extension|set#property(#t62{self::Class}, null);
   let final self::Class? #t63 = c in #t63 == null ?{dynamic} null : self::Extension|testImplicitThis(#t63{self::Class});
 }
 static method expect(dynamic expected, dynamic actual) → dynamic {
diff --git a/pkg/front_end/testcases/extensions/null_aware_set.dart.strong.expect b/pkg/front_end/testcases/extensions/null_aware_set.dart.strong.expect
index 8bb8f15..8234cf2 100644
--- a/pkg/front_end/testcases/extensions/null_aware_set.dart.strong.expect
+++ b/pkg/front_end/testcases/extensions/null_aware_set.dart.strong.expect
@@ -7,5 +7,5 @@
 }
 static extension-member method Foo|set#f(lowered final core::Object #this, core::int x) → void {}
 static method fun(core::String? s) → void {
-  let final core::String? #t1 = s in #t1 == null ?{void} null : self::Foo|set#f(#t1{core::String}, 1);
+  let final core::String? #t1 = s in #t1 == null ?{core::int?} null : self::Foo|set#f(#t1{core::String}, 1);
 }
diff --git a/pkg/front_end/testcases/extensions/null_aware_set.dart.strong.modular.expect b/pkg/front_end/testcases/extensions/null_aware_set.dart.strong.modular.expect
index 8bb8f15..8234cf2 100644
--- a/pkg/front_end/testcases/extensions/null_aware_set.dart.strong.modular.expect
+++ b/pkg/front_end/testcases/extensions/null_aware_set.dart.strong.modular.expect
@@ -7,5 +7,5 @@
 }
 static extension-member method Foo|set#f(lowered final core::Object #this, core::int x) → void {}
 static method fun(core::String? s) → void {
-  let final core::String? #t1 = s in #t1 == null ?{void} null : self::Foo|set#f(#t1{core::String}, 1);
+  let final core::String? #t1 = s in #t1 == null ?{core::int?} null : self::Foo|set#f(#t1{core::String}, 1);
 }
diff --git a/pkg/front_end/testcases/extensions/null_aware_set.dart.strong.transformed.expect b/pkg/front_end/testcases/extensions/null_aware_set.dart.strong.transformed.expect
index 8bb8f15..8234cf2 100644
--- a/pkg/front_end/testcases/extensions/null_aware_set.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/extensions/null_aware_set.dart.strong.transformed.expect
@@ -7,5 +7,5 @@
 }
 static extension-member method Foo|set#f(lowered final core::Object #this, core::int x) → void {}
 static method fun(core::String? s) → void {
-  let final core::String? #t1 = s in #t1 == null ?{void} null : self::Foo|set#f(#t1{core::String}, 1);
+  let final core::String? #t1 = s in #t1 == null ?{core::int?} null : self::Foo|set#f(#t1{core::String}, 1);
 }
diff --git a/pkg/front_end/testcases/general/for_in.dart b/pkg/front_end/testcases/general/for_in.dart
new file mode 100644
index 0000000..5772f6c
--- /dev/null
+++ b/pkg/front_end/testcases/general/for_in.dart
@@ -0,0 +1,615 @@
+// Copyright (c) 2026, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'for_in.dart' deferred as defer hide Extension, IndexExtension;
+
+int intTopLevel = 0;
+final int finalTopLevel = 0;
+const int constTopLevel = 0;
+late int lateTopLevel;
+late final int lateFinalTopLevel;
+num numTopLevel = 0;
+String stringTopLevel = '';
+
+test() {
+  for (const constLocal in [1]) { // Error
+    print(constLocal);
+  }
+  for (late int lateLocal in [1]) { // Error
+    print(lateLocal);
+  }
+  for (String stringLocal in [1]) { // Error
+    print(stringLocal);
+  }
+  for (String stringLocal in <int>[1]) { // Error
+    print(stringLocal);
+  }
+  print([
+    for (const constLocal in [1]) constLocal // Error
+  ]);
+  print([
+    for (late int lateLocal in [1]) lateLocal // Error
+  ]);
+  print([
+    for (String stringLocal in [1]) stringLocal // Error
+  ]);
+  print([
+    for (String stringLocal in <int>[1]) stringLocal // Error
+  ]);
+  print({
+    for (const constLocal in [1]) 0: constLocal // Error
+  });
+  print({
+    for (late int lateLocal in [1]) 0: lateLocal // Error
+  });
+  print({
+    for (String stringLocal in [1]) 0: stringLocal // Error
+  });
+  print({
+    for (String stringLocal in <int>[1]) 0: stringLocal // Error
+  });
+  for (int? multiLocal1, multiLocal2 in [1]) { // Error
+    print(multiLocal1);
+    print(multiLocal2);
+  }
+  for (var varMultiLocal1, varMultiLocal2 in [1]) { // Error
+    print(varMultiLocal1);
+    print(varMultiLocal2);
+  }
+  for (num numMultiLocal1, numMultiLocal2 in [1]) { // Error
+    print(numMultiLocal1);
+    print(numMultiLocal2);
+  }
+  for (1 in [1]) { // Error
+
+  }
+  for (main() in [1]) { // Error
+
+  }
+  final int existingFinalLocal;
+  for (existingFinalLocal in [1]) { // Error
+    print(existingFinalLocal);
+  }
+  String existingStringLocal;
+  for (existingStringLocal in [1]) { // Error
+    print(existingStringLocal);
+  }
+  for (existingStringLocal in <int>[1]) { // Error
+    print(existingStringLocal);
+  }
+  Class c = Class();
+  for (c.intField in [1]) { // Error
+    print(c.intField);
+  }
+  for (c.numField in [1]) { // Error
+    print(c.numField);
+  }
+  for (c.lateField in [1]) { // Error
+    print(c.lateField);
+  }
+  for (c?.intField in [1]) { // Error
+    print(c?.intField);
+  }
+  for (c?.numField in [1]) { // Error
+    print(c?.numField);
+  }
+  for (c?.lateField in [1]) { // Error
+    print(c?.lateField);
+  }
+  for (c.stringField in [1]) { // Error
+    print(c.stringField);
+  }
+  for (c.stringField in <int>[1]) { // Error
+    print(c.stringField);
+  }
+  for (c?.stringField in [1]) { // Error
+    print(c?.stringField);
+  }
+  for (c?.stringField in <int>[1]) { // Error
+    print(c?.stringField);
+  }
+  for (c.finalField in [1]) { // Error
+    print(c.finalField);
+  }
+  for (c?.finalField in [1]) { // Error
+    print(c?.finalField);
+  }
+  for (c.lateFinalField in [1]) { // Error
+    print(c.lateFinalField);
+  }
+  for (c?.lateFinalField in [1]) { // Error
+    print(c?.lateFinalField);
+  }
+  for (c[0] in [1]) { // Error
+    print(c[0]);
+  }
+  for (c?[0] in [1]) { // Error
+    print(c[0]);
+  }
+  for (finalTopLevel in [1]) { // Error
+    print(finalTopLevel);
+  }
+  for (constTopLevel in [1]) { // Error
+    print(constTopLevel);
+  }
+  for (stringTopLevel in [1]) { // Error
+    print(stringTopLevel);
+  }
+  for (stringTopLevel in <int>[1]) { // Error
+    print(stringTopLevel);
+  }
+  for (defer.intTopLevel in [1]) { // Error
+    print(defer.intTopLevel);
+  }
+  for (defer.numTopLevel in [1]) { // Error
+    print(defer.numTopLevel);
+  }
+  for (defer.lateTopLevel in [1]) { // Error
+    print(defer.lateTopLevel);
+  }
+  for (defer.lateFinalTopLevel in [1]) { // Error
+    print(defer.lateFinalTopLevel);
+  }
+  for (defer.finalTopLevel in [1]) { // Error
+    print(defer.finalTopLevel);
+  }
+  for (defer.constTopLevel in [1]) { // Error
+    print(defer.constTopLevel);
+  }
+  for (defer.stringTopLevel in [1]) { // Error
+    print(defer.stringTopLevel);
+  }
+  for (defer.stringTopLevel in <int>[1]) { // Error
+    print(defer.stringTopLevel);
+  }
+  for (Class.stringStaticField in [1]) { // Error
+    print(Class.stringStaticField);
+  }
+  for (Class.stringStaticField in <int>[1]) { // Error
+    print(Class.stringStaticField);
+  }
+  for (Class.finalStaticField in [1]) { // Error
+    print(Class.finalStaticField);
+  }
+  for (Class.lateFinalStaticField in [1]) { // Error
+    print(Class.lateFinalStaticField);
+  }
+  for (Extension.stringStaticField in [1]) { // Error
+    print(Extension.stringStaticField);
+  }
+  for (Extension.stringStaticField in <int>[1]) { // Error
+    print(Extension.stringStaticField);
+  }
+  for (Extension.finalStaticField in [1]) { // Error
+    print(Extension.finalStaticField);
+  }
+  for (Extension.lateFinalStaticField in [1]) { // Error
+    print(Extension.lateFinalStaticField);
+  }
+  for (Class.intStaticField in [1]) { // Error
+    print(Class.intStaticField);
+  }
+  for (Class.numStaticField in [1]) { // Error
+    print(Class.numStaticField);
+  }
+  for (Class.lateStaticField in [1]) { // Error
+    print(Class.lateStaticField);
+  }
+  for (Extension.intStaticField in [1]) { // Error
+    print(Extension.intStaticField);
+  }
+  for (Extension.numStaticField in [1]) { // Error
+    print(Extension.numStaticField);
+  }
+  for (Extension.lateStaticField in [1]) { // Error
+    print(Extension.lateStaticField);
+  }
+}
+
+main() {
+  for (int intLocal in [1]) { // Ok
+    print(intLocal);
+  }
+  for (num numLocal in [1]) { // Ok
+    print(numLocal);
+  }
+  for (var varLocal in [1]) { // Ok
+    print(varLocal);
+  }
+  for (final finalLocal in [1]) { // Ok
+    print(finalLocal);
+  }
+  print([
+    for (int intLocal in [1]) intLocal // Ok
+  ]);
+  print([
+    for (num numLocal in [1]) numLocal // Ok
+  ]);
+  print([
+    for (var varLocal in [1]) varLocal // Ok
+  ]);
+  print([
+    for (final finalLocal in [1]) finalLocal // Ok
+  ]);
+  print({
+    for (int intLocal in [1]) 0: intLocal // Ok
+  });
+  print({
+    for (num numLocal in [1]) 0: numLocal // Ok
+  });
+  print({
+    for (var varLocal in [1]) 0: varLocal // Ok
+  });
+  print({
+    for (final finalLocal in [1]) 0: finalLocal // Ok
+  });
+  for (var (a, b) in [(1, 2)]) { // Ok
+    print(a);
+    print(b);
+  }
+  int existingIntLocal;
+  for (existingIntLocal in [1]) { // Ok
+    print(existingIntLocal);
+  }
+  num existingNumLocal;
+  for (existingNumLocal in [1]) { // Ok
+    print(existingNumLocal);
+  }
+
+  Class().method();
+
+  for (intTopLevel in [1]) { // Ok
+    print(intTopLevel);
+  }
+  for (numTopLevel in [1]) { // Ok
+    print(numTopLevel);
+  }
+  for (lateTopLevel in [1]) { // Ok
+    print(lateTopLevel);
+  }
+  for (lateFinalTopLevel in [1]) { // Ok
+    print(lateFinalTopLevel);
+  }
+  Class().extensionMethod();
+}
+
+class Class {
+  int intField = 0;
+  num numField = 0;
+  String stringField = '';
+  final int finalField = 0;
+  late int lateField;
+  late final int lateFinalField;
+
+  static int intStaticField = 0;
+  static num numStaticField = 0;
+  static String stringStaticField = '';
+  static final int finalStaticField = 0;
+  static late int lateStaticField;
+  static late final int lateFinalStaticField;
+
+  operator[]=(int index, int value) {}
+  int operator[](int index) => 0;
+
+  test() {
+    for (this.intField in [1]) { // Error
+      print(this.intField);
+    }
+    for (this?.intField in [1]) { // Error
+      print(this?.intField);
+    }
+    for (this.numField in [1]) { // Error
+      print(this.numField);
+    }
+    for (this?.numField in [1]) { // Error
+      print(this?.numField);
+    }
+    for (this.lateField in [1]) { // Error
+      print(this.lateField);
+    }
+    for (this?.lateField in [1]) { // Error
+      print(this?.lateField);
+    }
+    for (stringField in [1]) { // Error
+      print(stringField);
+    }
+    for (stringField in <int>[1]) { // Error
+      print(stringField);
+    }
+    for (this.stringField in [1]) { // Error
+      print(this.stringField);
+    }
+    for (this.stringField in <int>[1]) { // Error
+      print(this.stringField);
+    }
+    for (this?.stringField in [1]) { // Error
+      print(this.stringField);
+    }
+    for (this?.stringField in <int>[1]) { // Error
+      print(this.stringField);
+    }
+    for (this[0] in [1]) { // Error
+      print(this[0]);
+    }
+    for (this?[0] in [1]) { // Error
+      print(this[0]);
+    }
+    for (finalField in [1]) { // Error
+      print(finalField);
+    }
+    for (finalField in <int>[1]) { // Error
+      print(finalField);
+    }
+    for (this.finalField in [1]) { // Error
+      print(this.finalField);
+    }
+    for (this.finalField in <int>[1]) { // Error
+      print(this.finalField);
+    }
+    for (this?.finalField in [1]) { // Error
+      print(this.finalField);
+    }
+    for (this?.finalField in <int>[1]) { // Error
+      print(this.finalField);
+    }
+    for (lateFinalField in [1]) { // Ok
+      print(lateFinalField);
+    }
+    for (this.lateFinalField in [1]) { // Error
+      print(this.lateFinalField);
+    }
+    for (this?.lateFinalField in [1]) { // Error
+      print(this.lateFinalField);
+    }
+    for (finalStaticField in [1]) { // Error
+      print(finalStaticField);
+    }
+    for (stringStaticField in [1]) { // Error
+      print(stringStaticField);
+    }
+    for (stringStaticField in <int>[1]) { // Error
+      print(stringStaticField);
+    }
+    for (lateFinalStaticField in [1]) { // Ok
+      print(lateFinalStaticField);
+    }
+    for (this.extensionIntProperty in [1]) { // Error
+      print(this.extensionIntProperty);
+    }
+    for (this?.extensionIntProperty in [1]) { // Error
+      print(this?.extensionIntProperty);
+    }
+    for (this.extensionNumProperty in [1]) { // Error
+      print(this.extensionNumProperty);
+    }
+    for (this?.extensionNumProperty in [1]) { // Error
+      print(this?.extensionNumProperty);
+    }
+    for (Extension(this).extensionIntProperty in [1]) { // Error
+      print(Extension(this).extensionIntProperty);
+    }
+    for (Extension(this)?.extensionIntProperty in [1]) { // Error
+      print(Extension(this)?.extensionIntProperty);
+    }
+    for (Extension(this).extensionNumProperty in [1]) { // Error
+      print(Extension(this).extensionNumProperty);
+    }
+    for (Extension(this)?.extensionNumProperty in [1]) { // Error
+      print(Extension(this)?.extensionNumProperty);
+    }
+    for (Extension(this).extensionStringProperty in [1]) { // Error
+      print(Extension(this).extensionStringProperty);
+    }
+    for (Extension(this)?.extensionStringProperty in [1]) { // Error
+      print(Extension(this)?.extensionStringProperty);
+    }
+    for (Extension(this).extensionStringProperty in <int>[1]) { // Error
+      print(Extension(this).extensionStringProperty);
+    }
+    for (Extension(this)?.extensionStringProperty in <int>[1]) { // Error
+      print(Extension(this)?.extensionStringProperty);
+    }
+    for (Extension(this).extensionReadOnlyProperty in [1]) { // Error
+      print(Extension(this).extensionReadOnlyProperty);
+    }
+    for (Extension(this)?.extensionReadOnlyProperty in [1]) { // Error
+      print(Extension(this)?.extensionReadOnlyProperty);
+    }
+    for (0[0] in [1]) { // Error
+      print(0[0]);
+    }
+    for (0?[0] in [1]) { // Error
+      print(0?[0]);
+    }
+    for (IndexExtension(0)[0] in [1]) { // Error
+      print(IndexExtension(0)[0]);
+    }
+    for (IndexExtension(0)?[0] in [1]) { // Error
+      print(IndexExtension(0)?[0]);
+    }
+  }
+
+  method() {
+    for (intField in [1]) { // Ok
+      print(intField);
+    }
+    for (numField in [1]) { // Ok
+      print(numField);
+    }
+    for (lateField in [1]) { // Ok
+      print(lateField);
+    }
+    for (intStaticField in [1]) { // Ok
+      print(intStaticField);
+    }
+    for (numStaticField in [1]) { // Ok
+      print(numStaticField);
+    }
+    for (lateStaticField in [1]) { // Ok
+      print(lateStaticField);
+    }
+    for (extensionIntProperty in [1]) { // Ok
+      print(extensionIntProperty);
+    }
+    for (extensionNumProperty in [1]) { // Ok
+      print(extensionNumProperty);
+    }
+  }
+}
+
+class Subclass extends Class {
+  test() {
+    for (super.stringField in [1]) { // Error
+      print(super.stringField);
+    }
+    for (super.stringField in <int>[1]) { // Error
+      print(super.stringField);
+    }
+    for (super.intField in [1]) { // Error
+      print(super.intField);
+    }
+    for (super.numField in [1]) { // Error
+      print(super.numField);
+    }
+    for (super.lateField in [1]) { // Error
+      print(super.lateField);
+    }
+    for (super[0] in [1]) { // Error
+      print(super[0]);
+    }
+    for (super?[0] in [1]) { // Error
+      print(super[0]);
+    }
+  }
+}
+
+extension Extension on Class {
+  int get extensionIntProperty => 0;
+  void set extensionIntProperty(int value) {}
+  num get extensionNumProperty => 0;
+  void set extensionNumProperty(num value) {}
+  String get extensionStringProperty => '';
+  void set extensionStringProperty(String value) {}
+  int get extensionReadOnlyProperty => 0;
+
+  static int intStaticField = 0;
+  static num numStaticField = 0;
+  static String stringStaticField = '';
+  static final int finalStaticField = 0;
+  static late int lateStaticField;
+  static late final int lateFinalStaticField;
+
+  test() {
+    for (this.intField in [1]) { // Error
+      print(this.intField);
+    }
+    for (this?.intField in [1]) { // Error
+      print(this?.intField);
+    }
+    for (this.numField in [1]) { // Error
+      print(this.numField);
+    }
+    for (this?.numField in [1]) { // Error
+      print(this?.numField);
+    }
+    for (this.lateField in [1]) { // Error
+      print(this.lateField);
+    }
+    for (this?.lateField in [1]) { // Error
+      print(this?.lateField);
+    }
+    for (this.extensionIntProperty in [1]) { // Error
+      print(this.extensionIntProperty);
+    }
+    for (this?.extensionIntProperty in [1]) { // Error
+      print(this?.extensionIntProperty);
+    }
+    for (this.extensionNumProperty in [1]) { // Error
+      print(this.extensionNumProperty);
+    }
+    for (this?.extensionNumProperty in [1]) { // Error
+      print(this?.extensionNumProperty);
+    }
+    for (extensionStringProperty in [1]) { // Error
+      print(extensionStringProperty);
+    }
+    for (this.extensionStringProperty in [1]) { // Error
+      print(this.extensionStringProperty);
+    }
+    for (this?.extensionStringProperty in [1]) { // Error
+      print(this?.extensionStringProperty);
+    }
+    for (extensionStringProperty in <int>[1]) { // Error
+      print(extensionStringProperty);
+    }
+    for (this.extensionStringProperty in <int>[1]) { // Error
+      print(this.extensionStringProperty);
+    }
+    for (this?.extensionStringProperty in <int>[1]) { // Error
+      print(this?.extensionStringProperty);
+    }
+    for (extensionReadOnlyProperty in [1]) { // Error
+      print(extensionReadOnlyProperty);
+    }
+    for (this.extensionReadOnlyProperty in [1]) { // Error
+      print(this.extensionReadOnlyProperty);
+    }
+    for (this?.extensionReadOnlyProperty in [1]) { // Error
+      print(this?.extensionReadOnlyProperty);
+    }
+    for (finalStaticField in [1]) { // Error
+      print(finalStaticField);
+    }
+    for (stringStaticField in [1]) { // Error
+      print(stringStaticField);
+    }
+    for (stringStaticField in <int>[1]) { // Error
+      print(stringStaticField);
+    }
+    for (lateFinalStaticField in [1]) { // Ok
+      print(lateFinalStaticField);
+    }
+  }
+
+  extensionMethod() {
+    for (intField in [1]) { // Ok
+      print(intField);
+    }
+    for (numField in [1]) { // Ok
+      print(numField);
+    }
+    for (lateField in [1]) { // Ok
+      print(lateField);
+    }
+    for (extensionIntProperty in [1]) { // Ok
+      print(extensionIntProperty);
+    }
+    for (extensionNumProperty in [1]) { // Ok
+      print(extensionNumProperty);
+    }
+    for (intStaticField in [1]) { // Ok
+      print(intStaticField);
+    }
+    for (numStaticField in [1]) { // Ok
+      print(numStaticField);
+    }
+    for (lateStaticField in [1]) { // Ok
+      print(lateStaticField);
+    }
+  }
+}
+
+extension IndexExtension on int {
+  operator[]=(int index, int value) {}
+  int operator[](int index) => 0;
+
+  extensionMethod() {
+    for (this[0] in [1]) { // Error
+      print(this[0]);
+    }
+    for (this?[0] in [1]) { // Error
+      print(this?[0]);
+    }
+  }
+}
\ No newline at end of file
diff --git a/pkg/front_end/testcases/general/for_in.dart.strong.expect b/pkg/front_end/testcases/general/for_in.dart.strong.expect
new file mode 100644
index 0000000..4d46075
--- /dev/null
+++ b/pkg/front_end/testcases/general/for_in.dart.strong.expect
@@ -0,0 +1,1883 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/for_in.dart:16:14: Error: A for-in loop-variable can't be 'const'.
+// Try removing the 'const' modifier.
+//   for (const constLocal in [1]) { // Error
+//              ^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/for_in.dart:19:8: Error: Can't have modifier 'late' here.
+// Try removing 'late'.
+//   for (late int lateLocal in [1]) { // Error
+//        ^^^^
+//
+// pkg/front_end/testcases/general/for_in.dart:29:16: Error: A for-in loop-variable can't be 'const'.
+// Try removing the 'const' modifier.
+//     for (const constLocal in [1]) constLocal // Error
+//                ^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/for_in.dart:32:10: Error: Can't have modifier 'late' here.
+// Try removing 'late'.
+//     for (late int lateLocal in [1]) lateLocal // Error
+//          ^^^^
+//
+// pkg/front_end/testcases/general/for_in.dart:41:16: Error: A for-in loop-variable can't be 'const'.
+// Try removing the 'const' modifier.
+//     for (const constLocal in [1]) 0: constLocal // Error
+//                ^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/for_in.dart:44:10: Error: Can't have modifier 'late' here.
+// Try removing 'late'.
+//     for (late int lateLocal in [1]) 0: lateLocal // Error
+//          ^^^^
+//
+// pkg/front_end/testcases/general/for_in.dart:52:24: Error: Unexpected token ','.
+//   for (int? multiLocal1, multiLocal2 in [1]) { // Error
+//                        ^
+//
+// pkg/front_end/testcases/general/for_in.dart:52:8: Error: A for-in loop can't have more than one loop variable.
+//   for (int? multiLocal1, multiLocal2 in [1]) { // Error
+//        ^^^
+//
+// pkg/front_end/testcases/general/for_in.dart:56:26: Error: Unexpected token ','.
+//   for (var varMultiLocal1, varMultiLocal2 in [1]) { // Error
+//                          ^
+//
+// pkg/front_end/testcases/general/for_in.dart:56:8: Error: A for-in loop can't have more than one loop variable.
+//   for (var varMultiLocal1, varMultiLocal2 in [1]) { // Error
+//        ^^^
+//
+// pkg/front_end/testcases/general/for_in.dart:60:26: Error: Unexpected token ','.
+//   for (num numMultiLocal1, numMultiLocal2 in [1]) { // Error
+//                          ^
+//
+// pkg/front_end/testcases/general/for_in.dart:60:8: Error: A for-in loop can't have more than one loop variable.
+//   for (num numMultiLocal1, numMultiLocal2 in [1]) { // Error
+//        ^^^
+//
+// pkg/front_end/testcases/general/for_in.dart:64:8: Error: Expected an identifier, but got '1'.
+// Try inserting an identifier before '1'.
+//   for (1 in [1]) { // Error
+//        ^
+//
+// pkg/front_end/testcases/general/for_in.dart:64:8: Error: Can't assign to this, so it can't be used in a for-in loop.
+//   for (1 in [1]) { // Error
+//        ^
+//
+// pkg/front_end/testcases/general/for_in.dart:67:12: Error: Unexpected token '('.
+//   for (main() in [1]) { // Error
+//            ^
+//
+// pkg/front_end/testcases/general/for_in.dart:67:8: Error: Can't assign to this, so it can't be used in a for-in loop.
+//   for (main() in [1]) { // Error
+//        ^^^^
+//
+// pkg/front_end/testcases/general/for_in.dart:71:8: Error: Can't assign to the final variable 'existingFinalLocal'.
+//   for (existingFinalLocal in [1]) { // Error
+//        ^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/for_in.dart:82:9: Error: Unexpected token '.'.
+//   for (c.intField in [1]) { // Error
+//         ^
+//
+// pkg/front_end/testcases/general/for_in.dart:85:9: Error: Unexpected token '.'.
+//   for (c.numField in [1]) { // Error
+//         ^
+//
+// pkg/front_end/testcases/general/for_in.dart:88:9: Error: Unexpected token '.'.
+//   for (c.lateField in [1]) { // Error
+//         ^
+//
+// pkg/front_end/testcases/general/for_in.dart:91:9: Error: Unexpected token '?.'.
+//   for (c?.intField in [1]) { // Error
+//         ^^
+//
+// pkg/front_end/testcases/general/for_in.dart:94:9: Error: Unexpected token '?.'.
+//   for (c?.numField in [1]) { // Error
+//         ^^
+//
+// pkg/front_end/testcases/general/for_in.dart:97:9: Error: Unexpected token '?.'.
+//   for (c?.lateField in [1]) { // Error
+//         ^^
+//
+// pkg/front_end/testcases/general/for_in.dart:100:9: Error: Unexpected token '.'.
+//   for (c.stringField in [1]) { // Error
+//         ^
+//
+// pkg/front_end/testcases/general/for_in.dart:103:9: Error: Unexpected token '.'.
+//   for (c.stringField in <int>[1]) { // Error
+//         ^
+//
+// pkg/front_end/testcases/general/for_in.dart:106:9: Error: Unexpected token '?.'.
+//   for (c?.stringField in [1]) { // Error
+//         ^^
+//
+// pkg/front_end/testcases/general/for_in.dart:109:9: Error: Unexpected token '?.'.
+//   for (c?.stringField in <int>[1]) { // Error
+//         ^^
+//
+// pkg/front_end/testcases/general/for_in.dart:112:9: Error: Unexpected token '.'.
+//   for (c.finalField in [1]) { // Error
+//         ^
+//
+// pkg/front_end/testcases/general/for_in.dart:115:9: Error: Unexpected token '?.'.
+//   for (c?.finalField in [1]) { // Error
+//         ^^
+//
+// pkg/front_end/testcases/general/for_in.dart:118:9: Error: Unexpected token '.'.
+//   for (c.lateFinalField in [1]) { // Error
+//         ^
+//
+// pkg/front_end/testcases/general/for_in.dart:121:9: Error: Unexpected token '?.'.
+//   for (c?.lateFinalField in [1]) { // Error
+//         ^^
+//
+// pkg/front_end/testcases/general/for_in.dart:124:9: Error: Unexpected token '['.
+//   for (c[0] in [1]) { // Error
+//         ^
+//
+// pkg/front_end/testcases/general/for_in.dart:127:9: Error: Unexpected token '?'.
+//   for (c?[0] in [1]) { // Error
+//         ^
+//
+// pkg/front_end/testcases/general/for_in.dart:130:8: Error: Setter not found: 'finalTopLevel'.
+//   for (finalTopLevel in [1]) { // Error
+//        ^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/for_in.dart:133:8: Error: Setter not found: 'constTopLevel'.
+//   for (constTopLevel in [1]) { // Error
+//        ^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/for_in.dart:142:13: Error: Unexpected token '.'.
+//   for (defer.intTopLevel in [1]) { // Error
+//             ^
+//
+// pkg/front_end/testcases/general/for_in.dart:145:13: Error: Unexpected token '.'.
+//   for (defer.numTopLevel in [1]) { // Error
+//             ^
+//
+// pkg/front_end/testcases/general/for_in.dart:148:13: Error: Unexpected token '.'.
+//   for (defer.lateTopLevel in [1]) { // Error
+//             ^
+//
+// pkg/front_end/testcases/general/for_in.dart:151:13: Error: Unexpected token '.'.
+//   for (defer.lateFinalTopLevel in [1]) { // Error
+//             ^
+//
+// pkg/front_end/testcases/general/for_in.dart:154:13: Error: Unexpected token '.'.
+//   for (defer.finalTopLevel in [1]) { // Error
+//             ^
+//
+// pkg/front_end/testcases/general/for_in.dart:157:13: Error: Unexpected token '.'.
+//   for (defer.constTopLevel in [1]) { // Error
+//             ^
+//
+// pkg/front_end/testcases/general/for_in.dart:160:13: Error: Unexpected token '.'.
+//   for (defer.stringTopLevel in [1]) { // Error
+//             ^
+//
+// pkg/front_end/testcases/general/for_in.dart:163:13: Error: Unexpected token '.'.
+//   for (defer.stringTopLevel in <int>[1]) { // Error
+//             ^
+//
+// pkg/front_end/testcases/general/for_in.dart:166:13: Error: Unexpected token '.'.
+//   for (Class.stringStaticField in [1]) { // Error
+//             ^
+//
+// pkg/front_end/testcases/general/for_in.dart:169:13: Error: Unexpected token '.'.
+//   for (Class.stringStaticField in <int>[1]) { // Error
+//             ^
+//
+// pkg/front_end/testcases/general/for_in.dart:172:13: Error: Unexpected token '.'.
+//   for (Class.finalStaticField in [1]) { // Error
+//             ^
+//
+// pkg/front_end/testcases/general/for_in.dart:175:13: Error: Unexpected token '.'.
+//   for (Class.lateFinalStaticField in [1]) { // Error
+//             ^
+//
+// pkg/front_end/testcases/general/for_in.dart:178:17: Error: Unexpected token '.'.
+//   for (Extension.stringStaticField in [1]) { // Error
+//                 ^
+//
+// pkg/front_end/testcases/general/for_in.dart:181:17: Error: Unexpected token '.'.
+//   for (Extension.stringStaticField in <int>[1]) { // Error
+//                 ^
+//
+// pkg/front_end/testcases/general/for_in.dart:184:17: Error: Unexpected token '.'.
+//   for (Extension.finalStaticField in [1]) { // Error
+//                 ^
+//
+// pkg/front_end/testcases/general/for_in.dart:187:17: Error: Unexpected token '.'.
+//   for (Extension.lateFinalStaticField in [1]) { // Error
+//                 ^
+//
+// pkg/front_end/testcases/general/for_in.dart:190:13: Error: Unexpected token '.'.
+//   for (Class.intStaticField in [1]) { // Error
+//             ^
+//
+// pkg/front_end/testcases/general/for_in.dart:193:13: Error: Unexpected token '.'.
+//   for (Class.numStaticField in [1]) { // Error
+//             ^
+//
+// pkg/front_end/testcases/general/for_in.dart:196:13: Error: Unexpected token '.'.
+//   for (Class.lateStaticField in [1]) { // Error
+//             ^
+//
+// pkg/front_end/testcases/general/for_in.dart:199:17: Error: Unexpected token '.'.
+//   for (Extension.intStaticField in [1]) { // Error
+//                 ^
+//
+// pkg/front_end/testcases/general/for_in.dart:202:17: Error: Unexpected token '.'.
+//   for (Extension.numStaticField in [1]) { // Error
+//                 ^
+//
+// pkg/front_end/testcases/general/for_in.dart:205:17: Error: Unexpected token '.'.
+//   for (Extension.lateStaticField in [1]) { // Error
+//                 ^
+//
+// pkg/front_end/testcases/general/for_in.dart:22:31: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+//   for (String stringLocal in [1]) { // Error
+//                               ^
+//
+// pkg/front_end/testcases/general/for_in.dart:25:15: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+// Try changing the type of the variable.
+//   for (String stringLocal in <int>[1]) { // Error
+//               ^
+//
+// pkg/front_end/testcases/general/for_in.dart:35:33: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+//     for (String stringLocal in [1]) stringLocal // Error
+//                                 ^
+//
+// pkg/front_end/testcases/general/for_in.dart:38:17: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+// Try changing the type of the variable.
+//     for (String stringLocal in <int>[1]) stringLocal // Error
+//                 ^
+//
+// pkg/front_end/testcases/general/for_in.dart:47:33: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+//     for (String stringLocal in [1]) 0: stringLocal // Error
+//                                 ^
+//
+// pkg/front_end/testcases/general/for_in.dart:50:17: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+// Try changing the type of the variable.
+//     for (String stringLocal in <int>[1]) 0: stringLocal // Error
+//                 ^
+//
+// pkg/front_end/testcases/general/for_in.dart:61:11: Error: Non-nullable variable 'numMultiLocal1' must be assigned before it can be used.
+//     print(numMultiLocal1);
+//           ^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/for_in.dart:62:11: Error: Non-nullable variable 'numMultiLocal2' must be assigned before it can be used.
+//     print(numMultiLocal2);
+//           ^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/for_in.dart:72:11: Error: Final variable 'existingFinalLocal' must be assigned before it can be used.
+//     print(existingFinalLocal);
+//           ^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/for_in.dart:75:32: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+//   for (existingStringLocal in [1]) { // Error
+//                                ^
+//
+// pkg/front_end/testcases/general/for_in.dart:78:28: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+//   for (existingStringLocal in <int>[1]) { // Error
+//                            ^
+//
+// pkg/front_end/testcases/general/for_in.dart:136:27: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+//   for (stringTopLevel in [1]) { // Error
+//                           ^
+//
+// pkg/front_end/testcases/general/for_in.dart:139:23: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+//   for (stringTopLevel in <int>[1]) { // Error
+//                       ^
+//
+// pkg/front_end/testcases/general/for_in.dart:296:10: Error: Expected an identifier, but got 'this'.
+// Try inserting an identifier before 'this'.
+//     for (this.intField in [1]) { // Error
+//          ^^^^
+//
+// pkg/front_end/testcases/general/for_in.dart:299:10: Error: Expected an identifier, but got 'this'.
+// Try inserting an identifier before 'this'.
+//     for (this?.intField in [1]) { // Error
+//          ^^^^
+//
+// pkg/front_end/testcases/general/for_in.dart:302:10: Error: Expected an identifier, but got 'this'.
+// Try inserting an identifier before 'this'.
+//     for (this.numField in [1]) { // Error
+//          ^^^^
+//
+// pkg/front_end/testcases/general/for_in.dart:305:10: Error: Expected an identifier, but got 'this'.
+// Try inserting an identifier before 'this'.
+//     for (this?.numField in [1]) { // Error
+//          ^^^^
+//
+// pkg/front_end/testcases/general/for_in.dart:308:10: Error: Expected an identifier, but got 'this'.
+// Try inserting an identifier before 'this'.
+//     for (this.lateField in [1]) { // Error
+//          ^^^^
+//
+// pkg/front_end/testcases/general/for_in.dart:311:10: Error: Expected an identifier, but got 'this'.
+// Try inserting an identifier before 'this'.
+//     for (this?.lateField in [1]) { // Error
+//          ^^^^
+//
+// pkg/front_end/testcases/general/for_in.dart:320:10: Error: Expected an identifier, but got 'this'.
+// Try inserting an identifier before 'this'.
+//     for (this.stringField in [1]) { // Error
+//          ^^^^
+//
+// pkg/front_end/testcases/general/for_in.dart:323:10: Error: Expected an identifier, but got 'this'.
+// Try inserting an identifier before 'this'.
+//     for (this.stringField in <int>[1]) { // Error
+//          ^^^^
+//
+// pkg/front_end/testcases/general/for_in.dart:326:10: Error: Expected an identifier, but got 'this'.
+// Try inserting an identifier before 'this'.
+//     for (this?.stringField in [1]) { // Error
+//          ^^^^
+//
+// pkg/front_end/testcases/general/for_in.dart:329:10: Error: Expected an identifier, but got 'this'.
+// Try inserting an identifier before 'this'.
+//     for (this?.stringField in <int>[1]) { // Error
+//          ^^^^
+//
+// pkg/front_end/testcases/general/for_in.dart:332:10: Error: Expected an identifier, but got 'this'.
+// Try inserting an identifier before 'this'.
+//     for (this[0] in [1]) { // Error
+//          ^^^^
+//
+// pkg/front_end/testcases/general/for_in.dart:335:10: Error: Expected an identifier, but got 'this'.
+// Try inserting an identifier before 'this'.
+//     for (this?[0] in [1]) { // Error
+//          ^^^^
+//
+// pkg/front_end/testcases/general/for_in.dart:344:10: Error: Expected an identifier, but got 'this'.
+// Try inserting an identifier before 'this'.
+//     for (this.finalField in [1]) { // Error
+//          ^^^^
+//
+// pkg/front_end/testcases/general/for_in.dart:347:10: Error: Expected an identifier, but got 'this'.
+// Try inserting an identifier before 'this'.
+//     for (this.finalField in <int>[1]) { // Error
+//          ^^^^
+//
+// pkg/front_end/testcases/general/for_in.dart:350:10: Error: Expected an identifier, but got 'this'.
+// Try inserting an identifier before 'this'.
+//     for (this?.finalField in [1]) { // Error
+//          ^^^^
+//
+// pkg/front_end/testcases/general/for_in.dart:353:10: Error: Expected an identifier, but got 'this'.
+// Try inserting an identifier before 'this'.
+//     for (this?.finalField in <int>[1]) { // Error
+//          ^^^^
+//
+// pkg/front_end/testcases/general/for_in.dart:359:10: Error: Expected an identifier, but got 'this'.
+// Try inserting an identifier before 'this'.
+//     for (this.lateFinalField in [1]) { // Error
+//          ^^^^
+//
+// pkg/front_end/testcases/general/for_in.dart:362:10: Error: Expected an identifier, but got 'this'.
+// Try inserting an identifier before 'this'.
+//     for (this?.lateFinalField in [1]) { // Error
+//          ^^^^
+//
+// pkg/front_end/testcases/general/for_in.dart:365:10: Error: Setter not found: 'finalStaticField'.
+//     for (finalStaticField in [1]) { // Error
+//          ^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/for_in.dart:377:10: Error: Expected an identifier, but got 'this'.
+// Try inserting an identifier before 'this'.
+//     for (this.extensionIntProperty in [1]) { // Error
+//          ^^^^
+//
+// pkg/front_end/testcases/general/for_in.dart:380:10: Error: Expected an identifier, but got 'this'.
+// Try inserting an identifier before 'this'.
+//     for (this?.extensionIntProperty in [1]) { // Error
+//          ^^^^
+//
+// pkg/front_end/testcases/general/for_in.dart:383:10: Error: Expected an identifier, but got 'this'.
+// Try inserting an identifier before 'this'.
+//     for (this.extensionNumProperty in [1]) { // Error
+//          ^^^^
+//
+// pkg/front_end/testcases/general/for_in.dart:386:10: Error: Expected an identifier, but got 'this'.
+// Try inserting an identifier before 'this'.
+//     for (this?.extensionNumProperty in [1]) { // Error
+//          ^^^^
+//
+// pkg/front_end/testcases/general/for_in.dart:389:19: Error: Unexpected token '('.
+//     for (Extension(this).extensionIntProperty in [1]) { // Error
+//                   ^
+//
+// pkg/front_end/testcases/general/for_in.dart:392:19: Error: Unexpected token '('.
+//     for (Extension(this)?.extensionIntProperty in [1]) { // Error
+//                   ^
+//
+// pkg/front_end/testcases/general/for_in.dart:395:19: Error: Unexpected token '('.
+//     for (Extension(this).extensionNumProperty in [1]) { // Error
+//                   ^
+//
+// pkg/front_end/testcases/general/for_in.dart:398:19: Error: Unexpected token '('.
+//     for (Extension(this)?.extensionNumProperty in [1]) { // Error
+//                   ^
+//
+// pkg/front_end/testcases/general/for_in.dart:401:19: Error: Unexpected token '('.
+//     for (Extension(this).extensionStringProperty in [1]) { // Error
+//                   ^
+//
+// pkg/front_end/testcases/general/for_in.dart:404:19: Error: Unexpected token '('.
+//     for (Extension(this)?.extensionStringProperty in [1]) { // Error
+//                   ^
+//
+// pkg/front_end/testcases/general/for_in.dart:407:19: Error: Unexpected token '('.
+//     for (Extension(this).extensionStringProperty in <int>[1]) { // Error
+//                   ^
+//
+// pkg/front_end/testcases/general/for_in.dart:410:19: Error: Unexpected token '('.
+//     for (Extension(this)?.extensionStringProperty in <int>[1]) { // Error
+//                   ^
+//
+// pkg/front_end/testcases/general/for_in.dart:413:19: Error: Unexpected token '('.
+//     for (Extension(this).extensionReadOnlyProperty in [1]) { // Error
+//                   ^
+//
+// pkg/front_end/testcases/general/for_in.dart:416:19: Error: Unexpected token '('.
+//     for (Extension(this)?.extensionReadOnlyProperty in [1]) { // Error
+//                   ^
+//
+// pkg/front_end/testcases/general/for_in.dart:419:10: Error: Expected an identifier, but got '0'.
+// Try inserting an identifier before '0'.
+//     for (0[0] in [1]) { // Error
+//          ^
+//
+// pkg/front_end/testcases/general/for_in.dart:422:10: Error: Expected an identifier, but got '0'.
+// Try inserting an identifier before '0'.
+//     for (0?[0] in [1]) { // Error
+//          ^
+//
+// pkg/front_end/testcases/general/for_in.dart:425:24: Error: Unexpected token '('.
+//     for (IndexExtension(0)[0] in [1]) { // Error
+//                        ^
+//
+// pkg/front_end/testcases/general/for_in.dart:428:24: Error: Unexpected token '('.
+//     for (IndexExtension(0)?[0] in [1]) { // Error
+//                        ^
+//
+// pkg/front_end/testcases/general/for_in.dart:314:26: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+//     for (stringField in [1]) { // Error
+//                          ^
+//
+// pkg/front_end/testcases/general/for_in.dart:317:22: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+//     for (stringField in <int>[1]) { // Error
+//                      ^
+//
+// pkg/front_end/testcases/general/for_in.dart:338:10: Error: The setter 'finalField' isn't defined for the type 'Class'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/for_in.dart'.
+// Try correcting the name to the name of an existing setter, or defining a setter or field named 'finalField'.
+//     for (finalField in [1]) { // Error
+//          ^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/for_in.dart:341:10: Error: The setter 'finalField' isn't defined for the type 'Class'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/for_in.dart'.
+// Try correcting the name to the name of an existing setter, or defining a setter or field named 'finalField'.
+//     for (finalField in <int>[1]) { // Error
+//          ^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/for_in.dart:368:32: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+//     for (stringStaticField in [1]) { // Error
+//                                ^
+//
+// pkg/front_end/testcases/general/for_in.dart:371:28: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+//     for (stringStaticField in <int>[1]) { // Error
+//                            ^
+//
+// pkg/front_end/testcases/general/for_in.dart:463:10: Error: Expected an identifier, but got 'super'.
+// Try inserting an identifier before 'super'.
+//     for (super.stringField in [1]) { // Error
+//          ^^^^^
+//
+// pkg/front_end/testcases/general/for_in.dart:466:10: Error: Expected an identifier, but got 'super'.
+// Try inserting an identifier before 'super'.
+//     for (super.stringField in <int>[1]) { // Error
+//          ^^^^^
+//
+// pkg/front_end/testcases/general/for_in.dart:469:10: Error: Expected an identifier, but got 'super'.
+// Try inserting an identifier before 'super'.
+//     for (super.intField in [1]) { // Error
+//          ^^^^^
+//
+// pkg/front_end/testcases/general/for_in.dart:472:10: Error: Expected an identifier, but got 'super'.
+// Try inserting an identifier before 'super'.
+//     for (super.numField in [1]) { // Error
+//          ^^^^^
+//
+// pkg/front_end/testcases/general/for_in.dart:475:10: Error: Expected an identifier, but got 'super'.
+// Try inserting an identifier before 'super'.
+//     for (super.lateField in [1]) { // Error
+//          ^^^^^
+//
+// pkg/front_end/testcases/general/for_in.dart:478:10: Error: Expected an identifier, but got 'super'.
+// Try inserting an identifier before 'super'.
+//     for (super[0] in [1]) { // Error
+//          ^^^^^
+//
+// pkg/front_end/testcases/general/for_in.dart:481:10: Error: Expected an identifier, but got 'super'.
+// Try inserting an identifier before 'super'.
+//     for (super?[0] in [1]) { // Error
+//          ^^^^^
+//
+// pkg/front_end/testcases/general/for_in.dart:504:10: Error: Expected an identifier, but got 'this'.
+// Try inserting an identifier before 'this'.
+//     for (this.intField in [1]) { // Error
+//          ^^^^
+//
+// pkg/front_end/testcases/general/for_in.dart:507:10: Error: Expected an identifier, but got 'this'.
+// Try inserting an identifier before 'this'.
+//     for (this?.intField in [1]) { // Error
+//          ^^^^
+//
+// pkg/front_end/testcases/general/for_in.dart:510:10: Error: Expected an identifier, but got 'this'.
+// Try inserting an identifier before 'this'.
+//     for (this.numField in [1]) { // Error
+//          ^^^^
+//
+// pkg/front_end/testcases/general/for_in.dart:513:10: Error: Expected an identifier, but got 'this'.
+// Try inserting an identifier before 'this'.
+//     for (this?.numField in [1]) { // Error
+//          ^^^^
+//
+// pkg/front_end/testcases/general/for_in.dart:516:10: Error: Expected an identifier, but got 'this'.
+// Try inserting an identifier before 'this'.
+//     for (this.lateField in [1]) { // Error
+//          ^^^^
+//
+// pkg/front_end/testcases/general/for_in.dart:519:10: Error: Expected an identifier, but got 'this'.
+// Try inserting an identifier before 'this'.
+//     for (this?.lateField in [1]) { // Error
+//          ^^^^
+//
+// pkg/front_end/testcases/general/for_in.dart:522:10: Error: Expected an identifier, but got 'this'.
+// Try inserting an identifier before 'this'.
+//     for (this.extensionIntProperty in [1]) { // Error
+//          ^^^^
+//
+// pkg/front_end/testcases/general/for_in.dart:525:10: Error: Expected an identifier, but got 'this'.
+// Try inserting an identifier before 'this'.
+//     for (this?.extensionIntProperty in [1]) { // Error
+//          ^^^^
+//
+// pkg/front_end/testcases/general/for_in.dart:528:10: Error: Expected an identifier, but got 'this'.
+// Try inserting an identifier before 'this'.
+//     for (this.extensionNumProperty in [1]) { // Error
+//          ^^^^
+//
+// pkg/front_end/testcases/general/for_in.dart:531:10: Error: Expected an identifier, but got 'this'.
+// Try inserting an identifier before 'this'.
+//     for (this?.extensionNumProperty in [1]) { // Error
+//          ^^^^
+//
+// pkg/front_end/testcases/general/for_in.dart:537:10: Error: Expected an identifier, but got 'this'.
+// Try inserting an identifier before 'this'.
+//     for (this.extensionStringProperty in [1]) { // Error
+//          ^^^^
+//
+// pkg/front_end/testcases/general/for_in.dart:540:10: Error: Expected an identifier, but got 'this'.
+// Try inserting an identifier before 'this'.
+//     for (this?.extensionStringProperty in [1]) { // Error
+//          ^^^^
+//
+// pkg/front_end/testcases/general/for_in.dart:546:10: Error: Expected an identifier, but got 'this'.
+// Try inserting an identifier before 'this'.
+//     for (this.extensionStringProperty in <int>[1]) { // Error
+//          ^^^^
+//
+// pkg/front_end/testcases/general/for_in.dart:549:10: Error: Expected an identifier, but got 'this'.
+// Try inserting an identifier before 'this'.
+//     for (this?.extensionStringProperty in <int>[1]) { // Error
+//          ^^^^
+//
+// pkg/front_end/testcases/general/for_in.dart:552:10: Error: Setter not found: 'extensionReadOnlyProperty'.
+//     for (extensionReadOnlyProperty in [1]) { // Error
+//          ^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/for_in.dart:555:10: Error: Expected an identifier, but got 'this'.
+// Try inserting an identifier before 'this'.
+//     for (this.extensionReadOnlyProperty in [1]) { // Error
+//          ^^^^
+//
+// pkg/front_end/testcases/general/for_in.dart:558:10: Error: Expected an identifier, but got 'this'.
+// Try inserting an identifier before 'this'.
+//     for (this?.extensionReadOnlyProperty in [1]) { // Error
+//          ^^^^
+//
+// pkg/front_end/testcases/general/for_in.dart:561:10: Error: Setter not found: 'finalStaticField'.
+//     for (finalStaticField in [1]) { // Error
+//          ^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/for_in.dart:534:38: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+//     for (extensionStringProperty in [1]) { // Error
+//                                      ^
+//
+// pkg/front_end/testcases/general/for_in.dart:543:34: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+//     for (extensionStringProperty in <int>[1]) { // Error
+//                                  ^
+//
+// pkg/front_end/testcases/general/for_in.dart:564:32: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+//     for (stringStaticField in [1]) { // Error
+//                                ^
+//
+// pkg/front_end/testcases/general/for_in.dart:567:28: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+//     for (stringStaticField in <int>[1]) { // Error
+//                            ^
+//
+// pkg/front_end/testcases/general/for_in.dart:608:10: Error: Expected an identifier, but got 'this'.
+// Try inserting an identifier before 'this'.
+//     for (this[0] in [1]) { // Error
+//          ^^^^
+//
+// pkg/front_end/testcases/general/for_in.dart:611:10: Error: Expected an identifier, but got 'this'.
+// Try inserting an identifier before 'this'.
+//     for (this?[0] in [1]) { // Error
+//          ^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+import "org-dartlang-testcase:///for_in.dart" deferred as defer hide Extension, IndexExtension;
+
+class Class extends core::Object {
+  field core::int intField = 0;
+  field core::num numField = 0;
+  field core::String stringField = "";
+  final field core::int finalField = 0;
+  late field core::int lateField;
+  late final [setter] field core::int lateFinalField;
+  static field core::int intStaticField = 0;
+  static field core::num numStaticField = 0;
+  static field core::String stringStaticField = "";
+  static final field core::int finalStaticField = 0;
+  late static field core::int lateStaticField;
+  late static final [setter] field core::int lateFinalStaticField;
+  synthetic constructor •() → self::Class
+    : super core::Object::•()
+    ;
+  operator []=(core::int index, core::int value) → void {}
+  operator [](core::int index) → core::int
+    return 0;
+  method test() → dynamic {
+    for (final core::int #t1 in <core::int>[1]) {
+      invalid-expression "pkg/front_end/testcases/general/for_in.dart:296:15: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+    for (this.intField in [1]) { // Error
+              ^";
+      core::print(this.{self::Class::intField}{core::int});
+    }
+    for (final core::int #t2 in <core::int>[1]) {
+      invalid-expression "pkg/front_end/testcases/general/for_in.dart:299:16: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+    for (this?.intField in [1]) { // Error
+               ^";
+      core::print(this.{self::Class::intField}{core::int});
+    }
+    for (final core::int #t3 in <core::int>[1]) {
+      invalid-expression "pkg/front_end/testcases/general/for_in.dart:302:15: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+    for (this.numField in [1]) { // Error
+              ^";
+      core::print(this.{self::Class::numField}{core::num});
+    }
+    for (final core::int #t4 in <core::int>[1]) {
+      invalid-expression "pkg/front_end/testcases/general/for_in.dart:305:16: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+    for (this?.numField in [1]) { // Error
+               ^";
+      core::print(this.{self::Class::numField}{core::num});
+    }
+    for (final core::int #t5 in <core::int>[1]) {
+      invalid-expression "pkg/front_end/testcases/general/for_in.dart:308:15: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+    for (this.lateField in [1]) { // Error
+              ^";
+      core::print(this.{self::Class::lateField}{core::int});
+    }
+    for (final core::int #t6 in <core::int>[1]) {
+      invalid-expression "pkg/front_end/testcases/general/for_in.dart:311:16: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+    for (this?.lateField in [1]) { // Error
+               ^";
+      core::print(this.{self::Class::lateField}{core::int});
+    }
+    for (final core::String #t7 in <core::String>[invalid-expression "pkg/front_end/testcases/general/for_in.dart:314:26: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+    for (stringField in [1]) { // Error
+                         ^" in 1 as{TypeError} core::String]) {
+      this.{self::Class::stringField} = #t7;
+      core::print(this.{self::Class::stringField}{core::String});
+    }
+    for (final core::int #t8 in <core::int>[1]) {
+      this.{self::Class::stringField} = invalid-expression "pkg/front_end/testcases/general/for_in.dart:317:22: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+    for (stringField in <int>[1]) { // Error
+                     ^" in #t8 as{TypeError} core::String;
+      core::print(this.{self::Class::stringField}{core::String});
+    }
+    for (final core::int #t9 in <core::int>[1]) {
+      invalid-expression "pkg/front_end/testcases/general/for_in.dart:320:15: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+    for (this.stringField in [1]) { // Error
+              ^";
+      core::print(this.{self::Class::stringField}{core::String});
+    }
+    for (final core::int #t10 in <core::int>[1]) {
+      invalid-expression "pkg/front_end/testcases/general/for_in.dart:323:15: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+    for (this.stringField in <int>[1]) { // Error
+              ^";
+      core::print(this.{self::Class::stringField}{core::String});
+    }
+    for (final core::int #t11 in <core::int>[1]) {
+      invalid-expression "pkg/front_end/testcases/general/for_in.dart:326:16: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+    for (this?.stringField in [1]) { // Error
+               ^";
+      core::print(this.{self::Class::stringField}{core::String});
+    }
+    for (final core::int #t12 in <core::int>[1]) {
+      invalid-expression "pkg/front_end/testcases/general/for_in.dart:329:16: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+    for (this?.stringField in <int>[1]) { // Error
+               ^";
+      core::print(this.{self::Class::stringField}{core::String});
+    }
+    for (final core::int #t13 in <core::int>[1]) {
+      invalid-expression "pkg/front_end/testcases/general/for_in.dart:332:14: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+    for (this[0] in [1]) { // Error
+             ^";
+      core::print(this.{self::Class::[]}(0){(core::int) → core::int});
+    }
+    for (final core::int #t14 in <core::int>[1]) {
+      invalid-expression "pkg/front_end/testcases/general/for_in.dart:335:15: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+    for (this?[0] in [1]) { // Error
+              ^";
+      core::print(this.{self::Class::[]}(0){(core::int) → core::int});
+    }
+    for (final dynamic #t15 in <dynamic>[1]) {
+      invalid-expression "pkg/front_end/testcases/general/for_in.dart:338:10: Error: The setter 'finalField' isn't defined for the type 'Class'.
+ - 'Class' is from 'pkg/front_end/testcases/general/for_in.dart'.
+Try correcting the name to the name of an existing setter, or defining a setter or field named 'finalField'.
+    for (finalField in [1]) { // Error
+         ^^^^^^^^^^" in this.{<unresolved>}finalField = #t15;
+      core::print(this.{self::Class::finalField}{core::int});
+    }
+    for (final core::int #t16 in <core::int>[1]) {
+      invalid-expression "pkg/front_end/testcases/general/for_in.dart:341:10: Error: The setter 'finalField' isn't defined for the type 'Class'.
+ - 'Class' is from 'pkg/front_end/testcases/general/for_in.dart'.
+Try correcting the name to the name of an existing setter, or defining a setter or field named 'finalField'.
+    for (finalField in <int>[1]) { // Error
+         ^^^^^^^^^^" in this.{<unresolved>}finalField = #t16;
+      core::print(this.{self::Class::finalField}{core::int});
+    }
+    for (final core::int #t17 in <core::int>[1]) {
+      invalid-expression "pkg/front_end/testcases/general/for_in.dart:344:15: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+    for (this.finalField in [1]) { // Error
+              ^";
+      core::print(this.{self::Class::finalField}{core::int});
+    }
+    for (final core::int #t18 in <core::int>[1]) {
+      invalid-expression "pkg/front_end/testcases/general/for_in.dart:347:15: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+    for (this.finalField in <int>[1]) { // Error
+              ^";
+      core::print(this.{self::Class::finalField}{core::int});
+    }
+    for (final core::int #t19 in <core::int>[1]) {
+      invalid-expression "pkg/front_end/testcases/general/for_in.dart:350:16: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+    for (this?.finalField in [1]) { // Error
+               ^";
+      core::print(this.{self::Class::finalField}{core::int});
+    }
+    for (final core::int #t20 in <core::int>[1]) {
+      invalid-expression "pkg/front_end/testcases/general/for_in.dart:353:16: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+    for (this?.finalField in <int>[1]) { // Error
+               ^";
+      core::print(this.{self::Class::finalField}{core::int});
+    }
+    for (final core::int #t21 in <core::int>[1]) {
+      this.{self::Class::lateFinalField} = #t21;
+      core::print(this.{self::Class::lateFinalField}{core::int});
+    }
+    for (final core::int #t22 in <core::int>[1]) {
+      invalid-expression "pkg/front_end/testcases/general/for_in.dart:359:15: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+    for (this.lateFinalField in [1]) { // Error
+              ^";
+      core::print(this.{self::Class::lateFinalField}{core::int});
+    }
+    for (final core::int #t23 in <core::int>[1]) {
+      invalid-expression "pkg/front_end/testcases/general/for_in.dart:362:16: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+    for (this?.lateFinalField in [1]) { // Error
+               ^";
+      core::print(this.{self::Class::lateFinalField}{core::int});
+    }
+    for (final core::int #t24 in <core::int>[1]) {
+      invalid-expression "pkg/front_end/testcases/general/for_in.dart:365:10: Error: Setter not found: 'finalStaticField'.
+    for (finalStaticField in [1]) { // Error
+         ^^^^^^^^^^^^^^^^";
+      core::print(self::Class::finalStaticField);
+    }
+    for (final core::String #t25 in <core::String>[invalid-expression "pkg/front_end/testcases/general/for_in.dart:368:32: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+    for (stringStaticField in [1]) { // Error
+                               ^" in 1 as{TypeError} core::String]) {
+      self::Class::stringStaticField = #t25;
+      core::print(self::Class::stringStaticField);
+    }
+    for (final core::int #t26 in <core::int>[1]) {
+      self::Class::stringStaticField = invalid-expression "pkg/front_end/testcases/general/for_in.dart:371:28: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+    for (stringStaticField in <int>[1]) { // Error
+                           ^" in #t26 as{TypeError} core::String;
+      core::print(self::Class::stringStaticField);
+    }
+    for (final core::int #t27 in <core::int>[1]) {
+      self::Class::lateFinalStaticField = #t27;
+      core::print(self::Class::lateFinalStaticField);
+    }
+    for (final core::int #t28 in <core::int>[1]) {
+      invalid-expression "pkg/front_end/testcases/general/for_in.dart:377:15: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+    for (this.extensionIntProperty in [1]) { // Error
+              ^";
+      core::print(self::Extension|get#extensionIntProperty(this));
+    }
+    for (final core::int #t29 in <core::int>[1]) {
+      invalid-expression "pkg/front_end/testcases/general/for_in.dart:380:16: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+    for (this?.extensionIntProperty in [1]) { // Error
+               ^";
+      core::print(self::Extension|get#extensionIntProperty(this));
+    }
+    for (final core::int #t30 in <core::int>[1]) {
+      invalid-expression "pkg/front_end/testcases/general/for_in.dart:383:15: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+    for (this.extensionNumProperty in [1]) { // Error
+              ^";
+      core::print(self::Extension|get#extensionNumProperty(this));
+    }
+    for (final core::int #t31 in <core::int>[1]) {
+      invalid-expression "pkg/front_end/testcases/general/for_in.dart:386:16: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+    for (this?.extensionNumProperty in [1]) { // Error
+               ^";
+      core::print(self::Extension|get#extensionNumProperty(this));
+    }
+    for (final core::int #t32 in <core::int>[1]) {
+      invalid-expression "pkg/front_end/testcases/general/for_in.dart:389:26: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+    for (Extension(this).extensionIntProperty in [1]) { // Error
+                         ^";
+      core::print(self::Extension|get#extensionIntProperty(this));
+    }
+    for (final core::int #t33 in <core::int>[1]) {
+      invalid-expression "pkg/front_end/testcases/general/for_in.dart:392:27: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+    for (Extension(this)?.extensionIntProperty in [1]) { // Error
+                          ^";
+      core::print(self::Extension|get#extensionIntProperty(this));
+    }
+    for (final core::int #t34 in <core::int>[1]) {
+      invalid-expression "pkg/front_end/testcases/general/for_in.dart:395:26: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+    for (Extension(this).extensionNumProperty in [1]) { // Error
+                         ^";
+      core::print(self::Extension|get#extensionNumProperty(this));
+    }
+    for (final core::int #t35 in <core::int>[1]) {
+      invalid-expression "pkg/front_end/testcases/general/for_in.dart:398:27: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+    for (Extension(this)?.extensionNumProperty in [1]) { // Error
+                          ^";
+      core::print(self::Extension|get#extensionNumProperty(this));
+    }
+    for (final core::int #t36 in <core::int>[1]) {
+      invalid-expression "pkg/front_end/testcases/general/for_in.dart:401:26: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+    for (Extension(this).extensionStringProperty in [1]) { // Error
+                         ^";
+      core::print(self::Extension|get#extensionStringProperty(this));
+    }
+    for (final core::int #t37 in <core::int>[1]) {
+      invalid-expression "pkg/front_end/testcases/general/for_in.dart:404:27: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+    for (Extension(this)?.extensionStringProperty in [1]) { // Error
+                          ^";
+      core::print(self::Extension|get#extensionStringProperty(this));
+    }
+    for (final core::int #t38 in <core::int>[1]) {
+      invalid-expression "pkg/front_end/testcases/general/for_in.dart:407:26: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+    for (Extension(this).extensionStringProperty in <int>[1]) { // Error
+                         ^";
+      core::print(self::Extension|get#extensionStringProperty(this));
+    }
+    for (final core::int #t39 in <core::int>[1]) {
+      invalid-expression "pkg/front_end/testcases/general/for_in.dart:410:27: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+    for (Extension(this)?.extensionStringProperty in <int>[1]) { // Error
+                          ^";
+      core::print(self::Extension|get#extensionStringProperty(this));
+    }
+    for (final core::int #t40 in <core::int>[1]) {
+      invalid-expression "pkg/front_end/testcases/general/for_in.dart:413:26: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+    for (Extension(this).extensionReadOnlyProperty in [1]) { // Error
+                         ^";
+      core::print(self::Extension|get#extensionReadOnlyProperty(this));
+    }
+    for (final core::int #t41 in <core::int>[1]) {
+      invalid-expression "pkg/front_end/testcases/general/for_in.dart:416:27: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+    for (Extension(this)?.extensionReadOnlyProperty in [1]) { // Error
+                          ^";
+      core::print(self::Extension|get#extensionReadOnlyProperty(this));
+    }
+    for (final core::int #t42 in <core::int>[1]) {
+      invalid-expression "pkg/front_end/testcases/general/for_in.dart:419:11: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+    for (0[0] in [1]) { // Error
+          ^";
+      core::print(self::IndexExtension|[](0, 0));
+    }
+    for (final core::int #t43 in <core::int>[1]) {
+      invalid-expression "pkg/front_end/testcases/general/for_in.dart:422:12: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+    for (0?[0] in [1]) { // Error
+           ^";
+      core::print(let final core::int #t44 = 0 in #t44 == null ?{core::int?} null : self::IndexExtension|[](#t44, 0));
+    }
+    for (final core::int #t45 in <core::int>[1]) {
+      invalid-expression "pkg/front_end/testcases/general/for_in.dart:425:27: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+    for (IndexExtension(0)[0] in [1]) { // Error
+                          ^";
+      core::print(self::IndexExtension|[](0, 0));
+    }
+    for (final core::int #t46 in <core::int>[1]) {
+      invalid-expression "pkg/front_end/testcases/general/for_in.dart:428:28: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+    for (IndexExtension(0)?[0] in [1]) { // Error
+                           ^";
+      core::print(let final core::int #t47 = 0 in #t47 == null ?{core::int?} null : self::IndexExtension|[](#t47, 0));
+    }
+  }
+  method method() → dynamic {
+    for (final core::int #t48 in <core::int>[1]) {
+      this.{self::Class::intField} = #t48;
+      core::print(this.{self::Class::intField}{core::int});
+    }
+    for (final core::num #t49 in <core::num>[1]) {
+      this.{self::Class::numField} = #t49;
+      core::print(this.{self::Class::numField}{core::num});
+    }
+    for (final core::int #t50 in <core::int>[1]) {
+      this.{self::Class::lateField} = #t50;
+      core::print(this.{self::Class::lateField}{core::int});
+    }
+    for (final core::int #t51 in <core::int>[1]) {
+      self::Class::intStaticField = #t51;
+      core::print(self::Class::intStaticField);
+    }
+    for (final core::num #t52 in <core::num>[1]) {
+      self::Class::numStaticField = #t52;
+      core::print(self::Class::numStaticField);
+    }
+    for (final core::int #t53 in <core::int>[1]) {
+      self::Class::lateStaticField = #t53;
+      core::print(self::Class::lateStaticField);
+    }
+    for (final core::int #t54 in <core::int>[1]) {
+      self::Extension|set#extensionIntProperty(this, #t54);
+      core::print(self::Extension|get#extensionIntProperty(this));
+    }
+    for (final core::num #t55 in <core::num>[1]) {
+      self::Extension|set#extensionNumProperty(this, #t55);
+      core::print(self::Extension|get#extensionNumProperty(this));
+    }
+  }
+}
+class Subclass extends self::Class {
+  synthetic constructor •() → self::Subclass
+    : super self::Class::•()
+    ;
+  method test() → dynamic {
+    for (final core::int #t56 in <core::int>[1]) {
+      invalid-expression "pkg/front_end/testcases/general/for_in.dart:463:16: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+    for (super.stringField in [1]) { // Error
+               ^";
+      core::print(super.{self::Class::stringField});
+    }
+    for (final core::int #t57 in <core::int>[1]) {
+      invalid-expression "pkg/front_end/testcases/general/for_in.dart:466:16: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+    for (super.stringField in <int>[1]) { // Error
+               ^";
+      core::print(super.{self::Class::stringField});
+    }
+    for (final core::int #t58 in <core::int>[1]) {
+      invalid-expression "pkg/front_end/testcases/general/for_in.dart:469:16: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+    for (super.intField in [1]) { // Error
+               ^";
+      core::print(super.{self::Class::intField});
+    }
+    for (final core::int #t59 in <core::int>[1]) {
+      invalid-expression "pkg/front_end/testcases/general/for_in.dart:472:16: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+    for (super.numField in [1]) { // Error
+               ^";
+      core::print(super.{self::Class::numField});
+    }
+    for (final core::int #t60 in <core::int>[1]) {
+      invalid-expression "pkg/front_end/testcases/general/for_in.dart:475:16: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+    for (super.lateField in [1]) { // Error
+               ^";
+      core::print(super.{self::Class::lateField});
+    }
+    for (final core::int #t61 in <core::int>[1]) {
+      invalid-expression "pkg/front_end/testcases/general/for_in.dart:478:15: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+    for (super[0] in [1]) { // Error
+              ^";
+      core::print(super.{self::Class::[]}(0));
+    }
+    for (final core::int #t62 in <core::int>[1]) {
+      invalid-expression "pkg/front_end/testcases/general/for_in.dart:481:16: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+    for (super?[0] in [1]) { // Error
+               ^";
+      core::print(super.{self::Class::[]}(0));
+    }
+  }
+}
+extension Extension on self::Class {
+  get extensionIntProperty = self::Extension|get#extensionIntProperty;
+  set extensionIntProperty = self::Extension|set#extensionIntProperty;
+  get extensionNumProperty = self::Extension|get#extensionNumProperty;
+  set extensionNumProperty = self::Extension|set#extensionNumProperty;
+  get extensionStringProperty = self::Extension|get#extensionStringProperty;
+  set extensionStringProperty = self::Extension|set#extensionStringProperty;
+  get extensionReadOnlyProperty = self::Extension|get#extensionReadOnlyProperty;
+  static field intStaticField = self::Extension|intStaticField;
+  static field numStaticField = self::Extension|numStaticField;
+  static field stringStaticField = self::Extension|stringStaticField;
+  static field finalStaticField = self::Extension|finalStaticField;
+  static field lateStaticField = self::Extension|lateStaticField;
+  static field lateFinalStaticField = self::Extension|lateFinalStaticField;
+  method test = self::Extension|test;
+  method tearoff test = self::Extension|get#test;
+  method extensionMethod = self::Extension|extensionMethod;
+  method tearoff extensionMethod = self::Extension|get#extensionMethod;
+}
+extension IndexExtension on core::int {
+  operator []= = self::IndexExtension|[]=;
+  operator [] = self::IndexExtension|[];
+  method extensionMethod = self::IndexExtension|extensionMethod;
+  method tearoff extensionMethod = self::IndexExtension|get#extensionMethod;
+}
+static field core::int intTopLevel = 0;
+static final field core::int finalTopLevel = 0;
+static const field core::int constTopLevel = #C1;
+late static field core::int lateTopLevel;
+late static final [setter] field core::int lateFinalTopLevel;
+static field core::num numTopLevel = 0;
+static field core::String stringTopLevel = "";
+static field core::int Extension|intStaticField = 0;
+static field core::num Extension|numStaticField = 0;
+static field core::String Extension|stringStaticField = "";
+static final field core::int Extension|finalStaticField = 0;
+late static field core::int Extension|lateStaticField;
+late static final [setter] field core::int Extension|lateFinalStaticField;
+static method test() → dynamic {
+  {
+    invalid-expression "pkg/front_end/testcases/general/for_in.dart:16:14: Error: A for-in loop-variable can't be 'const'.
+Try removing the 'const' modifier.
+  for (const constLocal in [1]) { // Error
+             ^^^^^^^^^^";
+    for (core::int constLocal in <core::int>[1]) {
+      core::print(constLocal);
+    }
+  }
+  for (core::int lateLocal in <core::int>[1]) {
+    core::print(lateLocal);
+  }
+  for (core::String stringLocal in <core::String>[invalid-expression "pkg/front_end/testcases/general/for_in.dart:22:31: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+  for (String stringLocal in [1]) { // Error
+                              ^" in 1 as{TypeError} core::String]) {
+    core::print(stringLocal);
+  }
+  for (final core::int #t63 in <core::int>[1]) {
+    core::String stringLocal = invalid-expression "pkg/front_end/testcases/general/for_in.dart:25:15: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+Try changing the type of the variable.
+  for (String stringLocal in <int>[1]) { // Error
+              ^" in #t63 as{TypeError} core::String;
+    core::print(stringLocal);
+  }
+  core::print( block {
+    final core::List<core::int> #t64 = <core::int>[];
+    {
+      invalid-expression "pkg/front_end/testcases/general/for_in.dart:29:16: Error: A for-in loop-variable can't be 'const'.
+Try removing the 'const' modifier.
+    for (const constLocal in [1]) constLocal // Error
+               ^^^^^^^^^^";
+      for (core::int constLocal in <core::int>[1])
+        #t64.{core::List::add}{Invariant}(constLocal){(core::int) → void};
+    }
+  } =>#t64);
+  core::print( block {
+    final core::List<core::int> #t65 = <core::int>[];
+    for (core::int lateLocal in <core::int>[1])
+      #t65.{core::List::add}{Invariant}(lateLocal){(core::int) → void};
+  } =>#t65);
+  core::print( block {
+    final core::List<core::String> #t66 = <core::String>[];
+    for (core::String stringLocal in <core::String>[invalid-expression "pkg/front_end/testcases/general/for_in.dart:35:33: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+    for (String stringLocal in [1]) stringLocal // Error
+                                ^" in 1 as{TypeError} core::String])
+      #t66.{core::List::add}{Invariant}(stringLocal){(core::String) → void};
+  } =>#t66);
+  core::print( block {
+    final core::List<core::String> #t67 = <core::String>[];
+    for (final core::int #t68 in <core::int>[1]) {
+      core::String stringLocal = invalid-expression "pkg/front_end/testcases/general/for_in.dart:38:17: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+Try changing the type of the variable.
+    for (String stringLocal in <int>[1]) stringLocal // Error
+                ^" in #t68 as{TypeError} core::String;
+      #t67.{core::List::add}{Invariant}(stringLocal){(core::String) → void};
+    }
+  } =>#t67);
+  core::print( block {
+    final core::Map<core::int, core::int> #t69 = <core::int, core::int>{};
+    {
+      invalid-expression "pkg/front_end/testcases/general/for_in.dart:41:16: Error: A for-in loop-variable can't be 'const'.
+Try removing the 'const' modifier.
+    for (const constLocal in [1]) 0: constLocal // Error
+               ^^^^^^^^^^";
+      for (core::int constLocal in <core::int>[1])
+        #t69.{core::Map::[]=}{Invariant}(0, constLocal){(core::int, core::int) → void};
+    }
+  } =>#t69);
+  core::print( block {
+    final core::Map<core::int, core::int> #t70 = <core::int, core::int>{};
+    for (core::int lateLocal in <core::int>[1])
+      #t70.{core::Map::[]=}{Invariant}(0, lateLocal){(core::int, core::int) → void};
+  } =>#t70);
+  core::print( block {
+    final core::Map<core::int, core::String> #t71 = <core::int, core::String>{};
+    for (core::String stringLocal in <core::String>[invalid-expression "pkg/front_end/testcases/general/for_in.dart:47:33: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+    for (String stringLocal in [1]) 0: stringLocal // Error
+                                ^" in 1 as{TypeError} core::String])
+      #t71.{core::Map::[]=}{Invariant}(0, stringLocal){(core::int, core::String) → void};
+  } =>#t71);
+  core::print( block {
+    final core::Map<core::int, core::String> #t72 = <core::int, core::String>{};
+    for (final core::int #t73 in <core::int>[1]) {
+      core::String stringLocal = invalid-expression "pkg/front_end/testcases/general/for_in.dart:50:17: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+Try changing the type of the variable.
+    for (String stringLocal in <int>[1]) 0: stringLocal // Error
+                ^" in #t73 as{TypeError} core::String;
+      #t72.{core::Map::[]=}{Invariant}(0, stringLocal){(core::int, core::String) → void};
+    }
+  } =>#t72);
+  {
+    invalid-expression "pkg/front_end/testcases/general/for_in.dart:52:8: Error: A for-in loop can't have more than one loop variable.
+  for (int? multiLocal1, multiLocal2 in [1]) { // Error
+       ^^^";
+    for (final core::int #t74 in <core::int>[1]) {
+      core::int? multiLocal1;
+      core::int? multiLocal2;
+      core::print(multiLocal1);
+      core::print(multiLocal2);
+    }
+  }
+  {
+    invalid-expression "pkg/front_end/testcases/general/for_in.dart:56:8: Error: A for-in loop can't have more than one loop variable.
+  for (var varMultiLocal1, varMultiLocal2 in [1]) { // Error
+       ^^^";
+    for (final core::int #t75 in <core::int>[1]) {
+      dynamic varMultiLocal1;
+      dynamic varMultiLocal2;
+      core::print(varMultiLocal1);
+      core::print(varMultiLocal2);
+    }
+  }
+  {
+    invalid-expression "pkg/front_end/testcases/general/for_in.dart:60:8: Error: A for-in loop can't have more than one loop variable.
+  for (num numMultiLocal1, numMultiLocal2 in [1]) { // Error
+       ^^^";
+    for (final core::int #t76 in <core::int>[1]) {
+      core::num numMultiLocal1;
+      core::num numMultiLocal2;
+      core::print(invalid-expression "pkg/front_end/testcases/general/for_in.dart:61:11: Error: Non-nullable variable 'numMultiLocal1' must be assigned before it can be used.
+    print(numMultiLocal1);
+          ^^^^^^^^^^^^^^" in numMultiLocal1);
+      core::print(invalid-expression "pkg/front_end/testcases/general/for_in.dart:62:11: Error: Non-nullable variable 'numMultiLocal2' must be assigned before it can be used.
+    print(numMultiLocal2);
+          ^^^^^^^^^^^^^^" in numMultiLocal2);
+    }
+  }
+  {
+    invalid-expression "pkg/front_end/testcases/general/for_in.dart:64:8: Error: Can't assign to this, so it can't be used in a for-in loop.
+  for (1 in [1]) { // Error
+       ^";
+    for (final core::int #t77 in <core::int>[1]) {
+      1;
+    }
+  }
+  {
+    invalid-expression "pkg/front_end/testcases/general/for_in.dart:67:8: Error: Can't assign to this, so it can't be used in a for-in loop.
+  for (main() in [1]) { // Error
+       ^^^^";
+    for (final core::int #t78 in <core::int>[1]) {
+      self::main();
+    }
+  }
+  final core::int existingFinalLocal;
+  for (final core::int #t79 in <core::int>[1]) {
+    invalid-expression "pkg/front_end/testcases/general/for_in.dart:71:8: Error: Can't assign to the final variable 'existingFinalLocal'.
+  for (existingFinalLocal in [1]) { // Error
+       ^^^^^^^^^^^^^^^^^^";
+    core::print(invalid-expression "pkg/front_end/testcases/general/for_in.dart:72:11: Error: Final variable 'existingFinalLocal' must be assigned before it can be used.
+    print(existingFinalLocal);
+          ^^^^^^^^^^^^^^^^^^" in existingFinalLocal);
+  }
+  core::String existingStringLocal;
+  for (final core::String #t80 in <core::String>[invalid-expression "pkg/front_end/testcases/general/for_in.dart:75:32: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+  for (existingStringLocal in [1]) { // Error
+                               ^" in 1 as{TypeError} core::String]) {
+    existingStringLocal = #t80;
+    core::print(existingStringLocal);
+  }
+  for (final core::int #t81 in <core::int>[1]) {
+    existingStringLocal = invalid-expression "pkg/front_end/testcases/general/for_in.dart:78:28: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+  for (existingStringLocal in <int>[1]) { // Error
+                           ^" in #t81 as{TypeError} core::String;
+    core::print(existingStringLocal);
+  }
+  self::Class c = new self::Class::•();
+  for (final core::int #t82 in <core::int>[1]) {
+    invalid-expression "pkg/front_end/testcases/general/for_in.dart:82:10: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+  for (c.intField in [1]) { // Error
+         ^";
+    core::print(c.{self::Class::intField}{core::int});
+  }
+  for (final core::int #t83 in <core::int>[1]) {
+    invalid-expression "pkg/front_end/testcases/general/for_in.dart:85:10: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+  for (c.numField in [1]) { // Error
+         ^";
+    core::print(c.{self::Class::numField}{core::num});
+  }
+  for (final core::int #t84 in <core::int>[1]) {
+    invalid-expression "pkg/front_end/testcases/general/for_in.dart:88:10: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+  for (c.lateField in [1]) { // Error
+         ^";
+    core::print(c.{self::Class::lateField}{core::int});
+  }
+  for (final core::int #t85 in <core::int>[1]) {
+    invalid-expression "pkg/front_end/testcases/general/for_in.dart:91:11: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+  for (c?.intField in [1]) { // Error
+          ^";
+    core::print(let final self::Class #t86 = c in #t86 == null ?{core::int?} null : #t86.{self::Class::intField}{core::int});
+  }
+  for (final core::int #t87 in <core::int>[1]) {
+    invalid-expression "pkg/front_end/testcases/general/for_in.dart:94:11: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+  for (c?.numField in [1]) { // Error
+          ^";
+    core::print(let final self::Class #t88 = c in #t88 == null ?{core::num?} null : #t88.{self::Class::numField}{core::num});
+  }
+  for (final core::int #t89 in <core::int>[1]) {
+    invalid-expression "pkg/front_end/testcases/general/for_in.dart:97:11: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+  for (c?.lateField in [1]) { // Error
+          ^";
+    core::print(let final self::Class #t90 = c in #t90 == null ?{core::int?} null : #t90.{self::Class::lateField}{core::int});
+  }
+  for (final core::int #t91 in <core::int>[1]) {
+    invalid-expression "pkg/front_end/testcases/general/for_in.dart:100:10: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+  for (c.stringField in [1]) { // Error
+         ^";
+    core::print(c.{self::Class::stringField}{core::String});
+  }
+  for (final core::int #t92 in <core::int>[1]) {
+    invalid-expression "pkg/front_end/testcases/general/for_in.dart:103:10: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+  for (c.stringField in <int>[1]) { // Error
+         ^";
+    core::print(c.{self::Class::stringField}{core::String});
+  }
+  for (final core::int #t93 in <core::int>[1]) {
+    invalid-expression "pkg/front_end/testcases/general/for_in.dart:106:11: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+  for (c?.stringField in [1]) { // Error
+          ^";
+    core::print(let final self::Class #t94 = c in #t94 == null ?{core::String?} null : #t94.{self::Class::stringField}{core::String});
+  }
+  for (final core::int #t95 in <core::int>[1]) {
+    invalid-expression "pkg/front_end/testcases/general/for_in.dart:109:11: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+  for (c?.stringField in <int>[1]) { // Error
+          ^";
+    core::print(let final self::Class #t96 = c in #t96 == null ?{core::String?} null : #t96.{self::Class::stringField}{core::String});
+  }
+  for (final core::int #t97 in <core::int>[1]) {
+    invalid-expression "pkg/front_end/testcases/general/for_in.dart:112:10: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+  for (c.finalField in [1]) { // Error
+         ^";
+    core::print(c.{self::Class::finalField}{core::int});
+  }
+  for (final core::int #t98 in <core::int>[1]) {
+    invalid-expression "pkg/front_end/testcases/general/for_in.dart:115:11: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+  for (c?.finalField in [1]) { // Error
+          ^";
+    core::print(let final self::Class #t99 = c in #t99 == null ?{core::int?} null : #t99.{self::Class::finalField}{core::int});
+  }
+  for (final core::int #t100 in <core::int>[1]) {
+    invalid-expression "pkg/front_end/testcases/general/for_in.dart:118:10: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+  for (c.lateFinalField in [1]) { // Error
+         ^";
+    core::print(c.{self::Class::lateFinalField}{core::int});
+  }
+  for (final core::int #t101 in <core::int>[1]) {
+    invalid-expression "pkg/front_end/testcases/general/for_in.dart:121:11: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+  for (c?.lateFinalField in [1]) { // Error
+          ^";
+    core::print(let final self::Class #t102 = c in #t102 == null ?{core::int?} null : #t102.{self::Class::lateFinalField}{core::int});
+  }
+  for (final core::int #t103 in <core::int>[1]) {
+    invalid-expression "pkg/front_end/testcases/general/for_in.dart:124:9: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+  for (c[0] in [1]) { // Error
+        ^";
+    core::print(c.{self::Class::[]}(0){(core::int) → core::int});
+  }
+  for (final core::int #t104 in <core::int>[1]) {
+    invalid-expression "pkg/front_end/testcases/general/for_in.dart:127:10: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+  for (c?[0] in [1]) { // Error
+         ^";
+    core::print(c.{self::Class::[]}(0){(core::int) → core::int});
+  }
+  for (final core::int #t105 in <core::int>[1]) {
+    invalid-expression "pkg/front_end/testcases/general/for_in.dart:130:8: Error: Setter not found: 'finalTopLevel'.
+  for (finalTopLevel in [1]) { // Error
+       ^^^^^^^^^^^^^";
+    core::print(self::finalTopLevel);
+  }
+  for (final core::int #t106 in <core::int>[1]) {
+    invalid-expression "pkg/front_end/testcases/general/for_in.dart:133:8: Error: Setter not found: 'constTopLevel'.
+  for (constTopLevel in [1]) { // Error
+       ^^^^^^^^^^^^^";
+    core::print(#C1);
+  }
+  for (final core::String #t107 in <core::String>[invalid-expression "pkg/front_end/testcases/general/for_in.dart:136:27: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+  for (stringTopLevel in [1]) { // Error
+                          ^" in 1 as{TypeError} core::String]) {
+    self::stringTopLevel = #t107;
+    core::print(self::stringTopLevel);
+  }
+  for (final core::int #t108 in <core::int>[1]) {
+    self::stringTopLevel = invalid-expression "pkg/front_end/testcases/general/for_in.dart:139:23: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+  for (stringTopLevel in <int>[1]) { // Error
+                      ^" in #t108 as{TypeError} core::String;
+    core::print(self::stringTopLevel);
+  }
+  for (final core::int #t109 in <core::int>[1]) {
+    invalid-expression "pkg/front_end/testcases/general/for_in.dart:142:14: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+  for (defer.intTopLevel in [1]) { // Error
+             ^";
+    core::print(let final dynamic #t110 = CheckLibraryIsLoaded(defer) in self::intTopLevel);
+  }
+  for (final core::int #t111 in <core::int>[1]) {
+    invalid-expression "pkg/front_end/testcases/general/for_in.dart:145:14: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+  for (defer.numTopLevel in [1]) { // Error
+             ^";
+    core::print(let final dynamic #t112 = CheckLibraryIsLoaded(defer) in self::numTopLevel);
+  }
+  for (final core::int #t113 in <core::int>[1]) {
+    invalid-expression "pkg/front_end/testcases/general/for_in.dart:148:14: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+  for (defer.lateTopLevel in [1]) { // Error
+             ^";
+    core::print(let final dynamic #t114 = CheckLibraryIsLoaded(defer) in self::lateTopLevel);
+  }
+  for (final core::int #t115 in <core::int>[1]) {
+    invalid-expression "pkg/front_end/testcases/general/for_in.dart:151:14: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+  for (defer.lateFinalTopLevel in [1]) { // Error
+             ^";
+    core::print(let final dynamic #t116 = CheckLibraryIsLoaded(defer) in self::lateFinalTopLevel);
+  }
+  for (final core::int #t117 in <core::int>[1]) {
+    invalid-expression "pkg/front_end/testcases/general/for_in.dart:154:14: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+  for (defer.finalTopLevel in [1]) { // Error
+             ^";
+    core::print(let final dynamic #t118 = CheckLibraryIsLoaded(defer) in self::finalTopLevel);
+  }
+  for (final core::int #t119 in <core::int>[1]) {
+    invalid-expression "pkg/front_end/testcases/general/for_in.dart:157:14: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+  for (defer.constTopLevel in [1]) { // Error
+             ^";
+    core::print(let final dynamic #t120 = CheckLibraryIsLoaded(defer) in #C1);
+  }
+  for (final core::int #t121 in <core::int>[1]) {
+    invalid-expression "pkg/front_end/testcases/general/for_in.dart:160:14: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+  for (defer.stringTopLevel in [1]) { // Error
+             ^";
+    core::print(let final dynamic #t122 = CheckLibraryIsLoaded(defer) in self::stringTopLevel);
+  }
+  for (final core::int #t123 in <core::int>[1]) {
+    invalid-expression "pkg/front_end/testcases/general/for_in.dart:163:14: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+  for (defer.stringTopLevel in <int>[1]) { // Error
+             ^";
+    core::print(let final dynamic #t124 = CheckLibraryIsLoaded(defer) in self::stringTopLevel);
+  }
+  for (final core::int #t125 in <core::int>[1]) {
+    invalid-expression "pkg/front_end/testcases/general/for_in.dart:166:14: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+  for (Class.stringStaticField in [1]) { // Error
+             ^";
+    core::print(self::Class::stringStaticField);
+  }
+  for (final core::int #t126 in <core::int>[1]) {
+    invalid-expression "pkg/front_end/testcases/general/for_in.dart:169:14: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+  for (Class.stringStaticField in <int>[1]) { // Error
+             ^";
+    core::print(self::Class::stringStaticField);
+  }
+  for (final core::int #t127 in <core::int>[1]) {
+    invalid-expression "pkg/front_end/testcases/general/for_in.dart:172:14: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+  for (Class.finalStaticField in [1]) { // Error
+             ^";
+    core::print(self::Class::finalStaticField);
+  }
+  for (final core::int #t128 in <core::int>[1]) {
+    invalid-expression "pkg/front_end/testcases/general/for_in.dart:175:14: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+  for (Class.lateFinalStaticField in [1]) { // Error
+             ^";
+    core::print(self::Class::lateFinalStaticField);
+  }
+  for (final core::int #t129 in <core::int>[1]) {
+    invalid-expression "pkg/front_end/testcases/general/for_in.dart:178:18: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+  for (Extension.stringStaticField in [1]) { // Error
+                 ^";
+    core::print(self::Extension|stringStaticField);
+  }
+  for (final core::int #t130 in <core::int>[1]) {
+    invalid-expression "pkg/front_end/testcases/general/for_in.dart:181:18: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+  for (Extension.stringStaticField in <int>[1]) { // Error
+                 ^";
+    core::print(self::Extension|stringStaticField);
+  }
+  for (final core::int #t131 in <core::int>[1]) {
+    invalid-expression "pkg/front_end/testcases/general/for_in.dart:184:18: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+  for (Extension.finalStaticField in [1]) { // Error
+                 ^";
+    core::print(self::Extension|finalStaticField);
+  }
+  for (final core::int #t132 in <core::int>[1]) {
+    invalid-expression "pkg/front_end/testcases/general/for_in.dart:187:18: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+  for (Extension.lateFinalStaticField in [1]) { // Error
+                 ^";
+    core::print(self::Extension|lateFinalStaticField);
+  }
+  for (final core::int #t133 in <core::int>[1]) {
+    invalid-expression "pkg/front_end/testcases/general/for_in.dart:190:14: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+  for (Class.intStaticField in [1]) { // Error
+             ^";
+    core::print(self::Class::intStaticField);
+  }
+  for (final core::int #t134 in <core::int>[1]) {
+    invalid-expression "pkg/front_end/testcases/general/for_in.dart:193:14: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+  for (Class.numStaticField in [1]) { // Error
+             ^";
+    core::print(self::Class::numStaticField);
+  }
+  for (final core::int #t135 in <core::int>[1]) {
+    invalid-expression "pkg/front_end/testcases/general/for_in.dart:196:14: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+  for (Class.lateStaticField in [1]) { // Error
+             ^";
+    core::print(self::Class::lateStaticField);
+  }
+  for (final core::int #t136 in <core::int>[1]) {
+    invalid-expression "pkg/front_end/testcases/general/for_in.dart:199:18: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+  for (Extension.intStaticField in [1]) { // Error
+                 ^";
+    core::print(self::Extension|intStaticField);
+  }
+  for (final core::int #t137 in <core::int>[1]) {
+    invalid-expression "pkg/front_end/testcases/general/for_in.dart:202:18: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+  for (Extension.numStaticField in [1]) { // Error
+                 ^";
+    core::print(self::Extension|numStaticField);
+  }
+  for (final core::int #t138 in <core::int>[1]) {
+    invalid-expression "pkg/front_end/testcases/general/for_in.dart:205:18: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+  for (Extension.lateStaticField in [1]) { // Error
+                 ^";
+    core::print(self::Extension|lateStaticField);
+  }
+}
+static method main() → dynamic {
+  for (core::int intLocal in <core::int>[1]) {
+    core::print(intLocal);
+  }
+  for (core::num numLocal in <core::num>[1]) {
+    core::print(numLocal);
+  }
+  for (core::int varLocal in <core::int>[1]) {
+    core::print(varLocal);
+  }
+  for (final core::int finalLocal in <core::int>[1]) {
+    core::print(finalLocal);
+  }
+  core::print( block {
+    final core::List<core::int> #t139 = <core::int>[];
+    for (core::int intLocal in <core::int>[1])
+      #t139.{core::List::add}{Invariant}(intLocal){(core::int) → void};
+  } =>#t139);
+  core::print( block {
+    final core::List<core::num> #t140 = <core::num>[];
+    for (core::num numLocal in <core::num>[1])
+      #t140.{core::List::add}{Invariant}(numLocal){(core::num) → void};
+  } =>#t140);
+  core::print( block {
+    final core::List<core::int> #t141 = <core::int>[];
+    for (core::int varLocal in <core::int>[1])
+      #t141.{core::List::add}{Invariant}(varLocal){(core::int) → void};
+  } =>#t141);
+  core::print( block {
+    final core::List<core::int> #t142 = <core::int>[];
+    for (final core::int finalLocal in <core::int>[1])
+      #t142.{core::List::add}{Invariant}(finalLocal){(core::int) → void};
+  } =>#t142);
+  core::print( block {
+    final core::Map<core::int, core::int> #t143 = <core::int, core::int>{};
+    for (core::int intLocal in <core::int>[1])
+      #t143.{core::Map::[]=}{Invariant}(0, intLocal){(core::int, core::int) → void};
+  } =>#t143);
+  core::print( block {
+    final core::Map<core::int, core::num> #t144 = <core::int, core::num>{};
+    for (core::num numLocal in <core::num>[1])
+      #t144.{core::Map::[]=}{Invariant}(0, numLocal){(core::int, core::num) → void};
+  } =>#t144);
+  core::print( block {
+    final core::Map<core::int, core::int> #t145 = <core::int, core::int>{};
+    for (core::int varLocal in <core::int>[1])
+      #t145.{core::Map::[]=}{Invariant}(0, varLocal){(core::int, core::int) → void};
+  } =>#t145);
+  core::print( block {
+    final core::Map<core::int, core::int> #t146 = <core::int, core::int>{};
+    for (final core::int finalLocal in <core::int>[1])
+      #t146.{core::Map::[]=}{Invariant}(0, finalLocal){(core::int, core::int) → void};
+  } =>#t146);
+  for (final(core::int, core::int) #t147 in <(core::int, core::int)>[(1, 2)]) {
+    hoisted core::int a;
+    hoisted core::int b;
+    {
+      final synthesized(core::int, core::int) #0#0 = #t147;
+      a = #0#0.$1{core::int};
+      b = #0#0.$2{core::int};
+    }
+    core::print(a);
+    core::print(b);
+  }
+  core::int existingIntLocal;
+  for (final core::int #t148 in <core::int>[1]) {
+    existingIntLocal = #t148;
+    core::print(existingIntLocal);
+  }
+  core::num existingNumLocal;
+  for (final core::num #t149 in <core::num>[1]) {
+    existingNumLocal = #t149;
+    core::print(existingNumLocal);
+  }
+  new self::Class::•().{self::Class::method}(){() → dynamic};
+  for (final core::int #t150 in <core::int>[1]) {
+    self::intTopLevel = #t150;
+    core::print(self::intTopLevel);
+  }
+  for (final core::num #t151 in <core::num>[1]) {
+    self::numTopLevel = #t151;
+    core::print(self::numTopLevel);
+  }
+  for (final core::int #t152 in <core::int>[1]) {
+    self::lateTopLevel = #t152;
+    core::print(self::lateTopLevel);
+  }
+  for (final core::int #t153 in <core::int>[1]) {
+    self::lateFinalTopLevel = #t153;
+    core::print(self::lateFinalTopLevel);
+  }
+  self::Extension|extensionMethod(new self::Class::•());
+}
+static extension-member method Extension|get#extensionIntProperty(lowered final self::Class #this) → core::int
+  return 0;
+static extension-member method Extension|set#extensionIntProperty(lowered final self::Class #this, core::int value) → void {}
+static extension-member method Extension|get#extensionNumProperty(lowered final self::Class #this) → core::num
+  return 0;
+static extension-member method Extension|set#extensionNumProperty(lowered final self::Class #this, core::num value) → void {}
+static extension-member method Extension|get#extensionStringProperty(lowered final self::Class #this) → core::String
+  return "";
+static extension-member method Extension|set#extensionStringProperty(lowered final self::Class #this, core::String value) → void {}
+static extension-member method Extension|get#extensionReadOnlyProperty(lowered final self::Class #this) → core::int
+  return 0;
+static extension-member method Extension|test(lowered final self::Class #this) → dynamic {
+  for (final core::int #t154 in <core::int>[1]) {
+    invalid-expression "pkg/front_end/testcases/general/for_in.dart:504:15: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+    for (this.intField in [1]) { // Error
+              ^";
+    core::print(#this.{self::Class::intField}{core::int});
+  }
+  for (final core::int #t155 in <core::int>[1]) {
+    invalid-expression "pkg/front_end/testcases/general/for_in.dart:507:16: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+    for (this?.intField in [1]) { // Error
+               ^";
+    core::print(let final self::Class #t156 = #this in #t156 == null ?{core::int?} null : #t156.{self::Class::intField}{core::int});
+  }
+  for (final core::int #t157 in <core::int>[1]) {
+    invalid-expression "pkg/front_end/testcases/general/for_in.dart:510:15: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+    for (this.numField in [1]) { // Error
+              ^";
+    core::print(#this.{self::Class::numField}{core::num});
+  }
+  for (final core::int #t158 in <core::int>[1]) {
+    invalid-expression "pkg/front_end/testcases/general/for_in.dart:513:16: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+    for (this?.numField in [1]) { // Error
+               ^";
+    core::print(let final self::Class #t159 = #this in #t159 == null ?{core::num?} null : #t159.{self::Class::numField}{core::num});
+  }
+  for (final core::int #t160 in <core::int>[1]) {
+    invalid-expression "pkg/front_end/testcases/general/for_in.dart:516:15: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+    for (this.lateField in [1]) { // Error
+              ^";
+    core::print(#this.{self::Class::lateField}{core::int});
+  }
+  for (final core::int #t161 in <core::int>[1]) {
+    invalid-expression "pkg/front_end/testcases/general/for_in.dart:519:16: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+    for (this?.lateField in [1]) { // Error
+               ^";
+    core::print(let final self::Class #t162 = #this in #t162 == null ?{core::int?} null : #t162.{self::Class::lateField}{core::int});
+  }
+  for (final core::int #t163 in <core::int>[1]) {
+    invalid-expression "pkg/front_end/testcases/general/for_in.dart:522:15: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+    for (this.extensionIntProperty in [1]) { // Error
+              ^";
+    core::print(self::Extension|get#extensionIntProperty(#this));
+  }
+  for (final core::int #t164 in <core::int>[1]) {
+    invalid-expression "pkg/front_end/testcases/general/for_in.dart:525:16: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+    for (this?.extensionIntProperty in [1]) { // Error
+               ^";
+    core::print(let final self::Class #t165 = #this in #t165 == null ?{core::int?} null : self::Extension|get#extensionIntProperty(#t165));
+  }
+  for (final core::int #t166 in <core::int>[1]) {
+    invalid-expression "pkg/front_end/testcases/general/for_in.dart:528:15: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+    for (this.extensionNumProperty in [1]) { // Error
+              ^";
+    core::print(self::Extension|get#extensionNumProperty(#this));
+  }
+  for (final core::int #t167 in <core::int>[1]) {
+    invalid-expression "pkg/front_end/testcases/general/for_in.dart:531:16: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+    for (this?.extensionNumProperty in [1]) { // Error
+               ^";
+    core::print(let final self::Class #t168 = #this in #t168 == null ?{core::num?} null : self::Extension|get#extensionNumProperty(#t168));
+  }
+  for (final core::String #t169 in <core::String>[invalid-expression "pkg/front_end/testcases/general/for_in.dart:534:38: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+    for (extensionStringProperty in [1]) { // Error
+                                     ^" in 1 as{TypeError} core::String]) {
+    self::Extension|set#extensionStringProperty(#this, #t169);
+    core::print(self::Extension|get#extensionStringProperty(#this));
+  }
+  for (final core::int #t170 in <core::int>[1]) {
+    invalid-expression "pkg/front_end/testcases/general/for_in.dart:537:15: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+    for (this.extensionStringProperty in [1]) { // Error
+              ^";
+    core::print(self::Extension|get#extensionStringProperty(#this));
+  }
+  for (final core::int #t171 in <core::int>[1]) {
+    invalid-expression "pkg/front_end/testcases/general/for_in.dart:540:16: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+    for (this?.extensionStringProperty in [1]) { // Error
+               ^";
+    core::print(let final self::Class #t172 = #this in #t172 == null ?{core::String?} null : self::Extension|get#extensionStringProperty(#t172));
+  }
+  for (final core::int #t173 in <core::int>[1]) {
+    self::Extension|set#extensionStringProperty(#this, invalid-expression "pkg/front_end/testcases/general/for_in.dart:543:34: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+    for (extensionStringProperty in <int>[1]) { // Error
+                                 ^" in #t173 as{TypeError} core::String);
+    core::print(self::Extension|get#extensionStringProperty(#this));
+  }
+  for (final core::int #t174 in <core::int>[1]) {
+    invalid-expression "pkg/front_end/testcases/general/for_in.dart:546:15: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+    for (this.extensionStringProperty in <int>[1]) { // Error
+              ^";
+    core::print(self::Extension|get#extensionStringProperty(#this));
+  }
+  for (final core::int #t175 in <core::int>[1]) {
+    invalid-expression "pkg/front_end/testcases/general/for_in.dart:549:16: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+    for (this?.extensionStringProperty in <int>[1]) { // Error
+               ^";
+    core::print(let final self::Class #t176 = #this in #t176 == null ?{core::String?} null : self::Extension|get#extensionStringProperty(#t176));
+  }
+  for (final core::int #t177 in <core::int>[1]) {
+    invalid-expression "pkg/front_end/testcases/general/for_in.dart:552:10: Error: Setter not found: 'extensionReadOnlyProperty'.
+    for (extensionReadOnlyProperty in [1]) { // Error
+         ^^^^^^^^^^^^^^^^^^^^^^^^^";
+    core::print(self::Extension|get#extensionReadOnlyProperty(#this));
+  }
+  for (final core::int #t178 in <core::int>[1]) {
+    invalid-expression "pkg/front_end/testcases/general/for_in.dart:555:15: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+    for (this.extensionReadOnlyProperty in [1]) { // Error
+              ^";
+    core::print(self::Extension|get#extensionReadOnlyProperty(#this));
+  }
+  for (final core::int #t179 in <core::int>[1]) {
+    invalid-expression "pkg/front_end/testcases/general/for_in.dart:558:16: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+    for (this?.extensionReadOnlyProperty in [1]) { // Error
+               ^";
+    core::print(let final self::Class #t180 = #this in #t180 == null ?{core::int?} null : self::Extension|get#extensionReadOnlyProperty(#t180));
+  }
+  for (final core::int #t181 in <core::int>[1]) {
+    invalid-expression "pkg/front_end/testcases/general/for_in.dart:561:10: Error: Setter not found: 'finalStaticField'.
+    for (finalStaticField in [1]) { // Error
+         ^^^^^^^^^^^^^^^^";
+    core::print(self::Extension|finalStaticField);
+  }
+  for (final core::String #t182 in <core::String>[invalid-expression "pkg/front_end/testcases/general/for_in.dart:564:32: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+    for (stringStaticField in [1]) { // Error
+                               ^" in 1 as{TypeError} core::String]) {
+    self::Extension|stringStaticField = #t182;
+    core::print(self::Extension|stringStaticField);
+  }
+  for (final core::int #t183 in <core::int>[1]) {
+    self::Extension|stringStaticField = invalid-expression "pkg/front_end/testcases/general/for_in.dart:567:28: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+    for (stringStaticField in <int>[1]) { // Error
+                           ^" in #t183 as{TypeError} core::String;
+    core::print(self::Extension|stringStaticField);
+  }
+  for (final core::int #t184 in <core::int>[1]) {
+    self::Extension|lateFinalStaticField = #t184;
+    core::print(self::Extension|lateFinalStaticField);
+  }
+}
+static extension-member method Extension|get#test(lowered final self::Class #this) → () → dynamic
+  return () → dynamic => self::Extension|test(#this);
+static extension-member method Extension|extensionMethod(lowered final self::Class #this) → dynamic {
+  for (final core::int #t185 in <core::int>[1]) {
+    #this.{self::Class::intField} = #t185;
+    core::print(#this.{self::Class::intField}{core::int});
+  }
+  for (final core::num #t186 in <core::num>[1]) {
+    #this.{self::Class::numField} = #t186;
+    core::print(#this.{self::Class::numField}{core::num});
+  }
+  for (final core::int #t187 in <core::int>[1]) {
+    #this.{self::Class::lateField} = #t187;
+    core::print(#this.{self::Class::lateField}{core::int});
+  }
+  for (final core::int #t188 in <core::int>[1]) {
+    self::Extension|set#extensionIntProperty(#this, #t188);
+    core::print(self::Extension|get#extensionIntProperty(#this));
+  }
+  for (final core::num #t189 in <core::num>[1]) {
+    self::Extension|set#extensionNumProperty(#this, #t189);
+    core::print(self::Extension|get#extensionNumProperty(#this));
+  }
+  for (final core::int #t190 in <core::int>[1]) {
+    self::Extension|intStaticField = #t190;
+    core::print(self::Extension|intStaticField);
+  }
+  for (final core::num #t191 in <core::num>[1]) {
+    self::Extension|numStaticField = #t191;
+    core::print(self::Extension|numStaticField);
+  }
+  for (final core::int #t192 in <core::int>[1]) {
+    self::Extension|lateStaticField = #t192;
+    core::print(self::Extension|lateStaticField);
+  }
+}
+static extension-member method Extension|get#extensionMethod(lowered final self::Class #this) → () → dynamic
+  return () → dynamic => self::Extension|extensionMethod(#this);
+static extension-member method IndexExtension|[]=(lowered final core::int #this, core::int index, core::int value) → void {}
+static extension-member method IndexExtension|[](lowered final core::int #this, core::int index) → core::int
+  return 0;
+static extension-member method IndexExtension|extensionMethod(lowered final core::int #this) → dynamic {
+  for (final core::int #t193 in <core::int>[1]) {
+    invalid-expression "pkg/front_end/testcases/general/for_in.dart:608:14: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+    for (this[0] in [1]) { // Error
+             ^";
+    core::print(self::IndexExtension|[](#this, 0));
+  }
+  for (final core::int #t194 in <core::int>[1]) {
+    invalid-expression "pkg/front_end/testcases/general/for_in.dart:611:15: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+    for (this?[0] in [1]) { // Error
+              ^";
+    core::print(let final core::int #t195 = #this in #t195 == null ?{core::int?} null : self::IndexExtension|[](#t195, 0));
+  }
+}
+static extension-member method IndexExtension|get#extensionMethod(lowered final core::int #this) → () → dynamic
+  return () → dynamic => self::IndexExtension|extensionMethod(#this);
+
+constants  {
+  #C1 = 0
+}
diff --git a/pkg/front_end/testcases/general/for_in.dart.strong.modular.expect b/pkg/front_end/testcases/general/for_in.dart.strong.modular.expect
new file mode 100644
index 0000000..4d46075
--- /dev/null
+++ b/pkg/front_end/testcases/general/for_in.dart.strong.modular.expect
@@ -0,0 +1,1883 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/for_in.dart:16:14: Error: A for-in loop-variable can't be 'const'.
+// Try removing the 'const' modifier.
+//   for (const constLocal in [1]) { // Error
+//              ^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/for_in.dart:19:8: Error: Can't have modifier 'late' here.
+// Try removing 'late'.
+//   for (late int lateLocal in [1]) { // Error
+//        ^^^^
+//
+// pkg/front_end/testcases/general/for_in.dart:29:16: Error: A for-in loop-variable can't be 'const'.
+// Try removing the 'const' modifier.
+//     for (const constLocal in [1]) constLocal // Error
+//                ^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/for_in.dart:32:10: Error: Can't have modifier 'late' here.
+// Try removing 'late'.
+//     for (late int lateLocal in [1]) lateLocal // Error
+//          ^^^^
+//
+// pkg/front_end/testcases/general/for_in.dart:41:16: Error: A for-in loop-variable can't be 'const'.
+// Try removing the 'const' modifier.
+//     for (const constLocal in [1]) 0: constLocal // Error
+//                ^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/for_in.dart:44:10: Error: Can't have modifier 'late' here.
+// Try removing 'late'.
+//     for (late int lateLocal in [1]) 0: lateLocal // Error
+//          ^^^^
+//
+// pkg/front_end/testcases/general/for_in.dart:52:24: Error: Unexpected token ','.
+//   for (int? multiLocal1, multiLocal2 in [1]) { // Error
+//                        ^
+//
+// pkg/front_end/testcases/general/for_in.dart:52:8: Error: A for-in loop can't have more than one loop variable.
+//   for (int? multiLocal1, multiLocal2 in [1]) { // Error
+//        ^^^
+//
+// pkg/front_end/testcases/general/for_in.dart:56:26: Error: Unexpected token ','.
+//   for (var varMultiLocal1, varMultiLocal2 in [1]) { // Error
+//                          ^
+//
+// pkg/front_end/testcases/general/for_in.dart:56:8: Error: A for-in loop can't have more than one loop variable.
+//   for (var varMultiLocal1, varMultiLocal2 in [1]) { // Error
+//        ^^^
+//
+// pkg/front_end/testcases/general/for_in.dart:60:26: Error: Unexpected token ','.
+//   for (num numMultiLocal1, numMultiLocal2 in [1]) { // Error
+//                          ^
+//
+// pkg/front_end/testcases/general/for_in.dart:60:8: Error: A for-in loop can't have more than one loop variable.
+//   for (num numMultiLocal1, numMultiLocal2 in [1]) { // Error
+//        ^^^
+//
+// pkg/front_end/testcases/general/for_in.dart:64:8: Error: Expected an identifier, but got '1'.
+// Try inserting an identifier before '1'.
+//   for (1 in [1]) { // Error
+//        ^
+//
+// pkg/front_end/testcases/general/for_in.dart:64:8: Error: Can't assign to this, so it can't be used in a for-in loop.
+//   for (1 in [1]) { // Error
+//        ^
+//
+// pkg/front_end/testcases/general/for_in.dart:67:12: Error: Unexpected token '('.
+//   for (main() in [1]) { // Error
+//            ^
+//
+// pkg/front_end/testcases/general/for_in.dart:67:8: Error: Can't assign to this, so it can't be used in a for-in loop.
+//   for (main() in [1]) { // Error
+//        ^^^^
+//
+// pkg/front_end/testcases/general/for_in.dart:71:8: Error: Can't assign to the final variable 'existingFinalLocal'.
+//   for (existingFinalLocal in [1]) { // Error
+//        ^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/for_in.dart:82:9: Error: Unexpected token '.'.
+//   for (c.intField in [1]) { // Error
+//         ^
+//
+// pkg/front_end/testcases/general/for_in.dart:85:9: Error: Unexpected token '.'.
+//   for (c.numField in [1]) { // Error
+//         ^
+//
+// pkg/front_end/testcases/general/for_in.dart:88:9: Error: Unexpected token '.'.
+//   for (c.lateField in [1]) { // Error
+//         ^
+//
+// pkg/front_end/testcases/general/for_in.dart:91:9: Error: Unexpected token '?.'.
+//   for (c?.intField in [1]) { // Error
+//         ^^
+//
+// pkg/front_end/testcases/general/for_in.dart:94:9: Error: Unexpected token '?.'.
+//   for (c?.numField in [1]) { // Error
+//         ^^
+//
+// pkg/front_end/testcases/general/for_in.dart:97:9: Error: Unexpected token '?.'.
+//   for (c?.lateField in [1]) { // Error
+//         ^^
+//
+// pkg/front_end/testcases/general/for_in.dart:100:9: Error: Unexpected token '.'.
+//   for (c.stringField in [1]) { // Error
+//         ^
+//
+// pkg/front_end/testcases/general/for_in.dart:103:9: Error: Unexpected token '.'.
+//   for (c.stringField in <int>[1]) { // Error
+//         ^
+//
+// pkg/front_end/testcases/general/for_in.dart:106:9: Error: Unexpected token '?.'.
+//   for (c?.stringField in [1]) { // Error
+//         ^^
+//
+// pkg/front_end/testcases/general/for_in.dart:109:9: Error: Unexpected token '?.'.
+//   for (c?.stringField in <int>[1]) { // Error
+//         ^^
+//
+// pkg/front_end/testcases/general/for_in.dart:112:9: Error: Unexpected token '.'.
+//   for (c.finalField in [1]) { // Error
+//         ^
+//
+// pkg/front_end/testcases/general/for_in.dart:115:9: Error: Unexpected token '?.'.
+//   for (c?.finalField in [1]) { // Error
+//         ^^
+//
+// pkg/front_end/testcases/general/for_in.dart:118:9: Error: Unexpected token '.'.
+//   for (c.lateFinalField in [1]) { // Error
+//         ^
+//
+// pkg/front_end/testcases/general/for_in.dart:121:9: Error: Unexpected token '?.'.
+//   for (c?.lateFinalField in [1]) { // Error
+//         ^^
+//
+// pkg/front_end/testcases/general/for_in.dart:124:9: Error: Unexpected token '['.
+//   for (c[0] in [1]) { // Error
+//         ^
+//
+// pkg/front_end/testcases/general/for_in.dart:127:9: Error: Unexpected token '?'.
+//   for (c?[0] in [1]) { // Error
+//         ^
+//
+// pkg/front_end/testcases/general/for_in.dart:130:8: Error: Setter not found: 'finalTopLevel'.
+//   for (finalTopLevel in [1]) { // Error
+//        ^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/for_in.dart:133:8: Error: Setter not found: 'constTopLevel'.
+//   for (constTopLevel in [1]) { // Error
+//        ^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/for_in.dart:142:13: Error: Unexpected token '.'.
+//   for (defer.intTopLevel in [1]) { // Error
+//             ^
+//
+// pkg/front_end/testcases/general/for_in.dart:145:13: Error: Unexpected token '.'.
+//   for (defer.numTopLevel in [1]) { // Error
+//             ^
+//
+// pkg/front_end/testcases/general/for_in.dart:148:13: Error: Unexpected token '.'.
+//   for (defer.lateTopLevel in [1]) { // Error
+//             ^
+//
+// pkg/front_end/testcases/general/for_in.dart:151:13: Error: Unexpected token '.'.
+//   for (defer.lateFinalTopLevel in [1]) { // Error
+//             ^
+//
+// pkg/front_end/testcases/general/for_in.dart:154:13: Error: Unexpected token '.'.
+//   for (defer.finalTopLevel in [1]) { // Error
+//             ^
+//
+// pkg/front_end/testcases/general/for_in.dart:157:13: Error: Unexpected token '.'.
+//   for (defer.constTopLevel in [1]) { // Error
+//             ^
+//
+// pkg/front_end/testcases/general/for_in.dart:160:13: Error: Unexpected token '.'.
+//   for (defer.stringTopLevel in [1]) { // Error
+//             ^
+//
+// pkg/front_end/testcases/general/for_in.dart:163:13: Error: Unexpected token '.'.
+//   for (defer.stringTopLevel in <int>[1]) { // Error
+//             ^
+//
+// pkg/front_end/testcases/general/for_in.dart:166:13: Error: Unexpected token '.'.
+//   for (Class.stringStaticField in [1]) { // Error
+//             ^
+//
+// pkg/front_end/testcases/general/for_in.dart:169:13: Error: Unexpected token '.'.
+//   for (Class.stringStaticField in <int>[1]) { // Error
+//             ^
+//
+// pkg/front_end/testcases/general/for_in.dart:172:13: Error: Unexpected token '.'.
+//   for (Class.finalStaticField in [1]) { // Error
+//             ^
+//
+// pkg/front_end/testcases/general/for_in.dart:175:13: Error: Unexpected token '.'.
+//   for (Class.lateFinalStaticField in [1]) { // Error
+//             ^
+//
+// pkg/front_end/testcases/general/for_in.dart:178:17: Error: Unexpected token '.'.
+//   for (Extension.stringStaticField in [1]) { // Error
+//                 ^
+//
+// pkg/front_end/testcases/general/for_in.dart:181:17: Error: Unexpected token '.'.
+//   for (Extension.stringStaticField in <int>[1]) { // Error
+//                 ^
+//
+// pkg/front_end/testcases/general/for_in.dart:184:17: Error: Unexpected token '.'.
+//   for (Extension.finalStaticField in [1]) { // Error
+//                 ^
+//
+// pkg/front_end/testcases/general/for_in.dart:187:17: Error: Unexpected token '.'.
+//   for (Extension.lateFinalStaticField in [1]) { // Error
+//                 ^
+//
+// pkg/front_end/testcases/general/for_in.dart:190:13: Error: Unexpected token '.'.
+//   for (Class.intStaticField in [1]) { // Error
+//             ^
+//
+// pkg/front_end/testcases/general/for_in.dart:193:13: Error: Unexpected token '.'.
+//   for (Class.numStaticField in [1]) { // Error
+//             ^
+//
+// pkg/front_end/testcases/general/for_in.dart:196:13: Error: Unexpected token '.'.
+//   for (Class.lateStaticField in [1]) { // Error
+//             ^
+//
+// pkg/front_end/testcases/general/for_in.dart:199:17: Error: Unexpected token '.'.
+//   for (Extension.intStaticField in [1]) { // Error
+//                 ^
+//
+// pkg/front_end/testcases/general/for_in.dart:202:17: Error: Unexpected token '.'.
+//   for (Extension.numStaticField in [1]) { // Error
+//                 ^
+//
+// pkg/front_end/testcases/general/for_in.dart:205:17: Error: Unexpected token '.'.
+//   for (Extension.lateStaticField in [1]) { // Error
+//                 ^
+//
+// pkg/front_end/testcases/general/for_in.dart:22:31: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+//   for (String stringLocal in [1]) { // Error
+//                               ^
+//
+// pkg/front_end/testcases/general/for_in.dart:25:15: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+// Try changing the type of the variable.
+//   for (String stringLocal in <int>[1]) { // Error
+//               ^
+//
+// pkg/front_end/testcases/general/for_in.dart:35:33: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+//     for (String stringLocal in [1]) stringLocal // Error
+//                                 ^
+//
+// pkg/front_end/testcases/general/for_in.dart:38:17: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+// Try changing the type of the variable.
+//     for (String stringLocal in <int>[1]) stringLocal // Error
+//                 ^
+//
+// pkg/front_end/testcases/general/for_in.dart:47:33: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+//     for (String stringLocal in [1]) 0: stringLocal // Error
+//                                 ^
+//
+// pkg/front_end/testcases/general/for_in.dart:50:17: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+// Try changing the type of the variable.
+//     for (String stringLocal in <int>[1]) 0: stringLocal // Error
+//                 ^
+//
+// pkg/front_end/testcases/general/for_in.dart:61:11: Error: Non-nullable variable 'numMultiLocal1' must be assigned before it can be used.
+//     print(numMultiLocal1);
+//           ^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/for_in.dart:62:11: Error: Non-nullable variable 'numMultiLocal2' must be assigned before it can be used.
+//     print(numMultiLocal2);
+//           ^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/for_in.dart:72:11: Error: Final variable 'existingFinalLocal' must be assigned before it can be used.
+//     print(existingFinalLocal);
+//           ^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/for_in.dart:75:32: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+//   for (existingStringLocal in [1]) { // Error
+//                                ^
+//
+// pkg/front_end/testcases/general/for_in.dart:78:28: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+//   for (existingStringLocal in <int>[1]) { // Error
+//                            ^
+//
+// pkg/front_end/testcases/general/for_in.dart:136:27: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+//   for (stringTopLevel in [1]) { // Error
+//                           ^
+//
+// pkg/front_end/testcases/general/for_in.dart:139:23: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+//   for (stringTopLevel in <int>[1]) { // Error
+//                       ^
+//
+// pkg/front_end/testcases/general/for_in.dart:296:10: Error: Expected an identifier, but got 'this'.
+// Try inserting an identifier before 'this'.
+//     for (this.intField in [1]) { // Error
+//          ^^^^
+//
+// pkg/front_end/testcases/general/for_in.dart:299:10: Error: Expected an identifier, but got 'this'.
+// Try inserting an identifier before 'this'.
+//     for (this?.intField in [1]) { // Error
+//          ^^^^
+//
+// pkg/front_end/testcases/general/for_in.dart:302:10: Error: Expected an identifier, but got 'this'.
+// Try inserting an identifier before 'this'.
+//     for (this.numField in [1]) { // Error
+//          ^^^^
+//
+// pkg/front_end/testcases/general/for_in.dart:305:10: Error: Expected an identifier, but got 'this'.
+// Try inserting an identifier before 'this'.
+//     for (this?.numField in [1]) { // Error
+//          ^^^^
+//
+// pkg/front_end/testcases/general/for_in.dart:308:10: Error: Expected an identifier, but got 'this'.
+// Try inserting an identifier before 'this'.
+//     for (this.lateField in [1]) { // Error
+//          ^^^^
+//
+// pkg/front_end/testcases/general/for_in.dart:311:10: Error: Expected an identifier, but got 'this'.
+// Try inserting an identifier before 'this'.
+//     for (this?.lateField in [1]) { // Error
+//          ^^^^
+//
+// pkg/front_end/testcases/general/for_in.dart:320:10: Error: Expected an identifier, but got 'this'.
+// Try inserting an identifier before 'this'.
+//     for (this.stringField in [1]) { // Error
+//          ^^^^
+//
+// pkg/front_end/testcases/general/for_in.dart:323:10: Error: Expected an identifier, but got 'this'.
+// Try inserting an identifier before 'this'.
+//     for (this.stringField in <int>[1]) { // Error
+//          ^^^^
+//
+// pkg/front_end/testcases/general/for_in.dart:326:10: Error: Expected an identifier, but got 'this'.
+// Try inserting an identifier before 'this'.
+//     for (this?.stringField in [1]) { // Error
+//          ^^^^
+//
+// pkg/front_end/testcases/general/for_in.dart:329:10: Error: Expected an identifier, but got 'this'.
+// Try inserting an identifier before 'this'.
+//     for (this?.stringField in <int>[1]) { // Error
+//          ^^^^
+//
+// pkg/front_end/testcases/general/for_in.dart:332:10: Error: Expected an identifier, but got 'this'.
+// Try inserting an identifier before 'this'.
+//     for (this[0] in [1]) { // Error
+//          ^^^^
+//
+// pkg/front_end/testcases/general/for_in.dart:335:10: Error: Expected an identifier, but got 'this'.
+// Try inserting an identifier before 'this'.
+//     for (this?[0] in [1]) { // Error
+//          ^^^^
+//
+// pkg/front_end/testcases/general/for_in.dart:344:10: Error: Expected an identifier, but got 'this'.
+// Try inserting an identifier before 'this'.
+//     for (this.finalField in [1]) { // Error
+//          ^^^^
+//
+// pkg/front_end/testcases/general/for_in.dart:347:10: Error: Expected an identifier, but got 'this'.
+// Try inserting an identifier before 'this'.
+//     for (this.finalField in <int>[1]) { // Error
+//          ^^^^
+//
+// pkg/front_end/testcases/general/for_in.dart:350:10: Error: Expected an identifier, but got 'this'.
+// Try inserting an identifier before 'this'.
+//     for (this?.finalField in [1]) { // Error
+//          ^^^^
+//
+// pkg/front_end/testcases/general/for_in.dart:353:10: Error: Expected an identifier, but got 'this'.
+// Try inserting an identifier before 'this'.
+//     for (this?.finalField in <int>[1]) { // Error
+//          ^^^^
+//
+// pkg/front_end/testcases/general/for_in.dart:359:10: Error: Expected an identifier, but got 'this'.
+// Try inserting an identifier before 'this'.
+//     for (this.lateFinalField in [1]) { // Error
+//          ^^^^
+//
+// pkg/front_end/testcases/general/for_in.dart:362:10: Error: Expected an identifier, but got 'this'.
+// Try inserting an identifier before 'this'.
+//     for (this?.lateFinalField in [1]) { // Error
+//          ^^^^
+//
+// pkg/front_end/testcases/general/for_in.dart:365:10: Error: Setter not found: 'finalStaticField'.
+//     for (finalStaticField in [1]) { // Error
+//          ^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/for_in.dart:377:10: Error: Expected an identifier, but got 'this'.
+// Try inserting an identifier before 'this'.
+//     for (this.extensionIntProperty in [1]) { // Error
+//          ^^^^
+//
+// pkg/front_end/testcases/general/for_in.dart:380:10: Error: Expected an identifier, but got 'this'.
+// Try inserting an identifier before 'this'.
+//     for (this?.extensionIntProperty in [1]) { // Error
+//          ^^^^
+//
+// pkg/front_end/testcases/general/for_in.dart:383:10: Error: Expected an identifier, but got 'this'.
+// Try inserting an identifier before 'this'.
+//     for (this.extensionNumProperty in [1]) { // Error
+//          ^^^^
+//
+// pkg/front_end/testcases/general/for_in.dart:386:10: Error: Expected an identifier, but got 'this'.
+// Try inserting an identifier before 'this'.
+//     for (this?.extensionNumProperty in [1]) { // Error
+//          ^^^^
+//
+// pkg/front_end/testcases/general/for_in.dart:389:19: Error: Unexpected token '('.
+//     for (Extension(this).extensionIntProperty in [1]) { // Error
+//                   ^
+//
+// pkg/front_end/testcases/general/for_in.dart:392:19: Error: Unexpected token '('.
+//     for (Extension(this)?.extensionIntProperty in [1]) { // Error
+//                   ^
+//
+// pkg/front_end/testcases/general/for_in.dart:395:19: Error: Unexpected token '('.
+//     for (Extension(this).extensionNumProperty in [1]) { // Error
+//                   ^
+//
+// pkg/front_end/testcases/general/for_in.dart:398:19: Error: Unexpected token '('.
+//     for (Extension(this)?.extensionNumProperty in [1]) { // Error
+//                   ^
+//
+// pkg/front_end/testcases/general/for_in.dart:401:19: Error: Unexpected token '('.
+//     for (Extension(this).extensionStringProperty in [1]) { // Error
+//                   ^
+//
+// pkg/front_end/testcases/general/for_in.dart:404:19: Error: Unexpected token '('.
+//     for (Extension(this)?.extensionStringProperty in [1]) { // Error
+//                   ^
+//
+// pkg/front_end/testcases/general/for_in.dart:407:19: Error: Unexpected token '('.
+//     for (Extension(this).extensionStringProperty in <int>[1]) { // Error
+//                   ^
+//
+// pkg/front_end/testcases/general/for_in.dart:410:19: Error: Unexpected token '('.
+//     for (Extension(this)?.extensionStringProperty in <int>[1]) { // Error
+//                   ^
+//
+// pkg/front_end/testcases/general/for_in.dart:413:19: Error: Unexpected token '('.
+//     for (Extension(this).extensionReadOnlyProperty in [1]) { // Error
+//                   ^
+//
+// pkg/front_end/testcases/general/for_in.dart:416:19: Error: Unexpected token '('.
+//     for (Extension(this)?.extensionReadOnlyProperty in [1]) { // Error
+//                   ^
+//
+// pkg/front_end/testcases/general/for_in.dart:419:10: Error: Expected an identifier, but got '0'.
+// Try inserting an identifier before '0'.
+//     for (0[0] in [1]) { // Error
+//          ^
+//
+// pkg/front_end/testcases/general/for_in.dart:422:10: Error: Expected an identifier, but got '0'.
+// Try inserting an identifier before '0'.
+//     for (0?[0] in [1]) { // Error
+//          ^
+//
+// pkg/front_end/testcases/general/for_in.dart:425:24: Error: Unexpected token '('.
+//     for (IndexExtension(0)[0] in [1]) { // Error
+//                        ^
+//
+// pkg/front_end/testcases/general/for_in.dart:428:24: Error: Unexpected token '('.
+//     for (IndexExtension(0)?[0] in [1]) { // Error
+//                        ^
+//
+// pkg/front_end/testcases/general/for_in.dart:314:26: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+//     for (stringField in [1]) { // Error
+//                          ^
+//
+// pkg/front_end/testcases/general/for_in.dart:317:22: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+//     for (stringField in <int>[1]) { // Error
+//                      ^
+//
+// pkg/front_end/testcases/general/for_in.dart:338:10: Error: The setter 'finalField' isn't defined for the type 'Class'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/for_in.dart'.
+// Try correcting the name to the name of an existing setter, or defining a setter or field named 'finalField'.
+//     for (finalField in [1]) { // Error
+//          ^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/for_in.dart:341:10: Error: The setter 'finalField' isn't defined for the type 'Class'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/for_in.dart'.
+// Try correcting the name to the name of an existing setter, or defining a setter or field named 'finalField'.
+//     for (finalField in <int>[1]) { // Error
+//          ^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/for_in.dart:368:32: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+//     for (stringStaticField in [1]) { // Error
+//                                ^
+//
+// pkg/front_end/testcases/general/for_in.dart:371:28: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+//     for (stringStaticField in <int>[1]) { // Error
+//                            ^
+//
+// pkg/front_end/testcases/general/for_in.dart:463:10: Error: Expected an identifier, but got 'super'.
+// Try inserting an identifier before 'super'.
+//     for (super.stringField in [1]) { // Error
+//          ^^^^^
+//
+// pkg/front_end/testcases/general/for_in.dart:466:10: Error: Expected an identifier, but got 'super'.
+// Try inserting an identifier before 'super'.
+//     for (super.stringField in <int>[1]) { // Error
+//          ^^^^^
+//
+// pkg/front_end/testcases/general/for_in.dart:469:10: Error: Expected an identifier, but got 'super'.
+// Try inserting an identifier before 'super'.
+//     for (super.intField in [1]) { // Error
+//          ^^^^^
+//
+// pkg/front_end/testcases/general/for_in.dart:472:10: Error: Expected an identifier, but got 'super'.
+// Try inserting an identifier before 'super'.
+//     for (super.numField in [1]) { // Error
+//          ^^^^^
+//
+// pkg/front_end/testcases/general/for_in.dart:475:10: Error: Expected an identifier, but got 'super'.
+// Try inserting an identifier before 'super'.
+//     for (super.lateField in [1]) { // Error
+//          ^^^^^
+//
+// pkg/front_end/testcases/general/for_in.dart:478:10: Error: Expected an identifier, but got 'super'.
+// Try inserting an identifier before 'super'.
+//     for (super[0] in [1]) { // Error
+//          ^^^^^
+//
+// pkg/front_end/testcases/general/for_in.dart:481:10: Error: Expected an identifier, but got 'super'.
+// Try inserting an identifier before 'super'.
+//     for (super?[0] in [1]) { // Error
+//          ^^^^^
+//
+// pkg/front_end/testcases/general/for_in.dart:504:10: Error: Expected an identifier, but got 'this'.
+// Try inserting an identifier before 'this'.
+//     for (this.intField in [1]) { // Error
+//          ^^^^
+//
+// pkg/front_end/testcases/general/for_in.dart:507:10: Error: Expected an identifier, but got 'this'.
+// Try inserting an identifier before 'this'.
+//     for (this?.intField in [1]) { // Error
+//          ^^^^
+//
+// pkg/front_end/testcases/general/for_in.dart:510:10: Error: Expected an identifier, but got 'this'.
+// Try inserting an identifier before 'this'.
+//     for (this.numField in [1]) { // Error
+//          ^^^^
+//
+// pkg/front_end/testcases/general/for_in.dart:513:10: Error: Expected an identifier, but got 'this'.
+// Try inserting an identifier before 'this'.
+//     for (this?.numField in [1]) { // Error
+//          ^^^^
+//
+// pkg/front_end/testcases/general/for_in.dart:516:10: Error: Expected an identifier, but got 'this'.
+// Try inserting an identifier before 'this'.
+//     for (this.lateField in [1]) { // Error
+//          ^^^^
+//
+// pkg/front_end/testcases/general/for_in.dart:519:10: Error: Expected an identifier, but got 'this'.
+// Try inserting an identifier before 'this'.
+//     for (this?.lateField in [1]) { // Error
+//          ^^^^
+//
+// pkg/front_end/testcases/general/for_in.dart:522:10: Error: Expected an identifier, but got 'this'.
+// Try inserting an identifier before 'this'.
+//     for (this.extensionIntProperty in [1]) { // Error
+//          ^^^^
+//
+// pkg/front_end/testcases/general/for_in.dart:525:10: Error: Expected an identifier, but got 'this'.
+// Try inserting an identifier before 'this'.
+//     for (this?.extensionIntProperty in [1]) { // Error
+//          ^^^^
+//
+// pkg/front_end/testcases/general/for_in.dart:528:10: Error: Expected an identifier, but got 'this'.
+// Try inserting an identifier before 'this'.
+//     for (this.extensionNumProperty in [1]) { // Error
+//          ^^^^
+//
+// pkg/front_end/testcases/general/for_in.dart:531:10: Error: Expected an identifier, but got 'this'.
+// Try inserting an identifier before 'this'.
+//     for (this?.extensionNumProperty in [1]) { // Error
+//          ^^^^
+//
+// pkg/front_end/testcases/general/for_in.dart:537:10: Error: Expected an identifier, but got 'this'.
+// Try inserting an identifier before 'this'.
+//     for (this.extensionStringProperty in [1]) { // Error
+//          ^^^^
+//
+// pkg/front_end/testcases/general/for_in.dart:540:10: Error: Expected an identifier, but got 'this'.
+// Try inserting an identifier before 'this'.
+//     for (this?.extensionStringProperty in [1]) { // Error
+//          ^^^^
+//
+// pkg/front_end/testcases/general/for_in.dart:546:10: Error: Expected an identifier, but got 'this'.
+// Try inserting an identifier before 'this'.
+//     for (this.extensionStringProperty in <int>[1]) { // Error
+//          ^^^^
+//
+// pkg/front_end/testcases/general/for_in.dart:549:10: Error: Expected an identifier, but got 'this'.
+// Try inserting an identifier before 'this'.
+//     for (this?.extensionStringProperty in <int>[1]) { // Error
+//          ^^^^
+//
+// pkg/front_end/testcases/general/for_in.dart:552:10: Error: Setter not found: 'extensionReadOnlyProperty'.
+//     for (extensionReadOnlyProperty in [1]) { // Error
+//          ^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/for_in.dart:555:10: Error: Expected an identifier, but got 'this'.
+// Try inserting an identifier before 'this'.
+//     for (this.extensionReadOnlyProperty in [1]) { // Error
+//          ^^^^
+//
+// pkg/front_end/testcases/general/for_in.dart:558:10: Error: Expected an identifier, but got 'this'.
+// Try inserting an identifier before 'this'.
+//     for (this?.extensionReadOnlyProperty in [1]) { // Error
+//          ^^^^
+//
+// pkg/front_end/testcases/general/for_in.dart:561:10: Error: Setter not found: 'finalStaticField'.
+//     for (finalStaticField in [1]) { // Error
+//          ^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/for_in.dart:534:38: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+//     for (extensionStringProperty in [1]) { // Error
+//                                      ^
+//
+// pkg/front_end/testcases/general/for_in.dart:543:34: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+//     for (extensionStringProperty in <int>[1]) { // Error
+//                                  ^
+//
+// pkg/front_end/testcases/general/for_in.dart:564:32: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+//     for (stringStaticField in [1]) { // Error
+//                                ^
+//
+// pkg/front_end/testcases/general/for_in.dart:567:28: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+//     for (stringStaticField in <int>[1]) { // Error
+//                            ^
+//
+// pkg/front_end/testcases/general/for_in.dart:608:10: Error: Expected an identifier, but got 'this'.
+// Try inserting an identifier before 'this'.
+//     for (this[0] in [1]) { // Error
+//          ^^^^
+//
+// pkg/front_end/testcases/general/for_in.dart:611:10: Error: Expected an identifier, but got 'this'.
+// Try inserting an identifier before 'this'.
+//     for (this?[0] in [1]) { // Error
+//          ^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+import "org-dartlang-testcase:///for_in.dart" deferred as defer hide Extension, IndexExtension;
+
+class Class extends core::Object {
+  field core::int intField = 0;
+  field core::num numField = 0;
+  field core::String stringField = "";
+  final field core::int finalField = 0;
+  late field core::int lateField;
+  late final [setter] field core::int lateFinalField;
+  static field core::int intStaticField = 0;
+  static field core::num numStaticField = 0;
+  static field core::String stringStaticField = "";
+  static final field core::int finalStaticField = 0;
+  late static field core::int lateStaticField;
+  late static final [setter] field core::int lateFinalStaticField;
+  synthetic constructor •() → self::Class
+    : super core::Object::•()
+    ;
+  operator []=(core::int index, core::int value) → void {}
+  operator [](core::int index) → core::int
+    return 0;
+  method test() → dynamic {
+    for (final core::int #t1 in <core::int>[1]) {
+      invalid-expression "pkg/front_end/testcases/general/for_in.dart:296:15: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+    for (this.intField in [1]) { // Error
+              ^";
+      core::print(this.{self::Class::intField}{core::int});
+    }
+    for (final core::int #t2 in <core::int>[1]) {
+      invalid-expression "pkg/front_end/testcases/general/for_in.dart:299:16: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+    for (this?.intField in [1]) { // Error
+               ^";
+      core::print(this.{self::Class::intField}{core::int});
+    }
+    for (final core::int #t3 in <core::int>[1]) {
+      invalid-expression "pkg/front_end/testcases/general/for_in.dart:302:15: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+    for (this.numField in [1]) { // Error
+              ^";
+      core::print(this.{self::Class::numField}{core::num});
+    }
+    for (final core::int #t4 in <core::int>[1]) {
+      invalid-expression "pkg/front_end/testcases/general/for_in.dart:305:16: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+    for (this?.numField in [1]) { // Error
+               ^";
+      core::print(this.{self::Class::numField}{core::num});
+    }
+    for (final core::int #t5 in <core::int>[1]) {
+      invalid-expression "pkg/front_end/testcases/general/for_in.dart:308:15: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+    for (this.lateField in [1]) { // Error
+              ^";
+      core::print(this.{self::Class::lateField}{core::int});
+    }
+    for (final core::int #t6 in <core::int>[1]) {
+      invalid-expression "pkg/front_end/testcases/general/for_in.dart:311:16: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+    for (this?.lateField in [1]) { // Error
+               ^";
+      core::print(this.{self::Class::lateField}{core::int});
+    }
+    for (final core::String #t7 in <core::String>[invalid-expression "pkg/front_end/testcases/general/for_in.dart:314:26: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+    for (stringField in [1]) { // Error
+                         ^" in 1 as{TypeError} core::String]) {
+      this.{self::Class::stringField} = #t7;
+      core::print(this.{self::Class::stringField}{core::String});
+    }
+    for (final core::int #t8 in <core::int>[1]) {
+      this.{self::Class::stringField} = invalid-expression "pkg/front_end/testcases/general/for_in.dart:317:22: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+    for (stringField in <int>[1]) { // Error
+                     ^" in #t8 as{TypeError} core::String;
+      core::print(this.{self::Class::stringField}{core::String});
+    }
+    for (final core::int #t9 in <core::int>[1]) {
+      invalid-expression "pkg/front_end/testcases/general/for_in.dart:320:15: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+    for (this.stringField in [1]) { // Error
+              ^";
+      core::print(this.{self::Class::stringField}{core::String});
+    }
+    for (final core::int #t10 in <core::int>[1]) {
+      invalid-expression "pkg/front_end/testcases/general/for_in.dart:323:15: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+    for (this.stringField in <int>[1]) { // Error
+              ^";
+      core::print(this.{self::Class::stringField}{core::String});
+    }
+    for (final core::int #t11 in <core::int>[1]) {
+      invalid-expression "pkg/front_end/testcases/general/for_in.dart:326:16: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+    for (this?.stringField in [1]) { // Error
+               ^";
+      core::print(this.{self::Class::stringField}{core::String});
+    }
+    for (final core::int #t12 in <core::int>[1]) {
+      invalid-expression "pkg/front_end/testcases/general/for_in.dart:329:16: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+    for (this?.stringField in <int>[1]) { // Error
+               ^";
+      core::print(this.{self::Class::stringField}{core::String});
+    }
+    for (final core::int #t13 in <core::int>[1]) {
+      invalid-expression "pkg/front_end/testcases/general/for_in.dart:332:14: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+    for (this[0] in [1]) { // Error
+             ^";
+      core::print(this.{self::Class::[]}(0){(core::int) → core::int});
+    }
+    for (final core::int #t14 in <core::int>[1]) {
+      invalid-expression "pkg/front_end/testcases/general/for_in.dart:335:15: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+    for (this?[0] in [1]) { // Error
+              ^";
+      core::print(this.{self::Class::[]}(0){(core::int) → core::int});
+    }
+    for (final dynamic #t15 in <dynamic>[1]) {
+      invalid-expression "pkg/front_end/testcases/general/for_in.dart:338:10: Error: The setter 'finalField' isn't defined for the type 'Class'.
+ - 'Class' is from 'pkg/front_end/testcases/general/for_in.dart'.
+Try correcting the name to the name of an existing setter, or defining a setter or field named 'finalField'.
+    for (finalField in [1]) { // Error
+         ^^^^^^^^^^" in this.{<unresolved>}finalField = #t15;
+      core::print(this.{self::Class::finalField}{core::int});
+    }
+    for (final core::int #t16 in <core::int>[1]) {
+      invalid-expression "pkg/front_end/testcases/general/for_in.dart:341:10: Error: The setter 'finalField' isn't defined for the type 'Class'.
+ - 'Class' is from 'pkg/front_end/testcases/general/for_in.dart'.
+Try correcting the name to the name of an existing setter, or defining a setter or field named 'finalField'.
+    for (finalField in <int>[1]) { // Error
+         ^^^^^^^^^^" in this.{<unresolved>}finalField = #t16;
+      core::print(this.{self::Class::finalField}{core::int});
+    }
+    for (final core::int #t17 in <core::int>[1]) {
+      invalid-expression "pkg/front_end/testcases/general/for_in.dart:344:15: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+    for (this.finalField in [1]) { // Error
+              ^";
+      core::print(this.{self::Class::finalField}{core::int});
+    }
+    for (final core::int #t18 in <core::int>[1]) {
+      invalid-expression "pkg/front_end/testcases/general/for_in.dart:347:15: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+    for (this.finalField in <int>[1]) { // Error
+              ^";
+      core::print(this.{self::Class::finalField}{core::int});
+    }
+    for (final core::int #t19 in <core::int>[1]) {
+      invalid-expression "pkg/front_end/testcases/general/for_in.dart:350:16: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+    for (this?.finalField in [1]) { // Error
+               ^";
+      core::print(this.{self::Class::finalField}{core::int});
+    }
+    for (final core::int #t20 in <core::int>[1]) {
+      invalid-expression "pkg/front_end/testcases/general/for_in.dart:353:16: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+    for (this?.finalField in <int>[1]) { // Error
+               ^";
+      core::print(this.{self::Class::finalField}{core::int});
+    }
+    for (final core::int #t21 in <core::int>[1]) {
+      this.{self::Class::lateFinalField} = #t21;
+      core::print(this.{self::Class::lateFinalField}{core::int});
+    }
+    for (final core::int #t22 in <core::int>[1]) {
+      invalid-expression "pkg/front_end/testcases/general/for_in.dart:359:15: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+    for (this.lateFinalField in [1]) { // Error
+              ^";
+      core::print(this.{self::Class::lateFinalField}{core::int});
+    }
+    for (final core::int #t23 in <core::int>[1]) {
+      invalid-expression "pkg/front_end/testcases/general/for_in.dart:362:16: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+    for (this?.lateFinalField in [1]) { // Error
+               ^";
+      core::print(this.{self::Class::lateFinalField}{core::int});
+    }
+    for (final core::int #t24 in <core::int>[1]) {
+      invalid-expression "pkg/front_end/testcases/general/for_in.dart:365:10: Error: Setter not found: 'finalStaticField'.
+    for (finalStaticField in [1]) { // Error
+         ^^^^^^^^^^^^^^^^";
+      core::print(self::Class::finalStaticField);
+    }
+    for (final core::String #t25 in <core::String>[invalid-expression "pkg/front_end/testcases/general/for_in.dart:368:32: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+    for (stringStaticField in [1]) { // Error
+                               ^" in 1 as{TypeError} core::String]) {
+      self::Class::stringStaticField = #t25;
+      core::print(self::Class::stringStaticField);
+    }
+    for (final core::int #t26 in <core::int>[1]) {
+      self::Class::stringStaticField = invalid-expression "pkg/front_end/testcases/general/for_in.dart:371:28: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+    for (stringStaticField in <int>[1]) { // Error
+                           ^" in #t26 as{TypeError} core::String;
+      core::print(self::Class::stringStaticField);
+    }
+    for (final core::int #t27 in <core::int>[1]) {
+      self::Class::lateFinalStaticField = #t27;
+      core::print(self::Class::lateFinalStaticField);
+    }
+    for (final core::int #t28 in <core::int>[1]) {
+      invalid-expression "pkg/front_end/testcases/general/for_in.dart:377:15: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+    for (this.extensionIntProperty in [1]) { // Error
+              ^";
+      core::print(self::Extension|get#extensionIntProperty(this));
+    }
+    for (final core::int #t29 in <core::int>[1]) {
+      invalid-expression "pkg/front_end/testcases/general/for_in.dart:380:16: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+    for (this?.extensionIntProperty in [1]) { // Error
+               ^";
+      core::print(self::Extension|get#extensionIntProperty(this));
+    }
+    for (final core::int #t30 in <core::int>[1]) {
+      invalid-expression "pkg/front_end/testcases/general/for_in.dart:383:15: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+    for (this.extensionNumProperty in [1]) { // Error
+              ^";
+      core::print(self::Extension|get#extensionNumProperty(this));
+    }
+    for (final core::int #t31 in <core::int>[1]) {
+      invalid-expression "pkg/front_end/testcases/general/for_in.dart:386:16: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+    for (this?.extensionNumProperty in [1]) { // Error
+               ^";
+      core::print(self::Extension|get#extensionNumProperty(this));
+    }
+    for (final core::int #t32 in <core::int>[1]) {
+      invalid-expression "pkg/front_end/testcases/general/for_in.dart:389:26: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+    for (Extension(this).extensionIntProperty in [1]) { // Error
+                         ^";
+      core::print(self::Extension|get#extensionIntProperty(this));
+    }
+    for (final core::int #t33 in <core::int>[1]) {
+      invalid-expression "pkg/front_end/testcases/general/for_in.dart:392:27: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+    for (Extension(this)?.extensionIntProperty in [1]) { // Error
+                          ^";
+      core::print(self::Extension|get#extensionIntProperty(this));
+    }
+    for (final core::int #t34 in <core::int>[1]) {
+      invalid-expression "pkg/front_end/testcases/general/for_in.dart:395:26: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+    for (Extension(this).extensionNumProperty in [1]) { // Error
+                         ^";
+      core::print(self::Extension|get#extensionNumProperty(this));
+    }
+    for (final core::int #t35 in <core::int>[1]) {
+      invalid-expression "pkg/front_end/testcases/general/for_in.dart:398:27: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+    for (Extension(this)?.extensionNumProperty in [1]) { // Error
+                          ^";
+      core::print(self::Extension|get#extensionNumProperty(this));
+    }
+    for (final core::int #t36 in <core::int>[1]) {
+      invalid-expression "pkg/front_end/testcases/general/for_in.dart:401:26: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+    for (Extension(this).extensionStringProperty in [1]) { // Error
+                         ^";
+      core::print(self::Extension|get#extensionStringProperty(this));
+    }
+    for (final core::int #t37 in <core::int>[1]) {
+      invalid-expression "pkg/front_end/testcases/general/for_in.dart:404:27: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+    for (Extension(this)?.extensionStringProperty in [1]) { // Error
+                          ^";
+      core::print(self::Extension|get#extensionStringProperty(this));
+    }
+    for (final core::int #t38 in <core::int>[1]) {
+      invalid-expression "pkg/front_end/testcases/general/for_in.dart:407:26: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+    for (Extension(this).extensionStringProperty in <int>[1]) { // Error
+                         ^";
+      core::print(self::Extension|get#extensionStringProperty(this));
+    }
+    for (final core::int #t39 in <core::int>[1]) {
+      invalid-expression "pkg/front_end/testcases/general/for_in.dart:410:27: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+    for (Extension(this)?.extensionStringProperty in <int>[1]) { // Error
+                          ^";
+      core::print(self::Extension|get#extensionStringProperty(this));
+    }
+    for (final core::int #t40 in <core::int>[1]) {
+      invalid-expression "pkg/front_end/testcases/general/for_in.dart:413:26: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+    for (Extension(this).extensionReadOnlyProperty in [1]) { // Error
+                         ^";
+      core::print(self::Extension|get#extensionReadOnlyProperty(this));
+    }
+    for (final core::int #t41 in <core::int>[1]) {
+      invalid-expression "pkg/front_end/testcases/general/for_in.dart:416:27: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+    for (Extension(this)?.extensionReadOnlyProperty in [1]) { // Error
+                          ^";
+      core::print(self::Extension|get#extensionReadOnlyProperty(this));
+    }
+    for (final core::int #t42 in <core::int>[1]) {
+      invalid-expression "pkg/front_end/testcases/general/for_in.dart:419:11: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+    for (0[0] in [1]) { // Error
+          ^";
+      core::print(self::IndexExtension|[](0, 0));
+    }
+    for (final core::int #t43 in <core::int>[1]) {
+      invalid-expression "pkg/front_end/testcases/general/for_in.dart:422:12: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+    for (0?[0] in [1]) { // Error
+           ^";
+      core::print(let final core::int #t44 = 0 in #t44 == null ?{core::int?} null : self::IndexExtension|[](#t44, 0));
+    }
+    for (final core::int #t45 in <core::int>[1]) {
+      invalid-expression "pkg/front_end/testcases/general/for_in.dart:425:27: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+    for (IndexExtension(0)[0] in [1]) { // Error
+                          ^";
+      core::print(self::IndexExtension|[](0, 0));
+    }
+    for (final core::int #t46 in <core::int>[1]) {
+      invalid-expression "pkg/front_end/testcases/general/for_in.dart:428:28: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+    for (IndexExtension(0)?[0] in [1]) { // Error
+                           ^";
+      core::print(let final core::int #t47 = 0 in #t47 == null ?{core::int?} null : self::IndexExtension|[](#t47, 0));
+    }
+  }
+  method method() → dynamic {
+    for (final core::int #t48 in <core::int>[1]) {
+      this.{self::Class::intField} = #t48;
+      core::print(this.{self::Class::intField}{core::int});
+    }
+    for (final core::num #t49 in <core::num>[1]) {
+      this.{self::Class::numField} = #t49;
+      core::print(this.{self::Class::numField}{core::num});
+    }
+    for (final core::int #t50 in <core::int>[1]) {
+      this.{self::Class::lateField} = #t50;
+      core::print(this.{self::Class::lateField}{core::int});
+    }
+    for (final core::int #t51 in <core::int>[1]) {
+      self::Class::intStaticField = #t51;
+      core::print(self::Class::intStaticField);
+    }
+    for (final core::num #t52 in <core::num>[1]) {
+      self::Class::numStaticField = #t52;
+      core::print(self::Class::numStaticField);
+    }
+    for (final core::int #t53 in <core::int>[1]) {
+      self::Class::lateStaticField = #t53;
+      core::print(self::Class::lateStaticField);
+    }
+    for (final core::int #t54 in <core::int>[1]) {
+      self::Extension|set#extensionIntProperty(this, #t54);
+      core::print(self::Extension|get#extensionIntProperty(this));
+    }
+    for (final core::num #t55 in <core::num>[1]) {
+      self::Extension|set#extensionNumProperty(this, #t55);
+      core::print(self::Extension|get#extensionNumProperty(this));
+    }
+  }
+}
+class Subclass extends self::Class {
+  synthetic constructor •() → self::Subclass
+    : super self::Class::•()
+    ;
+  method test() → dynamic {
+    for (final core::int #t56 in <core::int>[1]) {
+      invalid-expression "pkg/front_end/testcases/general/for_in.dart:463:16: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+    for (super.stringField in [1]) { // Error
+               ^";
+      core::print(super.{self::Class::stringField});
+    }
+    for (final core::int #t57 in <core::int>[1]) {
+      invalid-expression "pkg/front_end/testcases/general/for_in.dart:466:16: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+    for (super.stringField in <int>[1]) { // Error
+               ^";
+      core::print(super.{self::Class::stringField});
+    }
+    for (final core::int #t58 in <core::int>[1]) {
+      invalid-expression "pkg/front_end/testcases/general/for_in.dart:469:16: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+    for (super.intField in [1]) { // Error
+               ^";
+      core::print(super.{self::Class::intField});
+    }
+    for (final core::int #t59 in <core::int>[1]) {
+      invalid-expression "pkg/front_end/testcases/general/for_in.dart:472:16: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+    for (super.numField in [1]) { // Error
+               ^";
+      core::print(super.{self::Class::numField});
+    }
+    for (final core::int #t60 in <core::int>[1]) {
+      invalid-expression "pkg/front_end/testcases/general/for_in.dart:475:16: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+    for (super.lateField in [1]) { // Error
+               ^";
+      core::print(super.{self::Class::lateField});
+    }
+    for (final core::int #t61 in <core::int>[1]) {
+      invalid-expression "pkg/front_end/testcases/general/for_in.dart:478:15: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+    for (super[0] in [1]) { // Error
+              ^";
+      core::print(super.{self::Class::[]}(0));
+    }
+    for (final core::int #t62 in <core::int>[1]) {
+      invalid-expression "pkg/front_end/testcases/general/for_in.dart:481:16: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+    for (super?[0] in [1]) { // Error
+               ^";
+      core::print(super.{self::Class::[]}(0));
+    }
+  }
+}
+extension Extension on self::Class {
+  get extensionIntProperty = self::Extension|get#extensionIntProperty;
+  set extensionIntProperty = self::Extension|set#extensionIntProperty;
+  get extensionNumProperty = self::Extension|get#extensionNumProperty;
+  set extensionNumProperty = self::Extension|set#extensionNumProperty;
+  get extensionStringProperty = self::Extension|get#extensionStringProperty;
+  set extensionStringProperty = self::Extension|set#extensionStringProperty;
+  get extensionReadOnlyProperty = self::Extension|get#extensionReadOnlyProperty;
+  static field intStaticField = self::Extension|intStaticField;
+  static field numStaticField = self::Extension|numStaticField;
+  static field stringStaticField = self::Extension|stringStaticField;
+  static field finalStaticField = self::Extension|finalStaticField;
+  static field lateStaticField = self::Extension|lateStaticField;
+  static field lateFinalStaticField = self::Extension|lateFinalStaticField;
+  method test = self::Extension|test;
+  method tearoff test = self::Extension|get#test;
+  method extensionMethod = self::Extension|extensionMethod;
+  method tearoff extensionMethod = self::Extension|get#extensionMethod;
+}
+extension IndexExtension on core::int {
+  operator []= = self::IndexExtension|[]=;
+  operator [] = self::IndexExtension|[];
+  method extensionMethod = self::IndexExtension|extensionMethod;
+  method tearoff extensionMethod = self::IndexExtension|get#extensionMethod;
+}
+static field core::int intTopLevel = 0;
+static final field core::int finalTopLevel = 0;
+static const field core::int constTopLevel = #C1;
+late static field core::int lateTopLevel;
+late static final [setter] field core::int lateFinalTopLevel;
+static field core::num numTopLevel = 0;
+static field core::String stringTopLevel = "";
+static field core::int Extension|intStaticField = 0;
+static field core::num Extension|numStaticField = 0;
+static field core::String Extension|stringStaticField = "";
+static final field core::int Extension|finalStaticField = 0;
+late static field core::int Extension|lateStaticField;
+late static final [setter] field core::int Extension|lateFinalStaticField;
+static method test() → dynamic {
+  {
+    invalid-expression "pkg/front_end/testcases/general/for_in.dart:16:14: Error: A for-in loop-variable can't be 'const'.
+Try removing the 'const' modifier.
+  for (const constLocal in [1]) { // Error
+             ^^^^^^^^^^";
+    for (core::int constLocal in <core::int>[1]) {
+      core::print(constLocal);
+    }
+  }
+  for (core::int lateLocal in <core::int>[1]) {
+    core::print(lateLocal);
+  }
+  for (core::String stringLocal in <core::String>[invalid-expression "pkg/front_end/testcases/general/for_in.dart:22:31: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+  for (String stringLocal in [1]) { // Error
+                              ^" in 1 as{TypeError} core::String]) {
+    core::print(stringLocal);
+  }
+  for (final core::int #t63 in <core::int>[1]) {
+    core::String stringLocal = invalid-expression "pkg/front_end/testcases/general/for_in.dart:25:15: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+Try changing the type of the variable.
+  for (String stringLocal in <int>[1]) { // Error
+              ^" in #t63 as{TypeError} core::String;
+    core::print(stringLocal);
+  }
+  core::print( block {
+    final core::List<core::int> #t64 = <core::int>[];
+    {
+      invalid-expression "pkg/front_end/testcases/general/for_in.dart:29:16: Error: A for-in loop-variable can't be 'const'.
+Try removing the 'const' modifier.
+    for (const constLocal in [1]) constLocal // Error
+               ^^^^^^^^^^";
+      for (core::int constLocal in <core::int>[1])
+        #t64.{core::List::add}{Invariant}(constLocal){(core::int) → void};
+    }
+  } =>#t64);
+  core::print( block {
+    final core::List<core::int> #t65 = <core::int>[];
+    for (core::int lateLocal in <core::int>[1])
+      #t65.{core::List::add}{Invariant}(lateLocal){(core::int) → void};
+  } =>#t65);
+  core::print( block {
+    final core::List<core::String> #t66 = <core::String>[];
+    for (core::String stringLocal in <core::String>[invalid-expression "pkg/front_end/testcases/general/for_in.dart:35:33: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+    for (String stringLocal in [1]) stringLocal // Error
+                                ^" in 1 as{TypeError} core::String])
+      #t66.{core::List::add}{Invariant}(stringLocal){(core::String) → void};
+  } =>#t66);
+  core::print( block {
+    final core::List<core::String> #t67 = <core::String>[];
+    for (final core::int #t68 in <core::int>[1]) {
+      core::String stringLocal = invalid-expression "pkg/front_end/testcases/general/for_in.dart:38:17: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+Try changing the type of the variable.
+    for (String stringLocal in <int>[1]) stringLocal // Error
+                ^" in #t68 as{TypeError} core::String;
+      #t67.{core::List::add}{Invariant}(stringLocal){(core::String) → void};
+    }
+  } =>#t67);
+  core::print( block {
+    final core::Map<core::int, core::int> #t69 = <core::int, core::int>{};
+    {
+      invalid-expression "pkg/front_end/testcases/general/for_in.dart:41:16: Error: A for-in loop-variable can't be 'const'.
+Try removing the 'const' modifier.
+    for (const constLocal in [1]) 0: constLocal // Error
+               ^^^^^^^^^^";
+      for (core::int constLocal in <core::int>[1])
+        #t69.{core::Map::[]=}{Invariant}(0, constLocal){(core::int, core::int) → void};
+    }
+  } =>#t69);
+  core::print( block {
+    final core::Map<core::int, core::int> #t70 = <core::int, core::int>{};
+    for (core::int lateLocal in <core::int>[1])
+      #t70.{core::Map::[]=}{Invariant}(0, lateLocal){(core::int, core::int) → void};
+  } =>#t70);
+  core::print( block {
+    final core::Map<core::int, core::String> #t71 = <core::int, core::String>{};
+    for (core::String stringLocal in <core::String>[invalid-expression "pkg/front_end/testcases/general/for_in.dart:47:33: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+    for (String stringLocal in [1]) 0: stringLocal // Error
+                                ^" in 1 as{TypeError} core::String])
+      #t71.{core::Map::[]=}{Invariant}(0, stringLocal){(core::int, core::String) → void};
+  } =>#t71);
+  core::print( block {
+    final core::Map<core::int, core::String> #t72 = <core::int, core::String>{};
+    for (final core::int #t73 in <core::int>[1]) {
+      core::String stringLocal = invalid-expression "pkg/front_end/testcases/general/for_in.dart:50:17: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+Try changing the type of the variable.
+    for (String stringLocal in <int>[1]) 0: stringLocal // Error
+                ^" in #t73 as{TypeError} core::String;
+      #t72.{core::Map::[]=}{Invariant}(0, stringLocal){(core::int, core::String) → void};
+    }
+  } =>#t72);
+  {
+    invalid-expression "pkg/front_end/testcases/general/for_in.dart:52:8: Error: A for-in loop can't have more than one loop variable.
+  for (int? multiLocal1, multiLocal2 in [1]) { // Error
+       ^^^";
+    for (final core::int #t74 in <core::int>[1]) {
+      core::int? multiLocal1;
+      core::int? multiLocal2;
+      core::print(multiLocal1);
+      core::print(multiLocal2);
+    }
+  }
+  {
+    invalid-expression "pkg/front_end/testcases/general/for_in.dart:56:8: Error: A for-in loop can't have more than one loop variable.
+  for (var varMultiLocal1, varMultiLocal2 in [1]) { // Error
+       ^^^";
+    for (final core::int #t75 in <core::int>[1]) {
+      dynamic varMultiLocal1;
+      dynamic varMultiLocal2;
+      core::print(varMultiLocal1);
+      core::print(varMultiLocal2);
+    }
+  }
+  {
+    invalid-expression "pkg/front_end/testcases/general/for_in.dart:60:8: Error: A for-in loop can't have more than one loop variable.
+  for (num numMultiLocal1, numMultiLocal2 in [1]) { // Error
+       ^^^";
+    for (final core::int #t76 in <core::int>[1]) {
+      core::num numMultiLocal1;
+      core::num numMultiLocal2;
+      core::print(invalid-expression "pkg/front_end/testcases/general/for_in.dart:61:11: Error: Non-nullable variable 'numMultiLocal1' must be assigned before it can be used.
+    print(numMultiLocal1);
+          ^^^^^^^^^^^^^^" in numMultiLocal1);
+      core::print(invalid-expression "pkg/front_end/testcases/general/for_in.dart:62:11: Error: Non-nullable variable 'numMultiLocal2' must be assigned before it can be used.
+    print(numMultiLocal2);
+          ^^^^^^^^^^^^^^" in numMultiLocal2);
+    }
+  }
+  {
+    invalid-expression "pkg/front_end/testcases/general/for_in.dart:64:8: Error: Can't assign to this, so it can't be used in a for-in loop.
+  for (1 in [1]) { // Error
+       ^";
+    for (final core::int #t77 in <core::int>[1]) {
+      1;
+    }
+  }
+  {
+    invalid-expression "pkg/front_end/testcases/general/for_in.dart:67:8: Error: Can't assign to this, so it can't be used in a for-in loop.
+  for (main() in [1]) { // Error
+       ^^^^";
+    for (final core::int #t78 in <core::int>[1]) {
+      self::main();
+    }
+  }
+  final core::int existingFinalLocal;
+  for (final core::int #t79 in <core::int>[1]) {
+    invalid-expression "pkg/front_end/testcases/general/for_in.dart:71:8: Error: Can't assign to the final variable 'existingFinalLocal'.
+  for (existingFinalLocal in [1]) { // Error
+       ^^^^^^^^^^^^^^^^^^";
+    core::print(invalid-expression "pkg/front_end/testcases/general/for_in.dart:72:11: Error: Final variable 'existingFinalLocal' must be assigned before it can be used.
+    print(existingFinalLocal);
+          ^^^^^^^^^^^^^^^^^^" in existingFinalLocal);
+  }
+  core::String existingStringLocal;
+  for (final core::String #t80 in <core::String>[invalid-expression "pkg/front_end/testcases/general/for_in.dart:75:32: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+  for (existingStringLocal in [1]) { // Error
+                               ^" in 1 as{TypeError} core::String]) {
+    existingStringLocal = #t80;
+    core::print(existingStringLocal);
+  }
+  for (final core::int #t81 in <core::int>[1]) {
+    existingStringLocal = invalid-expression "pkg/front_end/testcases/general/for_in.dart:78:28: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+  for (existingStringLocal in <int>[1]) { // Error
+                           ^" in #t81 as{TypeError} core::String;
+    core::print(existingStringLocal);
+  }
+  self::Class c = new self::Class::•();
+  for (final core::int #t82 in <core::int>[1]) {
+    invalid-expression "pkg/front_end/testcases/general/for_in.dart:82:10: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+  for (c.intField in [1]) { // Error
+         ^";
+    core::print(c.{self::Class::intField}{core::int});
+  }
+  for (final core::int #t83 in <core::int>[1]) {
+    invalid-expression "pkg/front_end/testcases/general/for_in.dart:85:10: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+  for (c.numField in [1]) { // Error
+         ^";
+    core::print(c.{self::Class::numField}{core::num});
+  }
+  for (final core::int #t84 in <core::int>[1]) {
+    invalid-expression "pkg/front_end/testcases/general/for_in.dart:88:10: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+  for (c.lateField in [1]) { // Error
+         ^";
+    core::print(c.{self::Class::lateField}{core::int});
+  }
+  for (final core::int #t85 in <core::int>[1]) {
+    invalid-expression "pkg/front_end/testcases/general/for_in.dart:91:11: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+  for (c?.intField in [1]) { // Error
+          ^";
+    core::print(let final self::Class #t86 = c in #t86 == null ?{core::int?} null : #t86.{self::Class::intField}{core::int});
+  }
+  for (final core::int #t87 in <core::int>[1]) {
+    invalid-expression "pkg/front_end/testcases/general/for_in.dart:94:11: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+  for (c?.numField in [1]) { // Error
+          ^";
+    core::print(let final self::Class #t88 = c in #t88 == null ?{core::num?} null : #t88.{self::Class::numField}{core::num});
+  }
+  for (final core::int #t89 in <core::int>[1]) {
+    invalid-expression "pkg/front_end/testcases/general/for_in.dart:97:11: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+  for (c?.lateField in [1]) { // Error
+          ^";
+    core::print(let final self::Class #t90 = c in #t90 == null ?{core::int?} null : #t90.{self::Class::lateField}{core::int});
+  }
+  for (final core::int #t91 in <core::int>[1]) {
+    invalid-expression "pkg/front_end/testcases/general/for_in.dart:100:10: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+  for (c.stringField in [1]) { // Error
+         ^";
+    core::print(c.{self::Class::stringField}{core::String});
+  }
+  for (final core::int #t92 in <core::int>[1]) {
+    invalid-expression "pkg/front_end/testcases/general/for_in.dart:103:10: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+  for (c.stringField in <int>[1]) { // Error
+         ^";
+    core::print(c.{self::Class::stringField}{core::String});
+  }
+  for (final core::int #t93 in <core::int>[1]) {
+    invalid-expression "pkg/front_end/testcases/general/for_in.dart:106:11: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+  for (c?.stringField in [1]) { // Error
+          ^";
+    core::print(let final self::Class #t94 = c in #t94 == null ?{core::String?} null : #t94.{self::Class::stringField}{core::String});
+  }
+  for (final core::int #t95 in <core::int>[1]) {
+    invalid-expression "pkg/front_end/testcases/general/for_in.dart:109:11: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+  for (c?.stringField in <int>[1]) { // Error
+          ^";
+    core::print(let final self::Class #t96 = c in #t96 == null ?{core::String?} null : #t96.{self::Class::stringField}{core::String});
+  }
+  for (final core::int #t97 in <core::int>[1]) {
+    invalid-expression "pkg/front_end/testcases/general/for_in.dart:112:10: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+  for (c.finalField in [1]) { // Error
+         ^";
+    core::print(c.{self::Class::finalField}{core::int});
+  }
+  for (final core::int #t98 in <core::int>[1]) {
+    invalid-expression "pkg/front_end/testcases/general/for_in.dart:115:11: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+  for (c?.finalField in [1]) { // Error
+          ^";
+    core::print(let final self::Class #t99 = c in #t99 == null ?{core::int?} null : #t99.{self::Class::finalField}{core::int});
+  }
+  for (final core::int #t100 in <core::int>[1]) {
+    invalid-expression "pkg/front_end/testcases/general/for_in.dart:118:10: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+  for (c.lateFinalField in [1]) { // Error
+         ^";
+    core::print(c.{self::Class::lateFinalField}{core::int});
+  }
+  for (final core::int #t101 in <core::int>[1]) {
+    invalid-expression "pkg/front_end/testcases/general/for_in.dart:121:11: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+  for (c?.lateFinalField in [1]) { // Error
+          ^";
+    core::print(let final self::Class #t102 = c in #t102 == null ?{core::int?} null : #t102.{self::Class::lateFinalField}{core::int});
+  }
+  for (final core::int #t103 in <core::int>[1]) {
+    invalid-expression "pkg/front_end/testcases/general/for_in.dart:124:9: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+  for (c[0] in [1]) { // Error
+        ^";
+    core::print(c.{self::Class::[]}(0){(core::int) → core::int});
+  }
+  for (final core::int #t104 in <core::int>[1]) {
+    invalid-expression "pkg/front_end/testcases/general/for_in.dart:127:10: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+  for (c?[0] in [1]) { // Error
+         ^";
+    core::print(c.{self::Class::[]}(0){(core::int) → core::int});
+  }
+  for (final core::int #t105 in <core::int>[1]) {
+    invalid-expression "pkg/front_end/testcases/general/for_in.dart:130:8: Error: Setter not found: 'finalTopLevel'.
+  for (finalTopLevel in [1]) { // Error
+       ^^^^^^^^^^^^^";
+    core::print(self::finalTopLevel);
+  }
+  for (final core::int #t106 in <core::int>[1]) {
+    invalid-expression "pkg/front_end/testcases/general/for_in.dart:133:8: Error: Setter not found: 'constTopLevel'.
+  for (constTopLevel in [1]) { // Error
+       ^^^^^^^^^^^^^";
+    core::print(#C1);
+  }
+  for (final core::String #t107 in <core::String>[invalid-expression "pkg/front_end/testcases/general/for_in.dart:136:27: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+  for (stringTopLevel in [1]) { // Error
+                          ^" in 1 as{TypeError} core::String]) {
+    self::stringTopLevel = #t107;
+    core::print(self::stringTopLevel);
+  }
+  for (final core::int #t108 in <core::int>[1]) {
+    self::stringTopLevel = invalid-expression "pkg/front_end/testcases/general/for_in.dart:139:23: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+  for (stringTopLevel in <int>[1]) { // Error
+                      ^" in #t108 as{TypeError} core::String;
+    core::print(self::stringTopLevel);
+  }
+  for (final core::int #t109 in <core::int>[1]) {
+    invalid-expression "pkg/front_end/testcases/general/for_in.dart:142:14: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+  for (defer.intTopLevel in [1]) { // Error
+             ^";
+    core::print(let final dynamic #t110 = CheckLibraryIsLoaded(defer) in self::intTopLevel);
+  }
+  for (final core::int #t111 in <core::int>[1]) {
+    invalid-expression "pkg/front_end/testcases/general/for_in.dart:145:14: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+  for (defer.numTopLevel in [1]) { // Error
+             ^";
+    core::print(let final dynamic #t112 = CheckLibraryIsLoaded(defer) in self::numTopLevel);
+  }
+  for (final core::int #t113 in <core::int>[1]) {
+    invalid-expression "pkg/front_end/testcases/general/for_in.dart:148:14: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+  for (defer.lateTopLevel in [1]) { // Error
+             ^";
+    core::print(let final dynamic #t114 = CheckLibraryIsLoaded(defer) in self::lateTopLevel);
+  }
+  for (final core::int #t115 in <core::int>[1]) {
+    invalid-expression "pkg/front_end/testcases/general/for_in.dart:151:14: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+  for (defer.lateFinalTopLevel in [1]) { // Error
+             ^";
+    core::print(let final dynamic #t116 = CheckLibraryIsLoaded(defer) in self::lateFinalTopLevel);
+  }
+  for (final core::int #t117 in <core::int>[1]) {
+    invalid-expression "pkg/front_end/testcases/general/for_in.dart:154:14: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+  for (defer.finalTopLevel in [1]) { // Error
+             ^";
+    core::print(let final dynamic #t118 = CheckLibraryIsLoaded(defer) in self::finalTopLevel);
+  }
+  for (final core::int #t119 in <core::int>[1]) {
+    invalid-expression "pkg/front_end/testcases/general/for_in.dart:157:14: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+  for (defer.constTopLevel in [1]) { // Error
+             ^";
+    core::print(let final dynamic #t120 = CheckLibraryIsLoaded(defer) in #C1);
+  }
+  for (final core::int #t121 in <core::int>[1]) {
+    invalid-expression "pkg/front_end/testcases/general/for_in.dart:160:14: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+  for (defer.stringTopLevel in [1]) { // Error
+             ^";
+    core::print(let final dynamic #t122 = CheckLibraryIsLoaded(defer) in self::stringTopLevel);
+  }
+  for (final core::int #t123 in <core::int>[1]) {
+    invalid-expression "pkg/front_end/testcases/general/for_in.dart:163:14: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+  for (defer.stringTopLevel in <int>[1]) { // Error
+             ^";
+    core::print(let final dynamic #t124 = CheckLibraryIsLoaded(defer) in self::stringTopLevel);
+  }
+  for (final core::int #t125 in <core::int>[1]) {
+    invalid-expression "pkg/front_end/testcases/general/for_in.dart:166:14: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+  for (Class.stringStaticField in [1]) { // Error
+             ^";
+    core::print(self::Class::stringStaticField);
+  }
+  for (final core::int #t126 in <core::int>[1]) {
+    invalid-expression "pkg/front_end/testcases/general/for_in.dart:169:14: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+  for (Class.stringStaticField in <int>[1]) { // Error
+             ^";
+    core::print(self::Class::stringStaticField);
+  }
+  for (final core::int #t127 in <core::int>[1]) {
+    invalid-expression "pkg/front_end/testcases/general/for_in.dart:172:14: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+  for (Class.finalStaticField in [1]) { // Error
+             ^";
+    core::print(self::Class::finalStaticField);
+  }
+  for (final core::int #t128 in <core::int>[1]) {
+    invalid-expression "pkg/front_end/testcases/general/for_in.dart:175:14: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+  for (Class.lateFinalStaticField in [1]) { // Error
+             ^";
+    core::print(self::Class::lateFinalStaticField);
+  }
+  for (final core::int #t129 in <core::int>[1]) {
+    invalid-expression "pkg/front_end/testcases/general/for_in.dart:178:18: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+  for (Extension.stringStaticField in [1]) { // Error
+                 ^";
+    core::print(self::Extension|stringStaticField);
+  }
+  for (final core::int #t130 in <core::int>[1]) {
+    invalid-expression "pkg/front_end/testcases/general/for_in.dart:181:18: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+  for (Extension.stringStaticField in <int>[1]) { // Error
+                 ^";
+    core::print(self::Extension|stringStaticField);
+  }
+  for (final core::int #t131 in <core::int>[1]) {
+    invalid-expression "pkg/front_end/testcases/general/for_in.dart:184:18: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+  for (Extension.finalStaticField in [1]) { // Error
+                 ^";
+    core::print(self::Extension|finalStaticField);
+  }
+  for (final core::int #t132 in <core::int>[1]) {
+    invalid-expression "pkg/front_end/testcases/general/for_in.dart:187:18: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+  for (Extension.lateFinalStaticField in [1]) { // Error
+                 ^";
+    core::print(self::Extension|lateFinalStaticField);
+  }
+  for (final core::int #t133 in <core::int>[1]) {
+    invalid-expression "pkg/front_end/testcases/general/for_in.dart:190:14: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+  for (Class.intStaticField in [1]) { // Error
+             ^";
+    core::print(self::Class::intStaticField);
+  }
+  for (final core::int #t134 in <core::int>[1]) {
+    invalid-expression "pkg/front_end/testcases/general/for_in.dart:193:14: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+  for (Class.numStaticField in [1]) { // Error
+             ^";
+    core::print(self::Class::numStaticField);
+  }
+  for (final core::int #t135 in <core::int>[1]) {
+    invalid-expression "pkg/front_end/testcases/general/for_in.dart:196:14: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+  for (Class.lateStaticField in [1]) { // Error
+             ^";
+    core::print(self::Class::lateStaticField);
+  }
+  for (final core::int #t136 in <core::int>[1]) {
+    invalid-expression "pkg/front_end/testcases/general/for_in.dart:199:18: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+  for (Extension.intStaticField in [1]) { // Error
+                 ^";
+    core::print(self::Extension|intStaticField);
+  }
+  for (final core::int #t137 in <core::int>[1]) {
+    invalid-expression "pkg/front_end/testcases/general/for_in.dart:202:18: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+  for (Extension.numStaticField in [1]) { // Error
+                 ^";
+    core::print(self::Extension|numStaticField);
+  }
+  for (final core::int #t138 in <core::int>[1]) {
+    invalid-expression "pkg/front_end/testcases/general/for_in.dart:205:18: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+  for (Extension.lateStaticField in [1]) { // Error
+                 ^";
+    core::print(self::Extension|lateStaticField);
+  }
+}
+static method main() → dynamic {
+  for (core::int intLocal in <core::int>[1]) {
+    core::print(intLocal);
+  }
+  for (core::num numLocal in <core::num>[1]) {
+    core::print(numLocal);
+  }
+  for (core::int varLocal in <core::int>[1]) {
+    core::print(varLocal);
+  }
+  for (final core::int finalLocal in <core::int>[1]) {
+    core::print(finalLocal);
+  }
+  core::print( block {
+    final core::List<core::int> #t139 = <core::int>[];
+    for (core::int intLocal in <core::int>[1])
+      #t139.{core::List::add}{Invariant}(intLocal){(core::int) → void};
+  } =>#t139);
+  core::print( block {
+    final core::List<core::num> #t140 = <core::num>[];
+    for (core::num numLocal in <core::num>[1])
+      #t140.{core::List::add}{Invariant}(numLocal){(core::num) → void};
+  } =>#t140);
+  core::print( block {
+    final core::List<core::int> #t141 = <core::int>[];
+    for (core::int varLocal in <core::int>[1])
+      #t141.{core::List::add}{Invariant}(varLocal){(core::int) → void};
+  } =>#t141);
+  core::print( block {
+    final core::List<core::int> #t142 = <core::int>[];
+    for (final core::int finalLocal in <core::int>[1])
+      #t142.{core::List::add}{Invariant}(finalLocal){(core::int) → void};
+  } =>#t142);
+  core::print( block {
+    final core::Map<core::int, core::int> #t143 = <core::int, core::int>{};
+    for (core::int intLocal in <core::int>[1])
+      #t143.{core::Map::[]=}{Invariant}(0, intLocal){(core::int, core::int) → void};
+  } =>#t143);
+  core::print( block {
+    final core::Map<core::int, core::num> #t144 = <core::int, core::num>{};
+    for (core::num numLocal in <core::num>[1])
+      #t144.{core::Map::[]=}{Invariant}(0, numLocal){(core::int, core::num) → void};
+  } =>#t144);
+  core::print( block {
+    final core::Map<core::int, core::int> #t145 = <core::int, core::int>{};
+    for (core::int varLocal in <core::int>[1])
+      #t145.{core::Map::[]=}{Invariant}(0, varLocal){(core::int, core::int) → void};
+  } =>#t145);
+  core::print( block {
+    final core::Map<core::int, core::int> #t146 = <core::int, core::int>{};
+    for (final core::int finalLocal in <core::int>[1])
+      #t146.{core::Map::[]=}{Invariant}(0, finalLocal){(core::int, core::int) → void};
+  } =>#t146);
+  for (final(core::int, core::int) #t147 in <(core::int, core::int)>[(1, 2)]) {
+    hoisted core::int a;
+    hoisted core::int b;
+    {
+      final synthesized(core::int, core::int) #0#0 = #t147;
+      a = #0#0.$1{core::int};
+      b = #0#0.$2{core::int};
+    }
+    core::print(a);
+    core::print(b);
+  }
+  core::int existingIntLocal;
+  for (final core::int #t148 in <core::int>[1]) {
+    existingIntLocal = #t148;
+    core::print(existingIntLocal);
+  }
+  core::num existingNumLocal;
+  for (final core::num #t149 in <core::num>[1]) {
+    existingNumLocal = #t149;
+    core::print(existingNumLocal);
+  }
+  new self::Class::•().{self::Class::method}(){() → dynamic};
+  for (final core::int #t150 in <core::int>[1]) {
+    self::intTopLevel = #t150;
+    core::print(self::intTopLevel);
+  }
+  for (final core::num #t151 in <core::num>[1]) {
+    self::numTopLevel = #t151;
+    core::print(self::numTopLevel);
+  }
+  for (final core::int #t152 in <core::int>[1]) {
+    self::lateTopLevel = #t152;
+    core::print(self::lateTopLevel);
+  }
+  for (final core::int #t153 in <core::int>[1]) {
+    self::lateFinalTopLevel = #t153;
+    core::print(self::lateFinalTopLevel);
+  }
+  self::Extension|extensionMethod(new self::Class::•());
+}
+static extension-member method Extension|get#extensionIntProperty(lowered final self::Class #this) → core::int
+  return 0;
+static extension-member method Extension|set#extensionIntProperty(lowered final self::Class #this, core::int value) → void {}
+static extension-member method Extension|get#extensionNumProperty(lowered final self::Class #this) → core::num
+  return 0;
+static extension-member method Extension|set#extensionNumProperty(lowered final self::Class #this, core::num value) → void {}
+static extension-member method Extension|get#extensionStringProperty(lowered final self::Class #this) → core::String
+  return "";
+static extension-member method Extension|set#extensionStringProperty(lowered final self::Class #this, core::String value) → void {}
+static extension-member method Extension|get#extensionReadOnlyProperty(lowered final self::Class #this) → core::int
+  return 0;
+static extension-member method Extension|test(lowered final self::Class #this) → dynamic {
+  for (final core::int #t154 in <core::int>[1]) {
+    invalid-expression "pkg/front_end/testcases/general/for_in.dart:504:15: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+    for (this.intField in [1]) { // Error
+              ^";
+    core::print(#this.{self::Class::intField}{core::int});
+  }
+  for (final core::int #t155 in <core::int>[1]) {
+    invalid-expression "pkg/front_end/testcases/general/for_in.dart:507:16: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+    for (this?.intField in [1]) { // Error
+               ^";
+    core::print(let final self::Class #t156 = #this in #t156 == null ?{core::int?} null : #t156.{self::Class::intField}{core::int});
+  }
+  for (final core::int #t157 in <core::int>[1]) {
+    invalid-expression "pkg/front_end/testcases/general/for_in.dart:510:15: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+    for (this.numField in [1]) { // Error
+              ^";
+    core::print(#this.{self::Class::numField}{core::num});
+  }
+  for (final core::int #t158 in <core::int>[1]) {
+    invalid-expression "pkg/front_end/testcases/general/for_in.dart:513:16: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+    for (this?.numField in [1]) { // Error
+               ^";
+    core::print(let final self::Class #t159 = #this in #t159 == null ?{core::num?} null : #t159.{self::Class::numField}{core::num});
+  }
+  for (final core::int #t160 in <core::int>[1]) {
+    invalid-expression "pkg/front_end/testcases/general/for_in.dart:516:15: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+    for (this.lateField in [1]) { // Error
+              ^";
+    core::print(#this.{self::Class::lateField}{core::int});
+  }
+  for (final core::int #t161 in <core::int>[1]) {
+    invalid-expression "pkg/front_end/testcases/general/for_in.dart:519:16: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+    for (this?.lateField in [1]) { // Error
+               ^";
+    core::print(let final self::Class #t162 = #this in #t162 == null ?{core::int?} null : #t162.{self::Class::lateField}{core::int});
+  }
+  for (final core::int #t163 in <core::int>[1]) {
+    invalid-expression "pkg/front_end/testcases/general/for_in.dart:522:15: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+    for (this.extensionIntProperty in [1]) { // Error
+              ^";
+    core::print(self::Extension|get#extensionIntProperty(#this));
+  }
+  for (final core::int #t164 in <core::int>[1]) {
+    invalid-expression "pkg/front_end/testcases/general/for_in.dart:525:16: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+    for (this?.extensionIntProperty in [1]) { // Error
+               ^";
+    core::print(let final self::Class #t165 = #this in #t165 == null ?{core::int?} null : self::Extension|get#extensionIntProperty(#t165));
+  }
+  for (final core::int #t166 in <core::int>[1]) {
+    invalid-expression "pkg/front_end/testcases/general/for_in.dart:528:15: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+    for (this.extensionNumProperty in [1]) { // Error
+              ^";
+    core::print(self::Extension|get#extensionNumProperty(#this));
+  }
+  for (final core::int #t167 in <core::int>[1]) {
+    invalid-expression "pkg/front_end/testcases/general/for_in.dart:531:16: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+    for (this?.extensionNumProperty in [1]) { // Error
+               ^";
+    core::print(let final self::Class #t168 = #this in #t168 == null ?{core::num?} null : self::Extension|get#extensionNumProperty(#t168));
+  }
+  for (final core::String #t169 in <core::String>[invalid-expression "pkg/front_end/testcases/general/for_in.dart:534:38: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+    for (extensionStringProperty in [1]) { // Error
+                                     ^" in 1 as{TypeError} core::String]) {
+    self::Extension|set#extensionStringProperty(#this, #t169);
+    core::print(self::Extension|get#extensionStringProperty(#this));
+  }
+  for (final core::int #t170 in <core::int>[1]) {
+    invalid-expression "pkg/front_end/testcases/general/for_in.dart:537:15: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+    for (this.extensionStringProperty in [1]) { // Error
+              ^";
+    core::print(self::Extension|get#extensionStringProperty(#this));
+  }
+  for (final core::int #t171 in <core::int>[1]) {
+    invalid-expression "pkg/front_end/testcases/general/for_in.dart:540:16: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+    for (this?.extensionStringProperty in [1]) { // Error
+               ^";
+    core::print(let final self::Class #t172 = #this in #t172 == null ?{core::String?} null : self::Extension|get#extensionStringProperty(#t172));
+  }
+  for (final core::int #t173 in <core::int>[1]) {
+    self::Extension|set#extensionStringProperty(#this, invalid-expression "pkg/front_end/testcases/general/for_in.dart:543:34: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+    for (extensionStringProperty in <int>[1]) { // Error
+                                 ^" in #t173 as{TypeError} core::String);
+    core::print(self::Extension|get#extensionStringProperty(#this));
+  }
+  for (final core::int #t174 in <core::int>[1]) {
+    invalid-expression "pkg/front_end/testcases/general/for_in.dart:546:15: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+    for (this.extensionStringProperty in <int>[1]) { // Error
+              ^";
+    core::print(self::Extension|get#extensionStringProperty(#this));
+  }
+  for (final core::int #t175 in <core::int>[1]) {
+    invalid-expression "pkg/front_end/testcases/general/for_in.dart:549:16: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+    for (this?.extensionStringProperty in <int>[1]) { // Error
+               ^";
+    core::print(let final self::Class #t176 = #this in #t176 == null ?{core::String?} null : self::Extension|get#extensionStringProperty(#t176));
+  }
+  for (final core::int #t177 in <core::int>[1]) {
+    invalid-expression "pkg/front_end/testcases/general/for_in.dart:552:10: Error: Setter not found: 'extensionReadOnlyProperty'.
+    for (extensionReadOnlyProperty in [1]) { // Error
+         ^^^^^^^^^^^^^^^^^^^^^^^^^";
+    core::print(self::Extension|get#extensionReadOnlyProperty(#this));
+  }
+  for (final core::int #t178 in <core::int>[1]) {
+    invalid-expression "pkg/front_end/testcases/general/for_in.dart:555:15: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+    for (this.extensionReadOnlyProperty in [1]) { // Error
+              ^";
+    core::print(self::Extension|get#extensionReadOnlyProperty(#this));
+  }
+  for (final core::int #t179 in <core::int>[1]) {
+    invalid-expression "pkg/front_end/testcases/general/for_in.dart:558:16: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+    for (this?.extensionReadOnlyProperty in [1]) { // Error
+               ^";
+    core::print(let final self::Class #t180 = #this in #t180 == null ?{core::int?} null : self::Extension|get#extensionReadOnlyProperty(#t180));
+  }
+  for (final core::int #t181 in <core::int>[1]) {
+    invalid-expression "pkg/front_end/testcases/general/for_in.dart:561:10: Error: Setter not found: 'finalStaticField'.
+    for (finalStaticField in [1]) { // Error
+         ^^^^^^^^^^^^^^^^";
+    core::print(self::Extension|finalStaticField);
+  }
+  for (final core::String #t182 in <core::String>[invalid-expression "pkg/front_end/testcases/general/for_in.dart:564:32: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+    for (stringStaticField in [1]) { // Error
+                               ^" in 1 as{TypeError} core::String]) {
+    self::Extension|stringStaticField = #t182;
+    core::print(self::Extension|stringStaticField);
+  }
+  for (final core::int #t183 in <core::int>[1]) {
+    self::Extension|stringStaticField = invalid-expression "pkg/front_end/testcases/general/for_in.dart:567:28: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+    for (stringStaticField in <int>[1]) { // Error
+                           ^" in #t183 as{TypeError} core::String;
+    core::print(self::Extension|stringStaticField);
+  }
+  for (final core::int #t184 in <core::int>[1]) {
+    self::Extension|lateFinalStaticField = #t184;
+    core::print(self::Extension|lateFinalStaticField);
+  }
+}
+static extension-member method Extension|get#test(lowered final self::Class #this) → () → dynamic
+  return () → dynamic => self::Extension|test(#this);
+static extension-member method Extension|extensionMethod(lowered final self::Class #this) → dynamic {
+  for (final core::int #t185 in <core::int>[1]) {
+    #this.{self::Class::intField} = #t185;
+    core::print(#this.{self::Class::intField}{core::int});
+  }
+  for (final core::num #t186 in <core::num>[1]) {
+    #this.{self::Class::numField} = #t186;
+    core::print(#this.{self::Class::numField}{core::num});
+  }
+  for (final core::int #t187 in <core::int>[1]) {
+    #this.{self::Class::lateField} = #t187;
+    core::print(#this.{self::Class::lateField}{core::int});
+  }
+  for (final core::int #t188 in <core::int>[1]) {
+    self::Extension|set#extensionIntProperty(#this, #t188);
+    core::print(self::Extension|get#extensionIntProperty(#this));
+  }
+  for (final core::num #t189 in <core::num>[1]) {
+    self::Extension|set#extensionNumProperty(#this, #t189);
+    core::print(self::Extension|get#extensionNumProperty(#this));
+  }
+  for (final core::int #t190 in <core::int>[1]) {
+    self::Extension|intStaticField = #t190;
+    core::print(self::Extension|intStaticField);
+  }
+  for (final core::num #t191 in <core::num>[1]) {
+    self::Extension|numStaticField = #t191;
+    core::print(self::Extension|numStaticField);
+  }
+  for (final core::int #t192 in <core::int>[1]) {
+    self::Extension|lateStaticField = #t192;
+    core::print(self::Extension|lateStaticField);
+  }
+}
+static extension-member method Extension|get#extensionMethod(lowered final self::Class #this) → () → dynamic
+  return () → dynamic => self::Extension|extensionMethod(#this);
+static extension-member method IndexExtension|[]=(lowered final core::int #this, core::int index, core::int value) → void {}
+static extension-member method IndexExtension|[](lowered final core::int #this, core::int index) → core::int
+  return 0;
+static extension-member method IndexExtension|extensionMethod(lowered final core::int #this) → dynamic {
+  for (final core::int #t193 in <core::int>[1]) {
+    invalid-expression "pkg/front_end/testcases/general/for_in.dart:608:14: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+    for (this[0] in [1]) { // Error
+             ^";
+    core::print(self::IndexExtension|[](#this, 0));
+  }
+  for (final core::int #t194 in <core::int>[1]) {
+    invalid-expression "pkg/front_end/testcases/general/for_in.dart:611:15: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+    for (this?[0] in [1]) { // Error
+              ^";
+    core::print(let final core::int #t195 = #this in #t195 == null ?{core::int?} null : self::IndexExtension|[](#t195, 0));
+  }
+}
+static extension-member method IndexExtension|get#extensionMethod(lowered final core::int #this) → () → dynamic
+  return () → dynamic => self::IndexExtension|extensionMethod(#this);
+
+constants  {
+  #C1 = 0
+}
diff --git a/pkg/front_end/testcases/general/for_in.dart.strong.outline.expect b/pkg/front_end/testcases/general/for_in.dart.strong.outline.expect
new file mode 100644
index 0000000..157cad8
--- /dev/null
+++ b/pkg/front_end/testcases/general/for_in.dart.strong.outline.expect
@@ -0,0 +1,108 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+import "org-dartlang-testcase:///for_in.dart" deferred as defer hide Extension, IndexExtension;
+
+class Class extends core::Object {
+  field core::int intField;
+  field core::num numField;
+  field core::String stringField;
+  final field core::int finalField;
+  late field core::int lateField;
+  late final [setter] field core::int lateFinalField;
+  static field core::int intStaticField;
+  static field core::num numStaticField;
+  static field core::String stringStaticField;
+  static final field core::int finalStaticField;
+  late static field core::int lateStaticField;
+  late static final [setter] field core::int lateFinalStaticField;
+  synthetic constructor •() → self::Class
+    ;
+  operator []=(core::int index, core::int value) → void
+    ;
+  operator [](core::int index) → core::int
+    ;
+  method test() → dynamic
+    ;
+  method method() → dynamic
+    ;
+}
+class Subclass extends self::Class {
+  synthetic constructor •() → self::Subclass
+    ;
+  method test() → dynamic
+    ;
+}
+extension Extension on self::Class {
+  get extensionIntProperty = self::Extension|get#extensionIntProperty;
+  set extensionIntProperty = self::Extension|set#extensionIntProperty;
+  get extensionNumProperty = self::Extension|get#extensionNumProperty;
+  set extensionNumProperty = self::Extension|set#extensionNumProperty;
+  get extensionStringProperty = self::Extension|get#extensionStringProperty;
+  set extensionStringProperty = self::Extension|set#extensionStringProperty;
+  get extensionReadOnlyProperty = self::Extension|get#extensionReadOnlyProperty;
+  static field intStaticField = self::Extension|intStaticField;
+  static field numStaticField = self::Extension|numStaticField;
+  static field stringStaticField = self::Extension|stringStaticField;
+  static field finalStaticField = self::Extension|finalStaticField;
+  static field lateStaticField = self::Extension|lateStaticField;
+  static field lateFinalStaticField = self::Extension|lateFinalStaticField;
+  method test = self::Extension|test;
+  method tearoff test = self::Extension|get#test;
+  method extensionMethod = self::Extension|extensionMethod;
+  method tearoff extensionMethod = self::Extension|get#extensionMethod;
+}
+extension IndexExtension on core::int {
+  operator []= = self::IndexExtension|[]=;
+  operator [] = self::IndexExtension|[];
+  method extensionMethod = self::IndexExtension|extensionMethod;
+  method tearoff extensionMethod = self::IndexExtension|get#extensionMethod;
+}
+static field core::int intTopLevel;
+static final field core::int finalTopLevel;
+static const field core::int constTopLevel = 0;
+late static field core::int lateTopLevel;
+late static final [setter] field core::int lateFinalTopLevel;
+static field core::num numTopLevel;
+static field core::String stringTopLevel;
+static field core::int Extension|intStaticField;
+static field core::num Extension|numStaticField;
+static field core::String Extension|stringStaticField;
+static final field core::int Extension|finalStaticField;
+late static field core::int Extension|lateStaticField;
+late static final [setter] field core::int Extension|lateFinalStaticField;
+static method test() → dynamic
+  ;
+static method main() → dynamic
+  ;
+static extension-member method Extension|get#extensionIntProperty(lowered final self::Class #this) → core::int
+  ;
+static extension-member method Extension|set#extensionIntProperty(lowered final self::Class #this, core::int value) → void
+  ;
+static extension-member method Extension|get#extensionNumProperty(lowered final self::Class #this) → core::num
+  ;
+static extension-member method Extension|set#extensionNumProperty(lowered final self::Class #this, core::num value) → void
+  ;
+static extension-member method Extension|get#extensionStringProperty(lowered final self::Class #this) → core::String
+  ;
+static extension-member method Extension|set#extensionStringProperty(lowered final self::Class #this, core::String value) → void
+  ;
+static extension-member method Extension|get#extensionReadOnlyProperty(lowered final self::Class #this) → core::int
+  ;
+static extension-member method Extension|test(lowered final self::Class #this) → dynamic
+  ;
+static extension-member method Extension|get#test(lowered final self::Class #this) → () → dynamic
+  return () → dynamic => self::Extension|test(#this);
+static extension-member method Extension|extensionMethod(lowered final self::Class #this) → dynamic
+  ;
+static extension-member method Extension|get#extensionMethod(lowered final self::Class #this) → () → dynamic
+  return () → dynamic => self::Extension|extensionMethod(#this);
+static extension-member method IndexExtension|[]=(lowered final core::int #this, core::int index, core::int value) → void
+  ;
+static extension-member method IndexExtension|[](lowered final core::int #this, core::int index) → core::int
+  ;
+static extension-member method IndexExtension|extensionMethod(lowered final core::int #this) → dynamic
+  ;
+static extension-member method IndexExtension|get#extensionMethod(lowered final core::int #this) → () → dynamic
+  return () → dynamic => self::IndexExtension|extensionMethod(#this);
diff --git a/pkg/front_end/testcases/general/for_in.dart.strong.transformed.expect b/pkg/front_end/testcases/general/for_in.dart.strong.transformed.expect
new file mode 100644
index 0000000..81b8e8f
--- /dev/null
+++ b/pkg/front_end/testcases/general/for_in.dart.strong.transformed.expect
@@ -0,0 +1,2921 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/for_in.dart:16:14: Error: A for-in loop-variable can't be 'const'.
+// Try removing the 'const' modifier.
+//   for (const constLocal in [1]) { // Error
+//              ^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/for_in.dart:19:8: Error: Can't have modifier 'late' here.
+// Try removing 'late'.
+//   for (late int lateLocal in [1]) { // Error
+//        ^^^^
+//
+// pkg/front_end/testcases/general/for_in.dart:29:16: Error: A for-in loop-variable can't be 'const'.
+// Try removing the 'const' modifier.
+//     for (const constLocal in [1]) constLocal // Error
+//                ^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/for_in.dart:32:10: Error: Can't have modifier 'late' here.
+// Try removing 'late'.
+//     for (late int lateLocal in [1]) lateLocal // Error
+//          ^^^^
+//
+// pkg/front_end/testcases/general/for_in.dart:41:16: Error: A for-in loop-variable can't be 'const'.
+// Try removing the 'const' modifier.
+//     for (const constLocal in [1]) 0: constLocal // Error
+//                ^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/for_in.dart:44:10: Error: Can't have modifier 'late' here.
+// Try removing 'late'.
+//     for (late int lateLocal in [1]) 0: lateLocal // Error
+//          ^^^^
+//
+// pkg/front_end/testcases/general/for_in.dart:52:24: Error: Unexpected token ','.
+//   for (int? multiLocal1, multiLocal2 in [1]) { // Error
+//                        ^
+//
+// pkg/front_end/testcases/general/for_in.dart:52:8: Error: A for-in loop can't have more than one loop variable.
+//   for (int? multiLocal1, multiLocal2 in [1]) { // Error
+//        ^^^
+//
+// pkg/front_end/testcases/general/for_in.dart:56:26: Error: Unexpected token ','.
+//   for (var varMultiLocal1, varMultiLocal2 in [1]) { // Error
+//                          ^
+//
+// pkg/front_end/testcases/general/for_in.dart:56:8: Error: A for-in loop can't have more than one loop variable.
+//   for (var varMultiLocal1, varMultiLocal2 in [1]) { // Error
+//        ^^^
+//
+// pkg/front_end/testcases/general/for_in.dart:60:26: Error: Unexpected token ','.
+//   for (num numMultiLocal1, numMultiLocal2 in [1]) { // Error
+//                          ^
+//
+// pkg/front_end/testcases/general/for_in.dart:60:8: Error: A for-in loop can't have more than one loop variable.
+//   for (num numMultiLocal1, numMultiLocal2 in [1]) { // Error
+//        ^^^
+//
+// pkg/front_end/testcases/general/for_in.dart:64:8: Error: Expected an identifier, but got '1'.
+// Try inserting an identifier before '1'.
+//   for (1 in [1]) { // Error
+//        ^
+//
+// pkg/front_end/testcases/general/for_in.dart:64:8: Error: Can't assign to this, so it can't be used in a for-in loop.
+//   for (1 in [1]) { // Error
+//        ^
+//
+// pkg/front_end/testcases/general/for_in.dart:67:12: Error: Unexpected token '('.
+//   for (main() in [1]) { // Error
+//            ^
+//
+// pkg/front_end/testcases/general/for_in.dart:67:8: Error: Can't assign to this, so it can't be used in a for-in loop.
+//   for (main() in [1]) { // Error
+//        ^^^^
+//
+// pkg/front_end/testcases/general/for_in.dart:71:8: Error: Can't assign to the final variable 'existingFinalLocal'.
+//   for (existingFinalLocal in [1]) { // Error
+//        ^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/for_in.dart:82:9: Error: Unexpected token '.'.
+//   for (c.intField in [1]) { // Error
+//         ^
+//
+// pkg/front_end/testcases/general/for_in.dart:85:9: Error: Unexpected token '.'.
+//   for (c.numField in [1]) { // Error
+//         ^
+//
+// pkg/front_end/testcases/general/for_in.dart:88:9: Error: Unexpected token '.'.
+//   for (c.lateField in [1]) { // Error
+//         ^
+//
+// pkg/front_end/testcases/general/for_in.dart:91:9: Error: Unexpected token '?.'.
+//   for (c?.intField in [1]) { // Error
+//         ^^
+//
+// pkg/front_end/testcases/general/for_in.dart:94:9: Error: Unexpected token '?.'.
+//   for (c?.numField in [1]) { // Error
+//         ^^
+//
+// pkg/front_end/testcases/general/for_in.dart:97:9: Error: Unexpected token '?.'.
+//   for (c?.lateField in [1]) { // Error
+//         ^^
+//
+// pkg/front_end/testcases/general/for_in.dart:100:9: Error: Unexpected token '.'.
+//   for (c.stringField in [1]) { // Error
+//         ^
+//
+// pkg/front_end/testcases/general/for_in.dart:103:9: Error: Unexpected token '.'.
+//   for (c.stringField in <int>[1]) { // Error
+//         ^
+//
+// pkg/front_end/testcases/general/for_in.dart:106:9: Error: Unexpected token '?.'.
+//   for (c?.stringField in [1]) { // Error
+//         ^^
+//
+// pkg/front_end/testcases/general/for_in.dart:109:9: Error: Unexpected token '?.'.
+//   for (c?.stringField in <int>[1]) { // Error
+//         ^^
+//
+// pkg/front_end/testcases/general/for_in.dart:112:9: Error: Unexpected token '.'.
+//   for (c.finalField in [1]) { // Error
+//         ^
+//
+// pkg/front_end/testcases/general/for_in.dart:115:9: Error: Unexpected token '?.'.
+//   for (c?.finalField in [1]) { // Error
+//         ^^
+//
+// pkg/front_end/testcases/general/for_in.dart:118:9: Error: Unexpected token '.'.
+//   for (c.lateFinalField in [1]) { // Error
+//         ^
+//
+// pkg/front_end/testcases/general/for_in.dart:121:9: Error: Unexpected token '?.'.
+//   for (c?.lateFinalField in [1]) { // Error
+//         ^^
+//
+// pkg/front_end/testcases/general/for_in.dart:124:9: Error: Unexpected token '['.
+//   for (c[0] in [1]) { // Error
+//         ^
+//
+// pkg/front_end/testcases/general/for_in.dart:127:9: Error: Unexpected token '?'.
+//   for (c?[0] in [1]) { // Error
+//         ^
+//
+// pkg/front_end/testcases/general/for_in.dart:130:8: Error: Setter not found: 'finalTopLevel'.
+//   for (finalTopLevel in [1]) { // Error
+//        ^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/for_in.dart:133:8: Error: Setter not found: 'constTopLevel'.
+//   for (constTopLevel in [1]) { // Error
+//        ^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/for_in.dart:142:13: Error: Unexpected token '.'.
+//   for (defer.intTopLevel in [1]) { // Error
+//             ^
+//
+// pkg/front_end/testcases/general/for_in.dart:145:13: Error: Unexpected token '.'.
+//   for (defer.numTopLevel in [1]) { // Error
+//             ^
+//
+// pkg/front_end/testcases/general/for_in.dart:148:13: Error: Unexpected token '.'.
+//   for (defer.lateTopLevel in [1]) { // Error
+//             ^
+//
+// pkg/front_end/testcases/general/for_in.dart:151:13: Error: Unexpected token '.'.
+//   for (defer.lateFinalTopLevel in [1]) { // Error
+//             ^
+//
+// pkg/front_end/testcases/general/for_in.dart:154:13: Error: Unexpected token '.'.
+//   for (defer.finalTopLevel in [1]) { // Error
+//             ^
+//
+// pkg/front_end/testcases/general/for_in.dart:157:13: Error: Unexpected token '.'.
+//   for (defer.constTopLevel in [1]) { // Error
+//             ^
+//
+// pkg/front_end/testcases/general/for_in.dart:160:13: Error: Unexpected token '.'.
+//   for (defer.stringTopLevel in [1]) { // Error
+//             ^
+//
+// pkg/front_end/testcases/general/for_in.dart:163:13: Error: Unexpected token '.'.
+//   for (defer.stringTopLevel in <int>[1]) { // Error
+//             ^
+//
+// pkg/front_end/testcases/general/for_in.dart:166:13: Error: Unexpected token '.'.
+//   for (Class.stringStaticField in [1]) { // Error
+//             ^
+//
+// pkg/front_end/testcases/general/for_in.dart:169:13: Error: Unexpected token '.'.
+//   for (Class.stringStaticField in <int>[1]) { // Error
+//             ^
+//
+// pkg/front_end/testcases/general/for_in.dart:172:13: Error: Unexpected token '.'.
+//   for (Class.finalStaticField in [1]) { // Error
+//             ^
+//
+// pkg/front_end/testcases/general/for_in.dart:175:13: Error: Unexpected token '.'.
+//   for (Class.lateFinalStaticField in [1]) { // Error
+//             ^
+//
+// pkg/front_end/testcases/general/for_in.dart:178:17: Error: Unexpected token '.'.
+//   for (Extension.stringStaticField in [1]) { // Error
+//                 ^
+//
+// pkg/front_end/testcases/general/for_in.dart:181:17: Error: Unexpected token '.'.
+//   for (Extension.stringStaticField in <int>[1]) { // Error
+//                 ^
+//
+// pkg/front_end/testcases/general/for_in.dart:184:17: Error: Unexpected token '.'.
+//   for (Extension.finalStaticField in [1]) { // Error
+//                 ^
+//
+// pkg/front_end/testcases/general/for_in.dart:187:17: Error: Unexpected token '.'.
+//   for (Extension.lateFinalStaticField in [1]) { // Error
+//                 ^
+//
+// pkg/front_end/testcases/general/for_in.dart:190:13: Error: Unexpected token '.'.
+//   for (Class.intStaticField in [1]) { // Error
+//             ^
+//
+// pkg/front_end/testcases/general/for_in.dart:193:13: Error: Unexpected token '.'.
+//   for (Class.numStaticField in [1]) { // Error
+//             ^
+//
+// pkg/front_end/testcases/general/for_in.dart:196:13: Error: Unexpected token '.'.
+//   for (Class.lateStaticField in [1]) { // Error
+//             ^
+//
+// pkg/front_end/testcases/general/for_in.dart:199:17: Error: Unexpected token '.'.
+//   for (Extension.intStaticField in [1]) { // Error
+//                 ^
+//
+// pkg/front_end/testcases/general/for_in.dart:202:17: Error: Unexpected token '.'.
+//   for (Extension.numStaticField in [1]) { // Error
+//                 ^
+//
+// pkg/front_end/testcases/general/for_in.dart:205:17: Error: Unexpected token '.'.
+//   for (Extension.lateStaticField in [1]) { // Error
+//                 ^
+//
+// pkg/front_end/testcases/general/for_in.dart:22:31: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+//   for (String stringLocal in [1]) { // Error
+//                               ^
+//
+// pkg/front_end/testcases/general/for_in.dart:25:15: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+// Try changing the type of the variable.
+//   for (String stringLocal in <int>[1]) { // Error
+//               ^
+//
+// pkg/front_end/testcases/general/for_in.dart:35:33: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+//     for (String stringLocal in [1]) stringLocal // Error
+//                                 ^
+//
+// pkg/front_end/testcases/general/for_in.dart:38:17: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+// Try changing the type of the variable.
+//     for (String stringLocal in <int>[1]) stringLocal // Error
+//                 ^
+//
+// pkg/front_end/testcases/general/for_in.dart:47:33: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+//     for (String stringLocal in [1]) 0: stringLocal // Error
+//                                 ^
+//
+// pkg/front_end/testcases/general/for_in.dart:50:17: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+// Try changing the type of the variable.
+//     for (String stringLocal in <int>[1]) 0: stringLocal // Error
+//                 ^
+//
+// pkg/front_end/testcases/general/for_in.dart:61:11: Error: Non-nullable variable 'numMultiLocal1' must be assigned before it can be used.
+//     print(numMultiLocal1);
+//           ^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/for_in.dart:62:11: Error: Non-nullable variable 'numMultiLocal2' must be assigned before it can be used.
+//     print(numMultiLocal2);
+//           ^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/for_in.dart:72:11: Error: Final variable 'existingFinalLocal' must be assigned before it can be used.
+//     print(existingFinalLocal);
+//           ^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/for_in.dart:75:32: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+//   for (existingStringLocal in [1]) { // Error
+//                                ^
+//
+// pkg/front_end/testcases/general/for_in.dart:78:28: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+//   for (existingStringLocal in <int>[1]) { // Error
+//                            ^
+//
+// pkg/front_end/testcases/general/for_in.dart:136:27: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+//   for (stringTopLevel in [1]) { // Error
+//                           ^
+//
+// pkg/front_end/testcases/general/for_in.dart:139:23: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+//   for (stringTopLevel in <int>[1]) { // Error
+//                       ^
+//
+// pkg/front_end/testcases/general/for_in.dart:296:10: Error: Expected an identifier, but got 'this'.
+// Try inserting an identifier before 'this'.
+//     for (this.intField in [1]) { // Error
+//          ^^^^
+//
+// pkg/front_end/testcases/general/for_in.dart:299:10: Error: Expected an identifier, but got 'this'.
+// Try inserting an identifier before 'this'.
+//     for (this?.intField in [1]) { // Error
+//          ^^^^
+//
+// pkg/front_end/testcases/general/for_in.dart:302:10: Error: Expected an identifier, but got 'this'.
+// Try inserting an identifier before 'this'.
+//     for (this.numField in [1]) { // Error
+//          ^^^^
+//
+// pkg/front_end/testcases/general/for_in.dart:305:10: Error: Expected an identifier, but got 'this'.
+// Try inserting an identifier before 'this'.
+//     for (this?.numField in [1]) { // Error
+//          ^^^^
+//
+// pkg/front_end/testcases/general/for_in.dart:308:10: Error: Expected an identifier, but got 'this'.
+// Try inserting an identifier before 'this'.
+//     for (this.lateField in [1]) { // Error
+//          ^^^^
+//
+// pkg/front_end/testcases/general/for_in.dart:311:10: Error: Expected an identifier, but got 'this'.
+// Try inserting an identifier before 'this'.
+//     for (this?.lateField in [1]) { // Error
+//          ^^^^
+//
+// pkg/front_end/testcases/general/for_in.dart:320:10: Error: Expected an identifier, but got 'this'.
+// Try inserting an identifier before 'this'.
+//     for (this.stringField in [1]) { // Error
+//          ^^^^
+//
+// pkg/front_end/testcases/general/for_in.dart:323:10: Error: Expected an identifier, but got 'this'.
+// Try inserting an identifier before 'this'.
+//     for (this.stringField in <int>[1]) { // Error
+//          ^^^^
+//
+// pkg/front_end/testcases/general/for_in.dart:326:10: Error: Expected an identifier, but got 'this'.
+// Try inserting an identifier before 'this'.
+//     for (this?.stringField in [1]) { // Error
+//          ^^^^
+//
+// pkg/front_end/testcases/general/for_in.dart:329:10: Error: Expected an identifier, but got 'this'.
+// Try inserting an identifier before 'this'.
+//     for (this?.stringField in <int>[1]) { // Error
+//          ^^^^
+//
+// pkg/front_end/testcases/general/for_in.dart:332:10: Error: Expected an identifier, but got 'this'.
+// Try inserting an identifier before 'this'.
+//     for (this[0] in [1]) { // Error
+//          ^^^^
+//
+// pkg/front_end/testcases/general/for_in.dart:335:10: Error: Expected an identifier, but got 'this'.
+// Try inserting an identifier before 'this'.
+//     for (this?[0] in [1]) { // Error
+//          ^^^^
+//
+// pkg/front_end/testcases/general/for_in.dart:344:10: Error: Expected an identifier, but got 'this'.
+// Try inserting an identifier before 'this'.
+//     for (this.finalField in [1]) { // Error
+//          ^^^^
+//
+// pkg/front_end/testcases/general/for_in.dart:347:10: Error: Expected an identifier, but got 'this'.
+// Try inserting an identifier before 'this'.
+//     for (this.finalField in <int>[1]) { // Error
+//          ^^^^
+//
+// pkg/front_end/testcases/general/for_in.dart:350:10: Error: Expected an identifier, but got 'this'.
+// Try inserting an identifier before 'this'.
+//     for (this?.finalField in [1]) { // Error
+//          ^^^^
+//
+// pkg/front_end/testcases/general/for_in.dart:353:10: Error: Expected an identifier, but got 'this'.
+// Try inserting an identifier before 'this'.
+//     for (this?.finalField in <int>[1]) { // Error
+//          ^^^^
+//
+// pkg/front_end/testcases/general/for_in.dart:359:10: Error: Expected an identifier, but got 'this'.
+// Try inserting an identifier before 'this'.
+//     for (this.lateFinalField in [1]) { // Error
+//          ^^^^
+//
+// pkg/front_end/testcases/general/for_in.dart:362:10: Error: Expected an identifier, but got 'this'.
+// Try inserting an identifier before 'this'.
+//     for (this?.lateFinalField in [1]) { // Error
+//          ^^^^
+//
+// pkg/front_end/testcases/general/for_in.dart:365:10: Error: Setter not found: 'finalStaticField'.
+//     for (finalStaticField in [1]) { // Error
+//          ^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/for_in.dart:377:10: Error: Expected an identifier, but got 'this'.
+// Try inserting an identifier before 'this'.
+//     for (this.extensionIntProperty in [1]) { // Error
+//          ^^^^
+//
+// pkg/front_end/testcases/general/for_in.dart:380:10: Error: Expected an identifier, but got 'this'.
+// Try inserting an identifier before 'this'.
+//     for (this?.extensionIntProperty in [1]) { // Error
+//          ^^^^
+//
+// pkg/front_end/testcases/general/for_in.dart:383:10: Error: Expected an identifier, but got 'this'.
+// Try inserting an identifier before 'this'.
+//     for (this.extensionNumProperty in [1]) { // Error
+//          ^^^^
+//
+// pkg/front_end/testcases/general/for_in.dart:386:10: Error: Expected an identifier, but got 'this'.
+// Try inserting an identifier before 'this'.
+//     for (this?.extensionNumProperty in [1]) { // Error
+//          ^^^^
+//
+// pkg/front_end/testcases/general/for_in.dart:389:19: Error: Unexpected token '('.
+//     for (Extension(this).extensionIntProperty in [1]) { // Error
+//                   ^
+//
+// pkg/front_end/testcases/general/for_in.dart:392:19: Error: Unexpected token '('.
+//     for (Extension(this)?.extensionIntProperty in [1]) { // Error
+//                   ^
+//
+// pkg/front_end/testcases/general/for_in.dart:395:19: Error: Unexpected token '('.
+//     for (Extension(this).extensionNumProperty in [1]) { // Error
+//                   ^
+//
+// pkg/front_end/testcases/general/for_in.dart:398:19: Error: Unexpected token '('.
+//     for (Extension(this)?.extensionNumProperty in [1]) { // Error
+//                   ^
+//
+// pkg/front_end/testcases/general/for_in.dart:401:19: Error: Unexpected token '('.
+//     for (Extension(this).extensionStringProperty in [1]) { // Error
+//                   ^
+//
+// pkg/front_end/testcases/general/for_in.dart:404:19: Error: Unexpected token '('.
+//     for (Extension(this)?.extensionStringProperty in [1]) { // Error
+//                   ^
+//
+// pkg/front_end/testcases/general/for_in.dart:407:19: Error: Unexpected token '('.
+//     for (Extension(this).extensionStringProperty in <int>[1]) { // Error
+//                   ^
+//
+// pkg/front_end/testcases/general/for_in.dart:410:19: Error: Unexpected token '('.
+//     for (Extension(this)?.extensionStringProperty in <int>[1]) { // Error
+//                   ^
+//
+// pkg/front_end/testcases/general/for_in.dart:413:19: Error: Unexpected token '('.
+//     for (Extension(this).extensionReadOnlyProperty in [1]) { // Error
+//                   ^
+//
+// pkg/front_end/testcases/general/for_in.dart:416:19: Error: Unexpected token '('.
+//     for (Extension(this)?.extensionReadOnlyProperty in [1]) { // Error
+//                   ^
+//
+// pkg/front_end/testcases/general/for_in.dart:419:10: Error: Expected an identifier, but got '0'.
+// Try inserting an identifier before '0'.
+//     for (0[0] in [1]) { // Error
+//          ^
+//
+// pkg/front_end/testcases/general/for_in.dart:422:10: Error: Expected an identifier, but got '0'.
+// Try inserting an identifier before '0'.
+//     for (0?[0] in [1]) { // Error
+//          ^
+//
+// pkg/front_end/testcases/general/for_in.dart:425:24: Error: Unexpected token '('.
+//     for (IndexExtension(0)[0] in [1]) { // Error
+//                        ^
+//
+// pkg/front_end/testcases/general/for_in.dart:428:24: Error: Unexpected token '('.
+//     for (IndexExtension(0)?[0] in [1]) { // Error
+//                        ^
+//
+// pkg/front_end/testcases/general/for_in.dart:314:26: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+//     for (stringField in [1]) { // Error
+//                          ^
+//
+// pkg/front_end/testcases/general/for_in.dart:317:22: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+//     for (stringField in <int>[1]) { // Error
+//                      ^
+//
+// pkg/front_end/testcases/general/for_in.dart:338:10: Error: The setter 'finalField' isn't defined for the type 'Class'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/for_in.dart'.
+// Try correcting the name to the name of an existing setter, or defining a setter or field named 'finalField'.
+//     for (finalField in [1]) { // Error
+//          ^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/for_in.dart:341:10: Error: The setter 'finalField' isn't defined for the type 'Class'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/for_in.dart'.
+// Try correcting the name to the name of an existing setter, or defining a setter or field named 'finalField'.
+//     for (finalField in <int>[1]) { // Error
+//          ^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/for_in.dart:368:32: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+//     for (stringStaticField in [1]) { // Error
+//                                ^
+//
+// pkg/front_end/testcases/general/for_in.dart:371:28: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+//     for (stringStaticField in <int>[1]) { // Error
+//                            ^
+//
+// pkg/front_end/testcases/general/for_in.dart:463:10: Error: Expected an identifier, but got 'super'.
+// Try inserting an identifier before 'super'.
+//     for (super.stringField in [1]) { // Error
+//          ^^^^^
+//
+// pkg/front_end/testcases/general/for_in.dart:466:10: Error: Expected an identifier, but got 'super'.
+// Try inserting an identifier before 'super'.
+//     for (super.stringField in <int>[1]) { // Error
+//          ^^^^^
+//
+// pkg/front_end/testcases/general/for_in.dart:469:10: Error: Expected an identifier, but got 'super'.
+// Try inserting an identifier before 'super'.
+//     for (super.intField in [1]) { // Error
+//          ^^^^^
+//
+// pkg/front_end/testcases/general/for_in.dart:472:10: Error: Expected an identifier, but got 'super'.
+// Try inserting an identifier before 'super'.
+//     for (super.numField in [1]) { // Error
+//          ^^^^^
+//
+// pkg/front_end/testcases/general/for_in.dart:475:10: Error: Expected an identifier, but got 'super'.
+// Try inserting an identifier before 'super'.
+//     for (super.lateField in [1]) { // Error
+//          ^^^^^
+//
+// pkg/front_end/testcases/general/for_in.dart:478:10: Error: Expected an identifier, but got 'super'.
+// Try inserting an identifier before 'super'.
+//     for (super[0] in [1]) { // Error
+//          ^^^^^
+//
+// pkg/front_end/testcases/general/for_in.dart:481:10: Error: Expected an identifier, but got 'super'.
+// Try inserting an identifier before 'super'.
+//     for (super?[0] in [1]) { // Error
+//          ^^^^^
+//
+// pkg/front_end/testcases/general/for_in.dart:504:10: Error: Expected an identifier, but got 'this'.
+// Try inserting an identifier before 'this'.
+//     for (this.intField in [1]) { // Error
+//          ^^^^
+//
+// pkg/front_end/testcases/general/for_in.dart:507:10: Error: Expected an identifier, but got 'this'.
+// Try inserting an identifier before 'this'.
+//     for (this?.intField in [1]) { // Error
+//          ^^^^
+//
+// pkg/front_end/testcases/general/for_in.dart:510:10: Error: Expected an identifier, but got 'this'.
+// Try inserting an identifier before 'this'.
+//     for (this.numField in [1]) { // Error
+//          ^^^^
+//
+// pkg/front_end/testcases/general/for_in.dart:513:10: Error: Expected an identifier, but got 'this'.
+// Try inserting an identifier before 'this'.
+//     for (this?.numField in [1]) { // Error
+//          ^^^^
+//
+// pkg/front_end/testcases/general/for_in.dart:516:10: Error: Expected an identifier, but got 'this'.
+// Try inserting an identifier before 'this'.
+//     for (this.lateField in [1]) { // Error
+//          ^^^^
+//
+// pkg/front_end/testcases/general/for_in.dart:519:10: Error: Expected an identifier, but got 'this'.
+// Try inserting an identifier before 'this'.
+//     for (this?.lateField in [1]) { // Error
+//          ^^^^
+//
+// pkg/front_end/testcases/general/for_in.dart:522:10: Error: Expected an identifier, but got 'this'.
+// Try inserting an identifier before 'this'.
+//     for (this.extensionIntProperty in [1]) { // Error
+//          ^^^^
+//
+// pkg/front_end/testcases/general/for_in.dart:525:10: Error: Expected an identifier, but got 'this'.
+// Try inserting an identifier before 'this'.
+//     for (this?.extensionIntProperty in [1]) { // Error
+//          ^^^^
+//
+// pkg/front_end/testcases/general/for_in.dart:528:10: Error: Expected an identifier, but got 'this'.
+// Try inserting an identifier before 'this'.
+//     for (this.extensionNumProperty in [1]) { // Error
+//          ^^^^
+//
+// pkg/front_end/testcases/general/for_in.dart:531:10: Error: Expected an identifier, but got 'this'.
+// Try inserting an identifier before 'this'.
+//     for (this?.extensionNumProperty in [1]) { // Error
+//          ^^^^
+//
+// pkg/front_end/testcases/general/for_in.dart:537:10: Error: Expected an identifier, but got 'this'.
+// Try inserting an identifier before 'this'.
+//     for (this.extensionStringProperty in [1]) { // Error
+//          ^^^^
+//
+// pkg/front_end/testcases/general/for_in.dart:540:10: Error: Expected an identifier, but got 'this'.
+// Try inserting an identifier before 'this'.
+//     for (this?.extensionStringProperty in [1]) { // Error
+//          ^^^^
+//
+// pkg/front_end/testcases/general/for_in.dart:546:10: Error: Expected an identifier, but got 'this'.
+// Try inserting an identifier before 'this'.
+//     for (this.extensionStringProperty in <int>[1]) { // Error
+//          ^^^^
+//
+// pkg/front_end/testcases/general/for_in.dart:549:10: Error: Expected an identifier, but got 'this'.
+// Try inserting an identifier before 'this'.
+//     for (this?.extensionStringProperty in <int>[1]) { // Error
+//          ^^^^
+//
+// pkg/front_end/testcases/general/for_in.dart:552:10: Error: Setter not found: 'extensionReadOnlyProperty'.
+//     for (extensionReadOnlyProperty in [1]) { // Error
+//          ^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/for_in.dart:555:10: Error: Expected an identifier, but got 'this'.
+// Try inserting an identifier before 'this'.
+//     for (this.extensionReadOnlyProperty in [1]) { // Error
+//          ^^^^
+//
+// pkg/front_end/testcases/general/for_in.dart:558:10: Error: Expected an identifier, but got 'this'.
+// Try inserting an identifier before 'this'.
+//     for (this?.extensionReadOnlyProperty in [1]) { // Error
+//          ^^^^
+//
+// pkg/front_end/testcases/general/for_in.dart:561:10: Error: Setter not found: 'finalStaticField'.
+//     for (finalStaticField in [1]) { // Error
+//          ^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/for_in.dart:534:38: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+//     for (extensionStringProperty in [1]) { // Error
+//                                      ^
+//
+// pkg/front_end/testcases/general/for_in.dart:543:34: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+//     for (extensionStringProperty in <int>[1]) { // Error
+//                                  ^
+//
+// pkg/front_end/testcases/general/for_in.dart:564:32: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+//     for (stringStaticField in [1]) { // Error
+//                                ^
+//
+// pkg/front_end/testcases/general/for_in.dart:567:28: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+//     for (stringStaticField in <int>[1]) { // Error
+//                            ^
+//
+// pkg/front_end/testcases/general/for_in.dart:608:10: Error: Expected an identifier, but got 'this'.
+// Try inserting an identifier before 'this'.
+//     for (this[0] in [1]) { // Error
+//          ^^^^
+//
+// pkg/front_end/testcases/general/for_in.dart:611:10: Error: Expected an identifier, but got 'this'.
+// Try inserting an identifier before 'this'.
+//     for (this?[0] in [1]) { // Error
+//          ^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+import "org-dartlang-testcase:///for_in.dart" deferred as defer hide Extension, IndexExtension;
+
+class Class extends core::Object {
+  field core::int intField = 0;
+  field core::num numField = 0;
+  field core::String stringField = "";
+  final field core::int finalField = 0;
+  late field core::int lateField;
+  late final [setter] field core::int lateFinalField;
+  static field core::int intStaticField = 0;
+  static field core::num numStaticField = 0;
+  static field core::String stringStaticField = "";
+  static final field core::int finalStaticField = 0;
+  late static field core::int lateStaticField;
+  late static final [setter] field core::int lateFinalStaticField;
+  synthetic constructor •() → self::Class
+    : super core::Object::•()
+    ;
+  operator []=(core::int index, core::int value) → void {}
+  operator [](core::int index) → core::int
+    return 0;
+  method test() → dynamic {
+    {
+      synthesized core::Iterator<core::int> :sync-for-iterator = core::_GrowableList::_literal1<core::int>(1).{core::Iterable::iterator}{core::Iterator<core::int>};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
+        final core::int #t1 = :sync-for-iterator.{core::Iterator::current}{core::int};
+        {
+          invalid-expression "pkg/front_end/testcases/general/for_in.dart:296:15: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+    for (this.intField in [1]) { // Error
+              ^";
+          core::print(this.{self::Class::intField}{core::int});
+        }
+      }
+    }
+    {
+      synthesized core::Iterator<core::int> :sync-for-iterator = core::_GrowableList::_literal1<core::int>(1).{core::Iterable::iterator}{core::Iterator<core::int>};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
+        final core::int #t2 = :sync-for-iterator.{core::Iterator::current}{core::int};
+        {
+          invalid-expression "pkg/front_end/testcases/general/for_in.dart:299:16: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+    for (this?.intField in [1]) { // Error
+               ^";
+          core::print(this.{self::Class::intField}{core::int});
+        }
+      }
+    }
+    {
+      synthesized core::Iterator<core::int> :sync-for-iterator = core::_GrowableList::_literal1<core::int>(1).{core::Iterable::iterator}{core::Iterator<core::int>};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
+        final core::int #t3 = :sync-for-iterator.{core::Iterator::current}{core::int};
+        {
+          invalid-expression "pkg/front_end/testcases/general/for_in.dart:302:15: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+    for (this.numField in [1]) { // Error
+              ^";
+          core::print(this.{self::Class::numField}{core::num});
+        }
+      }
+    }
+    {
+      synthesized core::Iterator<core::int> :sync-for-iterator = core::_GrowableList::_literal1<core::int>(1).{core::Iterable::iterator}{core::Iterator<core::int>};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
+        final core::int #t4 = :sync-for-iterator.{core::Iterator::current}{core::int};
+        {
+          invalid-expression "pkg/front_end/testcases/general/for_in.dart:305:16: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+    for (this?.numField in [1]) { // Error
+               ^";
+          core::print(this.{self::Class::numField}{core::num});
+        }
+      }
+    }
+    {
+      synthesized core::Iterator<core::int> :sync-for-iterator = core::_GrowableList::_literal1<core::int>(1).{core::Iterable::iterator}{core::Iterator<core::int>};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
+        final core::int #t5 = :sync-for-iterator.{core::Iterator::current}{core::int};
+        {
+          invalid-expression "pkg/front_end/testcases/general/for_in.dart:308:15: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+    for (this.lateField in [1]) { // Error
+              ^";
+          core::print(this.{self::Class::lateField}{core::int});
+        }
+      }
+    }
+    {
+      synthesized core::Iterator<core::int> :sync-for-iterator = core::_GrowableList::_literal1<core::int>(1).{core::Iterable::iterator}{core::Iterator<core::int>};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
+        final core::int #t6 = :sync-for-iterator.{core::Iterator::current}{core::int};
+        {
+          invalid-expression "pkg/front_end/testcases/general/for_in.dart:311:16: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+    for (this?.lateField in [1]) { // Error
+               ^";
+          core::print(this.{self::Class::lateField}{core::int});
+        }
+      }
+    }
+    {
+      synthesized core::Iterator<core::String> :sync-for-iterator = core::_GrowableList::_literal1<core::String>(invalid-expression "pkg/front_end/testcases/general/for_in.dart:314:26: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+    for (stringField in [1]) { // Error
+                         ^" in 1 as{TypeError} core::String).{core::Iterable::iterator}{core::Iterator<core::String>};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
+        final core::String #t7 = :sync-for-iterator.{core::Iterator::current}{core::String};
+        {
+          this.{self::Class::stringField} = #t7;
+          core::print(this.{self::Class::stringField}{core::String});
+        }
+      }
+    }
+    {
+      synthesized core::Iterator<core::int> :sync-for-iterator = core::_GrowableList::_literal1<core::int>(1).{core::Iterable::iterator}{core::Iterator<core::int>};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
+        final core::int #t8 = :sync-for-iterator.{core::Iterator::current}{core::int};
+        {
+          this.{self::Class::stringField} = invalid-expression "pkg/front_end/testcases/general/for_in.dart:317:22: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+    for (stringField in <int>[1]) { // Error
+                     ^" in #t8 as{TypeError} core::String;
+          core::print(this.{self::Class::stringField}{core::String});
+        }
+      }
+    }
+    {
+      synthesized core::Iterator<core::int> :sync-for-iterator = core::_GrowableList::_literal1<core::int>(1).{core::Iterable::iterator}{core::Iterator<core::int>};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
+        final core::int #t9 = :sync-for-iterator.{core::Iterator::current}{core::int};
+        {
+          invalid-expression "pkg/front_end/testcases/general/for_in.dart:320:15: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+    for (this.stringField in [1]) { // Error
+              ^";
+          core::print(this.{self::Class::stringField}{core::String});
+        }
+      }
+    }
+    {
+      synthesized core::Iterator<core::int> :sync-for-iterator = core::_GrowableList::_literal1<core::int>(1).{core::Iterable::iterator}{core::Iterator<core::int>};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
+        final core::int #t10 = :sync-for-iterator.{core::Iterator::current}{core::int};
+        {
+          invalid-expression "pkg/front_end/testcases/general/for_in.dart:323:15: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+    for (this.stringField in <int>[1]) { // Error
+              ^";
+          core::print(this.{self::Class::stringField}{core::String});
+        }
+      }
+    }
+    {
+      synthesized core::Iterator<core::int> :sync-for-iterator = core::_GrowableList::_literal1<core::int>(1).{core::Iterable::iterator}{core::Iterator<core::int>};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
+        final core::int #t11 = :sync-for-iterator.{core::Iterator::current}{core::int};
+        {
+          invalid-expression "pkg/front_end/testcases/general/for_in.dart:326:16: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+    for (this?.stringField in [1]) { // Error
+               ^";
+          core::print(this.{self::Class::stringField}{core::String});
+        }
+      }
+    }
+    {
+      synthesized core::Iterator<core::int> :sync-for-iterator = core::_GrowableList::_literal1<core::int>(1).{core::Iterable::iterator}{core::Iterator<core::int>};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
+        final core::int #t12 = :sync-for-iterator.{core::Iterator::current}{core::int};
+        {
+          invalid-expression "pkg/front_end/testcases/general/for_in.dart:329:16: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+    for (this?.stringField in <int>[1]) { // Error
+               ^";
+          core::print(this.{self::Class::stringField}{core::String});
+        }
+      }
+    }
+    {
+      synthesized core::Iterator<core::int> :sync-for-iterator = core::_GrowableList::_literal1<core::int>(1).{core::Iterable::iterator}{core::Iterator<core::int>};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
+        final core::int #t13 = :sync-for-iterator.{core::Iterator::current}{core::int};
+        {
+          invalid-expression "pkg/front_end/testcases/general/for_in.dart:332:14: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+    for (this[0] in [1]) { // Error
+             ^";
+          core::print(this.{self::Class::[]}(0){(core::int) → core::int});
+        }
+      }
+    }
+    {
+      synthesized core::Iterator<core::int> :sync-for-iterator = core::_GrowableList::_literal1<core::int>(1).{core::Iterable::iterator}{core::Iterator<core::int>};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
+        final core::int #t14 = :sync-for-iterator.{core::Iterator::current}{core::int};
+        {
+          invalid-expression "pkg/front_end/testcases/general/for_in.dart:335:15: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+    for (this?[0] in [1]) { // Error
+              ^";
+          core::print(this.{self::Class::[]}(0){(core::int) → core::int});
+        }
+      }
+    }
+    {
+      synthesized core::Iterator<dynamic> :sync-for-iterator = core::_GrowableList::_literal1<dynamic>(1).{core::Iterable::iterator}{core::Iterator<dynamic>};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
+        final dynamic #t15 = :sync-for-iterator.{core::Iterator::current}{dynamic};
+        {
+          invalid-expression "pkg/front_end/testcases/general/for_in.dart:338:10: Error: The setter 'finalField' isn't defined for the type 'Class'.
+ - 'Class' is from 'pkg/front_end/testcases/general/for_in.dart'.
+Try correcting the name to the name of an existing setter, or defining a setter or field named 'finalField'.
+    for (finalField in [1]) { // Error
+         ^^^^^^^^^^" in this.{<unresolved>}finalField = #t15;
+          core::print(this.{self::Class::finalField}{core::int});
+        }
+      }
+    }
+    {
+      synthesized core::Iterator<core::int> :sync-for-iterator = core::_GrowableList::_literal1<core::int>(1).{core::Iterable::iterator}{core::Iterator<core::int>};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
+        final core::int #t16 = :sync-for-iterator.{core::Iterator::current}{core::int};
+        {
+          invalid-expression "pkg/front_end/testcases/general/for_in.dart:341:10: Error: The setter 'finalField' isn't defined for the type 'Class'.
+ - 'Class' is from 'pkg/front_end/testcases/general/for_in.dart'.
+Try correcting the name to the name of an existing setter, or defining a setter or field named 'finalField'.
+    for (finalField in <int>[1]) { // Error
+         ^^^^^^^^^^" in this.{<unresolved>}finalField = #t16;
+          core::print(this.{self::Class::finalField}{core::int});
+        }
+      }
+    }
+    {
+      synthesized core::Iterator<core::int> :sync-for-iterator = core::_GrowableList::_literal1<core::int>(1).{core::Iterable::iterator}{core::Iterator<core::int>};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
+        final core::int #t17 = :sync-for-iterator.{core::Iterator::current}{core::int};
+        {
+          invalid-expression "pkg/front_end/testcases/general/for_in.dart:344:15: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+    for (this.finalField in [1]) { // Error
+              ^";
+          core::print(this.{self::Class::finalField}{core::int});
+        }
+      }
+    }
+    {
+      synthesized core::Iterator<core::int> :sync-for-iterator = core::_GrowableList::_literal1<core::int>(1).{core::Iterable::iterator}{core::Iterator<core::int>};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
+        final core::int #t18 = :sync-for-iterator.{core::Iterator::current}{core::int};
+        {
+          invalid-expression "pkg/front_end/testcases/general/for_in.dart:347:15: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+    for (this.finalField in <int>[1]) { // Error
+              ^";
+          core::print(this.{self::Class::finalField}{core::int});
+        }
+      }
+    }
+    {
+      synthesized core::Iterator<core::int> :sync-for-iterator = core::_GrowableList::_literal1<core::int>(1).{core::Iterable::iterator}{core::Iterator<core::int>};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
+        final core::int #t19 = :sync-for-iterator.{core::Iterator::current}{core::int};
+        {
+          invalid-expression "pkg/front_end/testcases/general/for_in.dart:350:16: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+    for (this?.finalField in [1]) { // Error
+               ^";
+          core::print(this.{self::Class::finalField}{core::int});
+        }
+      }
+    }
+    {
+      synthesized core::Iterator<core::int> :sync-for-iterator = core::_GrowableList::_literal1<core::int>(1).{core::Iterable::iterator}{core::Iterator<core::int>};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
+        final core::int #t20 = :sync-for-iterator.{core::Iterator::current}{core::int};
+        {
+          invalid-expression "pkg/front_end/testcases/general/for_in.dart:353:16: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+    for (this?.finalField in <int>[1]) { // Error
+               ^";
+          core::print(this.{self::Class::finalField}{core::int});
+        }
+      }
+    }
+    {
+      synthesized core::Iterator<core::int> :sync-for-iterator = core::_GrowableList::_literal1<core::int>(1).{core::Iterable::iterator}{core::Iterator<core::int>};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
+        final core::int #t21 = :sync-for-iterator.{core::Iterator::current}{core::int};
+        {
+          this.{self::Class::lateFinalField} = #t21;
+          core::print(this.{self::Class::lateFinalField}{core::int});
+        }
+      }
+    }
+    {
+      synthesized core::Iterator<core::int> :sync-for-iterator = core::_GrowableList::_literal1<core::int>(1).{core::Iterable::iterator}{core::Iterator<core::int>};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
+        final core::int #t22 = :sync-for-iterator.{core::Iterator::current}{core::int};
+        {
+          invalid-expression "pkg/front_end/testcases/general/for_in.dart:359:15: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+    for (this.lateFinalField in [1]) { // Error
+              ^";
+          core::print(this.{self::Class::lateFinalField}{core::int});
+        }
+      }
+    }
+    {
+      synthesized core::Iterator<core::int> :sync-for-iterator = core::_GrowableList::_literal1<core::int>(1).{core::Iterable::iterator}{core::Iterator<core::int>};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
+        final core::int #t23 = :sync-for-iterator.{core::Iterator::current}{core::int};
+        {
+          invalid-expression "pkg/front_end/testcases/general/for_in.dart:362:16: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+    for (this?.lateFinalField in [1]) { // Error
+               ^";
+          core::print(this.{self::Class::lateFinalField}{core::int});
+        }
+      }
+    }
+    {
+      synthesized core::Iterator<core::int> :sync-for-iterator = core::_GrowableList::_literal1<core::int>(1).{core::Iterable::iterator}{core::Iterator<core::int>};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
+        final core::int #t24 = :sync-for-iterator.{core::Iterator::current}{core::int};
+        {
+          invalid-expression "pkg/front_end/testcases/general/for_in.dart:365:10: Error: Setter not found: 'finalStaticField'.
+    for (finalStaticField in [1]) { // Error
+         ^^^^^^^^^^^^^^^^";
+          core::print(self::Class::finalStaticField);
+        }
+      }
+    }
+    {
+      synthesized core::Iterator<core::String> :sync-for-iterator = core::_GrowableList::_literal1<core::String>(invalid-expression "pkg/front_end/testcases/general/for_in.dart:368:32: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+    for (stringStaticField in [1]) { // Error
+                               ^" in 1 as{TypeError} core::String).{core::Iterable::iterator}{core::Iterator<core::String>};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
+        final core::String #t25 = :sync-for-iterator.{core::Iterator::current}{core::String};
+        {
+          self::Class::stringStaticField = #t25;
+          core::print(self::Class::stringStaticField);
+        }
+      }
+    }
+    {
+      synthesized core::Iterator<core::int> :sync-for-iterator = core::_GrowableList::_literal1<core::int>(1).{core::Iterable::iterator}{core::Iterator<core::int>};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
+        final core::int #t26 = :sync-for-iterator.{core::Iterator::current}{core::int};
+        {
+          self::Class::stringStaticField = invalid-expression "pkg/front_end/testcases/general/for_in.dart:371:28: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+    for (stringStaticField in <int>[1]) { // Error
+                           ^" in #t26 as{TypeError} core::String;
+          core::print(self::Class::stringStaticField);
+        }
+      }
+    }
+    {
+      synthesized core::Iterator<core::int> :sync-for-iterator = core::_GrowableList::_literal1<core::int>(1).{core::Iterable::iterator}{core::Iterator<core::int>};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
+        final core::int #t27 = :sync-for-iterator.{core::Iterator::current}{core::int};
+        {
+          self::Class::lateFinalStaticField = #t27;
+          core::print(self::Class::lateFinalStaticField);
+        }
+      }
+    }
+    {
+      synthesized core::Iterator<core::int> :sync-for-iterator = core::_GrowableList::_literal1<core::int>(1).{core::Iterable::iterator}{core::Iterator<core::int>};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
+        final core::int #t28 = :sync-for-iterator.{core::Iterator::current}{core::int};
+        {
+          invalid-expression "pkg/front_end/testcases/general/for_in.dart:377:15: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+    for (this.extensionIntProperty in [1]) { // Error
+              ^";
+          core::print(self::Extension|get#extensionIntProperty(this));
+        }
+      }
+    }
+    {
+      synthesized core::Iterator<core::int> :sync-for-iterator = core::_GrowableList::_literal1<core::int>(1).{core::Iterable::iterator}{core::Iterator<core::int>};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
+        final core::int #t29 = :sync-for-iterator.{core::Iterator::current}{core::int};
+        {
+          invalid-expression "pkg/front_end/testcases/general/for_in.dart:380:16: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+    for (this?.extensionIntProperty in [1]) { // Error
+               ^";
+          core::print(self::Extension|get#extensionIntProperty(this));
+        }
+      }
+    }
+    {
+      synthesized core::Iterator<core::int> :sync-for-iterator = core::_GrowableList::_literal1<core::int>(1).{core::Iterable::iterator}{core::Iterator<core::int>};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
+        final core::int #t30 = :sync-for-iterator.{core::Iterator::current}{core::int};
+        {
+          invalid-expression "pkg/front_end/testcases/general/for_in.dart:383:15: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+    for (this.extensionNumProperty in [1]) { // Error
+              ^";
+          core::print(self::Extension|get#extensionNumProperty(this));
+        }
+      }
+    }
+    {
+      synthesized core::Iterator<core::int> :sync-for-iterator = core::_GrowableList::_literal1<core::int>(1).{core::Iterable::iterator}{core::Iterator<core::int>};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
+        final core::int #t31 = :sync-for-iterator.{core::Iterator::current}{core::int};
+        {
+          invalid-expression "pkg/front_end/testcases/general/for_in.dart:386:16: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+    for (this?.extensionNumProperty in [1]) { // Error
+               ^";
+          core::print(self::Extension|get#extensionNumProperty(this));
+        }
+      }
+    }
+    {
+      synthesized core::Iterator<core::int> :sync-for-iterator = core::_GrowableList::_literal1<core::int>(1).{core::Iterable::iterator}{core::Iterator<core::int>};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
+        final core::int #t32 = :sync-for-iterator.{core::Iterator::current}{core::int};
+        {
+          invalid-expression "pkg/front_end/testcases/general/for_in.dart:389:26: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+    for (Extension(this).extensionIntProperty in [1]) { // Error
+                         ^";
+          core::print(self::Extension|get#extensionIntProperty(this));
+        }
+      }
+    }
+    {
+      synthesized core::Iterator<core::int> :sync-for-iterator = core::_GrowableList::_literal1<core::int>(1).{core::Iterable::iterator}{core::Iterator<core::int>};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
+        final core::int #t33 = :sync-for-iterator.{core::Iterator::current}{core::int};
+        {
+          invalid-expression "pkg/front_end/testcases/general/for_in.dart:392:27: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+    for (Extension(this)?.extensionIntProperty in [1]) { // Error
+                          ^";
+          core::print(self::Extension|get#extensionIntProperty(this));
+        }
+      }
+    }
+    {
+      synthesized core::Iterator<core::int> :sync-for-iterator = core::_GrowableList::_literal1<core::int>(1).{core::Iterable::iterator}{core::Iterator<core::int>};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
+        final core::int #t34 = :sync-for-iterator.{core::Iterator::current}{core::int};
+        {
+          invalid-expression "pkg/front_end/testcases/general/for_in.dart:395:26: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+    for (Extension(this).extensionNumProperty in [1]) { // Error
+                         ^";
+          core::print(self::Extension|get#extensionNumProperty(this));
+        }
+      }
+    }
+    {
+      synthesized core::Iterator<core::int> :sync-for-iterator = core::_GrowableList::_literal1<core::int>(1).{core::Iterable::iterator}{core::Iterator<core::int>};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
+        final core::int #t35 = :sync-for-iterator.{core::Iterator::current}{core::int};
+        {
+          invalid-expression "pkg/front_end/testcases/general/for_in.dart:398:27: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+    for (Extension(this)?.extensionNumProperty in [1]) { // Error
+                          ^";
+          core::print(self::Extension|get#extensionNumProperty(this));
+        }
+      }
+    }
+    {
+      synthesized core::Iterator<core::int> :sync-for-iterator = core::_GrowableList::_literal1<core::int>(1).{core::Iterable::iterator}{core::Iterator<core::int>};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
+        final core::int #t36 = :sync-for-iterator.{core::Iterator::current}{core::int};
+        {
+          invalid-expression "pkg/front_end/testcases/general/for_in.dart:401:26: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+    for (Extension(this).extensionStringProperty in [1]) { // Error
+                         ^";
+          core::print(self::Extension|get#extensionStringProperty(this));
+        }
+      }
+    }
+    {
+      synthesized core::Iterator<core::int> :sync-for-iterator = core::_GrowableList::_literal1<core::int>(1).{core::Iterable::iterator}{core::Iterator<core::int>};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
+        final core::int #t37 = :sync-for-iterator.{core::Iterator::current}{core::int};
+        {
+          invalid-expression "pkg/front_end/testcases/general/for_in.dart:404:27: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+    for (Extension(this)?.extensionStringProperty in [1]) { // Error
+                          ^";
+          core::print(self::Extension|get#extensionStringProperty(this));
+        }
+      }
+    }
+    {
+      synthesized core::Iterator<core::int> :sync-for-iterator = core::_GrowableList::_literal1<core::int>(1).{core::Iterable::iterator}{core::Iterator<core::int>};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
+        final core::int #t38 = :sync-for-iterator.{core::Iterator::current}{core::int};
+        {
+          invalid-expression "pkg/front_end/testcases/general/for_in.dart:407:26: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+    for (Extension(this).extensionStringProperty in <int>[1]) { // Error
+                         ^";
+          core::print(self::Extension|get#extensionStringProperty(this));
+        }
+      }
+    }
+    {
+      synthesized core::Iterator<core::int> :sync-for-iterator = core::_GrowableList::_literal1<core::int>(1).{core::Iterable::iterator}{core::Iterator<core::int>};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
+        final core::int #t39 = :sync-for-iterator.{core::Iterator::current}{core::int};
+        {
+          invalid-expression "pkg/front_end/testcases/general/for_in.dart:410:27: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+    for (Extension(this)?.extensionStringProperty in <int>[1]) { // Error
+                          ^";
+          core::print(self::Extension|get#extensionStringProperty(this));
+        }
+      }
+    }
+    {
+      synthesized core::Iterator<core::int> :sync-for-iterator = core::_GrowableList::_literal1<core::int>(1).{core::Iterable::iterator}{core::Iterator<core::int>};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
+        final core::int #t40 = :sync-for-iterator.{core::Iterator::current}{core::int};
+        {
+          invalid-expression "pkg/front_end/testcases/general/for_in.dart:413:26: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+    for (Extension(this).extensionReadOnlyProperty in [1]) { // Error
+                         ^";
+          core::print(self::Extension|get#extensionReadOnlyProperty(this));
+        }
+      }
+    }
+    {
+      synthesized core::Iterator<core::int> :sync-for-iterator = core::_GrowableList::_literal1<core::int>(1).{core::Iterable::iterator}{core::Iterator<core::int>};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
+        final core::int #t41 = :sync-for-iterator.{core::Iterator::current}{core::int};
+        {
+          invalid-expression "pkg/front_end/testcases/general/for_in.dart:416:27: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+    for (Extension(this)?.extensionReadOnlyProperty in [1]) { // Error
+                          ^";
+          core::print(self::Extension|get#extensionReadOnlyProperty(this));
+        }
+      }
+    }
+    {
+      synthesized core::Iterator<core::int> :sync-for-iterator = core::_GrowableList::_literal1<core::int>(1).{core::Iterable::iterator}{core::Iterator<core::int>};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
+        final core::int #t42 = :sync-for-iterator.{core::Iterator::current}{core::int};
+        {
+          invalid-expression "pkg/front_end/testcases/general/for_in.dart:419:11: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+    for (0[0] in [1]) { // Error
+          ^";
+          core::print(self::IndexExtension|[](0, 0));
+        }
+      }
+    }
+    {
+      synthesized core::Iterator<core::int> :sync-for-iterator = core::_GrowableList::_literal1<core::int>(1).{core::Iterable::iterator}{core::Iterator<core::int>};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
+        final core::int #t43 = :sync-for-iterator.{core::Iterator::current}{core::int};
+        {
+          invalid-expression "pkg/front_end/testcases/general/for_in.dart:422:12: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+    for (0?[0] in [1]) { // Error
+           ^";
+          core::print(let final core::int #t44 = 0 in #t44 == null ?{core::int?} null : self::IndexExtension|[](#t44, 0));
+        }
+      }
+    }
+    {
+      synthesized core::Iterator<core::int> :sync-for-iterator = core::_GrowableList::_literal1<core::int>(1).{core::Iterable::iterator}{core::Iterator<core::int>};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
+        final core::int #t45 = :sync-for-iterator.{core::Iterator::current}{core::int};
+        {
+          invalid-expression "pkg/front_end/testcases/general/for_in.dart:425:27: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+    for (IndexExtension(0)[0] in [1]) { // Error
+                          ^";
+          core::print(self::IndexExtension|[](0, 0));
+        }
+      }
+    }
+    {
+      synthesized core::Iterator<core::int> :sync-for-iterator = core::_GrowableList::_literal1<core::int>(1).{core::Iterable::iterator}{core::Iterator<core::int>};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
+        final core::int #t46 = :sync-for-iterator.{core::Iterator::current}{core::int};
+        {
+          invalid-expression "pkg/front_end/testcases/general/for_in.dart:428:28: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+    for (IndexExtension(0)?[0] in [1]) { // Error
+                           ^";
+          core::print(let final core::int #t47 = 0 in #t47 == null ?{core::int?} null : self::IndexExtension|[](#t47, 0));
+        }
+      }
+    }
+  }
+  method method() → dynamic {
+    {
+      synthesized core::Iterator<core::int> :sync-for-iterator = core::_GrowableList::_literal1<core::int>(1).{core::Iterable::iterator}{core::Iterator<core::int>};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
+        final core::int #t48 = :sync-for-iterator.{core::Iterator::current}{core::int};
+        {
+          this.{self::Class::intField} = #t48;
+          core::print(this.{self::Class::intField}{core::int});
+        }
+      }
+    }
+    {
+      synthesized core::Iterator<core::num> :sync-for-iterator = core::_GrowableList::_literal1<core::num>(1).{core::Iterable::iterator}{core::Iterator<core::num>};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
+        final core::num #t49 = :sync-for-iterator.{core::Iterator::current}{core::num};
+        {
+          this.{self::Class::numField} = #t49;
+          core::print(this.{self::Class::numField}{core::num});
+        }
+      }
+    }
+    {
+      synthesized core::Iterator<core::int> :sync-for-iterator = core::_GrowableList::_literal1<core::int>(1).{core::Iterable::iterator}{core::Iterator<core::int>};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
+        final core::int #t50 = :sync-for-iterator.{core::Iterator::current}{core::int};
+        {
+          this.{self::Class::lateField} = #t50;
+          core::print(this.{self::Class::lateField}{core::int});
+        }
+      }
+    }
+    {
+      synthesized core::Iterator<core::int> :sync-for-iterator = core::_GrowableList::_literal1<core::int>(1).{core::Iterable::iterator}{core::Iterator<core::int>};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
+        final core::int #t51 = :sync-for-iterator.{core::Iterator::current}{core::int};
+        {
+          self::Class::intStaticField = #t51;
+          core::print(self::Class::intStaticField);
+        }
+      }
+    }
+    {
+      synthesized core::Iterator<core::num> :sync-for-iterator = core::_GrowableList::_literal1<core::num>(1).{core::Iterable::iterator}{core::Iterator<core::num>};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
+        final core::num #t52 = :sync-for-iterator.{core::Iterator::current}{core::num};
+        {
+          self::Class::numStaticField = #t52;
+          core::print(self::Class::numStaticField);
+        }
+      }
+    }
+    {
+      synthesized core::Iterator<core::int> :sync-for-iterator = core::_GrowableList::_literal1<core::int>(1).{core::Iterable::iterator}{core::Iterator<core::int>};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
+        final core::int #t53 = :sync-for-iterator.{core::Iterator::current}{core::int};
+        {
+          self::Class::lateStaticField = #t53;
+          core::print(self::Class::lateStaticField);
+        }
+      }
+    }
+    {
+      synthesized core::Iterator<core::int> :sync-for-iterator = core::_GrowableList::_literal1<core::int>(1).{core::Iterable::iterator}{core::Iterator<core::int>};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
+        final core::int #t54 = :sync-for-iterator.{core::Iterator::current}{core::int};
+        {
+          self::Extension|set#extensionIntProperty(this, #t54);
+          core::print(self::Extension|get#extensionIntProperty(this));
+        }
+      }
+    }
+    {
+      synthesized core::Iterator<core::num> :sync-for-iterator = core::_GrowableList::_literal1<core::num>(1).{core::Iterable::iterator}{core::Iterator<core::num>};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
+        final core::num #t55 = :sync-for-iterator.{core::Iterator::current}{core::num};
+        {
+          self::Extension|set#extensionNumProperty(this, #t55);
+          core::print(self::Extension|get#extensionNumProperty(this));
+        }
+      }
+    }
+  }
+}
+class Subclass extends self::Class {
+  synthetic constructor •() → self::Subclass
+    : super self::Class::•()
+    ;
+  method test() → dynamic {
+    {
+      synthesized core::Iterator<core::int> :sync-for-iterator = core::_GrowableList::_literal1<core::int>(1).{core::Iterable::iterator}{core::Iterator<core::int>};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
+        final core::int #t56 = :sync-for-iterator.{core::Iterator::current}{core::int};
+        {
+          invalid-expression "pkg/front_end/testcases/general/for_in.dart:463:16: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+    for (super.stringField in [1]) { // Error
+               ^";
+          core::print(super.{self::Class::stringField});
+        }
+      }
+    }
+    {
+      synthesized core::Iterator<core::int> :sync-for-iterator = core::_GrowableList::_literal1<core::int>(1).{core::Iterable::iterator}{core::Iterator<core::int>};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
+        final core::int #t57 = :sync-for-iterator.{core::Iterator::current}{core::int};
+        {
+          invalid-expression "pkg/front_end/testcases/general/for_in.dart:466:16: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+    for (super.stringField in <int>[1]) { // Error
+               ^";
+          core::print(super.{self::Class::stringField});
+        }
+      }
+    }
+    {
+      synthesized core::Iterator<core::int> :sync-for-iterator = core::_GrowableList::_literal1<core::int>(1).{core::Iterable::iterator}{core::Iterator<core::int>};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
+        final core::int #t58 = :sync-for-iterator.{core::Iterator::current}{core::int};
+        {
+          invalid-expression "pkg/front_end/testcases/general/for_in.dart:469:16: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+    for (super.intField in [1]) { // Error
+               ^";
+          core::print(super.{self::Class::intField});
+        }
+      }
+    }
+    {
+      synthesized core::Iterator<core::int> :sync-for-iterator = core::_GrowableList::_literal1<core::int>(1).{core::Iterable::iterator}{core::Iterator<core::int>};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
+        final core::int #t59 = :sync-for-iterator.{core::Iterator::current}{core::int};
+        {
+          invalid-expression "pkg/front_end/testcases/general/for_in.dart:472:16: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+    for (super.numField in [1]) { // Error
+               ^";
+          core::print(super.{self::Class::numField});
+        }
+      }
+    }
+    {
+      synthesized core::Iterator<core::int> :sync-for-iterator = core::_GrowableList::_literal1<core::int>(1).{core::Iterable::iterator}{core::Iterator<core::int>};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
+        final core::int #t60 = :sync-for-iterator.{core::Iterator::current}{core::int};
+        {
+          invalid-expression "pkg/front_end/testcases/general/for_in.dart:475:16: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+    for (super.lateField in [1]) { // Error
+               ^";
+          core::print(super.{self::Class::lateField});
+        }
+      }
+    }
+    {
+      synthesized core::Iterator<core::int> :sync-for-iterator = core::_GrowableList::_literal1<core::int>(1).{core::Iterable::iterator}{core::Iterator<core::int>};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
+        final core::int #t61 = :sync-for-iterator.{core::Iterator::current}{core::int};
+        {
+          invalid-expression "pkg/front_end/testcases/general/for_in.dart:478:15: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+    for (super[0] in [1]) { // Error
+              ^";
+          core::print(super.{self::Class::[]}(0));
+        }
+      }
+    }
+    {
+      synthesized core::Iterator<core::int> :sync-for-iterator = core::_GrowableList::_literal1<core::int>(1).{core::Iterable::iterator}{core::Iterator<core::int>};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
+        final core::int #t62 = :sync-for-iterator.{core::Iterator::current}{core::int};
+        {
+          invalid-expression "pkg/front_end/testcases/general/for_in.dart:481:16: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+    for (super?[0] in [1]) { // Error
+               ^";
+          core::print(super.{self::Class::[]}(0));
+        }
+      }
+    }
+  }
+}
+extension Extension on self::Class {
+  get extensionIntProperty = self::Extension|get#extensionIntProperty;
+  set extensionIntProperty = self::Extension|set#extensionIntProperty;
+  get extensionNumProperty = self::Extension|get#extensionNumProperty;
+  set extensionNumProperty = self::Extension|set#extensionNumProperty;
+  get extensionStringProperty = self::Extension|get#extensionStringProperty;
+  set extensionStringProperty = self::Extension|set#extensionStringProperty;
+  get extensionReadOnlyProperty = self::Extension|get#extensionReadOnlyProperty;
+  static field intStaticField = self::Extension|intStaticField;
+  static field numStaticField = self::Extension|numStaticField;
+  static field stringStaticField = self::Extension|stringStaticField;
+  static field finalStaticField = self::Extension|finalStaticField;
+  static field lateStaticField = self::Extension|lateStaticField;
+  static field lateFinalStaticField = self::Extension|lateFinalStaticField;
+  method test = self::Extension|test;
+  method tearoff test = self::Extension|get#test;
+  method extensionMethod = self::Extension|extensionMethod;
+  method tearoff extensionMethod = self::Extension|get#extensionMethod;
+}
+extension IndexExtension on core::int {
+  operator []= = self::IndexExtension|[]=;
+  operator [] = self::IndexExtension|[];
+  method extensionMethod = self::IndexExtension|extensionMethod;
+  method tearoff extensionMethod = self::IndexExtension|get#extensionMethod;
+}
+static field core::int intTopLevel = 0;
+static final field core::int finalTopLevel = 0;
+static const field core::int constTopLevel = #C1;
+late static field core::int lateTopLevel;
+late static final [setter] field core::int lateFinalTopLevel;
+static field core::num numTopLevel = 0;
+static field core::String stringTopLevel = "";
+static field core::int Extension|intStaticField = 0;
+static field core::num Extension|numStaticField = 0;
+static field core::String Extension|stringStaticField = "";
+static final field core::int Extension|finalStaticField = 0;
+late static field core::int Extension|lateStaticField;
+late static final [setter] field core::int Extension|lateFinalStaticField;
+static method test() → dynamic {
+  {
+    invalid-expression "pkg/front_end/testcases/general/for_in.dart:16:14: Error: A for-in loop-variable can't be 'const'.
+Try removing the 'const' modifier.
+  for (const constLocal in [1]) { // Error
+             ^^^^^^^^^^";
+    {
+      synthesized core::Iterator<core::int> :sync-for-iterator = core::_GrowableList::_literal1<core::int>(1).{core::Iterable::iterator}{core::Iterator<core::int>};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
+        core::int constLocal = :sync-for-iterator.{core::Iterator::current}{core::int};
+        {
+          core::print(constLocal);
+        }
+      }
+    }
+  }
+  {
+    synthesized core::Iterator<core::int> :sync-for-iterator = core::_GrowableList::_literal1<core::int>(1).{core::Iterable::iterator}{core::Iterator<core::int>};
+    for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
+      core::int lateLocal = :sync-for-iterator.{core::Iterator::current}{core::int};
+      {
+        core::print(lateLocal);
+      }
+    }
+  }
+  {
+    synthesized core::Iterator<core::String> :sync-for-iterator = core::_GrowableList::_literal1<core::String>(invalid-expression "pkg/front_end/testcases/general/for_in.dart:22:31: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+  for (String stringLocal in [1]) { // Error
+                              ^" in 1 as{TypeError} core::String).{core::Iterable::iterator}{core::Iterator<core::String>};
+    for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
+      core::String stringLocal = :sync-for-iterator.{core::Iterator::current}{core::String};
+      {
+        core::print(stringLocal);
+      }
+    }
+  }
+  {
+    synthesized core::Iterator<core::int> :sync-for-iterator = core::_GrowableList::_literal1<core::int>(1).{core::Iterable::iterator}{core::Iterator<core::int>};
+    for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
+      final core::int #t63 = :sync-for-iterator.{core::Iterator::current}{core::int};
+      {
+        core::String stringLocal = invalid-expression "pkg/front_end/testcases/general/for_in.dart:25:15: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+Try changing the type of the variable.
+  for (String stringLocal in <int>[1]) { // Error
+              ^" in #t63 as{TypeError} core::String;
+        core::print(stringLocal);
+      }
+    }
+  }
+  core::print( block {
+    final core::List<core::int> #t64 = core::_GrowableList::•<core::int>(0);
+    {
+      invalid-expression "pkg/front_end/testcases/general/for_in.dart:29:16: Error: A for-in loop-variable can't be 'const'.
+Try removing the 'const' modifier.
+    for (const constLocal in [1]) constLocal // Error
+               ^^^^^^^^^^";
+      {
+        synthesized core::Iterator<core::int> :sync-for-iterator = core::_GrowableList::_literal1<core::int>(1).{core::Iterable::iterator}{core::Iterator<core::int>};
+        for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
+          core::int constLocal = :sync-for-iterator.{core::Iterator::current}{core::int};
+          #t64.{core::List::add}{Invariant}(constLocal){(core::int) → void};
+        }
+      }
+    }
+  } =>#t64);
+  core::print( block {
+    final core::List<core::int> #t65 = core::_GrowableList::•<core::int>(0);
+    {
+      synthesized core::Iterator<core::int> :sync-for-iterator = core::_GrowableList::_literal1<core::int>(1).{core::Iterable::iterator}{core::Iterator<core::int>};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
+        core::int lateLocal = :sync-for-iterator.{core::Iterator::current}{core::int};
+        #t65.{core::List::add}{Invariant}(lateLocal){(core::int) → void};
+      }
+    }
+  } =>#t65);
+  core::print( block {
+    final core::List<core::String> #t66 = core::_GrowableList::•<core::String>(0);
+    {
+      synthesized core::Iterator<core::String> :sync-for-iterator = core::_GrowableList::_literal1<core::String>(invalid-expression "pkg/front_end/testcases/general/for_in.dart:35:33: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+    for (String stringLocal in [1]) stringLocal // Error
+                                ^" in 1 as{TypeError} core::String).{core::Iterable::iterator}{core::Iterator<core::String>};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
+        core::String stringLocal = :sync-for-iterator.{core::Iterator::current}{core::String};
+        #t66.{core::List::add}{Invariant}(stringLocal){(core::String) → void};
+      }
+    }
+  } =>#t66);
+  core::print( block {
+    final core::List<core::String> #t67 = core::_GrowableList::•<core::String>(0);
+    {
+      synthesized core::Iterator<core::int> :sync-for-iterator = core::_GrowableList::_literal1<core::int>(1).{core::Iterable::iterator}{core::Iterator<core::int>};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
+        final core::int #t68 = :sync-for-iterator.{core::Iterator::current}{core::int};
+        {
+          core::String stringLocal = invalid-expression "pkg/front_end/testcases/general/for_in.dart:38:17: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+Try changing the type of the variable.
+    for (String stringLocal in <int>[1]) stringLocal // Error
+                ^" in #t68 as{TypeError} core::String;
+          #t67.{core::List::add}{Invariant}(stringLocal){(core::String) → void};
+        }
+      }
+    }
+  } =>#t67);
+  core::print( block {
+    final core::Map<core::int, core::int> #t69 = <core::int, core::int>{};
+    {
+      invalid-expression "pkg/front_end/testcases/general/for_in.dart:41:16: Error: A for-in loop-variable can't be 'const'.
+Try removing the 'const' modifier.
+    for (const constLocal in [1]) 0: constLocal // Error
+               ^^^^^^^^^^";
+      {
+        synthesized core::Iterator<core::int> :sync-for-iterator = core::_GrowableList::_literal1<core::int>(1).{core::Iterable::iterator}{core::Iterator<core::int>};
+        for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
+          core::int constLocal = :sync-for-iterator.{core::Iterator::current}{core::int};
+          #t69.{core::Map::[]=}{Invariant}(0, constLocal){(core::int, core::int) → void};
+        }
+      }
+    }
+  } =>#t69);
+  core::print( block {
+    final core::Map<core::int, core::int> #t70 = <core::int, core::int>{};
+    {
+      synthesized core::Iterator<core::int> :sync-for-iterator = core::_GrowableList::_literal1<core::int>(1).{core::Iterable::iterator}{core::Iterator<core::int>};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
+        core::int lateLocal = :sync-for-iterator.{core::Iterator::current}{core::int};
+        #t70.{core::Map::[]=}{Invariant}(0, lateLocal){(core::int, core::int) → void};
+      }
+    }
+  } =>#t70);
+  core::print( block {
+    final core::Map<core::int, core::String> #t71 = <core::int, core::String>{};
+    {
+      synthesized core::Iterator<core::String> :sync-for-iterator = core::_GrowableList::_literal1<core::String>(invalid-expression "pkg/front_end/testcases/general/for_in.dart:47:33: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+    for (String stringLocal in [1]) 0: stringLocal // Error
+                                ^" in 1 as{TypeError} core::String).{core::Iterable::iterator}{core::Iterator<core::String>};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
+        core::String stringLocal = :sync-for-iterator.{core::Iterator::current}{core::String};
+        #t71.{core::Map::[]=}{Invariant}(0, stringLocal){(core::int, core::String) → void};
+      }
+    }
+  } =>#t71);
+  core::print( block {
+    final core::Map<core::int, core::String> #t72 = <core::int, core::String>{};
+    {
+      synthesized core::Iterator<core::int> :sync-for-iterator = core::_GrowableList::_literal1<core::int>(1).{core::Iterable::iterator}{core::Iterator<core::int>};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
+        final core::int #t73 = :sync-for-iterator.{core::Iterator::current}{core::int};
+        {
+          core::String stringLocal = invalid-expression "pkg/front_end/testcases/general/for_in.dart:50:17: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+Try changing the type of the variable.
+    for (String stringLocal in <int>[1]) 0: stringLocal // Error
+                ^" in #t73 as{TypeError} core::String;
+          #t72.{core::Map::[]=}{Invariant}(0, stringLocal){(core::int, core::String) → void};
+        }
+      }
+    }
+  } =>#t72);
+  {
+    invalid-expression "pkg/front_end/testcases/general/for_in.dart:52:8: Error: A for-in loop can't have more than one loop variable.
+  for (int? multiLocal1, multiLocal2 in [1]) { // Error
+       ^^^";
+    {
+      synthesized core::Iterator<core::int> :sync-for-iterator = core::_GrowableList::_literal1<core::int>(1).{core::Iterable::iterator}{core::Iterator<core::int>};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
+        final core::int #t74 = :sync-for-iterator.{core::Iterator::current}{core::int};
+        {
+          core::int? multiLocal1;
+          core::int? multiLocal2;
+          core::print(multiLocal1);
+          core::print(multiLocal2);
+        }
+      }
+    }
+  }
+  {
+    invalid-expression "pkg/front_end/testcases/general/for_in.dart:56:8: Error: A for-in loop can't have more than one loop variable.
+  for (var varMultiLocal1, varMultiLocal2 in [1]) { // Error
+       ^^^";
+    {
+      synthesized core::Iterator<core::int> :sync-for-iterator = core::_GrowableList::_literal1<core::int>(1).{core::Iterable::iterator}{core::Iterator<core::int>};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
+        final core::int #t75 = :sync-for-iterator.{core::Iterator::current}{core::int};
+        {
+          dynamic varMultiLocal1;
+          dynamic varMultiLocal2;
+          core::print(varMultiLocal1);
+          core::print(varMultiLocal2);
+        }
+      }
+    }
+  }
+  {
+    invalid-expression "pkg/front_end/testcases/general/for_in.dart:60:8: Error: A for-in loop can't have more than one loop variable.
+  for (num numMultiLocal1, numMultiLocal2 in [1]) { // Error
+       ^^^";
+    {
+      synthesized core::Iterator<core::int> :sync-for-iterator = core::_GrowableList::_literal1<core::int>(1).{core::Iterable::iterator}{core::Iterator<core::int>};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
+        final core::int #t76 = :sync-for-iterator.{core::Iterator::current}{core::int};
+        {
+          core::num numMultiLocal1;
+          core::num numMultiLocal2;
+          core::print(invalid-expression "pkg/front_end/testcases/general/for_in.dart:61:11: Error: Non-nullable variable 'numMultiLocal1' must be assigned before it can be used.
+    print(numMultiLocal1);
+          ^^^^^^^^^^^^^^" in numMultiLocal1);
+          core::print(invalid-expression "pkg/front_end/testcases/general/for_in.dart:62:11: Error: Non-nullable variable 'numMultiLocal2' must be assigned before it can be used.
+    print(numMultiLocal2);
+          ^^^^^^^^^^^^^^" in numMultiLocal2);
+        }
+      }
+    }
+  }
+  {
+    invalid-expression "pkg/front_end/testcases/general/for_in.dart:64:8: Error: Can't assign to this, so it can't be used in a for-in loop.
+  for (1 in [1]) { // Error
+       ^";
+    {
+      synthesized core::Iterator<core::int> :sync-for-iterator = core::_GrowableList::_literal1<core::int>(1).{core::Iterable::iterator}{core::Iterator<core::int>};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
+        final core::int #t77 = :sync-for-iterator.{core::Iterator::current}{core::int};
+        {
+          1;
+        }
+      }
+    }
+  }
+  {
+    invalid-expression "pkg/front_end/testcases/general/for_in.dart:67:8: Error: Can't assign to this, so it can't be used in a for-in loop.
+  for (main() in [1]) { // Error
+       ^^^^";
+    {
+      synthesized core::Iterator<core::int> :sync-for-iterator = core::_GrowableList::_literal1<core::int>(1).{core::Iterable::iterator}{core::Iterator<core::int>};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
+        final core::int #t78 = :sync-for-iterator.{core::Iterator::current}{core::int};
+        {
+          self::main();
+        }
+      }
+    }
+  }
+  final core::int existingFinalLocal;
+  {
+    synthesized core::Iterator<core::int> :sync-for-iterator = core::_GrowableList::_literal1<core::int>(1).{core::Iterable::iterator}{core::Iterator<core::int>};
+    for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
+      final core::int #t79 = :sync-for-iterator.{core::Iterator::current}{core::int};
+      {
+        invalid-expression "pkg/front_end/testcases/general/for_in.dart:71:8: Error: Can't assign to the final variable 'existingFinalLocal'.
+  for (existingFinalLocal in [1]) { // Error
+       ^^^^^^^^^^^^^^^^^^";
+        core::print(invalid-expression "pkg/front_end/testcases/general/for_in.dart:72:11: Error: Final variable 'existingFinalLocal' must be assigned before it can be used.
+    print(existingFinalLocal);
+          ^^^^^^^^^^^^^^^^^^" in existingFinalLocal);
+      }
+    }
+  }
+  core::String existingStringLocal;
+  {
+    synthesized core::Iterator<core::String> :sync-for-iterator = core::_GrowableList::_literal1<core::String>(invalid-expression "pkg/front_end/testcases/general/for_in.dart:75:32: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+  for (existingStringLocal in [1]) { // Error
+                               ^" in 1 as{TypeError} core::String).{core::Iterable::iterator}{core::Iterator<core::String>};
+    for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
+      final core::String #t80 = :sync-for-iterator.{core::Iterator::current}{core::String};
+      {
+        existingStringLocal = #t80;
+        core::print(existingStringLocal);
+      }
+    }
+  }
+  {
+    synthesized core::Iterator<core::int> :sync-for-iterator = core::_GrowableList::_literal1<core::int>(1).{core::Iterable::iterator}{core::Iterator<core::int>};
+    for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
+      final core::int #t81 = :sync-for-iterator.{core::Iterator::current}{core::int};
+      {
+        existingStringLocal = invalid-expression "pkg/front_end/testcases/general/for_in.dart:78:28: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+  for (existingStringLocal in <int>[1]) { // Error
+                           ^" in #t81 as{TypeError} core::String;
+        core::print(existingStringLocal);
+      }
+    }
+  }
+  self::Class c = new self::Class::•();
+  {
+    synthesized core::Iterator<core::int> :sync-for-iterator = core::_GrowableList::_literal1<core::int>(1).{core::Iterable::iterator}{core::Iterator<core::int>};
+    for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
+      final core::int #t82 = :sync-for-iterator.{core::Iterator::current}{core::int};
+      {
+        invalid-expression "pkg/front_end/testcases/general/for_in.dart:82:10: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+  for (c.intField in [1]) { // Error
+         ^";
+        core::print(c.{self::Class::intField}{core::int});
+      }
+    }
+  }
+  {
+    synthesized core::Iterator<core::int> :sync-for-iterator = core::_GrowableList::_literal1<core::int>(1).{core::Iterable::iterator}{core::Iterator<core::int>};
+    for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
+      final core::int #t83 = :sync-for-iterator.{core::Iterator::current}{core::int};
+      {
+        invalid-expression "pkg/front_end/testcases/general/for_in.dart:85:10: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+  for (c.numField in [1]) { // Error
+         ^";
+        core::print(c.{self::Class::numField}{core::num});
+      }
+    }
+  }
+  {
+    synthesized core::Iterator<core::int> :sync-for-iterator = core::_GrowableList::_literal1<core::int>(1).{core::Iterable::iterator}{core::Iterator<core::int>};
+    for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
+      final core::int #t84 = :sync-for-iterator.{core::Iterator::current}{core::int};
+      {
+        invalid-expression "pkg/front_end/testcases/general/for_in.dart:88:10: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+  for (c.lateField in [1]) { // Error
+         ^";
+        core::print(c.{self::Class::lateField}{core::int});
+      }
+    }
+  }
+  {
+    synthesized core::Iterator<core::int> :sync-for-iterator = core::_GrowableList::_literal1<core::int>(1).{core::Iterable::iterator}{core::Iterator<core::int>};
+    for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
+      final core::int #t85 = :sync-for-iterator.{core::Iterator::current}{core::int};
+      {
+        invalid-expression "pkg/front_end/testcases/general/for_in.dart:91:11: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+  for (c?.intField in [1]) { // Error
+          ^";
+        core::print(let final self::Class #t86 = c in #t86 == null ?{core::int?} null : #t86.{self::Class::intField}{core::int});
+      }
+    }
+  }
+  {
+    synthesized core::Iterator<core::int> :sync-for-iterator = core::_GrowableList::_literal1<core::int>(1).{core::Iterable::iterator}{core::Iterator<core::int>};
+    for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
+      final core::int #t87 = :sync-for-iterator.{core::Iterator::current}{core::int};
+      {
+        invalid-expression "pkg/front_end/testcases/general/for_in.dart:94:11: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+  for (c?.numField in [1]) { // Error
+          ^";
+        core::print(let final self::Class #t88 = c in #t88 == null ?{core::num?} null : #t88.{self::Class::numField}{core::num});
+      }
+    }
+  }
+  {
+    synthesized core::Iterator<core::int> :sync-for-iterator = core::_GrowableList::_literal1<core::int>(1).{core::Iterable::iterator}{core::Iterator<core::int>};
+    for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
+      final core::int #t89 = :sync-for-iterator.{core::Iterator::current}{core::int};
+      {
+        invalid-expression "pkg/front_end/testcases/general/for_in.dart:97:11: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+  for (c?.lateField in [1]) { // Error
+          ^";
+        core::print(let final self::Class #t90 = c in #t90 == null ?{core::int?} null : #t90.{self::Class::lateField}{core::int});
+      }
+    }
+  }
+  {
+    synthesized core::Iterator<core::int> :sync-for-iterator = core::_GrowableList::_literal1<core::int>(1).{core::Iterable::iterator}{core::Iterator<core::int>};
+    for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
+      final core::int #t91 = :sync-for-iterator.{core::Iterator::current}{core::int};
+      {
+        invalid-expression "pkg/front_end/testcases/general/for_in.dart:100:10: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+  for (c.stringField in [1]) { // Error
+         ^";
+        core::print(c.{self::Class::stringField}{core::String});
+      }
+    }
+  }
+  {
+    synthesized core::Iterator<core::int> :sync-for-iterator = core::_GrowableList::_literal1<core::int>(1).{core::Iterable::iterator}{core::Iterator<core::int>};
+    for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
+      final core::int #t92 = :sync-for-iterator.{core::Iterator::current}{core::int};
+      {
+        invalid-expression "pkg/front_end/testcases/general/for_in.dart:103:10: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+  for (c.stringField in <int>[1]) { // Error
+         ^";
+        core::print(c.{self::Class::stringField}{core::String});
+      }
+    }
+  }
+  {
+    synthesized core::Iterator<core::int> :sync-for-iterator = core::_GrowableList::_literal1<core::int>(1).{core::Iterable::iterator}{core::Iterator<core::int>};
+    for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
+      final core::int #t93 = :sync-for-iterator.{core::Iterator::current}{core::int};
+      {
+        invalid-expression "pkg/front_end/testcases/general/for_in.dart:106:11: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+  for (c?.stringField in [1]) { // Error
+          ^";
+        core::print(let final self::Class #t94 = c in #t94 == null ?{core::String?} null : #t94.{self::Class::stringField}{core::String});
+      }
+    }
+  }
+  {
+    synthesized core::Iterator<core::int> :sync-for-iterator = core::_GrowableList::_literal1<core::int>(1).{core::Iterable::iterator}{core::Iterator<core::int>};
+    for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
+      final core::int #t95 = :sync-for-iterator.{core::Iterator::current}{core::int};
+      {
+        invalid-expression "pkg/front_end/testcases/general/for_in.dart:109:11: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+  for (c?.stringField in <int>[1]) { // Error
+          ^";
+        core::print(let final self::Class #t96 = c in #t96 == null ?{core::String?} null : #t96.{self::Class::stringField}{core::String});
+      }
+    }
+  }
+  {
+    synthesized core::Iterator<core::int> :sync-for-iterator = core::_GrowableList::_literal1<core::int>(1).{core::Iterable::iterator}{core::Iterator<core::int>};
+    for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
+      final core::int #t97 = :sync-for-iterator.{core::Iterator::current}{core::int};
+      {
+        invalid-expression "pkg/front_end/testcases/general/for_in.dart:112:10: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+  for (c.finalField in [1]) { // Error
+         ^";
+        core::print(c.{self::Class::finalField}{core::int});
+      }
+    }
+  }
+  {
+    synthesized core::Iterator<core::int> :sync-for-iterator = core::_GrowableList::_literal1<core::int>(1).{core::Iterable::iterator}{core::Iterator<core::int>};
+    for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
+      final core::int #t98 = :sync-for-iterator.{core::Iterator::current}{core::int};
+      {
+        invalid-expression "pkg/front_end/testcases/general/for_in.dart:115:11: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+  for (c?.finalField in [1]) { // Error
+          ^";
+        core::print(let final self::Class #t99 = c in #t99 == null ?{core::int?} null : #t99.{self::Class::finalField}{core::int});
+      }
+    }
+  }
+  {
+    synthesized core::Iterator<core::int> :sync-for-iterator = core::_GrowableList::_literal1<core::int>(1).{core::Iterable::iterator}{core::Iterator<core::int>};
+    for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
+      final core::int #t100 = :sync-for-iterator.{core::Iterator::current}{core::int};
+      {
+        invalid-expression "pkg/front_end/testcases/general/for_in.dart:118:10: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+  for (c.lateFinalField in [1]) { // Error
+         ^";
+        core::print(c.{self::Class::lateFinalField}{core::int});
+      }
+    }
+  }
+  {
+    synthesized core::Iterator<core::int> :sync-for-iterator = core::_GrowableList::_literal1<core::int>(1).{core::Iterable::iterator}{core::Iterator<core::int>};
+    for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
+      final core::int #t101 = :sync-for-iterator.{core::Iterator::current}{core::int};
+      {
+        invalid-expression "pkg/front_end/testcases/general/for_in.dart:121:11: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+  for (c?.lateFinalField in [1]) { // Error
+          ^";
+        core::print(let final self::Class #t102 = c in #t102 == null ?{core::int?} null : #t102.{self::Class::lateFinalField}{core::int});
+      }
+    }
+  }
+  {
+    synthesized core::Iterator<core::int> :sync-for-iterator = core::_GrowableList::_literal1<core::int>(1).{core::Iterable::iterator}{core::Iterator<core::int>};
+    for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
+      final core::int #t103 = :sync-for-iterator.{core::Iterator::current}{core::int};
+      {
+        invalid-expression "pkg/front_end/testcases/general/for_in.dart:124:9: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+  for (c[0] in [1]) { // Error
+        ^";
+        core::print(c.{self::Class::[]}(0){(core::int) → core::int});
+      }
+    }
+  }
+  {
+    synthesized core::Iterator<core::int> :sync-for-iterator = core::_GrowableList::_literal1<core::int>(1).{core::Iterable::iterator}{core::Iterator<core::int>};
+    for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
+      final core::int #t104 = :sync-for-iterator.{core::Iterator::current}{core::int};
+      {
+        invalid-expression "pkg/front_end/testcases/general/for_in.dart:127:10: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+  for (c?[0] in [1]) { // Error
+         ^";
+        core::print(c.{self::Class::[]}(0){(core::int) → core::int});
+      }
+    }
+  }
+  {
+    synthesized core::Iterator<core::int> :sync-for-iterator = core::_GrowableList::_literal1<core::int>(1).{core::Iterable::iterator}{core::Iterator<core::int>};
+    for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
+      final core::int #t105 = :sync-for-iterator.{core::Iterator::current}{core::int};
+      {
+        invalid-expression "pkg/front_end/testcases/general/for_in.dart:130:8: Error: Setter not found: 'finalTopLevel'.
+  for (finalTopLevel in [1]) { // Error
+       ^^^^^^^^^^^^^";
+        core::print(self::finalTopLevel);
+      }
+    }
+  }
+  {
+    synthesized core::Iterator<core::int> :sync-for-iterator = core::_GrowableList::_literal1<core::int>(1).{core::Iterable::iterator}{core::Iterator<core::int>};
+    for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
+      final core::int #t106 = :sync-for-iterator.{core::Iterator::current}{core::int};
+      {
+        invalid-expression "pkg/front_end/testcases/general/for_in.dart:133:8: Error: Setter not found: 'constTopLevel'.
+  for (constTopLevel in [1]) { // Error
+       ^^^^^^^^^^^^^";
+        core::print(#C1);
+      }
+    }
+  }
+  {
+    synthesized core::Iterator<core::String> :sync-for-iterator = core::_GrowableList::_literal1<core::String>(invalid-expression "pkg/front_end/testcases/general/for_in.dart:136:27: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+  for (stringTopLevel in [1]) { // Error
+                          ^" in 1 as{TypeError} core::String).{core::Iterable::iterator}{core::Iterator<core::String>};
+    for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
+      final core::String #t107 = :sync-for-iterator.{core::Iterator::current}{core::String};
+      {
+        self::stringTopLevel = #t107;
+        core::print(self::stringTopLevel);
+      }
+    }
+  }
+  {
+    synthesized core::Iterator<core::int> :sync-for-iterator = core::_GrowableList::_literal1<core::int>(1).{core::Iterable::iterator}{core::Iterator<core::int>};
+    for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
+      final core::int #t108 = :sync-for-iterator.{core::Iterator::current}{core::int};
+      {
+        self::stringTopLevel = invalid-expression "pkg/front_end/testcases/general/for_in.dart:139:23: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+  for (stringTopLevel in <int>[1]) { // Error
+                      ^" in #t108 as{TypeError} core::String;
+        core::print(self::stringTopLevel);
+      }
+    }
+  }
+  {
+    synthesized core::Iterator<core::int> :sync-for-iterator = core::_GrowableList::_literal1<core::int>(1).{core::Iterable::iterator}{core::Iterator<core::int>};
+    for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
+      final core::int #t109 = :sync-for-iterator.{core::Iterator::current}{core::int};
+      {
+        invalid-expression "pkg/front_end/testcases/general/for_in.dart:142:14: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+  for (defer.intTopLevel in [1]) { // Error
+             ^";
+        core::print(let final dynamic #t110 = CheckLibraryIsLoaded(defer) in self::intTopLevel);
+      }
+    }
+  }
+  {
+    synthesized core::Iterator<core::int> :sync-for-iterator = core::_GrowableList::_literal1<core::int>(1).{core::Iterable::iterator}{core::Iterator<core::int>};
+    for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
+      final core::int #t111 = :sync-for-iterator.{core::Iterator::current}{core::int};
+      {
+        invalid-expression "pkg/front_end/testcases/general/for_in.dart:145:14: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+  for (defer.numTopLevel in [1]) { // Error
+             ^";
+        core::print(let final dynamic #t112 = CheckLibraryIsLoaded(defer) in self::numTopLevel);
+      }
+    }
+  }
+  {
+    synthesized core::Iterator<core::int> :sync-for-iterator = core::_GrowableList::_literal1<core::int>(1).{core::Iterable::iterator}{core::Iterator<core::int>};
+    for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
+      final core::int #t113 = :sync-for-iterator.{core::Iterator::current}{core::int};
+      {
+        invalid-expression "pkg/front_end/testcases/general/for_in.dart:148:14: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+  for (defer.lateTopLevel in [1]) { // Error
+             ^";
+        core::print(let final dynamic #t114 = CheckLibraryIsLoaded(defer) in self::lateTopLevel);
+      }
+    }
+  }
+  {
+    synthesized core::Iterator<core::int> :sync-for-iterator = core::_GrowableList::_literal1<core::int>(1).{core::Iterable::iterator}{core::Iterator<core::int>};
+    for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
+      final core::int #t115 = :sync-for-iterator.{core::Iterator::current}{core::int};
+      {
+        invalid-expression "pkg/front_end/testcases/general/for_in.dart:151:14: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+  for (defer.lateFinalTopLevel in [1]) { // Error
+             ^";
+        core::print(let final dynamic #t116 = CheckLibraryIsLoaded(defer) in self::lateFinalTopLevel);
+      }
+    }
+  }
+  {
+    synthesized core::Iterator<core::int> :sync-for-iterator = core::_GrowableList::_literal1<core::int>(1).{core::Iterable::iterator}{core::Iterator<core::int>};
+    for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
+      final core::int #t117 = :sync-for-iterator.{core::Iterator::current}{core::int};
+      {
+        invalid-expression "pkg/front_end/testcases/general/for_in.dart:154:14: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+  for (defer.finalTopLevel in [1]) { // Error
+             ^";
+        core::print(let final dynamic #t118 = CheckLibraryIsLoaded(defer) in self::finalTopLevel);
+      }
+    }
+  }
+  {
+    synthesized core::Iterator<core::int> :sync-for-iterator = core::_GrowableList::_literal1<core::int>(1).{core::Iterable::iterator}{core::Iterator<core::int>};
+    for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
+      final core::int #t119 = :sync-for-iterator.{core::Iterator::current}{core::int};
+      {
+        invalid-expression "pkg/front_end/testcases/general/for_in.dart:157:14: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+  for (defer.constTopLevel in [1]) { // Error
+             ^";
+        core::print(let final dynamic #t120 = CheckLibraryIsLoaded(defer) in #C1);
+      }
+    }
+  }
+  {
+    synthesized core::Iterator<core::int> :sync-for-iterator = core::_GrowableList::_literal1<core::int>(1).{core::Iterable::iterator}{core::Iterator<core::int>};
+    for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
+      final core::int #t121 = :sync-for-iterator.{core::Iterator::current}{core::int};
+      {
+        invalid-expression "pkg/front_end/testcases/general/for_in.dart:160:14: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+  for (defer.stringTopLevel in [1]) { // Error
+             ^";
+        core::print(let final dynamic #t122 = CheckLibraryIsLoaded(defer) in self::stringTopLevel);
+      }
+    }
+  }
+  {
+    synthesized core::Iterator<core::int> :sync-for-iterator = core::_GrowableList::_literal1<core::int>(1).{core::Iterable::iterator}{core::Iterator<core::int>};
+    for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
+      final core::int #t123 = :sync-for-iterator.{core::Iterator::current}{core::int};
+      {
+        invalid-expression "pkg/front_end/testcases/general/for_in.dart:163:14: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+  for (defer.stringTopLevel in <int>[1]) { // Error
+             ^";
+        core::print(let final dynamic #t124 = CheckLibraryIsLoaded(defer) in self::stringTopLevel);
+      }
+    }
+  }
+  {
+    synthesized core::Iterator<core::int> :sync-for-iterator = core::_GrowableList::_literal1<core::int>(1).{core::Iterable::iterator}{core::Iterator<core::int>};
+    for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
+      final core::int #t125 = :sync-for-iterator.{core::Iterator::current}{core::int};
+      {
+        invalid-expression "pkg/front_end/testcases/general/for_in.dart:166:14: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+  for (Class.stringStaticField in [1]) { // Error
+             ^";
+        core::print(self::Class::stringStaticField);
+      }
+    }
+  }
+  {
+    synthesized core::Iterator<core::int> :sync-for-iterator = core::_GrowableList::_literal1<core::int>(1).{core::Iterable::iterator}{core::Iterator<core::int>};
+    for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
+      final core::int #t126 = :sync-for-iterator.{core::Iterator::current}{core::int};
+      {
+        invalid-expression "pkg/front_end/testcases/general/for_in.dart:169:14: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+  for (Class.stringStaticField in <int>[1]) { // Error
+             ^";
+        core::print(self::Class::stringStaticField);
+      }
+    }
+  }
+  {
+    synthesized core::Iterator<core::int> :sync-for-iterator = core::_GrowableList::_literal1<core::int>(1).{core::Iterable::iterator}{core::Iterator<core::int>};
+    for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
+      final core::int #t127 = :sync-for-iterator.{core::Iterator::current}{core::int};
+      {
+        invalid-expression "pkg/front_end/testcases/general/for_in.dart:172:14: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+  for (Class.finalStaticField in [1]) { // Error
+             ^";
+        core::print(self::Class::finalStaticField);
+      }
+    }
+  }
+  {
+    synthesized core::Iterator<core::int> :sync-for-iterator = core::_GrowableList::_literal1<core::int>(1).{core::Iterable::iterator}{core::Iterator<core::int>};
+    for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
+      final core::int #t128 = :sync-for-iterator.{core::Iterator::current}{core::int};
+      {
+        invalid-expression "pkg/front_end/testcases/general/for_in.dart:175:14: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+  for (Class.lateFinalStaticField in [1]) { // Error
+             ^";
+        core::print(self::Class::lateFinalStaticField);
+      }
+    }
+  }
+  {
+    synthesized core::Iterator<core::int> :sync-for-iterator = core::_GrowableList::_literal1<core::int>(1).{core::Iterable::iterator}{core::Iterator<core::int>};
+    for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
+      final core::int #t129 = :sync-for-iterator.{core::Iterator::current}{core::int};
+      {
+        invalid-expression "pkg/front_end/testcases/general/for_in.dart:178:18: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+  for (Extension.stringStaticField in [1]) { // Error
+                 ^";
+        core::print(self::Extension|stringStaticField);
+      }
+    }
+  }
+  {
+    synthesized core::Iterator<core::int> :sync-for-iterator = core::_GrowableList::_literal1<core::int>(1).{core::Iterable::iterator}{core::Iterator<core::int>};
+    for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
+      final core::int #t130 = :sync-for-iterator.{core::Iterator::current}{core::int};
+      {
+        invalid-expression "pkg/front_end/testcases/general/for_in.dart:181:18: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+  for (Extension.stringStaticField in <int>[1]) { // Error
+                 ^";
+        core::print(self::Extension|stringStaticField);
+      }
+    }
+  }
+  {
+    synthesized core::Iterator<core::int> :sync-for-iterator = core::_GrowableList::_literal1<core::int>(1).{core::Iterable::iterator}{core::Iterator<core::int>};
+    for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
+      final core::int #t131 = :sync-for-iterator.{core::Iterator::current}{core::int};
+      {
+        invalid-expression "pkg/front_end/testcases/general/for_in.dart:184:18: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+  for (Extension.finalStaticField in [1]) { // Error
+                 ^";
+        core::print(self::Extension|finalStaticField);
+      }
+    }
+  }
+  {
+    synthesized core::Iterator<core::int> :sync-for-iterator = core::_GrowableList::_literal1<core::int>(1).{core::Iterable::iterator}{core::Iterator<core::int>};
+    for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
+      final core::int #t132 = :sync-for-iterator.{core::Iterator::current}{core::int};
+      {
+        invalid-expression "pkg/front_end/testcases/general/for_in.dart:187:18: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+  for (Extension.lateFinalStaticField in [1]) { // Error
+                 ^";
+        core::print(self::Extension|lateFinalStaticField);
+      }
+    }
+  }
+  {
+    synthesized core::Iterator<core::int> :sync-for-iterator = core::_GrowableList::_literal1<core::int>(1).{core::Iterable::iterator}{core::Iterator<core::int>};
+    for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
+      final core::int #t133 = :sync-for-iterator.{core::Iterator::current}{core::int};
+      {
+        invalid-expression "pkg/front_end/testcases/general/for_in.dart:190:14: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+  for (Class.intStaticField in [1]) { // Error
+             ^";
+        core::print(self::Class::intStaticField);
+      }
+    }
+  }
+  {
+    synthesized core::Iterator<core::int> :sync-for-iterator = core::_GrowableList::_literal1<core::int>(1).{core::Iterable::iterator}{core::Iterator<core::int>};
+    for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
+      final core::int #t134 = :sync-for-iterator.{core::Iterator::current}{core::int};
+      {
+        invalid-expression "pkg/front_end/testcases/general/for_in.dart:193:14: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+  for (Class.numStaticField in [1]) { // Error
+             ^";
+        core::print(self::Class::numStaticField);
+      }
+    }
+  }
+  {
+    synthesized core::Iterator<core::int> :sync-for-iterator = core::_GrowableList::_literal1<core::int>(1).{core::Iterable::iterator}{core::Iterator<core::int>};
+    for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
+      final core::int #t135 = :sync-for-iterator.{core::Iterator::current}{core::int};
+      {
+        invalid-expression "pkg/front_end/testcases/general/for_in.dart:196:14: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+  for (Class.lateStaticField in [1]) { // Error
+             ^";
+        core::print(self::Class::lateStaticField);
+      }
+    }
+  }
+  {
+    synthesized core::Iterator<core::int> :sync-for-iterator = core::_GrowableList::_literal1<core::int>(1).{core::Iterable::iterator}{core::Iterator<core::int>};
+    for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
+      final core::int #t136 = :sync-for-iterator.{core::Iterator::current}{core::int};
+      {
+        invalid-expression "pkg/front_end/testcases/general/for_in.dart:199:18: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+  for (Extension.intStaticField in [1]) { // Error
+                 ^";
+        core::print(self::Extension|intStaticField);
+      }
+    }
+  }
+  {
+    synthesized core::Iterator<core::int> :sync-for-iterator = core::_GrowableList::_literal1<core::int>(1).{core::Iterable::iterator}{core::Iterator<core::int>};
+    for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
+      final core::int #t137 = :sync-for-iterator.{core::Iterator::current}{core::int};
+      {
+        invalid-expression "pkg/front_end/testcases/general/for_in.dart:202:18: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+  for (Extension.numStaticField in [1]) { // Error
+                 ^";
+        core::print(self::Extension|numStaticField);
+      }
+    }
+  }
+  {
+    synthesized core::Iterator<core::int> :sync-for-iterator = core::_GrowableList::_literal1<core::int>(1).{core::Iterable::iterator}{core::Iterator<core::int>};
+    for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
+      final core::int #t138 = :sync-for-iterator.{core::Iterator::current}{core::int};
+      {
+        invalid-expression "pkg/front_end/testcases/general/for_in.dart:205:18: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+  for (Extension.lateStaticField in [1]) { // Error
+                 ^";
+        core::print(self::Extension|lateStaticField);
+      }
+    }
+  }
+}
+static method main() → dynamic {
+  {
+    synthesized core::Iterator<core::int> :sync-for-iterator = core::_GrowableList::_literal1<core::int>(1).{core::Iterable::iterator}{core::Iterator<core::int>};
+    for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
+      core::int intLocal = :sync-for-iterator.{core::Iterator::current}{core::int};
+      {
+        core::print(intLocal);
+      }
+    }
+  }
+  {
+    synthesized core::Iterator<core::num> :sync-for-iterator = core::_GrowableList::_literal1<core::num>(1).{core::Iterable::iterator}{core::Iterator<core::num>};
+    for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
+      core::num numLocal = :sync-for-iterator.{core::Iterator::current}{core::num};
+      {
+        core::print(numLocal);
+      }
+    }
+  }
+  {
+    synthesized core::Iterator<core::int> :sync-for-iterator = core::_GrowableList::_literal1<core::int>(1).{core::Iterable::iterator}{core::Iterator<core::int>};
+    for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
+      core::int varLocal = :sync-for-iterator.{core::Iterator::current}{core::int};
+      {
+        core::print(varLocal);
+      }
+    }
+  }
+  {
+    synthesized core::Iterator<core::int> :sync-for-iterator = core::_GrowableList::_literal1<core::int>(1).{core::Iterable::iterator}{core::Iterator<core::int>};
+    for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
+      final core::int finalLocal = :sync-for-iterator.{core::Iterator::current}{core::int};
+      {
+        core::print(finalLocal);
+      }
+    }
+  }
+  core::print( block {
+    final core::List<core::int> #t139 = core::_GrowableList::•<core::int>(0);
+    {
+      synthesized core::Iterator<core::int> :sync-for-iterator = core::_GrowableList::_literal1<core::int>(1).{core::Iterable::iterator}{core::Iterator<core::int>};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
+        core::int intLocal = :sync-for-iterator.{core::Iterator::current}{core::int};
+        #t139.{core::List::add}{Invariant}(intLocal){(core::int) → void};
+      }
+    }
+  } =>#t139);
+  core::print( block {
+    final core::List<core::num> #t140 = core::_GrowableList::•<core::num>(0);
+    {
+      synthesized core::Iterator<core::num> :sync-for-iterator = core::_GrowableList::_literal1<core::num>(1).{core::Iterable::iterator}{core::Iterator<core::num>};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
+        core::num numLocal = :sync-for-iterator.{core::Iterator::current}{core::num};
+        #t140.{core::List::add}{Invariant}(numLocal){(core::num) → void};
+      }
+    }
+  } =>#t140);
+  core::print( block {
+    final core::List<core::int> #t141 = core::_GrowableList::•<core::int>(0);
+    {
+      synthesized core::Iterator<core::int> :sync-for-iterator = core::_GrowableList::_literal1<core::int>(1).{core::Iterable::iterator}{core::Iterator<core::int>};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
+        core::int varLocal = :sync-for-iterator.{core::Iterator::current}{core::int};
+        #t141.{core::List::add}{Invariant}(varLocal){(core::int) → void};
+      }
+    }
+  } =>#t141);
+  core::print( block {
+    final core::List<core::int> #t142 = core::_GrowableList::•<core::int>(0);
+    {
+      synthesized core::Iterator<core::int> :sync-for-iterator = core::_GrowableList::_literal1<core::int>(1).{core::Iterable::iterator}{core::Iterator<core::int>};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
+        final core::int finalLocal = :sync-for-iterator.{core::Iterator::current}{core::int};
+        #t142.{core::List::add}{Invariant}(finalLocal){(core::int) → void};
+      }
+    }
+  } =>#t142);
+  core::print( block {
+    final core::Map<core::int, core::int> #t143 = <core::int, core::int>{};
+    {
+      synthesized core::Iterator<core::int> :sync-for-iterator = core::_GrowableList::_literal1<core::int>(1).{core::Iterable::iterator}{core::Iterator<core::int>};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
+        core::int intLocal = :sync-for-iterator.{core::Iterator::current}{core::int};
+        #t143.{core::Map::[]=}{Invariant}(0, intLocal){(core::int, core::int) → void};
+      }
+    }
+  } =>#t143);
+  core::print( block {
+    final core::Map<core::int, core::num> #t144 = <core::int, core::num>{};
+    {
+      synthesized core::Iterator<core::num> :sync-for-iterator = core::_GrowableList::_literal1<core::num>(1).{core::Iterable::iterator}{core::Iterator<core::num>};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
+        core::num numLocal = :sync-for-iterator.{core::Iterator::current}{core::num};
+        #t144.{core::Map::[]=}{Invariant}(0, numLocal){(core::int, core::num) → void};
+      }
+    }
+  } =>#t144);
+  core::print( block {
+    final core::Map<core::int, core::int> #t145 = <core::int, core::int>{};
+    {
+      synthesized core::Iterator<core::int> :sync-for-iterator = core::_GrowableList::_literal1<core::int>(1).{core::Iterable::iterator}{core::Iterator<core::int>};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
+        core::int varLocal = :sync-for-iterator.{core::Iterator::current}{core::int};
+        #t145.{core::Map::[]=}{Invariant}(0, varLocal){(core::int, core::int) → void};
+      }
+    }
+  } =>#t145);
+  core::print( block {
+    final core::Map<core::int, core::int> #t146 = <core::int, core::int>{};
+    {
+      synthesized core::Iterator<core::int> :sync-for-iterator = core::_GrowableList::_literal1<core::int>(1).{core::Iterable::iterator}{core::Iterator<core::int>};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
+        final core::int finalLocal = :sync-for-iterator.{core::Iterator::current}{core::int};
+        #t146.{core::Map::[]=}{Invariant}(0, finalLocal){(core::int, core::int) → void};
+      }
+    }
+  } =>#t146);
+  {
+    synthesized core::Iterator<(core::int, core::int)> :sync-for-iterator = core::_GrowableList::_literal1<(core::int, core::int)>((1, 2)).{core::Iterable::iterator}{core::Iterator<(core::int, core::int)>};
+    for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
+      final(core::int, core::int) #t147 = :sync-for-iterator.{core::Iterator::current}{(core::int, core::int)};
+      {
+        hoisted core::int a;
+        hoisted core::int b;
+        {
+          final synthesized(core::int, core::int) #0#0 = #t147;
+          a = #0#0.$1{core::int};
+          b = #0#0.$2{core::int};
+        }
+        core::print(a);
+        core::print(b);
+      }
+    }
+  }
+  core::int existingIntLocal;
+  {
+    synthesized core::Iterator<core::int> :sync-for-iterator = core::_GrowableList::_literal1<core::int>(1).{core::Iterable::iterator}{core::Iterator<core::int>};
+    for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
+      final core::int #t148 = :sync-for-iterator.{core::Iterator::current}{core::int};
+      {
+        existingIntLocal = #t148;
+        core::print(existingIntLocal);
+      }
+    }
+  }
+  core::num existingNumLocal;
+  {
+    synthesized core::Iterator<core::num> :sync-for-iterator = core::_GrowableList::_literal1<core::num>(1).{core::Iterable::iterator}{core::Iterator<core::num>};
+    for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
+      final core::num #t149 = :sync-for-iterator.{core::Iterator::current}{core::num};
+      {
+        existingNumLocal = #t149;
+        core::print(existingNumLocal);
+      }
+    }
+  }
+  new self::Class::•().{self::Class::method}(){() → dynamic};
+  {
+    synthesized core::Iterator<core::int> :sync-for-iterator = core::_GrowableList::_literal1<core::int>(1).{core::Iterable::iterator}{core::Iterator<core::int>};
+    for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
+      final core::int #t150 = :sync-for-iterator.{core::Iterator::current}{core::int};
+      {
+        self::intTopLevel = #t150;
+        core::print(self::intTopLevel);
+      }
+    }
+  }
+  {
+    synthesized core::Iterator<core::num> :sync-for-iterator = core::_GrowableList::_literal1<core::num>(1).{core::Iterable::iterator}{core::Iterator<core::num>};
+    for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
+      final core::num #t151 = :sync-for-iterator.{core::Iterator::current}{core::num};
+      {
+        self::numTopLevel = #t151;
+        core::print(self::numTopLevel);
+      }
+    }
+  }
+  {
+    synthesized core::Iterator<core::int> :sync-for-iterator = core::_GrowableList::_literal1<core::int>(1).{core::Iterable::iterator}{core::Iterator<core::int>};
+    for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
+      final core::int #t152 = :sync-for-iterator.{core::Iterator::current}{core::int};
+      {
+        self::lateTopLevel = #t152;
+        core::print(self::lateTopLevel);
+      }
+    }
+  }
+  {
+    synthesized core::Iterator<core::int> :sync-for-iterator = core::_GrowableList::_literal1<core::int>(1).{core::Iterable::iterator}{core::Iterator<core::int>};
+    for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
+      final core::int #t153 = :sync-for-iterator.{core::Iterator::current}{core::int};
+      {
+        self::lateFinalTopLevel = #t153;
+        core::print(self::lateFinalTopLevel);
+      }
+    }
+  }
+  self::Extension|extensionMethod(new self::Class::•());
+}
+static extension-member method Extension|get#extensionIntProperty(lowered final self::Class #this) → core::int
+  return 0;
+static extension-member method Extension|set#extensionIntProperty(lowered final self::Class #this, core::int value) → void {}
+static extension-member method Extension|get#extensionNumProperty(lowered final self::Class #this) → core::num
+  return 0;
+static extension-member method Extension|set#extensionNumProperty(lowered final self::Class #this, core::num value) → void {}
+static extension-member method Extension|get#extensionStringProperty(lowered final self::Class #this) → core::String
+  return "";
+static extension-member method Extension|set#extensionStringProperty(lowered final self::Class #this, core::String value) → void {}
+static extension-member method Extension|get#extensionReadOnlyProperty(lowered final self::Class #this) → core::int
+  return 0;
+static extension-member method Extension|test(lowered final self::Class #this) → dynamic {
+  {
+    synthesized core::Iterator<core::int> :sync-for-iterator = core::_GrowableList::_literal1<core::int>(1).{core::Iterable::iterator}{core::Iterator<core::int>};
+    for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
+      final core::int #t154 = :sync-for-iterator.{core::Iterator::current}{core::int};
+      {
+        invalid-expression "pkg/front_end/testcases/general/for_in.dart:504:15: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+    for (this.intField in [1]) { // Error
+              ^";
+        core::print(#this.{self::Class::intField}{core::int});
+      }
+    }
+  }
+  {
+    synthesized core::Iterator<core::int> :sync-for-iterator = core::_GrowableList::_literal1<core::int>(1).{core::Iterable::iterator}{core::Iterator<core::int>};
+    for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
+      final core::int #t155 = :sync-for-iterator.{core::Iterator::current}{core::int};
+      {
+        invalid-expression "pkg/front_end/testcases/general/for_in.dart:507:16: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+    for (this?.intField in [1]) { // Error
+               ^";
+        core::print(let final self::Class #t156 = #this in #t156 == null ?{core::int?} null : #t156.{self::Class::intField}{core::int});
+      }
+    }
+  }
+  {
+    synthesized core::Iterator<core::int> :sync-for-iterator = core::_GrowableList::_literal1<core::int>(1).{core::Iterable::iterator}{core::Iterator<core::int>};
+    for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
+      final core::int #t157 = :sync-for-iterator.{core::Iterator::current}{core::int};
+      {
+        invalid-expression "pkg/front_end/testcases/general/for_in.dart:510:15: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+    for (this.numField in [1]) { // Error
+              ^";
+        core::print(#this.{self::Class::numField}{core::num});
+      }
+    }
+  }
+  {
+    synthesized core::Iterator<core::int> :sync-for-iterator = core::_GrowableList::_literal1<core::int>(1).{core::Iterable::iterator}{core::Iterator<core::int>};
+    for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
+      final core::int #t158 = :sync-for-iterator.{core::Iterator::current}{core::int};
+      {
+        invalid-expression "pkg/front_end/testcases/general/for_in.dart:513:16: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+    for (this?.numField in [1]) { // Error
+               ^";
+        core::print(let final self::Class #t159 = #this in #t159 == null ?{core::num?} null : #t159.{self::Class::numField}{core::num});
+      }
+    }
+  }
+  {
+    synthesized core::Iterator<core::int> :sync-for-iterator = core::_GrowableList::_literal1<core::int>(1).{core::Iterable::iterator}{core::Iterator<core::int>};
+    for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
+      final core::int #t160 = :sync-for-iterator.{core::Iterator::current}{core::int};
+      {
+        invalid-expression "pkg/front_end/testcases/general/for_in.dart:516:15: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+    for (this.lateField in [1]) { // Error
+              ^";
+        core::print(#this.{self::Class::lateField}{core::int});
+      }
+    }
+  }
+  {
+    synthesized core::Iterator<core::int> :sync-for-iterator = core::_GrowableList::_literal1<core::int>(1).{core::Iterable::iterator}{core::Iterator<core::int>};
+    for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
+      final core::int #t161 = :sync-for-iterator.{core::Iterator::current}{core::int};
+      {
+        invalid-expression "pkg/front_end/testcases/general/for_in.dart:519:16: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+    for (this?.lateField in [1]) { // Error
+               ^";
+        core::print(let final self::Class #t162 = #this in #t162 == null ?{core::int?} null : #t162.{self::Class::lateField}{core::int});
+      }
+    }
+  }
+  {
+    synthesized core::Iterator<core::int> :sync-for-iterator = core::_GrowableList::_literal1<core::int>(1).{core::Iterable::iterator}{core::Iterator<core::int>};
+    for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
+      final core::int #t163 = :sync-for-iterator.{core::Iterator::current}{core::int};
+      {
+        invalid-expression "pkg/front_end/testcases/general/for_in.dart:522:15: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+    for (this.extensionIntProperty in [1]) { // Error
+              ^";
+        core::print(self::Extension|get#extensionIntProperty(#this));
+      }
+    }
+  }
+  {
+    synthesized core::Iterator<core::int> :sync-for-iterator = core::_GrowableList::_literal1<core::int>(1).{core::Iterable::iterator}{core::Iterator<core::int>};
+    for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
+      final core::int #t164 = :sync-for-iterator.{core::Iterator::current}{core::int};
+      {
+        invalid-expression "pkg/front_end/testcases/general/for_in.dart:525:16: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+    for (this?.extensionIntProperty in [1]) { // Error
+               ^";
+        core::print(let final self::Class #t165 = #this in #t165 == null ?{core::int?} null : self::Extension|get#extensionIntProperty(#t165));
+      }
+    }
+  }
+  {
+    synthesized core::Iterator<core::int> :sync-for-iterator = core::_GrowableList::_literal1<core::int>(1).{core::Iterable::iterator}{core::Iterator<core::int>};
+    for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
+      final core::int #t166 = :sync-for-iterator.{core::Iterator::current}{core::int};
+      {
+        invalid-expression "pkg/front_end/testcases/general/for_in.dart:528:15: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+    for (this.extensionNumProperty in [1]) { // Error
+              ^";
+        core::print(self::Extension|get#extensionNumProperty(#this));
+      }
+    }
+  }
+  {
+    synthesized core::Iterator<core::int> :sync-for-iterator = core::_GrowableList::_literal1<core::int>(1).{core::Iterable::iterator}{core::Iterator<core::int>};
+    for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
+      final core::int #t167 = :sync-for-iterator.{core::Iterator::current}{core::int};
+      {
+        invalid-expression "pkg/front_end/testcases/general/for_in.dart:531:16: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+    for (this?.extensionNumProperty in [1]) { // Error
+               ^";
+        core::print(let final self::Class #t168 = #this in #t168 == null ?{core::num?} null : self::Extension|get#extensionNumProperty(#t168));
+      }
+    }
+  }
+  {
+    synthesized core::Iterator<core::String> :sync-for-iterator = core::_GrowableList::_literal1<core::String>(invalid-expression "pkg/front_end/testcases/general/for_in.dart:534:38: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+    for (extensionStringProperty in [1]) { // Error
+                                     ^" in 1 as{TypeError} core::String).{core::Iterable::iterator}{core::Iterator<core::String>};
+    for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
+      final core::String #t169 = :sync-for-iterator.{core::Iterator::current}{core::String};
+      {
+        self::Extension|set#extensionStringProperty(#this, #t169);
+        core::print(self::Extension|get#extensionStringProperty(#this));
+      }
+    }
+  }
+  {
+    synthesized core::Iterator<core::int> :sync-for-iterator = core::_GrowableList::_literal1<core::int>(1).{core::Iterable::iterator}{core::Iterator<core::int>};
+    for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
+      final core::int #t170 = :sync-for-iterator.{core::Iterator::current}{core::int};
+      {
+        invalid-expression "pkg/front_end/testcases/general/for_in.dart:537:15: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+    for (this.extensionStringProperty in [1]) { // Error
+              ^";
+        core::print(self::Extension|get#extensionStringProperty(#this));
+      }
+    }
+  }
+  {
+    synthesized core::Iterator<core::int> :sync-for-iterator = core::_GrowableList::_literal1<core::int>(1).{core::Iterable::iterator}{core::Iterator<core::int>};
+    for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
+      final core::int #t171 = :sync-for-iterator.{core::Iterator::current}{core::int};
+      {
+        invalid-expression "pkg/front_end/testcases/general/for_in.dart:540:16: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+    for (this?.extensionStringProperty in [1]) { // Error
+               ^";
+        core::print(let final self::Class #t172 = #this in #t172 == null ?{core::String?} null : self::Extension|get#extensionStringProperty(#t172));
+      }
+    }
+  }
+  {
+    synthesized core::Iterator<core::int> :sync-for-iterator = core::_GrowableList::_literal1<core::int>(1).{core::Iterable::iterator}{core::Iterator<core::int>};
+    for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
+      final core::int #t173 = :sync-for-iterator.{core::Iterator::current}{core::int};
+      {
+        self::Extension|set#extensionStringProperty(#this, invalid-expression "pkg/front_end/testcases/general/for_in.dart:543:34: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+    for (extensionStringProperty in <int>[1]) { // Error
+                                 ^" in #t173 as{TypeError} core::String);
+        core::print(self::Extension|get#extensionStringProperty(#this));
+      }
+    }
+  }
+  {
+    synthesized core::Iterator<core::int> :sync-for-iterator = core::_GrowableList::_literal1<core::int>(1).{core::Iterable::iterator}{core::Iterator<core::int>};
+    for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
+      final core::int #t174 = :sync-for-iterator.{core::Iterator::current}{core::int};
+      {
+        invalid-expression "pkg/front_end/testcases/general/for_in.dart:546:15: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+    for (this.extensionStringProperty in <int>[1]) { // Error
+              ^";
+        core::print(self::Extension|get#extensionStringProperty(#this));
+      }
+    }
+  }
+  {
+    synthesized core::Iterator<core::int> :sync-for-iterator = core::_GrowableList::_literal1<core::int>(1).{core::Iterable::iterator}{core::Iterator<core::int>};
+    for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
+      final core::int #t175 = :sync-for-iterator.{core::Iterator::current}{core::int};
+      {
+        invalid-expression "pkg/front_end/testcases/general/for_in.dart:549:16: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+    for (this?.extensionStringProperty in <int>[1]) { // Error
+               ^";
+        core::print(let final self::Class #t176 = #this in #t176 == null ?{core::String?} null : self::Extension|get#extensionStringProperty(#t176));
+      }
+    }
+  }
+  {
+    synthesized core::Iterator<core::int> :sync-for-iterator = core::_GrowableList::_literal1<core::int>(1).{core::Iterable::iterator}{core::Iterator<core::int>};
+    for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
+      final core::int #t177 = :sync-for-iterator.{core::Iterator::current}{core::int};
+      {
+        invalid-expression "pkg/front_end/testcases/general/for_in.dart:552:10: Error: Setter not found: 'extensionReadOnlyProperty'.
+    for (extensionReadOnlyProperty in [1]) { // Error
+         ^^^^^^^^^^^^^^^^^^^^^^^^^";
+        core::print(self::Extension|get#extensionReadOnlyProperty(#this));
+      }
+    }
+  }
+  {
+    synthesized core::Iterator<core::int> :sync-for-iterator = core::_GrowableList::_literal1<core::int>(1).{core::Iterable::iterator}{core::Iterator<core::int>};
+    for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
+      final core::int #t178 = :sync-for-iterator.{core::Iterator::current}{core::int};
+      {
+        invalid-expression "pkg/front_end/testcases/general/for_in.dart:555:15: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+    for (this.extensionReadOnlyProperty in [1]) { // Error
+              ^";
+        core::print(self::Extension|get#extensionReadOnlyProperty(#this));
+      }
+    }
+  }
+  {
+    synthesized core::Iterator<core::int> :sync-for-iterator = core::_GrowableList::_literal1<core::int>(1).{core::Iterable::iterator}{core::Iterator<core::int>};
+    for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
+      final core::int #t179 = :sync-for-iterator.{core::Iterator::current}{core::int};
+      {
+        invalid-expression "pkg/front_end/testcases/general/for_in.dart:558:16: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+    for (this?.extensionReadOnlyProperty in [1]) { // Error
+               ^";
+        core::print(let final self::Class #t180 = #this in #t180 == null ?{core::int?} null : self::Extension|get#extensionReadOnlyProperty(#t180));
+      }
+    }
+  }
+  {
+    synthesized core::Iterator<core::int> :sync-for-iterator = core::_GrowableList::_literal1<core::int>(1).{core::Iterable::iterator}{core::Iterator<core::int>};
+    for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
+      final core::int #t181 = :sync-for-iterator.{core::Iterator::current}{core::int};
+      {
+        invalid-expression "pkg/front_end/testcases/general/for_in.dart:561:10: Error: Setter not found: 'finalStaticField'.
+    for (finalStaticField in [1]) { // Error
+         ^^^^^^^^^^^^^^^^";
+        core::print(self::Extension|finalStaticField);
+      }
+    }
+  }
+  {
+    synthesized core::Iterator<core::String> :sync-for-iterator = core::_GrowableList::_literal1<core::String>(invalid-expression "pkg/front_end/testcases/general/for_in.dart:564:32: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+    for (stringStaticField in [1]) { // Error
+                               ^" in 1 as{TypeError} core::String).{core::Iterable::iterator}{core::Iterator<core::String>};
+    for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
+      final core::String #t182 = :sync-for-iterator.{core::Iterator::current}{core::String};
+      {
+        self::Extension|stringStaticField = #t182;
+        core::print(self::Extension|stringStaticField);
+      }
+    }
+  }
+  {
+    synthesized core::Iterator<core::int> :sync-for-iterator = core::_GrowableList::_literal1<core::int>(1).{core::Iterable::iterator}{core::Iterator<core::int>};
+    for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
+      final core::int #t183 = :sync-for-iterator.{core::Iterator::current}{core::int};
+      {
+        self::Extension|stringStaticField = invalid-expression "pkg/front_end/testcases/general/for_in.dart:567:28: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+    for (stringStaticField in <int>[1]) { // Error
+                           ^" in #t183 as{TypeError} core::String;
+        core::print(self::Extension|stringStaticField);
+      }
+    }
+  }
+  {
+    synthesized core::Iterator<core::int> :sync-for-iterator = core::_GrowableList::_literal1<core::int>(1).{core::Iterable::iterator}{core::Iterator<core::int>};
+    for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
+      final core::int #t184 = :sync-for-iterator.{core::Iterator::current}{core::int};
+      {
+        self::Extension|lateFinalStaticField = #t184;
+        core::print(self::Extension|lateFinalStaticField);
+      }
+    }
+  }
+}
+static extension-member method Extension|get#test(lowered final self::Class #this) → () → dynamic
+  return () → dynamic => self::Extension|test(#this);
+static extension-member method Extension|extensionMethod(lowered final self::Class #this) → dynamic {
+  {
+    synthesized core::Iterator<core::int> :sync-for-iterator = core::_GrowableList::_literal1<core::int>(1).{core::Iterable::iterator}{core::Iterator<core::int>};
+    for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
+      final core::int #t185 = :sync-for-iterator.{core::Iterator::current}{core::int};
+      {
+        #this.{self::Class::intField} = #t185;
+        core::print(#this.{self::Class::intField}{core::int});
+      }
+    }
+  }
+  {
+    synthesized core::Iterator<core::num> :sync-for-iterator = core::_GrowableList::_literal1<core::num>(1).{core::Iterable::iterator}{core::Iterator<core::num>};
+    for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
+      final core::num #t186 = :sync-for-iterator.{core::Iterator::current}{core::num};
+      {
+        #this.{self::Class::numField} = #t186;
+        core::print(#this.{self::Class::numField}{core::num});
+      }
+    }
+  }
+  {
+    synthesized core::Iterator<core::int> :sync-for-iterator = core::_GrowableList::_literal1<core::int>(1).{core::Iterable::iterator}{core::Iterator<core::int>};
+    for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
+      final core::int #t187 = :sync-for-iterator.{core::Iterator::current}{core::int};
+      {
+        #this.{self::Class::lateField} = #t187;
+        core::print(#this.{self::Class::lateField}{core::int});
+      }
+    }
+  }
+  {
+    synthesized core::Iterator<core::int> :sync-for-iterator = core::_GrowableList::_literal1<core::int>(1).{core::Iterable::iterator}{core::Iterator<core::int>};
+    for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
+      final core::int #t188 = :sync-for-iterator.{core::Iterator::current}{core::int};
+      {
+        self::Extension|set#extensionIntProperty(#this, #t188);
+        core::print(self::Extension|get#extensionIntProperty(#this));
+      }
+    }
+  }
+  {
+    synthesized core::Iterator<core::num> :sync-for-iterator = core::_GrowableList::_literal1<core::num>(1).{core::Iterable::iterator}{core::Iterator<core::num>};
+    for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
+      final core::num #t189 = :sync-for-iterator.{core::Iterator::current}{core::num};
+      {
+        self::Extension|set#extensionNumProperty(#this, #t189);
+        core::print(self::Extension|get#extensionNumProperty(#this));
+      }
+    }
+  }
+  {
+    synthesized core::Iterator<core::int> :sync-for-iterator = core::_GrowableList::_literal1<core::int>(1).{core::Iterable::iterator}{core::Iterator<core::int>};
+    for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
+      final core::int #t190 = :sync-for-iterator.{core::Iterator::current}{core::int};
+      {
+        self::Extension|intStaticField = #t190;
+        core::print(self::Extension|intStaticField);
+      }
+    }
+  }
+  {
+    synthesized core::Iterator<core::num> :sync-for-iterator = core::_GrowableList::_literal1<core::num>(1).{core::Iterable::iterator}{core::Iterator<core::num>};
+    for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
+      final core::num #t191 = :sync-for-iterator.{core::Iterator::current}{core::num};
+      {
+        self::Extension|numStaticField = #t191;
+        core::print(self::Extension|numStaticField);
+      }
+    }
+  }
+  {
+    synthesized core::Iterator<core::int> :sync-for-iterator = core::_GrowableList::_literal1<core::int>(1).{core::Iterable::iterator}{core::Iterator<core::int>};
+    for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
+      final core::int #t192 = :sync-for-iterator.{core::Iterator::current}{core::int};
+      {
+        self::Extension|lateStaticField = #t192;
+        core::print(self::Extension|lateStaticField);
+      }
+    }
+  }
+}
+static extension-member method Extension|get#extensionMethod(lowered final self::Class #this) → () → dynamic
+  return () → dynamic => self::Extension|extensionMethod(#this);
+static extension-member method IndexExtension|[]=(lowered final core::int #this, core::int index, core::int value) → void {}
+static extension-member method IndexExtension|[](lowered final core::int #this, core::int index) → core::int
+  return 0;
+static extension-member method IndexExtension|extensionMethod(lowered final core::int #this) → dynamic {
+  {
+    synthesized core::Iterator<core::int> :sync-for-iterator = core::_GrowableList::_literal1<core::int>(1).{core::Iterable::iterator}{core::Iterator<core::int>};
+    for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
+      final core::int #t193 = :sync-for-iterator.{core::Iterator::current}{core::int};
+      {
+        invalid-expression "pkg/front_end/testcases/general/for_in.dart:608:14: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+    for (this[0] in [1]) { // Error
+             ^";
+        core::print(self::IndexExtension|[](#this, 0));
+      }
+    }
+  }
+  {
+    synthesized core::Iterator<core::int> :sync-for-iterator = core::_GrowableList::_literal1<core::int>(1).{core::Iterable::iterator}{core::Iterator<core::int>};
+    for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
+      final core::int #t194 = :sync-for-iterator.{core::Iterator::current}{core::int};
+      {
+        invalid-expression "pkg/front_end/testcases/general/for_in.dart:611:15: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+    for (this?[0] in [1]) { // Error
+              ^";
+        core::print(let final core::int #t195 = #this in #t195 == null ?{core::int?} null : self::IndexExtension|[](#t195, 0));
+      }
+    }
+  }
+}
+static extension-member method IndexExtension|get#extensionMethod(lowered final core::int #this) → () → dynamic
+  return () → dynamic => self::IndexExtension|extensionMethod(#this);
+
+constants  {
+  #C1 = 0
+}
+
+Extra constant evaluation status:
+Evaluated: EqualsNull @ org-dartlang-testcase:///for_in.dart:423:13 -> BoolConstant(false)
+Evaluated: VariableGet @ org-dartlang-testcase:///for_in.dart:423:13 -> IntConstant(0)
+Evaluated: EqualsNull @ org-dartlang-testcase:///for_in.dart:429:28 -> BoolConstant(false)
+Evaluated: VariableGet @ org-dartlang-testcase:///for_in.dart:429:28 -> IntConstant(0)
+Evaluated: RecordLiteral @ org-dartlang-testcase:///for_in.dart:247:23 -> RecordConstant(const (1, 2))
+Extra constant evaluation: evaluated: 1772, effectively constant: 5
diff --git a/pkg/front_end/testcases/general/for_in.dart.textual_outline.expect b/pkg/front_end/testcases/general/for_in.dart.textual_outline.expect
new file mode 100644
index 0000000..ea75f6e
--- /dev/null
+++ b/pkg/front_end/testcases/general/for_in.dart.textual_outline.expect
@@ -0,0 +1,66 @@
+import 'for_in.dart' deferred as defer hide Extension, IndexExtension;
+
+int intTopLevel = 0;
+
+final int finalTopLevel = 0;
+
+const int constTopLevel = 0;
+
+late int lateTopLevel;
+
+late final int lateFinalTopLevel;
+
+num numTopLevel = 0;
+
+String stringTopLevel = '';
+
+test() {}
+
+main() {}
+
+class Class {
+  int intField = 0;
+  num numField = 0;
+  String stringField = '';
+  final int finalField = 0;
+  late int lateField;
+  late final int lateFinalField;
+  static int intStaticField = 0;
+  static num numStaticField = 0;
+  static String stringStaticField = '';
+  static final int finalStaticField = 0;
+  static late int lateStaticField;
+  static late final int lateFinalStaticField;
+  operator []=(int index, int value) {}
+  int operator [](int index) => 0;
+  test() {}
+  method() {}
+}
+
+class Subclass extends Class {
+  test() {}
+}
+
+extension Extension on Class {
+  int get extensionIntProperty => 0;
+  void set extensionIntProperty(int value) {}
+  num get extensionNumProperty => 0;
+  void set extensionNumProperty(num value) {}
+  String get extensionStringProperty => '';
+  void set extensionStringProperty(String value) {}
+  int get extensionReadOnlyProperty => 0;
+  static int intStaticField = 0;
+  static num numStaticField = 0;
+  static String stringStaticField = '';
+  static final int finalStaticField = 0;
+  static late int lateStaticField;
+  static late final int lateFinalStaticField;
+  test() {}
+  extensionMethod() {}
+}
+
+extension IndexExtension on int {
+  operator []=(int index, int value) {}
+  int operator [](int index) => 0;
+  extensionMethod() {}
+}
diff --git a/pkg/front_end/testcases/general/for_in.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/general/for_in.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..ce0325b
--- /dev/null
+++ b/pkg/front_end/testcases/general/for_in.dart.textual_outline_modelled.expect
@@ -0,0 +1,66 @@
+import 'for_in.dart' deferred as defer hide Extension, IndexExtension;
+
+String stringTopLevel = '';
+
+class Class {
+  String stringField = '';
+  final int finalField = 0;
+  int intField = 0;
+  int operator [](int index) => 0;
+  late final int lateFinalField;
+  late int lateField;
+  method() {}
+  num numField = 0;
+  operator []=(int index, int value) {}
+  static String stringStaticField = '';
+  static final int finalStaticField = 0;
+  static int intStaticField = 0;
+  static late final int lateFinalStaticField;
+  static late int lateStaticField;
+  static num numStaticField = 0;
+  test() {}
+}
+
+class Subclass extends Class {
+  test() {}
+}
+
+const int constTopLevel = 0;
+
+extension Extension on Class {
+  String get extensionStringProperty => '';
+  extensionMethod() {}
+  int get extensionIntProperty => 0;
+  int get extensionReadOnlyProperty => 0;
+  num get extensionNumProperty => 0;
+  static String stringStaticField = '';
+  static final int finalStaticField = 0;
+  static int intStaticField = 0;
+  static late final int lateFinalStaticField;
+  static late int lateStaticField;
+  static num numStaticField = 0;
+  test() {}
+  void set extensionIntProperty(int value) {}
+  void set extensionNumProperty(num value) {}
+  void set extensionStringProperty(String value) {}
+}
+
+extension IndexExtension on int {
+  extensionMethod() {}
+  int operator [](int index) => 0;
+  operator []=(int index, int value) {}
+}
+
+final int finalTopLevel = 0;
+
+int intTopLevel = 0;
+
+late final int lateFinalTopLevel;
+
+late int lateTopLevel;
+
+main() {}
+
+num numTopLevel = 0;
+
+test() {}
diff --git a/pkg/front_end/testcases/general/for_in_dynamic.dart b/pkg/front_end/testcases/general/for_in_dynamic.dart
new file mode 100644
index 0000000..2e15a77
--- /dev/null
+++ b/pkg/front_end/testcases/general/for_in_dynamic.dart
@@ -0,0 +1,29 @@
+// Copyright (c) 2026, 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.
+
+List makeList(List list) => list;
+
+Stream makeStream(List list) async* {
+  for (var e in list) {
+    yield e;
+  }
+}
+
+test() async {
+  for (String i in makeList([1, 2, 3])) {
+    print(i);
+  }
+  await for (String i in makeStream([1, 2, 3])) {
+    print(i);
+  }
+}
+
+main() async {
+  for (int i in makeList([1, 2, 3])) {
+    print(i);
+  }
+  await for (int i in makeStream([1, 2, 3])) {
+    print(i);
+  }
+}
diff --git a/pkg/front_end/testcases/general/for_in_dynamic.dart.strong.expect b/pkg/front_end/testcases/general/for_in_dynamic.dart.strong.expect
new file mode 100644
index 0000000..6d89b8e
--- /dev/null
+++ b/pkg/front_end/testcases/general/for_in_dynamic.dart.strong.expect
@@ -0,0 +1,32 @@
+library;
+import self as self;
+import "dart:core" as core;
+import "dart:async" as asy;
+
+static method makeList(core::List<dynamic> list) → core::List<dynamic>
+  return list;
+static method makeStream(core::List<dynamic> list) → asy::Stream<dynamic> async* /* emittedValueType= dynamic */ {
+  for (dynamic e in list) {
+    yield e;
+  }
+}
+static method test() → dynamic async /* emittedValueType= dynamic */ {
+  for (final dynamic #t1 in self::makeList(<dynamic>[1, 2, 3])) {
+    core::String i = #t1 as{TypeError,ForDynamic} core::String;
+    core::print(i);
+  }
+  await for (final dynamic #t2 in self::makeStream(<dynamic>[1, 2, 3])) {
+    core::String i = #t2 as{TypeError,ForDynamic} core::String;
+    core::print(i);
+  }
+}
+static method main() → dynamic async /* emittedValueType= dynamic */ {
+  for (final dynamic #t3 in self::makeList(<dynamic>[1, 2, 3])) {
+    core::int i = #t3 as{TypeError,ForDynamic} core::int;
+    core::print(i);
+  }
+  await for (final dynamic #t4 in self::makeStream(<dynamic>[1, 2, 3])) {
+    core::int i = #t4 as{TypeError,ForDynamic} core::int;
+    core::print(i);
+  }
+}
diff --git a/pkg/front_end/testcases/general/for_in_dynamic.dart.strong.modular.expect b/pkg/front_end/testcases/general/for_in_dynamic.dart.strong.modular.expect
new file mode 100644
index 0000000..6d89b8e
--- /dev/null
+++ b/pkg/front_end/testcases/general/for_in_dynamic.dart.strong.modular.expect
@@ -0,0 +1,32 @@
+library;
+import self as self;
+import "dart:core" as core;
+import "dart:async" as asy;
+
+static method makeList(core::List<dynamic> list) → core::List<dynamic>
+  return list;
+static method makeStream(core::List<dynamic> list) → asy::Stream<dynamic> async* /* emittedValueType= dynamic */ {
+  for (dynamic e in list) {
+    yield e;
+  }
+}
+static method test() → dynamic async /* emittedValueType= dynamic */ {
+  for (final dynamic #t1 in self::makeList(<dynamic>[1, 2, 3])) {
+    core::String i = #t1 as{TypeError,ForDynamic} core::String;
+    core::print(i);
+  }
+  await for (final dynamic #t2 in self::makeStream(<dynamic>[1, 2, 3])) {
+    core::String i = #t2 as{TypeError,ForDynamic} core::String;
+    core::print(i);
+  }
+}
+static method main() → dynamic async /* emittedValueType= dynamic */ {
+  for (final dynamic #t3 in self::makeList(<dynamic>[1, 2, 3])) {
+    core::int i = #t3 as{TypeError,ForDynamic} core::int;
+    core::print(i);
+  }
+  await for (final dynamic #t4 in self::makeStream(<dynamic>[1, 2, 3])) {
+    core::int i = #t4 as{TypeError,ForDynamic} core::int;
+    core::print(i);
+  }
+}
diff --git a/pkg/front_end/testcases/general/for_in_dynamic.dart.strong.outline.expect b/pkg/front_end/testcases/general/for_in_dynamic.dart.strong.outline.expect
new file mode 100644
index 0000000..8ca3eeb
--- /dev/null
+++ b/pkg/front_end/testcases/general/for_in_dynamic.dart.strong.outline.expect
@@ -0,0 +1,13 @@
+library;
+import self as self;
+import "dart:core" as core;
+import "dart:async" as asy;
+
+static method makeList(core::List<dynamic> list) → core::List<dynamic>
+  ;
+static method makeStream(core::List<dynamic> list) → asy::Stream<dynamic> async* 
+  ;
+static method test() → dynamic async 
+  ;
+static method main() → dynamic async 
+  ;
diff --git a/pkg/front_end/testcases/general/for_in_dynamic.dart.strong.transformed.expect b/pkg/front_end/testcases/general/for_in_dynamic.dart.strong.transformed.expect
new file mode 100644
index 0000000..4a5d731
--- /dev/null
+++ b/pkg/front_end/testcases/general/for_in_dynamic.dart.strong.transformed.expect
@@ -0,0 +1,72 @@
+library;
+import self as self;
+import "dart:core" as core;
+import "dart:async" as asy;
+
+static method makeList(core::List<dynamic> list) → core::List<dynamic>
+  return list;
+static method makeStream(core::List<dynamic> list) → asy::Stream<dynamic> async* /* emittedValueType= dynamic */ {
+  {
+    synthesized core::Iterator<dynamic> :sync-for-iterator = list.{core::Iterable::iterator}{core::Iterator<dynamic>};
+    for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
+      dynamic e = :sync-for-iterator.{core::Iterator::current}{dynamic};
+      {
+        yield e;
+      }
+    }
+  }
+}
+static method test() → dynamic async /* emittedValueType= dynamic */ {
+  {
+    synthesized core::Iterator<dynamic> :sync-for-iterator = self::makeList(core::_GrowableList::_literal3<dynamic>(1, 2, 3)).{core::Iterable::iterator}{core::Iterator<dynamic>};
+    for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
+      final dynamic #t1 = :sync-for-iterator.{core::Iterator::current}{dynamic};
+      {
+        core::String i = #t1 as{TypeError,ForDynamic} core::String;
+        core::print(i);
+      }
+    }
+  }
+  {
+    synthesized asy::Stream<dynamic> :stream = self::makeStream(core::_GrowableList::_literal3<dynamic>(1, 2, 3));
+    synthesized asy::_StreamIterator<dynamic>? :for-iterator = new asy::_StreamIterator::•<dynamic>(:stream);
+    try
+      while (let dynamic #t2 = asy::_asyncStarMoveNextHelper(:stream) in await :for-iterator.{asy::_StreamIterator::moveNext}(){() → asy::Future<core::bool>}) {
+        final dynamic #t3 = :for-iterator.{asy::_StreamIterator::current}{dynamic};
+        {
+          core::String i = #t3 as{TypeError,ForDynamic} core::String;
+          core::print(i);
+        }
+      }
+    finally
+      if(!(:for-iterator.{asy::_StreamIterator::_subscription}{asy::StreamSubscription<dynamic>?} == null))
+        await :for-iterator.{asy::_StreamIterator::cancel}(){() → asy::Future<dynamic>};
+  }
+}
+static method main() → dynamic async /* emittedValueType= dynamic */ {
+  {
+    synthesized core::Iterator<dynamic> :sync-for-iterator = self::makeList(core::_GrowableList::_literal3<dynamic>(1, 2, 3)).{core::Iterable::iterator}{core::Iterator<dynamic>};
+    for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
+      final dynamic #t4 = :sync-for-iterator.{core::Iterator::current}{dynamic};
+      {
+        core::int i = #t4 as{TypeError,ForDynamic} core::int;
+        core::print(i);
+      }
+    }
+  }
+  {
+    synthesized asy::Stream<dynamic> :stream = self::makeStream(core::_GrowableList::_literal3<dynamic>(1, 2, 3));
+    synthesized asy::_StreamIterator<dynamic>? :for-iterator = new asy::_StreamIterator::•<dynamic>(:stream);
+    try
+      while (let dynamic #t5 = asy::_asyncStarMoveNextHelper(:stream) in await :for-iterator.{asy::_StreamIterator::moveNext}(){() → asy::Future<core::bool>}) {
+        final dynamic #t6 = :for-iterator.{asy::_StreamIterator::current}{dynamic};
+        {
+          core::int i = #t6 as{TypeError,ForDynamic} core::int;
+          core::print(i);
+        }
+      }
+    finally
+      if(!(:for-iterator.{asy::_StreamIterator::_subscription}{asy::StreamSubscription<dynamic>?} == null))
+        await :for-iterator.{asy::_StreamIterator::cancel}(){() → asy::Future<dynamic>};
+  }
+}
diff --git a/pkg/front_end/testcases/general/for_in_dynamic.dart.textual_outline.expect b/pkg/front_end/testcases/general/for_in_dynamic.dart.textual_outline.expect
new file mode 100644
index 0000000..6f8cb3c
--- /dev/null
+++ b/pkg/front_end/testcases/general/for_in_dynamic.dart.textual_outline.expect
@@ -0,0 +1,7 @@
+List makeList(List list) => list;
+
+Stream makeStream(List list) async* {}
+
+test() async {}
+
+main() async {}
diff --git a/pkg/front_end/testcases/general/for_in_dynamic.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/general/for_in_dynamic.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..174b0e3
--- /dev/null
+++ b/pkg/front_end/testcases/general/for_in_dynamic.dart.textual_outline_modelled.expect
@@ -0,0 +1,7 @@
+List makeList(List list) => list;
+
+Stream makeStream(List list) async* {}
+
+main() async {}
+
+test() async {}
diff --git a/pkg/front_end/testcases/general/for_in_function.dart b/pkg/front_end/testcases/general/for_in_function.dart
new file mode 100644
index 0000000..df2ff20
--- /dev/null
+++ b/pkg/front_end/testcases/general/for_in_function.dart
@@ -0,0 +1,15 @@
+// Copyright (c) 2026, 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.
+
+main() {
+  for (void Function() e in <A>[A()]) {
+    e();
+  }
+}
+
+class A {
+  void call() {
+    print('A');
+  }
+}
diff --git a/pkg/front_end/testcases/general/for_in_function.dart.strong.expect b/pkg/front_end/testcases/general/for_in_function.dart.strong.expect
new file mode 100644
index 0000000..36f073f
--- /dev/null
+++ b/pkg/front_end/testcases/general/for_in_function.dart.strong.expect
@@ -0,0 +1,18 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  synthetic constructor •() → self::A
+    : super core::Object::•()
+    ;
+  method call() → void {
+    core::print("A");
+  }
+}
+static method main() → dynamic {
+  for (final self::A #t1 in <self::A>[new self::A::•()]) {
+    () → void e = let final self::A #t2 = #t1 in #t2 == null ?{() → void} null : #t2.{self::A::call}{() → void};
+    e(){() → void};
+  }
+}
diff --git a/pkg/front_end/testcases/general/for_in_function.dart.strong.modular.expect b/pkg/front_end/testcases/general/for_in_function.dart.strong.modular.expect
new file mode 100644
index 0000000..36f073f
--- /dev/null
+++ b/pkg/front_end/testcases/general/for_in_function.dart.strong.modular.expect
@@ -0,0 +1,18 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  synthetic constructor •() → self::A
+    : super core::Object::•()
+    ;
+  method call() → void {
+    core::print("A");
+  }
+}
+static method main() → dynamic {
+  for (final self::A #t1 in <self::A>[new self::A::•()]) {
+    () → void e = let final self::A #t2 = #t1 in #t2 == null ?{() → void} null : #t2.{self::A::call}{() → void};
+    e(){() → void};
+  }
+}
diff --git a/pkg/front_end/testcases/general/for_in_function.dart.strong.outline.expect b/pkg/front_end/testcases/general/for_in_function.dart.strong.outline.expect
new file mode 100644
index 0000000..02f0ca1
--- /dev/null
+++ b/pkg/front_end/testcases/general/for_in_function.dart.strong.outline.expect
@@ -0,0 +1,12 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  synthetic constructor •() → self::A
+    ;
+  method call() → void
+    ;
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/general/for_in_function.dart.strong.transformed.expect b/pkg/front_end/testcases/general/for_in_function.dart.strong.transformed.expect
new file mode 100644
index 0000000..a49ebff
--- /dev/null
+++ b/pkg/front_end/testcases/general/for_in_function.dart.strong.transformed.expect
@@ -0,0 +1,24 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  synthetic constructor •() → self::A
+    : super core::Object::•()
+    ;
+  method call() → void {
+    core::print("A");
+  }
+}
+static method main() → dynamic {
+  {
+    synthesized core::Iterator<self::A> :sync-for-iterator = core::_GrowableList::_literal1<self::A>(new self::A::•()).{core::Iterable::iterator}{core::Iterator<self::A>};
+    for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
+      final self::A #t1 = :sync-for-iterator.{core::Iterator::current}{self::A};
+      {
+        () → void e = let final self::A #t2 = #t1 in #t2 == null ?{() → void} null : #t2.{self::A::call}{() → void};
+        e(){() → void};
+      }
+    }
+  }
+}
diff --git a/pkg/front_end/testcases/general/for_in_function.dart.textual_outline.expect b/pkg/front_end/testcases/general/for_in_function.dart.textual_outline.expect
new file mode 100644
index 0000000..7aa25e4
--- /dev/null
+++ b/pkg/front_end/testcases/general/for_in_function.dart.textual_outline.expect
@@ -0,0 +1,5 @@
+main() {}
+
+class A {
+  void call() {}
+}
diff --git a/pkg/front_end/testcases/general/for_in_function.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/general/for_in_function.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..c90fd03
--- /dev/null
+++ b/pkg/front_end/testcases/general/for_in_function.dart.textual_outline_modelled.expect
@@ -0,0 +1,5 @@
+class A {
+  void call() {}
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/general/for_in_promotion.dart b/pkg/front_end/testcases/general/for_in_promotion.dart
new file mode 100644
index 0000000..238bbc1
--- /dev/null
+++ b/pkg/front_end/testcases/general/for_in_promotion.dart
@@ -0,0 +1,19 @@
+// Copyright (c) 2026, 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.
+
+// Derived from co19/TypeSystem/flow-analysis/reachability_for_in_A02_t07
+
+test(int? n) {
+  if (n != null) /* n promoted to `int` */ {
+    for (n in [42]) /* n is not promoted not demoted here */ {
+      n.isEven; // n is still `int`
+    }
+    n.isEven;
+  }
+}
+
+main() {
+  test(42);
+  test(null);
+}
diff --git a/pkg/front_end/testcases/general/for_in_promotion.dart.strong.expect b/pkg/front_end/testcases/general/for_in_promotion.dart.strong.expect
new file mode 100644
index 0000000..6ced453
--- /dev/null
+++ b/pkg/front_end/testcases/general/for_in_promotion.dart.strong.expect
@@ -0,0 +1,17 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+static method test(core::int? n) → dynamic {
+  if(!(n == null)) {
+    for (final core::int #t1 in <core::int>[42]) {
+      n = #t1;
+      n{core::int}.{core::int::isEven}{core::bool};
+    }
+    n{core::int}.{core::int::isEven}{core::bool};
+  }
+}
+static method main() → dynamic {
+  self::test(42);
+  self::test(null);
+}
diff --git a/pkg/front_end/testcases/general/for_in_promotion.dart.strong.modular.expect b/pkg/front_end/testcases/general/for_in_promotion.dart.strong.modular.expect
new file mode 100644
index 0000000..6ced453
--- /dev/null
+++ b/pkg/front_end/testcases/general/for_in_promotion.dart.strong.modular.expect
@@ -0,0 +1,17 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+static method test(core::int? n) → dynamic {
+  if(!(n == null)) {
+    for (final core::int #t1 in <core::int>[42]) {
+      n = #t1;
+      n{core::int}.{core::int::isEven}{core::bool};
+    }
+    n{core::int}.{core::int::isEven}{core::bool};
+  }
+}
+static method main() → dynamic {
+  self::test(42);
+  self::test(null);
+}
diff --git a/pkg/front_end/testcases/general/for_in_promotion.dart.strong.outline.expect b/pkg/front_end/testcases/general/for_in_promotion.dart.strong.outline.expect
new file mode 100644
index 0000000..27fdb51
--- /dev/null
+++ b/pkg/front_end/testcases/general/for_in_promotion.dart.strong.outline.expect
@@ -0,0 +1,8 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+static method test(core::int? n) → dynamic
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/general/for_in_promotion.dart.strong.transformed.expect b/pkg/front_end/testcases/general/for_in_promotion.dart.strong.transformed.expect
new file mode 100644
index 0000000..82d3a49
--- /dev/null
+++ b/pkg/front_end/testcases/general/for_in_promotion.dart.strong.transformed.expect
@@ -0,0 +1,23 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+static method test(core::int? n) → dynamic {
+  if(!(n == null)) {
+    {
+      synthesized core::Iterator<core::int> :sync-for-iterator = core::_GrowableList::_literal1<core::int>(42).{core::Iterable::iterator}{core::Iterator<core::int>};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
+        final core::int #t1 = :sync-for-iterator.{core::Iterator::current}{core::int};
+        {
+          n = #t1;
+          n{core::int}.{core::int::isEven}{core::bool};
+        }
+      }
+    }
+    n{core::int}.{core::int::isEven}{core::bool};
+  }
+}
+static method main() → dynamic {
+  self::test(42);
+  self::test(null);
+}
diff --git a/pkg/front_end/testcases/general/for_in_promotion.dart.textual_outline.expect b/pkg/front_end/testcases/general/for_in_promotion.dart.textual_outline.expect
new file mode 100644
index 0000000..7309249
--- /dev/null
+++ b/pkg/front_end/testcases/general/for_in_promotion.dart.textual_outline.expect
@@ -0,0 +1,3 @@
+test(int? n) {}
+
+main() {}
diff --git a/pkg/front_end/testcases/general/for_in_promotion.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/general/for_in_promotion.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..15c22bd
--- /dev/null
+++ b/pkg/front_end/testcases/general/for_in_promotion.dart.textual_outline_modelled.expect
@@ -0,0 +1,3 @@
+main() {}
+
+test(int? n) {}
diff --git a/pkg/front_end/testcases/general/for_in_variable_initializer.dart b/pkg/front_end/testcases/general/for_in_variable_initializer.dart
new file mode 100644
index 0000000..befa51f
--- /dev/null
+++ b/pkg/front_end/testcases/general/for_in_variable_initializer.dart
@@ -0,0 +1,7 @@
+// Copyright (c) 2026, 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() {
+  for (var l = 1 in List.filled(100, 0)) break;
+}
diff --git a/pkg/front_end/testcases/general/for_in_variable_initializer.dart.strong.expect b/pkg/front_end/testcases/general/for_in_variable_initializer.dart.strong.expect
new file mode 100644
index 0000000..3b932fa
--- /dev/null
+++ b/pkg/front_end/testcases/general/for_in_variable_initializer.dart.strong.expect
@@ -0,0 +1,17 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/for_in_variable_initializer.dart:6:14: Error: The loop variable in a for-each loop can't be initialized.
+// Try removing the initializer, or using a different kind of loop.
+//   for (var l = 1 in List.filled(100, 0)) break;
+//              ^
+//
+import self as self;
+import "dart:core" as core;
+
+static method test() → dynamic {
+  #L1:
+  for (core::int l in core::List::filled<core::int>(100, 0))
+    break #L1;
+}
diff --git a/pkg/front_end/testcases/general/for_in_variable_initializer.dart.strong.modular.expect b/pkg/front_end/testcases/general/for_in_variable_initializer.dart.strong.modular.expect
new file mode 100644
index 0000000..3b932fa
--- /dev/null
+++ b/pkg/front_end/testcases/general/for_in_variable_initializer.dart.strong.modular.expect
@@ -0,0 +1,17 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/for_in_variable_initializer.dart:6:14: Error: The loop variable in a for-each loop can't be initialized.
+// Try removing the initializer, or using a different kind of loop.
+//   for (var l = 1 in List.filled(100, 0)) break;
+//              ^
+//
+import self as self;
+import "dart:core" as core;
+
+static method test() → dynamic {
+  #L1:
+  for (core::int l in core::List::filled<core::int>(100, 0))
+    break #L1;
+}
diff --git a/pkg/front_end/testcases/general/for_in_variable_initializer.dart.strong.outline.expect b/pkg/front_end/testcases/general/for_in_variable_initializer.dart.strong.outline.expect
new file mode 100644
index 0000000..531df3f
--- /dev/null
+++ b/pkg/front_end/testcases/general/for_in_variable_initializer.dart.strong.outline.expect
@@ -0,0 +1,5 @@
+library;
+import self as self;
+
+static method test() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/general/for_in_variable_initializer.dart.strong.transformed.expect b/pkg/front_end/testcases/general/for_in_variable_initializer.dart.strong.transformed.expect
new file mode 100644
index 0000000..52c96bd
--- /dev/null
+++ b/pkg/front_end/testcases/general/for_in_variable_initializer.dart.strong.transformed.expect
@@ -0,0 +1,22 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/for_in_variable_initializer.dart:6:14: Error: The loop variable in a for-each loop can't be initialized.
+// Try removing the initializer, or using a different kind of loop.
+//   for (var l = 1 in List.filled(100, 0)) break;
+//              ^
+//
+import self as self;
+import "dart:core" as core;
+
+static method test() → dynamic {
+  #L1:
+  {
+    synthesized core::Iterator<core::int> :sync-for-iterator = core::_List::filled<core::int>(100, 0).{core::Iterable::iterator}{core::Iterator<core::int>};
+    for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
+      core::int l = :sync-for-iterator.{core::Iterator::current}{core::int};
+      break #L1;
+    }
+  }
+}
diff --git a/pkg/front_end/testcases/general/for_in_variable_initializer.dart.textual_outline.expect b/pkg/front_end/testcases/general/for_in_variable_initializer.dart.textual_outline.expect
new file mode 100644
index 0000000..a9f9e5f
--- /dev/null
+++ b/pkg/front_end/testcases/general/for_in_variable_initializer.dart.textual_outline.expect
@@ -0,0 +1 @@
+test() {}
diff --git a/pkg/front_end/testcases/general/for_in_variable_initializer.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/general/for_in_variable_initializer.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..a9f9e5f
--- /dev/null
+++ b/pkg/front_end/testcases/general/for_in_variable_initializer.dart.textual_outline_modelled.expect
@@ -0,0 +1 @@
+test() {}
diff --git a/pkg/front_end/testcases/general/for_in_without_declaration.dart.strong.expect b/pkg/front_end/testcases/general/for_in_without_declaration.dart.strong.expect
index 1c052f3..6971d23 100644
--- a/pkg/front_end/testcases/general/for_in_without_declaration.dart.strong.expect
+++ b/pkg/front_end/testcases/general/for_in_without_declaration.dart.strong.expect
@@ -54,18 +54,6 @@
 //     for (unresolved in []) {}
 //          ^^^^^^^^^^
 //
-// pkg/front_end/testcases/general/for_in_without_declaration.dart:38:10: Error: The getter 'unresolved' isn't defined for the type 'C'.
-//  - 'C' is from 'pkg/front_end/testcases/general/for_in_without_declaration.dart'.
-// Try correcting the name to the name of an existing getter, or defining a getter or field named 'unresolved'.
-//     for (unresolved.foo in []) {}
-//          ^^^^^^^^^^
-//
-// pkg/front_end/testcases/general/for_in_without_declaration.dart:39:12: Error: The setter 'unresolved' isn't defined for the type 'C'.
-//  - 'C' is from 'pkg/front_end/testcases/general/for_in_without_declaration.dart'.
-// Try correcting the name to the name of an existing setter, or defining a setter or field named 'unresolved'.
-//     for (c.unresolved in []) {}
-//            ^^^^^^^^^^
-//
 import self as self;
 import "dart:core" as core;
 
@@ -111,56 +99,55 @@
     for (final dynamic #t8 in <dynamic>[]) {
       self::untypedTopLevelField = #t8;
     }
-    for (final core::int #t9 in <core::int>[]) {
-      super.{self::Super::superInstanceField} = #t9;
+    for (final dynamic #t9 in <dynamic>[]) {
+      invalid-expression "pkg/front_end/testcases/general/for_in_without_declaration.dart:32:16: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+    for (super.superInstanceField in []) {}
+               ^";
     }
     for (final dynamic #t10 in <dynamic>[]) {
-      super.{self::Super::untypedSuperInstanceField} = #t10;
+      invalid-expression "pkg/front_end/testcases/general/for_in_without_declaration.dart:33:16: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+    for (super.untypedSuperInstanceField in []) {}
+               ^";
     }
     self::C c = new self::C::•();
-    for (final core::int #t11 in <core::int>[]) {
-      c.{self::C::instanceField} = #t11;
+    for (final dynamic #t11 in <dynamic>[]) {
+      invalid-expression "pkg/front_end/testcases/general/for_in_without_declaration.dart:35:12: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+    for (c.instanceField in []) {}
+           ^";
     }
     for (final dynamic #t12 in <dynamic>[]) {
-      c.{self::Super::untypedSuperInstanceField} = #t12;
+      invalid-expression "pkg/front_end/testcases/general/for_in_without_declaration.dart:36:12: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+    for (c.untypedSuperInstanceField in []) {}
+           ^";
     }
     for (final dynamic #t13 in <dynamic>[]) {
       invalid-expression "pkg/front_end/testcases/general/for_in_without_declaration.dart:37:10: Error: The setter 'unresolved' isn't defined for the type 'C'.
  - 'C' is from 'pkg/front_end/testcases/general/for_in_without_declaration.dart'.
 Try correcting the name to the name of an existing setter, or defining a setter or field named 'unresolved'.
     for (unresolved in []) {}
-         ^^^^^^^^^^" in this.{<unresolved>}unresolved = invalid-expression "pkg/front_end/testcases/general/for_in_without_declaration.dart:37:10: Error: The setter 'unresolved' isn't defined for the type 'C'.
- - 'C' is from 'pkg/front_end/testcases/general/for_in_without_declaration.dart'.
-Try correcting the name to the name of an existing setter, or defining a setter or field named 'unresolved'.
-    for (unresolved in []) {}
-         ^^^^^^^^^^";
+         ^^^^^^^^^^" in this.{<unresolved>}unresolved = #t13;
     }
     for (final dynamic #t14 in <dynamic>[]) {
-      invalid-expression "pkg/front_end/testcases/general/for_in_without_declaration.dart:38:10: Error: The getter 'unresolved' isn't defined for the type 'C'.
- - 'C' is from 'pkg/front_end/testcases/general/for_in_without_declaration.dart'.
-Try correcting the name to the name of an existing getter, or defining a getter or field named 'unresolved'.
+      invalid-expression "pkg/front_end/testcases/general/for_in_without_declaration.dart:38:21: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
     for (unresolved.foo in []) {}
-         ^^^^^^^^^^" in this{<unresolved>}.unresolved.{<invalid>}foo = #t14;
+                    ^";
     }
     for (final dynamic #t15 in <dynamic>[]) {
-      invalid-expression "pkg/front_end/testcases/general/for_in_without_declaration.dart:39:12: Error: The setter 'unresolved' isn't defined for the type 'C'.
- - 'C' is from 'pkg/front_end/testcases/general/for_in_without_declaration.dart'.
-Try correcting the name to the name of an existing setter, or defining a setter or field named 'unresolved'.
+      invalid-expression "pkg/front_end/testcases/general/for_in_without_declaration.dart:39:12: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
     for (c.unresolved in []) {}
-           ^^^^^^^^^^" in c.{<unresolved>}unresolved = invalid-expression "pkg/front_end/testcases/general/for_in_without_declaration.dart:39:12: Error: The setter 'unresolved' isn't defined for the type 'C'.
- - 'C' is from 'pkg/front_end/testcases/general/for_in_without_declaration.dart'.
-Try correcting the name to the name of an existing setter, or defining a setter or field named 'unresolved'.
-    for (c.unresolved in []) {}
-           ^^^^^^^^^^";
+           ^";
     }
     {
       invalid-expression "pkg/front_end/testcases/general/for_in_without_declaration.dart:40:10: Error: Can't assign to this, so it can't be used in a for-in loop.
     for (main() in []) {}
          ^^^^";
       for (final dynamic #t16 in <dynamic>[]) {
-        invalid-expression "pkg/front_end/testcases/general/for_in_without_declaration.dart:40:10: Error: Can't assign to this, so it can't be used in a for-in loop.
-    for (main() in []) {}
-         ^^^^";
         self::main();
       }
     }
@@ -169,9 +156,6 @@
     for (var x, y in <int>[]) {
          ^^^";
       for (final core::int #t17 in <core::int>[]) {
-        invalid-expression "pkg/front_end/testcases/general/for_in_without_declaration.dart:41:10: Error: A for-in loop can't have more than one loop variable.
-    for (var x, y in <int>[]) {
-         ^^^";
         dynamic x;
         dynamic y;
         core::print(x);
diff --git a/pkg/front_end/testcases/general/for_in_without_declaration.dart.strong.modular.expect b/pkg/front_end/testcases/general/for_in_without_declaration.dart.strong.modular.expect
index 1c052f3..6971d23 100644
--- a/pkg/front_end/testcases/general/for_in_without_declaration.dart.strong.modular.expect
+++ b/pkg/front_end/testcases/general/for_in_without_declaration.dart.strong.modular.expect
@@ -54,18 +54,6 @@
 //     for (unresolved in []) {}
 //          ^^^^^^^^^^
 //
-// pkg/front_end/testcases/general/for_in_without_declaration.dart:38:10: Error: The getter 'unresolved' isn't defined for the type 'C'.
-//  - 'C' is from 'pkg/front_end/testcases/general/for_in_without_declaration.dart'.
-// Try correcting the name to the name of an existing getter, or defining a getter or field named 'unresolved'.
-//     for (unresolved.foo in []) {}
-//          ^^^^^^^^^^
-//
-// pkg/front_end/testcases/general/for_in_without_declaration.dart:39:12: Error: The setter 'unresolved' isn't defined for the type 'C'.
-//  - 'C' is from 'pkg/front_end/testcases/general/for_in_without_declaration.dart'.
-// Try correcting the name to the name of an existing setter, or defining a setter or field named 'unresolved'.
-//     for (c.unresolved in []) {}
-//            ^^^^^^^^^^
-//
 import self as self;
 import "dart:core" as core;
 
@@ -111,56 +99,55 @@
     for (final dynamic #t8 in <dynamic>[]) {
       self::untypedTopLevelField = #t8;
     }
-    for (final core::int #t9 in <core::int>[]) {
-      super.{self::Super::superInstanceField} = #t9;
+    for (final dynamic #t9 in <dynamic>[]) {
+      invalid-expression "pkg/front_end/testcases/general/for_in_without_declaration.dart:32:16: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+    for (super.superInstanceField in []) {}
+               ^";
     }
     for (final dynamic #t10 in <dynamic>[]) {
-      super.{self::Super::untypedSuperInstanceField} = #t10;
+      invalid-expression "pkg/front_end/testcases/general/for_in_without_declaration.dart:33:16: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+    for (super.untypedSuperInstanceField in []) {}
+               ^";
     }
     self::C c = new self::C::•();
-    for (final core::int #t11 in <core::int>[]) {
-      c.{self::C::instanceField} = #t11;
+    for (final dynamic #t11 in <dynamic>[]) {
+      invalid-expression "pkg/front_end/testcases/general/for_in_without_declaration.dart:35:12: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+    for (c.instanceField in []) {}
+           ^";
     }
     for (final dynamic #t12 in <dynamic>[]) {
-      c.{self::Super::untypedSuperInstanceField} = #t12;
+      invalid-expression "pkg/front_end/testcases/general/for_in_without_declaration.dart:36:12: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+    for (c.untypedSuperInstanceField in []) {}
+           ^";
     }
     for (final dynamic #t13 in <dynamic>[]) {
       invalid-expression "pkg/front_end/testcases/general/for_in_without_declaration.dart:37:10: Error: The setter 'unresolved' isn't defined for the type 'C'.
  - 'C' is from 'pkg/front_end/testcases/general/for_in_without_declaration.dart'.
 Try correcting the name to the name of an existing setter, or defining a setter or field named 'unresolved'.
     for (unresolved in []) {}
-         ^^^^^^^^^^" in this.{<unresolved>}unresolved = invalid-expression "pkg/front_end/testcases/general/for_in_without_declaration.dart:37:10: Error: The setter 'unresolved' isn't defined for the type 'C'.
- - 'C' is from 'pkg/front_end/testcases/general/for_in_without_declaration.dart'.
-Try correcting the name to the name of an existing setter, or defining a setter or field named 'unresolved'.
-    for (unresolved in []) {}
-         ^^^^^^^^^^";
+         ^^^^^^^^^^" in this.{<unresolved>}unresolved = #t13;
     }
     for (final dynamic #t14 in <dynamic>[]) {
-      invalid-expression "pkg/front_end/testcases/general/for_in_without_declaration.dart:38:10: Error: The getter 'unresolved' isn't defined for the type 'C'.
- - 'C' is from 'pkg/front_end/testcases/general/for_in_without_declaration.dart'.
-Try correcting the name to the name of an existing getter, or defining a getter or field named 'unresolved'.
+      invalid-expression "pkg/front_end/testcases/general/for_in_without_declaration.dart:38:21: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
     for (unresolved.foo in []) {}
-         ^^^^^^^^^^" in this{<unresolved>}.unresolved.{<invalid>}foo = #t14;
+                    ^";
     }
     for (final dynamic #t15 in <dynamic>[]) {
-      invalid-expression "pkg/front_end/testcases/general/for_in_without_declaration.dart:39:12: Error: The setter 'unresolved' isn't defined for the type 'C'.
- - 'C' is from 'pkg/front_end/testcases/general/for_in_without_declaration.dart'.
-Try correcting the name to the name of an existing setter, or defining a setter or field named 'unresolved'.
+      invalid-expression "pkg/front_end/testcases/general/for_in_without_declaration.dart:39:12: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
     for (c.unresolved in []) {}
-           ^^^^^^^^^^" in c.{<unresolved>}unresolved = invalid-expression "pkg/front_end/testcases/general/for_in_without_declaration.dart:39:12: Error: The setter 'unresolved' isn't defined for the type 'C'.
- - 'C' is from 'pkg/front_end/testcases/general/for_in_without_declaration.dart'.
-Try correcting the name to the name of an existing setter, or defining a setter or field named 'unresolved'.
-    for (c.unresolved in []) {}
-           ^^^^^^^^^^";
+           ^";
     }
     {
       invalid-expression "pkg/front_end/testcases/general/for_in_without_declaration.dart:40:10: Error: Can't assign to this, so it can't be used in a for-in loop.
     for (main() in []) {}
          ^^^^";
       for (final dynamic #t16 in <dynamic>[]) {
-        invalid-expression "pkg/front_end/testcases/general/for_in_without_declaration.dart:40:10: Error: Can't assign to this, so it can't be used in a for-in loop.
-    for (main() in []) {}
-         ^^^^";
         self::main();
       }
     }
@@ -169,9 +156,6 @@
     for (var x, y in <int>[]) {
          ^^^";
       for (final core::int #t17 in <core::int>[]) {
-        invalid-expression "pkg/front_end/testcases/general/for_in_without_declaration.dart:41:10: Error: A for-in loop can't have more than one loop variable.
-    for (var x, y in <int>[]) {
-         ^^^";
         dynamic x;
         dynamic y;
         core::print(x);
diff --git a/pkg/front_end/testcases/general/for_in_without_declaration.dart.strong.transformed.expect b/pkg/front_end/testcases/general/for_in_without_declaration.dart.strong.transformed.expect
index 95967df..7476f9b 100644
--- a/pkg/front_end/testcases/general/for_in_without_declaration.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/for_in_without_declaration.dart.strong.transformed.expect
@@ -54,18 +54,6 @@
 //     for (unresolved in []) {}
 //          ^^^^^^^^^^
 //
-// pkg/front_end/testcases/general/for_in_without_declaration.dart:38:10: Error: The getter 'unresolved' isn't defined for the type 'C'.
-//  - 'C' is from 'pkg/front_end/testcases/general/for_in_without_declaration.dart'.
-// Try correcting the name to the name of an existing getter, or defining a getter or field named 'unresolved'.
-//     for (unresolved.foo in []) {}
-//          ^^^^^^^^^^
-//
-// pkg/front_end/testcases/general/for_in_without_declaration.dart:39:12: Error: The setter 'unresolved' isn't defined for the type 'C'.
-//  - 'C' is from 'pkg/front_end/testcases/general/for_in_without_declaration.dart'.
-// Try correcting the name to the name of an existing setter, or defining a setter or field named 'unresolved'.
-//     for (c.unresolved in []) {}
-//            ^^^^^^^^^^
-//
 import self as self;
 import "dart:core" as core;
 
@@ -160,11 +148,14 @@
       }
     }
     {
-      synthesized core::Iterator<core::int> :sync-for-iterator = core::_GrowableList::•<core::int>(0).{core::Iterable::iterator}{core::Iterator<core::int>};
+      synthesized core::Iterator<dynamic> :sync-for-iterator = core::_GrowableList::•<dynamic>(0).{core::Iterable::iterator}{core::Iterator<dynamic>};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
-        final core::int #t9 = :sync-for-iterator.{core::Iterator::current}{core::int};
+        final dynamic #t9 = :sync-for-iterator.{core::Iterator::current}{dynamic};
         {
-          super.{self::Super::superInstanceField} = #t9;
+          invalid-expression "pkg/front_end/testcases/general/for_in_without_declaration.dart:32:16: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+    for (super.superInstanceField in []) {}
+               ^";
         }
       }
     }
@@ -173,17 +164,23 @@
       for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
         final dynamic #t10 = :sync-for-iterator.{core::Iterator::current}{dynamic};
         {
-          super.{self::Super::untypedSuperInstanceField} = #t10;
+          invalid-expression "pkg/front_end/testcases/general/for_in_without_declaration.dart:33:16: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+    for (super.untypedSuperInstanceField in []) {}
+               ^";
         }
       }
     }
     self::C c = new self::C::•();
     {
-      synthesized core::Iterator<core::int> :sync-for-iterator = core::_GrowableList::•<core::int>(0).{core::Iterable::iterator}{core::Iterator<core::int>};
+      synthesized core::Iterator<dynamic> :sync-for-iterator = core::_GrowableList::•<dynamic>(0).{core::Iterable::iterator}{core::Iterator<dynamic>};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
-        final core::int #t11 = :sync-for-iterator.{core::Iterator::current}{core::int};
+        final dynamic #t11 = :sync-for-iterator.{core::Iterator::current}{dynamic};
         {
-          c.{self::C::instanceField} = #t11;
+          invalid-expression "pkg/front_end/testcases/general/for_in_without_declaration.dart:35:12: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+    for (c.instanceField in []) {}
+           ^";
         }
       }
     }
@@ -192,7 +189,10 @@
       for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
         final dynamic #t12 = :sync-for-iterator.{core::Iterator::current}{dynamic};
         {
-          c.{self::Super::untypedSuperInstanceField} = #t12;
+          invalid-expression "pkg/front_end/testcases/general/for_in_without_declaration.dart:36:12: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
+    for (c.untypedSuperInstanceField in []) {}
+           ^";
         }
       }
     }
@@ -205,11 +205,7 @@
  - 'C' is from 'pkg/front_end/testcases/general/for_in_without_declaration.dart'.
 Try correcting the name to the name of an existing setter, or defining a setter or field named 'unresolved'.
     for (unresolved in []) {}
-         ^^^^^^^^^^" in this.{<unresolved>}unresolved = invalid-expression "pkg/front_end/testcases/general/for_in_without_declaration.dart:37:10: Error: The setter 'unresolved' isn't defined for the type 'C'.
- - 'C' is from 'pkg/front_end/testcases/general/for_in_without_declaration.dart'.
-Try correcting the name to the name of an existing setter, or defining a setter or field named 'unresolved'.
-    for (unresolved in []) {}
-         ^^^^^^^^^^";
+         ^^^^^^^^^^" in this.{<unresolved>}unresolved = #t13;
         }
       }
     }
@@ -218,11 +214,10 @@
       for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
         final dynamic #t14 = :sync-for-iterator.{core::Iterator::current}{dynamic};
         {
-          invalid-expression "pkg/front_end/testcases/general/for_in_without_declaration.dart:38:10: Error: The getter 'unresolved' isn't defined for the type 'C'.
- - 'C' is from 'pkg/front_end/testcases/general/for_in_without_declaration.dart'.
-Try correcting the name to the name of an existing getter, or defining a getter or field named 'unresolved'.
+          invalid-expression "pkg/front_end/testcases/general/for_in_without_declaration.dart:38:21: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
     for (unresolved.foo in []) {}
-         ^^^^^^^^^^" in this{<unresolved>}.unresolved.{<invalid>}foo = #t14;
+                    ^";
         }
       }
     }
@@ -231,15 +226,10 @@
       for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
         final dynamic #t15 = :sync-for-iterator.{core::Iterator::current}{dynamic};
         {
-          invalid-expression "pkg/front_end/testcases/general/for_in_without_declaration.dart:39:12: Error: The setter 'unresolved' isn't defined for the type 'C'.
- - 'C' is from 'pkg/front_end/testcases/general/for_in_without_declaration.dart'.
-Try correcting the name to the name of an existing setter, or defining a setter or field named 'unresolved'.
+          invalid-expression "pkg/front_end/testcases/general/for_in_without_declaration.dart:39:12: Error: The element in a for-in loop must be an identifier or a local variable declaration.
+Try using an existing variable or a variable declaration.
     for (c.unresolved in []) {}
-           ^^^^^^^^^^" in c.{<unresolved>}unresolved = invalid-expression "pkg/front_end/testcases/general/for_in_without_declaration.dart:39:12: Error: The setter 'unresolved' isn't defined for the type 'C'.
- - 'C' is from 'pkg/front_end/testcases/general/for_in_without_declaration.dart'.
-Try correcting the name to the name of an existing setter, or defining a setter or field named 'unresolved'.
-    for (c.unresolved in []) {}
-           ^^^^^^^^^^";
+           ^";
         }
       }
     }
@@ -252,9 +242,6 @@
         for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
           final dynamic #t16 = :sync-for-iterator.{core::Iterator::current}{dynamic};
           {
-            invalid-expression "pkg/front_end/testcases/general/for_in_without_declaration.dart:40:10: Error: Can't assign to this, so it can't be used in a for-in loop.
-    for (main() in []) {}
-         ^^^^";
             self::main();
           }
         }
@@ -269,9 +256,6 @@
         for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
           final core::int #t17 = :sync-for-iterator.{core::Iterator::current}{core::int};
           {
-            invalid-expression "pkg/front_end/testcases/general/for_in_without_declaration.dart:41:10: Error: A for-in loop can't have more than one loop variable.
-    for (var x, y in <int>[]) {
-         ^^^";
             dynamic x;
             dynamic y;
             core::print(x);
diff --git a/pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart.strong.expect b/pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart.strong.expect
index a9668e7..64ca079 100644
--- a/pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart.strong.expect
+++ b/pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart.strong.expect
@@ -4,13 +4,11 @@
 //
 // pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart:20:10: Error: A value of type 'B' can't be assigned to a variable of type 'int'.
 //  - 'B' is from 'pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart'.
-// Try changing the type of the variable.
 //   for (i in iterable) {}
 //          ^
 //
 // pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart:21:16: Error: A value of type 'B' can't be assigned to a variable of type 'int'.
 //  - 'B' is from 'pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart'.
-// Try changing the type of the variable.
 //   await for (i in stream) {}
 //                ^
 //
@@ -48,14 +46,12 @@
   for (final self::B #t5 in iterable) {
     i = invalid-expression "pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart:20:10: Error: A value of type 'B' can't be assigned to a variable of type 'int'.
  - 'B' is from 'pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart'.
-Try changing the type of the variable.
   for (i in iterable) {}
          ^" in #t5 as{TypeError} core::int;
   }
   await for (final self::B #t6 in stream) {
     i = invalid-expression "pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart:21:16: Error: A value of type 'B' can't be assigned to a variable of type 'int'.
  - 'B' is from 'pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart'.
-Try changing the type of the variable.
   await for (i in stream) {}
                ^" in #t6 as{TypeError} core::int;
   }
diff --git a/pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart.strong.modular.expect b/pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart.strong.modular.expect
index a9668e7..64ca079 100644
--- a/pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart.strong.modular.expect
+++ b/pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart.strong.modular.expect
@@ -4,13 +4,11 @@
 //
 // pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart:20:10: Error: A value of type 'B' can't be assigned to a variable of type 'int'.
 //  - 'B' is from 'pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart'.
-// Try changing the type of the variable.
 //   for (i in iterable) {}
 //          ^
 //
 // pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart:21:16: Error: A value of type 'B' can't be assigned to a variable of type 'int'.
 //  - 'B' is from 'pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart'.
-// Try changing the type of the variable.
 //   await for (i in stream) {}
 //                ^
 //
@@ -48,14 +46,12 @@
   for (final self::B #t5 in iterable) {
     i = invalid-expression "pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart:20:10: Error: A value of type 'B' can't be assigned to a variable of type 'int'.
  - 'B' is from 'pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart'.
-Try changing the type of the variable.
   for (i in iterable) {}
          ^" in #t5 as{TypeError} core::int;
   }
   await for (final self::B #t6 in stream) {
     i = invalid-expression "pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart:21:16: Error: A value of type 'B' can't be assigned to a variable of type 'int'.
  - 'B' is from 'pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart'.
-Try changing the type of the variable.
   await for (i in stream) {}
                ^" in #t6 as{TypeError} core::int;
   }
diff --git a/pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart.strong.transformed.expect b/pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart.strong.transformed.expect
index 23fdb79..949f430 100644
--- a/pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart.strong.transformed.expect
@@ -4,13 +4,11 @@
 //
 // pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart:20:10: Error: A value of type 'B' can't be assigned to a variable of type 'int'.
 //  - 'B' is from 'pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart'.
-// Try changing the type of the variable.
 //   for (i in iterable) {}
 //          ^
 //
 // pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart:21:16: Error: A value of type 'B' can't be assigned to a variable of type 'int'.
 //  - 'B' is from 'pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart'.
-// Try changing the type of the variable.
 //   await for (i in stream) {}
 //                ^
 //
@@ -86,7 +84,6 @@
       {
         i = invalid-expression "pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart:20:10: Error: A value of type 'B' can't be assigned to a variable of type 'int'.
  - 'B' is from 'pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart'.
-Try changing the type of the variable.
   for (i in iterable) {}
          ^" in #t7 as{TypeError} core::int;
       }
@@ -101,7 +98,6 @@
         {
           i = invalid-expression "pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart:21:16: Error: A value of type 'B' can't be assigned to a variable of type 'int'.
  - 'B' is from 'pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart'.
-Try changing the type of the variable.
   await for (i in stream) {}
                ^" in #t9 as{TypeError} core::int;
         }
diff --git a/pkg/front_end/testcases/nnbd/null_shorting_explicit_extension.dart.strong.expect b/pkg/front_end/testcases/nnbd/null_shorting_explicit_extension.dart.strong.expect
index 0a3e160..23c8936 100644
--- a/pkg/front_end/testcases/nnbd/null_shorting_explicit_extension.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/null_shorting_explicit_extension.dart.strong.expect
@@ -135,9 +135,9 @@
   let final self::Class1? #t7 = n1 in #t7 == null ?{self::Class1?} null : self::Extension1|get#nullable1(self::Extension1|get#nonNullable1(#t7{self::Class1}));
   let final self::Class1? #t8 = n1 in #t8 == null ?{self::Class1?} null : let final self::Class1? #t9 = self::Extension1|get#nullable1(#t8{self::Class1}) in #t9 == null ?{self::Class1?} null : self::Extension1|get#nullable1(#t9{self::Class1});
   let final self::Class1? #t10 = n1 in #t10 == null ?{self::Class1?} null : let final self::Class1? #t11 = self::Extension1|get#nullable1(self::Extension1|get#nonNullable1(#t10{self::Class1})) in #t11 == null ?{self::Class1?} null : self::Extension1|get#nullable1(#t11{self::Class1});
-  let final self::Class1? #t12 = n1 in #t12 == null ?{void} null : self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t12{self::Class1}), new self::Class1::•());
-  let final self::Class1? #t13 = n1 in #t13 == null ?{void} null : let final self::Class1? #t14 = self::Extension1|get#nullable1(#t13{self::Class1}) in #t14 == null ?{void} null : self::Extension1|set#nullable1(#t14{self::Class1}, new self::Class1::•());
-  let final self::Class1? #t15 = n1 in #t15 == null ?{void} null : let final self::Class1? #t16 = self::Extension1|get#nullable1(self::Extension1|get#nonNullable1(#t15{self::Class1})) in #t16 == null ?{void} null : self::Extension1|set#nullable1(#t16{self::Class1}, new self::Class1::•());
+  let final self::Class1? #t12 = n1 in #t12 == null ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t12{self::Class1}), new self::Class1::•());
+  let final self::Class1? #t13 = n1 in #t13 == null ?{self::Class1?} null : let final self::Class1? #t14 = self::Extension1|get#nullable1(#t13{self::Class1}) in #t14 == null ?{self::Class1?} null : self::Extension1|set#nullable1(#t14{self::Class1}, new self::Class1::•());
+  let final self::Class1? #t15 = n1 in #t15 == null ?{self::Class1?} null : let final self::Class1? #t16 = self::Extension1|get#nullable1(self::Extension1|get#nonNullable1(#t15{self::Class1})) in #t16 == null ?{self::Class1?} null : self::Extension1|set#nullable1(#t16{self::Class1}, new self::Class1::•());
   let final self::Class1? #t17 = let final self::Class1? #t18 = n1 in #t18 == null ?{self::Class1?} null : self::Extension1|get#nullable1(#t18{self::Class1}) in #t17 == null ?{self::Class1?} null : self::Extension1|get#nullable1(#t17{self::Class1});
   self::throws(() → void => invalid-expression "pkg/front_end/testcases/nnbd/null_shorting_explicit_extension.dart:93:59: Error: Property 'nullable1' cannot be accessed on 'Class1?' because it is potentially null.
  - 'Class1' is from 'pkg/front_end/testcases/nnbd/null_shorting_explicit_extension.dart'.
@@ -160,10 +160,10 @@
   let final self::Class1? #t48 = n1 in #t48 == null ?{self::Class1?} null : self::Extension1|set#nullable1(#t48{self::Class1}, self::Extension1|nonNullable1Method(new self::Class1::•()));
   nullable1 = let final self::Class1? #t49 = n1 in #t49 == null ?{self::Class1?} null : let final self::Class1 #t50 = self::Extension1|nonNullable1Method(new self::Class1::•()) in let final void #t51 = self::Extension1|set#nullable1(#t49{self::Class1}, #t50) in #t50;
   let final self::Class1? #t52 = n1 in #t52 == null ?{self::Class1?} null : self::Extension1|get#nullable1(self::Extension1|nonNullable1Method(#t52{self::Class1}));
-  let final self::Class1? #t53 = n1 in #t53 == null ?{void} null : self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t53{self::Class1}), new self::Class1::•());
+  let final self::Class1? #t53 = n1 in #t53 == null ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t53{self::Class1}), new self::Class1::•());
   let final self::Class1? #t54 = n1 in #t54 == null ?{self::Class1?} null : self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(#t54{self::Class1}));
   let final self::Class1? #t55 = n1 in #t55 == null ?{self::Class1?} null : self::Extension1|get#nullable1(self::Extension1|get#nonNullable1(self::Extension1|get#nonNullable1(#t55{self::Class1})));
-  let final self::Class1? #t56 = n1 in #t56 == null ?{void} null : self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(self::Extension1|get#nonNullable1(#t56{self::Class1})), new self::Class1::•());
+  let final self::Class1? #t56 = n1 in #t56 == null ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(self::Extension1|get#nonNullable1(#t56{self::Class1})), new self::Class1::•());
   nullable1 = let final self::Class1? #t57 = n1 in #t57 == null ?{self::Class1?} null : let final self::Class1 #t58 = new self::Class1::•() in let final void #t59 = self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(self::Extension1|get#nonNullable1(#t57{self::Class1})), #t58) in #t58;
   let final self::Class1? #t60 = n1 in #t60 == null ?{self::Class1?} null : let final self::Class1? #t61 = self::Extension1|get#nullable1(self::Extension1|get#nonNullable1(#t60{self::Class1})) in #t61 == null ?{self::Class1?} null : self::Extension1|nonNullable1Method(#t61{self::Class1});
   let final self::Class1? #t62 = n1 in #t62 == null ?{self::Class1?} null : self::Extension1|set#nullable1(#t62{self::Class1}, self::Extension1|get#nullable1(self::Extension1|get#nonNullable1(new self::Class1::•())));
@@ -173,13 +173,13 @@
   let final self::Class1? #t74 = n1 in #t74 == null ?{self::Class1?} null : self::Extension1|set#nullable1(#t74{self::Class1}, self::Extension1|nonNullable1Method(self::Extension1|get#nonNullable1(new self::Class1::•())));
   nullable1 = let final self::Class1? #t75 = n1 in #t75 == null ?{self::Class1?} null : let final self::Class1 #t76 = self::Extension1|nonNullable1Method(self::Extension1|get#nonNullable1(new self::Class1::•())) in let final void #t77 = self::Extension1|set#nullable1(#t75{self::Class1}, #t76) in #t76;
   let final self::Class1? #t78 = n1 in #t78 == null ?{self::Class1?} null : self::Extension1|get#nullable1(self::Extension1|get#nonNullable1(self::Extension1|nonNullable1Method(#t78{self::Class1})));
-  let final self::Class1? #t79 = n1 in #t79 == null ?{void} null : self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(self::Extension1|nonNullable1Method(#t79{self::Class1})), new self::Class1::•());
+  let final self::Class1? #t79 = n1 in #t79 == null ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(self::Extension1|nonNullable1Method(#t79{self::Class1})), new self::Class1::•());
   let final self::Class1? #t80 = n1 in #t80 == null ?{self::Class1?} null : self::Extension1|nonNullable1Method(self::Extension1|get#nonNullable1(self::Extension1|nonNullable1Method(#t80{self::Class1})));
-  let final self::Class1? #t81 = n1 in #t81 == null ?{void} null : self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t81{self::Class1}), self::Extension1|get#nullable1(new self::Class1::•()));
+  let final self::Class1? #t81 = n1 in #t81 == null ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t81{self::Class1}), self::Extension1|get#nullable1(new self::Class1::•()));
   nullable1 = let final self::Class1? #t82 = n1 in #t82 == null ?{self::Class1?} null : let final self::Class1? #t83 = self::Extension1|get#nullable1(new self::Class1::•()) in let final void #t84 = self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t82{self::Class1}), #t83) in #t83;
-  let final self::Class1? #t85 = n1 in #t85 == null ?{void} null : self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t85{self::Class1}), let final self::Class1 #t86 = new self::Class1::•() in let final void #t87 = self::Extension1|set#nullable1(new self::Class1::•(), #t86) in #t86);
+  let final self::Class1? #t85 = n1 in #t85 == null ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t85{self::Class1}), let final self::Class1 #t86 = new self::Class1::•() in let final void #t87 = self::Extension1|set#nullable1(new self::Class1::•(), #t86) in #t86);
   nullable1 = let final self::Class1? #t88 = n1 in #t88 == null ?{self::Class1?} null : let final self::Class1 #t89 = let final self::Class1 #t90 = new self::Class1::•() in let final void #t91 = self::Extension1|set#nullable1(new self::Class1::•(), #t90) in #t90 in let final void #t92 = self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t88{self::Class1}), #t89) in #t89;
-  let final self::Class1? #t93 = n1 in #t93 == null ?{void} null : self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t93{self::Class1}), self::Extension1|nonNullable1Method(new self::Class1::•()));
+  let final self::Class1? #t93 = n1 in #t93 == null ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t93{self::Class1}), self::Extension1|nonNullable1Method(new self::Class1::•()));
   nullable1 = let final self::Class1? #t94 = n1 in #t94 == null ?{self::Class1?} null : let final self::Class1 #t95 = self::Extension1|nonNullable1Method(new self::Class1::•()) in let final void #t96 = self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t94{self::Class1}), #t95) in #t95;
   let final self::Class1? #t97 = n1 in #t97 == null ?{self::Class1?} null : self::Extension1|set#nullable1(#t97{self::Class1}, let final self::Class1? #t98 = self::Extension1|get#nullable1(new self::Class1::•()) in let final void #t99 = self::Extension1|set#nullable1(new self::Class1::•(), #t98) in #t98);
   nullable1 = let final self::Class1? #t100 = n1 in #t100 == null ?{self::Class1?} null : let final self::Class1? #t101 = let final self::Class1? #t102 = self::Extension1|get#nullable1(new self::Class1::•()) in let final void #t103 = self::Extension1|set#nullable1(new self::Class1::•(), #t102) in #t102 in let final void #t104 = self::Extension1|set#nullable1(#t100{self::Class1}, #t101) in #t101;
@@ -187,14 +187,14 @@
   nullable1 = let final self::Class1? #t110 = n1 in #t110 == null ?{self::Class1?} null : let final self::Class1 #t111 = let final self::Class1 #t112 = let final self::Class1 #t113 = new self::Class1::•() in let final void #t114 = self::Extension1|set#nullable1(new self::Class1::•(), #t113) in #t113 in let final void #t115 = self::Extension1|set#nullable1(new self::Class1::•(), #t112) in #t112 in let final void #t116 = self::Extension1|set#nullable1(#t110{self::Class1}, #t111) in #t111;
   let final self::Class1? #t117 = n1 in #t117 == null ?{self::Class1?} null : self::Extension1|set#nullable1(#t117{self::Class1}, let final self::Class1 #t118 = self::Extension1|nonNullable1Method(new self::Class1::•()) in let final void #t119 = self::Extension1|set#nullable1(new self::Class1::•(), #t118) in #t118);
   nullable1 = let final self::Class1? #t120 = n1 in #t120 == null ?{self::Class1?} null : let final self::Class1 #t121 = let final self::Class1 #t122 = self::Extension1|nonNullable1Method(new self::Class1::•()) in let final void #t123 = self::Extension1|set#nullable1(new self::Class1::•(), #t122) in #t122 in let final void #t124 = self::Extension1|set#nullable1(#t120{self::Class1}, #t121) in #t121;
-  let final self::Class1? #t125 = n1 in #t125 == null ?{void} null : self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t125{self::Class1}), self::Extension1|get#nullable1(new self::Class1::•()));
+  let final self::Class1? #t125 = n1 in #t125 == null ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t125{self::Class1}), self::Extension1|get#nullable1(new self::Class1::•()));
   nullable1 = let final self::Class1? #t126 = n1 in #t126 == null ?{self::Class1?} null : let final self::Class1? #t127 = self::Extension1|get#nullable1(new self::Class1::•()) in let final void #t128 = self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t126{self::Class1}), #t127) in #t127;
-  let final self::Class1? #t129 = n1 in #t129 == null ?{void} null : self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t129{self::Class1}), let final self::Class1 #t130 = new self::Class1::•() in let final void #t131 = self::Extension1|set#nullable1(new self::Class1::•(), #t130) in #t130);
+  let final self::Class1? #t129 = n1 in #t129 == null ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t129{self::Class1}), let final self::Class1 #t130 = new self::Class1::•() in let final void #t131 = self::Extension1|set#nullable1(new self::Class1::•(), #t130) in #t130);
   nullable1 = let final self::Class1? #t132 = n1 in #t132 == null ?{self::Class1?} null : let final self::Class1 #t133 = let final self::Class1 #t134 = new self::Class1::•() in let final void #t135 = self::Extension1|set#nullable1(new self::Class1::•(), #t134) in #t134 in let final void #t136 = self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t132{self::Class1}), #t133) in #t133;
-  let final self::Class1? #t137 = n1 in #t137 == null ?{void} null : self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t137{self::Class1}), self::Extension1|nonNullable1Method(new self::Class1::•()));
+  let final self::Class1? #t137 = n1 in #t137 == null ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t137{self::Class1}), self::Extension1|nonNullable1Method(new self::Class1::•()));
   nullable1 = let final self::Class1? #t138 = n1 in #t138 == null ?{self::Class1?} null : let final self::Class1 #t139 = self::Extension1|nonNullable1Method(new self::Class1::•()) in let final void #t140 = self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t138{self::Class1}), #t139) in #t139;
   let final self::Class1? #t141 = n1 in #t141 == null ?{self::Class1?} null : self::Extension1|get#nullable1(self::Extension1|nonNullable1Method(self::Extension1|get#nonNullable1(#t141{self::Class1})));
-  let final self::Class1? #t142 = n1 in #t142 == null ?{void} null : self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(self::Extension1|get#nonNullable1(#t142{self::Class1})), new self::Class1::•());
+  let final self::Class1? #t142 = n1 in #t142 == null ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(self::Extension1|get#nonNullable1(#t142{self::Class1})), new self::Class1::•());
   nullable1 = let final self::Class1? #t143 = n1 in #t143 == null ?{self::Class1?} null : let final self::Class1 #t144 = new self::Class1::•() in let final void #t145 = self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(self::Extension1|get#nonNullable1(#t143{self::Class1})), #t144) in #t144;
   let final self::Class1? #t146 = n1 in #t146 == null ?{self::Class1?} null : self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(self::Extension1|get#nonNullable1(#t146{self::Class1})));
   let final self::Class1? #t147 = n1 in #t147 == null ?{self::Class1?} null : self::Extension1|set#nullable1(#t147{self::Class1}, self::Extension1|get#nullable1(self::Extension1|nonNullable1Method(new self::Class1::•())));
@@ -204,7 +204,7 @@
   let final self::Class1? #t159 = n1 in #t159 == null ?{self::Class1?} null : self::Extension1|set#nullable1(#t159{self::Class1}, self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(new self::Class1::•())));
   nullable1 = let final self::Class1? #t160 = n1 in #t160 == null ?{self::Class1?} null : let final self::Class1 #t161 = self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(new self::Class1::•())) in let final void #t162 = self::Extension1|set#nullable1(#t160{self::Class1}, #t161) in #t161;
   let final self::Class1? #t163 = n1 in #t163 == null ?{self::Class1?} null : self::Extension1|get#nullable1(self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(#t163{self::Class1})));
-  let final self::Class1? #t164 = n1 in #t164 == null ?{void} null : self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(#t164{self::Class1})), new self::Class1::•());
+  let final self::Class1? #t164 = n1 in #t164 == null ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(#t164{self::Class1})), new self::Class1::•());
   let final self::Class1? #t165 = n1 in #t165 == null ?{self::Class1?} null : self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(#t165{self::Class1})));
   let final self::Class1? #t166 = n1 in #t166 == null ?{self::Class1?} null : let final self::Class1 #t167 = self::Extension1|nonNullable1Method(#t166{self::Class1}) in #t167 == null ?{self::Class1?} null : self::Extension1|nonNullable1Method(#t167);
 }
diff --git a/pkg/front_end/testcases/nnbd/null_shorting_explicit_extension.dart.strong.modular.expect b/pkg/front_end/testcases/nnbd/null_shorting_explicit_extension.dart.strong.modular.expect
index 0a3e160..23c8936 100644
--- a/pkg/front_end/testcases/nnbd/null_shorting_explicit_extension.dart.strong.modular.expect
+++ b/pkg/front_end/testcases/nnbd/null_shorting_explicit_extension.dart.strong.modular.expect
@@ -135,9 +135,9 @@
   let final self::Class1? #t7 = n1 in #t7 == null ?{self::Class1?} null : self::Extension1|get#nullable1(self::Extension1|get#nonNullable1(#t7{self::Class1}));
   let final self::Class1? #t8 = n1 in #t8 == null ?{self::Class1?} null : let final self::Class1? #t9 = self::Extension1|get#nullable1(#t8{self::Class1}) in #t9 == null ?{self::Class1?} null : self::Extension1|get#nullable1(#t9{self::Class1});
   let final self::Class1? #t10 = n1 in #t10 == null ?{self::Class1?} null : let final self::Class1? #t11 = self::Extension1|get#nullable1(self::Extension1|get#nonNullable1(#t10{self::Class1})) in #t11 == null ?{self::Class1?} null : self::Extension1|get#nullable1(#t11{self::Class1});
-  let final self::Class1? #t12 = n1 in #t12 == null ?{void} null : self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t12{self::Class1}), new self::Class1::•());
-  let final self::Class1? #t13 = n1 in #t13 == null ?{void} null : let final self::Class1? #t14 = self::Extension1|get#nullable1(#t13{self::Class1}) in #t14 == null ?{void} null : self::Extension1|set#nullable1(#t14{self::Class1}, new self::Class1::•());
-  let final self::Class1? #t15 = n1 in #t15 == null ?{void} null : let final self::Class1? #t16 = self::Extension1|get#nullable1(self::Extension1|get#nonNullable1(#t15{self::Class1})) in #t16 == null ?{void} null : self::Extension1|set#nullable1(#t16{self::Class1}, new self::Class1::•());
+  let final self::Class1? #t12 = n1 in #t12 == null ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t12{self::Class1}), new self::Class1::•());
+  let final self::Class1? #t13 = n1 in #t13 == null ?{self::Class1?} null : let final self::Class1? #t14 = self::Extension1|get#nullable1(#t13{self::Class1}) in #t14 == null ?{self::Class1?} null : self::Extension1|set#nullable1(#t14{self::Class1}, new self::Class1::•());
+  let final self::Class1? #t15 = n1 in #t15 == null ?{self::Class1?} null : let final self::Class1? #t16 = self::Extension1|get#nullable1(self::Extension1|get#nonNullable1(#t15{self::Class1})) in #t16 == null ?{self::Class1?} null : self::Extension1|set#nullable1(#t16{self::Class1}, new self::Class1::•());
   let final self::Class1? #t17 = let final self::Class1? #t18 = n1 in #t18 == null ?{self::Class1?} null : self::Extension1|get#nullable1(#t18{self::Class1}) in #t17 == null ?{self::Class1?} null : self::Extension1|get#nullable1(#t17{self::Class1});
   self::throws(() → void => invalid-expression "pkg/front_end/testcases/nnbd/null_shorting_explicit_extension.dart:93:59: Error: Property 'nullable1' cannot be accessed on 'Class1?' because it is potentially null.
  - 'Class1' is from 'pkg/front_end/testcases/nnbd/null_shorting_explicit_extension.dart'.
@@ -160,10 +160,10 @@
   let final self::Class1? #t48 = n1 in #t48 == null ?{self::Class1?} null : self::Extension1|set#nullable1(#t48{self::Class1}, self::Extension1|nonNullable1Method(new self::Class1::•()));
   nullable1 = let final self::Class1? #t49 = n1 in #t49 == null ?{self::Class1?} null : let final self::Class1 #t50 = self::Extension1|nonNullable1Method(new self::Class1::•()) in let final void #t51 = self::Extension1|set#nullable1(#t49{self::Class1}, #t50) in #t50;
   let final self::Class1? #t52 = n1 in #t52 == null ?{self::Class1?} null : self::Extension1|get#nullable1(self::Extension1|nonNullable1Method(#t52{self::Class1}));
-  let final self::Class1? #t53 = n1 in #t53 == null ?{void} null : self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t53{self::Class1}), new self::Class1::•());
+  let final self::Class1? #t53 = n1 in #t53 == null ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t53{self::Class1}), new self::Class1::•());
   let final self::Class1? #t54 = n1 in #t54 == null ?{self::Class1?} null : self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(#t54{self::Class1}));
   let final self::Class1? #t55 = n1 in #t55 == null ?{self::Class1?} null : self::Extension1|get#nullable1(self::Extension1|get#nonNullable1(self::Extension1|get#nonNullable1(#t55{self::Class1})));
-  let final self::Class1? #t56 = n1 in #t56 == null ?{void} null : self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(self::Extension1|get#nonNullable1(#t56{self::Class1})), new self::Class1::•());
+  let final self::Class1? #t56 = n1 in #t56 == null ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(self::Extension1|get#nonNullable1(#t56{self::Class1})), new self::Class1::•());
   nullable1 = let final self::Class1? #t57 = n1 in #t57 == null ?{self::Class1?} null : let final self::Class1 #t58 = new self::Class1::•() in let final void #t59 = self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(self::Extension1|get#nonNullable1(#t57{self::Class1})), #t58) in #t58;
   let final self::Class1? #t60 = n1 in #t60 == null ?{self::Class1?} null : let final self::Class1? #t61 = self::Extension1|get#nullable1(self::Extension1|get#nonNullable1(#t60{self::Class1})) in #t61 == null ?{self::Class1?} null : self::Extension1|nonNullable1Method(#t61{self::Class1});
   let final self::Class1? #t62 = n1 in #t62 == null ?{self::Class1?} null : self::Extension1|set#nullable1(#t62{self::Class1}, self::Extension1|get#nullable1(self::Extension1|get#nonNullable1(new self::Class1::•())));
@@ -173,13 +173,13 @@
   let final self::Class1? #t74 = n1 in #t74 == null ?{self::Class1?} null : self::Extension1|set#nullable1(#t74{self::Class1}, self::Extension1|nonNullable1Method(self::Extension1|get#nonNullable1(new self::Class1::•())));
   nullable1 = let final self::Class1? #t75 = n1 in #t75 == null ?{self::Class1?} null : let final self::Class1 #t76 = self::Extension1|nonNullable1Method(self::Extension1|get#nonNullable1(new self::Class1::•())) in let final void #t77 = self::Extension1|set#nullable1(#t75{self::Class1}, #t76) in #t76;
   let final self::Class1? #t78 = n1 in #t78 == null ?{self::Class1?} null : self::Extension1|get#nullable1(self::Extension1|get#nonNullable1(self::Extension1|nonNullable1Method(#t78{self::Class1})));
-  let final self::Class1? #t79 = n1 in #t79 == null ?{void} null : self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(self::Extension1|nonNullable1Method(#t79{self::Class1})), new self::Class1::•());
+  let final self::Class1? #t79 = n1 in #t79 == null ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(self::Extension1|nonNullable1Method(#t79{self::Class1})), new self::Class1::•());
   let final self::Class1? #t80 = n1 in #t80 == null ?{self::Class1?} null : self::Extension1|nonNullable1Method(self::Extension1|get#nonNullable1(self::Extension1|nonNullable1Method(#t80{self::Class1})));
-  let final self::Class1? #t81 = n1 in #t81 == null ?{void} null : self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t81{self::Class1}), self::Extension1|get#nullable1(new self::Class1::•()));
+  let final self::Class1? #t81 = n1 in #t81 == null ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t81{self::Class1}), self::Extension1|get#nullable1(new self::Class1::•()));
   nullable1 = let final self::Class1? #t82 = n1 in #t82 == null ?{self::Class1?} null : let final self::Class1? #t83 = self::Extension1|get#nullable1(new self::Class1::•()) in let final void #t84 = self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t82{self::Class1}), #t83) in #t83;
-  let final self::Class1? #t85 = n1 in #t85 == null ?{void} null : self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t85{self::Class1}), let final self::Class1 #t86 = new self::Class1::•() in let final void #t87 = self::Extension1|set#nullable1(new self::Class1::•(), #t86) in #t86);
+  let final self::Class1? #t85 = n1 in #t85 == null ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t85{self::Class1}), let final self::Class1 #t86 = new self::Class1::•() in let final void #t87 = self::Extension1|set#nullable1(new self::Class1::•(), #t86) in #t86);
   nullable1 = let final self::Class1? #t88 = n1 in #t88 == null ?{self::Class1?} null : let final self::Class1 #t89 = let final self::Class1 #t90 = new self::Class1::•() in let final void #t91 = self::Extension1|set#nullable1(new self::Class1::•(), #t90) in #t90 in let final void #t92 = self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t88{self::Class1}), #t89) in #t89;
-  let final self::Class1? #t93 = n1 in #t93 == null ?{void} null : self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t93{self::Class1}), self::Extension1|nonNullable1Method(new self::Class1::•()));
+  let final self::Class1? #t93 = n1 in #t93 == null ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t93{self::Class1}), self::Extension1|nonNullable1Method(new self::Class1::•()));
   nullable1 = let final self::Class1? #t94 = n1 in #t94 == null ?{self::Class1?} null : let final self::Class1 #t95 = self::Extension1|nonNullable1Method(new self::Class1::•()) in let final void #t96 = self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t94{self::Class1}), #t95) in #t95;
   let final self::Class1? #t97 = n1 in #t97 == null ?{self::Class1?} null : self::Extension1|set#nullable1(#t97{self::Class1}, let final self::Class1? #t98 = self::Extension1|get#nullable1(new self::Class1::•()) in let final void #t99 = self::Extension1|set#nullable1(new self::Class1::•(), #t98) in #t98);
   nullable1 = let final self::Class1? #t100 = n1 in #t100 == null ?{self::Class1?} null : let final self::Class1? #t101 = let final self::Class1? #t102 = self::Extension1|get#nullable1(new self::Class1::•()) in let final void #t103 = self::Extension1|set#nullable1(new self::Class1::•(), #t102) in #t102 in let final void #t104 = self::Extension1|set#nullable1(#t100{self::Class1}, #t101) in #t101;
@@ -187,14 +187,14 @@
   nullable1 = let final self::Class1? #t110 = n1 in #t110 == null ?{self::Class1?} null : let final self::Class1 #t111 = let final self::Class1 #t112 = let final self::Class1 #t113 = new self::Class1::•() in let final void #t114 = self::Extension1|set#nullable1(new self::Class1::•(), #t113) in #t113 in let final void #t115 = self::Extension1|set#nullable1(new self::Class1::•(), #t112) in #t112 in let final void #t116 = self::Extension1|set#nullable1(#t110{self::Class1}, #t111) in #t111;
   let final self::Class1? #t117 = n1 in #t117 == null ?{self::Class1?} null : self::Extension1|set#nullable1(#t117{self::Class1}, let final self::Class1 #t118 = self::Extension1|nonNullable1Method(new self::Class1::•()) in let final void #t119 = self::Extension1|set#nullable1(new self::Class1::•(), #t118) in #t118);
   nullable1 = let final self::Class1? #t120 = n1 in #t120 == null ?{self::Class1?} null : let final self::Class1 #t121 = let final self::Class1 #t122 = self::Extension1|nonNullable1Method(new self::Class1::•()) in let final void #t123 = self::Extension1|set#nullable1(new self::Class1::•(), #t122) in #t122 in let final void #t124 = self::Extension1|set#nullable1(#t120{self::Class1}, #t121) in #t121;
-  let final self::Class1? #t125 = n1 in #t125 == null ?{void} null : self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t125{self::Class1}), self::Extension1|get#nullable1(new self::Class1::•()));
+  let final self::Class1? #t125 = n1 in #t125 == null ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t125{self::Class1}), self::Extension1|get#nullable1(new self::Class1::•()));
   nullable1 = let final self::Class1? #t126 = n1 in #t126 == null ?{self::Class1?} null : let final self::Class1? #t127 = self::Extension1|get#nullable1(new self::Class1::•()) in let final void #t128 = self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t126{self::Class1}), #t127) in #t127;
-  let final self::Class1? #t129 = n1 in #t129 == null ?{void} null : self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t129{self::Class1}), let final self::Class1 #t130 = new self::Class1::•() in let final void #t131 = self::Extension1|set#nullable1(new self::Class1::•(), #t130) in #t130);
+  let final self::Class1? #t129 = n1 in #t129 == null ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t129{self::Class1}), let final self::Class1 #t130 = new self::Class1::•() in let final void #t131 = self::Extension1|set#nullable1(new self::Class1::•(), #t130) in #t130);
   nullable1 = let final self::Class1? #t132 = n1 in #t132 == null ?{self::Class1?} null : let final self::Class1 #t133 = let final self::Class1 #t134 = new self::Class1::•() in let final void #t135 = self::Extension1|set#nullable1(new self::Class1::•(), #t134) in #t134 in let final void #t136 = self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t132{self::Class1}), #t133) in #t133;
-  let final self::Class1? #t137 = n1 in #t137 == null ?{void} null : self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t137{self::Class1}), self::Extension1|nonNullable1Method(new self::Class1::•()));
+  let final self::Class1? #t137 = n1 in #t137 == null ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t137{self::Class1}), self::Extension1|nonNullable1Method(new self::Class1::•()));
   nullable1 = let final self::Class1? #t138 = n1 in #t138 == null ?{self::Class1?} null : let final self::Class1 #t139 = self::Extension1|nonNullable1Method(new self::Class1::•()) in let final void #t140 = self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t138{self::Class1}), #t139) in #t139;
   let final self::Class1? #t141 = n1 in #t141 == null ?{self::Class1?} null : self::Extension1|get#nullable1(self::Extension1|nonNullable1Method(self::Extension1|get#nonNullable1(#t141{self::Class1})));
-  let final self::Class1? #t142 = n1 in #t142 == null ?{void} null : self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(self::Extension1|get#nonNullable1(#t142{self::Class1})), new self::Class1::•());
+  let final self::Class1? #t142 = n1 in #t142 == null ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(self::Extension1|get#nonNullable1(#t142{self::Class1})), new self::Class1::•());
   nullable1 = let final self::Class1? #t143 = n1 in #t143 == null ?{self::Class1?} null : let final self::Class1 #t144 = new self::Class1::•() in let final void #t145 = self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(self::Extension1|get#nonNullable1(#t143{self::Class1})), #t144) in #t144;
   let final self::Class1? #t146 = n1 in #t146 == null ?{self::Class1?} null : self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(self::Extension1|get#nonNullable1(#t146{self::Class1})));
   let final self::Class1? #t147 = n1 in #t147 == null ?{self::Class1?} null : self::Extension1|set#nullable1(#t147{self::Class1}, self::Extension1|get#nullable1(self::Extension1|nonNullable1Method(new self::Class1::•())));
@@ -204,7 +204,7 @@
   let final self::Class1? #t159 = n1 in #t159 == null ?{self::Class1?} null : self::Extension1|set#nullable1(#t159{self::Class1}, self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(new self::Class1::•())));
   nullable1 = let final self::Class1? #t160 = n1 in #t160 == null ?{self::Class1?} null : let final self::Class1 #t161 = self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(new self::Class1::•())) in let final void #t162 = self::Extension1|set#nullable1(#t160{self::Class1}, #t161) in #t161;
   let final self::Class1? #t163 = n1 in #t163 == null ?{self::Class1?} null : self::Extension1|get#nullable1(self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(#t163{self::Class1})));
-  let final self::Class1? #t164 = n1 in #t164 == null ?{void} null : self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(#t164{self::Class1})), new self::Class1::•());
+  let final self::Class1? #t164 = n1 in #t164 == null ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(#t164{self::Class1})), new self::Class1::•());
   let final self::Class1? #t165 = n1 in #t165 == null ?{self::Class1?} null : self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(#t165{self::Class1})));
   let final self::Class1? #t166 = n1 in #t166 == null ?{self::Class1?} null : let final self::Class1 #t167 = self::Extension1|nonNullable1Method(#t166{self::Class1}) in #t167 == null ?{self::Class1?} null : self::Extension1|nonNullable1Method(#t167);
 }
diff --git a/pkg/front_end/testcases/nnbd/null_shorting_explicit_extension.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/null_shorting_explicit_extension.dart.strong.transformed.expect
index 0a3e160..23c8936 100644
--- a/pkg/front_end/testcases/nnbd/null_shorting_explicit_extension.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/null_shorting_explicit_extension.dart.strong.transformed.expect
@@ -135,9 +135,9 @@
   let final self::Class1? #t7 = n1 in #t7 == null ?{self::Class1?} null : self::Extension1|get#nullable1(self::Extension1|get#nonNullable1(#t7{self::Class1}));
   let final self::Class1? #t8 = n1 in #t8 == null ?{self::Class1?} null : let final self::Class1? #t9 = self::Extension1|get#nullable1(#t8{self::Class1}) in #t9 == null ?{self::Class1?} null : self::Extension1|get#nullable1(#t9{self::Class1});
   let final self::Class1? #t10 = n1 in #t10 == null ?{self::Class1?} null : let final self::Class1? #t11 = self::Extension1|get#nullable1(self::Extension1|get#nonNullable1(#t10{self::Class1})) in #t11 == null ?{self::Class1?} null : self::Extension1|get#nullable1(#t11{self::Class1});
-  let final self::Class1? #t12 = n1 in #t12 == null ?{void} null : self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t12{self::Class1}), new self::Class1::•());
-  let final self::Class1? #t13 = n1 in #t13 == null ?{void} null : let final self::Class1? #t14 = self::Extension1|get#nullable1(#t13{self::Class1}) in #t14 == null ?{void} null : self::Extension1|set#nullable1(#t14{self::Class1}, new self::Class1::•());
-  let final self::Class1? #t15 = n1 in #t15 == null ?{void} null : let final self::Class1? #t16 = self::Extension1|get#nullable1(self::Extension1|get#nonNullable1(#t15{self::Class1})) in #t16 == null ?{void} null : self::Extension1|set#nullable1(#t16{self::Class1}, new self::Class1::•());
+  let final self::Class1? #t12 = n1 in #t12 == null ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t12{self::Class1}), new self::Class1::•());
+  let final self::Class1? #t13 = n1 in #t13 == null ?{self::Class1?} null : let final self::Class1? #t14 = self::Extension1|get#nullable1(#t13{self::Class1}) in #t14 == null ?{self::Class1?} null : self::Extension1|set#nullable1(#t14{self::Class1}, new self::Class1::•());
+  let final self::Class1? #t15 = n1 in #t15 == null ?{self::Class1?} null : let final self::Class1? #t16 = self::Extension1|get#nullable1(self::Extension1|get#nonNullable1(#t15{self::Class1})) in #t16 == null ?{self::Class1?} null : self::Extension1|set#nullable1(#t16{self::Class1}, new self::Class1::•());
   let final self::Class1? #t17 = let final self::Class1? #t18 = n1 in #t18 == null ?{self::Class1?} null : self::Extension1|get#nullable1(#t18{self::Class1}) in #t17 == null ?{self::Class1?} null : self::Extension1|get#nullable1(#t17{self::Class1});
   self::throws(() → void => invalid-expression "pkg/front_end/testcases/nnbd/null_shorting_explicit_extension.dart:93:59: Error: Property 'nullable1' cannot be accessed on 'Class1?' because it is potentially null.
  - 'Class1' is from 'pkg/front_end/testcases/nnbd/null_shorting_explicit_extension.dart'.
@@ -160,10 +160,10 @@
   let final self::Class1? #t48 = n1 in #t48 == null ?{self::Class1?} null : self::Extension1|set#nullable1(#t48{self::Class1}, self::Extension1|nonNullable1Method(new self::Class1::•()));
   nullable1 = let final self::Class1? #t49 = n1 in #t49 == null ?{self::Class1?} null : let final self::Class1 #t50 = self::Extension1|nonNullable1Method(new self::Class1::•()) in let final void #t51 = self::Extension1|set#nullable1(#t49{self::Class1}, #t50) in #t50;
   let final self::Class1? #t52 = n1 in #t52 == null ?{self::Class1?} null : self::Extension1|get#nullable1(self::Extension1|nonNullable1Method(#t52{self::Class1}));
-  let final self::Class1? #t53 = n1 in #t53 == null ?{void} null : self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t53{self::Class1}), new self::Class1::•());
+  let final self::Class1? #t53 = n1 in #t53 == null ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t53{self::Class1}), new self::Class1::•());
   let final self::Class1? #t54 = n1 in #t54 == null ?{self::Class1?} null : self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(#t54{self::Class1}));
   let final self::Class1? #t55 = n1 in #t55 == null ?{self::Class1?} null : self::Extension1|get#nullable1(self::Extension1|get#nonNullable1(self::Extension1|get#nonNullable1(#t55{self::Class1})));
-  let final self::Class1? #t56 = n1 in #t56 == null ?{void} null : self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(self::Extension1|get#nonNullable1(#t56{self::Class1})), new self::Class1::•());
+  let final self::Class1? #t56 = n1 in #t56 == null ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(self::Extension1|get#nonNullable1(#t56{self::Class1})), new self::Class1::•());
   nullable1 = let final self::Class1? #t57 = n1 in #t57 == null ?{self::Class1?} null : let final self::Class1 #t58 = new self::Class1::•() in let final void #t59 = self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(self::Extension1|get#nonNullable1(#t57{self::Class1})), #t58) in #t58;
   let final self::Class1? #t60 = n1 in #t60 == null ?{self::Class1?} null : let final self::Class1? #t61 = self::Extension1|get#nullable1(self::Extension1|get#nonNullable1(#t60{self::Class1})) in #t61 == null ?{self::Class1?} null : self::Extension1|nonNullable1Method(#t61{self::Class1});
   let final self::Class1? #t62 = n1 in #t62 == null ?{self::Class1?} null : self::Extension1|set#nullable1(#t62{self::Class1}, self::Extension1|get#nullable1(self::Extension1|get#nonNullable1(new self::Class1::•())));
@@ -173,13 +173,13 @@
   let final self::Class1? #t74 = n1 in #t74 == null ?{self::Class1?} null : self::Extension1|set#nullable1(#t74{self::Class1}, self::Extension1|nonNullable1Method(self::Extension1|get#nonNullable1(new self::Class1::•())));
   nullable1 = let final self::Class1? #t75 = n1 in #t75 == null ?{self::Class1?} null : let final self::Class1 #t76 = self::Extension1|nonNullable1Method(self::Extension1|get#nonNullable1(new self::Class1::•())) in let final void #t77 = self::Extension1|set#nullable1(#t75{self::Class1}, #t76) in #t76;
   let final self::Class1? #t78 = n1 in #t78 == null ?{self::Class1?} null : self::Extension1|get#nullable1(self::Extension1|get#nonNullable1(self::Extension1|nonNullable1Method(#t78{self::Class1})));
-  let final self::Class1? #t79 = n1 in #t79 == null ?{void} null : self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(self::Extension1|nonNullable1Method(#t79{self::Class1})), new self::Class1::•());
+  let final self::Class1? #t79 = n1 in #t79 == null ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(self::Extension1|nonNullable1Method(#t79{self::Class1})), new self::Class1::•());
   let final self::Class1? #t80 = n1 in #t80 == null ?{self::Class1?} null : self::Extension1|nonNullable1Method(self::Extension1|get#nonNullable1(self::Extension1|nonNullable1Method(#t80{self::Class1})));
-  let final self::Class1? #t81 = n1 in #t81 == null ?{void} null : self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t81{self::Class1}), self::Extension1|get#nullable1(new self::Class1::•()));
+  let final self::Class1? #t81 = n1 in #t81 == null ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t81{self::Class1}), self::Extension1|get#nullable1(new self::Class1::•()));
   nullable1 = let final self::Class1? #t82 = n1 in #t82 == null ?{self::Class1?} null : let final self::Class1? #t83 = self::Extension1|get#nullable1(new self::Class1::•()) in let final void #t84 = self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t82{self::Class1}), #t83) in #t83;
-  let final self::Class1? #t85 = n1 in #t85 == null ?{void} null : self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t85{self::Class1}), let final self::Class1 #t86 = new self::Class1::•() in let final void #t87 = self::Extension1|set#nullable1(new self::Class1::•(), #t86) in #t86);
+  let final self::Class1? #t85 = n1 in #t85 == null ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t85{self::Class1}), let final self::Class1 #t86 = new self::Class1::•() in let final void #t87 = self::Extension1|set#nullable1(new self::Class1::•(), #t86) in #t86);
   nullable1 = let final self::Class1? #t88 = n1 in #t88 == null ?{self::Class1?} null : let final self::Class1 #t89 = let final self::Class1 #t90 = new self::Class1::•() in let final void #t91 = self::Extension1|set#nullable1(new self::Class1::•(), #t90) in #t90 in let final void #t92 = self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t88{self::Class1}), #t89) in #t89;
-  let final self::Class1? #t93 = n1 in #t93 == null ?{void} null : self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t93{self::Class1}), self::Extension1|nonNullable1Method(new self::Class1::•()));
+  let final self::Class1? #t93 = n1 in #t93 == null ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t93{self::Class1}), self::Extension1|nonNullable1Method(new self::Class1::•()));
   nullable1 = let final self::Class1? #t94 = n1 in #t94 == null ?{self::Class1?} null : let final self::Class1 #t95 = self::Extension1|nonNullable1Method(new self::Class1::•()) in let final void #t96 = self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t94{self::Class1}), #t95) in #t95;
   let final self::Class1? #t97 = n1 in #t97 == null ?{self::Class1?} null : self::Extension1|set#nullable1(#t97{self::Class1}, let final self::Class1? #t98 = self::Extension1|get#nullable1(new self::Class1::•()) in let final void #t99 = self::Extension1|set#nullable1(new self::Class1::•(), #t98) in #t98);
   nullable1 = let final self::Class1? #t100 = n1 in #t100 == null ?{self::Class1?} null : let final self::Class1? #t101 = let final self::Class1? #t102 = self::Extension1|get#nullable1(new self::Class1::•()) in let final void #t103 = self::Extension1|set#nullable1(new self::Class1::•(), #t102) in #t102 in let final void #t104 = self::Extension1|set#nullable1(#t100{self::Class1}, #t101) in #t101;
@@ -187,14 +187,14 @@
   nullable1 = let final self::Class1? #t110 = n1 in #t110 == null ?{self::Class1?} null : let final self::Class1 #t111 = let final self::Class1 #t112 = let final self::Class1 #t113 = new self::Class1::•() in let final void #t114 = self::Extension1|set#nullable1(new self::Class1::•(), #t113) in #t113 in let final void #t115 = self::Extension1|set#nullable1(new self::Class1::•(), #t112) in #t112 in let final void #t116 = self::Extension1|set#nullable1(#t110{self::Class1}, #t111) in #t111;
   let final self::Class1? #t117 = n1 in #t117 == null ?{self::Class1?} null : self::Extension1|set#nullable1(#t117{self::Class1}, let final self::Class1 #t118 = self::Extension1|nonNullable1Method(new self::Class1::•()) in let final void #t119 = self::Extension1|set#nullable1(new self::Class1::•(), #t118) in #t118);
   nullable1 = let final self::Class1? #t120 = n1 in #t120 == null ?{self::Class1?} null : let final self::Class1 #t121 = let final self::Class1 #t122 = self::Extension1|nonNullable1Method(new self::Class1::•()) in let final void #t123 = self::Extension1|set#nullable1(new self::Class1::•(), #t122) in #t122 in let final void #t124 = self::Extension1|set#nullable1(#t120{self::Class1}, #t121) in #t121;
-  let final self::Class1? #t125 = n1 in #t125 == null ?{void} null : self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t125{self::Class1}), self::Extension1|get#nullable1(new self::Class1::•()));
+  let final self::Class1? #t125 = n1 in #t125 == null ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t125{self::Class1}), self::Extension1|get#nullable1(new self::Class1::•()));
   nullable1 = let final self::Class1? #t126 = n1 in #t126 == null ?{self::Class1?} null : let final self::Class1? #t127 = self::Extension1|get#nullable1(new self::Class1::•()) in let final void #t128 = self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t126{self::Class1}), #t127) in #t127;
-  let final self::Class1? #t129 = n1 in #t129 == null ?{void} null : self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t129{self::Class1}), let final self::Class1 #t130 = new self::Class1::•() in let final void #t131 = self::Extension1|set#nullable1(new self::Class1::•(), #t130) in #t130);
+  let final self::Class1? #t129 = n1 in #t129 == null ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t129{self::Class1}), let final self::Class1 #t130 = new self::Class1::•() in let final void #t131 = self::Extension1|set#nullable1(new self::Class1::•(), #t130) in #t130);
   nullable1 = let final self::Class1? #t132 = n1 in #t132 == null ?{self::Class1?} null : let final self::Class1 #t133 = let final self::Class1 #t134 = new self::Class1::•() in let final void #t135 = self::Extension1|set#nullable1(new self::Class1::•(), #t134) in #t134 in let final void #t136 = self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t132{self::Class1}), #t133) in #t133;
-  let final self::Class1? #t137 = n1 in #t137 == null ?{void} null : self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t137{self::Class1}), self::Extension1|nonNullable1Method(new self::Class1::•()));
+  let final self::Class1? #t137 = n1 in #t137 == null ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t137{self::Class1}), self::Extension1|nonNullable1Method(new self::Class1::•()));
   nullable1 = let final self::Class1? #t138 = n1 in #t138 == null ?{self::Class1?} null : let final self::Class1 #t139 = self::Extension1|nonNullable1Method(new self::Class1::•()) in let final void #t140 = self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t138{self::Class1}), #t139) in #t139;
   let final self::Class1? #t141 = n1 in #t141 == null ?{self::Class1?} null : self::Extension1|get#nullable1(self::Extension1|nonNullable1Method(self::Extension1|get#nonNullable1(#t141{self::Class1})));
-  let final self::Class1? #t142 = n1 in #t142 == null ?{void} null : self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(self::Extension1|get#nonNullable1(#t142{self::Class1})), new self::Class1::•());
+  let final self::Class1? #t142 = n1 in #t142 == null ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(self::Extension1|get#nonNullable1(#t142{self::Class1})), new self::Class1::•());
   nullable1 = let final self::Class1? #t143 = n1 in #t143 == null ?{self::Class1?} null : let final self::Class1 #t144 = new self::Class1::•() in let final void #t145 = self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(self::Extension1|get#nonNullable1(#t143{self::Class1})), #t144) in #t144;
   let final self::Class1? #t146 = n1 in #t146 == null ?{self::Class1?} null : self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(self::Extension1|get#nonNullable1(#t146{self::Class1})));
   let final self::Class1? #t147 = n1 in #t147 == null ?{self::Class1?} null : self::Extension1|set#nullable1(#t147{self::Class1}, self::Extension1|get#nullable1(self::Extension1|nonNullable1Method(new self::Class1::•())));
@@ -204,7 +204,7 @@
   let final self::Class1? #t159 = n1 in #t159 == null ?{self::Class1?} null : self::Extension1|set#nullable1(#t159{self::Class1}, self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(new self::Class1::•())));
   nullable1 = let final self::Class1? #t160 = n1 in #t160 == null ?{self::Class1?} null : let final self::Class1 #t161 = self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(new self::Class1::•())) in let final void #t162 = self::Extension1|set#nullable1(#t160{self::Class1}, #t161) in #t161;
   let final self::Class1? #t163 = n1 in #t163 == null ?{self::Class1?} null : self::Extension1|get#nullable1(self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(#t163{self::Class1})));
-  let final self::Class1? #t164 = n1 in #t164 == null ?{void} null : self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(#t164{self::Class1})), new self::Class1::•());
+  let final self::Class1? #t164 = n1 in #t164 == null ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(#t164{self::Class1})), new self::Class1::•());
   let final self::Class1? #t165 = n1 in #t165 == null ?{self::Class1?} null : self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(#t165{self::Class1})));
   let final self::Class1? #t166 = n1 in #t166 == null ?{self::Class1?} null : let final self::Class1 #t167 = self::Extension1|nonNullable1Method(#t166{self::Class1}) in #t167 == null ?{self::Class1?} null : self::Extension1|nonNullable1Method(#t167);
 }
diff --git a/pkg/front_end/testcases/nnbd/null_shorting_extension.dart.strong.expect b/pkg/front_end/testcases/nnbd/null_shorting_extension.dart.strong.expect
index 541d58f..bf28ebb 100644
--- a/pkg/front_end/testcases/nnbd/null_shorting_extension.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/null_shorting_extension.dart.strong.expect
@@ -129,15 +129,15 @@
 static method propertyAccess(self::Class1? n1) → void {
   self::Class1? nullable1 = n1;
   let final self::Class1? #t1 = n1 in #t1 == null ?{self::Class1?} null : self::Extension1|get#nullable1(#t1{self::Class1});
-  let final self::Class1? #t2 = n1 in #t2 == null ?{void} null : self::Extension1|set#nullable1(#t2{self::Class1}, new self::Class1::•());
+  let final self::Class1? #t2 = n1 in #t2 == null ?{self::Class1?} null : self::Extension1|set#nullable1(#t2{self::Class1}, new self::Class1::•());
   nullable1 = let final self::Class1? #t3 = n1 in #t3 == null ?{self::Class1?} null : let final self::Class1 #t4 = new self::Class1::•() in let final void #t5 = self::Extension1|set#nullable1(#t3{self::Class1}, #t4) in #t4;
   let final self::Class1? #t6 = n1 in #t6 == null ?{self::Class1?} null : self::Extension1|nonNullable1Method(#t6{self::Class1});
   let final self::Class1? #t7 = n1 in #t7 == null ?{self::Class1?} null : self::Extension1|get#nullable1(self::Extension1|get#nonNullable1(#t7{self::Class1}));
   let final self::Class1? #t8 = n1 in #t8 == null ?{self::Class1?} null : let final self::Class1? #t9 = self::Extension1|get#nullable1(#t8{self::Class1}) in #t9 == null ?{self::Class1?} null : self::Extension1|get#nullable1(#t9{self::Class1});
   let final self::Class1? #t10 = n1 in #t10 == null ?{self::Class1?} null : let final self::Class1? #t11 = self::Extension1|get#nullable1(self::Extension1|get#nonNullable1(#t10{self::Class1})) in #t11 == null ?{self::Class1?} null : self::Extension1|get#nullable1(#t11{self::Class1});
-  let final self::Class1? #t12 = n1 in #t12 == null ?{void} null : self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t12{self::Class1}), new self::Class1::•());
-  let final self::Class1? #t13 = n1 in #t13 == null ?{void} null : let final self::Class1? #t14 = self::Extension1|get#nullable1(#t13{self::Class1}) in #t14 == null ?{void} null : self::Extension1|set#nullable1(#t14{self::Class1}, new self::Class1::•());
-  let final self::Class1? #t15 = n1 in #t15 == null ?{void} null : let final self::Class1? #t16 = self::Extension1|get#nullable1(self::Extension1|get#nonNullable1(#t15{self::Class1})) in #t16 == null ?{void} null : self::Extension1|set#nullable1(#t16{self::Class1}, new self::Class1::•());
+  let final self::Class1? #t12 = n1 in #t12 == null ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t12{self::Class1}), new self::Class1::•());
+  let final self::Class1? #t13 = n1 in #t13 == null ?{self::Class1?} null : let final self::Class1? #t14 = self::Extension1|get#nullable1(#t13{self::Class1}) in #t14 == null ?{self::Class1?} null : self::Extension1|set#nullable1(#t14{self::Class1}, new self::Class1::•());
+  let final self::Class1? #t15 = n1 in #t15 == null ?{self::Class1?} null : let final self::Class1? #t16 = self::Extension1|get#nullable1(self::Extension1|get#nonNullable1(#t15{self::Class1})) in #t16 == null ?{self::Class1?} null : self::Extension1|set#nullable1(#t16{self::Class1}, new self::Class1::•());
   let final self::Class1? #t17 = let final self::Class1? #t18 = n1 in #t18 == null ?{self::Class1?} null : self::Extension1|get#nullable1(#t18{self::Class1}) in #t17 == null ?{self::Class1?} null : self::Extension1|get#nullable1(#t17{self::Class1});
   self::throws(() → void => invalid-expression "pkg/front_end/testcases/nnbd/null_shorting_extension.dart:93:47: Error: Property 'nullable1' cannot be accessed on 'Class1?' because it is potentially null.
  - 'Class1' is from 'pkg/front_end/testcases/nnbd/null_shorting_extension.dart'.
@@ -153,58 +153,58 @@
   nullable1 = let final self::Class1? #t26 = n1 in #t26 == null ?{self::Class1?} null : let final self::Class1? #t27 = self::Extension1|get#nullable1(#t26{self::Class1}) in #t27 == null ?{self::Class1?} null : let final self::Class1 #t28 = new self::Class1::•() in let final void #t29 = self::Extension1|set#nullable1(#t27{self::Class1}, #t28) in #t28;
   nullable1 = let final self::Class1? #t30 = n1 in #t30 == null ?{self::Class1?} null : let final self::Class1? #t31 = self::Extension1|get#nullable1(self::Extension1|get#nonNullable1(#t30{self::Class1})) in #t31 == null ?{self::Class1?} null : let final self::Class1 #t32 = new self::Class1::•() in let final void #t33 = self::Extension1|set#nullable1(#t31{self::Class1}, #t32) in #t32;
   let final self::Class1? #t34 = n1 in #t34 == null ?{self::Class1?} null : let final self::Class1? #t35 = self::Extension1|get#nullable1(#t34{self::Class1}) in #t35 == null ?{self::Class1?} null : self::Extension1|nonNullable1Method(#t35{self::Class1});
-  let final self::Class1? #t36 = n1 in #t36 == null ?{void} null : self::Extension1|set#nullable1(#t36{self::Class1}, self::Extension1|get#nullable1(new self::Class1::•()));
+  let final self::Class1? #t36 = n1 in #t36 == null ?{self::Class1?} null : self::Extension1|set#nullable1(#t36{self::Class1}, self::Extension1|get#nullable1(new self::Class1::•()));
   nullable1 = let final self::Class1? #t37 = n1 in #t37 == null ?{self::Class1?} null : let final self::Class1? #t38 = self::Extension1|get#nullable1(new self::Class1::•()) in let final void #t39 = self::Extension1|set#nullable1(#t37{self::Class1}, #t38) in #t38;
-  let final self::Class1? #t40 = n1 in #t40 == null ?{void} null : self::Extension1|set#nullable1(#t40{self::Class1}, let final self::Class1 #t41 = new self::Class1::•() in let final void #t42 = self::Extension1|set#nullable1(new self::Class1::•(), #t41) in #t41);
+  let final self::Class1? #t40 = n1 in #t40 == null ?{self::Class1?} null : self::Extension1|set#nullable1(#t40{self::Class1}, let final self::Class1 #t41 = new self::Class1::•() in let final void #t42 = self::Extension1|set#nullable1(new self::Class1::•(), #t41) in #t41);
   nullable1 = let final self::Class1? #t43 = n1 in #t43 == null ?{self::Class1?} null : let final self::Class1 #t44 = let final self::Class1 #t45 = new self::Class1::•() in let final void #t46 = self::Extension1|set#nullable1(new self::Class1::•(), #t45) in #t45 in let final void #t47 = self::Extension1|set#nullable1(#t43{self::Class1}, #t44) in #t44;
-  let final self::Class1? #t48 = n1 in #t48 == null ?{void} null : self::Extension1|set#nullable1(#t48{self::Class1}, self::Extension1|nonNullable1Method(new self::Class1::•()));
+  let final self::Class1? #t48 = n1 in #t48 == null ?{self::Class1?} null : self::Extension1|set#nullable1(#t48{self::Class1}, self::Extension1|nonNullable1Method(new self::Class1::•()));
   nullable1 = let final self::Class1? #t49 = n1 in #t49 == null ?{self::Class1?} null : let final self::Class1 #t50 = self::Extension1|nonNullable1Method(new self::Class1::•()) in let final void #t51 = self::Extension1|set#nullable1(#t49{self::Class1}, #t50) in #t50;
   let final self::Class1? #t52 = n1 in #t52 == null ?{self::Class1?} null : self::Extension1|get#nullable1(self::Extension1|nonNullable1Method(#t52{self::Class1}));
-  let final self::Class1? #t53 = n1 in #t53 == null ?{void} null : self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t53{self::Class1}), new self::Class1::•());
+  let final self::Class1? #t53 = n1 in #t53 == null ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t53{self::Class1}), new self::Class1::•());
   let final self::Class1? #t54 = n1 in #t54 == null ?{self::Class1?} null : self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(#t54{self::Class1}));
   let final self::Class1? #t55 = n1 in #t55 == null ?{self::Class1?} null : self::Extension1|get#nullable1(self::Extension1|get#nonNullable1(self::Extension1|get#nonNullable1(#t55{self::Class1})));
-  let final self::Class1? #t56 = n1 in #t56 == null ?{void} null : self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(self::Extension1|get#nonNullable1(#t56{self::Class1})), new self::Class1::•());
+  let final self::Class1? #t56 = n1 in #t56 == null ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(self::Extension1|get#nonNullable1(#t56{self::Class1})), new self::Class1::•());
   nullable1 = let final self::Class1? #t57 = n1 in #t57 == null ?{self::Class1?} null : let final self::Class1 #t58 = new self::Class1::•() in let final void #t59 = self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(self::Extension1|get#nonNullable1(#t57{self::Class1})), #t58) in #t58;
   let final self::Class1? #t60 = n1 in #t60 == null ?{self::Class1?} null : let final self::Class1? #t61 = self::Extension1|get#nullable1(self::Extension1|get#nonNullable1(#t60{self::Class1})) in #t61 == null ?{self::Class1?} null : self::Extension1|nonNullable1Method(#t61{self::Class1});
-  let final self::Class1? #t62 = n1 in #t62 == null ?{void} null : self::Extension1|set#nullable1(#t62{self::Class1}, self::Extension1|get#nullable1(self::Extension1|get#nonNullable1(new self::Class1::•())));
+  let final self::Class1? #t62 = n1 in #t62 == null ?{self::Class1?} null : self::Extension1|set#nullable1(#t62{self::Class1}, self::Extension1|get#nullable1(self::Extension1|get#nonNullable1(new self::Class1::•())));
   nullable1 = let final self::Class1? #t63 = n1 in #t63 == null ?{self::Class1?} null : let final self::Class1? #t64 = self::Extension1|get#nullable1(self::Extension1|get#nonNullable1(new self::Class1::•())) in let final void #t65 = self::Extension1|set#nullable1(#t63{self::Class1}, #t64) in #t64;
-  let final self::Class1? #t66 = n1 in #t66 == null ?{void} null : self::Extension1|set#nullable1(#t66{self::Class1}, let final self::Class1 #t67 = new self::Class1::•() in let final void #t68 = self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(new self::Class1::•()), #t67) in #t67);
+  let final self::Class1? #t66 = n1 in #t66 == null ?{self::Class1?} null : self::Extension1|set#nullable1(#t66{self::Class1}, let final self::Class1 #t67 = new self::Class1::•() in let final void #t68 = self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(new self::Class1::•()), #t67) in #t67);
   nullable1 = let final self::Class1? #t69 = n1 in #t69 == null ?{self::Class1?} null : let final self::Class1 #t70 = let final self::Class1 #t71 = new self::Class1::•() in let final void #t72 = self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(new self::Class1::•()), #t71) in #t71 in let final void #t73 = self::Extension1|set#nullable1(#t69{self::Class1}, #t70) in #t70;
-  let final self::Class1? #t74 = n1 in #t74 == null ?{void} null : self::Extension1|set#nullable1(#t74{self::Class1}, self::Extension1|nonNullable1Method(self::Extension1|get#nonNullable1(new self::Class1::•())));
+  let final self::Class1? #t74 = n1 in #t74 == null ?{self::Class1?} null : self::Extension1|set#nullable1(#t74{self::Class1}, self::Extension1|nonNullable1Method(self::Extension1|get#nonNullable1(new self::Class1::•())));
   nullable1 = let final self::Class1? #t75 = n1 in #t75 == null ?{self::Class1?} null : let final self::Class1 #t76 = self::Extension1|nonNullable1Method(self::Extension1|get#nonNullable1(new self::Class1::•())) in let final void #t77 = self::Extension1|set#nullable1(#t75{self::Class1}, #t76) in #t76;
   let final self::Class1? #t78 = n1 in #t78 == null ?{self::Class1?} null : self::Extension1|get#nullable1(self::Extension1|get#nonNullable1(self::Extension1|nonNullable1Method(#t78{self::Class1})));
-  let final self::Class1? #t79 = n1 in #t79 == null ?{void} null : self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(self::Extension1|nonNullable1Method(#t79{self::Class1})), new self::Class1::•());
+  let final self::Class1? #t79 = n1 in #t79 == null ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(self::Extension1|nonNullable1Method(#t79{self::Class1})), new self::Class1::•());
   let final self::Class1? #t80 = n1 in #t80 == null ?{self::Class1?} null : self::Extension1|nonNullable1Method(self::Extension1|get#nonNullable1(self::Extension1|nonNullable1Method(#t80{self::Class1})));
-  let final self::Class1? #t81 = n1 in #t81 == null ?{void} null : self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t81{self::Class1}), self::Extension1|get#nullable1(new self::Class1::•()));
+  let final self::Class1? #t81 = n1 in #t81 == null ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t81{self::Class1}), self::Extension1|get#nullable1(new self::Class1::•()));
   nullable1 = let final self::Class1? #t82 = n1 in #t82 == null ?{self::Class1?} null : let final self::Class1? #t83 = self::Extension1|get#nullable1(new self::Class1::•()) in let final void #t84 = self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t82{self::Class1}), #t83) in #t83;
-  let final self::Class1? #t85 = n1 in #t85 == null ?{void} null : self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t85{self::Class1}), let final self::Class1 #t86 = new self::Class1::•() in let final void #t87 = self::Extension1|set#nullable1(new self::Class1::•(), #t86) in #t86);
+  let final self::Class1? #t85 = n1 in #t85 == null ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t85{self::Class1}), let final self::Class1 #t86 = new self::Class1::•() in let final void #t87 = self::Extension1|set#nullable1(new self::Class1::•(), #t86) in #t86);
   nullable1 = let final self::Class1? #t88 = n1 in #t88 == null ?{self::Class1?} null : let final self::Class1 #t89 = let final self::Class1 #t90 = new self::Class1::•() in let final void #t91 = self::Extension1|set#nullable1(new self::Class1::•(), #t90) in #t90 in let final void #t92 = self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t88{self::Class1}), #t89) in #t89;
-  let final self::Class1? #t93 = n1 in #t93 == null ?{void} null : self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t93{self::Class1}), self::Extension1|nonNullable1Method(new self::Class1::•()));
+  let final self::Class1? #t93 = n1 in #t93 == null ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t93{self::Class1}), self::Extension1|nonNullable1Method(new self::Class1::•()));
   nullable1 = let final self::Class1? #t94 = n1 in #t94 == null ?{self::Class1?} null : let final self::Class1 #t95 = self::Extension1|nonNullable1Method(new self::Class1::•()) in let final void #t96 = self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t94{self::Class1}), #t95) in #t95;
-  let final self::Class1? #t97 = n1 in #t97 == null ?{void} null : self::Extension1|set#nullable1(#t97{self::Class1}, let final self::Class1? #t98 = self::Extension1|get#nullable1(new self::Class1::•()) in let final void #t99 = self::Extension1|set#nullable1(new self::Class1::•(), #t98) in #t98);
+  let final self::Class1? #t97 = n1 in #t97 == null ?{self::Class1?} null : self::Extension1|set#nullable1(#t97{self::Class1}, let final self::Class1? #t98 = self::Extension1|get#nullable1(new self::Class1::•()) in let final void #t99 = self::Extension1|set#nullable1(new self::Class1::•(), #t98) in #t98);
   nullable1 = let final self::Class1? #t100 = n1 in #t100 == null ?{self::Class1?} null : let final self::Class1? #t101 = let final self::Class1? #t102 = self::Extension1|get#nullable1(new self::Class1::•()) in let final void #t103 = self::Extension1|set#nullable1(new self::Class1::•(), #t102) in #t102 in let final void #t104 = self::Extension1|set#nullable1(#t100{self::Class1}, #t101) in #t101;
-  let final self::Class1? #t105 = n1 in #t105 == null ?{void} null : self::Extension1|set#nullable1(#t105{self::Class1}, let final self::Class1 #t106 = let final self::Class1 #t107 = new self::Class1::•() in let final void #t108 = self::Extension1|set#nullable1(new self::Class1::•(), #t107) in #t107 in let final void #t109 = self::Extension1|set#nullable1(new self::Class1::•(), #t106) in #t106);
+  let final self::Class1? #t105 = n1 in #t105 == null ?{self::Class1?} null : self::Extension1|set#nullable1(#t105{self::Class1}, let final self::Class1 #t106 = let final self::Class1 #t107 = new self::Class1::•() in let final void #t108 = self::Extension1|set#nullable1(new self::Class1::•(), #t107) in #t107 in let final void #t109 = self::Extension1|set#nullable1(new self::Class1::•(), #t106) in #t106);
   nullable1 = let final self::Class1? #t110 = n1 in #t110 == null ?{self::Class1?} null : let final self::Class1 #t111 = let final self::Class1 #t112 = let final self::Class1 #t113 = new self::Class1::•() in let final void #t114 = self::Extension1|set#nullable1(new self::Class1::•(), #t113) in #t113 in let final void #t115 = self::Extension1|set#nullable1(new self::Class1::•(), #t112) in #t112 in let final void #t116 = self::Extension1|set#nullable1(#t110{self::Class1}, #t111) in #t111;
-  let final self::Class1? #t117 = n1 in #t117 == null ?{void} null : self::Extension1|set#nullable1(#t117{self::Class1}, let final self::Class1 #t118 = self::Extension1|nonNullable1Method(new self::Class1::•()) in let final void #t119 = self::Extension1|set#nullable1(new self::Class1::•(), #t118) in #t118);
+  let final self::Class1? #t117 = n1 in #t117 == null ?{self::Class1?} null : self::Extension1|set#nullable1(#t117{self::Class1}, let final self::Class1 #t118 = self::Extension1|nonNullable1Method(new self::Class1::•()) in let final void #t119 = self::Extension1|set#nullable1(new self::Class1::•(), #t118) in #t118);
   nullable1 = let final self::Class1? #t120 = n1 in #t120 == null ?{self::Class1?} null : let final self::Class1 #t121 = let final self::Class1 #t122 = self::Extension1|nonNullable1Method(new self::Class1::•()) in let final void #t123 = self::Extension1|set#nullable1(new self::Class1::•(), #t122) in #t122 in let final void #t124 = self::Extension1|set#nullable1(#t120{self::Class1}, #t121) in #t121;
-  let final self::Class1? #t125 = n1 in #t125 == null ?{void} null : self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t125{self::Class1}), self::Extension1|get#nullable1(new self::Class1::•()));
+  let final self::Class1? #t125 = n1 in #t125 == null ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t125{self::Class1}), self::Extension1|get#nullable1(new self::Class1::•()));
   nullable1 = let final self::Class1? #t126 = n1 in #t126 == null ?{self::Class1?} null : let final self::Class1? #t127 = self::Extension1|get#nullable1(new self::Class1::•()) in let final void #t128 = self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t126{self::Class1}), #t127) in #t127;
-  let final self::Class1? #t129 = n1 in #t129 == null ?{void} null : self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t129{self::Class1}), let final self::Class1 #t130 = new self::Class1::•() in let final void #t131 = self::Extension1|set#nullable1(new self::Class1::•(), #t130) in #t130);
+  let final self::Class1? #t129 = n1 in #t129 == null ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t129{self::Class1}), let final self::Class1 #t130 = new self::Class1::•() in let final void #t131 = self::Extension1|set#nullable1(new self::Class1::•(), #t130) in #t130);
   nullable1 = let final self::Class1? #t132 = n1 in #t132 == null ?{self::Class1?} null : let final self::Class1 #t133 = let final self::Class1 #t134 = new self::Class1::•() in let final void #t135 = self::Extension1|set#nullable1(new self::Class1::•(), #t134) in #t134 in let final void #t136 = self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t132{self::Class1}), #t133) in #t133;
-  let final self::Class1? #t137 = n1 in #t137 == null ?{void} null : self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t137{self::Class1}), self::Extension1|nonNullable1Method(new self::Class1::•()));
+  let final self::Class1? #t137 = n1 in #t137 == null ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t137{self::Class1}), self::Extension1|nonNullable1Method(new self::Class1::•()));
   nullable1 = let final self::Class1? #t138 = n1 in #t138 == null ?{self::Class1?} null : let final self::Class1 #t139 = self::Extension1|nonNullable1Method(new self::Class1::•()) in let final void #t140 = self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t138{self::Class1}), #t139) in #t139;
   let final self::Class1? #t141 = n1 in #t141 == null ?{self::Class1?} null : self::Extension1|get#nullable1(self::Extension1|nonNullable1Method(self::Extension1|get#nonNullable1(#t141{self::Class1})));
-  let final self::Class1? #t142 = n1 in #t142 == null ?{void} null : self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(self::Extension1|get#nonNullable1(#t142{self::Class1})), new self::Class1::•());
+  let final self::Class1? #t142 = n1 in #t142 == null ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(self::Extension1|get#nonNullable1(#t142{self::Class1})), new self::Class1::•());
   nullable1 = let final self::Class1? #t143 = n1 in #t143 == null ?{self::Class1?} null : let final self::Class1 #t144 = new self::Class1::•() in let final void #t145 = self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(self::Extension1|get#nonNullable1(#t143{self::Class1})), #t144) in #t144;
   let final self::Class1? #t146 = n1 in #t146 == null ?{self::Class1?} null : self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(self::Extension1|get#nonNullable1(#t146{self::Class1})));
-  let final self::Class1? #t147 = n1 in #t147 == null ?{void} null : self::Extension1|set#nullable1(#t147{self::Class1}, self::Extension1|get#nullable1(self::Extension1|nonNullable1Method(new self::Class1::•())));
+  let final self::Class1? #t147 = n1 in #t147 == null ?{self::Class1?} null : self::Extension1|set#nullable1(#t147{self::Class1}, self::Extension1|get#nullable1(self::Extension1|nonNullable1Method(new self::Class1::•())));
   nullable1 = let final self::Class1? #t148 = n1 in #t148 == null ?{self::Class1?} null : let final self::Class1? #t149 = self::Extension1|get#nullable1(self::Extension1|nonNullable1Method(new self::Class1::•())) in let final void #t150 = self::Extension1|set#nullable1(#t148{self::Class1}, #t149) in #t149;
-  let final self::Class1? #t151 = n1 in #t151 == null ?{void} null : self::Extension1|set#nullable1(#t151{self::Class1}, let final self::Class1 #t152 = new self::Class1::•() in let final void #t153 = self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(new self::Class1::•()), #t152) in #t152);
+  let final self::Class1? #t151 = n1 in #t151 == null ?{self::Class1?} null : self::Extension1|set#nullable1(#t151{self::Class1}, let final self::Class1 #t152 = new self::Class1::•() in let final void #t153 = self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(new self::Class1::•()), #t152) in #t152);
   nullable1 = let final self::Class1? #t154 = n1 in #t154 == null ?{self::Class1?} null : let final self::Class1 #t155 = let final self::Class1 #t156 = new self::Class1::•() in let final void #t157 = self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(new self::Class1::•()), #t156) in #t156 in let final void #t158 = self::Extension1|set#nullable1(#t154{self::Class1}, #t155) in #t155;
-  let final self::Class1? #t159 = n1 in #t159 == null ?{void} null : self::Extension1|set#nullable1(#t159{self::Class1}, self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(new self::Class1::•())));
+  let final self::Class1? #t159 = n1 in #t159 == null ?{self::Class1?} null : self::Extension1|set#nullable1(#t159{self::Class1}, self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(new self::Class1::•())));
   nullable1 = let final self::Class1? #t160 = n1 in #t160 == null ?{self::Class1?} null : let final self::Class1 #t161 = self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(new self::Class1::•())) in let final void #t162 = self::Extension1|set#nullable1(#t160{self::Class1}, #t161) in #t161;
   let final self::Class1? #t163 = n1 in #t163 == null ?{self::Class1?} null : self::Extension1|get#nullable1(self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(#t163{self::Class1})));
-  let final self::Class1? #t164 = n1 in #t164 == null ?{void} null : self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(#t164{self::Class1})), new self::Class1::•());
+  let final self::Class1? #t164 = n1 in #t164 == null ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(#t164{self::Class1})), new self::Class1::•());
   let final self::Class1? #t165 = n1 in #t165 == null ?{self::Class1?} null : self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(#t165{self::Class1})));
   let final self::Class1? #t166 = n1 in #t166 == null ?{self::Class1?} null : let final self::Class1 #t167 = self::Extension1|nonNullable1Method(#t166{self::Class1}) in #t167 == null ?{self::Class1?} null : self::Extension1|nonNullable1Method(#t167);
 }
diff --git a/pkg/front_end/testcases/nnbd/null_shorting_extension.dart.strong.modular.expect b/pkg/front_end/testcases/nnbd/null_shorting_extension.dart.strong.modular.expect
index 541d58f..bf28ebb 100644
--- a/pkg/front_end/testcases/nnbd/null_shorting_extension.dart.strong.modular.expect
+++ b/pkg/front_end/testcases/nnbd/null_shorting_extension.dart.strong.modular.expect
@@ -129,15 +129,15 @@
 static method propertyAccess(self::Class1? n1) → void {
   self::Class1? nullable1 = n1;
   let final self::Class1? #t1 = n1 in #t1 == null ?{self::Class1?} null : self::Extension1|get#nullable1(#t1{self::Class1});
-  let final self::Class1? #t2 = n1 in #t2 == null ?{void} null : self::Extension1|set#nullable1(#t2{self::Class1}, new self::Class1::•());
+  let final self::Class1? #t2 = n1 in #t2 == null ?{self::Class1?} null : self::Extension1|set#nullable1(#t2{self::Class1}, new self::Class1::•());
   nullable1 = let final self::Class1? #t3 = n1 in #t3 == null ?{self::Class1?} null : let final self::Class1 #t4 = new self::Class1::•() in let final void #t5 = self::Extension1|set#nullable1(#t3{self::Class1}, #t4) in #t4;
   let final self::Class1? #t6 = n1 in #t6 == null ?{self::Class1?} null : self::Extension1|nonNullable1Method(#t6{self::Class1});
   let final self::Class1? #t7 = n1 in #t7 == null ?{self::Class1?} null : self::Extension1|get#nullable1(self::Extension1|get#nonNullable1(#t7{self::Class1}));
   let final self::Class1? #t8 = n1 in #t8 == null ?{self::Class1?} null : let final self::Class1? #t9 = self::Extension1|get#nullable1(#t8{self::Class1}) in #t9 == null ?{self::Class1?} null : self::Extension1|get#nullable1(#t9{self::Class1});
   let final self::Class1? #t10 = n1 in #t10 == null ?{self::Class1?} null : let final self::Class1? #t11 = self::Extension1|get#nullable1(self::Extension1|get#nonNullable1(#t10{self::Class1})) in #t11 == null ?{self::Class1?} null : self::Extension1|get#nullable1(#t11{self::Class1});
-  let final self::Class1? #t12 = n1 in #t12 == null ?{void} null : self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t12{self::Class1}), new self::Class1::•());
-  let final self::Class1? #t13 = n1 in #t13 == null ?{void} null : let final self::Class1? #t14 = self::Extension1|get#nullable1(#t13{self::Class1}) in #t14 == null ?{void} null : self::Extension1|set#nullable1(#t14{self::Class1}, new self::Class1::•());
-  let final self::Class1? #t15 = n1 in #t15 == null ?{void} null : let final self::Class1? #t16 = self::Extension1|get#nullable1(self::Extension1|get#nonNullable1(#t15{self::Class1})) in #t16 == null ?{void} null : self::Extension1|set#nullable1(#t16{self::Class1}, new self::Class1::•());
+  let final self::Class1? #t12 = n1 in #t12 == null ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t12{self::Class1}), new self::Class1::•());
+  let final self::Class1? #t13 = n1 in #t13 == null ?{self::Class1?} null : let final self::Class1? #t14 = self::Extension1|get#nullable1(#t13{self::Class1}) in #t14 == null ?{self::Class1?} null : self::Extension1|set#nullable1(#t14{self::Class1}, new self::Class1::•());
+  let final self::Class1? #t15 = n1 in #t15 == null ?{self::Class1?} null : let final self::Class1? #t16 = self::Extension1|get#nullable1(self::Extension1|get#nonNullable1(#t15{self::Class1})) in #t16 == null ?{self::Class1?} null : self::Extension1|set#nullable1(#t16{self::Class1}, new self::Class1::•());
   let final self::Class1? #t17 = let final self::Class1? #t18 = n1 in #t18 == null ?{self::Class1?} null : self::Extension1|get#nullable1(#t18{self::Class1}) in #t17 == null ?{self::Class1?} null : self::Extension1|get#nullable1(#t17{self::Class1});
   self::throws(() → void => invalid-expression "pkg/front_end/testcases/nnbd/null_shorting_extension.dart:93:47: Error: Property 'nullable1' cannot be accessed on 'Class1?' because it is potentially null.
  - 'Class1' is from 'pkg/front_end/testcases/nnbd/null_shorting_extension.dart'.
@@ -153,58 +153,58 @@
   nullable1 = let final self::Class1? #t26 = n1 in #t26 == null ?{self::Class1?} null : let final self::Class1? #t27 = self::Extension1|get#nullable1(#t26{self::Class1}) in #t27 == null ?{self::Class1?} null : let final self::Class1 #t28 = new self::Class1::•() in let final void #t29 = self::Extension1|set#nullable1(#t27{self::Class1}, #t28) in #t28;
   nullable1 = let final self::Class1? #t30 = n1 in #t30 == null ?{self::Class1?} null : let final self::Class1? #t31 = self::Extension1|get#nullable1(self::Extension1|get#nonNullable1(#t30{self::Class1})) in #t31 == null ?{self::Class1?} null : let final self::Class1 #t32 = new self::Class1::•() in let final void #t33 = self::Extension1|set#nullable1(#t31{self::Class1}, #t32) in #t32;
   let final self::Class1? #t34 = n1 in #t34 == null ?{self::Class1?} null : let final self::Class1? #t35 = self::Extension1|get#nullable1(#t34{self::Class1}) in #t35 == null ?{self::Class1?} null : self::Extension1|nonNullable1Method(#t35{self::Class1});
-  let final self::Class1? #t36 = n1 in #t36 == null ?{void} null : self::Extension1|set#nullable1(#t36{self::Class1}, self::Extension1|get#nullable1(new self::Class1::•()));
+  let final self::Class1? #t36 = n1 in #t36 == null ?{self::Class1?} null : self::Extension1|set#nullable1(#t36{self::Class1}, self::Extension1|get#nullable1(new self::Class1::•()));
   nullable1 = let final self::Class1? #t37 = n1 in #t37 == null ?{self::Class1?} null : let final self::Class1? #t38 = self::Extension1|get#nullable1(new self::Class1::•()) in let final void #t39 = self::Extension1|set#nullable1(#t37{self::Class1}, #t38) in #t38;
-  let final self::Class1? #t40 = n1 in #t40 == null ?{void} null : self::Extension1|set#nullable1(#t40{self::Class1}, let final self::Class1 #t41 = new self::Class1::•() in let final void #t42 = self::Extension1|set#nullable1(new self::Class1::•(), #t41) in #t41);
+  let final self::Class1? #t40 = n1 in #t40 == null ?{self::Class1?} null : self::Extension1|set#nullable1(#t40{self::Class1}, let final self::Class1 #t41 = new self::Class1::•() in let final void #t42 = self::Extension1|set#nullable1(new self::Class1::•(), #t41) in #t41);
   nullable1 = let final self::Class1? #t43 = n1 in #t43 == null ?{self::Class1?} null : let final self::Class1 #t44 = let final self::Class1 #t45 = new self::Class1::•() in let final void #t46 = self::Extension1|set#nullable1(new self::Class1::•(), #t45) in #t45 in let final void #t47 = self::Extension1|set#nullable1(#t43{self::Class1}, #t44) in #t44;
-  let final self::Class1? #t48 = n1 in #t48 == null ?{void} null : self::Extension1|set#nullable1(#t48{self::Class1}, self::Extension1|nonNullable1Method(new self::Class1::•()));
+  let final self::Class1? #t48 = n1 in #t48 == null ?{self::Class1?} null : self::Extension1|set#nullable1(#t48{self::Class1}, self::Extension1|nonNullable1Method(new self::Class1::•()));
   nullable1 = let final self::Class1? #t49 = n1 in #t49 == null ?{self::Class1?} null : let final self::Class1 #t50 = self::Extension1|nonNullable1Method(new self::Class1::•()) in let final void #t51 = self::Extension1|set#nullable1(#t49{self::Class1}, #t50) in #t50;
   let final self::Class1? #t52 = n1 in #t52 == null ?{self::Class1?} null : self::Extension1|get#nullable1(self::Extension1|nonNullable1Method(#t52{self::Class1}));
-  let final self::Class1? #t53 = n1 in #t53 == null ?{void} null : self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t53{self::Class1}), new self::Class1::•());
+  let final self::Class1? #t53 = n1 in #t53 == null ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t53{self::Class1}), new self::Class1::•());
   let final self::Class1? #t54 = n1 in #t54 == null ?{self::Class1?} null : self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(#t54{self::Class1}));
   let final self::Class1? #t55 = n1 in #t55 == null ?{self::Class1?} null : self::Extension1|get#nullable1(self::Extension1|get#nonNullable1(self::Extension1|get#nonNullable1(#t55{self::Class1})));
-  let final self::Class1? #t56 = n1 in #t56 == null ?{void} null : self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(self::Extension1|get#nonNullable1(#t56{self::Class1})), new self::Class1::•());
+  let final self::Class1? #t56 = n1 in #t56 == null ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(self::Extension1|get#nonNullable1(#t56{self::Class1})), new self::Class1::•());
   nullable1 = let final self::Class1? #t57 = n1 in #t57 == null ?{self::Class1?} null : let final self::Class1 #t58 = new self::Class1::•() in let final void #t59 = self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(self::Extension1|get#nonNullable1(#t57{self::Class1})), #t58) in #t58;
   let final self::Class1? #t60 = n1 in #t60 == null ?{self::Class1?} null : let final self::Class1? #t61 = self::Extension1|get#nullable1(self::Extension1|get#nonNullable1(#t60{self::Class1})) in #t61 == null ?{self::Class1?} null : self::Extension1|nonNullable1Method(#t61{self::Class1});
-  let final self::Class1? #t62 = n1 in #t62 == null ?{void} null : self::Extension1|set#nullable1(#t62{self::Class1}, self::Extension1|get#nullable1(self::Extension1|get#nonNullable1(new self::Class1::•())));
+  let final self::Class1? #t62 = n1 in #t62 == null ?{self::Class1?} null : self::Extension1|set#nullable1(#t62{self::Class1}, self::Extension1|get#nullable1(self::Extension1|get#nonNullable1(new self::Class1::•())));
   nullable1 = let final self::Class1? #t63 = n1 in #t63 == null ?{self::Class1?} null : let final self::Class1? #t64 = self::Extension1|get#nullable1(self::Extension1|get#nonNullable1(new self::Class1::•())) in let final void #t65 = self::Extension1|set#nullable1(#t63{self::Class1}, #t64) in #t64;
-  let final self::Class1? #t66 = n1 in #t66 == null ?{void} null : self::Extension1|set#nullable1(#t66{self::Class1}, let final self::Class1 #t67 = new self::Class1::•() in let final void #t68 = self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(new self::Class1::•()), #t67) in #t67);
+  let final self::Class1? #t66 = n1 in #t66 == null ?{self::Class1?} null : self::Extension1|set#nullable1(#t66{self::Class1}, let final self::Class1 #t67 = new self::Class1::•() in let final void #t68 = self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(new self::Class1::•()), #t67) in #t67);
   nullable1 = let final self::Class1? #t69 = n1 in #t69 == null ?{self::Class1?} null : let final self::Class1 #t70 = let final self::Class1 #t71 = new self::Class1::•() in let final void #t72 = self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(new self::Class1::•()), #t71) in #t71 in let final void #t73 = self::Extension1|set#nullable1(#t69{self::Class1}, #t70) in #t70;
-  let final self::Class1? #t74 = n1 in #t74 == null ?{void} null : self::Extension1|set#nullable1(#t74{self::Class1}, self::Extension1|nonNullable1Method(self::Extension1|get#nonNullable1(new self::Class1::•())));
+  let final self::Class1? #t74 = n1 in #t74 == null ?{self::Class1?} null : self::Extension1|set#nullable1(#t74{self::Class1}, self::Extension1|nonNullable1Method(self::Extension1|get#nonNullable1(new self::Class1::•())));
   nullable1 = let final self::Class1? #t75 = n1 in #t75 == null ?{self::Class1?} null : let final self::Class1 #t76 = self::Extension1|nonNullable1Method(self::Extension1|get#nonNullable1(new self::Class1::•())) in let final void #t77 = self::Extension1|set#nullable1(#t75{self::Class1}, #t76) in #t76;
   let final self::Class1? #t78 = n1 in #t78 == null ?{self::Class1?} null : self::Extension1|get#nullable1(self::Extension1|get#nonNullable1(self::Extension1|nonNullable1Method(#t78{self::Class1})));
-  let final self::Class1? #t79 = n1 in #t79 == null ?{void} null : self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(self::Extension1|nonNullable1Method(#t79{self::Class1})), new self::Class1::•());
+  let final self::Class1? #t79 = n1 in #t79 == null ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(self::Extension1|nonNullable1Method(#t79{self::Class1})), new self::Class1::•());
   let final self::Class1? #t80 = n1 in #t80 == null ?{self::Class1?} null : self::Extension1|nonNullable1Method(self::Extension1|get#nonNullable1(self::Extension1|nonNullable1Method(#t80{self::Class1})));
-  let final self::Class1? #t81 = n1 in #t81 == null ?{void} null : self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t81{self::Class1}), self::Extension1|get#nullable1(new self::Class1::•()));
+  let final self::Class1? #t81 = n1 in #t81 == null ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t81{self::Class1}), self::Extension1|get#nullable1(new self::Class1::•()));
   nullable1 = let final self::Class1? #t82 = n1 in #t82 == null ?{self::Class1?} null : let final self::Class1? #t83 = self::Extension1|get#nullable1(new self::Class1::•()) in let final void #t84 = self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t82{self::Class1}), #t83) in #t83;
-  let final self::Class1? #t85 = n1 in #t85 == null ?{void} null : self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t85{self::Class1}), let final self::Class1 #t86 = new self::Class1::•() in let final void #t87 = self::Extension1|set#nullable1(new self::Class1::•(), #t86) in #t86);
+  let final self::Class1? #t85 = n1 in #t85 == null ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t85{self::Class1}), let final self::Class1 #t86 = new self::Class1::•() in let final void #t87 = self::Extension1|set#nullable1(new self::Class1::•(), #t86) in #t86);
   nullable1 = let final self::Class1? #t88 = n1 in #t88 == null ?{self::Class1?} null : let final self::Class1 #t89 = let final self::Class1 #t90 = new self::Class1::•() in let final void #t91 = self::Extension1|set#nullable1(new self::Class1::•(), #t90) in #t90 in let final void #t92 = self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t88{self::Class1}), #t89) in #t89;
-  let final self::Class1? #t93 = n1 in #t93 == null ?{void} null : self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t93{self::Class1}), self::Extension1|nonNullable1Method(new self::Class1::•()));
+  let final self::Class1? #t93 = n1 in #t93 == null ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t93{self::Class1}), self::Extension1|nonNullable1Method(new self::Class1::•()));
   nullable1 = let final self::Class1? #t94 = n1 in #t94 == null ?{self::Class1?} null : let final self::Class1 #t95 = self::Extension1|nonNullable1Method(new self::Class1::•()) in let final void #t96 = self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t94{self::Class1}), #t95) in #t95;
-  let final self::Class1? #t97 = n1 in #t97 == null ?{void} null : self::Extension1|set#nullable1(#t97{self::Class1}, let final self::Class1? #t98 = self::Extension1|get#nullable1(new self::Class1::•()) in let final void #t99 = self::Extension1|set#nullable1(new self::Class1::•(), #t98) in #t98);
+  let final self::Class1? #t97 = n1 in #t97 == null ?{self::Class1?} null : self::Extension1|set#nullable1(#t97{self::Class1}, let final self::Class1? #t98 = self::Extension1|get#nullable1(new self::Class1::•()) in let final void #t99 = self::Extension1|set#nullable1(new self::Class1::•(), #t98) in #t98);
   nullable1 = let final self::Class1? #t100 = n1 in #t100 == null ?{self::Class1?} null : let final self::Class1? #t101 = let final self::Class1? #t102 = self::Extension1|get#nullable1(new self::Class1::•()) in let final void #t103 = self::Extension1|set#nullable1(new self::Class1::•(), #t102) in #t102 in let final void #t104 = self::Extension1|set#nullable1(#t100{self::Class1}, #t101) in #t101;
-  let final self::Class1? #t105 = n1 in #t105 == null ?{void} null : self::Extension1|set#nullable1(#t105{self::Class1}, let final self::Class1 #t106 = let final self::Class1 #t107 = new self::Class1::•() in let final void #t108 = self::Extension1|set#nullable1(new self::Class1::•(), #t107) in #t107 in let final void #t109 = self::Extension1|set#nullable1(new self::Class1::•(), #t106) in #t106);
+  let final self::Class1? #t105 = n1 in #t105 == null ?{self::Class1?} null : self::Extension1|set#nullable1(#t105{self::Class1}, let final self::Class1 #t106 = let final self::Class1 #t107 = new self::Class1::•() in let final void #t108 = self::Extension1|set#nullable1(new self::Class1::•(), #t107) in #t107 in let final void #t109 = self::Extension1|set#nullable1(new self::Class1::•(), #t106) in #t106);
   nullable1 = let final self::Class1? #t110 = n1 in #t110 == null ?{self::Class1?} null : let final self::Class1 #t111 = let final self::Class1 #t112 = let final self::Class1 #t113 = new self::Class1::•() in let final void #t114 = self::Extension1|set#nullable1(new self::Class1::•(), #t113) in #t113 in let final void #t115 = self::Extension1|set#nullable1(new self::Class1::•(), #t112) in #t112 in let final void #t116 = self::Extension1|set#nullable1(#t110{self::Class1}, #t111) in #t111;
-  let final self::Class1? #t117 = n1 in #t117 == null ?{void} null : self::Extension1|set#nullable1(#t117{self::Class1}, let final self::Class1 #t118 = self::Extension1|nonNullable1Method(new self::Class1::•()) in let final void #t119 = self::Extension1|set#nullable1(new self::Class1::•(), #t118) in #t118);
+  let final self::Class1? #t117 = n1 in #t117 == null ?{self::Class1?} null : self::Extension1|set#nullable1(#t117{self::Class1}, let final self::Class1 #t118 = self::Extension1|nonNullable1Method(new self::Class1::•()) in let final void #t119 = self::Extension1|set#nullable1(new self::Class1::•(), #t118) in #t118);
   nullable1 = let final self::Class1? #t120 = n1 in #t120 == null ?{self::Class1?} null : let final self::Class1 #t121 = let final self::Class1 #t122 = self::Extension1|nonNullable1Method(new self::Class1::•()) in let final void #t123 = self::Extension1|set#nullable1(new self::Class1::•(), #t122) in #t122 in let final void #t124 = self::Extension1|set#nullable1(#t120{self::Class1}, #t121) in #t121;
-  let final self::Class1? #t125 = n1 in #t125 == null ?{void} null : self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t125{self::Class1}), self::Extension1|get#nullable1(new self::Class1::•()));
+  let final self::Class1? #t125 = n1 in #t125 == null ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t125{self::Class1}), self::Extension1|get#nullable1(new self::Class1::•()));
   nullable1 = let final self::Class1? #t126 = n1 in #t126 == null ?{self::Class1?} null : let final self::Class1? #t127 = self::Extension1|get#nullable1(new self::Class1::•()) in let final void #t128 = self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t126{self::Class1}), #t127) in #t127;
-  let final self::Class1? #t129 = n1 in #t129 == null ?{void} null : self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t129{self::Class1}), let final self::Class1 #t130 = new self::Class1::•() in let final void #t131 = self::Extension1|set#nullable1(new self::Class1::•(), #t130) in #t130);
+  let final self::Class1? #t129 = n1 in #t129 == null ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t129{self::Class1}), let final self::Class1 #t130 = new self::Class1::•() in let final void #t131 = self::Extension1|set#nullable1(new self::Class1::•(), #t130) in #t130);
   nullable1 = let final self::Class1? #t132 = n1 in #t132 == null ?{self::Class1?} null : let final self::Class1 #t133 = let final self::Class1 #t134 = new self::Class1::•() in let final void #t135 = self::Extension1|set#nullable1(new self::Class1::•(), #t134) in #t134 in let final void #t136 = self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t132{self::Class1}), #t133) in #t133;
-  let final self::Class1? #t137 = n1 in #t137 == null ?{void} null : self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t137{self::Class1}), self::Extension1|nonNullable1Method(new self::Class1::•()));
+  let final self::Class1? #t137 = n1 in #t137 == null ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t137{self::Class1}), self::Extension1|nonNullable1Method(new self::Class1::•()));
   nullable1 = let final self::Class1? #t138 = n1 in #t138 == null ?{self::Class1?} null : let final self::Class1 #t139 = self::Extension1|nonNullable1Method(new self::Class1::•()) in let final void #t140 = self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t138{self::Class1}), #t139) in #t139;
   let final self::Class1? #t141 = n1 in #t141 == null ?{self::Class1?} null : self::Extension1|get#nullable1(self::Extension1|nonNullable1Method(self::Extension1|get#nonNullable1(#t141{self::Class1})));
-  let final self::Class1? #t142 = n1 in #t142 == null ?{void} null : self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(self::Extension1|get#nonNullable1(#t142{self::Class1})), new self::Class1::•());
+  let final self::Class1? #t142 = n1 in #t142 == null ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(self::Extension1|get#nonNullable1(#t142{self::Class1})), new self::Class1::•());
   nullable1 = let final self::Class1? #t143 = n1 in #t143 == null ?{self::Class1?} null : let final self::Class1 #t144 = new self::Class1::•() in let final void #t145 = self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(self::Extension1|get#nonNullable1(#t143{self::Class1})), #t144) in #t144;
   let final self::Class1? #t146 = n1 in #t146 == null ?{self::Class1?} null : self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(self::Extension1|get#nonNullable1(#t146{self::Class1})));
-  let final self::Class1? #t147 = n1 in #t147 == null ?{void} null : self::Extension1|set#nullable1(#t147{self::Class1}, self::Extension1|get#nullable1(self::Extension1|nonNullable1Method(new self::Class1::•())));
+  let final self::Class1? #t147 = n1 in #t147 == null ?{self::Class1?} null : self::Extension1|set#nullable1(#t147{self::Class1}, self::Extension1|get#nullable1(self::Extension1|nonNullable1Method(new self::Class1::•())));
   nullable1 = let final self::Class1? #t148 = n1 in #t148 == null ?{self::Class1?} null : let final self::Class1? #t149 = self::Extension1|get#nullable1(self::Extension1|nonNullable1Method(new self::Class1::•())) in let final void #t150 = self::Extension1|set#nullable1(#t148{self::Class1}, #t149) in #t149;
-  let final self::Class1? #t151 = n1 in #t151 == null ?{void} null : self::Extension1|set#nullable1(#t151{self::Class1}, let final self::Class1 #t152 = new self::Class1::•() in let final void #t153 = self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(new self::Class1::•()), #t152) in #t152);
+  let final self::Class1? #t151 = n1 in #t151 == null ?{self::Class1?} null : self::Extension1|set#nullable1(#t151{self::Class1}, let final self::Class1 #t152 = new self::Class1::•() in let final void #t153 = self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(new self::Class1::•()), #t152) in #t152);
   nullable1 = let final self::Class1? #t154 = n1 in #t154 == null ?{self::Class1?} null : let final self::Class1 #t155 = let final self::Class1 #t156 = new self::Class1::•() in let final void #t157 = self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(new self::Class1::•()), #t156) in #t156 in let final void #t158 = self::Extension1|set#nullable1(#t154{self::Class1}, #t155) in #t155;
-  let final self::Class1? #t159 = n1 in #t159 == null ?{void} null : self::Extension1|set#nullable1(#t159{self::Class1}, self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(new self::Class1::•())));
+  let final self::Class1? #t159 = n1 in #t159 == null ?{self::Class1?} null : self::Extension1|set#nullable1(#t159{self::Class1}, self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(new self::Class1::•())));
   nullable1 = let final self::Class1? #t160 = n1 in #t160 == null ?{self::Class1?} null : let final self::Class1 #t161 = self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(new self::Class1::•())) in let final void #t162 = self::Extension1|set#nullable1(#t160{self::Class1}, #t161) in #t161;
   let final self::Class1? #t163 = n1 in #t163 == null ?{self::Class1?} null : self::Extension1|get#nullable1(self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(#t163{self::Class1})));
-  let final self::Class1? #t164 = n1 in #t164 == null ?{void} null : self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(#t164{self::Class1})), new self::Class1::•());
+  let final self::Class1? #t164 = n1 in #t164 == null ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(#t164{self::Class1})), new self::Class1::•());
   let final self::Class1? #t165 = n1 in #t165 == null ?{self::Class1?} null : self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(#t165{self::Class1})));
   let final self::Class1? #t166 = n1 in #t166 == null ?{self::Class1?} null : let final self::Class1 #t167 = self::Extension1|nonNullable1Method(#t166{self::Class1}) in #t167 == null ?{self::Class1?} null : self::Extension1|nonNullable1Method(#t167);
 }
diff --git a/pkg/front_end/testcases/nnbd/null_shorting_extension.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/null_shorting_extension.dart.strong.transformed.expect
index 541d58f..bf28ebb 100644
--- a/pkg/front_end/testcases/nnbd/null_shorting_extension.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/null_shorting_extension.dart.strong.transformed.expect
@@ -129,15 +129,15 @@
 static method propertyAccess(self::Class1? n1) → void {
   self::Class1? nullable1 = n1;
   let final self::Class1? #t1 = n1 in #t1 == null ?{self::Class1?} null : self::Extension1|get#nullable1(#t1{self::Class1});
-  let final self::Class1? #t2 = n1 in #t2 == null ?{void} null : self::Extension1|set#nullable1(#t2{self::Class1}, new self::Class1::•());
+  let final self::Class1? #t2 = n1 in #t2 == null ?{self::Class1?} null : self::Extension1|set#nullable1(#t2{self::Class1}, new self::Class1::•());
   nullable1 = let final self::Class1? #t3 = n1 in #t3 == null ?{self::Class1?} null : let final self::Class1 #t4 = new self::Class1::•() in let final void #t5 = self::Extension1|set#nullable1(#t3{self::Class1}, #t4) in #t4;
   let final self::Class1? #t6 = n1 in #t6 == null ?{self::Class1?} null : self::Extension1|nonNullable1Method(#t6{self::Class1});
   let final self::Class1? #t7 = n1 in #t7 == null ?{self::Class1?} null : self::Extension1|get#nullable1(self::Extension1|get#nonNullable1(#t7{self::Class1}));
   let final self::Class1? #t8 = n1 in #t8 == null ?{self::Class1?} null : let final self::Class1? #t9 = self::Extension1|get#nullable1(#t8{self::Class1}) in #t9 == null ?{self::Class1?} null : self::Extension1|get#nullable1(#t9{self::Class1});
   let final self::Class1? #t10 = n1 in #t10 == null ?{self::Class1?} null : let final self::Class1? #t11 = self::Extension1|get#nullable1(self::Extension1|get#nonNullable1(#t10{self::Class1})) in #t11 == null ?{self::Class1?} null : self::Extension1|get#nullable1(#t11{self::Class1});
-  let final self::Class1? #t12 = n1 in #t12 == null ?{void} null : self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t12{self::Class1}), new self::Class1::•());
-  let final self::Class1? #t13 = n1 in #t13 == null ?{void} null : let final self::Class1? #t14 = self::Extension1|get#nullable1(#t13{self::Class1}) in #t14 == null ?{void} null : self::Extension1|set#nullable1(#t14{self::Class1}, new self::Class1::•());
-  let final self::Class1? #t15 = n1 in #t15 == null ?{void} null : let final self::Class1? #t16 = self::Extension1|get#nullable1(self::Extension1|get#nonNullable1(#t15{self::Class1})) in #t16 == null ?{void} null : self::Extension1|set#nullable1(#t16{self::Class1}, new self::Class1::•());
+  let final self::Class1? #t12 = n1 in #t12 == null ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t12{self::Class1}), new self::Class1::•());
+  let final self::Class1? #t13 = n1 in #t13 == null ?{self::Class1?} null : let final self::Class1? #t14 = self::Extension1|get#nullable1(#t13{self::Class1}) in #t14 == null ?{self::Class1?} null : self::Extension1|set#nullable1(#t14{self::Class1}, new self::Class1::•());
+  let final self::Class1? #t15 = n1 in #t15 == null ?{self::Class1?} null : let final self::Class1? #t16 = self::Extension1|get#nullable1(self::Extension1|get#nonNullable1(#t15{self::Class1})) in #t16 == null ?{self::Class1?} null : self::Extension1|set#nullable1(#t16{self::Class1}, new self::Class1::•());
   let final self::Class1? #t17 = let final self::Class1? #t18 = n1 in #t18 == null ?{self::Class1?} null : self::Extension1|get#nullable1(#t18{self::Class1}) in #t17 == null ?{self::Class1?} null : self::Extension1|get#nullable1(#t17{self::Class1});
   self::throws(() → void => invalid-expression "pkg/front_end/testcases/nnbd/null_shorting_extension.dart:93:47: Error: Property 'nullable1' cannot be accessed on 'Class1?' because it is potentially null.
  - 'Class1' is from 'pkg/front_end/testcases/nnbd/null_shorting_extension.dart'.
@@ -153,58 +153,58 @@
   nullable1 = let final self::Class1? #t26 = n1 in #t26 == null ?{self::Class1?} null : let final self::Class1? #t27 = self::Extension1|get#nullable1(#t26{self::Class1}) in #t27 == null ?{self::Class1?} null : let final self::Class1 #t28 = new self::Class1::•() in let final void #t29 = self::Extension1|set#nullable1(#t27{self::Class1}, #t28) in #t28;
   nullable1 = let final self::Class1? #t30 = n1 in #t30 == null ?{self::Class1?} null : let final self::Class1? #t31 = self::Extension1|get#nullable1(self::Extension1|get#nonNullable1(#t30{self::Class1})) in #t31 == null ?{self::Class1?} null : let final self::Class1 #t32 = new self::Class1::•() in let final void #t33 = self::Extension1|set#nullable1(#t31{self::Class1}, #t32) in #t32;
   let final self::Class1? #t34 = n1 in #t34 == null ?{self::Class1?} null : let final self::Class1? #t35 = self::Extension1|get#nullable1(#t34{self::Class1}) in #t35 == null ?{self::Class1?} null : self::Extension1|nonNullable1Method(#t35{self::Class1});
-  let final self::Class1? #t36 = n1 in #t36 == null ?{void} null : self::Extension1|set#nullable1(#t36{self::Class1}, self::Extension1|get#nullable1(new self::Class1::•()));
+  let final self::Class1? #t36 = n1 in #t36 == null ?{self::Class1?} null : self::Extension1|set#nullable1(#t36{self::Class1}, self::Extension1|get#nullable1(new self::Class1::•()));
   nullable1 = let final self::Class1? #t37 = n1 in #t37 == null ?{self::Class1?} null : let final self::Class1? #t38 = self::Extension1|get#nullable1(new self::Class1::•()) in let final void #t39 = self::Extension1|set#nullable1(#t37{self::Class1}, #t38) in #t38;
-  let final self::Class1? #t40 = n1 in #t40 == null ?{void} null : self::Extension1|set#nullable1(#t40{self::Class1}, let final self::Class1 #t41 = new self::Class1::•() in let final void #t42 = self::Extension1|set#nullable1(new self::Class1::•(), #t41) in #t41);
+  let final self::Class1? #t40 = n1 in #t40 == null ?{self::Class1?} null : self::Extension1|set#nullable1(#t40{self::Class1}, let final self::Class1 #t41 = new self::Class1::•() in let final void #t42 = self::Extension1|set#nullable1(new self::Class1::•(), #t41) in #t41);
   nullable1 = let final self::Class1? #t43 = n1 in #t43 == null ?{self::Class1?} null : let final self::Class1 #t44 = let final self::Class1 #t45 = new self::Class1::•() in let final void #t46 = self::Extension1|set#nullable1(new self::Class1::•(), #t45) in #t45 in let final void #t47 = self::Extension1|set#nullable1(#t43{self::Class1}, #t44) in #t44;
-  let final self::Class1? #t48 = n1 in #t48 == null ?{void} null : self::Extension1|set#nullable1(#t48{self::Class1}, self::Extension1|nonNullable1Method(new self::Class1::•()));
+  let final self::Class1? #t48 = n1 in #t48 == null ?{self::Class1?} null : self::Extension1|set#nullable1(#t48{self::Class1}, self::Extension1|nonNullable1Method(new self::Class1::•()));
   nullable1 = let final self::Class1? #t49 = n1 in #t49 == null ?{self::Class1?} null : let final self::Class1 #t50 = self::Extension1|nonNullable1Method(new self::Class1::•()) in let final void #t51 = self::Extension1|set#nullable1(#t49{self::Class1}, #t50) in #t50;
   let final self::Class1? #t52 = n1 in #t52 == null ?{self::Class1?} null : self::Extension1|get#nullable1(self::Extension1|nonNullable1Method(#t52{self::Class1}));
-  let final self::Class1? #t53 = n1 in #t53 == null ?{void} null : self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t53{self::Class1}), new self::Class1::•());
+  let final self::Class1? #t53 = n1 in #t53 == null ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t53{self::Class1}), new self::Class1::•());
   let final self::Class1? #t54 = n1 in #t54 == null ?{self::Class1?} null : self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(#t54{self::Class1}));
   let final self::Class1? #t55 = n1 in #t55 == null ?{self::Class1?} null : self::Extension1|get#nullable1(self::Extension1|get#nonNullable1(self::Extension1|get#nonNullable1(#t55{self::Class1})));
-  let final self::Class1? #t56 = n1 in #t56 == null ?{void} null : self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(self::Extension1|get#nonNullable1(#t56{self::Class1})), new self::Class1::•());
+  let final self::Class1? #t56 = n1 in #t56 == null ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(self::Extension1|get#nonNullable1(#t56{self::Class1})), new self::Class1::•());
   nullable1 = let final self::Class1? #t57 = n1 in #t57 == null ?{self::Class1?} null : let final self::Class1 #t58 = new self::Class1::•() in let final void #t59 = self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(self::Extension1|get#nonNullable1(#t57{self::Class1})), #t58) in #t58;
   let final self::Class1? #t60 = n1 in #t60 == null ?{self::Class1?} null : let final self::Class1? #t61 = self::Extension1|get#nullable1(self::Extension1|get#nonNullable1(#t60{self::Class1})) in #t61 == null ?{self::Class1?} null : self::Extension1|nonNullable1Method(#t61{self::Class1});
-  let final self::Class1? #t62 = n1 in #t62 == null ?{void} null : self::Extension1|set#nullable1(#t62{self::Class1}, self::Extension1|get#nullable1(self::Extension1|get#nonNullable1(new self::Class1::•())));
+  let final self::Class1? #t62 = n1 in #t62 == null ?{self::Class1?} null : self::Extension1|set#nullable1(#t62{self::Class1}, self::Extension1|get#nullable1(self::Extension1|get#nonNullable1(new self::Class1::•())));
   nullable1 = let final self::Class1? #t63 = n1 in #t63 == null ?{self::Class1?} null : let final self::Class1? #t64 = self::Extension1|get#nullable1(self::Extension1|get#nonNullable1(new self::Class1::•())) in let final void #t65 = self::Extension1|set#nullable1(#t63{self::Class1}, #t64) in #t64;
-  let final self::Class1? #t66 = n1 in #t66 == null ?{void} null : self::Extension1|set#nullable1(#t66{self::Class1}, let final self::Class1 #t67 = new self::Class1::•() in let final void #t68 = self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(new self::Class1::•()), #t67) in #t67);
+  let final self::Class1? #t66 = n1 in #t66 == null ?{self::Class1?} null : self::Extension1|set#nullable1(#t66{self::Class1}, let final self::Class1 #t67 = new self::Class1::•() in let final void #t68 = self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(new self::Class1::•()), #t67) in #t67);
   nullable1 = let final self::Class1? #t69 = n1 in #t69 == null ?{self::Class1?} null : let final self::Class1 #t70 = let final self::Class1 #t71 = new self::Class1::•() in let final void #t72 = self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(new self::Class1::•()), #t71) in #t71 in let final void #t73 = self::Extension1|set#nullable1(#t69{self::Class1}, #t70) in #t70;
-  let final self::Class1? #t74 = n1 in #t74 == null ?{void} null : self::Extension1|set#nullable1(#t74{self::Class1}, self::Extension1|nonNullable1Method(self::Extension1|get#nonNullable1(new self::Class1::•())));
+  let final self::Class1? #t74 = n1 in #t74 == null ?{self::Class1?} null : self::Extension1|set#nullable1(#t74{self::Class1}, self::Extension1|nonNullable1Method(self::Extension1|get#nonNullable1(new self::Class1::•())));
   nullable1 = let final self::Class1? #t75 = n1 in #t75 == null ?{self::Class1?} null : let final self::Class1 #t76 = self::Extension1|nonNullable1Method(self::Extension1|get#nonNullable1(new self::Class1::•())) in let final void #t77 = self::Extension1|set#nullable1(#t75{self::Class1}, #t76) in #t76;
   let final self::Class1? #t78 = n1 in #t78 == null ?{self::Class1?} null : self::Extension1|get#nullable1(self::Extension1|get#nonNullable1(self::Extension1|nonNullable1Method(#t78{self::Class1})));
-  let final self::Class1? #t79 = n1 in #t79 == null ?{void} null : self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(self::Extension1|nonNullable1Method(#t79{self::Class1})), new self::Class1::•());
+  let final self::Class1? #t79 = n1 in #t79 == null ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(self::Extension1|nonNullable1Method(#t79{self::Class1})), new self::Class1::•());
   let final self::Class1? #t80 = n1 in #t80 == null ?{self::Class1?} null : self::Extension1|nonNullable1Method(self::Extension1|get#nonNullable1(self::Extension1|nonNullable1Method(#t80{self::Class1})));
-  let final self::Class1? #t81 = n1 in #t81 == null ?{void} null : self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t81{self::Class1}), self::Extension1|get#nullable1(new self::Class1::•()));
+  let final self::Class1? #t81 = n1 in #t81 == null ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t81{self::Class1}), self::Extension1|get#nullable1(new self::Class1::•()));
   nullable1 = let final self::Class1? #t82 = n1 in #t82 == null ?{self::Class1?} null : let final self::Class1? #t83 = self::Extension1|get#nullable1(new self::Class1::•()) in let final void #t84 = self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t82{self::Class1}), #t83) in #t83;
-  let final self::Class1? #t85 = n1 in #t85 == null ?{void} null : self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t85{self::Class1}), let final self::Class1 #t86 = new self::Class1::•() in let final void #t87 = self::Extension1|set#nullable1(new self::Class1::•(), #t86) in #t86);
+  let final self::Class1? #t85 = n1 in #t85 == null ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t85{self::Class1}), let final self::Class1 #t86 = new self::Class1::•() in let final void #t87 = self::Extension1|set#nullable1(new self::Class1::•(), #t86) in #t86);
   nullable1 = let final self::Class1? #t88 = n1 in #t88 == null ?{self::Class1?} null : let final self::Class1 #t89 = let final self::Class1 #t90 = new self::Class1::•() in let final void #t91 = self::Extension1|set#nullable1(new self::Class1::•(), #t90) in #t90 in let final void #t92 = self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t88{self::Class1}), #t89) in #t89;
-  let final self::Class1? #t93 = n1 in #t93 == null ?{void} null : self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t93{self::Class1}), self::Extension1|nonNullable1Method(new self::Class1::•()));
+  let final self::Class1? #t93 = n1 in #t93 == null ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t93{self::Class1}), self::Extension1|nonNullable1Method(new self::Class1::•()));
   nullable1 = let final self::Class1? #t94 = n1 in #t94 == null ?{self::Class1?} null : let final self::Class1 #t95 = self::Extension1|nonNullable1Method(new self::Class1::•()) in let final void #t96 = self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t94{self::Class1}), #t95) in #t95;
-  let final self::Class1? #t97 = n1 in #t97 == null ?{void} null : self::Extension1|set#nullable1(#t97{self::Class1}, let final self::Class1? #t98 = self::Extension1|get#nullable1(new self::Class1::•()) in let final void #t99 = self::Extension1|set#nullable1(new self::Class1::•(), #t98) in #t98);
+  let final self::Class1? #t97 = n1 in #t97 == null ?{self::Class1?} null : self::Extension1|set#nullable1(#t97{self::Class1}, let final self::Class1? #t98 = self::Extension1|get#nullable1(new self::Class1::•()) in let final void #t99 = self::Extension1|set#nullable1(new self::Class1::•(), #t98) in #t98);
   nullable1 = let final self::Class1? #t100 = n1 in #t100 == null ?{self::Class1?} null : let final self::Class1? #t101 = let final self::Class1? #t102 = self::Extension1|get#nullable1(new self::Class1::•()) in let final void #t103 = self::Extension1|set#nullable1(new self::Class1::•(), #t102) in #t102 in let final void #t104 = self::Extension1|set#nullable1(#t100{self::Class1}, #t101) in #t101;
-  let final self::Class1? #t105 = n1 in #t105 == null ?{void} null : self::Extension1|set#nullable1(#t105{self::Class1}, let final self::Class1 #t106 = let final self::Class1 #t107 = new self::Class1::•() in let final void #t108 = self::Extension1|set#nullable1(new self::Class1::•(), #t107) in #t107 in let final void #t109 = self::Extension1|set#nullable1(new self::Class1::•(), #t106) in #t106);
+  let final self::Class1? #t105 = n1 in #t105 == null ?{self::Class1?} null : self::Extension1|set#nullable1(#t105{self::Class1}, let final self::Class1 #t106 = let final self::Class1 #t107 = new self::Class1::•() in let final void #t108 = self::Extension1|set#nullable1(new self::Class1::•(), #t107) in #t107 in let final void #t109 = self::Extension1|set#nullable1(new self::Class1::•(), #t106) in #t106);
   nullable1 = let final self::Class1? #t110 = n1 in #t110 == null ?{self::Class1?} null : let final self::Class1 #t111 = let final self::Class1 #t112 = let final self::Class1 #t113 = new self::Class1::•() in let final void #t114 = self::Extension1|set#nullable1(new self::Class1::•(), #t113) in #t113 in let final void #t115 = self::Extension1|set#nullable1(new self::Class1::•(), #t112) in #t112 in let final void #t116 = self::Extension1|set#nullable1(#t110{self::Class1}, #t111) in #t111;
-  let final self::Class1? #t117 = n1 in #t117 == null ?{void} null : self::Extension1|set#nullable1(#t117{self::Class1}, let final self::Class1 #t118 = self::Extension1|nonNullable1Method(new self::Class1::•()) in let final void #t119 = self::Extension1|set#nullable1(new self::Class1::•(), #t118) in #t118);
+  let final self::Class1? #t117 = n1 in #t117 == null ?{self::Class1?} null : self::Extension1|set#nullable1(#t117{self::Class1}, let final self::Class1 #t118 = self::Extension1|nonNullable1Method(new self::Class1::•()) in let final void #t119 = self::Extension1|set#nullable1(new self::Class1::•(), #t118) in #t118);
   nullable1 = let final self::Class1? #t120 = n1 in #t120 == null ?{self::Class1?} null : let final self::Class1 #t121 = let final self::Class1 #t122 = self::Extension1|nonNullable1Method(new self::Class1::•()) in let final void #t123 = self::Extension1|set#nullable1(new self::Class1::•(), #t122) in #t122 in let final void #t124 = self::Extension1|set#nullable1(#t120{self::Class1}, #t121) in #t121;
-  let final self::Class1? #t125 = n1 in #t125 == null ?{void} null : self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t125{self::Class1}), self::Extension1|get#nullable1(new self::Class1::•()));
+  let final self::Class1? #t125 = n1 in #t125 == null ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t125{self::Class1}), self::Extension1|get#nullable1(new self::Class1::•()));
   nullable1 = let final self::Class1? #t126 = n1 in #t126 == null ?{self::Class1?} null : let final self::Class1? #t127 = self::Extension1|get#nullable1(new self::Class1::•()) in let final void #t128 = self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t126{self::Class1}), #t127) in #t127;
-  let final self::Class1? #t129 = n1 in #t129 == null ?{void} null : self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t129{self::Class1}), let final self::Class1 #t130 = new self::Class1::•() in let final void #t131 = self::Extension1|set#nullable1(new self::Class1::•(), #t130) in #t130);
+  let final self::Class1? #t129 = n1 in #t129 == null ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t129{self::Class1}), let final self::Class1 #t130 = new self::Class1::•() in let final void #t131 = self::Extension1|set#nullable1(new self::Class1::•(), #t130) in #t130);
   nullable1 = let final self::Class1? #t132 = n1 in #t132 == null ?{self::Class1?} null : let final self::Class1 #t133 = let final self::Class1 #t134 = new self::Class1::•() in let final void #t135 = self::Extension1|set#nullable1(new self::Class1::•(), #t134) in #t134 in let final void #t136 = self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t132{self::Class1}), #t133) in #t133;
-  let final self::Class1? #t137 = n1 in #t137 == null ?{void} null : self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t137{self::Class1}), self::Extension1|nonNullable1Method(new self::Class1::•()));
+  let final self::Class1? #t137 = n1 in #t137 == null ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t137{self::Class1}), self::Extension1|nonNullable1Method(new self::Class1::•()));
   nullable1 = let final self::Class1? #t138 = n1 in #t138 == null ?{self::Class1?} null : let final self::Class1 #t139 = self::Extension1|nonNullable1Method(new self::Class1::•()) in let final void #t140 = self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t138{self::Class1}), #t139) in #t139;
   let final self::Class1? #t141 = n1 in #t141 == null ?{self::Class1?} null : self::Extension1|get#nullable1(self::Extension1|nonNullable1Method(self::Extension1|get#nonNullable1(#t141{self::Class1})));
-  let final self::Class1? #t142 = n1 in #t142 == null ?{void} null : self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(self::Extension1|get#nonNullable1(#t142{self::Class1})), new self::Class1::•());
+  let final self::Class1? #t142 = n1 in #t142 == null ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(self::Extension1|get#nonNullable1(#t142{self::Class1})), new self::Class1::•());
   nullable1 = let final self::Class1? #t143 = n1 in #t143 == null ?{self::Class1?} null : let final self::Class1 #t144 = new self::Class1::•() in let final void #t145 = self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(self::Extension1|get#nonNullable1(#t143{self::Class1})), #t144) in #t144;
   let final self::Class1? #t146 = n1 in #t146 == null ?{self::Class1?} null : self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(self::Extension1|get#nonNullable1(#t146{self::Class1})));
-  let final self::Class1? #t147 = n1 in #t147 == null ?{void} null : self::Extension1|set#nullable1(#t147{self::Class1}, self::Extension1|get#nullable1(self::Extension1|nonNullable1Method(new self::Class1::•())));
+  let final self::Class1? #t147 = n1 in #t147 == null ?{self::Class1?} null : self::Extension1|set#nullable1(#t147{self::Class1}, self::Extension1|get#nullable1(self::Extension1|nonNullable1Method(new self::Class1::•())));
   nullable1 = let final self::Class1? #t148 = n1 in #t148 == null ?{self::Class1?} null : let final self::Class1? #t149 = self::Extension1|get#nullable1(self::Extension1|nonNullable1Method(new self::Class1::•())) in let final void #t150 = self::Extension1|set#nullable1(#t148{self::Class1}, #t149) in #t149;
-  let final self::Class1? #t151 = n1 in #t151 == null ?{void} null : self::Extension1|set#nullable1(#t151{self::Class1}, let final self::Class1 #t152 = new self::Class1::•() in let final void #t153 = self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(new self::Class1::•()), #t152) in #t152);
+  let final self::Class1? #t151 = n1 in #t151 == null ?{self::Class1?} null : self::Extension1|set#nullable1(#t151{self::Class1}, let final self::Class1 #t152 = new self::Class1::•() in let final void #t153 = self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(new self::Class1::•()), #t152) in #t152);
   nullable1 = let final self::Class1? #t154 = n1 in #t154 == null ?{self::Class1?} null : let final self::Class1 #t155 = let final self::Class1 #t156 = new self::Class1::•() in let final void #t157 = self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(new self::Class1::•()), #t156) in #t156 in let final void #t158 = self::Extension1|set#nullable1(#t154{self::Class1}, #t155) in #t155;
-  let final self::Class1? #t159 = n1 in #t159 == null ?{void} null : self::Extension1|set#nullable1(#t159{self::Class1}, self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(new self::Class1::•())));
+  let final self::Class1? #t159 = n1 in #t159 == null ?{self::Class1?} null : self::Extension1|set#nullable1(#t159{self::Class1}, self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(new self::Class1::•())));
   nullable1 = let final self::Class1? #t160 = n1 in #t160 == null ?{self::Class1?} null : let final self::Class1 #t161 = self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(new self::Class1::•())) in let final void #t162 = self::Extension1|set#nullable1(#t160{self::Class1}, #t161) in #t161;
   let final self::Class1? #t163 = n1 in #t163 == null ?{self::Class1?} null : self::Extension1|get#nullable1(self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(#t163{self::Class1})));
-  let final self::Class1? #t164 = n1 in #t164 == null ?{void} null : self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(#t164{self::Class1})), new self::Class1::•());
+  let final self::Class1? #t164 = n1 in #t164 == null ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(#t164{self::Class1})), new self::Class1::•());
   let final self::Class1? #t165 = n1 in #t165 == null ?{self::Class1?} null : self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(#t165{self::Class1})));
   let final self::Class1? #t166 = n1 in #t166 == null ?{self::Class1?} null : let final self::Class1 #t167 = self::Extension1|nonNullable1Method(#t166{self::Class1}) in #t167 == null ?{self::Class1?} null : self::Extension1|nonNullable1Method(#t167);
 }
diff --git a/pkg/front_end/testcases/offsets/await_for_in.dart b/pkg/front_end/testcases/offsets/await_for_in.dart
new file mode 100644
index 0000000..54d4ac8
--- /dev/null
+++ b/pkg/front_end/testcases/offsets/await_for_in.dart
@@ -0,0 +1,19 @@
+// Copyright (c) 2026, 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.
+
+Stream<int> method0() async* {
+  yield 1;
+  yield 2;
+}
+
+Future<void> method1() async {
+  print('helper');
+  await for (var i in method0()) {
+    method2();
+    print('loop');
+  }
+  return;
+}
+
+void method2() {}
diff --git a/pkg/front_end/testcases/offsets/await_for_in.dart.strong.expect b/pkg/front_end/testcases/offsets/await_for_in.dart.strong.expect
new file mode 100644
index 0000000..5d9dc44
--- /dev/null
+++ b/pkg/front_end/testcases/offsets/await_for_in.dart.strong.expect
@@ -0,0 +1,18 @@
+library;
+import self as self;
+import "dart:async" as asy;
+import "dart:core" as core;
+
+[229]static method [236] [270] method0() → asy::Stream<core::int> async* /* emittedValueType= core::int */ {
+[250]  yield [256] [256] 1;
+[261]  yield [267] [267] 2;
+}
+[286]static method [293] [406] method1() → asy::Future<void> async /* emittedValueType= void */ {
+[306]  [306] [306] core::print [311]([312] "helper");
+[325]  await for ([340] core::int i in [345] [345] self::method0 [352]()) {
+[362]    [362] [362] self::method2 [369]();
+[377]    [377] [377] core::print [382]([383] "loop");
+  }
+[398]  return;
+}
+[414]static method [421] [425] method2() → void {}
diff --git a/pkg/front_end/testcases/offsets/await_for_in.dart.strong.modular.expect b/pkg/front_end/testcases/offsets/await_for_in.dart.strong.modular.expect
new file mode 100644
index 0000000..5d9dc44
--- /dev/null
+++ b/pkg/front_end/testcases/offsets/await_for_in.dart.strong.modular.expect
@@ -0,0 +1,18 @@
+library;
+import self as self;
+import "dart:async" as asy;
+import "dart:core" as core;
+
+[229]static method [236] [270] method0() → asy::Stream<core::int> async* /* emittedValueType= core::int */ {
+[250]  yield [256] [256] 1;
+[261]  yield [267] [267] 2;
+}
+[286]static method [293] [406] method1() → asy::Future<void> async /* emittedValueType= void */ {
+[306]  [306] [306] core::print [311]([312] "helper");
+[325]  await for ([340] core::int i in [345] [345] self::method0 [352]()) {
+[362]    [362] [362] self::method2 [369]();
+[377]    [377] [377] core::print [382]([383] "loop");
+  }
+[398]  return;
+}
+[414]static method [421] [425] method2() → void {}
diff --git a/pkg/front_end/testcases/offsets/await_for_in.dart.strong.outline.expect b/pkg/front_end/testcases/offsets/await_for_in.dart.strong.outline.expect
new file mode 100644
index 0000000..bb9501b
--- /dev/null
+++ b/pkg/front_end/testcases/offsets/await_for_in.dart.strong.outline.expect
@@ -0,0 +1,11 @@
+library;
+import self as self;
+import "dart:async" as asy;
+import "dart:core" as core;
+
+[229]static method [236] [270] method0() → asy::Stream<core::int> async* 
+[-1]  ;
+[286]static method [293] [406] method1() → asy::Future<void> async 
+[-1]  ;
+[414]static method [421] [425] method2() → void
+[-1]  ;
diff --git a/pkg/front_end/testcases/offsets/await_for_in.dart.strong.transformed.expect b/pkg/front_end/testcases/offsets/await_for_in.dart.strong.transformed.expect
new file mode 100644
index 0000000..dc3631b
--- /dev/null
+++ b/pkg/front_end/testcases/offsets/await_for_in.dart.strong.transformed.expect
@@ -0,0 +1,29 @@
+library;
+import self as self;
+import "dart:async" as asy;
+import "dart:core" as core;
+
+[229]static method [236] [270] method0() → asy::Stream<core::int> async* /* emittedValueType= core::int */ {
+[250]  yield [256] [256] 1;
+[261]  yield [267] [267] 2;
+}
+[286]static method [293] [406] method1() → asy::Future<void> async /* emittedValueType= void */ {
+[306]  [306] [306] core::print [311]([312] "helper");
+[-1]  {
+[-1]    [-1] synthesized asy::Stream<core::int> :stream = [345] [345] self::method0 [352]();
+[-1]    [-1] synthesized asy::_StreamIterator<core::int>? :for-iterator = [-1] [-1] new asy::_StreamIterator::• [-1]<core::int>([-1] :stream);
+[-1]    try
+[325]      while ([-1] [-1] let [-1] dynamic #t1 = [325] [325] asy::_asyncStarMoveNextHelper [-1]([-1] :stream) in [325] [325] await [-1] [-1] [-1] [-1] :for-iterator.{asy::_StreamIterator::moveNext}[-1](){() → asy::Future<core::bool>}) {
+[340]        [340] core::int i = [356] [356] [-1] [-1] :for-iterator.{asy::_StreamIterator::current}{core::int};
+[356]        {
+[362]          [362] [362] self::method2 [369]();
+[377]          [377] [377] core::print [382]([383] "loop");
+        }
+      }
+    finally
+[-1]      if([-1] [-1]![-1]([-1] [-1] [-1] [-1] [-1] :for-iterator.{asy::_StreamIterator::_subscription}{asy::StreamSubscription<core::int>?} == null))
+[-1]        [-1] [-1] await [-1] [-1] [-1] [-1] :for-iterator.{asy::_StreamIterator::cancel}[-1](){() → asy::Future<dynamic>};
+  }
+[398]  return;
+}
+[414]static method [421] [425] method2() → void {}
diff --git a/pkg/front_end/testcases/offsets/await_for_in.dart.textual_outline.expect b/pkg/front_end/testcases/offsets/await_for_in.dart.textual_outline.expect
new file mode 100644
index 0000000..ddb8366
--- /dev/null
+++ b/pkg/front_end/testcases/offsets/await_for_in.dart.textual_outline.expect
@@ -0,0 +1,5 @@
+Stream<int> method0() async* {}
+
+Future<void> method1() async {}
+
+void method2() {}
diff --git a/pkg/front_end/testcases/offsets/await_for_in.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/offsets/await_for_in.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..ce0717a
--- /dev/null
+++ b/pkg/front_end/testcases/offsets/await_for_in.dart.textual_outline_modelled.expect
@@ -0,0 +1,5 @@
+Future<void> method1() async {}
+
+Stream<int> method0() async* {}
+
+void method2() {}
diff --git a/pkg/front_end/testcases/offsets/case_variables_name_overlap.dart.strong.expect b/pkg/front_end/testcases/offsets/case_variables_name_overlap.dart.strong.expect
index 996bef3..9275655 100644
--- a/pkg/front_end/testcases/offsets/case_variables_name_overlap.dart.strong.expect
+++ b/pkg/front_end/testcases/offsets/case_variables_name_overlap.dart.strong.expect
@@ -3,17 +3,17 @@
 import "dart:core" as core;
 
 [478]class X1 extends core::Object {
-[493]  field core::String? s = [-1] [-1] null;
-[503]  field core::int? i = [-1] [-1] null;
-[516]  field core::double? d = [-1] [-1] null;
+[493]  field core::String? s = [493] [493] null;
+[503]  field core::int? i = [503] [503] null;
+[516]  field core::double? d = [516] [516] null;
 [478]  synthetic constructor [-1] [-1] •() → self::X1
     : [-1] super core::Object::• [-1]()
 [-1]    ;
 }
 [528]class X2 extends core::Object {
-[543]  field core::String? s2 = [-1] [-1] null;
-[554]  field core::int? i = [-1] [-1] null;
-[567]  field core::double? d = [-1] [-1] null;
+[543]  field core::String? s2 = [543] [543] null;
+[554]  field core::int? i = [554] [554] null;
+[567]  field core::double? d = [567] [567] null;
 [528]  synthetic constructor [-1] [-1] •() → self::X2
     : [-1] super core::Object::• [-1]()
 [-1]    ;
diff --git a/pkg/front_end/testcases/offsets/case_variables_name_overlap.dart.strong.modular.expect b/pkg/front_end/testcases/offsets/case_variables_name_overlap.dart.strong.modular.expect
index 996bef3..9275655 100644
--- a/pkg/front_end/testcases/offsets/case_variables_name_overlap.dart.strong.modular.expect
+++ b/pkg/front_end/testcases/offsets/case_variables_name_overlap.dart.strong.modular.expect
@@ -3,17 +3,17 @@
 import "dart:core" as core;
 
 [478]class X1 extends core::Object {
-[493]  field core::String? s = [-1] [-1] null;
-[503]  field core::int? i = [-1] [-1] null;
-[516]  field core::double? d = [-1] [-1] null;
+[493]  field core::String? s = [493] [493] null;
+[503]  field core::int? i = [503] [503] null;
+[516]  field core::double? d = [516] [516] null;
 [478]  synthetic constructor [-1] [-1] •() → self::X1
     : [-1] super core::Object::• [-1]()
 [-1]    ;
 }
 [528]class X2 extends core::Object {
-[543]  field core::String? s2 = [-1] [-1] null;
-[554]  field core::int? i = [-1] [-1] null;
-[567]  field core::double? d = [-1] [-1] null;
+[543]  field core::String? s2 = [543] [543] null;
+[554]  field core::int? i = [554] [554] null;
+[567]  field core::double? d = [567] [567] null;
 [528]  synthetic constructor [-1] [-1] •() → self::X2
     : [-1] super core::Object::• [-1]()
 [-1]    ;
diff --git a/pkg/front_end/testcases/offsets/case_variables_name_overlap.dart.strong.transformed.expect b/pkg/front_end/testcases/offsets/case_variables_name_overlap.dart.strong.transformed.expect
index 996bef3..9275655 100644
--- a/pkg/front_end/testcases/offsets/case_variables_name_overlap.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/offsets/case_variables_name_overlap.dart.strong.transformed.expect
@@ -3,17 +3,17 @@
 import "dart:core" as core;
 
 [478]class X1 extends core::Object {
-[493]  field core::String? s = [-1] [-1] null;
-[503]  field core::int? i = [-1] [-1] null;
-[516]  field core::double? d = [-1] [-1] null;
+[493]  field core::String? s = [493] [493] null;
+[503]  field core::int? i = [503] [503] null;
+[516]  field core::double? d = [516] [516] null;
 [478]  synthetic constructor [-1] [-1] •() → self::X1
     : [-1] super core::Object::• [-1]()
 [-1]    ;
 }
 [528]class X2 extends core::Object {
-[543]  field core::String? s2 = [-1] [-1] null;
-[554]  field core::int? i = [-1] [-1] null;
-[567]  field core::double? d = [-1] [-1] null;
+[543]  field core::String? s2 = [543] [543] null;
+[554]  field core::int? i = [554] [554] null;
+[567]  field core::double? d = [567] [567] null;
 [528]  synthetic constructor [-1] [-1] •() → self::X2
     : [-1] super core::Object::• [-1]()
 [-1]    ;
diff --git a/pkg/front_end/testcases/offsets/ddc/case_variables_name_overlap.dart.strong.expect b/pkg/front_end/testcases/offsets/ddc/case_variables_name_overlap.dart.strong.expect
index 5e036ff..9e3c980 100644
--- a/pkg/front_end/testcases/offsets/ddc/case_variables_name_overlap.dart.strong.expect
+++ b/pkg/front_end/testcases/offsets/ddc/case_variables_name_overlap.dart.strong.expect
@@ -3,9 +3,9 @@
 import "dart:core" as core;
 
 [478]class X1 extends core::Object {
-[493]  field core::String? s = [-1] [-1] null;
-[503]  field core::int? i = [-1] [-1] null;
-[516]  field core::double? d = [-1] [-1] null;
+[493]  field core::String? s = [493] [493] null;
+[503]  field core::int? i = [503] [503] null;
+[516]  field core::double? d = [516] [516] null;
 [478]  synthetic constructor [-1] [-1] •() → self::X1
     : [-1] super core::Object::• [-1]()
 [-1]    ;
@@ -13,9 +13,9 @@
 [478]    return [478] [478] new self::X1::• [478]();
 }
 [528]class X2 extends core::Object {
-[543]  field core::String? s2 = [-1] [-1] null;
-[554]  field core::int? i = [-1] [-1] null;
-[567]  field core::double? d = [-1] [-1] null;
+[543]  field core::String? s2 = [543] [543] null;
+[554]  field core::int? i = [554] [554] null;
+[567]  field core::double? d = [567] [567] null;
 [528]  synthetic constructor [-1] [-1] •() → self::X2
     : [-1] super core::Object::• [-1]()
 [-1]    ;
diff --git a/pkg/front_end/testcases/offsets/ddc/case_variables_name_overlap.dart.strong.modular.expect b/pkg/front_end/testcases/offsets/ddc/case_variables_name_overlap.dart.strong.modular.expect
index 5e036ff..9e3c980 100644
--- a/pkg/front_end/testcases/offsets/ddc/case_variables_name_overlap.dart.strong.modular.expect
+++ b/pkg/front_end/testcases/offsets/ddc/case_variables_name_overlap.dart.strong.modular.expect
@@ -3,9 +3,9 @@
 import "dart:core" as core;
 
 [478]class X1 extends core::Object {
-[493]  field core::String? s = [-1] [-1] null;
-[503]  field core::int? i = [-1] [-1] null;
-[516]  field core::double? d = [-1] [-1] null;
+[493]  field core::String? s = [493] [493] null;
+[503]  field core::int? i = [503] [503] null;
+[516]  field core::double? d = [516] [516] null;
 [478]  synthetic constructor [-1] [-1] •() → self::X1
     : [-1] super core::Object::• [-1]()
 [-1]    ;
@@ -13,9 +13,9 @@
 [478]    return [478] [478] new self::X1::• [478]();
 }
 [528]class X2 extends core::Object {
-[543]  field core::String? s2 = [-1] [-1] null;
-[554]  field core::int? i = [-1] [-1] null;
-[567]  field core::double? d = [-1] [-1] null;
+[543]  field core::String? s2 = [543] [543] null;
+[554]  field core::int? i = [554] [554] null;
+[567]  field core::double? d = [567] [567] null;
 [528]  synthetic constructor [-1] [-1] •() → self::X2
     : [-1] super core::Object::• [-1]()
 [-1]    ;
diff --git a/pkg/front_end/testcases/offsets/ddc/case_variables_name_overlap.dart.strong.transformed.expect b/pkg/front_end/testcases/offsets/ddc/case_variables_name_overlap.dart.strong.transformed.expect
index 5e036ff..9e3c980 100644
--- a/pkg/front_end/testcases/offsets/ddc/case_variables_name_overlap.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/offsets/ddc/case_variables_name_overlap.dart.strong.transformed.expect
@@ -3,9 +3,9 @@
 import "dart:core" as core;
 
 [478]class X1 extends core::Object {
-[493]  field core::String? s = [-1] [-1] null;
-[503]  field core::int? i = [-1] [-1] null;
-[516]  field core::double? d = [-1] [-1] null;
+[493]  field core::String? s = [493] [493] null;
+[503]  field core::int? i = [503] [503] null;
+[516]  field core::double? d = [516] [516] null;
 [478]  synthetic constructor [-1] [-1] •() → self::X1
     : [-1] super core::Object::• [-1]()
 [-1]    ;
@@ -13,9 +13,9 @@
 [478]    return [478] [478] new self::X1::• [478]();
 }
 [528]class X2 extends core::Object {
-[543]  field core::String? s2 = [-1] [-1] null;
-[554]  field core::int? i = [-1] [-1] null;
-[567]  field core::double? d = [-1] [-1] null;
+[543]  field core::String? s2 = [543] [543] null;
+[554]  field core::int? i = [554] [554] null;
+[567]  field core::double? d = [567] [567] null;
 [528]  synthetic constructor [-1] [-1] •() → self::X2
     : [-1] super core::Object::• [-1]()
 [-1]    ;
diff --git a/pkg/front_end/testcases/offsets/ddc/external_field.dart.strong.expect b/pkg/front_end/testcases/offsets/ddc/external_field.dart.strong.expect
index 90a0d7c..6b441bb 100644
--- a/pkg/front_end/testcases/offsets/ddc/external_field.dart.strong.expect
+++ b/pkg/front_end/testcases/offsets/ddc/external_field.dart.strong.expect
@@ -6,7 +6,7 @@
 [217]import "dart:js_interop";
 
 [259]extension type Foo(js_::JSObject /* erasure=dart._interceptors::JSObject */ _) implements js_::JSObject /* erasure=dart._interceptors::JSObject */ {
-[274]  abstract extension-type-member representation-field get [-1] [-1] _() → js_::JSObject /* erasure=dart._interceptors::JSObject */;
+[274]  abstract extension-type-member representation-field get [274] [274] _() → js_::JSObject /* erasure=dart._interceptors::JSObject */;
   get bar = self::Foo|get#bar;
   set bar = self::Foo|set#bar;
   constructor _ = self::Foo|constructor#_;
@@ -14,7 +14,7 @@
 }
 [263]static extension-type-member method [264] [275] Foo|constructor#_([274] wildcard initializing-formal js_::JSObject /* erasure=dart._interceptors::JSObject */ _#wc0#formal) → self::Foo /* erasure=dart._interceptors::JSObject */ {
 [274]  [274] lowered final self::Foo /* erasure=dart._interceptors::JSObject */ #this = [274] [274] _#wc0#formal;
-[-1]  return [-1] [-1] #this;
+[274]  return [274] [274] #this;
 }
 [263]static extension-type-member synthetic method [263] [263] Foo|constructor#_#_#tearOff([274] js_::JSObject /* erasure=dart._interceptors::JSObject */ _#wc0#formal) → self::Foo /* erasure=dart._interceptors::JSObject */
 [263]  return [263] [263] self::Foo|constructor#_ [263]([263] _#wc0#formal);
diff --git a/pkg/front_end/testcases/offsets/ddc/external_field.dart.strong.modular.expect b/pkg/front_end/testcases/offsets/ddc/external_field.dart.strong.modular.expect
index 90a0d7c..6b441bb 100644
--- a/pkg/front_end/testcases/offsets/ddc/external_field.dart.strong.modular.expect
+++ b/pkg/front_end/testcases/offsets/ddc/external_field.dart.strong.modular.expect
@@ -6,7 +6,7 @@
 [217]import "dart:js_interop";
 
 [259]extension type Foo(js_::JSObject /* erasure=dart._interceptors::JSObject */ _) implements js_::JSObject /* erasure=dart._interceptors::JSObject */ {
-[274]  abstract extension-type-member representation-field get [-1] [-1] _() → js_::JSObject /* erasure=dart._interceptors::JSObject */;
+[274]  abstract extension-type-member representation-field get [274] [274] _() → js_::JSObject /* erasure=dart._interceptors::JSObject */;
   get bar = self::Foo|get#bar;
   set bar = self::Foo|set#bar;
   constructor _ = self::Foo|constructor#_;
@@ -14,7 +14,7 @@
 }
 [263]static extension-type-member method [264] [275] Foo|constructor#_([274] wildcard initializing-formal js_::JSObject /* erasure=dart._interceptors::JSObject */ _#wc0#formal) → self::Foo /* erasure=dart._interceptors::JSObject */ {
 [274]  [274] lowered final self::Foo /* erasure=dart._interceptors::JSObject */ #this = [274] [274] _#wc0#formal;
-[-1]  return [-1] [-1] #this;
+[274]  return [274] [274] #this;
 }
 [263]static extension-type-member synthetic method [263] [263] Foo|constructor#_#_#tearOff([274] js_::JSObject /* erasure=dart._interceptors::JSObject */ _#wc0#formal) → self::Foo /* erasure=dart._interceptors::JSObject */
 [263]  return [263] [263] self::Foo|constructor#_ [263]([263] _#wc0#formal);
diff --git a/pkg/front_end/testcases/offsets/ddc/external_field.dart.strong.outline.expect b/pkg/front_end/testcases/offsets/ddc/external_field.dart.strong.outline.expect
index d16ff87..40e95e4 100644
--- a/pkg/front_end/testcases/offsets/ddc/external_field.dart.strong.outline.expect
+++ b/pkg/front_end/testcases/offsets/ddc/external_field.dart.strong.outline.expect
@@ -6,7 +6,7 @@
 [217]import "dart:js_interop";
 
 [259]extension type Foo(js_::JSObject /* erasure=dart._interceptors::JSObject */ _) implements js_::JSObject /* erasure=dart._interceptors::JSObject */ {
-[274]  abstract extension-type-member representation-field get [-1] [-1] _() → js_::JSObject /* erasure=dart._interceptors::JSObject */;
+[274]  abstract extension-type-member representation-field get [274] [274] _() → js_::JSObject /* erasure=dart._interceptors::JSObject */;
   get bar = self::Foo|get#bar;
   set bar = self::Foo|set#bar;
   constructor _ = self::Foo|constructor#_;
diff --git a/pkg/front_end/testcases/offsets/ddc/external_field.dart.strong.transformed.expect b/pkg/front_end/testcases/offsets/ddc/external_field.dart.strong.transformed.expect
index 90a0d7c..6b441bb 100644
--- a/pkg/front_end/testcases/offsets/ddc/external_field.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/offsets/ddc/external_field.dart.strong.transformed.expect
@@ -6,7 +6,7 @@
 [217]import "dart:js_interop";
 
 [259]extension type Foo(js_::JSObject /* erasure=dart._interceptors::JSObject */ _) implements js_::JSObject /* erasure=dart._interceptors::JSObject */ {
-[274]  abstract extension-type-member representation-field get [-1] [-1] _() → js_::JSObject /* erasure=dart._interceptors::JSObject */;
+[274]  abstract extension-type-member representation-field get [274] [274] _() → js_::JSObject /* erasure=dart._interceptors::JSObject */;
   get bar = self::Foo|get#bar;
   set bar = self::Foo|set#bar;
   constructor _ = self::Foo|constructor#_;
@@ -14,7 +14,7 @@
 }
 [263]static extension-type-member method [264] [275] Foo|constructor#_([274] wildcard initializing-formal js_::JSObject /* erasure=dart._interceptors::JSObject */ _#wc0#formal) → self::Foo /* erasure=dart._interceptors::JSObject */ {
 [274]  [274] lowered final self::Foo /* erasure=dart._interceptors::JSObject */ #this = [274] [274] _#wc0#formal;
-[-1]  return [-1] [-1] #this;
+[274]  return [274] [274] #this;
 }
 [263]static extension-type-member synthetic method [263] [263] Foo|constructor#_#_#tearOff([274] js_::JSObject /* erasure=dart._interceptors::JSObject */ _#wc0#formal) → self::Foo /* erasure=dart._interceptors::JSObject */
 [263]  return [263] [263] self::Foo|constructor#_ [263]([263] _#wc0#formal);
diff --git a/pkg/front_end/testcases/offsets/external_field.dart.strong.expect b/pkg/front_end/testcases/offsets/external_field.dart.strong.expect
index 6986f7c..74998eb 100644
--- a/pkg/front_end/testcases/offsets/external_field.dart.strong.expect
+++ b/pkg/front_end/testcases/offsets/external_field.dart.strong.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 [232]extension type Foo(core::Duration _) implements core::Duration {
-[247]  abstract extension-type-member representation-field get [-1] [-1] _() → core::Duration;
+[247]  abstract extension-type-member representation-field get [247] [247] _() → core::Duration;
   get bar = self::Foo|get#bar;
   set bar = self::Foo|set#bar;
   constructor _ = self::Foo|constructor#_;
@@ -11,7 +11,7 @@
 }
 [236]static extension-type-member method [237] [248] Foo|constructor#_([247] wildcard initializing-formal core::Duration _#wc0#formal) → self::Foo /* erasure=core::Duration */ {
 [247]  [247] lowered final self::Foo /* erasure=core::Duration */ #this = [247] [247] _#wc0#formal;
-[-1]  return [-1] [-1] #this;
+[247]  return [247] [247] #this;
 }
 [236]static extension-type-member synthetic method [236] [236] Foo|constructor#_#_#tearOff([247] core::Duration _#wc0#formal) → self::Foo /* erasure=core::Duration */
 [236]  return [236] [236] self::Foo|constructor#_ [236]([236] _#wc0#formal);
diff --git a/pkg/front_end/testcases/offsets/external_field.dart.strong.modular.expect b/pkg/front_end/testcases/offsets/external_field.dart.strong.modular.expect
index 6986f7c..74998eb 100644
--- a/pkg/front_end/testcases/offsets/external_field.dart.strong.modular.expect
+++ b/pkg/front_end/testcases/offsets/external_field.dart.strong.modular.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 [232]extension type Foo(core::Duration _) implements core::Duration {
-[247]  abstract extension-type-member representation-field get [-1] [-1] _() → core::Duration;
+[247]  abstract extension-type-member representation-field get [247] [247] _() → core::Duration;
   get bar = self::Foo|get#bar;
   set bar = self::Foo|set#bar;
   constructor _ = self::Foo|constructor#_;
@@ -11,7 +11,7 @@
 }
 [236]static extension-type-member method [237] [248] Foo|constructor#_([247] wildcard initializing-formal core::Duration _#wc0#formal) → self::Foo /* erasure=core::Duration */ {
 [247]  [247] lowered final self::Foo /* erasure=core::Duration */ #this = [247] [247] _#wc0#formal;
-[-1]  return [-1] [-1] #this;
+[247]  return [247] [247] #this;
 }
 [236]static extension-type-member synthetic method [236] [236] Foo|constructor#_#_#tearOff([247] core::Duration _#wc0#formal) → self::Foo /* erasure=core::Duration */
 [236]  return [236] [236] self::Foo|constructor#_ [236]([236] _#wc0#formal);
diff --git a/pkg/front_end/testcases/offsets/external_field.dart.strong.outline.expect b/pkg/front_end/testcases/offsets/external_field.dart.strong.outline.expect
index 79c3337..f15a77e 100644
--- a/pkg/front_end/testcases/offsets/external_field.dart.strong.outline.expect
+++ b/pkg/front_end/testcases/offsets/external_field.dart.strong.outline.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 [232]extension type Foo(core::Duration _) implements core::Duration {
-[247]  abstract extension-type-member representation-field get [-1] [-1] _() → core::Duration;
+[247]  abstract extension-type-member representation-field get [247] [247] _() → core::Duration;
   get bar = self::Foo|get#bar;
   set bar = self::Foo|set#bar;
   constructor _ = self::Foo|constructor#_;
diff --git a/pkg/front_end/testcases/offsets/external_field.dart.strong.transformed.expect b/pkg/front_end/testcases/offsets/external_field.dart.strong.transformed.expect
index 6986f7c..74998eb 100644
--- a/pkg/front_end/testcases/offsets/external_field.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/offsets/external_field.dart.strong.transformed.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 [232]extension type Foo(core::Duration _) implements core::Duration {
-[247]  abstract extension-type-member representation-field get [-1] [-1] _() → core::Duration;
+[247]  abstract extension-type-member representation-field get [247] [247] _() → core::Duration;
   get bar = self::Foo|get#bar;
   set bar = self::Foo|set#bar;
   constructor _ = self::Foo|constructor#_;
@@ -11,7 +11,7 @@
 }
 [236]static extension-type-member method [237] [248] Foo|constructor#_([247] wildcard initializing-formal core::Duration _#wc0#formal) → self::Foo /* erasure=core::Duration */ {
 [247]  [247] lowered final self::Foo /* erasure=core::Duration */ #this = [247] [247] _#wc0#formal;
-[-1]  return [-1] [-1] #this;
+[247]  return [247] [247] #this;
 }
 [236]static extension-type-member synthetic method [236] [236] Foo|constructor#_#_#tearOff([247] core::Duration _#wc0#formal) → self::Foo /* erasure=core::Duration */
 [236]  return [236] [236] self::Foo|constructor#_ [236]([236] _#wc0#formal);
diff --git a/pkg/front_end/testcases/offsets/pattern_for_loop.dart.strong.expect b/pkg/front_end/testcases/offsets/pattern_for_loop.dart.strong.expect
index 687ae3e..bde7949 100644
--- a/pkg/front_end/testcases/offsets/pattern_for_loop.dart.strong.expect
+++ b/pkg/front_end/testcases/offsets/pattern_for_loop.dart.strong.expect
@@ -22,7 +22,7 @@
 [315]    [315] hoisted dynamic a;
 [318]    [318] hoisted dynamic b;
 [321]    {
-[-1]      [-1] final synthesized dynamic #1#0 = [-1] [-1] #t5;
+[321]      [321] final synthesized dynamic #1#0 = [321] [321] #t5;
 [314]      [314] final const synthesized core::int #1#3 = [314] [314] #C1;
 [321]      if([314] [314]![314]([314] [314] [314] [314] [314] [314] [314] [-1] [-1] #1#0 is core::List<dynamic> && [314] [314] [314] [314] [-1] [-1] #1#0{core::List<dynamic>}.{core::List::length}{core::int} =={core::num::==}{(core::Object) → core::bool} [-1] [-1] #C1 && [315]([315] let [315] final dynamic #t6 = [315] [315] a = [314] [314] [-1] [-1] #1#0{core::List<dynamic>}.{core::List::[]}[314]([314] 0){(core::int) → dynamic} in [-1] [-1] true) && [318]([318] let [318] final dynamic #t7 = [318] [318] b = [314] [314] [-1] [-1] #1#0{core::List<dynamic>}.{core::List::[]}[314]([314] 1){(core::int) → dynamic} in [-1] [-1] true)))
 [321]        [321] [321] throw{for-error-handling} [321] [321] new core::StateError::• [321]([321] "Pattern matching error");
diff --git a/pkg/front_end/testcases/offsets/pattern_for_loop.dart.strong.modular.expect b/pkg/front_end/testcases/offsets/pattern_for_loop.dart.strong.modular.expect
index 687ae3e..bde7949 100644
--- a/pkg/front_end/testcases/offsets/pattern_for_loop.dart.strong.modular.expect
+++ b/pkg/front_end/testcases/offsets/pattern_for_loop.dart.strong.modular.expect
@@ -22,7 +22,7 @@
 [315]    [315] hoisted dynamic a;
 [318]    [318] hoisted dynamic b;
 [321]    {
-[-1]      [-1] final synthesized dynamic #1#0 = [-1] [-1] #t5;
+[321]      [321] final synthesized dynamic #1#0 = [321] [321] #t5;
 [314]      [314] final const synthesized core::int #1#3 = [314] [314] #C1;
 [321]      if([314] [314]![314]([314] [314] [314] [314] [314] [314] [314] [-1] [-1] #1#0 is core::List<dynamic> && [314] [314] [314] [314] [-1] [-1] #1#0{core::List<dynamic>}.{core::List::length}{core::int} =={core::num::==}{(core::Object) → core::bool} [-1] [-1] #C1 && [315]([315] let [315] final dynamic #t6 = [315] [315] a = [314] [314] [-1] [-1] #1#0{core::List<dynamic>}.{core::List::[]}[314]([314] 0){(core::int) → dynamic} in [-1] [-1] true) && [318]([318] let [318] final dynamic #t7 = [318] [318] b = [314] [314] [-1] [-1] #1#0{core::List<dynamic>}.{core::List::[]}[314]([314] 1){(core::int) → dynamic} in [-1] [-1] true)))
 [321]        [321] [321] throw{for-error-handling} [321] [321] new core::StateError::• [321]([321] "Pattern matching error");
diff --git a/pkg/front_end/testcases/offsets/pattern_for_loop.dart.strong.transformed.expect b/pkg/front_end/testcases/offsets/pattern_for_loop.dart.strong.transformed.expect
index cb0b401..0155173 100644
--- a/pkg/front_end/testcases/offsets/pattern_for_loop.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/offsets/pattern_for_loop.dart.strong.transformed.expect
@@ -26,7 +26,7 @@
 [315]        [315] hoisted dynamic a;
 [318]        [318] hoisted dynamic b;
 [321]        {
-[-1]          [-1] final synthesized dynamic #1#0 = [-1] [-1] #t5;
+[321]          [321] final synthesized dynamic #1#0 = [321] [321] #t5;
 [314]          [314] final const synthesized core::int #1#3 = [314] [314] #C1;
 [321]          if([314] [314]![314]([314] [314] [314] [314] [314] [314] [314] [-1] [-1] #1#0 is core::List<dynamic> && [314] [314] [314] [314] [-1] [-1] #1#0{core::List<dynamic>}.{core::List::length}{core::int} =={core::num::==}{(core::Object) → core::bool} [-1] [-1] #C1 && [315]([315] let [315] final dynamic #t6 = [315] [315] a = [314] [314] [-1] [-1] #1#0{core::List<dynamic>}.{core::List::[]}[314]([314] 0){(core::int) → dynamic} in [-1] [-1] true) && [318]([318] let [318] final dynamic #t7 = [318] [318] b = [314] [314] [-1] [-1] #1#0{core::List<dynamic>}.{core::List::[]}[314]([314] 1){(core::int) → dynamic} in [-1] [-1] true)))
 [321]            [321] [321] throw{for-error-handling} [321] [321] new core::StateError::• [321]([321] "Pattern matching error");
diff --git a/pkg/front_end/testcases/offsets/switch_encoding.dart.strong.expect b/pkg/front_end/testcases/offsets/switch_encoding.dart.strong.expect
index b61269a..9b2a743 100644
--- a/pkg/front_end/testcases/offsets/switch_encoding.dart.strong.expect
+++ b/pkg/front_end/testcases/offsets/switch_encoding.dart.strong.expect
@@ -8,7 +8,7 @@
 [232]  enum-element static const field self::E c = [232] [232] #C9;
 [222]  static const field core::List<self::E> values = [-1] [-1] #C10;
 [222]  const synthetic constructor [222] [222] •([222] core::int #index, [222] core::String #name) → self::E
-    : [222] super core::_Enum::• [222]([-1] #index, [-1] #name)
+    : [222] super core::_Enum::• [222]([222] #index, [222] #name)
 [-1]    ;
 [222]  method [222] [222] core::_enumToString() → core::String
 [-1]    return [-1] [-1] "E.${[-1] [-1] [-1] [-1] this.{core::_Enum::_name}{core::String}}";
diff --git a/pkg/front_end/testcases/offsets/switch_encoding.dart.strong.modular.expect b/pkg/front_end/testcases/offsets/switch_encoding.dart.strong.modular.expect
index b61269a..9b2a743 100644
--- a/pkg/front_end/testcases/offsets/switch_encoding.dart.strong.modular.expect
+++ b/pkg/front_end/testcases/offsets/switch_encoding.dart.strong.modular.expect
@@ -8,7 +8,7 @@
 [232]  enum-element static const field self::E c = [232] [232] #C9;
 [222]  static const field core::List<self::E> values = [-1] [-1] #C10;
 [222]  const synthetic constructor [222] [222] •([222] core::int #index, [222] core::String #name) → self::E
-    : [222] super core::_Enum::• [222]([-1] #index, [-1] #name)
+    : [222] super core::_Enum::• [222]([222] #index, [222] #name)
 [-1]    ;
 [222]  method [222] [222] core::_enumToString() → core::String
 [-1]    return [-1] [-1] "E.${[-1] [-1] [-1] [-1] this.{core::_Enum::_name}{core::String}}";
diff --git a/pkg/front_end/testcases/offsets/switch_encoding.dart.strong.outline.expect b/pkg/front_end/testcases/offsets/switch_encoding.dart.strong.outline.expect
index be94d1c..78039e0 100644
--- a/pkg/front_end/testcases/offsets/switch_encoding.dart.strong.outline.expect
+++ b/pkg/front_end/testcases/offsets/switch_encoding.dart.strong.outline.expect
@@ -3,12 +3,12 @@
 import "dart:core" as core;
 
 [222]class E extends core::_Enum /*isEnum*/  {
-[226]  enum-element static const field self::E a = [226] [226] const self::E::• [-1]([-1] 0, [-1] "a");
-[229]  enum-element static const field self::E b = [229] [229] const self::E::• [-1]([-1] 1, [-1] "b");
-[232]  enum-element static const field self::E c = [232] [232] const self::E::• [-1]([-1] 2, [-1] "c");
+[226]  enum-element static const field self::E a = [226] [226] const self::E::• [-1]([226] 0, [226] "a");
+[229]  enum-element static const field self::E b = [229] [229] const self::E::• [-1]([229] 1, [229] "b");
+[232]  enum-element static const field self::E c = [232] [232] const self::E::• [-1]([232] 2, [232] "c");
 [222]  static const field core::List<self::E> values = [-1] [-1] const <self::E>[[-1] self::E::a, [-1] self::E::b, [-1] self::E::c];
 [222]  const synthetic constructor [222] [222] •([222] core::int #index, [222] core::String #name) → self::E
-    : [222] super core::_Enum::• [222]([-1] #index, [-1] #name)
+    : [222] super core::_Enum::• [222]([222] #index, [222] #name)
 [-1]    ;
 [222]  method [222] [222] core::_enumToString() → core::String
 [-1]    return [-1] [-1] "E.${[-1] [-1] [-1] [-1] this.{core::_Enum::_name}{core::String}}";
diff --git a/pkg/front_end/testcases/offsets/switch_encoding.dart.strong.transformed.expect b/pkg/front_end/testcases/offsets/switch_encoding.dart.strong.transformed.expect
index 13ccd09..3fff1ec 100644
--- a/pkg/front_end/testcases/offsets/switch_encoding.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/offsets/switch_encoding.dart.strong.transformed.expect
@@ -8,7 +8,7 @@
 [232]  enum-element static const field self::E c = [232] [232] #C9;
 [222]  static const field core::List<self::E> values = [-1] [-1] #C10;
 [222]  const synthetic constructor [222] [222] •([222] core::int #index, [222] core::String #name) → self::E
-    : [222] super core::_Enum::• [222]([-1] #index, [-1] #name)
+    : [222] super core::_Enum::• [222]([222] #index, [222] #name)
 [-1]    ;
 [222]  method [222] [222] core::_enumToString() → core::String
 [-1]    return [-1] [-1] "E.${[-1] [-1] [-1] [-1] this.{core::_Enum::_name}{core::String}}";
diff --git a/pkg/front_end/testcases/patterns/effect_only.dart.strong.expect b/pkg/front_end/testcases/patterns/effect_only.dart.strong.expect
index 62ad878..812cb36 100644
--- a/pkg/front_end/testcases/patterns/effect_only.dart.strong.expect
+++ b/pkg/front_end/testcases/patterns/effect_only.dart.strong.expect
@@ -7,7 +7,7 @@
   {
     final synthesized core::List<core::int> #0#0 = list;
     final const synthesized core::int #0#3 = #C1;
-    if(!(let final dynamic #t1 = #0#0 as core::List<core::int> in (#0#0 as core::List<core::int>).{core::List::length}{core::int} =={core::num::==}{(core::Object) → core::bool} #C1 && (let final dynamic #t2 = v = (#0#0 as core::List<core::int>).{core::List::[]}(0){(core::int) → core::int} in true)))
+    if(!(let final dynamic #t1 = #0#0 as core::List<core::int> in (#0#0 as core::List<core::int>).{core::List::length}{core::int} =={core::num::==}{(core::Object) → core::bool} #C1 && (let final dynamic #t2 = v = (#0#0 as core::List<core::int>).{core::List::[]}(0){(core::int) → core::num} in true)))
       throw{for-error-handling} new core::StateError::•("Pattern matching error");
   }
   self::expect(42, v);
diff --git a/pkg/front_end/testcases/patterns/effect_only.dart.strong.modular.expect b/pkg/front_end/testcases/patterns/effect_only.dart.strong.modular.expect
index 62ad878..812cb36 100644
--- a/pkg/front_end/testcases/patterns/effect_only.dart.strong.modular.expect
+++ b/pkg/front_end/testcases/patterns/effect_only.dart.strong.modular.expect
@@ -7,7 +7,7 @@
   {
     final synthesized core::List<core::int> #0#0 = list;
     final const synthesized core::int #0#3 = #C1;
-    if(!(let final dynamic #t1 = #0#0 as core::List<core::int> in (#0#0 as core::List<core::int>).{core::List::length}{core::int} =={core::num::==}{(core::Object) → core::bool} #C1 && (let final dynamic #t2 = v = (#0#0 as core::List<core::int>).{core::List::[]}(0){(core::int) → core::int} in true)))
+    if(!(let final dynamic #t1 = #0#0 as core::List<core::int> in (#0#0 as core::List<core::int>).{core::List::length}{core::int} =={core::num::==}{(core::Object) → core::bool} #C1 && (let final dynamic #t2 = v = (#0#0 as core::List<core::int>).{core::List::[]}(0){(core::int) → core::num} in true)))
       throw{for-error-handling} new core::StateError::•("Pattern matching error");
   }
   self::expect(42, v);
diff --git a/pkg/front_end/testcases/patterns/effect_only.dart.strong.transformed.expect b/pkg/front_end/testcases/patterns/effect_only.dart.strong.transformed.expect
index f16a28e..60c364a 100644
--- a/pkg/front_end/testcases/patterns/effect_only.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/patterns/effect_only.dart.strong.transformed.expect
@@ -7,7 +7,7 @@
   {
     final synthesized core::List<core::int> #0#0 = list;
     final const synthesized core::int #0#3 = #C1;
-    if(!(let final dynamic #t1 = #0#0 as{Unchecked} core::List<core::int> in (#0#0 as{Unchecked} core::List<core::int>).{core::List::length}{core::int} =={core::num::==}{(core::Object) → core::bool} #C1 && (let final dynamic #t2 = v = (#0#0 as{Unchecked} core::List<core::int>).{core::List::[]}(0){(core::int) → core::int} in true)))
+    if(!(let final dynamic #t1 = #0#0 as{Unchecked} core::List<core::int> in (#0#0 as{Unchecked} core::List<core::int>).{core::List::length}{core::int} =={core::num::==}{(core::Object) → core::bool} #C1 && (let final dynamic #t2 = v = (#0#0 as{Unchecked} core::List<core::int>).{core::List::[]}(0){(core::int) → core::num} in true)))
       throw{for-error-handling} new core::StateError::•("Pattern matching error");
   }
   self::expect(42, v);
diff --git a/pkg/front_end/testcases/patterns/issue56138.dart.strong.expect b/pkg/front_end/testcases/patterns/issue56138.dart.strong.expect
index 6235e5a..368fa0c 100644
--- a/pkg/front_end/testcases/patterns/issue56138.dart.strong.expect
+++ b/pkg/front_end/testcases/patterns/issue56138.dart.strong.expect
@@ -6,7 +6,8 @@
   try {
     {
       final synthesized Never #0#0 = throw "A";
-      if(!#0#0)
+      final const synthesized core::int #0#2 = #C1;
+      if(!#0#0.{core::List::length}{core::int}.{core::num::<=}(#C1){(core::num) → core::bool})
         throw{for-error-handling} new core::StateError::•("Pattern matching error");
     }
   }
@@ -16,3 +17,7 @@
   }
   throw "Missing exception";
 }
+
+constants  {
+  #C1 = 0
+}
diff --git a/pkg/front_end/testcases/patterns/issue56138.dart.strong.modular.expect b/pkg/front_end/testcases/patterns/issue56138.dart.strong.modular.expect
index 6235e5a..368fa0c 100644
--- a/pkg/front_end/testcases/patterns/issue56138.dart.strong.modular.expect
+++ b/pkg/front_end/testcases/patterns/issue56138.dart.strong.modular.expect
@@ -6,7 +6,8 @@
   try {
     {
       final synthesized Never #0#0 = throw "A";
-      if(!#0#0)
+      final const synthesized core::int #0#2 = #C1;
+      if(!#0#0.{core::List::length}{core::int}.{core::num::<=}(#C1){(core::num) → core::bool})
         throw{for-error-handling} new core::StateError::•("Pattern matching error");
     }
   }
@@ -16,3 +17,7 @@
   }
   throw "Missing exception";
 }
+
+constants  {
+  #C1 = 0
+}
diff --git a/pkg/front_end/testcases/patterns/issue56138.dart.strong.transformed.expect b/pkg/front_end/testcases/patterns/issue56138.dart.strong.transformed.expect
index 6235e5a..368fa0c 100644
--- a/pkg/front_end/testcases/patterns/issue56138.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/patterns/issue56138.dart.strong.transformed.expect
@@ -6,7 +6,8 @@
   try {
     {
       final synthesized Never #0#0 = throw "A";
-      if(!#0#0)
+      final const synthesized core::int #0#2 = #C1;
+      if(!#0#0.{core::List::length}{core::int}.{core::num::<=}(#C1){(core::num) → core::bool})
         throw{for-error-handling} new core::StateError::•("Pattern matching error");
     }
   }
@@ -16,3 +17,7 @@
   }
   throw "Missing exception";
 }
+
+constants  {
+  #C1 = 0
+}
diff --git a/pkg/front_end/testcases/patterns/issue63315.dart b/pkg/front_end/testcases/patterns/issue63315.dart
new file mode 100644
index 0000000..34fd065
--- /dev/null
+++ b/pkg/front_end/testcases/patterns/issue63315.dart
@@ -0,0 +1,54 @@
+// Copyright (c) 2026, 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.
+
+extension type JsonMap1<T>(Map<String, Object?> _)
+    implements Map<String, Object?> {
+  T operator [](String key) => _[key] as T;
+}
+
+void parseJson1(JsonMap1 map) {
+  if (map case {"key": "value"}) print("ok");
+}
+
+extension type JsonMap2<T>(Map<String, Object?> _)
+    implements Map<String, Object?> {
+  bool containsKey(String key) => _.containsKey(key);
+}
+
+void parseJson2(JsonMap2 map) {
+  if (map case {"key": "value"}) print("ok");
+}
+
+extension type JsonMap3<T>(Map<String, Object?> _)
+    implements Map<String, Object?> {
+  int get length => _.length;
+}
+
+void parseJson3(JsonMap3 map) {
+  if (map case {"key": "value"}) print("ok");
+}
+
+extension type JsonList1<T>(List<Object?> _) implements List<Object?> {
+  T operator [](int index) => _[index] as T;
+}
+
+void parseJson4(JsonList1 list) {
+  if (list case ["value"]) print("ok");
+}
+
+extension type JsonList2<T>(List<Object?> _) implements List<Object?> {
+  int get length => _.length;
+}
+
+void parseJson5(JsonList2 list) {
+  if (list case ["value"]) print("ok");
+}
+
+extension type JsonList3<T>(List<Object?> _) implements List<Object?> {
+  List<T> sublist(int start, [int? end]) => _.sublist(start, end).cast<T>();
+}
+
+void parseJson6(JsonList3 list) {
+  if (list case ["value"]) print("ok");
+}
diff --git a/pkg/front_end/testcases/patterns/issue63315.dart.strong.expect b/pkg/front_end/testcases/patterns/issue63315.dart.strong.expect
new file mode 100644
index 0000000..8d5f0f2
--- /dev/null
+++ b/pkg/front_end/testcases/patterns/issue63315.dart.strong.expect
@@ -0,0 +1,161 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+extension type JsonMap1<T extends core::Object? = dynamic>(core::Map<core::String, core::Object?> _) implements core::Map<core::String, core::Object?> {
+  abstract extension-type-member representation-field get _() → core::Map<core::String, core::Object?>;
+  operator [] = self::JsonMap1|[];
+  constructor • = self::JsonMap1|constructor#;
+  constructor tearoff • = self::JsonMap1|constructor#_#new#tearOff;
+}
+extension type JsonMap2<T extends core::Object? = dynamic>(core::Map<core::String, core::Object?> _) implements core::Map<core::String, core::Object?> {
+  abstract extension-type-member representation-field get _() → core::Map<core::String, core::Object?>;
+  method containsKey = self::JsonMap2|containsKey;
+  method tearoff containsKey = self::JsonMap2|get#containsKey;
+  constructor • = self::JsonMap2|constructor#;
+  constructor tearoff • = self::JsonMap2|constructor#_#new#tearOff;
+}
+extension type JsonMap3<T extends core::Object? = dynamic>(core::Map<core::String, core::Object?> _) implements core::Map<core::String, core::Object?> {
+  abstract extension-type-member representation-field get _() → core::Map<core::String, core::Object?>;
+  get length = self::JsonMap3|get#length;
+  constructor • = self::JsonMap3|constructor#;
+  constructor tearoff • = self::JsonMap3|constructor#_#new#tearOff;
+}
+extension type JsonList1<T extends core::Object? = dynamic>(core::List<core::Object?> _) implements core::List<core::Object?> {
+  abstract extension-type-member representation-field get _() → core::List<core::Object?>;
+  operator [] = self::JsonList1|[];
+  constructor • = self::JsonList1|constructor#;
+  constructor tearoff • = self::JsonList1|constructor#_#new#tearOff;
+}
+extension type JsonList2<T extends core::Object? = dynamic>(core::List<core::Object?> _) implements core::List<core::Object?> {
+  abstract extension-type-member representation-field get _() → core::List<core::Object?>;
+  get length = self::JsonList2|get#length;
+  constructor • = self::JsonList2|constructor#;
+  constructor tearoff • = self::JsonList2|constructor#_#new#tearOff;
+}
+extension type JsonList3<T extends core::Object? = dynamic>(core::List<core::Object?> _) implements core::List<core::Object?> {
+  abstract extension-type-member representation-field get _() → core::List<core::Object?>;
+  method sublist = self::JsonList3|sublist;
+  method tearoff sublist = self::JsonList3|get#sublist;
+  constructor • = self::JsonList3|constructor#;
+  constructor tearoff • = self::JsonList3|constructor#_#new#tearOff;
+}
+static extension-type-member method JsonMap1|constructor#<T extends core::Object? = dynamic>(wildcard initializing-formal core::Map<core::String, core::Object?> _#wc0#formal) → self::JsonMap1<self::JsonMap1|constructor#::T%> /* erasure=core::Map<core::String, core::Object?> */ {
+  lowered final self::JsonMap1<self::JsonMap1|constructor#::T%> /* erasure=core::Map<core::String, core::Object?> */ #this = _#wc0#formal;
+  return #this;
+}
+static extension-type-member synthetic method JsonMap1|constructor#_#new#tearOff<T extends core::Object? = dynamic>(core::Map<core::String, core::Object?> _#wc0#formal) → self::JsonMap1<self::JsonMap1|constructor#_#new#tearOff::T%> /* erasure=core::Map<core::String, core::Object?> */
+  return self::JsonMap1|constructor#<self::JsonMap1|constructor#_#new#tearOff::T%>(_#wc0#formal);
+static extension-type-member method JsonMap1|[]<T extends core::Object? = dynamic>(lowered final self::JsonMap1<self::JsonMap1|[]::T%> /* erasure=core::Map<core::String, core::Object?> */ #this, core::String key) → self::JsonMap1|[]::T%
+  return (#this as{Unchecked} core::Map<core::String, core::Object?>).{core::Map::[]}(key){(core::Object?) → core::Object?} as self::JsonMap1|[]::T%;
+static method parseJson1(self::JsonMap1<dynamic> /* erasure=core::Map<core::String, core::Object?> */ map) → void {
+  {
+    final synthesized self::JsonMap1<dynamic> /* erasure=core::Map<core::String, core::Object?> */ #0#0 = map;
+    synthesized core::Object? #0#3;
+    synthesized core::bool #0#3#isSet = false;
+    final const synthesized core::String #0#1 = #C1;
+    final const synthesized core::String #0#4 = #C2;
+    if((!((#0#3#isSet ?{core::Object?} #0#3 : let final dynamic #t1 = #0#3#isSet = true in #0#3 = #0#0.{core::Map::[]}(#C1){(core::Object?) → core::Object?}) == null) || null is core::Object? && #0#0.{core::Map::containsKey}(#C1){(core::Object?) → core::bool}) && #C2 =={core::String::==}{(core::Object) → core::bool} (#0#3#isSet ?{core::Object?} #0#3 : let final dynamic #t2 = #0#3#isSet = true in #0#3 = #0#0.{core::Map::[]}(#C1){(core::Object?) → core::Object?}))
+      core::print("ok");
+  }
+}
+static extension-type-member method JsonMap2|constructor#<T extends core::Object? = dynamic>(wildcard initializing-formal core::Map<core::String, core::Object?> _#wc1#formal) → self::JsonMap2<self::JsonMap2|constructor#::T%> /* erasure=core::Map<core::String, core::Object?> */ {
+  lowered final self::JsonMap2<self::JsonMap2|constructor#::T%> /* erasure=core::Map<core::String, core::Object?> */ #this = _#wc1#formal;
+  return #this;
+}
+static extension-type-member synthetic method JsonMap2|constructor#_#new#tearOff<T extends core::Object? = dynamic>(core::Map<core::String, core::Object?> _#wc1#formal) → self::JsonMap2<self::JsonMap2|constructor#_#new#tearOff::T%> /* erasure=core::Map<core::String, core::Object?> */
+  return self::JsonMap2|constructor#<self::JsonMap2|constructor#_#new#tearOff::T%>(_#wc1#formal);
+static extension-type-member method JsonMap2|containsKey<T extends core::Object? = dynamic>(lowered final self::JsonMap2<self::JsonMap2|containsKey::T%> /* erasure=core::Map<core::String, core::Object?> */ #this, core::String key) → core::bool
+  return (#this as{Unchecked} core::Map<core::String, core::Object?>).{core::Map::containsKey}(key){(core::Object?) → core::bool};
+static extension-type-member method JsonMap2|get#containsKey<T extends core::Object? = dynamic>(lowered final self::JsonMap2<self::JsonMap2|get#containsKey::T%> /* erasure=core::Map<core::String, core::Object?> */ #this) → (core::String) → core::bool
+  return (core::String key) → core::bool => self::JsonMap2|containsKey<self::JsonMap2|get#containsKey::T%>(#this, key);
+static method parseJson2(self::JsonMap2<dynamic> /* erasure=core::Map<core::String, core::Object?> */ map) → void {
+  {
+    final synthesized self::JsonMap2<dynamic> /* erasure=core::Map<core::String, core::Object?> */ #0#0 = map;
+    synthesized core::Object? #0#3;
+    synthesized core::bool #0#3#isSet = false;
+    final const synthesized core::String #0#1 = #C1;
+    final const synthesized core::String #0#4 = #C2;
+    if((!((#0#3#isSet ?{core::Object?} #0#3 : let final dynamic #t3 = #0#3#isSet = true in #0#3 = #0#0.{core::Map::[]}(#C1){(core::Object?) → core::Object?}) == null) || null is core::Object? && #0#0.{core::Map::containsKey}(#C1){(core::Object?) → core::bool}) && #C2 =={core::String::==}{(core::Object) → core::bool} (#0#3#isSet ?{core::Object?} #0#3 : let final dynamic #t4 = #0#3#isSet = true in #0#3 = #0#0.{core::Map::[]}(#C1){(core::Object?) → core::Object?}))
+      core::print("ok");
+  }
+}
+static extension-type-member method JsonMap3|constructor#<T extends core::Object? = dynamic>(wildcard initializing-formal core::Map<core::String, core::Object?> _#wc2#formal) → self::JsonMap3<self::JsonMap3|constructor#::T%> /* erasure=core::Map<core::String, core::Object?> */ {
+  lowered final self::JsonMap3<self::JsonMap3|constructor#::T%> /* erasure=core::Map<core::String, core::Object?> */ #this = _#wc2#formal;
+  return #this;
+}
+static extension-type-member synthetic method JsonMap3|constructor#_#new#tearOff<T extends core::Object? = dynamic>(core::Map<core::String, core::Object?> _#wc2#formal) → self::JsonMap3<self::JsonMap3|constructor#_#new#tearOff::T%> /* erasure=core::Map<core::String, core::Object?> */
+  return self::JsonMap3|constructor#<self::JsonMap3|constructor#_#new#tearOff::T%>(_#wc2#formal);
+static extension-type-member method JsonMap3|get#length<T extends core::Object? = dynamic>(lowered final self::JsonMap3<self::JsonMap3|get#length::T%> /* erasure=core::Map<core::String, core::Object?> */ #this) → core::int
+  return (#this as{Unchecked} core::Map<core::String, core::Object?>).{core::Map::length}{core::int};
+static method parseJson3(self::JsonMap3<dynamic> /* erasure=core::Map<core::String, core::Object?> */ map) → void {
+  {
+    final synthesized self::JsonMap3<dynamic> /* erasure=core::Map<core::String, core::Object?> */ #0#0 = map;
+    synthesized core::Object? #0#3;
+    synthesized core::bool #0#3#isSet = false;
+    final const synthesized core::String #0#1 = #C1;
+    final const synthesized core::String #0#4 = #C2;
+    if((!((#0#3#isSet ?{core::Object?} #0#3 : let final dynamic #t5 = #0#3#isSet = true in #0#3 = #0#0.{core::Map::[]}(#C1){(core::Object?) → core::Object?}) == null) || null is core::Object? && #0#0.{core::Map::containsKey}(#C1){(core::Object?) → core::bool}) && #C2 =={core::String::==}{(core::Object) → core::bool} (#0#3#isSet ?{core::Object?} #0#3 : let final dynamic #t6 = #0#3#isSet = true in #0#3 = #0#0.{core::Map::[]}(#C1){(core::Object?) → core::Object?}))
+      core::print("ok");
+  }
+}
+static extension-type-member method JsonList1|constructor#<T extends core::Object? = dynamic>(wildcard initializing-formal core::List<core::Object?> _#wc3#formal) → self::JsonList1<self::JsonList1|constructor#::T%> /* erasure=core::List<core::Object?> */ {
+  lowered final self::JsonList1<self::JsonList1|constructor#::T%> /* erasure=core::List<core::Object?> */ #this = _#wc3#formal;
+  return #this;
+}
+static extension-type-member synthetic method JsonList1|constructor#_#new#tearOff<T extends core::Object? = dynamic>(core::List<core::Object?> _#wc3#formal) → self::JsonList1<self::JsonList1|constructor#_#new#tearOff::T%> /* erasure=core::List<core::Object?> */
+  return self::JsonList1|constructor#<self::JsonList1|constructor#_#new#tearOff::T%>(_#wc3#formal);
+static extension-type-member method JsonList1|[]<T extends core::Object? = dynamic>(lowered final self::JsonList1<self::JsonList1|[]::T%> /* erasure=core::List<core::Object?> */ #this, core::int index) → self::JsonList1|[]::T%
+  return (#this as{Unchecked} core::List<core::Object?>).{core::List::[]}(index){(core::int) → core::Object?} as self::JsonList1|[]::T%;
+static method parseJson4(self::JsonList1<dynamic> /* erasure=core::List<core::Object?> */ list) → void {
+  {
+    final synthesized self::JsonList1<dynamic> /* erasure=core::List<core::Object?> */ #0#0 = list;
+    final const synthesized core::int #0#2 = #C3;
+    final const synthesized core::String #0#5 = #C2;
+    if(#0#0.{core::List::length}{core::int} =={core::num::==}{(core::Object) → core::bool} #C3 && #C2 =={core::String::==}{(core::Object) → core::bool} #0#0.{core::List::[]}(0){(core::int) → core::Object?})
+      core::print("ok");
+  }
+}
+static extension-type-member method JsonList2|constructor#<T extends core::Object? = dynamic>(wildcard initializing-formal core::List<core::Object?> _#wc4#formal) → self::JsonList2<self::JsonList2|constructor#::T%> /* erasure=core::List<core::Object?> */ {
+  lowered final self::JsonList2<self::JsonList2|constructor#::T%> /* erasure=core::List<core::Object?> */ #this = _#wc4#formal;
+  return #this;
+}
+static extension-type-member synthetic method JsonList2|constructor#_#new#tearOff<T extends core::Object? = dynamic>(core::List<core::Object?> _#wc4#formal) → self::JsonList2<self::JsonList2|constructor#_#new#tearOff::T%> /* erasure=core::List<core::Object?> */
+  return self::JsonList2|constructor#<self::JsonList2|constructor#_#new#tearOff::T%>(_#wc4#formal);
+static extension-type-member method JsonList2|get#length<T extends core::Object? = dynamic>(lowered final self::JsonList2<self::JsonList2|get#length::T%> /* erasure=core::List<core::Object?> */ #this) → core::int
+  return (#this as{Unchecked} core::List<core::Object?>).{core::List::length}{core::int};
+static method parseJson5(self::JsonList2<dynamic> /* erasure=core::List<core::Object?> */ list) → void {
+  {
+    final synthesized self::JsonList2<dynamic> /* erasure=core::List<core::Object?> */ #0#0 = list;
+    final const synthesized core::int #0#2 = #C3;
+    final const synthesized core::String #0#5 = #C2;
+    if(#0#0.{core::List::length}{core::int} =={core::num::==}{(core::Object) → core::bool} #C3 && #C2 =={core::String::==}{(core::Object) → core::bool} #0#0.{core::List::[]}(0){(core::int) → core::Object?})
+      core::print("ok");
+  }
+}
+static extension-type-member method JsonList3|constructor#<T extends core::Object? = dynamic>(wildcard initializing-formal core::List<core::Object?> _#wc5#formal) → self::JsonList3<self::JsonList3|constructor#::T%> /* erasure=core::List<core::Object?> */ {
+  lowered final self::JsonList3<self::JsonList3|constructor#::T%> /* erasure=core::List<core::Object?> */ #this = _#wc5#formal;
+  return #this;
+}
+static extension-type-member synthetic method JsonList3|constructor#_#new#tearOff<T extends core::Object? = dynamic>(core::List<core::Object?> _#wc5#formal) → self::JsonList3<self::JsonList3|constructor#_#new#tearOff::T%> /* erasure=core::List<core::Object?> */
+  return self::JsonList3|constructor#<self::JsonList3|constructor#_#new#tearOff::T%>(_#wc5#formal);
+static extension-type-member method JsonList3|sublist<T extends core::Object? = dynamic>(lowered final self::JsonList3<self::JsonList3|sublist::T%> /* erasure=core::List<core::Object?> */ #this, core::int start, [core::int? end = #C4]) → core::List<self::JsonList3|sublist::T%>
+  return (#this as{Unchecked} core::List<core::Object?>).{core::List::sublist}(start, end){(core::int, [core::int?]) → core::List<core::Object?>}.{core::List::cast}<self::JsonList3|sublist::T%>(){() → core::List<self::JsonList3|sublist::T%>};
+static extension-type-member method JsonList3|get#sublist<T extends core::Object? = dynamic>(lowered final self::JsonList3<self::JsonList3|get#sublist::T%> /* erasure=core::List<core::Object?> */ #this) → (core::int, [core::int?]) → core::List<self::JsonList3|get#sublist::T%>
+  return (core::int start, [core::int? end = #C4]) → core::List<self::JsonList3|get#sublist::T%> => self::JsonList3|sublist<self::JsonList3|get#sublist::T%>(#this, start, end);
+static method parseJson6(self::JsonList3<dynamic> /* erasure=core::List<core::Object?> */ list) → void {
+  {
+    final synthesized self::JsonList3<dynamic> /* erasure=core::List<core::Object?> */ #0#0 = list;
+    final const synthesized core::int #0#2 = #C3;
+    final const synthesized core::String #0#5 = #C2;
+    if(#0#0.{core::List::length}{core::int} =={core::num::==}{(core::Object) → core::bool} #C3 && #C2 =={core::String::==}{(core::Object) → core::bool} #0#0.{core::List::[]}(0){(core::int) → core::Object?})
+      core::print("ok");
+  }
+}
+
+constants  {
+  #C1 = "key"
+  #C2 = "value"
+  #C3 = 1
+  #C4 = null
+}
diff --git a/pkg/front_end/testcases/patterns/issue63315.dart.strong.modular.expect b/pkg/front_end/testcases/patterns/issue63315.dart.strong.modular.expect
new file mode 100644
index 0000000..8d5f0f2
--- /dev/null
+++ b/pkg/front_end/testcases/patterns/issue63315.dart.strong.modular.expect
@@ -0,0 +1,161 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+extension type JsonMap1<T extends core::Object? = dynamic>(core::Map<core::String, core::Object?> _) implements core::Map<core::String, core::Object?> {
+  abstract extension-type-member representation-field get _() → core::Map<core::String, core::Object?>;
+  operator [] = self::JsonMap1|[];
+  constructor • = self::JsonMap1|constructor#;
+  constructor tearoff • = self::JsonMap1|constructor#_#new#tearOff;
+}
+extension type JsonMap2<T extends core::Object? = dynamic>(core::Map<core::String, core::Object?> _) implements core::Map<core::String, core::Object?> {
+  abstract extension-type-member representation-field get _() → core::Map<core::String, core::Object?>;
+  method containsKey = self::JsonMap2|containsKey;
+  method tearoff containsKey = self::JsonMap2|get#containsKey;
+  constructor • = self::JsonMap2|constructor#;
+  constructor tearoff • = self::JsonMap2|constructor#_#new#tearOff;
+}
+extension type JsonMap3<T extends core::Object? = dynamic>(core::Map<core::String, core::Object?> _) implements core::Map<core::String, core::Object?> {
+  abstract extension-type-member representation-field get _() → core::Map<core::String, core::Object?>;
+  get length = self::JsonMap3|get#length;
+  constructor • = self::JsonMap3|constructor#;
+  constructor tearoff • = self::JsonMap3|constructor#_#new#tearOff;
+}
+extension type JsonList1<T extends core::Object? = dynamic>(core::List<core::Object?> _) implements core::List<core::Object?> {
+  abstract extension-type-member representation-field get _() → core::List<core::Object?>;
+  operator [] = self::JsonList1|[];
+  constructor • = self::JsonList1|constructor#;
+  constructor tearoff • = self::JsonList1|constructor#_#new#tearOff;
+}
+extension type JsonList2<T extends core::Object? = dynamic>(core::List<core::Object?> _) implements core::List<core::Object?> {
+  abstract extension-type-member representation-field get _() → core::List<core::Object?>;
+  get length = self::JsonList2|get#length;
+  constructor • = self::JsonList2|constructor#;
+  constructor tearoff • = self::JsonList2|constructor#_#new#tearOff;
+}
+extension type JsonList3<T extends core::Object? = dynamic>(core::List<core::Object?> _) implements core::List<core::Object?> {
+  abstract extension-type-member representation-field get _() → core::List<core::Object?>;
+  method sublist = self::JsonList3|sublist;
+  method tearoff sublist = self::JsonList3|get#sublist;
+  constructor • = self::JsonList3|constructor#;
+  constructor tearoff • = self::JsonList3|constructor#_#new#tearOff;
+}
+static extension-type-member method JsonMap1|constructor#<T extends core::Object? = dynamic>(wildcard initializing-formal core::Map<core::String, core::Object?> _#wc0#formal) → self::JsonMap1<self::JsonMap1|constructor#::T%> /* erasure=core::Map<core::String, core::Object?> */ {
+  lowered final self::JsonMap1<self::JsonMap1|constructor#::T%> /* erasure=core::Map<core::String, core::Object?> */ #this = _#wc0#formal;
+  return #this;
+}
+static extension-type-member synthetic method JsonMap1|constructor#_#new#tearOff<T extends core::Object? = dynamic>(core::Map<core::String, core::Object?> _#wc0#formal) → self::JsonMap1<self::JsonMap1|constructor#_#new#tearOff::T%> /* erasure=core::Map<core::String, core::Object?> */
+  return self::JsonMap1|constructor#<self::JsonMap1|constructor#_#new#tearOff::T%>(_#wc0#formal);
+static extension-type-member method JsonMap1|[]<T extends core::Object? = dynamic>(lowered final self::JsonMap1<self::JsonMap1|[]::T%> /* erasure=core::Map<core::String, core::Object?> */ #this, core::String key) → self::JsonMap1|[]::T%
+  return (#this as{Unchecked} core::Map<core::String, core::Object?>).{core::Map::[]}(key){(core::Object?) → core::Object?} as self::JsonMap1|[]::T%;
+static method parseJson1(self::JsonMap1<dynamic> /* erasure=core::Map<core::String, core::Object?> */ map) → void {
+  {
+    final synthesized self::JsonMap1<dynamic> /* erasure=core::Map<core::String, core::Object?> */ #0#0 = map;
+    synthesized core::Object? #0#3;
+    synthesized core::bool #0#3#isSet = false;
+    final const synthesized core::String #0#1 = #C1;
+    final const synthesized core::String #0#4 = #C2;
+    if((!((#0#3#isSet ?{core::Object?} #0#3 : let final dynamic #t1 = #0#3#isSet = true in #0#3 = #0#0.{core::Map::[]}(#C1){(core::Object?) → core::Object?}) == null) || null is core::Object? && #0#0.{core::Map::containsKey}(#C1){(core::Object?) → core::bool}) && #C2 =={core::String::==}{(core::Object) → core::bool} (#0#3#isSet ?{core::Object?} #0#3 : let final dynamic #t2 = #0#3#isSet = true in #0#3 = #0#0.{core::Map::[]}(#C1){(core::Object?) → core::Object?}))
+      core::print("ok");
+  }
+}
+static extension-type-member method JsonMap2|constructor#<T extends core::Object? = dynamic>(wildcard initializing-formal core::Map<core::String, core::Object?> _#wc1#formal) → self::JsonMap2<self::JsonMap2|constructor#::T%> /* erasure=core::Map<core::String, core::Object?> */ {
+  lowered final self::JsonMap2<self::JsonMap2|constructor#::T%> /* erasure=core::Map<core::String, core::Object?> */ #this = _#wc1#formal;
+  return #this;
+}
+static extension-type-member synthetic method JsonMap2|constructor#_#new#tearOff<T extends core::Object? = dynamic>(core::Map<core::String, core::Object?> _#wc1#formal) → self::JsonMap2<self::JsonMap2|constructor#_#new#tearOff::T%> /* erasure=core::Map<core::String, core::Object?> */
+  return self::JsonMap2|constructor#<self::JsonMap2|constructor#_#new#tearOff::T%>(_#wc1#formal);
+static extension-type-member method JsonMap2|containsKey<T extends core::Object? = dynamic>(lowered final self::JsonMap2<self::JsonMap2|containsKey::T%> /* erasure=core::Map<core::String, core::Object?> */ #this, core::String key) → core::bool
+  return (#this as{Unchecked} core::Map<core::String, core::Object?>).{core::Map::containsKey}(key){(core::Object?) → core::bool};
+static extension-type-member method JsonMap2|get#containsKey<T extends core::Object? = dynamic>(lowered final self::JsonMap2<self::JsonMap2|get#containsKey::T%> /* erasure=core::Map<core::String, core::Object?> */ #this) → (core::String) → core::bool
+  return (core::String key) → core::bool => self::JsonMap2|containsKey<self::JsonMap2|get#containsKey::T%>(#this, key);
+static method parseJson2(self::JsonMap2<dynamic> /* erasure=core::Map<core::String, core::Object?> */ map) → void {
+  {
+    final synthesized self::JsonMap2<dynamic> /* erasure=core::Map<core::String, core::Object?> */ #0#0 = map;
+    synthesized core::Object? #0#3;
+    synthesized core::bool #0#3#isSet = false;
+    final const synthesized core::String #0#1 = #C1;
+    final const synthesized core::String #0#4 = #C2;
+    if((!((#0#3#isSet ?{core::Object?} #0#3 : let final dynamic #t3 = #0#3#isSet = true in #0#3 = #0#0.{core::Map::[]}(#C1){(core::Object?) → core::Object?}) == null) || null is core::Object? && #0#0.{core::Map::containsKey}(#C1){(core::Object?) → core::bool}) && #C2 =={core::String::==}{(core::Object) → core::bool} (#0#3#isSet ?{core::Object?} #0#3 : let final dynamic #t4 = #0#3#isSet = true in #0#3 = #0#0.{core::Map::[]}(#C1){(core::Object?) → core::Object?}))
+      core::print("ok");
+  }
+}
+static extension-type-member method JsonMap3|constructor#<T extends core::Object? = dynamic>(wildcard initializing-formal core::Map<core::String, core::Object?> _#wc2#formal) → self::JsonMap3<self::JsonMap3|constructor#::T%> /* erasure=core::Map<core::String, core::Object?> */ {
+  lowered final self::JsonMap3<self::JsonMap3|constructor#::T%> /* erasure=core::Map<core::String, core::Object?> */ #this = _#wc2#formal;
+  return #this;
+}
+static extension-type-member synthetic method JsonMap3|constructor#_#new#tearOff<T extends core::Object? = dynamic>(core::Map<core::String, core::Object?> _#wc2#formal) → self::JsonMap3<self::JsonMap3|constructor#_#new#tearOff::T%> /* erasure=core::Map<core::String, core::Object?> */
+  return self::JsonMap3|constructor#<self::JsonMap3|constructor#_#new#tearOff::T%>(_#wc2#formal);
+static extension-type-member method JsonMap3|get#length<T extends core::Object? = dynamic>(lowered final self::JsonMap3<self::JsonMap3|get#length::T%> /* erasure=core::Map<core::String, core::Object?> */ #this) → core::int
+  return (#this as{Unchecked} core::Map<core::String, core::Object?>).{core::Map::length}{core::int};
+static method parseJson3(self::JsonMap3<dynamic> /* erasure=core::Map<core::String, core::Object?> */ map) → void {
+  {
+    final synthesized self::JsonMap3<dynamic> /* erasure=core::Map<core::String, core::Object?> */ #0#0 = map;
+    synthesized core::Object? #0#3;
+    synthesized core::bool #0#3#isSet = false;
+    final const synthesized core::String #0#1 = #C1;
+    final const synthesized core::String #0#4 = #C2;
+    if((!((#0#3#isSet ?{core::Object?} #0#3 : let final dynamic #t5 = #0#3#isSet = true in #0#3 = #0#0.{core::Map::[]}(#C1){(core::Object?) → core::Object?}) == null) || null is core::Object? && #0#0.{core::Map::containsKey}(#C1){(core::Object?) → core::bool}) && #C2 =={core::String::==}{(core::Object) → core::bool} (#0#3#isSet ?{core::Object?} #0#3 : let final dynamic #t6 = #0#3#isSet = true in #0#3 = #0#0.{core::Map::[]}(#C1){(core::Object?) → core::Object?}))
+      core::print("ok");
+  }
+}
+static extension-type-member method JsonList1|constructor#<T extends core::Object? = dynamic>(wildcard initializing-formal core::List<core::Object?> _#wc3#formal) → self::JsonList1<self::JsonList1|constructor#::T%> /* erasure=core::List<core::Object?> */ {
+  lowered final self::JsonList1<self::JsonList1|constructor#::T%> /* erasure=core::List<core::Object?> */ #this = _#wc3#formal;
+  return #this;
+}
+static extension-type-member synthetic method JsonList1|constructor#_#new#tearOff<T extends core::Object? = dynamic>(core::List<core::Object?> _#wc3#formal) → self::JsonList1<self::JsonList1|constructor#_#new#tearOff::T%> /* erasure=core::List<core::Object?> */
+  return self::JsonList1|constructor#<self::JsonList1|constructor#_#new#tearOff::T%>(_#wc3#formal);
+static extension-type-member method JsonList1|[]<T extends core::Object? = dynamic>(lowered final self::JsonList1<self::JsonList1|[]::T%> /* erasure=core::List<core::Object?> */ #this, core::int index) → self::JsonList1|[]::T%
+  return (#this as{Unchecked} core::List<core::Object?>).{core::List::[]}(index){(core::int) → core::Object?} as self::JsonList1|[]::T%;
+static method parseJson4(self::JsonList1<dynamic> /* erasure=core::List<core::Object?> */ list) → void {
+  {
+    final synthesized self::JsonList1<dynamic> /* erasure=core::List<core::Object?> */ #0#0 = list;
+    final const synthesized core::int #0#2 = #C3;
+    final const synthesized core::String #0#5 = #C2;
+    if(#0#0.{core::List::length}{core::int} =={core::num::==}{(core::Object) → core::bool} #C3 && #C2 =={core::String::==}{(core::Object) → core::bool} #0#0.{core::List::[]}(0){(core::int) → core::Object?})
+      core::print("ok");
+  }
+}
+static extension-type-member method JsonList2|constructor#<T extends core::Object? = dynamic>(wildcard initializing-formal core::List<core::Object?> _#wc4#formal) → self::JsonList2<self::JsonList2|constructor#::T%> /* erasure=core::List<core::Object?> */ {
+  lowered final self::JsonList2<self::JsonList2|constructor#::T%> /* erasure=core::List<core::Object?> */ #this = _#wc4#formal;
+  return #this;
+}
+static extension-type-member synthetic method JsonList2|constructor#_#new#tearOff<T extends core::Object? = dynamic>(core::List<core::Object?> _#wc4#formal) → self::JsonList2<self::JsonList2|constructor#_#new#tearOff::T%> /* erasure=core::List<core::Object?> */
+  return self::JsonList2|constructor#<self::JsonList2|constructor#_#new#tearOff::T%>(_#wc4#formal);
+static extension-type-member method JsonList2|get#length<T extends core::Object? = dynamic>(lowered final self::JsonList2<self::JsonList2|get#length::T%> /* erasure=core::List<core::Object?> */ #this) → core::int
+  return (#this as{Unchecked} core::List<core::Object?>).{core::List::length}{core::int};
+static method parseJson5(self::JsonList2<dynamic> /* erasure=core::List<core::Object?> */ list) → void {
+  {
+    final synthesized self::JsonList2<dynamic> /* erasure=core::List<core::Object?> */ #0#0 = list;
+    final const synthesized core::int #0#2 = #C3;
+    final const synthesized core::String #0#5 = #C2;
+    if(#0#0.{core::List::length}{core::int} =={core::num::==}{(core::Object) → core::bool} #C3 && #C2 =={core::String::==}{(core::Object) → core::bool} #0#0.{core::List::[]}(0){(core::int) → core::Object?})
+      core::print("ok");
+  }
+}
+static extension-type-member method JsonList3|constructor#<T extends core::Object? = dynamic>(wildcard initializing-formal core::List<core::Object?> _#wc5#formal) → self::JsonList3<self::JsonList3|constructor#::T%> /* erasure=core::List<core::Object?> */ {
+  lowered final self::JsonList3<self::JsonList3|constructor#::T%> /* erasure=core::List<core::Object?> */ #this = _#wc5#formal;
+  return #this;
+}
+static extension-type-member synthetic method JsonList3|constructor#_#new#tearOff<T extends core::Object? = dynamic>(core::List<core::Object?> _#wc5#formal) → self::JsonList3<self::JsonList3|constructor#_#new#tearOff::T%> /* erasure=core::List<core::Object?> */
+  return self::JsonList3|constructor#<self::JsonList3|constructor#_#new#tearOff::T%>(_#wc5#formal);
+static extension-type-member method JsonList3|sublist<T extends core::Object? = dynamic>(lowered final self::JsonList3<self::JsonList3|sublist::T%> /* erasure=core::List<core::Object?> */ #this, core::int start, [core::int? end = #C4]) → core::List<self::JsonList3|sublist::T%>
+  return (#this as{Unchecked} core::List<core::Object?>).{core::List::sublist}(start, end){(core::int, [core::int?]) → core::List<core::Object?>}.{core::List::cast}<self::JsonList3|sublist::T%>(){() → core::List<self::JsonList3|sublist::T%>};
+static extension-type-member method JsonList3|get#sublist<T extends core::Object? = dynamic>(lowered final self::JsonList3<self::JsonList3|get#sublist::T%> /* erasure=core::List<core::Object?> */ #this) → (core::int, [core::int?]) → core::List<self::JsonList3|get#sublist::T%>
+  return (core::int start, [core::int? end = #C4]) → core::List<self::JsonList3|get#sublist::T%> => self::JsonList3|sublist<self::JsonList3|get#sublist::T%>(#this, start, end);
+static method parseJson6(self::JsonList3<dynamic> /* erasure=core::List<core::Object?> */ list) → void {
+  {
+    final synthesized self::JsonList3<dynamic> /* erasure=core::List<core::Object?> */ #0#0 = list;
+    final const synthesized core::int #0#2 = #C3;
+    final const synthesized core::String #0#5 = #C2;
+    if(#0#0.{core::List::length}{core::int} =={core::num::==}{(core::Object) → core::bool} #C3 && #C2 =={core::String::==}{(core::Object) → core::bool} #0#0.{core::List::[]}(0){(core::int) → core::Object?})
+      core::print("ok");
+  }
+}
+
+constants  {
+  #C1 = "key"
+  #C2 = "value"
+  #C3 = 1
+  #C4 = null
+}
diff --git a/pkg/front_end/testcases/patterns/issue63315.dart.strong.outline.expect b/pkg/front_end/testcases/patterns/issue63315.dart.strong.outline.expect
new file mode 100644
index 0000000..b94ed81
--- /dev/null
+++ b/pkg/front_end/testcases/patterns/issue63315.dart.strong.outline.expect
@@ -0,0 +1,94 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+extension type JsonMap1<T extends core::Object? = dynamic>(core::Map<core::String, core::Object?> _) implements core::Map<core::String, core::Object?> {
+  abstract extension-type-member representation-field get _() → core::Map<core::String, core::Object?>;
+  operator [] = self::JsonMap1|[];
+  constructor • = self::JsonMap1|constructor#;
+  constructor tearoff • = self::JsonMap1|constructor#_#new#tearOff;
+}
+extension type JsonMap2<T extends core::Object? = dynamic>(core::Map<core::String, core::Object?> _) implements core::Map<core::String, core::Object?> {
+  abstract extension-type-member representation-field get _() → core::Map<core::String, core::Object?>;
+  method containsKey = self::JsonMap2|containsKey;
+  method tearoff containsKey = self::JsonMap2|get#containsKey;
+  constructor • = self::JsonMap2|constructor#;
+  constructor tearoff • = self::JsonMap2|constructor#_#new#tearOff;
+}
+extension type JsonMap3<T extends core::Object? = dynamic>(core::Map<core::String, core::Object?> _) implements core::Map<core::String, core::Object?> {
+  abstract extension-type-member representation-field get _() → core::Map<core::String, core::Object?>;
+  get length = self::JsonMap3|get#length;
+  constructor • = self::JsonMap3|constructor#;
+  constructor tearoff • = self::JsonMap3|constructor#_#new#tearOff;
+}
+extension type JsonList1<T extends core::Object? = dynamic>(core::List<core::Object?> _) implements core::List<core::Object?> {
+  abstract extension-type-member representation-field get _() → core::List<core::Object?>;
+  operator [] = self::JsonList1|[];
+  constructor • = self::JsonList1|constructor#;
+  constructor tearoff • = self::JsonList1|constructor#_#new#tearOff;
+}
+extension type JsonList2<T extends core::Object? = dynamic>(core::List<core::Object?> _) implements core::List<core::Object?> {
+  abstract extension-type-member representation-field get _() → core::List<core::Object?>;
+  get length = self::JsonList2|get#length;
+  constructor • = self::JsonList2|constructor#;
+  constructor tearoff • = self::JsonList2|constructor#_#new#tearOff;
+}
+extension type JsonList3<T extends core::Object? = dynamic>(core::List<core::Object?> _) implements core::List<core::Object?> {
+  abstract extension-type-member representation-field get _() → core::List<core::Object?>;
+  method sublist = self::JsonList3|sublist;
+  method tearoff sublist = self::JsonList3|get#sublist;
+  constructor • = self::JsonList3|constructor#;
+  constructor tearoff • = self::JsonList3|constructor#_#new#tearOff;
+}
+static extension-type-member method JsonMap1|constructor#<T extends core::Object? = dynamic>(wildcard initializing-formal core::Map<core::String, core::Object?> _#wc0#formal) → self::JsonMap1<self::JsonMap1|constructor#::T%> /* erasure=core::Map<core::String, core::Object?> */
+  ;
+static extension-type-member synthetic method JsonMap1|constructor#_#new#tearOff<T extends core::Object? = dynamic>(core::Map<core::String, core::Object?> _#wc0#formal) → self::JsonMap1<self::JsonMap1|constructor#_#new#tearOff::T%> /* erasure=core::Map<core::String, core::Object?> */
+  return self::JsonMap1|constructor#<self::JsonMap1|constructor#_#new#tearOff::T%>(_#wc0#formal);
+static extension-type-member method JsonMap1|[]<T extends core::Object? = dynamic>(lowered final self::JsonMap1<self::JsonMap1|[]::T%> /* erasure=core::Map<core::String, core::Object?> */ #this, core::String key) → self::JsonMap1|[]::T%
+  ;
+static method parseJson1(self::JsonMap1<dynamic> /* erasure=core::Map<core::String, core::Object?> */ map) → void
+  ;
+static extension-type-member method JsonMap2|constructor#<T extends core::Object? = dynamic>(wildcard initializing-formal core::Map<core::String, core::Object?> _#wc1#formal) → self::JsonMap2<self::JsonMap2|constructor#::T%> /* erasure=core::Map<core::String, core::Object?> */
+  ;
+static extension-type-member synthetic method JsonMap2|constructor#_#new#tearOff<T extends core::Object? = dynamic>(core::Map<core::String, core::Object?> _#wc1#formal) → self::JsonMap2<self::JsonMap2|constructor#_#new#tearOff::T%> /* erasure=core::Map<core::String, core::Object?> */
+  return self::JsonMap2|constructor#<self::JsonMap2|constructor#_#new#tearOff::T%>(_#wc1#formal);
+static extension-type-member method JsonMap2|containsKey<T extends core::Object? = dynamic>(lowered final self::JsonMap2<self::JsonMap2|containsKey::T%> /* erasure=core::Map<core::String, core::Object?> */ #this, core::String key) → core::bool
+  ;
+static extension-type-member method JsonMap2|get#containsKey<T extends core::Object? = dynamic>(lowered final self::JsonMap2<self::JsonMap2|get#containsKey::T%> /* erasure=core::Map<core::String, core::Object?> */ #this) → (core::String) → core::bool
+  return (core::String key) → core::bool => self::JsonMap2|containsKey<self::JsonMap2|get#containsKey::T%>(#this, key);
+static method parseJson2(self::JsonMap2<dynamic> /* erasure=core::Map<core::String, core::Object?> */ map) → void
+  ;
+static extension-type-member method JsonMap3|constructor#<T extends core::Object? = dynamic>(wildcard initializing-formal core::Map<core::String, core::Object?> _#wc2#formal) → self::JsonMap3<self::JsonMap3|constructor#::T%> /* erasure=core::Map<core::String, core::Object?> */
+  ;
+static extension-type-member synthetic method JsonMap3|constructor#_#new#tearOff<T extends core::Object? = dynamic>(core::Map<core::String, core::Object?> _#wc2#formal) → self::JsonMap3<self::JsonMap3|constructor#_#new#tearOff::T%> /* erasure=core::Map<core::String, core::Object?> */
+  return self::JsonMap3|constructor#<self::JsonMap3|constructor#_#new#tearOff::T%>(_#wc2#formal);
+static extension-type-member method JsonMap3|get#length<T extends core::Object? = dynamic>(lowered final self::JsonMap3<self::JsonMap3|get#length::T%> /* erasure=core::Map<core::String, core::Object?> */ #this) → core::int
+  ;
+static method parseJson3(self::JsonMap3<dynamic> /* erasure=core::Map<core::String, core::Object?> */ map) → void
+  ;
+static extension-type-member method JsonList1|constructor#<T extends core::Object? = dynamic>(wildcard initializing-formal core::List<core::Object?> _#wc3#formal) → self::JsonList1<self::JsonList1|constructor#::T%> /* erasure=core::List<core::Object?> */
+  ;
+static extension-type-member synthetic method JsonList1|constructor#_#new#tearOff<T extends core::Object? = dynamic>(core::List<core::Object?> _#wc3#formal) → self::JsonList1<self::JsonList1|constructor#_#new#tearOff::T%> /* erasure=core::List<core::Object?> */
+  return self::JsonList1|constructor#<self::JsonList1|constructor#_#new#tearOff::T%>(_#wc3#formal);
+static extension-type-member method JsonList1|[]<T extends core::Object? = dynamic>(lowered final self::JsonList1<self::JsonList1|[]::T%> /* erasure=core::List<core::Object?> */ #this, core::int index) → self::JsonList1|[]::T%
+  ;
+static method parseJson4(self::JsonList1<dynamic> /* erasure=core::List<core::Object?> */ list) → void
+  ;
+static extension-type-member method JsonList2|constructor#<T extends core::Object? = dynamic>(wildcard initializing-formal core::List<core::Object?> _#wc4#formal) → self::JsonList2<self::JsonList2|constructor#::T%> /* erasure=core::List<core::Object?> */
+  ;
+static extension-type-member synthetic method JsonList2|constructor#_#new#tearOff<T extends core::Object? = dynamic>(core::List<core::Object?> _#wc4#formal) → self::JsonList2<self::JsonList2|constructor#_#new#tearOff::T%> /* erasure=core::List<core::Object?> */
+  return self::JsonList2|constructor#<self::JsonList2|constructor#_#new#tearOff::T%>(_#wc4#formal);
+static extension-type-member method JsonList2|get#length<T extends core::Object? = dynamic>(lowered final self::JsonList2<self::JsonList2|get#length::T%> /* erasure=core::List<core::Object?> */ #this) → core::int
+  ;
+static method parseJson5(self::JsonList2<dynamic> /* erasure=core::List<core::Object?> */ list) → void
+  ;
+static extension-type-member method JsonList3|constructor#<T extends core::Object? = dynamic>(wildcard initializing-formal core::List<core::Object?> _#wc5#formal) → self::JsonList3<self::JsonList3|constructor#::T%> /* erasure=core::List<core::Object?> */
+  ;
+static extension-type-member synthetic method JsonList3|constructor#_#new#tearOff<T extends core::Object? = dynamic>(core::List<core::Object?> _#wc5#formal) → self::JsonList3<self::JsonList3|constructor#_#new#tearOff::T%> /* erasure=core::List<core::Object?> */
+  return self::JsonList3|constructor#<self::JsonList3|constructor#_#new#tearOff::T%>(_#wc5#formal);
+static extension-type-member method JsonList3|sublist<T extends core::Object? = dynamic>(lowered final self::JsonList3<self::JsonList3|sublist::T%> /* erasure=core::List<core::Object?> */ #this, core::int start, [core::int? end]) → core::List<self::JsonList3|sublist::T%>
+  ;
+static extension-type-member method JsonList3|get#sublist<T extends core::Object? = dynamic>(lowered final self::JsonList3<self::JsonList3|get#sublist::T%> /* erasure=core::List<core::Object?> */ #this) → (core::int, [core::int?]) → core::List<self::JsonList3|get#sublist::T%>
+  return (core::int start, [core::int? end]) → core::List<self::JsonList3|get#sublist::T%> => self::JsonList3|sublist<self::JsonList3|get#sublist::T%>(#this, start, end);
+static method parseJson6(self::JsonList3<dynamic> /* erasure=core::List<core::Object?> */ list) → void
+  ;
diff --git a/pkg/front_end/testcases/patterns/issue63315.dart.strong.transformed.expect b/pkg/front_end/testcases/patterns/issue63315.dart.strong.transformed.expect
new file mode 100644
index 0000000..2115f8d
--- /dev/null
+++ b/pkg/front_end/testcases/patterns/issue63315.dart.strong.transformed.expect
@@ -0,0 +1,167 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+extension type JsonMap1<T extends core::Object? = dynamic>(core::Map<core::String, core::Object?> _) implements core::Map<core::String, core::Object?> {
+  abstract extension-type-member representation-field get _() → core::Map<core::String, core::Object?>;
+  operator [] = self::JsonMap1|[];
+  constructor • = self::JsonMap1|constructor#;
+  constructor tearoff • = self::JsonMap1|constructor#_#new#tearOff;
+}
+extension type JsonMap2<T extends core::Object? = dynamic>(core::Map<core::String, core::Object?> _) implements core::Map<core::String, core::Object?> {
+  abstract extension-type-member representation-field get _() → core::Map<core::String, core::Object?>;
+  method containsKey = self::JsonMap2|containsKey;
+  method tearoff containsKey = self::JsonMap2|get#containsKey;
+  constructor • = self::JsonMap2|constructor#;
+  constructor tearoff • = self::JsonMap2|constructor#_#new#tearOff;
+}
+extension type JsonMap3<T extends core::Object? = dynamic>(core::Map<core::String, core::Object?> _) implements core::Map<core::String, core::Object?> {
+  abstract extension-type-member representation-field get _() → core::Map<core::String, core::Object?>;
+  get length = self::JsonMap3|get#length;
+  constructor • = self::JsonMap3|constructor#;
+  constructor tearoff • = self::JsonMap3|constructor#_#new#tearOff;
+}
+extension type JsonList1<T extends core::Object? = dynamic>(core::List<core::Object?> _) implements core::List<core::Object?> {
+  abstract extension-type-member representation-field get _() → core::List<core::Object?>;
+  operator [] = self::JsonList1|[];
+  constructor • = self::JsonList1|constructor#;
+  constructor tearoff • = self::JsonList1|constructor#_#new#tearOff;
+}
+extension type JsonList2<T extends core::Object? = dynamic>(core::List<core::Object?> _) implements core::List<core::Object?> {
+  abstract extension-type-member representation-field get _() → core::List<core::Object?>;
+  get length = self::JsonList2|get#length;
+  constructor • = self::JsonList2|constructor#;
+  constructor tearoff • = self::JsonList2|constructor#_#new#tearOff;
+}
+extension type JsonList3<T extends core::Object? = dynamic>(core::List<core::Object?> _) implements core::List<core::Object?> {
+  abstract extension-type-member representation-field get _() → core::List<core::Object?>;
+  method sublist = self::JsonList3|sublist;
+  method tearoff sublist = self::JsonList3|get#sublist;
+  constructor • = self::JsonList3|constructor#;
+  constructor tearoff • = self::JsonList3|constructor#_#new#tearOff;
+}
+static extension-type-member method JsonMap1|constructor#<T extends core::Object? = dynamic>(wildcard initializing-formal core::Map<core::String, core::Object?> _#wc0#formal) → self::JsonMap1<self::JsonMap1|constructor#::T%> /* erasure=core::Map<core::String, core::Object?> */ {
+  lowered final self::JsonMap1<self::JsonMap1|constructor#::T%> /* erasure=core::Map<core::String, core::Object?> */ #this = _#wc0#formal;
+  return #this;
+}
+static extension-type-member synthetic method JsonMap1|constructor#_#new#tearOff<T extends core::Object? = dynamic>(core::Map<core::String, core::Object?> _#wc0#formal) → self::JsonMap1<self::JsonMap1|constructor#_#new#tearOff::T%> /* erasure=core::Map<core::String, core::Object?> */
+  return self::JsonMap1|constructor#<self::JsonMap1|constructor#_#new#tearOff::T%>(_#wc0#formal);
+static extension-type-member method JsonMap1|[]<T extends core::Object? = dynamic>(lowered final self::JsonMap1<self::JsonMap1|[]::T%> /* erasure=core::Map<core::String, core::Object?> */ #this, core::String key) → self::JsonMap1|[]::T%
+  return (#this as{Unchecked} core::Map<core::String, core::Object?>).{core::Map::[]}(key){(core::Object?) → core::Object?} as self::JsonMap1|[]::T%;
+static method parseJson1(self::JsonMap1<dynamic> /* erasure=core::Map<core::String, core::Object?> */ map) → void {
+  {
+    final synthesized self::JsonMap1<dynamic> /* erasure=core::Map<core::String, core::Object?> */ #0#0 = map;
+    synthesized core::Object? #0#3;
+    synthesized core::bool #0#3#isSet = false;
+    final const synthesized core::String #0#1 = #C1;
+    final const synthesized core::String #0#4 = #C2;
+    if((!((#0#3#isSet ?{core::Object?} #0#3 : let final dynamic #t1 = #0#3#isSet = true in #0#3 = #0#0.{core::Map::[]}(#C1){(core::Object?) → core::Object?}) == null) || null is core::Object? && #0#0.{core::Map::containsKey}(#C1){(core::Object?) → core::bool}) && #C2 =={core::String::==}{(core::Object) → core::bool} (#0#3#isSet ?{core::Object?} #0#3 : let final dynamic #t2 = #0#3#isSet = true in #0#3 = #0#0.{core::Map::[]}(#C1){(core::Object?) → core::Object?}))
+      core::print("ok");
+  }
+}
+static extension-type-member method JsonMap2|constructor#<T extends core::Object? = dynamic>(wildcard initializing-formal core::Map<core::String, core::Object?> _#wc1#formal) → self::JsonMap2<self::JsonMap2|constructor#::T%> /* erasure=core::Map<core::String, core::Object?> */ {
+  lowered final self::JsonMap2<self::JsonMap2|constructor#::T%> /* erasure=core::Map<core::String, core::Object?> */ #this = _#wc1#formal;
+  return #this;
+}
+static extension-type-member synthetic method JsonMap2|constructor#_#new#tearOff<T extends core::Object? = dynamic>(core::Map<core::String, core::Object?> _#wc1#formal) → self::JsonMap2<self::JsonMap2|constructor#_#new#tearOff::T%> /* erasure=core::Map<core::String, core::Object?> */
+  return self::JsonMap2|constructor#<self::JsonMap2|constructor#_#new#tearOff::T%>(_#wc1#formal);
+static extension-type-member method JsonMap2|containsKey<T extends core::Object? = dynamic>(lowered final self::JsonMap2<self::JsonMap2|containsKey::T%> /* erasure=core::Map<core::String, core::Object?> */ #this, core::String key) → core::bool
+  return (#this as{Unchecked} core::Map<core::String, core::Object?>).{core::Map::containsKey}(key){(core::Object?) → core::bool};
+static extension-type-member method JsonMap2|get#containsKey<T extends core::Object? = dynamic>(lowered final self::JsonMap2<self::JsonMap2|get#containsKey::T%> /* erasure=core::Map<core::String, core::Object?> */ #this) → (core::String) → core::bool
+  return (core::String key) → core::bool => self::JsonMap2|containsKey<self::JsonMap2|get#containsKey::T%>(#this, key);
+static method parseJson2(self::JsonMap2<dynamic> /* erasure=core::Map<core::String, core::Object?> */ map) → void {
+  {
+    final synthesized self::JsonMap2<dynamic> /* erasure=core::Map<core::String, core::Object?> */ #0#0 = map;
+    synthesized core::Object? #0#3;
+    synthesized core::bool #0#3#isSet = false;
+    final const synthesized core::String #0#1 = #C1;
+    final const synthesized core::String #0#4 = #C2;
+    if((!((#0#3#isSet ?{core::Object?} #0#3 : let final dynamic #t3 = #0#3#isSet = true in #0#3 = #0#0.{core::Map::[]}(#C1){(core::Object?) → core::Object?}) == null) || null is core::Object? && #0#0.{core::Map::containsKey}(#C1){(core::Object?) → core::bool}) && #C2 =={core::String::==}{(core::Object) → core::bool} (#0#3#isSet ?{core::Object?} #0#3 : let final dynamic #t4 = #0#3#isSet = true in #0#3 = #0#0.{core::Map::[]}(#C1){(core::Object?) → core::Object?}))
+      core::print("ok");
+  }
+}
+static extension-type-member method JsonMap3|constructor#<T extends core::Object? = dynamic>(wildcard initializing-formal core::Map<core::String, core::Object?> _#wc2#formal) → self::JsonMap3<self::JsonMap3|constructor#::T%> /* erasure=core::Map<core::String, core::Object?> */ {
+  lowered final self::JsonMap3<self::JsonMap3|constructor#::T%> /* erasure=core::Map<core::String, core::Object?> */ #this = _#wc2#formal;
+  return #this;
+}
+static extension-type-member synthetic method JsonMap3|constructor#_#new#tearOff<T extends core::Object? = dynamic>(core::Map<core::String, core::Object?> _#wc2#formal) → self::JsonMap3<self::JsonMap3|constructor#_#new#tearOff::T%> /* erasure=core::Map<core::String, core::Object?> */
+  return self::JsonMap3|constructor#<self::JsonMap3|constructor#_#new#tearOff::T%>(_#wc2#formal);
+static extension-type-member method JsonMap3|get#length<T extends core::Object? = dynamic>(lowered final self::JsonMap3<self::JsonMap3|get#length::T%> /* erasure=core::Map<core::String, core::Object?> */ #this) → core::int
+  return (#this as{Unchecked} core::Map<core::String, core::Object?>).{core::Map::length}{core::int};
+static method parseJson3(self::JsonMap3<dynamic> /* erasure=core::Map<core::String, core::Object?> */ map) → void {
+  {
+    final synthesized self::JsonMap3<dynamic> /* erasure=core::Map<core::String, core::Object?> */ #0#0 = map;
+    synthesized core::Object? #0#3;
+    synthesized core::bool #0#3#isSet = false;
+    final const synthesized core::String #0#1 = #C1;
+    final const synthesized core::String #0#4 = #C2;
+    if((!((#0#3#isSet ?{core::Object?} #0#3 : let final dynamic #t5 = #0#3#isSet = true in #0#3 = #0#0.{core::Map::[]}(#C1){(core::Object?) → core::Object?}) == null) || null is core::Object? && #0#0.{core::Map::containsKey}(#C1){(core::Object?) → core::bool}) && #C2 =={core::String::==}{(core::Object) → core::bool} (#0#3#isSet ?{core::Object?} #0#3 : let final dynamic #t6 = #0#3#isSet = true in #0#3 = #0#0.{core::Map::[]}(#C1){(core::Object?) → core::Object?}))
+      core::print("ok");
+  }
+}
+static extension-type-member method JsonList1|constructor#<T extends core::Object? = dynamic>(wildcard initializing-formal core::List<core::Object?> _#wc3#formal) → self::JsonList1<self::JsonList1|constructor#::T%> /* erasure=core::List<core::Object?> */ {
+  lowered final self::JsonList1<self::JsonList1|constructor#::T%> /* erasure=core::List<core::Object?> */ #this = _#wc3#formal;
+  return #this;
+}
+static extension-type-member synthetic method JsonList1|constructor#_#new#tearOff<T extends core::Object? = dynamic>(core::List<core::Object?> _#wc3#formal) → self::JsonList1<self::JsonList1|constructor#_#new#tearOff::T%> /* erasure=core::List<core::Object?> */
+  return self::JsonList1|constructor#<self::JsonList1|constructor#_#new#tearOff::T%>(_#wc3#formal);
+static extension-type-member method JsonList1|[]<T extends core::Object? = dynamic>(lowered final self::JsonList1<self::JsonList1|[]::T%> /* erasure=core::List<core::Object?> */ #this, core::int index) → self::JsonList1|[]::T%
+  return (#this as{Unchecked} core::List<core::Object?>).{core::List::[]}(index){(core::int) → core::Object?} as self::JsonList1|[]::T%;
+static method parseJson4(self::JsonList1<dynamic> /* erasure=core::List<core::Object?> */ list) → void {
+  {
+    final synthesized self::JsonList1<dynamic> /* erasure=core::List<core::Object?> */ #0#0 = list;
+    final const synthesized core::int #0#2 = #C3;
+    final const synthesized core::String #0#5 = #C2;
+    if(#0#0.{core::List::length}{core::int} =={core::num::==}{(core::Object) → core::bool} #C3 && #C2 =={core::String::==}{(core::Object) → core::bool} #0#0.{core::List::[]}(0){(core::int) → core::Object?})
+      core::print("ok");
+  }
+}
+static extension-type-member method JsonList2|constructor#<T extends core::Object? = dynamic>(wildcard initializing-formal core::List<core::Object?> _#wc4#formal) → self::JsonList2<self::JsonList2|constructor#::T%> /* erasure=core::List<core::Object?> */ {
+  lowered final self::JsonList2<self::JsonList2|constructor#::T%> /* erasure=core::List<core::Object?> */ #this = _#wc4#formal;
+  return #this;
+}
+static extension-type-member synthetic method JsonList2|constructor#_#new#tearOff<T extends core::Object? = dynamic>(core::List<core::Object?> _#wc4#formal) → self::JsonList2<self::JsonList2|constructor#_#new#tearOff::T%> /* erasure=core::List<core::Object?> */
+  return self::JsonList2|constructor#<self::JsonList2|constructor#_#new#tearOff::T%>(_#wc4#formal);
+static extension-type-member method JsonList2|get#length<T extends core::Object? = dynamic>(lowered final self::JsonList2<self::JsonList2|get#length::T%> /* erasure=core::List<core::Object?> */ #this) → core::int
+  return (#this as{Unchecked} core::List<core::Object?>).{core::List::length}{core::int};
+static method parseJson5(self::JsonList2<dynamic> /* erasure=core::List<core::Object?> */ list) → void {
+  {
+    final synthesized self::JsonList2<dynamic> /* erasure=core::List<core::Object?> */ #0#0 = list;
+    final const synthesized core::int #0#2 = #C3;
+    final const synthesized core::String #0#5 = #C2;
+    if(#0#0.{core::List::length}{core::int} =={core::num::==}{(core::Object) → core::bool} #C3 && #C2 =={core::String::==}{(core::Object) → core::bool} #0#0.{core::List::[]}(0){(core::int) → core::Object?})
+      core::print("ok");
+  }
+}
+static extension-type-member method JsonList3|constructor#<T extends core::Object? = dynamic>(wildcard initializing-formal core::List<core::Object?> _#wc5#formal) → self::JsonList3<self::JsonList3|constructor#::T%> /* erasure=core::List<core::Object?> */ {
+  lowered final self::JsonList3<self::JsonList3|constructor#::T%> /* erasure=core::List<core::Object?> */ #this = _#wc5#formal;
+  return #this;
+}
+static extension-type-member synthetic method JsonList3|constructor#_#new#tearOff<T extends core::Object? = dynamic>(core::List<core::Object?> _#wc5#formal) → self::JsonList3<self::JsonList3|constructor#_#new#tearOff::T%> /* erasure=core::List<core::Object?> */
+  return self::JsonList3|constructor#<self::JsonList3|constructor#_#new#tearOff::T%>(_#wc5#formal);
+static extension-type-member method JsonList3|sublist<T extends core::Object? = dynamic>(lowered final self::JsonList3<self::JsonList3|sublist::T%> /* erasure=core::List<core::Object?> */ #this, core::int start, [core::int? end = #C4]) → core::List<self::JsonList3|sublist::T%>
+  return (#this as{Unchecked} core::List<core::Object?>).{core::List::sublist}(start, end){(core::int, [core::int?]) → core::List<core::Object?>}.{core::List::cast}<self::JsonList3|sublist::T%>(){() → core::List<self::JsonList3|sublist::T%>};
+static extension-type-member method JsonList3|get#sublist<T extends core::Object? = dynamic>(lowered final self::JsonList3<self::JsonList3|get#sublist::T%> /* erasure=core::List<core::Object?> */ #this) → (core::int, [core::int?]) → core::List<self::JsonList3|get#sublist::T%>
+  return (core::int start, [core::int? end = #C4]) → core::List<self::JsonList3|get#sublist::T%> => self::JsonList3|sublist<self::JsonList3|get#sublist::T%>(#this, start, end);
+static method parseJson6(self::JsonList3<dynamic> /* erasure=core::List<core::Object?> */ list) → void {
+  {
+    final synthesized self::JsonList3<dynamic> /* erasure=core::List<core::Object?> */ #0#0 = list;
+    final const synthesized core::int #0#2 = #C3;
+    final const synthesized core::String #0#5 = #C2;
+    if(#0#0.{core::List::length}{core::int} =={core::num::==}{(core::Object) → core::bool} #C3 && #C2 =={core::String::==}{(core::Object) → core::bool} #0#0.{core::List::[]}(0){(core::int) → core::Object?})
+      core::print("ok");
+  }
+}
+
+constants  {
+  #C1 = "key"
+  #C2 = "value"
+  #C3 = 1
+  #C4 = null
+}
+
+Extra constant evaluation status:
+Evaluated: IsExpression @ org-dartlang-testcase:///issue63315.dart:11:22 -> BoolConstant(true)
+Evaluated: IsExpression @ org-dartlang-testcase:///issue63315.dart:20:22 -> BoolConstant(true)
+Evaluated: IsExpression @ org-dartlang-testcase:///issue63315.dart:29:22 -> BoolConstant(true)
+Extra constant evaluation: evaluated: 167, effectively constant: 3
diff --git a/pkg/front_end/testcases/patterns/issue63315.dart.textual_outline.expect b/pkg/front_end/testcases/patterns/issue63315.dart.textual_outline.expect
new file mode 100644
index 0000000..8374d3b
--- /dev/null
+++ b/pkg/front_end/testcases/patterns/issue63315.dart.textual_outline.expect
@@ -0,0 +1,38 @@
+extension type JsonMap1<T>(Map<String, Object?> _)
+    implements Map<String, Object?> {
+  T operator [](String key) => _[key] as T;
+}
+
+void parseJson1(JsonMap1 map) {}
+
+extension type JsonMap2<T>(Map<String, Object?> _)
+    implements Map<String, Object?> {
+  bool containsKey(String key) => _.containsKey(key);
+}
+
+void parseJson2(JsonMap2 map) {}
+
+extension type JsonMap3<T>(Map<String, Object?> _)
+    implements Map<String, Object?> {
+  int get length => _.length;
+}
+
+void parseJson3(JsonMap3 map) {}
+
+extension type JsonList1<T>(List<Object?> _) implements List<Object?> {
+  T operator [](int index) => _[index] as T;
+}
+
+void parseJson4(JsonList1 list) {}
+
+extension type JsonList2<T>(List<Object?> _) implements List<Object?> {
+  int get length => _.length;
+}
+
+void parseJson5(JsonList2 list) {}
+
+extension type JsonList3<T>(List<Object?> _) implements List<Object?> {
+  List<T> sublist(int start, [int? end]) => _.sublist(start, end).cast<T>();
+}
+
+void parseJson6(JsonList3 list) {}
diff --git a/pkg/front_end/testcases/patterns/issue63315.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/patterns/issue63315.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..c829442
--- /dev/null
+++ b/pkg/front_end/testcases/patterns/issue63315.dart.textual_outline_modelled.expect
@@ -0,0 +1,38 @@
+extension type JsonList1<T>(List<Object?> _) implements List<Object?> {
+  T operator [](int index) => _[index] as T;
+}
+
+extension type JsonList2<T>(List<Object?> _) implements List<Object?> {
+  int get length => _.length;
+}
+
+extension type JsonList3<T>(List<Object?> _) implements List<Object?> {
+  List<T> sublist(int start, [int? end]) => _.sublist(start, end).cast<T>();
+}
+
+extension type JsonMap1<T>(Map<String, Object?> _)
+    implements Map<String, Object?> {
+  T operator [](String key) => _[key] as T;
+}
+
+extension type JsonMap2<T>(Map<String, Object?> _)
+    implements Map<String, Object?> {
+  bool containsKey(String key) => _.containsKey(key);
+}
+
+extension type JsonMap3<T>(Map<String, Object?> _)
+    implements Map<String, Object?> {
+  int get length => _.length;
+}
+
+void parseJson1(JsonMap1 map) {}
+
+void parseJson2(JsonMap2 map) {}
+
+void parseJson3(JsonMap3 map) {}
+
+void parseJson4(JsonList1 list) {}
+
+void parseJson5(JsonList2 list) {}
+
+void parseJson6(JsonList3 list) {}
diff --git a/pkg/front_end/testcases/patterns/map_lookup.dart.strong.expect b/pkg/front_end/testcases/patterns/map_lookup.dart.strong.expect
index 09dd4f6..7189d77 100644
--- a/pkg/front_end/testcases/patterns/map_lookup.dart.strong.expect
+++ b/pkg/front_end/testcases/patterns/map_lookup.dart.strong.expect
@@ -155,7 +155,7 @@
     synthesized core::int? #0#6;
     synthesized core::bool #0#6#isSet = false;
     final const synthesized core::String #0#4 = #C7;
-    if(!((!((#0#3#isSet ?{core::int?} #0#3 : let final dynamic #t30 = #0#3#isSet = true in #0#3 = #0#0.{self::MyMap::[]}(#C5){(core::Object?) → core::int?}) == null) || null is core::int && #0#0.{self::MyMap::containsKey}(#C5){(core::Object?) → core::bool}) && (let final dynamic #t31 = x1 = (#0#3#isSet ?{core::int?} #0#3 : let final dynamic #t32 = #0#3#isSet = true in #0#3 = #0#0.{self::MyMap::[]}(#C5){(core::Object?) → core::int?}) as{Unchecked} core::int in true) && (!((#0#6#isSet ?{core::int?} #0#6 : let final dynamic #t33 = #0#6#isSet = true in #0#6 = #0#0.{self::MyMap::[]}(#C7){(core::Object?) → core::int?}) == null) || null is core::int && #0#0.{self::MyMap::containsKey}(#C7){(core::Object?) → core::bool}) && (let final dynamic #t34 = x2 = (#0#6#isSet ?{core::int?} #0#6 : let final dynamic #t35 = #0#6#isSet = true in #0#6 = #0#0.{self::MyMap::[]}(#C7){(core::Object?) → core::int?}) as{Unchecked} core::int in true)))
+    if(!((!((#0#3#isSet ?{core::int?} #0#3 : let final dynamic #t30 = #0#3#isSet = true in #0#3 = #0#0.{core::Map::[]}(#C5){(core::Object?) → core::int?}) == null) || null is core::int && #0#0.{core::Map::containsKey}(#C5){(core::Object?) → core::bool}) && (let final dynamic #t31 = x1 = (#0#3#isSet ?{core::int?} #0#3 : let final dynamic #t32 = #0#3#isSet = true in #0#3 = #0#0.{core::Map::[]}(#C5){(core::Object?) → core::int?}) as{Unchecked} core::int in true) && (!((#0#6#isSet ?{core::int?} #0#6 : let final dynamic #t33 = #0#6#isSet = true in #0#6 = #0#0.{core::Map::[]}(#C7){(core::Object?) → core::int?}) == null) || null is core::int && #0#0.{core::Map::containsKey}(#C7){(core::Object?) → core::bool}) && (let final dynamic #t34 = x2 = (#0#6#isSet ?{core::int?} #0#6 : let final dynamic #t35 = #0#6#isSet = true in #0#6 = #0#0.{core::Map::[]}(#C7){(core::Object?) → core::int?}) as{Unchecked} core::int in true)))
       throw{for-error-handling} new core::StateError::•("Pattern matching error");
   }
   self::expect(self::hasUnsoundNullSafety ?{core::String} self::unsoundResult : self::soundResult, map.{self::MyMap::log}{core::String});
@@ -170,7 +170,7 @@
     synthesized core::int? #1#6;
     synthesized core::bool #1#6#isSet = false;
     final const synthesized core::String #1#4 = #C7;
-    if(!((!((#1#3#isSet ?{core::int?} #1#3 : let final dynamic #t36 = #1#3#isSet = true in #1#3 = #1#0.{self::MyMap::[]}(#C5){(core::Object?) → core::int?}) == null) || null is core::int && #1#0.{self::MyMap::containsKey}(#C5){(core::Object?) → core::bool}) && (let final dynamic #t37 = y1 = (#1#3#isSet ?{core::int?} #1#3 : let final dynamic #t38 = #1#3#isSet = true in #1#3 = #1#0.{self::MyMap::[]}(#C5){(core::Object?) → core::int?}) as{Unchecked} core::int in true) && (!((#1#6#isSet ?{core::int?} #1#6 : let final dynamic #t39 = #1#6#isSet = true in #1#6 = #1#0.{self::MyMap::[]}(#C7){(core::Object?) → core::int?}) == null) || null is core::int && #1#0.{self::MyMap::containsKey}(#C7){(core::Object?) → core::bool}) && (let final dynamic #t40 = y2 = (#1#6#isSet ?{core::int?} #1#6 : let final dynamic #t41 = #1#6#isSet = true in #1#6 = #1#0.{self::MyMap::[]}(#C7){(core::Object?) → core::int?}) as{Unchecked} core::int in true)))
+    if(!((!((#1#3#isSet ?{core::int?} #1#3 : let final dynamic #t36 = #1#3#isSet = true in #1#3 = #1#0.{core::Map::[]}(#C5){(core::Object?) → core::int?}) == null) || null is core::int && #1#0.{core::Map::containsKey}(#C5){(core::Object?) → core::bool}) && (let final dynamic #t37 = y1 = (#1#3#isSet ?{core::int?} #1#3 : let final dynamic #t38 = #1#3#isSet = true in #1#3 = #1#0.{core::Map::[]}(#C5){(core::Object?) → core::int?}) as{Unchecked} core::int in true) && (!((#1#6#isSet ?{core::int?} #1#6 : let final dynamic #t39 = #1#6#isSet = true in #1#6 = #1#0.{core::Map::[]}(#C7){(core::Object?) → core::int?}) == null) || null is core::int && #1#0.{core::Map::containsKey}(#C7){(core::Object?) → core::bool}) && (let final dynamic #t40 = y2 = (#1#6#isSet ?{core::int?} #1#6 : let final dynamic #t41 = #1#6#isSet = true in #1#6 = #1#0.{core::Map::[]}(#C7){(core::Object?) → core::int?}) as{Unchecked} core::int in true)))
       throw{for-error-handling} new core::StateError::•("Pattern matching error");
   }
   self::expect(self::hasUnsoundNullSafety ?{core::String} self::unsoundResult : self::soundResult, map.{self::MyMap::log}{core::String});
diff --git a/pkg/front_end/testcases/patterns/map_lookup.dart.strong.modular.expect b/pkg/front_end/testcases/patterns/map_lookup.dart.strong.modular.expect
index 09dd4f6..7189d77 100644
--- a/pkg/front_end/testcases/patterns/map_lookup.dart.strong.modular.expect
+++ b/pkg/front_end/testcases/patterns/map_lookup.dart.strong.modular.expect
@@ -155,7 +155,7 @@
     synthesized core::int? #0#6;
     synthesized core::bool #0#6#isSet = false;
     final const synthesized core::String #0#4 = #C7;
-    if(!((!((#0#3#isSet ?{core::int?} #0#3 : let final dynamic #t30 = #0#3#isSet = true in #0#3 = #0#0.{self::MyMap::[]}(#C5){(core::Object?) → core::int?}) == null) || null is core::int && #0#0.{self::MyMap::containsKey}(#C5){(core::Object?) → core::bool}) && (let final dynamic #t31 = x1 = (#0#3#isSet ?{core::int?} #0#3 : let final dynamic #t32 = #0#3#isSet = true in #0#3 = #0#0.{self::MyMap::[]}(#C5){(core::Object?) → core::int?}) as{Unchecked} core::int in true) && (!((#0#6#isSet ?{core::int?} #0#6 : let final dynamic #t33 = #0#6#isSet = true in #0#6 = #0#0.{self::MyMap::[]}(#C7){(core::Object?) → core::int?}) == null) || null is core::int && #0#0.{self::MyMap::containsKey}(#C7){(core::Object?) → core::bool}) && (let final dynamic #t34 = x2 = (#0#6#isSet ?{core::int?} #0#6 : let final dynamic #t35 = #0#6#isSet = true in #0#6 = #0#0.{self::MyMap::[]}(#C7){(core::Object?) → core::int?}) as{Unchecked} core::int in true)))
+    if(!((!((#0#3#isSet ?{core::int?} #0#3 : let final dynamic #t30 = #0#3#isSet = true in #0#3 = #0#0.{core::Map::[]}(#C5){(core::Object?) → core::int?}) == null) || null is core::int && #0#0.{core::Map::containsKey}(#C5){(core::Object?) → core::bool}) && (let final dynamic #t31 = x1 = (#0#3#isSet ?{core::int?} #0#3 : let final dynamic #t32 = #0#3#isSet = true in #0#3 = #0#0.{core::Map::[]}(#C5){(core::Object?) → core::int?}) as{Unchecked} core::int in true) && (!((#0#6#isSet ?{core::int?} #0#6 : let final dynamic #t33 = #0#6#isSet = true in #0#6 = #0#0.{core::Map::[]}(#C7){(core::Object?) → core::int?}) == null) || null is core::int && #0#0.{core::Map::containsKey}(#C7){(core::Object?) → core::bool}) && (let final dynamic #t34 = x2 = (#0#6#isSet ?{core::int?} #0#6 : let final dynamic #t35 = #0#6#isSet = true in #0#6 = #0#0.{core::Map::[]}(#C7){(core::Object?) → core::int?}) as{Unchecked} core::int in true)))
       throw{for-error-handling} new core::StateError::•("Pattern matching error");
   }
   self::expect(self::hasUnsoundNullSafety ?{core::String} self::unsoundResult : self::soundResult, map.{self::MyMap::log}{core::String});
@@ -170,7 +170,7 @@
     synthesized core::int? #1#6;
     synthesized core::bool #1#6#isSet = false;
     final const synthesized core::String #1#4 = #C7;
-    if(!((!((#1#3#isSet ?{core::int?} #1#3 : let final dynamic #t36 = #1#3#isSet = true in #1#3 = #1#0.{self::MyMap::[]}(#C5){(core::Object?) → core::int?}) == null) || null is core::int && #1#0.{self::MyMap::containsKey}(#C5){(core::Object?) → core::bool}) && (let final dynamic #t37 = y1 = (#1#3#isSet ?{core::int?} #1#3 : let final dynamic #t38 = #1#3#isSet = true in #1#3 = #1#0.{self::MyMap::[]}(#C5){(core::Object?) → core::int?}) as{Unchecked} core::int in true) && (!((#1#6#isSet ?{core::int?} #1#6 : let final dynamic #t39 = #1#6#isSet = true in #1#6 = #1#0.{self::MyMap::[]}(#C7){(core::Object?) → core::int?}) == null) || null is core::int && #1#0.{self::MyMap::containsKey}(#C7){(core::Object?) → core::bool}) && (let final dynamic #t40 = y2 = (#1#6#isSet ?{core::int?} #1#6 : let final dynamic #t41 = #1#6#isSet = true in #1#6 = #1#0.{self::MyMap::[]}(#C7){(core::Object?) → core::int?}) as{Unchecked} core::int in true)))
+    if(!((!((#1#3#isSet ?{core::int?} #1#3 : let final dynamic #t36 = #1#3#isSet = true in #1#3 = #1#0.{core::Map::[]}(#C5){(core::Object?) → core::int?}) == null) || null is core::int && #1#0.{core::Map::containsKey}(#C5){(core::Object?) → core::bool}) && (let final dynamic #t37 = y1 = (#1#3#isSet ?{core::int?} #1#3 : let final dynamic #t38 = #1#3#isSet = true in #1#3 = #1#0.{core::Map::[]}(#C5){(core::Object?) → core::int?}) as{Unchecked} core::int in true) && (!((#1#6#isSet ?{core::int?} #1#6 : let final dynamic #t39 = #1#6#isSet = true in #1#6 = #1#0.{core::Map::[]}(#C7){(core::Object?) → core::int?}) == null) || null is core::int && #1#0.{core::Map::containsKey}(#C7){(core::Object?) → core::bool}) && (let final dynamic #t40 = y2 = (#1#6#isSet ?{core::int?} #1#6 : let final dynamic #t41 = #1#6#isSet = true in #1#6 = #1#0.{core::Map::[]}(#C7){(core::Object?) → core::int?}) as{Unchecked} core::int in true)))
       throw{for-error-handling} new core::StateError::•("Pattern matching error");
   }
   self::expect(self::hasUnsoundNullSafety ?{core::String} self::unsoundResult : self::soundResult, map.{self::MyMap::log}{core::String});
diff --git a/pkg/front_end/testcases/patterns/map_lookup.dart.strong.transformed.expect b/pkg/front_end/testcases/patterns/map_lookup.dart.strong.transformed.expect
index a8b6f85..978064d 100644
--- a/pkg/front_end/testcases/patterns/map_lookup.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/patterns/map_lookup.dart.strong.transformed.expect
@@ -155,7 +155,7 @@
     synthesized core::int? #0#6;
     synthesized core::bool #0#6#isSet = false;
     final const synthesized core::String #0#4 = #C7;
-    if(!((!((#0#3#isSet ?{core::int?} #0#3 : let final dynamic #t38 = #0#3#isSet = true in #0#3 = #0#0.{self::MyMap::[]}(#C5){(core::Object?) → core::int?}) == null) || null is core::int && #0#0.{self::MyMap::containsKey}(#C5){(core::Object?) → core::bool}) && (let final dynamic #t39 = x1 = let core::int? #t40 = #0#3#isSet ?{core::int?} #0#3 : let final dynamic #t41 = #0#3#isSet = true in #0#3 = #0#0.{self::MyMap::[]}(#C5){(core::Object?) → core::int?} in #t40 == null ?{core::int} #t40 as{Unchecked} core::int : #t40{core::int} in true) && (!((#0#6#isSet ?{core::int?} #0#6 : let final dynamic #t42 = #0#6#isSet = true in #0#6 = #0#0.{self::MyMap::[]}(#C7){(core::Object?) → core::int?}) == null) || null is core::int && #0#0.{self::MyMap::containsKey}(#C7){(core::Object?) → core::bool}) && (let final dynamic #t43 = x2 = let core::int? #t44 = #0#6#isSet ?{core::int?} #0#6 : let final dynamic #t45 = #0#6#isSet = true in #0#6 = #0#0.{self::MyMap::[]}(#C7){(core::Object?) → core::int?} in #t44 == null ?{core::int} #t44 as{Unchecked} core::int : #t44{core::int} in true)))
+    if(!((!((#0#3#isSet ?{core::int?} #0#3 : let final dynamic #t38 = #0#3#isSet = true in #0#3 = #0#0.{core::Map::[]}(#C5){(core::Object?) → core::int?}) == null) || null is core::int && #0#0.{core::Map::containsKey}(#C5){(core::Object?) → core::bool}) && (let final dynamic #t39 = x1 = let core::int? #t40 = #0#3#isSet ?{core::int?} #0#3 : let final dynamic #t41 = #0#3#isSet = true in #0#3 = #0#0.{core::Map::[]}(#C5){(core::Object?) → core::int?} in #t40 == null ?{core::int} #t40 as{Unchecked} core::int : #t40{core::int} in true) && (!((#0#6#isSet ?{core::int?} #0#6 : let final dynamic #t42 = #0#6#isSet = true in #0#6 = #0#0.{core::Map::[]}(#C7){(core::Object?) → core::int?}) == null) || null is core::int && #0#0.{core::Map::containsKey}(#C7){(core::Object?) → core::bool}) && (let final dynamic #t43 = x2 = let core::int? #t44 = #0#6#isSet ?{core::int?} #0#6 : let final dynamic #t45 = #0#6#isSet = true in #0#6 = #0#0.{core::Map::[]}(#C7){(core::Object?) → core::int?} in #t44 == null ?{core::int} #t44 as{Unchecked} core::int : #t44{core::int} in true)))
       throw{for-error-handling} new core::StateError::•("Pattern matching error");
   }
   self::expect(self::hasUnsoundNullSafety ?{core::String} self::unsoundResult : self::soundResult, map.{self::MyMap::log}{core::String});
@@ -170,7 +170,7 @@
     synthesized core::int? #1#6;
     synthesized core::bool #1#6#isSet = false;
     final const synthesized core::String #1#4 = #C7;
-    if(!((!((#1#3#isSet ?{core::int?} #1#3 : let final dynamic #t46 = #1#3#isSet = true in #1#3 = #1#0.{self::MyMap::[]}(#C5){(core::Object?) → core::int?}) == null) || null is core::int && #1#0.{self::MyMap::containsKey}(#C5){(core::Object?) → core::bool}) && (let final dynamic #t47 = y1 = let core::int? #t48 = #1#3#isSet ?{core::int?} #1#3 : let final dynamic #t49 = #1#3#isSet = true in #1#3 = #1#0.{self::MyMap::[]}(#C5){(core::Object?) → core::int?} in #t48 == null ?{core::int} #t48 as{Unchecked} core::int : #t48{core::int} in true) && (!((#1#6#isSet ?{core::int?} #1#6 : let final dynamic #t50 = #1#6#isSet = true in #1#6 = #1#0.{self::MyMap::[]}(#C7){(core::Object?) → core::int?}) == null) || null is core::int && #1#0.{self::MyMap::containsKey}(#C7){(core::Object?) → core::bool}) && (let final dynamic #t51 = y2 = let core::int? #t52 = #1#6#isSet ?{core::int?} #1#6 : let final dynamic #t53 = #1#6#isSet = true in #1#6 = #1#0.{self::MyMap::[]}(#C7){(core::Object?) → core::int?} in #t52 == null ?{core::int} #t52 as{Unchecked} core::int : #t52{core::int} in true)))
+    if(!((!((#1#3#isSet ?{core::int?} #1#3 : let final dynamic #t46 = #1#3#isSet = true in #1#3 = #1#0.{core::Map::[]}(#C5){(core::Object?) → core::int?}) == null) || null is core::int && #1#0.{core::Map::containsKey}(#C5){(core::Object?) → core::bool}) && (let final dynamic #t47 = y1 = let core::int? #t48 = #1#3#isSet ?{core::int?} #1#3 : let final dynamic #t49 = #1#3#isSet = true in #1#3 = #1#0.{core::Map::[]}(#C5){(core::Object?) → core::int?} in #t48 == null ?{core::int} #t48 as{Unchecked} core::int : #t48{core::int} in true) && (!((#1#6#isSet ?{core::int?} #1#6 : let final dynamic #t50 = #1#6#isSet = true in #1#6 = #1#0.{core::Map::[]}(#C7){(core::Object?) → core::int?}) == null) || null is core::int && #1#0.{core::Map::containsKey}(#C7){(core::Object?) → core::bool}) && (let final dynamic #t51 = y2 = let core::int? #t52 = #1#6#isSet ?{core::int?} #1#6 : let final dynamic #t53 = #1#6#isSet = true in #1#6 = #1#0.{core::Map::[]}(#C7){(core::Object?) → core::int?} in #t52 == null ?{core::int} #t52 as{Unchecked} core::int : #t52{core::int} in true)))
       throw{for-error-handling} new core::StateError::•("Pattern matching error");
   }
   self::expect(self::hasUnsoundNullSafety ?{core::String} self::unsoundResult : self::soundResult, map.{self::MyMap::log}{core::String});
diff --git a/pkg/front_end/testcases/patterns/matching_and_capturing_accesses_list_element_once.dart.strong.expect b/pkg/front_end/testcases/patterns/matching_and_capturing_accesses_list_element_once.dart.strong.expect
index 1adcbb0..2610799 100644
--- a/pkg/front_end/testcases/patterns/matching_and_capturing_accesses_list_element_once.dart.strong.expect
+++ b/pkg/front_end/testcases/patterns/matching_and_capturing_accesses_list_element_once.dart.strong.expect
@@ -157,8 +157,8 @@
     {
       hoisted core::int x;
       hoisted core::int y;
-      if(#0#0.{self::A::length}{core::int} =={core::num::==}{(core::Object) → core::bool} #C5 && ((#0#4#isSet ?{core::int} #0#4 : let final dynamic #t1 = #0#4#isSet = true in #0#4 = #0#0.{self::A::[]}(0){(core::int) → core::int}) is core::int && (let final dynamic #t2 = x = #0#4#isSet ?{core::int} #0#4 : let final dynamic #t3 = #0#4#isSet = true in #0#4 = #0#0.{self::A::[]}(0){(core::int) → core::int} in true)) && (#0#5#isSet ?{core::int} #0#5 : let final dynamic #t4 = #0#5#isSet = true in #0#5 = #0#0.{self::A::[]}(1){(core::int) → core::int}) is core::int) {
-        y = #0#5#isSet ?{core::int} #0#5 : let final dynamic #t5 = #0#5#isSet = true in #0#5 = #0#0.{self::A::[]}(1){(core::int) → core::int};
+      if(#0#0.{core::List::length}{core::int} =={core::num::==}{(core::Object) → core::bool} #C5 && ((#0#4#isSet ?{core::int} #0#4 : let final dynamic #t1 = #0#4#isSet = true in #0#4 = #0#0.{core::List::[]}(0){(core::int) → core::int}) is core::int && (let final dynamic #t2 = x = #0#4#isSet ?{core::int} #0#4 : let final dynamic #t3 = #0#4#isSet = true in #0#4 = #0#0.{core::List::[]}(0){(core::int) → core::int} in true)) && (#0#5#isSet ?{core::int} #0#5 : let final dynamic #t4 = #0#5#isSet = true in #0#5 = #0#0.{core::List::[]}(1){(core::int) → core::int}) is core::int) {
+        y = #0#5#isSet ?{core::int} #0#5 : let final dynamic #t5 = #0#5#isSet = true in #0#5 = #0#0.{core::List::[]}(1){(core::int) → core::int};
         {
           self::expectEquals(x, 0);
           self::expectEquals(y, 0);
diff --git a/pkg/front_end/testcases/patterns/matching_and_capturing_accesses_list_element_once.dart.strong.modular.expect b/pkg/front_end/testcases/patterns/matching_and_capturing_accesses_list_element_once.dart.strong.modular.expect
index 1adcbb0..2610799 100644
--- a/pkg/front_end/testcases/patterns/matching_and_capturing_accesses_list_element_once.dart.strong.modular.expect
+++ b/pkg/front_end/testcases/patterns/matching_and_capturing_accesses_list_element_once.dart.strong.modular.expect
@@ -157,8 +157,8 @@
     {
       hoisted core::int x;
       hoisted core::int y;
-      if(#0#0.{self::A::length}{core::int} =={core::num::==}{(core::Object) → core::bool} #C5 && ((#0#4#isSet ?{core::int} #0#4 : let final dynamic #t1 = #0#4#isSet = true in #0#4 = #0#0.{self::A::[]}(0){(core::int) → core::int}) is core::int && (let final dynamic #t2 = x = #0#4#isSet ?{core::int} #0#4 : let final dynamic #t3 = #0#4#isSet = true in #0#4 = #0#0.{self::A::[]}(0){(core::int) → core::int} in true)) && (#0#5#isSet ?{core::int} #0#5 : let final dynamic #t4 = #0#5#isSet = true in #0#5 = #0#0.{self::A::[]}(1){(core::int) → core::int}) is core::int) {
-        y = #0#5#isSet ?{core::int} #0#5 : let final dynamic #t5 = #0#5#isSet = true in #0#5 = #0#0.{self::A::[]}(1){(core::int) → core::int};
+      if(#0#0.{core::List::length}{core::int} =={core::num::==}{(core::Object) → core::bool} #C5 && ((#0#4#isSet ?{core::int} #0#4 : let final dynamic #t1 = #0#4#isSet = true in #0#4 = #0#0.{core::List::[]}(0){(core::int) → core::int}) is core::int && (let final dynamic #t2 = x = #0#4#isSet ?{core::int} #0#4 : let final dynamic #t3 = #0#4#isSet = true in #0#4 = #0#0.{core::List::[]}(0){(core::int) → core::int} in true)) && (#0#5#isSet ?{core::int} #0#5 : let final dynamic #t4 = #0#5#isSet = true in #0#5 = #0#0.{core::List::[]}(1){(core::int) → core::int}) is core::int) {
+        y = #0#5#isSet ?{core::int} #0#5 : let final dynamic #t5 = #0#5#isSet = true in #0#5 = #0#0.{core::List::[]}(1){(core::int) → core::int};
         {
           self::expectEquals(x, 0);
           self::expectEquals(y, 0);
diff --git a/pkg/front_end/testcases/patterns/matching_and_capturing_accesses_list_element_once.dart.strong.transformed.expect b/pkg/front_end/testcases/patterns/matching_and_capturing_accesses_list_element_once.dart.strong.transformed.expect
index 4fc3aa2..ab9e2c9 100644
--- a/pkg/front_end/testcases/patterns/matching_and_capturing_accesses_list_element_once.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/patterns/matching_and_capturing_accesses_list_element_once.dart.strong.transformed.expect
@@ -534,8 +534,8 @@
     {
       hoisted core::int x;
       hoisted core::int y;
-      if(#0#0.{self::A::length}{core::int} =={core::num::==}{(core::Object) → core::bool} #C8 && ((#0#4#isSet ?{core::int} #0#4 : let final dynamic #t10 = #0#4#isSet = true in #0#4 = #0#0.{self::A::[]}(0){(core::int) → core::int}) is core::int && (let final dynamic #t11 = x = #0#4#isSet ?{core::int} #0#4 : let final dynamic #t12 = #0#4#isSet = true in #0#4 = #0#0.{self::A::[]}(0){(core::int) → core::int} in true)) && (#0#5#isSet ?{core::int} #0#5 : let final dynamic #t13 = #0#5#isSet = true in #0#5 = #0#0.{self::A::[]}(1){(core::int) → core::int}) is core::int) {
-        y = #0#5#isSet ?{core::int} #0#5 : let final dynamic #t14 = #0#5#isSet = true in #0#5 = #0#0.{self::A::[]}(1){(core::int) → core::int};
+      if(#0#0.{core::List::length}{core::int} =={core::num::==}{(core::Object) → core::bool} #C8 && ((#0#4#isSet ?{core::int} #0#4 : let final dynamic #t10 = #0#4#isSet = true in #0#4 = #0#0.{core::List::[]}(0){(core::int) → core::int}) is core::int && (let final dynamic #t11 = x = #0#4#isSet ?{core::int} #0#4 : let final dynamic #t12 = #0#4#isSet = true in #0#4 = #0#0.{core::List::[]}(0){(core::int) → core::int} in true)) && (#0#5#isSet ?{core::int} #0#5 : let final dynamic #t13 = #0#5#isSet = true in #0#5 = #0#0.{core::List::[]}(1){(core::int) → core::int}) is core::int) {
+        y = #0#5#isSet ?{core::int} #0#5 : let final dynamic #t14 = #0#5#isSet = true in #0#5 = #0#0.{core::List::[]}(1){(core::int) → core::int};
         {
           self::expectEquals(x, 0);
           self::expectEquals(y, 0);
diff --git a/pkg/front_end/testcases/patterns/never_list.dart.strong.expect b/pkg/front_end/testcases/patterns/never_list.dart.strong.expect
index 0d90889..819fc2d 100644
--- a/pkg/front_end/testcases/patterns/never_list.dart.strong.expect
+++ b/pkg/front_end/testcases/patterns/never_list.dart.strong.expect
@@ -4,10 +4,11 @@
 
 static method main() → void {
   try {
-    has-declared-initializer core::Object? y;
+    hoisted has-declared-initializer core::Object? y;
     {
       final synthesized Never #0#0 = throw 42;
-      if(!#0#0)
+      final const synthesized core::int #0#2 = #C1;
+      if(!(#0#0.{core::List::length}{core::int} =={core::num::==}{(core::Object) → core::bool} #C1 && (let final dynamic #t1 = y = #0#0.{core::List::[]}(0){(core::int) → core::Object?} in true)))
         throw{for-error-handling} new core::StateError::•("Pattern matching error");
     }
   }
@@ -17,3 +18,7 @@
   }
   throw "Missing exception";
 }
+
+constants  {
+  #C1 = 1
+}
diff --git a/pkg/front_end/testcases/patterns/never_list.dart.strong.modular.expect b/pkg/front_end/testcases/patterns/never_list.dart.strong.modular.expect
index 0d90889..819fc2d 100644
--- a/pkg/front_end/testcases/patterns/never_list.dart.strong.modular.expect
+++ b/pkg/front_end/testcases/patterns/never_list.dart.strong.modular.expect
@@ -4,10 +4,11 @@
 
 static method main() → void {
   try {
-    has-declared-initializer core::Object? y;
+    hoisted has-declared-initializer core::Object? y;
     {
       final synthesized Never #0#0 = throw 42;
-      if(!#0#0)
+      final const synthesized core::int #0#2 = #C1;
+      if(!(#0#0.{core::List::length}{core::int} =={core::num::==}{(core::Object) → core::bool} #C1 && (let final dynamic #t1 = y = #0#0.{core::List::[]}(0){(core::int) → core::Object?} in true)))
         throw{for-error-handling} new core::StateError::•("Pattern matching error");
     }
   }
@@ -17,3 +18,7 @@
   }
   throw "Missing exception";
 }
+
+constants  {
+  #C1 = 1
+}
diff --git a/pkg/front_end/testcases/patterns/never_list.dart.strong.transformed.expect b/pkg/front_end/testcases/patterns/never_list.dart.strong.transformed.expect
index 0d90889..819fc2d 100644
--- a/pkg/front_end/testcases/patterns/never_list.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/patterns/never_list.dart.strong.transformed.expect
@@ -4,10 +4,11 @@
 
 static method main() → void {
   try {
-    has-declared-initializer core::Object? y;
+    hoisted has-declared-initializer core::Object? y;
     {
       final synthesized Never #0#0 = throw 42;
-      if(!#0#0)
+      final const synthesized core::int #0#2 = #C1;
+      if(!(#0#0.{core::List::length}{core::int} =={core::num::==}{(core::Object) → core::bool} #C1 && (let final dynamic #t1 = y = #0#0.{core::List::[]}(0){(core::int) → core::Object?} in true)))
         throw{for-error-handling} new core::StateError::•("Pattern matching error");
     }
   }
@@ -17,3 +18,7 @@
   }
   throw "Missing exception";
 }
+
+constants  {
+  #C1 = 1
+}
diff --git a/pkg/front_end/testcases/patterns/never_map.dart.strong.expect b/pkg/front_end/testcases/patterns/never_map.dart.strong.expect
index 0ccd206..88c75a0 100644
--- a/pkg/front_end/testcases/patterns/never_map.dart.strong.expect
+++ b/pkg/front_end/testcases/patterns/never_map.dart.strong.expect
@@ -4,10 +4,13 @@
 
 static method main() → void {
   try {
-    has-declared-initializer core::Object? b;
+    hoisted has-declared-initializer core::Object? b;
     {
       final synthesized Never #0#0 = throw <core::int, core::int>{42: 42};
-      if(!#0#0)
+      synthesized core::Object? #0#3;
+      synthesized core::bool #0#3#isSet = false;
+      final const synthesized core::int #0#1 = #C1;
+      if(!((!((#0#3#isSet ?{core::Object?} #0#3 : let final dynamic #t1 = #0#3#isSet = true in #0#3 = #0#0.{core::Map::[]}(#C1){(core::Object?) → core::Object?}) == null) || null is core::Object? && #0#0.{core::Map::containsKey}(#C1){(core::Object?) → core::bool}) && (let final dynamic #t2 = b = #0#3#isSet ?{core::Object?} #0#3 : let final dynamic #t3 = #0#3#isSet = true in #0#3 = #0#0.{core::Map::[]}(#C1){(core::Object?) → core::Object?} in true)))
         throw{for-error-handling} new core::StateError::•("Pattern matching error");
     }
   }
@@ -17,3 +20,7 @@
   }
   throw "Missing exception";
 }
+
+constants  {
+  #C1 = 42
+}
diff --git a/pkg/front_end/testcases/patterns/never_map.dart.strong.modular.expect b/pkg/front_end/testcases/patterns/never_map.dart.strong.modular.expect
index 0ccd206..88c75a0 100644
--- a/pkg/front_end/testcases/patterns/never_map.dart.strong.modular.expect
+++ b/pkg/front_end/testcases/patterns/never_map.dart.strong.modular.expect
@@ -4,10 +4,13 @@
 
 static method main() → void {
   try {
-    has-declared-initializer core::Object? b;
+    hoisted has-declared-initializer core::Object? b;
     {
       final synthesized Never #0#0 = throw <core::int, core::int>{42: 42};
-      if(!#0#0)
+      synthesized core::Object? #0#3;
+      synthesized core::bool #0#3#isSet = false;
+      final const synthesized core::int #0#1 = #C1;
+      if(!((!((#0#3#isSet ?{core::Object?} #0#3 : let final dynamic #t1 = #0#3#isSet = true in #0#3 = #0#0.{core::Map::[]}(#C1){(core::Object?) → core::Object?}) == null) || null is core::Object? && #0#0.{core::Map::containsKey}(#C1){(core::Object?) → core::bool}) && (let final dynamic #t2 = b = #0#3#isSet ?{core::Object?} #0#3 : let final dynamic #t3 = #0#3#isSet = true in #0#3 = #0#0.{core::Map::[]}(#C1){(core::Object?) → core::Object?} in true)))
         throw{for-error-handling} new core::StateError::•("Pattern matching error");
     }
   }
@@ -17,3 +20,7 @@
   }
   throw "Missing exception";
 }
+
+constants  {
+  #C1 = 42
+}
diff --git a/pkg/front_end/testcases/patterns/never_map.dart.strong.transformed.expect b/pkg/front_end/testcases/patterns/never_map.dart.strong.transformed.expect
index 0ccd206..7ef4d31 100644
--- a/pkg/front_end/testcases/patterns/never_map.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/patterns/never_map.dart.strong.transformed.expect
@@ -4,10 +4,13 @@
 
 static method main() → void {
   try {
-    has-declared-initializer core::Object? b;
+    hoisted has-declared-initializer core::Object? b;
     {
       final synthesized Never #0#0 = throw <core::int, core::int>{42: 42};
-      if(!#0#0)
+      synthesized core::Object? #0#3;
+      synthesized core::bool #0#3#isSet = false;
+      final const synthesized core::int #0#1 = #C1;
+      if(!((!((#0#3#isSet ?{core::Object?} #0#3 : let final dynamic #t1 = #0#3#isSet = true in #0#3 = #0#0.{core::Map::[]}(#C1){(core::Object?) → core::Object?}) == null) || null is core::Object? && #0#0.{core::Map::containsKey}(#C1){(core::Object?) → core::bool}) && (let final dynamic #t2 = b = #0#3#isSet ?{core::Object?} #0#3 : let final dynamic #t3 = #0#3#isSet = true in #0#3 = #0#0.{core::Map::[]}(#C1){(core::Object?) → core::Object?} in true)))
         throw{for-error-handling} new core::StateError::•("Pattern matching error");
     }
   }
@@ -17,3 +20,11 @@
   }
   throw "Missing exception";
 }
+
+constants  {
+  #C1 = 42
+}
+
+Extra constant evaluation status:
+Evaluated: IsExpression @ org-dartlang-testcase:///never_map.dart:7:12 -> BoolConstant(true)
+Extra constant evaluation: evaluated: 34, effectively constant: 1
diff --git a/pkg/front_end/testcases/rasta/issue_000042.dart.strong.expect b/pkg/front_end/testcases/rasta/issue_000042.dart.strong.expect
index b8c6de5..d139eed 100644
--- a/pkg/front_end/testcases/rasta/issue_000042.dart.strong.expect
+++ b/pkg/front_end/testcases/rasta/issue_000042.dart.strong.expect
@@ -41,9 +41,6 @@
   for (var x, y in []) {}
        ^^^";
     for (final dynamic #t1 in <dynamic>[]) {
-      invalid-expression "pkg/front_end/testcases/rasta/issue_000042.dart:6:8: Error: A for-in loop can't have more than one loop variable.
-  for (var x, y in []) {}
-       ^^^";
       dynamic x;
       dynamic y;
     }
diff --git a/pkg/front_end/testcases/rasta/issue_000042.dart.strong.modular.expect b/pkg/front_end/testcases/rasta/issue_000042.dart.strong.modular.expect
index b8c6de5..d139eed 100644
--- a/pkg/front_end/testcases/rasta/issue_000042.dart.strong.modular.expect
+++ b/pkg/front_end/testcases/rasta/issue_000042.dart.strong.modular.expect
@@ -41,9 +41,6 @@
   for (var x, y in []) {}
        ^^^";
     for (final dynamic #t1 in <dynamic>[]) {
-      invalid-expression "pkg/front_end/testcases/rasta/issue_000042.dart:6:8: Error: A for-in loop can't have more than one loop variable.
-  for (var x, y in []) {}
-       ^^^";
       dynamic x;
       dynamic y;
     }
diff --git a/pkg/front_end/testcases/rasta/issue_000042.dart.strong.transformed.expect b/pkg/front_end/testcases/rasta/issue_000042.dart.strong.transformed.expect
index 96d330e..6abbd5c 100644
--- a/pkg/front_end/testcases/rasta/issue_000042.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/rasta/issue_000042.dart.strong.transformed.expect
@@ -45,9 +45,6 @@
       for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
         final dynamic #t1 = :sync-for-iterator.{core::Iterator::current}{dynamic};
         {
-          invalid-expression "pkg/front_end/testcases/rasta/issue_000042.dart:6:8: Error: A for-in loop can't have more than one loop variable.
-  for (var x, y in []) {}
-       ^^^";
           dynamic x;
           dynamic y;
         }
diff --git a/pkg/front_end/testcases/rasta/unresolved_for_in.dart.strong.expect b/pkg/front_end/testcases/rasta/unresolved_for_in.dart.strong.expect
index 37a65b8..18ab063 100644
--- a/pkg/front_end/testcases/rasta/unresolved_for_in.dart.strong.expect
+++ b/pkg/front_end/testcases/rasta/unresolved_for_in.dart.strong.expect
@@ -98,11 +98,7 @@
  - 'Fisk' is from 'pkg/front_end/testcases/rasta/unresolved_for_in.dart'.
 Try correcting the name to the name of an existing setter, or defining a setter or field named 'key'.
     for (key in x) {
-         ^^^" in this.{<unresolved>}key = invalid-expression "pkg/front_end/testcases/rasta/unresolved_for_in.dart:11:10: Error: The setter 'key' isn't defined for the type 'Fisk'.
- - 'Fisk' is from 'pkg/front_end/testcases/rasta/unresolved_for_in.dart'.
-Try correcting the name to the name of an existing setter, or defining a setter or field named 'key'.
-    for (key in x) {
-         ^^^";
+         ^^^" in this.{<unresolved>}key = #t1;
       core::print(invalid-expression "pkg/front_end/testcases/rasta/unresolved_for_in.dart:12:13: Error: The getter 'key' isn't defined for the type 'Fisk'.
  - 'Fisk' is from 'pkg/front_end/testcases/rasta/unresolved_for_in.dart'.
 Try correcting the name to the name of an existing getter, or defining a getter or field named 'key'.
@@ -134,9 +130,6 @@
     for (1 in x) {
          ^";
       for (final dynamic #t5 in x as{TypeError,ForDynamic} core::Iterable<dynamic>) {
-        invalid-expression "pkg/front_end/testcases/rasta/unresolved_for_in.dart:23:10: Error: Can't assign to this, so it can't be used in a for-in loop.
-    for (1 in x) {
-         ^";
         1;
         core::print(invalid-expression "pkg/front_end/testcases/rasta/unresolved_for_in.dart:24:13: Error: The getter 'key' isn't defined for the type 'Fisk'.
  - 'Fisk' is from 'pkg/front_end/testcases/rasta/unresolved_for_in.dart'.
@@ -182,9 +175,6 @@
   for (1 in arguments) {
        ^";
     for (final dynamic #t10 in arguments as{TypeError,ForDynamic} core::Iterable<dynamic>) {
-      invalid-expression "pkg/front_end/testcases/rasta/unresolved_for_in.dart:43:8: Error: Can't assign to this, so it can't be used in a for-in loop.
-  for (1 in arguments) {
-       ^";
       1;
       core::print(invalid-expression "pkg/front_end/testcases/rasta/unresolved_for_in.dart:44:11: Error: Undefined name 'key'.
     print(key);
diff --git a/pkg/front_end/testcases/rasta/unresolved_for_in.dart.strong.modular.expect b/pkg/front_end/testcases/rasta/unresolved_for_in.dart.strong.modular.expect
index 37a65b8..18ab063 100644
--- a/pkg/front_end/testcases/rasta/unresolved_for_in.dart.strong.modular.expect
+++ b/pkg/front_end/testcases/rasta/unresolved_for_in.dart.strong.modular.expect
@@ -98,11 +98,7 @@
  - 'Fisk' is from 'pkg/front_end/testcases/rasta/unresolved_for_in.dart'.
 Try correcting the name to the name of an existing setter, or defining a setter or field named 'key'.
     for (key in x) {
-         ^^^" in this.{<unresolved>}key = invalid-expression "pkg/front_end/testcases/rasta/unresolved_for_in.dart:11:10: Error: The setter 'key' isn't defined for the type 'Fisk'.
- - 'Fisk' is from 'pkg/front_end/testcases/rasta/unresolved_for_in.dart'.
-Try correcting the name to the name of an existing setter, or defining a setter or field named 'key'.
-    for (key in x) {
-         ^^^";
+         ^^^" in this.{<unresolved>}key = #t1;
       core::print(invalid-expression "pkg/front_end/testcases/rasta/unresolved_for_in.dart:12:13: Error: The getter 'key' isn't defined for the type 'Fisk'.
  - 'Fisk' is from 'pkg/front_end/testcases/rasta/unresolved_for_in.dart'.
 Try correcting the name to the name of an existing getter, or defining a getter or field named 'key'.
@@ -134,9 +130,6 @@
     for (1 in x) {
          ^";
       for (final dynamic #t5 in x as{TypeError,ForDynamic} core::Iterable<dynamic>) {
-        invalid-expression "pkg/front_end/testcases/rasta/unresolved_for_in.dart:23:10: Error: Can't assign to this, so it can't be used in a for-in loop.
-    for (1 in x) {
-         ^";
         1;
         core::print(invalid-expression "pkg/front_end/testcases/rasta/unresolved_for_in.dart:24:13: Error: The getter 'key' isn't defined for the type 'Fisk'.
  - 'Fisk' is from 'pkg/front_end/testcases/rasta/unresolved_for_in.dart'.
@@ -182,9 +175,6 @@
   for (1 in arguments) {
        ^";
     for (final dynamic #t10 in arguments as{TypeError,ForDynamic} core::Iterable<dynamic>) {
-      invalid-expression "pkg/front_end/testcases/rasta/unresolved_for_in.dart:43:8: Error: Can't assign to this, so it can't be used in a for-in loop.
-  for (1 in arguments) {
-       ^";
       1;
       core::print(invalid-expression "pkg/front_end/testcases/rasta/unresolved_for_in.dart:44:11: Error: Undefined name 'key'.
     print(key);
diff --git a/pkg/front_end/testcases/rasta/unresolved_for_in.dart.strong.transformed.expect b/pkg/front_end/testcases/rasta/unresolved_for_in.dart.strong.transformed.expect
index 2ebd260..6bf0539 100644
--- a/pkg/front_end/testcases/rasta/unresolved_for_in.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/rasta/unresolved_for_in.dart.strong.transformed.expect
@@ -102,11 +102,7 @@
  - 'Fisk' is from 'pkg/front_end/testcases/rasta/unresolved_for_in.dart'.
 Try correcting the name to the name of an existing setter, or defining a setter or field named 'key'.
     for (key in x) {
-         ^^^" in this.{<unresolved>}key = invalid-expression "pkg/front_end/testcases/rasta/unresolved_for_in.dart:11:10: Error: The setter 'key' isn't defined for the type 'Fisk'.
- - 'Fisk' is from 'pkg/front_end/testcases/rasta/unresolved_for_in.dart'.
-Try correcting the name to the name of an existing setter, or defining a setter or field named 'key'.
-    for (key in x) {
-         ^^^";
+         ^^^" in this.{<unresolved>}key = #t1;
           core::print(invalid-expression "pkg/front_end/testcases/rasta/unresolved_for_in.dart:12:13: Error: The getter 'key' isn't defined for the type 'Fisk'.
  - 'Fisk' is from 'pkg/front_end/testcases/rasta/unresolved_for_in.dart'.
 Try correcting the name to the name of an existing getter, or defining a getter or field named 'key'.
@@ -162,9 +158,6 @@
         for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
           final dynamic #t5 = :sync-for-iterator.{core::Iterator::current}{dynamic};
           {
-            invalid-expression "pkg/front_end/testcases/rasta/unresolved_for_in.dart:23:10: Error: Can't assign to this, so it can't be used in a for-in loop.
-    for (1 in x) {
-         ^";
             1;
             core::print(invalid-expression "pkg/front_end/testcases/rasta/unresolved_for_in.dart:24:13: Error: The getter 'key' isn't defined for the type 'Fisk'.
  - 'Fisk' is from 'pkg/front_end/testcases/rasta/unresolved_for_in.dart'.
@@ -240,9 +233,6 @@
       for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
         final dynamic #t10 = :sync-for-iterator.{core::Iterator::current}{dynamic};
         {
-          invalid-expression "pkg/front_end/testcases/rasta/unresolved_for_in.dart:43:8: Error: Can't assign to this, so it can't be used in a for-in loop.
-  for (1 in arguments) {
-       ^";
           1;
           core::print(invalid-expression "pkg/front_end/testcases/rasta/unresolved_for_in.dart:44:11: Error: Undefined name 'key'.
     print(key);
diff --git a/pkg/front_end/testcases/regress/use_pattern_in_for_loop_when_language_version_is_too_low.dart.strong.expect b/pkg/front_end/testcases/regress/use_pattern_in_for_loop_when_language_version_is_too_low.dart.strong.expect
index 8365ab2..a818fab 100644
--- a/pkg/front_end/testcases/regress/use_pattern_in_for_loop_when_language_version_is_too_low.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/use_pattern_in_for_loop_when_language_version_is_too_low.dart.strong.expect
@@ -45,19 +45,17 @@
 
 static method foo() → void {
   core::List<dynamic> repoPaths = <dynamic>[let final core::String #t1 = "a" in invalid-expression "This requires the experimental 'records' language feature to be enabled."];
-  {
+  for (final dynamic #t2 in invalid-expression "pkg/front_end/testcases/regress/use_pattern_in_for_loop_when_language_version_is_too_low.dart:9:14: Error: Undefined name 'user'.
+  for (var (:user, :repo) in repoPaths)  {
+             ^^^^") {
     invalid-expression "pkg/front_end/testcases/regress/use_pattern_in_for_loop_when_language_version_is_too_low.dart:9:13: Error: This couldn't be parsed.
   for (var (:user, :repo) in repoPaths)  {
             ^";
-    for (final dynamic #t2 in invalid-expression "pkg/front_end/testcases/regress/use_pattern_in_for_loop_when_language_version_is_too_low.dart:9:14: Error: Undefined name 'user'.
-  for (var (:user, :repo) in repoPaths)  {
-             ^^^^") {
-      core::print(invalid-expression "pkg/front_end/testcases/regress/use_pattern_in_for_loop_when_language_version_is_too_low.dart:10:11: Error: Undefined name 'user'.
+    core::print(invalid-expression "pkg/front_end/testcases/regress/use_pattern_in_for_loop_when_language_version_is_too_low.dart:10:11: Error: Undefined name 'user'.
     print(user);
           ^^^^");
-      core::print(invalid-expression "pkg/front_end/testcases/regress/use_pattern_in_for_loop_when_language_version_is_too_low.dart:11:11: Error: Undefined name 'repo'.
+    core::print(invalid-expression "pkg/front_end/testcases/regress/use_pattern_in_for_loop_when_language_version_is_too_low.dart:11:11: Error: Undefined name 'repo'.
     print(repo);
           ^^^^");
-    }
   }
 }
diff --git a/pkg/front_end/testcases/regress/use_pattern_in_for_loop_when_language_version_is_too_low.dart.strong.modular.expect b/pkg/front_end/testcases/regress/use_pattern_in_for_loop_when_language_version_is_too_low.dart.strong.modular.expect
index 8365ab2..a818fab 100644
--- a/pkg/front_end/testcases/regress/use_pattern_in_for_loop_when_language_version_is_too_low.dart.strong.modular.expect
+++ b/pkg/front_end/testcases/regress/use_pattern_in_for_loop_when_language_version_is_too_low.dart.strong.modular.expect
@@ -45,19 +45,17 @@
 
 static method foo() → void {
   core::List<dynamic> repoPaths = <dynamic>[let final core::String #t1 = "a" in invalid-expression "This requires the experimental 'records' language feature to be enabled."];
-  {
+  for (final dynamic #t2 in invalid-expression "pkg/front_end/testcases/regress/use_pattern_in_for_loop_when_language_version_is_too_low.dart:9:14: Error: Undefined name 'user'.
+  for (var (:user, :repo) in repoPaths)  {
+             ^^^^") {
     invalid-expression "pkg/front_end/testcases/regress/use_pattern_in_for_loop_when_language_version_is_too_low.dart:9:13: Error: This couldn't be parsed.
   for (var (:user, :repo) in repoPaths)  {
             ^";
-    for (final dynamic #t2 in invalid-expression "pkg/front_end/testcases/regress/use_pattern_in_for_loop_when_language_version_is_too_low.dart:9:14: Error: Undefined name 'user'.
-  for (var (:user, :repo) in repoPaths)  {
-             ^^^^") {
-      core::print(invalid-expression "pkg/front_end/testcases/regress/use_pattern_in_for_loop_when_language_version_is_too_low.dart:10:11: Error: Undefined name 'user'.
+    core::print(invalid-expression "pkg/front_end/testcases/regress/use_pattern_in_for_loop_when_language_version_is_too_low.dart:10:11: Error: Undefined name 'user'.
     print(user);
           ^^^^");
-      core::print(invalid-expression "pkg/front_end/testcases/regress/use_pattern_in_for_loop_when_language_version_is_too_low.dart:11:11: Error: Undefined name 'repo'.
+    core::print(invalid-expression "pkg/front_end/testcases/regress/use_pattern_in_for_loop_when_language_version_is_too_low.dart:11:11: Error: Undefined name 'repo'.
     print(repo);
           ^^^^");
-    }
   }
 }
diff --git a/pkg/front_end/testcases/regress/use_pattern_in_for_loop_when_language_version_is_too_low.dart.strong.transformed.expect b/pkg/front_end/testcases/regress/use_pattern_in_for_loop_when_language_version_is_too_low.dart.strong.transformed.expect
index e78cad9..d1b5282 100644
--- a/pkg/front_end/testcases/regress/use_pattern_in_for_loop_when_language_version_is_too_low.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/regress/use_pattern_in_for_loop_when_language_version_is_too_low.dart.strong.transformed.expect
@@ -46,23 +46,21 @@
 static method foo() → void {
   core::List<dynamic> repoPaths = core::_GrowableList::_literal1<dynamic>(let final core::String #t1 = "a" in invalid-expression "This requires the experimental 'records' language feature to be enabled.");
   {
-    invalid-expression "pkg/front_end/testcases/regress/use_pattern_in_for_loop_when_language_version_is_too_low.dart:9:13: Error: This couldn't be parsed.
-  for (var (:user, :repo) in repoPaths)  {
-            ^";
-    {
-      synthesized core::Iterator<Never> :sync-for-iterator = invalid-expression "pkg/front_end/testcases/regress/use_pattern_in_for_loop_when_language_version_is_too_low.dart:9:14: Error: Undefined name 'user'.
+    synthesized core::Iterator<Never> :sync-for-iterator = invalid-expression "pkg/front_end/testcases/regress/use_pattern_in_for_loop_when_language_version_is_too_low.dart:9:14: Error: Undefined name 'user'.
   for (var (:user, :repo) in repoPaths)  {
              ^^^^".{core::Iterable::iterator}{core::Iterator<Never>};
-      for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
-        final dynamic #t2 = :sync-for-iterator.{core::Iterator::current}{Never};
-        {
-          core::print(invalid-expression "pkg/front_end/testcases/regress/use_pattern_in_for_loop_when_language_version_is_too_low.dart:10:11: Error: Undefined name 'user'.
+    for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
+      final dynamic #t2 = :sync-for-iterator.{core::Iterator::current}{Never};
+      {
+        invalid-expression "pkg/front_end/testcases/regress/use_pattern_in_for_loop_when_language_version_is_too_low.dart:9:13: Error: This couldn't be parsed.
+  for (var (:user, :repo) in repoPaths)  {
+            ^";
+        core::print(invalid-expression "pkg/front_end/testcases/regress/use_pattern_in_for_loop_when_language_version_is_too_low.dart:10:11: Error: Undefined name 'user'.
     print(user);
           ^^^^");
-          core::print(invalid-expression "pkg/front_end/testcases/regress/use_pattern_in_for_loop_when_language_version_is_too_low.dart:11:11: Error: Undefined name 'repo'.
+        core::print(invalid-expression "pkg/front_end/testcases/regress/use_pattern_in_for_loop_when_language_version_is_too_low.dart:11:11: Error: Undefined name 'repo'.
     print(repo);
           ^^^^");
-        }
       }
     }
   }
diff --git a/pkg/front_end/tool/ast_model.dart b/pkg/front_end/tool/ast_model.dart
index 88b1333..a3d0a0e 100644
--- a/pkg/front_end/tool/ast_model.dart
+++ b/pkg/front_end/tool/ast_model.dart
@@ -31,7 +31,8 @@
 /// nominality. For instance the name of a variable declaration is taking as
 /// defining its identity.
 const Map<String, String?> _declarativeClassesNames = const {
-  'LegacyVariableDeclaration': 'name',
+  // TODO(johnniwinther): This should be [VariableDeclaration].
+  'VariableStatement': 'name',
   'TypeParameter': 'name',
   'StructuralParameter': 'name',
   'LabeledStatement': null,
@@ -763,8 +764,7 @@
               "and a rule must therefore specify "
               "whether this constitutes declarative or referential use.",
             );
-          }
-          if (!rule.isDeclaration!) {
+          } else if (!rule.isDeclaration!) {
             return new FieldType(type, AstFieldKind.use);
           }
         }
diff --git a/pkg/kernel/lib/src/ast/expressions.dart b/pkg/kernel/lib/src/ast/expressions.dart
index a78149f..c452998 100644
--- a/pkg/kernel/lib/src/ast/expressions.dart
+++ b/pkg/kernel/lib/src/ast/expressions.dart
@@ -1550,7 +1550,7 @@
       positional = <Expression>[],
       named = <NamedExpression>[];
 
-  factory Arguments.forwarded(FunctionNode function, Library library) {
+  factory Arguments.forwarded(FunctionNode function) {
     return new Arguments(
       function.positionalParameters
           .map<Expression>((p) => new VariableGet(p))
diff --git a/pkg/kernel/lib/src/ast/patterns.dart b/pkg/kernel/lib/src/ast/patterns.dart
index 00d0705..0a196d4 100644
--- a/pkg/kernel/lib/src/ast/patterns.dart
+++ b/pkg/kernel/lib/src/ast/patterns.dart
@@ -364,7 +364,6 @@
 class ListPattern extends Pattern {
   static const int FlagNeedsCheck = 1 << 0;
   static const int FlagHasRestPattern = 1 << 1;
-  static const int FlagIsNeverPattern = 1 << 2;
 
   int flags = 0;
 
@@ -403,17 +402,6 @@
   /// This is set during inference.
   DartType? lookupType;
 
-  /// If `true`, this list pattern is performed on an expression of type
-  /// `Never`.
-  ///
-  /// This is set during inference.
-  bool get isNeverPattern => flags & FlagIsNeverPattern != 0;
-  void set isNeverPattern(bool value) {
-    flags = value
-        ? (flags | FlagIsNeverPattern)
-        : (flags & ~FlagIsNeverPattern);
-  }
-
   /// If `true`, this list pattern contains a rest pattern.
   ///
   /// This is set during inference.
@@ -966,7 +954,6 @@
 
 class MapPattern extends Pattern {
   static const int FlagNeedsCheck = 1 << 0;
-  static const int FlagIsNeverPattern = 1 << 1;
 
   int flags = 0;
 
@@ -1008,16 +995,6 @@
   /// This is set during inference.
   DartType? lookupType;
 
-  /// If `true`, this map pattern is performed on an expression of type `Never`.
-  ///
-  /// This is set during inference.
-  bool get isNeverPattern => flags & FlagIsNeverPattern != 0;
-  void set isNeverPattern(bool value) {
-    flags = value
-        ? (flags | FlagIsNeverPattern)
-        : (flags & ~FlagIsNeverPattern);
-  }
-
   /// Reference to the target of the `containsKey` method of the map.
   ///
   /// This is set during inference.
diff --git a/pkg/kernel/lib/src/ast/statements.dart b/pkg/kernel/lib/src/ast/statements.dart
index 74536fc..8c62e39 100644
--- a/pkg/kernel/lib/src/ast/statements.dart
+++ b/pkg/kernel/lib/src/ast/statements.dart
@@ -589,7 +589,7 @@
 
   @override
   void transformOrRemoveChildren(RemovingTransformer v) {
-    v.transformVariableInitializationList(variables, this);
+    v.transformVariableDeclarationList(variables, this);
     if (condition != null) {
       condition = v.transformOrRemoveExpression(condition!);
       condition?.parent = this;
@@ -1326,6 +1326,7 @@
       printer.writeVariableInitialization(
         exception!,
         includeModifiersAndType: false,
+        includeInitializer: false,
       );
       if (stackTrace != null) {
         printer.write(', ');
@@ -1458,188 +1459,6 @@
   }
 }
 
-abstract interface class LegacyVariableDeclaration
-    implements
-        Annotatable,
-        Statement,
-        VariableDeclaration,
-        VariableInitializationBase {
-  /// The name of the variable as provided in the source code.
-  ///
-  /// The name of a variable can only be omitted if the variable is synthesized.
-  /// Otherwise, its name is as provided in the source code.
-  @override
-  abstract String? name;
-
-  /// The declared or inferred type of the variable.
-  @override
-  abstract DartType type;
-
-  /// For locals, this is the initial value.
-  /// For parameters, this is the default value.
-  ///
-  /// Should be null in other cases.
-  @override
-  abstract Expression? initializer;
-
-  @override
-  abstract int flags;
-
-  /// Whether the parameter is declared with the `covariant` keyword.
-  @override
-  abstract bool isCovariantByDeclaration;
-
-  /// If this [LegacyVariableDeclaration] is a parameter of a method, indicates
-  /// whether the method implementation needs to contain a runtime type check to
-  /// deal with generic covariance.
-  ///
-  /// When `true`, runtime checks may need to be performed.
-  @override
-  abstract bool isCovariantByClass;
-
-  /// Whether the variable is declared with the `const` keyword.
-  @override
-  abstract bool isConst;
-
-  /// Whether the variable is declared with the `late` keyword.
-  ///
-  /// The `late` modifier is only supported on local variables and not on
-  /// parameters.
-  @override
-  abstract bool isLate;
-
-  /// Whether the variable is declared with the `final` keyword.
-  @override
-  abstract bool isFinal;
-
-  /// Whether the parameter is declared with the `required` keyword.
-  ///
-  /// The `required` modifier is only supported on named parameters and not on
-  /// positional parameters and local variables.
-  @override
-  abstract bool isRequired;
-
-  /// Whether the variable is part of a lowering.
-  ///
-  /// If a variable is part of a lowering its name may be synthesized so that it
-  /// doesn't reflect the name used in the source code and might not have a
-  /// one-to-one correspondence with the variable in the source.
-  ///
-  /// Lowering is used for instance of encoding of 'this' in extension instance
-  /// members and encoding of late locals.
-  @override
-  abstract bool isLowered;
-
-  /// Whether the declaration of this variable is has been moved to an earlier
-  /// source location.
-  ///
-  /// This is for instance the case for variables declared in a pattern, where
-  /// the lowering requires the variable to be declared before the expression
-  /// that performs that matching in which its initialization occurs.
-  @override
-  abstract bool isHoisted;
-
-  /// Whether this variable is synthesized, that is, it is _not_ declared in
-  /// the source code.
-  ///
-  /// The name of a variable can only be omitted if the variable is synthesized.
-  /// Otherwise, its name is as provided in the source code.
-  @override
-  abstract bool isSynthesized;
-
-  /// Whether the variable is assignable.
-  ///
-  /// This is `true` if the variable is neither constant nor final, or if it
-  /// is late final without an initializer.
-  @override
-  bool get isAssignable;
-
-  /// Whether the variable is declared as an initializing formal parameter of
-  /// a constructor.
-  @informative
-  @override
-  abstract bool isInitializingFormal;
-
-  /// Whether the variable is declared as a super initializing formal parameter
-  /// of a constructor.
-  @informative
-  @override
-  abstract bool isSuperInitializingFormal;
-
-  @informative
-  @override
-  abstract bool isErroneouslyInitialized;
-
-  /// Whether the variable has an initializer, either by declaration or copied
-  /// from an original declaration.
-  ///
-  /// Note that the variable might have a synthesized initializer expression,
-  /// so `hasDeclaredInitializer == false` doesn't imply `initializer == null`.
-  /// For instance, for duplicate variable names, an invalid expression is set
-  /// as the initializer of the second variable.
-  @override
-  abstract bool hasDeclaredInitializer;
-
-  /// Whether this variable is a wildcard variable.
-  ///
-  /// Wildcard variables have the name `_`.
-  @override
-  abstract bool isWildcard;
-
-  /// Offset of the equals sign in the source file it comes from.
-  ///
-  /// Valid values are from 0 and up, or -1 ([TreeNode.noOffset])
-  /// if the equals sign offset is not available (e.g. if not initialized)
-  /// (this is the default if none is specifically set).
-  @override
-  abstract int fileEqualsOffset;
-
-  /// Offset of the declaration, set and used when writing the binary.
-  @override
-  abstract int binaryOffsetNoTag;
-
-  /// List of metadata annotations on the variable declaration.
-  ///
-  /// This defaults to an immutable empty list. Use [addAnnotation] to add
-  /// annotations if needed.
-  @override
-  abstract List<Expression> annotations;
-
-  @override
-  void clearAnnotations();
-
-  factory LegacyVariableDeclaration(
-    String? name, {
-    Expression? initializer,
-    DartType type,
-    int flags,
-    bool isFinal,
-    bool isConst,
-    bool isInitializingFormal,
-    bool isSuperInitializingFormal,
-    bool isCovariantByDeclaration,
-    bool isLate,
-    bool isRequired,
-    bool isLowered,
-    bool isSynthesized,
-    bool isHoisted,
-    bool hasDeclaredInitializer,
-    bool isWildcard,
-  }) = VariableStatement;
-
-  factory LegacyVariableDeclaration.forValue(
-    Expression? initializer, {
-    bool isFinal,
-    bool isConst,
-    bool isInitializingFormal,
-    bool isSuperInitializingFormal,
-    bool isLate,
-    bool isRequired,
-    bool isLowered,
-    DartType type,
-  }) = VariableStatement.forValue;
-}
-
 /// Declaration of a local variable.
 ///
 /// This may occur as a statement, but is also used in several non-statement
@@ -1648,13 +1467,23 @@
 /// When this occurs as a statement, it must be a direct child of a [Block].
 //
 // DESIGN TODO: Should we remove the 'final' modifier from variables?
-class VariableStatement extends Statement implements LegacyVariableDeclaration {
+class VariableStatement extends Statement
+    implements Annotatable, VariableDeclaration {
+  /// Offset of the equals sign in the source file it comes from.
+  ///
+  /// Valid values are from 0 and up, or -1 ([TreeNode.noOffset])
+  /// if the equals sign offset is not available (e.g. if not initialized)
+  /// (this is the default if none is specifically set).
   @override
   int fileEqualsOffset = TreeNode.noOffset;
 
   @override
   List<int>? get fileOffsetsIfMultiple => [fileOffset, fileEqualsOffset];
 
+  /// List of metadata annotations on the variable declaration.
+  ///
+  /// This defaults to an immutable empty list. Use [addAnnotation] to add
+  /// annotations if needed.
   @override
   List<Expression> annotations = const <Expression>[];
 
@@ -1667,12 +1496,18 @@
   @override
   int flags = 0;
 
+  /// The declared or inferred type of the variable.
   @override
   DartType type; // Not null, defaults to dynamic.
 
+  /// Offset of the declaration, set and used when writing the binary.
   @override
   int binaryOffsetNoTag = -1;
 
+  /// For locals, this is the initial value.
+  /// For parameters, this is the default value.
+  ///
+  /// Should be null in other cases.
   @override
   Expression? initializer; // May be null.
 
@@ -1741,6 +1576,10 @@
     this.isSynthesized = true;
   }
 
+  /// The name of the variable as provided in the source code.
+  ///
+  /// The name of a variable can only be omitted if the variable is synthesized.
+  /// Otherwise, its name is as provided in the source code.
   @override
   String? get name => _name;
 
@@ -1754,13 +1593,13 @@
   }
 
   @override
-  // TODO(62620): Conforming to [VariableInitialization] interface. Remove this.
+  // TODO(62620): Conforming to [VariableDeclaration] interface. Remove this.
   List<VariableContext>? get capturedContexts {
     throw new UnsupportedError("${this.runtimeType}.capturedContexts");
   }
 
   @override
-  // TODO(62620): Conforming to [VariableInitialization] interface. Remove this.
+  // TODO(62620): Conforming to [VariableDeclaration] interface. Remove this.
   void set capturedContexts(List<VariableContext>? value) {
     throw new UnsupportedError("${this.runtimeType}.capturedContexts=");
   }
@@ -1780,48 +1619,102 @@
   static const int FlagSuperInitializingFormal = 1 << 12;
   static const int FlagErroneouslyInitialized = 1 << 13;
 
+  /// Whether the variable is declared with the `final` keyword.
   @override
   bool get isFinal => flags & FlagFinal != 0;
+
+  /// Whether the variable is declared with the `const` keyword.
   @override
   bool get isConst => flags & FlagConst != 0;
 
+  /// Whether the parameter is declared with the `covariant` keyword.
   @override
   bool get isCovariantByDeclaration => flags & FlagCovariantByDeclaration != 0;
 
+  /// Whether the variable is declared as an initializing formal parameter of
+  /// a constructor.
+  @informative
   @override
   bool get isInitializingFormal => flags & FlagInitializingFormal != 0;
 
+  /// Whether the variable is declared as a super initializing formal parameter
+  /// of a constructor.
+  @informative
   @override
   bool get isSuperInitializingFormal =>
       flags & FlagSuperInitializingFormal != 0;
 
+  @informative
   @override
   bool get isErroneouslyInitialized => flags & FlagErroneouslyInitialized != 0;
 
+  /// If this [LegacyVariableDeclaration] is a parameter of a method, indicates
+  /// whether the method implementation needs to contain a runtime type check to
+  /// deal with generic covariance.
+  ///
+  /// When `true`, runtime checks may need to be performed.
   @override
   bool get isCovariantByClass => flags & FlagCovariantByClass != 0;
 
+  /// Whether the variable is declared with the `late` keyword.
+  ///
+  /// The `late` modifier is only supported on local variables and not on
+  /// parameters.
   @override
   bool get isLate => flags & FlagLate != 0;
 
+  /// Whether the parameter is declared with the `required` keyword.
+  ///
+  /// The `required` modifier is only supported on named parameters and not on
+  /// positional parameters and local variables.
   @override
   bool get isRequired => flags & FlagRequired != 0;
 
+  /// Whether the variable is part of a lowering.
+  ///
+  /// If a variable is part of a lowering its name may be synthesized so that it
+  /// doesn't reflect the name used in the source code and might not have a
+  /// one-to-one correspondence with the variable in the source.
+  ///
+  /// Lowering is used for instance of encoding of 'this' in extension instance
+  /// members and encoding of late locals.
   @override
   bool get isLowered => flags & FlagLowered != 0;
 
+  /// Whether this variable is synthesized, that is, it is _not_ declared in
+  /// the source code.
+  ///
+  /// The name of a variable can only be omitted if the variable is synthesized.
+  /// Otherwise, its name is as provided in the source code.
   @override
   bool get isSynthesized => flags & FlagSynthesized != 0;
 
+  /// Whether the declaration of this variable is has been moved to an earlier
+  /// source location.
+  ///
+  /// This is for instance the case for variables declared in a pattern, where
+  /// the lowering requires the variable to be declared before the expression
+  /// that performs that matching in which its initialization occurs.
   @override
   bool get isHoisted => flags & FlagHoisted != 0;
 
+  /// Whether the variable has an initializer, either by declaration or copied
+  /// from an original declaration.
+  ///
+  /// Note that the variable might have a synthesized initializer expression,
+  /// so `hasDeclaredInitializer == false` doesn't imply `initializer == null`.
+  /// For instance, for duplicate variable names, an invalid expression is set
+  /// as the initializer of the second variable.
   @override
   bool get hasDeclaredInitializer => flags & FlagHasDeclaredInitializer != 0;
 
   @override
   bool get isWildcard => flags & FlagWildcard != 0;
 
+  /// Whether the variable is assignable.
+  ///
+  /// This is `true` if the variable is neither constant nor final, or if it
+  /// is late final without an initializer.
   @override
   bool get isAssignable {
     if (isConst) return false;
@@ -1996,29 +1889,34 @@
   }
 
   @override
-  VariableInitializationBase? get variableInitialization {
-    throw new UnsupportedError("${this.runtimeType}");
+  VariableDeclaration? get variableInitialization {
+    throw new UnsupportedError("${this.runtimeType}.variableInitialization");
   }
 
   @override
-  void set variableInitialization(VariableInitializationBase? value) {
-    throw new UnsupportedError("${this.runtimeType}");
+  void set variableInitialization(VariableDeclaration? value) {
+    throw new UnsupportedError("${this.runtimeType}.variableInitialization=");
   }
 
   @override
   VariableContext get context {
-    throw new UnsupportedError("${this.runtimeType}");
+    throw new UnsupportedError("${this.runtimeType}.context");
   }
 
   @override
-  VariableDeclaration get asExpressionVariable => this;
+  void set context(VariableContext value) {
+    throw new UnsupportedError("${this.runtimeType}.context=");
+  }
+
+  @override
+  VariableDeclaration get asVariableDeclaration => this;
 
   @override
   VariableDeclaration get variable => this;
 
   @override
   void set variable(VariableDeclaration value) {
-    throw new UnsupportedError("${this.runtimeType}");
+    throw new UnsupportedError("${this.runtimeType}.variable=");
   }
 
   @override
@@ -2127,47 +2025,6 @@
   }
 }
 
-/// The statement that marks the declaration of the variable in the source Dart
-/// program. If the [initializer] is `null`, the variable was declared without
-/// an initializer.
-abstract class VariableInitializationBase
-    implements Statement, Annotatable, ContextConsumer {
-  abstract VariableDeclaration variable;
-  abstract Expression? initializer;
-  abstract bool hasDeclaredInitializer;
-  abstract int flags;
-  abstract bool isErroneouslyInitialized;
-  abstract bool isConst;
-  abstract bool isCovariantByClass;
-  abstract bool isCovariantByDeclaration;
-  abstract bool isFinal;
-  abstract bool isHoisted;
-  abstract bool isInitializingFormal;
-  abstract bool isLate;
-  abstract bool isLowered;
-  abstract bool isRequired;
-  abstract bool isSuperInitializingFormal;
-  abstract bool isSynthesized;
-  abstract bool isWildcard;
-  abstract int binaryOffsetNoTag;
-  abstract int fileEqualsOffset;
-  abstract String? name;
-  abstract DartType type;
-  abstract String? cosmeticName;
-  abstract VariableInitializationBase? variableInitialization;
-
-  factory VariableInitializationBase({
-    required VariableDeclaration variable,
-    required Expression? initializer,
-    bool hasDeclaredInitializer,
-  }) = VariableInitialization;
-
-  void clearAnnotations();
-  bool get isAssignable;
-  VariableContext get context;
-  VariableDeclaration get asExpressionVariable;
-}
-
 class VariableInitialization extends Statement implements VariableDeclaration {
   @override
   VariableDeclaration variable;
@@ -2414,86 +2271,125 @@
   }
 
   @override
-  VariableInitializationBase? get variableInitialization => this;
+  VariableDeclaration? get variableInitialization => this;
 
   @override
-  void set variableInitialization(VariableInitializationBase? value) {
+  void set variableInitialization(VariableDeclaration? value) {
     throw new UnsupportedError("${this.runtimeType}");
   }
 
   @override
-  VariableContext get context => variable.context;
-
-  @override
-  VariableDeclaration get asExpressionVariable => variable;
+  VariableDeclaration get asVariableDeclaration => variable;
 
   @override
   // TODO(62620): Remove the method when the [VariableInitialization] stops
   // implementing [VariableDeclaration].
-  bool get hasHasDeclaredInitializer => throw UnimplementedError();
+  VariableContext get context {
+    throw UnsupportedError("${runtimeType}.context");
+  }
 
   @override
   // TODO(62620): Remove the method when the [VariableInitialization] stops
   // implementing [VariableDeclaration].
-  bool get hasIsConst => throw UnimplementedError();
+  void set context(VariableContext value) {
+    throw UnsupportedError("${runtimeType}.context=");
+  }
 
   @override
   // TODO(62620): Remove the method when the [VariableInitialization] stops
   // implementing [VariableDeclaration].
-  bool get hasIsCovariantByClass => throw UnimplementedError();
+  bool get hasHasDeclaredInitializer {
+    throw UnsupportedError("${runtimeType}.hasHasDeclaredInitializer");
+  }
 
   @override
   // TODO(62620): Remove the method when the [VariableInitialization] stops
   // implementing [VariableDeclaration].
-  bool get hasIsCovariantByDeclaration => throw UnimplementedError();
+  bool get hasIsConst {
+    throw new UnsupportedError("${runtimeType}.hasIsConst");
+  }
 
   @override
   // TODO(62620): Remove the method when the [VariableInitialization] stops
   // implementing [VariableDeclaration].
-  bool get hasIsErroneouslyInitialized => throw UnimplementedError();
+  bool get hasIsCovariantByClass {
+    throw new UnsupportedError("${runtimeType}.hasIsCovariantByClass");
+  }
 
   @override
   // TODO(62620): Remove the method when the [VariableInitialization] stops
   // implementing [VariableDeclaration].
-  bool get hasIsFinal => throw UnimplementedError();
+  bool get hasIsCovariantByDeclaration {
+    throw new UnsupportedError("${runtimeType}.hasIsCovariantByDeclaration");
+  }
 
   @override
   // TODO(62620): Remove the method when the [VariableInitialization] stops
   // implementing [VariableDeclaration].
-  bool get hasIsHoisted => throw UnimplementedError();
+  bool get hasIsErroneouslyInitialized {
+    throw new UnsupportedError("${runtimeType}.hasIsErroneouslyInitialized");
+  }
 
   @override
   // TODO(62620): Remove the method when the [VariableInitialization] stops
   // implementing [VariableDeclaration].
-  bool get hasIsInitializingFormal => throw UnimplementedError();
+  bool get hasIsFinal {
+    throw new UnsupportedError("${runtimeType}.hasIsFinal");
+  }
 
   @override
   // TODO(62620): Remove the method when the [VariableInitialization] stops
   // implementing [VariableDeclaration].
-  bool get hasIsLate => throw UnimplementedError();
+  bool get hasIsHoisted {
+    throw new UnsupportedError("${runtimeType}.hasIsHoisted");
+  }
 
   @override
   // TODO(62620): Remove the method when the [VariableInitialization] stops
   // implementing [VariableDeclaration].
-  bool get hasIsLowered => throw UnimplementedError();
+  bool get hasIsInitializingFormal {
+    throw new UnsupportedError("${runtimeType}.hasIsInitializingFormal");
+  }
 
   @override
   // TODO(62620): Remove the method when the [VariableInitialization] stops
   // implementing [VariableDeclaration].
-  bool get hasIsRequired => throw UnimplementedError();
+  bool get hasIsLate {
+    throw new UnsupportedError("${runtimeType}.hasIsLate");
+  }
 
   @override
   // TODO(62620): Remove the method when the [VariableInitialization] stops
   // implementing [VariableDeclaration].
-  bool get hasIsSuperInitializingFormal => throw UnimplementedError();
+  bool get hasIsLowered {
+    throw new UnsupportedError("${runtimeType}.hasIsLowered");
+  }
 
   @override
   // TODO(62620): Remove the method when the [VariableInitialization] stops
   // implementing [VariableDeclaration].
-  bool get hasIsSynthesized => throw UnimplementedError();
+  bool get hasIsRequired {
+    throw new UnsupportedError("${runtimeType}.hasIsRequired");
+  }
 
   @override
   // TODO(62620): Remove the method when the [VariableInitialization] stops
   // implementing [VariableDeclaration].
-  bool get hasIsWildcard => throw UnimplementedError();
+  bool get hasIsSuperInitializingFormal {
+    throw new UnsupportedError("${runtimeType}.hasIsSuperInitializingFormal");
+  }
+
+  @override
+  // TODO(62620): Remove the method when the [VariableInitialization] stops
+  // implementing [VariableDeclaration].
+  bool get hasIsSynthesized {
+    throw new UnsupportedError("${runtimeType}.hasIsSynthesized");
+  }
+
+  @override
+  // TODO(62620): Remove the method when the [VariableInitialization] stops
+  // implementing [VariableDeclaration].
+  bool get hasIsWildcard {
+    throw new UnsupportedError("${runtimeType}.hasIsWildcard");
+  }
 }
diff --git a/pkg/kernel/lib/src/ast/types.dart b/pkg/kernel/lib/src/ast/types.dart
index d1fa7be..d956e20 100644
--- a/pkg/kernel/lib/src/ast/types.dart
+++ b/pkg/kernel/lib/src/ast/types.dart
@@ -2446,6 +2446,9 @@
   @override
   String? cosmeticName;
 
+  @override
+  late VariableContext context;
+
   /// Function type parameter this [TypeVariable] is associated with.
   final TypeParameter parameter;
 
diff --git a/pkg/kernel/lib/src/ast/variables.dart b/pkg/kernel/lib/src/ast/variables.dart
index d39a24a..b2368c3 100644
--- a/pkg/kernel/lib/src/ast/variables.dart
+++ b/pkg/kernel/lib/src/ast/variables.dart
@@ -6,7 +6,7 @@
 
 /// Generalized notion of a variable.
 sealed class VariableBase extends TreeNode implements Annotatable {
-  VariableContext get context => parent as VariableContext;
+  abstract VariableContext context;
 
   /// The cosmetic name of the variable from the source code, if exists.
   String? get cosmeticName;
@@ -28,8 +28,9 @@
 abstract interface class IVariable implements TreeNode {
   abstract DartType type;
   abstract String? cosmeticName;
-  abstract VariableInitializationBase? variableInitialization;
+  abstract VariableDeclaration? variableInitialization;
   abstract Expression? initializer;
+  abstract VariableContext context;
   abstract bool isFinal;
   abstract bool isConst;
   abstract bool isLate;
@@ -68,19 +69,19 @@
   bool get hasIsWildcard;
   bool get hasIsSuperInitializingFormal;
   bool get hasIsErroneouslyInitialized;
-  VariableDeclaration get asExpressionVariable;
+  VariableDeclaration get asVariableDeclaration;
 }
 
 /// The root of the sealed hierarchy of non-type variables.
 sealed class VariableDeclaration extends VariableBase
-    implements IVariable, Statement, VariableInitializationBase {
+    implements IVariable, Statement, ContextConsumer {
   /// Static type of the variable.
   @override
   abstract DartType type;
 
   /// Initialization node for the variable, if available.
   @override
-  abstract VariableInitializationBase? variableInitialization;
+  abstract VariableDeclaration? variableInitialization;
 
   /// Derived from [variableInitialization], if available.
   @override
@@ -184,10 +185,9 @@
   bool get isAssignable;
 
   @override
-  VariableDeclaration get asExpressionVariable => this;
+  VariableDeclaration get asVariableDeclaration => this;
 
-  @override
-  String? get name;
+  abstract String? name;
 }
 
 /// Local variables. They aren't Statements. A [LocalVariable] is "declared" in
@@ -202,11 +202,14 @@
   DartType type;
 
   @override
-  VariableInitializationBase? variableInitialization;
+  VariableDeclaration? variableInitialization;
 
   @override
   List<Expression> annotations = const <Expression>[];
 
+  @override
+  late VariableContext context;
+
   LocalVariable({
     this.cosmeticName,
     required DartType? type,
@@ -513,6 +516,9 @@
   @override
   List<Expression> annotations = const <Expression>[];
 
+  @override
+  late VariableContext context;
+
   CatchVariable({
     required String name,
     required DartType? type,
@@ -532,12 +538,12 @@
   }
 
   @override
-  VariableInitializationBase? get variableInitialization {
+  VariableDeclaration? get variableInitialization {
     throw new UnsupportedError("${this.runtimeType}.variableInitialization");
   }
 
   @override
-  void set variableInitialization(VariableInitializationBase? value) {
+  void set variableInitialization(VariableDeclaration? value) {
     throw new UnsupportedError("${this.runtimeType}.variableInitialization=");
   }
 
@@ -836,10 +842,10 @@
 
   /// Function parameters don't have initializers, only default values.
   @override
-  VariableInitializationBase? get variableInitialization => null;
+  VariableDeclaration? get variableInitialization => null;
 
   @override
-  void set variableInitialization(VariableInitializationBase? value) {}
+  void set variableInitialization(VariableDeclaration? value) {}
 
   @override
   Expression? get initializer => defaultValue;
@@ -1013,6 +1019,9 @@
   @override
   List<Expression> annotations = const <Expression>[];
 
+  @override
+  late VariableContext context;
+
   PositionalParameter({
     this.cosmeticName,
     required this.type,
@@ -1029,13 +1038,13 @@
   });
 
   @override
-  // TODO(62620): Conforming to [VariableInitialization] interface. Remove this.
+  // TODO(62620): Conforming to [VariableDeclaration] interface. Remove this.
   List<VariableContext>? get capturedContexts {
     throw new UnsupportedError("${this.runtimeType}.capturedContexts");
   }
 
   @override
-  // TODO(62620): Conforming to [VariableInitialization] interface. Remove this.
+  // TODO(62620): Conforming to [VariableDeclaration] interface. Remove this.
   void set capturedContexts(List<VariableContext>? value) {
     throw new UnsupportedError("${this.runtimeType}.capturedContexts=");
   }
@@ -1157,6 +1166,9 @@
   @override
   List<Expression> annotations = const <Expression>[];
 
+  @override
+  late VariableContext context;
+
   NamedParameter({
     required this.parameterName,
     required this.type,
@@ -1173,13 +1185,13 @@
   });
 
   @override
-  // TODO(62620): Conforming to [VariableInitialization] interface. Remove this.
+  // TODO(62620): Conforming to [VariableDeclaration] interface. Remove this.
   List<VariableContext>? get capturedContexts {
     throw new UnsupportedError("${this.runtimeType}.capturedContexts");
   }
 
   @override
-  // TODO(62620): Conforming to [VariableInitialization] interface. Remove this.
+  // TODO(62620): Conforming to [VariableDeclaration] interface. Remove this.
   void set capturedContexts(List<VariableContext>? value) {
     throw new UnsupportedError("${this.runtimeType}.capturedContexts=");
   }
@@ -1292,10 +1304,10 @@
   void set cosmeticName(String? value) {}
 
   @override
-  VariableInitializationBase? get variableInitialization => null;
+  VariableDeclaration? get variableInitialization => null;
 
   @override
-  void set variableInitialization(VariableInitializationBase? value) {}
+  void set variableInitialization(VariableDeclaration? value) {}
 
   @override
   DartType type;
@@ -1304,6 +1316,9 @@
   @override
   List<Expression> annotations = const <Expression>[];
 
+  @override
+  late VariableContext context;
+
   ThisVariable({required this.type}) : super.empty();
 
   // TODO(cstefantsova): Consider a throwing implementation instead.
@@ -1573,12 +1588,15 @@
   DartType type;
 
   @override
-  VariableInitializationBase? variableInitialization;
+  VariableDeclaration? variableInitialization;
 
   // TODO(cstefantsova): Consider a throwing implementation instead.
   @override
   List<Expression> annotations = const <Expression>[];
 
+  @override
+  late VariableContext context;
+
   SyntheticVariable({this.cosmeticName, required this.type}) : super.empty();
 
   // TODO(cstefantsova): Consider a throwing implementation instead.
@@ -1848,50 +1866,24 @@
 /// The box storing some of the variables in the scope it's associated with. It
 /// serves as the "declaration" of the variables it contains for the runtime
 /// environments.
-class VariableContext extends TreeNode {
+class VariableContext {
   final CaptureKind captureKind;
   final List<VariableBase> variables;
 
   VariableContext({required this.captureKind, required this.variables});
 
   void addVariable(VariableBase variable) {
-    variable.parent = this;
+    variable.context = this;
     variables.add(variable);
   }
 
   @override
-  R accept<R>(TreeVisitor<R> v) {
-    // TODO(cstefantsova): Implement accept.
-    throw new UnimplementedError();
-  }
-
-  @override
-  R accept1<R, A>(TreeVisitor1<R, A> v, A arg) {
-    // TODO(cstefantsova): Implement accept1.
-    throw new UnimplementedError();
-  }
-
-  @override
-  void transformChildren(Transformer v) {
-    // TODO(cstefantsova): Implement transformChildren.
-  }
-
-  @override
-  void transformOrRemoveChildren(RemovingTransformer v) {
-    // TODO(cstefantsova): Implement transformOrRemoveChildren.
-  }
-
-  @override
-  void visitChildren(Visitor v) {
-    // TODO(cstefantsova): Implement visitChildren.
-  }
-
-  @override
   String toString() {
-    return "VariableContext(${toStringInternal()})";
+    AstPrinter printer = new AstPrinter(defaultAstTextStrategy);
+    toTextInternal(printer);
+    return "VariableContext(${printer.getText()})";
   }
 
-  @override
   void toTextInternal(AstPrinter printer) {
     printer.write('[');
     for (int index = 0; index < variables.length; index++) {
@@ -1909,49 +1901,22 @@
 /// variables they contain. They aren't [Statement]s, but a runtime may choose
 /// to interpret the [Scope] in an executable way before any [Statement]s or
 /// [Expression]s of its node.
-class Scope extends TreeNode {
+class Scope {
   final List<VariableContext> contexts;
 
   Scope({required this.contexts});
 
   void addContext(VariableContext context) {
-    context.parent = this;
     contexts.add(context);
   }
 
   @override
-  R accept<R>(TreeVisitor<R> v) {
-    // TODO(cstefantsova): Implement accept.
-    throw new UnimplementedError();
-  }
-
-  @override
-  R accept1<R, A>(TreeVisitor1<R, A> v, A arg) {
-    // TODO(cstefantsova): Implement accept1.
-    throw new UnimplementedError();
-  }
-
-  @override
-  void transformChildren(Transformer v) {
-    // TODO(cstefantsova): Implement transformChildren.
-  }
-
-  @override
-  void transformOrRemoveChildren(RemovingTransformer v) {
-    // TODO(cstefantsova): Implement transformOrRemoveChildren.
-  }
-
-  @override
-  void visitChildren(Visitor v) {
-    // TODO(cstefantsova): Implement visitChildren.
-  }
-
-  @override
   String toString() {
-    return "Scope(${toStringInternal()})";
+    AstPrinter printer = new AstPrinter(defaultAstTextStrategy);
+    toTextInternal(printer);
+    return "Scope(${printer.getText()})";
   }
 
-  @override
   void toTextInternal(AstPrinter printer) {
     printer.write('[');
     for (int index = 0; index < contexts.length; index++) {
diff --git a/pkg/kernel/lib/src/coverage.dart b/pkg/kernel/lib/src/coverage.dart
index 7078f93..32dfd84 100644
--- a/pkg/kernel/lib/src/coverage.dart
+++ b/pkg/kernel/lib/src/coverage.dart
@@ -1034,18 +1034,6 @@
   }
 
   @override
-  void visitVariableContext(VariableContext node) {
-    visited.add(NodeKind.VariableContext);
-    node.visitChildren(this);
-  }
-
-  @override
-  void visitScope(Scope node) {
-    visited.add(NodeKind.Scope);
-    node.visitChildren(this);
-  }
-
-  @override
   void visitName(Name node) {
     visited.add(NodeKind.Name);
     node.visitChildren(this);
@@ -1348,14 +1336,12 @@
   NominalParameter,
   PatternGuard,
   PatternSwitchCase,
-  Scope,
   StructuralParameter,
   Supertype,
   SwitchCase,
   SwitchExpressionCase,
   TypeVariable,
   Typedef,
-  VariableContext,
 }
 
 enum MemberKind { Constructor, Field, Procedure }
diff --git a/pkg/kernel/lib/src/equivalence.dart b/pkg/kernel/lib/src/equivalence.dart
index 7521736..2b5249c 100644
--- a/pkg/kernel/lib/src/equivalence.dart
+++ b/pkg/kernel/lib/src/equivalence.dart
@@ -901,16 +901,6 @@
   }
 
   @override
-  bool visitVariableContext(VariableContext node, Node other) {
-    return strategy.checkVariableContext(this, node, other);
-  }
-
-  @override
-  bool visitScope(Scope node, Node other) {
-    return strategy.checkScope(this, node, other);
-  }
-
-  @override
   bool visitName(Name node, Node other) {
     return strategy.checkName(this, node, other);
   }
@@ -1316,6 +1306,9 @@
     if (a is LabeledStatement) {
       return b is LabeledStatement;
     }
+    if (a is VariableStatement) {
+      return b is VariableStatement && a.name == b.name;
+    }
     if (a is StructuralParameter) {
       return b is StructuralParameter && a.name == b.name;
     }
@@ -2318,6 +2311,35 @@
     return result;
   }
 
+  bool checkVariableContext(
+    EquivalenceVisitor visitor,
+    VariableContext? node,
+    Object? other,
+  ) {
+    if (identical(node, other)) return true;
+    if (node is! VariableContext) return false;
+    if (other is! VariableContext) return false;
+    bool result = true;
+    if (!checkVariableContext_captureKind(visitor, node, other)) {
+      result = visitor.resultOnInequivalence;
+    }
+    if (!checkVariableContext_variables(visitor, node, other)) {
+      result = visitor.resultOnInequivalence;
+    }
+    return result;
+  }
+
+  bool checkScope(EquivalenceVisitor visitor, Scope? node, Object? other) {
+    if (identical(node, other)) return true;
+    if (node is! Scope) return false;
+    if (other is! Scope) return false;
+    bool result = true;
+    if (!checkScope_contexts(visitor, node, other)) {
+      result = visitor.resultOnInequivalence;
+    }
+    return result;
+  }
+
   bool checkField(EquivalenceVisitor visitor, Field? node, Object? other) {
     if (identical(node, other)) return true;
     if (node is! Field) return false;
@@ -5890,6 +5912,9 @@
     if (identical(node, other)) return true;
     if (node is! VariableStatement) return false;
     if (other is! VariableStatement) return false;
+    if (!visitor.checkDeclarations(node, other, '')) {
+      return false;
+    }
     visitor.pushNodeState(node, other);
     bool result = true;
     if (!checkVariableStatement_fileEqualsOffset(visitor, node, other)) {
@@ -6054,6 +6079,9 @@
     if (!checkLocalVariable_annotations(visitor, node, other)) {
       result = visitor.resultOnInequivalence;
     }
+    if (!checkLocalVariable_context(visitor, node, other)) {
+      result = visitor.resultOnInequivalence;
+    }
     if (!checkLocalVariable_binaryOffsetNoTag(visitor, node, other)) {
       result = visitor.resultOnInequivalence;
     }
@@ -6089,6 +6117,9 @@
     if (!checkCatchVariable_annotations(visitor, node, other)) {
       result = visitor.resultOnInequivalence;
     }
+    if (!checkCatchVariable_context(visitor, node, other)) {
+      result = visitor.resultOnInequivalence;
+    }
     if (!checkCatchVariable_binaryOffsetNoTag(visitor, node, other)) {
       result = visitor.resultOnInequivalence;
     }
@@ -6124,6 +6155,9 @@
     if (!checkPositionalParameter_annotations(visitor, node, other)) {
       result = visitor.resultOnInequivalence;
     }
+    if (!checkPositionalParameter_context(visitor, node, other)) {
+      result = visitor.resultOnInequivalence;
+    }
     if (!checkPositionalParameter_binaryOffsetNoTag(visitor, node, other)) {
       result = visitor.resultOnInequivalence;
     }
@@ -6162,6 +6196,9 @@
     if (!checkNamedParameter_annotations(visitor, node, other)) {
       result = visitor.resultOnInequivalence;
     }
+    if (!checkNamedParameter_context(visitor, node, other)) {
+      result = visitor.resultOnInequivalence;
+    }
     if (!checkNamedParameter_binaryOffsetNoTag(visitor, node, other)) {
       result = visitor.resultOnInequivalence;
     }
@@ -6197,6 +6234,9 @@
     if (!checkThisVariable_annotations(visitor, node, other)) {
       result = visitor.resultOnInequivalence;
     }
+    if (!checkThisVariable_context(visitor, node, other)) {
+      result = visitor.resultOnInequivalence;
+    }
     if (!checkThisVariable_binaryOffsetNoTag(visitor, node, other)) {
       result = visitor.resultOnInequivalence;
     }
@@ -6235,6 +6275,9 @@
     if (!checkSyntheticVariable_annotations(visitor, node, other)) {
       result = visitor.resultOnInequivalence;
     }
+    if (!checkSyntheticVariable_context(visitor, node, other)) {
+      result = visitor.resultOnInequivalence;
+    }
     if (!checkSyntheticVariable_binaryOffsetNoTag(visitor, node, other)) {
       result = visitor.resultOnInequivalence;
     }
@@ -6264,6 +6307,9 @@
     if (!checkTypeVariable_cosmeticName(visitor, node, other)) {
       result = visitor.resultOnInequivalence;
     }
+    if (!checkTypeVariable_context(visitor, node, other)) {
+      result = visitor.resultOnInequivalence;
+    }
     if (!checkTypeVariable_parameter(visitor, node, other)) {
       result = visitor.resultOnInequivalence;
     }
@@ -6315,45 +6361,6 @@
     return result;
   }
 
-  bool checkVariableContext(
-    EquivalenceVisitor visitor,
-    VariableContext? node,
-    Object? other,
-  ) {
-    if (identical(node, other)) return true;
-    if (node is! VariableContext) return false;
-    if (other is! VariableContext) return false;
-    visitor.pushNodeState(node, other);
-    bool result = true;
-    if (!checkVariableContext_captureKind(visitor, node, other)) {
-      result = visitor.resultOnInequivalence;
-    }
-    if (!checkVariableContext_variables(visitor, node, other)) {
-      result = visitor.resultOnInequivalence;
-    }
-    if (!checkVariableContext_fileOffset(visitor, node, other)) {
-      result = visitor.resultOnInequivalence;
-    }
-    visitor.popState();
-    return result;
-  }
-
-  bool checkScope(EquivalenceVisitor visitor, Scope? node, Object? other) {
-    if (identical(node, other)) return true;
-    if (node is! Scope) return false;
-    if (other is! Scope) return false;
-    visitor.pushNodeState(node, other);
-    bool result = true;
-    if (!checkScope_contexts(visitor, node, other)) {
-      result = visitor.resultOnInequivalence;
-    }
-    if (!checkScope_fileOffset(visitor, node, other)) {
-      result = visitor.resultOnInequivalence;
-    }
-    visitor.popState();
-    return result;
-  }
-
   bool checkName(EquivalenceVisitor visitor, Name? node, Object? other) {
     if (identical(node, other)) return true;
     if (node is! Name) return false;
@@ -8033,8 +8040,45 @@
     );
   }
 
+  bool checkVariableContext_captureKind(
+    EquivalenceVisitor visitor,
+    VariableContext node,
+    VariableContext other,
+  ) {
+    return visitor.checkValues(
+      node.captureKind,
+      other.captureKind,
+      'captureKind',
+    );
+  }
+
+  bool checkVariableContext_variables(
+    EquivalenceVisitor visitor,
+    VariableContext node,
+    VariableContext other,
+  ) {
+    return visitor.checkLists(
+      node.variables,
+      other.variables,
+      visitor.checkNodes,
+      'variables',
+    );
+  }
+
+  bool checkScope_contexts(
+    EquivalenceVisitor visitor,
+    Scope node,
+    Scope other,
+  ) {
+    return visitor.checkLists(node.contexts, other.contexts, (a, b, _) {
+      if (identical(a, b)) return true;
+      return checkVariableContext(visitor, a, b);
+    }, 'contexts');
+  }
+
   bool checkField_scope(EquivalenceVisitor visitor, Field node, Field other) {
-    return visitor.checkNodes(node.scope, other.scope, 'scope');
+    'scope';
+    return checkScope(visitor, node.scope, other.scope);
   }
 
   bool checkMember_fileEndOffset(
@@ -10450,7 +10494,8 @@
     BlockExpression node,
     BlockExpression other,
   ) {
-    return visitor.checkNodes(node.scope, other.scope, 'scope');
+    'scope';
+    return checkScope(visitor, node.scope, other.scope);
   }
 
   bool checkBlockExpression_fileOffset(
@@ -10875,7 +10920,8 @@
     FunctionNode node,
     FunctionNode other,
   ) {
-    return visitor.checkNodes(node.scope, other.scope, 'scope');
+    'scope';
+    return checkScope(visitor, node.scope, other.scope);
   }
 
   bool checkFunctionNode_capturedContexts(
@@ -10883,12 +10929,14 @@
     FunctionNode node,
     FunctionNode other,
   ) {
-    return visitor.checkLists(
-      node.capturedContexts,
-      other.capturedContexts,
-      visitor.checkNodes,
-      'capturedContexts',
-    );
+    return visitor.checkLists(node.capturedContexts, other.capturedContexts, (
+      a,
+      b,
+      _,
+    ) {
+      if (identical(a, b)) return true;
+      return checkVariableContext(visitor, a, b);
+    }, 'capturedContexts');
   }
 
   bool checkFunctionNode_emittedValueType(
@@ -12764,7 +12812,8 @@
   }
 
   bool checkBlock_scope(EquivalenceVisitor visitor, Block node, Block other) {
-    return visitor.checkNodes(node.scope, other.scope, 'scope');
+    'scope';
+    return checkScope(visitor, node.scope, other.scope);
   }
 
   bool checkBlock_fileOffset(
@@ -12905,7 +12954,8 @@
     WhileStatement node,
     WhileStatement other,
   ) {
-    return visitor.checkNodes(node.scope, other.scope, 'scope');
+    'scope';
+    return checkScope(visitor, node.scope, other.scope);
   }
 
   bool checkWhileStatement_fileOffset(
@@ -12987,7 +13037,8 @@
     ForStatement node,
     ForStatement other,
   ) {
-    return visitor.checkNodes(node.scope, other.scope, 'scope');
+    'scope';
+    return checkScope(visitor, node.scope, other.scope);
   }
 
   bool checkForStatement_fileOffset(
@@ -13043,7 +13094,8 @@
     ForInStatement node,
     ForInStatement other,
   ) {
-    return visitor.checkNodes(node.scope, other.scope, 'scope');
+    'scope';
+    return checkScope(visitor, node.scope, other.scope);
   }
 
   bool checkForInStatement_fileOffset(
@@ -13337,12 +13389,14 @@
     VariableInitialization node,
     VariableInitialization other,
   ) {
-    return visitor.checkLists(
-      node.capturedContexts,
-      other.capturedContexts,
-      visitor.checkNodes,
-      'capturedContexts',
-    );
+    return visitor.checkLists(node.capturedContexts, other.capturedContexts, (
+      a,
+      b,
+      _,
+    ) {
+      if (identical(a, b)) return true;
+      return checkVariableContext(visitor, a, b);
+    }, 'capturedContexts');
   }
 
   bool checkVariableInitialization_flags(
@@ -13451,7 +13505,8 @@
   }
 
   bool checkCatch_scope(EquivalenceVisitor visitor, Catch node, Catch other) {
-    return visitor.checkNodes(node.scope, other.scope, 'scope');
+    'scope';
+    return checkScope(visitor, node.scope, other.scope);
   }
 
   bool checkCatch_fileOffset(
@@ -13507,6 +13562,15 @@
     );
   }
 
+  bool checkLocalVariable_context(
+    EquivalenceVisitor visitor,
+    LocalVariable node,
+    LocalVariable other,
+  ) {
+    'context';
+    return checkVariableContext(visitor, node.context, other.context);
+  }
+
   bool checkLocalVariable_binaryOffsetNoTag(
     EquivalenceVisitor visitor,
     LocalVariable node,
@@ -13612,6 +13676,15 @@
     );
   }
 
+  bool checkCatchVariable_context(
+    EquivalenceVisitor visitor,
+    CatchVariable node,
+    CatchVariable other,
+  ) {
+    'context';
+    return checkVariableContext(visitor, node.context, other.context);
+  }
+
   bool checkCatchVariable_binaryOffsetNoTag(
     EquivalenceVisitor visitor,
     CatchVariable node,
@@ -13685,6 +13758,15 @@
     );
   }
 
+  bool checkPositionalParameter_context(
+    EquivalenceVisitor visitor,
+    PositionalParameter node,
+    PositionalParameter other,
+  ) {
+    'context';
+    return checkVariableContext(visitor, node.context, other.context);
+  }
+
   bool checkPositionalParameter_binaryOffsetNoTag(
     EquivalenceVisitor visitor,
     PositionalParameter node,
@@ -13794,6 +13876,15 @@
     );
   }
 
+  bool checkNamedParameter_context(
+    EquivalenceVisitor visitor,
+    NamedParameter node,
+    NamedParameter other,
+  ) {
+    'context';
+    return checkVariableContext(visitor, node.context, other.context);
+  }
+
   bool checkNamedParameter_binaryOffsetNoTag(
     EquivalenceVisitor visitor,
     NamedParameter node,
@@ -13863,6 +13954,15 @@
     );
   }
 
+  bool checkThisVariable_context(
+    EquivalenceVisitor visitor,
+    ThisVariable node,
+    ThisVariable other,
+  ) {
+    'context';
+    return checkVariableContext(visitor, node.context, other.context);
+  }
+
   bool checkThisVariable_binaryOffsetNoTag(
     EquivalenceVisitor visitor,
     ThisVariable node,
@@ -13948,6 +14048,15 @@
     );
   }
 
+  bool checkSyntheticVariable_context(
+    EquivalenceVisitor visitor,
+    SyntheticVariable node,
+    SyntheticVariable other,
+  ) {
+    'context';
+    return checkVariableContext(visitor, node.context, other.context);
+  }
+
   bool checkSyntheticVariable_binaryOffsetNoTag(
     EquivalenceVisitor visitor,
     SyntheticVariable node,
@@ -14000,6 +14109,15 @@
     );
   }
 
+  bool checkTypeVariable_context(
+    EquivalenceVisitor visitor,
+    TypeVariable node,
+    TypeVariable other,
+  ) {
+    'context';
+    return checkVariableContext(visitor, node.context, other.context);
+  }
+
   bool checkTypeVariable_parameter(
     EquivalenceVisitor visitor,
     TypeVariable node,
@@ -14106,60 +14224,6 @@
     return checkTreeNode_fileOffset(visitor, node, other);
   }
 
-  bool checkVariableContext_captureKind(
-    EquivalenceVisitor visitor,
-    VariableContext node,
-    VariableContext other,
-  ) {
-    return visitor.checkValues(
-      node.captureKind,
-      other.captureKind,
-      'captureKind',
-    );
-  }
-
-  bool checkVariableContext_variables(
-    EquivalenceVisitor visitor,
-    VariableContext node,
-    VariableContext other,
-  ) {
-    return visitor.checkLists(
-      node.variables,
-      other.variables,
-      visitor.checkNodes,
-      'variables',
-    );
-  }
-
-  bool checkVariableContext_fileOffset(
-    EquivalenceVisitor visitor,
-    VariableContext node,
-    VariableContext other,
-  ) {
-    return checkTreeNode_fileOffset(visitor, node, other);
-  }
-
-  bool checkScope_contexts(
-    EquivalenceVisitor visitor,
-    Scope node,
-    Scope other,
-  ) {
-    return visitor.checkLists(
-      node.contexts,
-      other.contexts,
-      visitor.checkNodes,
-      'contexts',
-    );
-  }
-
-  bool checkScope_fileOffset(
-    EquivalenceVisitor visitor,
-    Scope node,
-    Scope other,
-  ) {
-    return checkTreeNode_fileOffset(visitor, node, other);
-  }
-
   bool checkName_text(EquivalenceVisitor visitor, Name node, Name other) {
     return visitor.checkValues(node.text, other.text, 'text');
   }
diff --git a/pkg/kernel/lib/src/node_creator.dart b/pkg/kernel/lib/src/node_creator.dart
index e64f4fe..4eb2fc1 100644
--- a/pkg/kernel/lib/src/node_creator.dart
+++ b/pkg/kernel/lib/src/node_creator.dart
@@ -103,11 +103,7 @@
              VariableDeclarationKind.SyntheticVariable,
              VariableDeclarationKind.ThisVariable,
            }),
-       _pendingNodes = _createPending<NodeKind>(nodes, {
-         NodeKind.TypeVariable,
-         NodeKind.VariableContext,
-         NodeKind.Scope,
-       }),
+       _pendingNodes = _createPending<NodeKind>(nodes, {NodeKind.TypeVariable}),
        _uri = Uri.parse('test:uri') {
     _createdKinds.addAll(_pendingExpressions.keys);
     _createdKinds.addAll(_pendingStatements.keys);
@@ -389,8 +385,6 @@
         case NodeKind.PatternSwitchCase:
         case NodeKind.SwitchExpressionCase:
         case NodeKind.TypeVariable:
-        case NodeKind.Scope:
-        case NodeKind.VariableContext:
           throw new UnimplementedError('Expected in body node $kind.');
         case NodeKind.Class:
           _needLibrary().addClass(node as Class);
@@ -2135,8 +2129,6 @@
           _createExpression(),
         )..fileOffset = _needFileOffset();
       case NodeKind.TypeVariable:
-      case NodeKind.Scope:
-      case NodeKind.VariableContext:
         throw new UnimplementedError("Unimplemented support for kind $kind.");
     }
   }
diff --git a/pkg/kernel/lib/src/printer.dart b/pkg/kernel/lib/src/printer.dart
index 899f7f8..cf7298d 100644
--- a/pkg/kernel/lib/src/printer.dart
+++ b/pkg/kernel/lib/src/printer.dart
@@ -260,7 +260,7 @@
         return _variableNames[node] ??= '#${_variableNames.length}';
       case CatchVariable(catchVariableName: var name):
         return name;
-      case LegacyVariableDeclaration(:var name):
+      case VariableStatement(:var name):
       case VariableInitialization(:var name):
         if (name != null) {
           return name;
@@ -519,11 +519,12 @@
   /// If [isLate] and [type] are provided, these values are used instead of
   /// the corresponding properties on [node].
   void writeVariableInitialization(
-    VariableInitializationBase node, {
+    VariableDeclaration node, {
     bool includeModifiersAndType = true,
     bool? isLate,
     DartType? type,
     bool includeInitializer = true,
+    bool isImplicitlyTyped = false,
   }) {
     if (includeModifiersAndType) {
       if (node.isRequired) {
@@ -538,8 +539,12 @@
       if (node.isConst) {
         _sb.write('const ');
       }
-      writeType(type ?? node.type);
-      _sb.write(' ');
+      if (isImplicitlyTyped) {
+        _sb.write('var ');
+      } else {
+        writeType(type ?? node.type);
+        _sb.write(' ');
+      }
     }
     _sb.write(getVariableName(node.variable));
     if (includeInitializer && node.initializer != null && !node.isRequired) {
diff --git a/pkg/kernel/lib/text/ast_to_text.dart b/pkg/kernel/lib/text/ast_to_text.dart
index 44a7373..1734f52 100644
--- a/pkg/kernel/lib/text/ast_to_text.dart
+++ b/pkg/kernel/lib/text/ast_to_text.dart
@@ -243,7 +243,7 @@
 }
 
 abstract class Annotator {
-  String annotateVariable(Printer printer, VariableInitializationBase node);
+  String annotateVariable(Printer printer, VariableDeclaration node);
   String annotateReturn(Printer printer, FunctionNode node);
   String annotateField(Printer printer, Field node);
 }
@@ -1249,7 +1249,8 @@
   }
 
   void writeExpressionVariable(VariableDeclaration node) {
-    if (node is LegacyVariableDeclaration && node is! FunctionParameter) {
+    // TODO(cstefantsova): Printer of the new variables is broken.
+    if (node is VariableStatement && node is! FunctionParameter) {
       writeVariableDeclaration(node);
     } else {
       if (showOffsets) writeWord("[${node.fileOffset}]");
@@ -1266,7 +1267,7 @@
           writeWord('this-variable');
         case SyntheticVariable():
           writeWord('synthetic-variable');
-        case LegacyVariableDeclaration():
+        case VariableStatement():
           writeWord('variable-declaration');
         case CatchVariable():
           writeWord('catch-variable');
@@ -2603,7 +2604,7 @@
       ensureSpace();
     }
     writeSymbol('(');
-    if (node.variable case LegacyVariableDeclaration variable) {
+    if (node.variable case VariableStatement variable) {
       writeVariableDeclaration(variable, useVarKeyword: true);
     } else {
       writeExpressionVariable(node.variable);
@@ -2757,7 +2758,7 @@
   }
 
   @override
-  void visitVariableInitialization(VariableInitializationBase node) {
+  void visitVariableInitialization(VariableInitialization node) {
     writeIndentation();
     writeVariableInitialization(node);
     _writeContexts(node);
@@ -2777,58 +2778,70 @@
     VariableDeclaration node, {
     bool useVarKeyword = false,
   }) {
-    if (node is FunctionParameter) {
-      writeExpressionVariable(node);
-    } else {
-      if (showOffsets) writeWord("[${node.fileOffset}]");
-      if (showMetadata) writeMetadata(node);
-      writeAnnotationList(node.annotations, separateLines: false);
-      writeModifier(node.isLowered, 'lowered');
-      writeModifier(node.isLate, 'late');
-      writeModifier(node.isRequired, 'required');
-      writeModifier(node.isCovariantByDeclaration, 'covariant-by-declaration');
-      writeModifier(node.isCovariantByClass, 'covariant-by-class');
-      writeModifier(node.isFinal, 'final');
-      writeModifier(node.isConst, 'const');
-      writeModifier(node.isSynthesized && node.name != null, 'synthesized');
-      writeModifier(node.isHoisted, 'hoisted');
-      writeModifier(node.isWildcard, 'wildcard');
-      writeModifier(node.isInitializingFormal, 'initializing-formal');
-      writeModifier(
-        node.isSuperInitializingFormal,
-        'super-initializing-formal',
-      );
-      writeModifier(node.isErroneouslyInitialized, 'erroneously-initialized');
-      bool hasImplicitInitializer =
-          node.initializer is NullLiteral ||
-          (node.initializer is ConstantExpression &&
-              (node.initializer as ConstantExpression).constant
-                  is NullConstant);
-      if ((node.initializer == null || hasImplicitInitializer) &&
-          node.hasDeclaredInitializer) {
-        writeModifier(node.hasDeclaredInitializer, 'has-declared-initializer');
-      } else if (node.initializer != null &&
-          !hasImplicitInitializer &&
-          !node.hasDeclaredInitializer) {
+    switch (node) {
+      case LocalVariable():
+      case CatchVariable():
+      case ThisVariable():
+      case SyntheticVariable():
+      case PositionalParameter():
+      case NamedParameter():
+        writeExpressionVariable(node);
+      case VariableStatement():
+        if (showOffsets) writeWord("[${node.fileOffset}]");
+        if (showMetadata) writeMetadata(node);
+        writeAnnotationList(node.annotations, separateLines: false);
+        writeModifier(node.isLowered, 'lowered');
+        writeModifier(node.isLate, 'late');
+        writeModifier(node.isRequired, 'required');
         writeModifier(
-          node.hasDeclaredInitializer,
-          'has-no-declared-initializer',
+          node.isCovariantByDeclaration,
+          'covariant-by-declaration',
         );
-      }
-      writeAnnotatedType(node.type, annotator?.annotateVariable(this, node));
-      writeWord(getVariableName(node));
-      Expression? initializer = node.initializer;
-      if (initializer != null) {
-        writeSpaced('=');
-        writeExpression(initializer);
-      }
+        writeModifier(node.isCovariantByClass, 'covariant-by-class');
+        writeModifier(node.isFinal, 'final');
+        writeModifier(node.isConst, 'const');
+        writeModifier(node.isSynthesized && node.name != null, 'synthesized');
+        writeModifier(node.isHoisted, 'hoisted');
+        writeModifier(node.isWildcard, 'wildcard');
+        writeModifier(node.isInitializingFormal, 'initializing-formal');
+        writeModifier(
+          node.isSuperInitializingFormal,
+          'super-initializing-formal',
+        );
+        writeModifier(node.isErroneouslyInitialized, 'erroneously-initialized');
+        bool hasImplicitInitializer =
+            node.initializer is NullLiteral ||
+            (node.initializer is ConstantExpression &&
+                (node.initializer as ConstantExpression).constant
+                    is NullConstant);
+        if ((node.initializer == null || hasImplicitInitializer) &&
+            node.hasDeclaredInitializer) {
+          writeModifier(
+            node.hasDeclaredInitializer,
+            'has-declared-initializer',
+          );
+        } else if (node.initializer != null &&
+            !hasImplicitInitializer &&
+            !node.hasDeclaredInitializer) {
+          writeModifier(
+            node.hasDeclaredInitializer,
+            'has-no-declared-initializer',
+          );
+        }
+        writeAnnotatedType(node.type, annotator?.annotateVariable(this, node));
+        writeWord(getVariableName(node));
+        Expression? initializer = node.initializer;
+        if (initializer != null) {
+          writeSpaced('=');
+          writeExpression(initializer);
+        }
+      case VariableInitialization():
+        writeVariableInitialization(node);
     }
   }
 
-  void writeVariableInitialization(VariableInitializationBase node) {
-    if (node is VariableDeclaration) {
-      writeVariableDeclaration(node);
-    } else {
+  void writeVariableInitialization(VariableDeclaration node) {
+    if (node is VariableInitialization) {
       if (showOffsets) writeWord("[${node.fileOffset}]");
       if (showMetadata) writeMetadata(node);
       writeAnnotationList(node.annotations, separateLines: false);
@@ -2855,6 +2868,8 @@
         writeSpaced(':=');
         writeExpression(initializer);
       }
+    } else {
+      writeVariableDeclaration(node);
     }
   }
 
diff --git a/pkg/kernel/lib/type_checker.dart b/pkg/kernel/lib/type_checker.dart
index c4c0560..0bfd158 100644
--- a/pkg/kernel/lib/type_checker.dart
+++ b/pkg/kernel/lib/type_checker.dart
@@ -1183,7 +1183,7 @@
 
   @override
   void visitForStatement(ForStatement node) {
-    node.variables.forEach(visitVariableInitialization);
+    node.variables.forEach(_handleVariableInitialization);
     if (node.condition != null) {
       node.condition = checkExpressionAndAssignability(
         node.condition!,
@@ -1257,11 +1257,15 @@
 
   @override
   void visitVariableDeclaration(VariableDeclaration node) {
-    visitVariableInitialization(node);
+    _handleVariableInitialization(node);
   }
 
   @override
-  void visitVariableInitialization(VariableInitializationBase node) {
+  void visitVariableInitialization(VariableInitialization node) {
+    _handleVariableInitialization(node);
+  }
+
+  void _handleVariableInitialization(VariableDeclaration node) {
     if (node.initializer != null) {
       node.initializer = checkExpressionAndAssignability(
         node.initializer!,
diff --git a/pkg/kernel/lib/verifier.dart b/pkg/kernel/lib/verifier.dart
index 3294bd9..307c3f3 100644
--- a/pkg/kernel/lib/verifier.dart
+++ b/pkg/kernel/lib/verifier.dart
@@ -270,7 +270,7 @@
   // TODO(cstefantsova): Remove this method when the new variable model is
   //  supported.
   bool _isNewModelVariable(TreeNode node) {
-    return node is VariableDeclaration && node is! LegacyVariableDeclaration ||
+    return node is VariableDeclaration && node is! VariableStatement ||
         node is FunctionParameter;
   }
 
@@ -1142,11 +1142,11 @@
   }
 
   @override
-  void visitVariableInitialization(VariableInitializationBase node) {
+  void visitVariableInitialization(VariableDeclaration node) {
     return _verifyVariableInitialization(node);
   }
 
-  void _verifyVariableInitialization(VariableInitializationBase node) {
+  void _verifyVariableInitialization(VariableDeclaration node) {
     enterTreeNode(node);
     TreeNode? parent = node.parent;
     if (parent is! Block &&
@@ -1181,11 +1181,6 @@
   }
 
   @override
-  void visitLocalVariable(LocalVariable node) {
-    declareVariable(node);
-  }
-
-  @override
   void visitVariableGet(VariableGet node) {
     // TODO(cstefantsova): Support new variable model.
     if (_isNewModelVariable(node.variable)) {
diff --git a/pkg/kernel/lib/visitor.dart b/pkg/kernel/lib/visitor.dart
index 8038364..6b6cf26 100644
--- a/pkg/kernel/lib/visitor.dart
+++ b/pkg/kernel/lib/visitor.dart
@@ -765,8 +765,6 @@
   R visitPatternGuard(PatternGuard node);
   R visitComponent(Component node);
   R visitTypeVariable(TypeVariable node);
-  R visitVariableContext(VariableContext node);
-  R visitScope(Scope node);
   R visitNominalParameter(NominalParameter node);
 }
 
@@ -824,10 +822,6 @@
   @override
   R visitTypeVariable(TypeVariable node) => defaultTreeNode(node);
   @override
-  R visitVariableContext(VariableContext node) => defaultTreeNode(node);
-  @override
-  R visitScope(Scope node) => defaultTreeNode(node);
-  @override
   R visitNominalParameter(NominalParameter node) => visitTypeParameter(node);
 }
 
@@ -890,8 +884,6 @@
   R visitPatternGuard(PatternGuard node, A arg);
   R visitComponent(Component node, A arg);
   R visitTypeVariable(TypeVariable node, A arg);
-  R visitVariableContext(VariableContext node, A arg);
-  R visitScope(Scope node, A arg);
   R visitNominalParameter(NominalParameter node, A arg);
 }
 
@@ -955,11 +947,6 @@
   @override
   R visitTypeVariable(TypeVariable node, A arg) => defaultTreeNode(node, arg);
   @override
-  R visitVariableContext(VariableContext node, A arg) =>
-      defaultTreeNode(node, arg);
-  @override
-  R visitScope(Scope node, A arg) => defaultTreeNode(node, arg);
-  @override
   R visitNominalParameter(NominalParameter node, A arg) =>
       visitTypeParameter(node, arg);
 }
@@ -2425,18 +2412,6 @@
     transformList(nodes, parent, dummyVariableDeclaration);
   }
 
-  /// Transforms or removes [VariableInitializationBase] nodes in [nodes] as
-  /// children of [parent].
-  ///
-  /// This is convenience method for calling [transformList] with removal
-  /// sentinel for [VariableInitializationBase] nodes.
-  void transformVariableInitializationList(
-    List<VariableInitializationBase> nodes,
-    TreeNode parent,
-  ) {
-    transformList(nodes, parent, dummyVariableDeclaration);
-  }
-
   /// Transforms or removes [T] nodes in [nodes] as children of [parent] by
   /// calling [transformOrRemove] using [removalSentinel] as the removal
   /// sentinel.
@@ -3368,16 +3343,6 @@
     throw StateError("${runtimeType}.visitTypeVariable isn't supported.");
   }
 
-  @override
-  R visitVariableContext(VariableContext node) {
-    throw StateError("${runtimeType}.visitVariableContext isn't supported.");
-  }
-
-  @override
-  R visitScope(Scope node) {
-    throw StateError("${runtimeType}.visitScope isn't supported.");
-  }
-
   /// Since [TypeParameter] is abstract due to an experiment, it doesn't have
   /// its own visit method in [TreeVisitor]. However, for the transitional
   /// period the backends would rely on having [visitTypeParameter] and on
@@ -3406,16 +3371,6 @@
     throw StateError("${runtimeType}.visitTypeVariable isn't supported.");
   }
 
-  @override
-  R visitVariableContext(VariableContext node, A arg) {
-    throw StateError("${runtimeType}.visitVariableContext isn't supported.");
-  }
-
-  @override
-  R visitScope(Scope node, A arg) {
-    throw StateError("${runtimeType}.visitScope isn't supported.");
-  }
-
   /// Since [TypeParameter] is abstract due to an experiment, it doesn't have
   /// its own visit method in [TreeVisitor1]. However, for the transitional
   /// period the backends would rely on having [visitTypeParameter] and on
diff --git a/pkg/linter/CHANGELOG.md b/pkg/linter/CHANGELOG.md
index 22fa690..0d2faaa 100644
--- a/pkg/linter/CHANGELOG.md
+++ b/pkg/linter/CHANGELOG.md
@@ -1,9 +1,16 @@
-# 3.12.0-wip
+# 3.13.0-wip
 
+- new lint: `unnecessary_const_in_enum_constructor`
+- new lint: `unnecessary_type_name_in_constructor`
+- stable: `unnecessary_null_checks`
+
+# 3.12.0
+
+- new lint: `simple_directive_paths`
 - new lint: `var_with_no_type_annotation`
 - stable: `omit_obvious_local_variable_types`
 - stable: `omit_obvious_property_types`
-- stable: `specify_nonobvious_property_types`
+- stable: `specify_nonobvious_local_variable_types`
 - stable: `specify_nonobvious_property_types`
 
 # 3.11.0
diff --git a/pkg/linter/example/all.yaml b/pkg/linter/example/all.yaml
index cac53e2..16b815d 100644
--- a/pkg/linter/example/all.yaml
+++ b/pkg/linter/example/all.yaml
@@ -72,6 +72,7 @@
     - document_ignores
     - empty_catches
     - empty_constructor_bodies
+    - empty_container_bodies
     - empty_statements
     - eol_at_end_of_file
     - exhaustive_cases
@@ -81,6 +82,7 @@
     - implementation_imports
     - implicit_call_tearoffs
     - implicit_reopen
+    - initialize_in_field_declaration
     - invalid_case_patterns
     - invalid_runtime_check_with_js_interop_types
     - join_return_with_assignment
@@ -218,6 +220,7 @@
     - unsafe_variance
     - use_build_context_synchronously
     - use_colored_box
+    - use_declaring_parameters
     - use_decorated_box
     - use_enums
     - use_full_hex_values_for_flutter_colors
@@ -227,6 +230,7 @@
     - use_late_for_private_fields_and_variables
     - use_named_constants
     - use_null_aware_elements
+    - use_primary_constructors
     - use_raw_strings
     - use_rethrow_when_possible
     - use_setters_to_change_properties
diff --git a/pkg/linter/lib/src/diagnostic.g.dart b/pkg/linter/lib/src/diagnostic.g.dart
index 5bbdd6a..6baa8d4 100644
--- a/pkg/linter/lib/src/diagnostic.g.dart
+++ b/pkg/linter/lib/src/diagnostic.g.dart
@@ -1290,6 +1290,22 @@
   expectedTypes: [],
 );
 
+/// Parameters:
+/// String containerKind: The kind of the container, such as 'class' or
+///                       'enum'.
+const DiagnosticWithArguments<
+  LocatableDiagnostic Function({required String containerKind})
+>
+emptyContainerBodies = LinterLintTemplate(
+  name: 'empty_container_bodies',
+  problemMessage:
+      "Empty {0} bodies should be written using a ';' rather than '{}'.",
+  correctionMessage: "Try replacing the {0} body with ';'.",
+  uniqueName: 'empty_container_bodies',
+  withArguments: _withArgumentsEmptyContainerBodies,
+  expectedTypes: [ExpectedType.string],
+);
+
 /// No parameters.
 const LinterLintWithoutArguments emptyStatements = LinterLintWithoutArguments(
   name: 'empty_statements',
@@ -1439,6 +1455,16 @@
 );
 
 /// No parameters.
+const LinterLintWithoutArguments initializeInFieldDeclaration =
+    LinterLintWithoutArguments(
+      name: 'initialize_in_field_declaration',
+      problemMessage: "Field should be initialized in the field declaration.",
+      correctionMessage: "Try initializing the field where it's declared.",
+      uniqueName: 'initialize_in_field_declaration',
+      expectedTypes: [],
+    );
+
+/// No parameters.
 const LinterLintWithoutArguments invalidCasePatterns =
     LinterLintWithoutArguments(
       name: 'invalid_case_patterns',
@@ -3607,6 +3633,16 @@
 );
 
 /// No parameters.
+const LinterLintWithoutArguments useDeclaringParameters =
+    LinterLintWithoutArguments(
+      name: 'use_declaring_parameters',
+      problemMessage: "Use a declaring parameter.",
+      correctionMessage: "Try using a declaring parameter.",
+      uniqueName: 'use_declaring_parameters',
+      expectedTypes: [],
+    );
+
+/// No parameters.
 const LinterLintWithoutArguments useDecoratedBox = LinterLintWithoutArguments(
   name: 'use_decorated_box',
   problemMessage:
@@ -3734,6 +3770,16 @@
     );
 
 /// No parameters.
+const LinterLintWithoutArguments usePrimaryConstructors =
+    LinterLintWithoutArguments(
+      name: 'use_primary_constructors',
+      problemMessage: "Use a primary constructor.",
+      correctionMessage: "Try using a primary constructor.",
+      uniqueName: 'use_primary_constructors',
+      expectedTypes: [],
+    );
+
+/// No parameters.
 const LinterLintWithoutArguments useRawStrings = LinterLintWithoutArguments(
   name: 'use_raw_strings',
   problemMessage: "Use a raw string to avoid using escapes.",
@@ -4109,6 +4155,12 @@
   ]);
 }
 
+LocatableDiagnostic _withArgumentsEmptyContainerBodies({
+  required String containerKind,
+}) {
+  return LocatableDiagnosticImpl(diag.emptyContainerBodies, [containerKind]);
+}
+
 LocatableDiagnostic _withArgumentsExhaustiveCases({required Object p0}) {
   return LocatableDiagnosticImpl(diag.exhaustiveCases, [p0]);
 }
diff --git a/pkg/linter/lib/src/lint_names.g.dart b/pkg/linter/lib/src/lint_names.g.dart
index fed6ae5..cee2949 100644
--- a/pkg/linter/lib/src/lint_names.g.dart
+++ b/pkg/linter/lib/src/lint_names.g.dart
@@ -229,6 +229,8 @@
 
   static const String empty_constructor_bodies = 'empty_constructor_bodies';
 
+  static const String empty_container_bodies = 'empty_container_bodies';
+
   static const String empty_statements = 'empty_statements';
 
   static const String enable_null_safety = 'enable_null_safety';
@@ -252,6 +254,9 @@
 
   static const String implicit_reopen = 'implicit_reopen';
 
+  static const String initialize_in_field_declaration =
+      'initialize_in_field_declaration';
+
   static const String invalid_case_patterns = 'invalid_case_patterns';
 
   static const String invalid_runtime_check_with_js_interop_types =
@@ -606,6 +611,8 @@
 
   static const String use_colored_box = 'use_colored_box';
 
+  static const String use_declaring_parameters = 'use_declaring_parameters';
+
   static const String use_decorated_box = 'use_decorated_box';
 
   static const String use_enums = 'use_enums';
@@ -632,6 +639,8 @@
 
   static const String use_null_aware_elements = 'use_null_aware_elements';
 
+  static const String use_primary_constructors = 'use_primary_constructors';
+
   static const String use_raw_strings = 'use_raw_strings';
 
   static const String use_rethrow_when_possible = 'use_rethrow_when_possible';
diff --git a/pkg/linter/lib/src/rules.dart b/pkg/linter/lib/src/rules.dart
index c27f62d..f6dc4ee 100644
--- a/pkg/linter/lib/src/rules.dart
+++ b/pkg/linter/lib/src/rules.dart
@@ -82,6 +82,7 @@
 import 'rules/document_ignores.dart';
 import 'rules/empty_catches.dart';
 import 'rules/empty_constructor_bodies.dart';
+import 'rules/empty_container_bodies.dart';
 import 'rules/empty_statements.dart';
 import 'rules/enable_null_safety.dart';
 import 'rules/eol_at_end_of_file.dart';
@@ -93,6 +94,7 @@
 import 'rules/implementation_imports.dart';
 import 'rules/implicit_call_tearoffs.dart';
 import 'rules/implicit_reopen.dart';
+import 'rules/initialize_in_field_declaration.dart';
 import 'rules/invalid_case_patterns.dart';
 import 'rules/invalid_runtime_check_with_js_interop_types.dart';
 import 'rules/invariant_booleans.dart';
@@ -240,6 +242,7 @@
 import 'rules/unsafe_variance.dart';
 import 'rules/use_build_context_synchronously.dart';
 import 'rules/use_colored_box.dart';
+import 'rules/use_declaring_parameters.dart';
 import 'rules/use_decorated_box.dart';
 import 'rules/use_enums.dart';
 import 'rules/use_full_hex_values_for_flutter_colors.dart';
@@ -250,6 +253,7 @@
 import 'rules/use_late_for_private_fields_and_variables.dart';
 import 'rules/use_named_constants.dart';
 import 'rules/use_null_aware_elements.dart';
+import 'rules/use_primary_constructors.dart';
 import 'rules/use_raw_strings.dart';
 import 'rules/use_rethrow_when_possible.dart';
 import 'rules/use_setters_to_change_properties.dart';
@@ -343,6 +347,7 @@
     ..registerLintRule(DoNotUseEnvironment())
     ..registerLintRule(EmptyCatches())
     ..registerLintRule(EmptyConstructorBodies())
+    ..registerLintRule(EmptyContainerBodies())
     ..registerLintRule(EmptyStatements())
     ..registerLintRule(enableNullSafety)
     ..registerLintRule(EolAtEndOfFile())
@@ -354,6 +359,7 @@
     ..registerLintRule(ImplementationImports())
     ..registerLintRule(ImplicitCallTearoffs())
     ..registerLintRule(ImplicitReopen())
+    ..registerLintRule(InitializeInFieldDeclaration())
     ..registerLintRule(InvalidCasePatterns())
     ..registerLintRule(invariantBooleans)
     ..registerLintRule(iterableContainsUnrelatedType)
@@ -501,6 +507,7 @@
     ..registerLintRule(UseBuildContextSynchronously())
     ..registerLintRule(UseColoredBox())
     ..registerLintRule(UseDecoratedBox())
+    ..registerLintRule(UseDeclaringParameters())
     ..registerLintRule(UseEnums())
     ..registerLintRule(UseFullHexValuesForFlutterColors())
     ..registerLintRule(UseFunctionTypeSyntaxForParameters())
@@ -510,6 +517,7 @@
     ..registerLintRule(UseLateForPrivateFieldsAndVariables())
     ..registerLintRule(UseNamedConstants())
     ..registerLintRule(UseNullAwareElements())
+    ..registerLintRule(UsePrimaryConstructors())
     ..registerLintRule(UseRawStrings())
     ..registerLintRule(UseRethrowWhenPossible())
     ..registerLintRule(UseSettersToChangeProperties())
diff --git a/pkg/linter/lib/src/rules/deprecated_consistency.dart b/pkg/linter/lib/src/rules/deprecated_consistency.dart
index b472bd4..a060ec8 100644
--- a/pkg/linter/lib/src/rules/deprecated_consistency.dart
+++ b/pkg/linter/lib/src/rules/deprecated_consistency.dart
@@ -10,7 +10,6 @@
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/error/error.dart';
 import 'package:analyzer/source/source_range.dart';
-import 'package:analyzer/src/dart/ast/extensions.dart'; // ignore: implementation_imports
 
 import '../analyzer.dart';
 import '../diagnostic.dart' as diag;
diff --git a/pkg/linter/lib/src/rules/empty_container_bodies.dart b/pkg/linter/lib/src/rules/empty_container_bodies.dart
new file mode 100644
index 0000000..6e655f0
--- /dev/null
+++ b/pkg/linter/lib/src/rules/empty_container_bodies.dart
@@ -0,0 +1,63 @@
+// Copyright (c) 2026, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analyzer/analysis_rule/analysis_rule.dart';
+import 'package:analyzer/analysis_rule/rule_context.dart';
+import 'package:analyzer/analysis_rule/rule_visitor_registry.dart';
+import 'package:analyzer/dart/analysis/features.dart';
+import 'package:analyzer/dart/ast/ast.dart';
+import 'package:analyzer/dart/ast/visitor.dart';
+import 'package:analyzer/error/error.dart';
+import 'package:analyzer/source/source_range.dart';
+
+import '../analyzer.dart';
+import '../diagnostic.dart' as diag;
+
+const _desc = r'Use `;` instead of `{}` for empty container bodies.';
+
+class EmptyContainerBodies extends AnalysisRule {
+  EmptyContainerBodies()
+    : super(name: LintNames.empty_container_bodies, description: _desc);
+
+  @override
+  DiagnosticCode get diagnosticCode => diag.emptyContainerBodies;
+
+  @override
+  void registerNodeProcessors(
+    RuleVisitorRegistry registry,
+    RuleContext context,
+  ) {
+    if (!context.isFeatureEnabled(Feature.primary_constructors)) return;
+    var visitor = _Visitor(this);
+    registry.addBlockClassBody(this, visitor);
+  }
+}
+
+class _Visitor extends SimpleAstVisitor<void> {
+  final AnalysisRule rule;
+
+  _Visitor(this.rule);
+
+  @override
+  void visitBlockClassBody(BlockClassBody node) {
+    var leftBracket = node.leftBracket;
+    var rightBracket = node.rightBracket;
+    if (leftBracket.next == rightBracket &&
+        rightBracket.precedingComments == null) {
+      var kind = switch (node.parent) {
+        ClassDeclaration() => 'class',
+        MixinDeclaration() => 'mixin',
+        ExtensionDeclaration() => 'extension',
+        ExtensionTypeDeclaration() => 'extension type',
+        // This should never happen.
+        _ => 'container',
+      };
+      var offset = leftBracket.offset;
+      rule.reportAtSourceRange(
+        SourceRange(offset, rightBracket.end - offset),
+        arguments: [kind],
+      );
+    }
+  }
+}
diff --git a/pkg/linter/lib/src/rules/initialize_in_field_declaration.dart b/pkg/linter/lib/src/rules/initialize_in_field_declaration.dart
new file mode 100644
index 0000000..e25c7e7
--- /dev/null
+++ b/pkg/linter/lib/src/rules/initialize_in_field_declaration.dart
@@ -0,0 +1,87 @@
+// Copyright (c) 2026, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analyzer/analysis_rule/analysis_rule.dart';
+import 'package:analyzer/analysis_rule/rule_context.dart';
+import 'package:analyzer/analysis_rule/rule_visitor_registry.dart';
+import 'package:analyzer/dart/analysis/features.dart';
+import 'package:analyzer/dart/ast/ast.dart';
+import 'package:analyzer/dart/ast/visitor.dart';
+import 'package:analyzer/dart/element/element.dart';
+import 'package:analyzer/error/error.dart';
+
+import '../analyzer.dart';
+import '../diagnostic.dart' as diag;
+
+const _desc = r"Initialize the field in the field's initializer.";
+
+class InitializeInFieldDeclaration extends AnalysisRule {
+  InitializeInFieldDeclaration()
+    : super(
+        name: LintNames.initialize_in_field_declaration,
+        description: _desc,
+      );
+
+  @override
+  DiagnosticCode get diagnosticCode => diag.initializeInFieldDeclaration;
+
+  @override
+  void registerNodeProcessors(
+    RuleVisitorRegistry registry,
+    RuleContext context,
+  ) {
+    if (!context.isFeatureEnabled(Feature.primary_constructors)) return;
+    var visitor = _Visitor(this);
+    registry.addPrimaryConstructorBody(this, visitor);
+  }
+}
+
+class _ParameterReferenceVisitor extends RecursiveAstVisitor<void> {
+  final ConstructorElement constructorElement;
+  bool referencesParameter = false;
+
+  _ParameterReferenceVisitor(this.constructorElement);
+
+  @override
+  void visitSimpleIdentifier(SimpleIdentifier node) {
+    var element = node.element;
+    if (element is FormalParameterElement &&
+        element.enclosingElement == constructorElement) {
+      referencesParameter = true;
+    }
+    super.visitSimpleIdentifier(node);
+  }
+}
+
+class _Visitor extends SimpleAstVisitor<void> {
+  final AnalysisRule rule;
+
+  _Visitor(this.rule);
+
+  @override
+  void visitPrimaryConstructorBody(PrimaryConstructorBody node) {
+    var declaration = node.declaration;
+    if (declaration == null) return;
+    var constructorElement = declaration.declaredFragment?.element;
+    if (constructorElement == null) return;
+
+    for (var initializer in node.initializers) {
+      if (initializer is ConstructorFieldInitializer) {
+        var fieldName = initializer.fieldName;
+        var fieldElement = fieldName.element;
+        if (fieldElement is! FieldElement) continue;
+        if (fieldElement.isLate) continue;
+        if (fieldElement.enclosingElement !=
+            constructorElement.enclosingElement) {
+          continue;
+        }
+        var visitor = _ParameterReferenceVisitor(constructorElement);
+        initializer.expression.accept(visitor);
+        if (visitor.referencesParameter) {
+          rule.reportAtSourceRange(fieldName.sourceRange);
+        }
+      }
+    }
+  }
+}
diff --git a/pkg/linter/lib/src/rules/prefer_const_constructors_in_immutables.dart b/pkg/linter/lib/src/rules/prefer_const_constructors_in_immutables.dart
index cded0cf..bf9ae1c 100644
--- a/pkg/linter/lib/src/rules/prefer_const_constructors_in_immutables.dart
+++ b/pkg/linter/lib/src/rules/prefer_const_constructors_in_immutables.dart
@@ -9,7 +9,6 @@
 import 'package:analyzer/dart/ast/visitor.dart';
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/error/error.dart';
-import 'package:analyzer/src/dart/ast/extensions.dart'; // ignore: implementation_imports
 import 'package:analyzer/src/lint/constants.dart'; // ignore: implementation_imports
 import 'package:collection/collection.dart' show IterableExtension;
 
diff --git a/pkg/linter/lib/src/rules/prefer_final_locals.dart b/pkg/linter/lib/src/rules/prefer_final_locals.dart
index be004bd..e56d83f 100644
--- a/pkg/linter/lib/src/rules/prefer_final_locals.dart
+++ b/pkg/linter/lib/src/rules/prefer_final_locals.dart
@@ -8,10 +8,10 @@
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/ast/visitor.dart';
 import 'package:analyzer/dart/element/element.dart';
-import 'package:analyzer/diagnostic/diagnostic.dart';
 import 'package:analyzer/error/error.dart';
 import 'package:analyzer/src/dart/element/extensions.dart'; // ignore: implementation_imports
-import 'package:analyzer/src/diagnostic/diagnostic_message.dart'; // ignore: implementation_imports
+import 'package:analyzer/src/diagnostic/diagnostic.dart' // ignore: implementation_imports
+    show DiagnosticMessage, DiagnosticMessageImpl;
 
 import '../analyzer.dart';
 import '../diagnostic.dart' as diag;
diff --git a/pkg/linter/lib/src/rules/sort_constructors_first.dart b/pkg/linter/lib/src/rules/sort_constructors_first.dart
index 7c0af05..48f57c7 100644
--- a/pkg/linter/lib/src/rules/sort_constructors_first.dart
+++ b/pkg/linter/lib/src/rules/sort_constructors_first.dart
@@ -8,8 +8,6 @@
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/ast/visitor.dart';
 import 'package:analyzer/error/error.dart';
-// ignore: implementation_imports
-import 'package:analyzer/src/dart/ast/extensions.dart';
 
 import '../analyzer.dart';
 import '../diagnostic.dart' as diag;
diff --git a/pkg/linter/lib/src/rules/sort_unnamed_constructors_first.dart b/pkg/linter/lib/src/rules/sort_unnamed_constructors_first.dart
index 43dffc0..e887e04 100644
--- a/pkg/linter/lib/src/rules/sort_unnamed_constructors_first.dart
+++ b/pkg/linter/lib/src/rules/sort_unnamed_constructors_first.dart
@@ -8,8 +8,6 @@
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/ast/visitor.dart';
 import 'package:analyzer/error/error.dart';
-// ignore: implementation_imports
-import 'package:analyzer/src/dart/ast/extensions.dart';
 
 import '../analyzer.dart';
 import '../diagnostic.dart' as diag;
diff --git a/pkg/linter/lib/src/rules/unnecessary_const_in_enum_constructor.dart b/pkg/linter/lib/src/rules/unnecessary_const_in_enum_constructor.dart
index a1682b0..2623c0f 100644
--- a/pkg/linter/lib/src/rules/unnecessary_const_in_enum_constructor.dart
+++ b/pkg/linter/lib/src/rules/unnecessary_const_in_enum_constructor.dart
@@ -48,6 +48,7 @@
 
   @override
   void visitConstructorDeclaration(ConstructorDeclaration node) {
+    if (node.parent is! BlockEnumBody) return;
     var constKeyword = node.constKeyword;
     if (constKeyword != null) {
       rule.reportAtToken(constKeyword);
@@ -56,6 +57,7 @@
 
   @override
   void visitPrimaryConstructorDeclaration(PrimaryConstructorDeclaration node) {
+    if (node.parent is! EnumDeclaration) return;
     var constKeyword = node.constKeyword;
     if (constKeyword != null) {
       rule.reportAtToken(constKeyword);
diff --git a/pkg/linter/lib/src/rules/use_declaring_parameters.dart b/pkg/linter/lib/src/rules/use_declaring_parameters.dart
new file mode 100644
index 0000000..0961114
--- /dev/null
+++ b/pkg/linter/lib/src/rules/use_declaring_parameters.dart
@@ -0,0 +1,160 @@
+// Copyright (c) 2026, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analyzer/analysis_rule/analysis_rule.dart';
+import 'package:analyzer/analysis_rule/rule_context.dart';
+import 'package:analyzer/analysis_rule/rule_visitor_registry.dart';
+import 'package:analyzer/dart/analysis/features.dart';
+import 'package:analyzer/dart/ast/ast.dart';
+import 'package:analyzer/dart/ast/visitor.dart';
+import 'package:analyzer/dart/element/element.dart';
+import 'package:analyzer/error/error.dart';
+
+import '../analyzer.dart';
+import '../diagnostic.dart' as diag;
+
+const _desc = r'Use a declaring parameter.';
+
+class UseDeclaringParameters extends AnalysisRule {
+  UseDeclaringParameters()
+    : super(name: LintNames.use_declaring_parameters, description: _desc);
+
+  @override
+  DiagnosticCode get diagnosticCode => diag.useDeclaringParameters;
+
+  @override
+  void registerNodeProcessors(
+    RuleVisitorRegistry registry,
+    RuleContext context,
+  ) {
+    if (!context.isFeatureEnabled(Feature.primary_constructors)) return;
+    var visitor = _Visitor(this);
+    registry.addPrimaryConstructorDeclaration(this, visitor);
+  }
+}
+
+class _Visitor extends SimpleAstVisitor<void> {
+  final AnalysisRule rule;
+
+  _Visitor(this.rule);
+
+  @override
+  void visitPrimaryConstructorDeclaration(PrimaryConstructorDeclaration node) {
+    var body = node.body;
+    for (var parameter in node.formalParameters.parameters) {
+      if (parameter is FieldFormalParameter) {
+        _checkFieldFormalParameter(parameter);
+      } else if (parameter is! SuperFormalParameter &&
+          parameter.constFinalOrVarKeyword == null) {
+        if (body != null) {
+          // If there is no body, then the parameter isn't used to initialize
+          // a field, so it can't be a declaring parameter.
+          _checkNonDeclaringParameter(parameter, body);
+        }
+      }
+    }
+  }
+
+  /// Checks whether the given field formal [parameter] should be a declaring
+  /// parameter.
+  void _checkFieldFormalParameter(FieldFormalParameter parameter) {
+    var parameterHasNoType = parameter.type == null;
+    var parameterElement = parameter.declaredFragment?.element;
+    if (parameterElement is FieldFormalParameterElement) {
+      var field = parameterElement.field;
+      if (field != null &&
+          (parameterHasNoType || field.type == parameterElement.type)) {
+        rule.reportAtToken(parameter.name);
+      }
+    }
+  }
+
+  /// Checks whether the given [parameter] should be a declaring parameter.
+  ///
+  /// Uses the [body] to find an assignment to a parameter.
+  void _checkNonDeclaringParameter(
+    FormalParameter parameter,
+    PrimaryConstructorBody body,
+  ) {
+    var assignedField = _findAssignedField(parameter, body);
+    if (assignedField == null) {
+      // If the parameter isn't assigned to a field, then it can't be a
+      // declaring parameter.
+      return;
+    }
+    var name = parameter.name;
+    if (name != null) {
+      var parameterElement = parameter.declaredFragment?.element;
+      if (parameterElement != null &&
+          assignedField.type == parameterElement.type) {
+        rule.reportAtToken(name);
+      }
+    }
+  }
+
+  /// Returns the field that is assigned to the given [parameter] in the given
+  /// [body].
+  ///
+  /// Returns `null` if the [parameter] is not assigned to a field.
+  FieldElement? _findAssignedField(
+    FormalParameter parameter,
+    PrimaryConstructorBody body,
+  ) {
+    var parameterElement = parameter.declaredFragment?.element;
+    if (parameterElement == null) {
+      // A parameter without an element can't be identified in an assignment.
+      return null;
+    }
+    for (var initializer in body.initializers) {
+      if (initializer is ConstructorFieldInitializer) {
+        if (initializer.expression case SimpleIdentifier expression) {
+          if (expression.element == parameterElement) {
+            if (initializer.fieldName.element case FieldElement fieldElement) {
+              if (_namesMatch(parameterElement.name, fieldElement.name)) {
+                return fieldElement;
+              }
+            }
+          }
+        }
+      }
+    }
+    if (body.body case BlockFunctionBody block) {
+      for (var statement in block.block.statements) {
+        if (statement is ExpressionStatement) {
+          if (statement.expression case AssignmentExpression assignment) {
+            if (assignment.rightHandSide
+                case SimpleIdentifier rightHandExpression) {
+              var rightHandElement = rightHandExpression.element;
+              if (rightHandElement == parameterElement) {
+                if (assignment.writeElement case SetterElement setterElement) {
+                  if (setterElement.variable case FieldElement fieldElement) {
+                    if (_namesMatch(parameterElement.name, fieldElement.name)) {
+                      return fieldElement;
+                    }
+                  }
+                }
+              }
+            }
+          }
+        }
+      }
+    }
+    return null;
+  }
+
+  /// Returns `true` if the [parameterName] and [fieldName] are the same, modulo
+  /// a leading underscore.
+  bool _namesMatch(String? parameterName, String? fieldName) {
+    if (parameterName == null || fieldName == null) {
+      return false;
+    } else if (parameterName == fieldName) {
+      return true;
+    } else if (parameterName.startsWith('_')) {
+      return parameterName.substring(1) == fieldName;
+    } else if (fieldName.startsWith('_')) {
+      return parameterName == fieldName.substring(1);
+    }
+    return false;
+  }
+}
diff --git a/pkg/linter/lib/src/rules/use_primary_constructors.dart b/pkg/linter/lib/src/rules/use_primary_constructors.dart
new file mode 100644
index 0000000..8c77721
--- /dev/null
+++ b/pkg/linter/lib/src/rules/use_primary_constructors.dart
@@ -0,0 +1,133 @@
+// Copyright (c) 2026, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analyzer/analysis_rule/analysis_rule.dart';
+import 'package:analyzer/analysis_rule/rule_context.dart';
+import 'package:analyzer/analysis_rule/rule_visitor_registry.dart';
+import 'package:analyzer/dart/analysis/features.dart';
+import 'package:analyzer/dart/ast/ast.dart';
+import 'package:analyzer/dart/ast/token.dart';
+import 'package:analyzer/dart/ast/visitor.dart';
+import 'package:analyzer/dart/element/element.dart';
+import 'package:analyzer/error/error.dart';
+
+import '../analyzer.dart';
+import '../diagnostic.dart' as diag;
+
+const _desc = r'Use a primary constructor.';
+
+class UsePrimaryConstructors extends AnalysisRule {
+  UsePrimaryConstructors()
+    : super(name: LintNames.use_primary_constructors, description: _desc);
+
+  @override
+  DiagnosticCode get diagnosticCode => diag.usePrimaryConstructors;
+
+  @override
+  void registerNodeProcessors(
+    RuleVisitorRegistry registry,
+    RuleContext context,
+  ) {
+    if (!context.isFeatureEnabled(Feature.primary_constructors)) return;
+    var visitor = _Visitor(this);
+    registry.addClassDeclaration(this, visitor);
+    registry.addEnumDeclaration(this, visitor);
+  }
+}
+
+class _Visitor extends SimpleAstVisitor<void> {
+  final AnalysisRule rule;
+
+  _Visitor(this.rule);
+
+  @override
+  void visitClassDeclaration(ClassDeclaration node) {
+    // There can only be one primary constructor.
+    if (node.namePart is! PrimaryConstructorDeclaration) {
+      _checkMembers(
+        members: node.body.members,
+        containerName: node.namePart.typeName,
+      );
+    }
+  }
+
+  @override
+  void visitEnumDeclaration(EnumDeclaration node) {
+    // There can only be one primary constructor.
+    if (node.namePart is! PrimaryConstructorDeclaration) {
+      _checkMembers(
+        members: node.body.members,
+        containerName: node.namePart.typeName,
+      );
+    }
+  }
+
+  void _checkMembers({
+    required Token containerName,
+    required List<ClassMember> members,
+  }) {
+    var hasConstructor = false;
+    ConstructorDeclaration? root;
+    for (var member in members) {
+      if (member is ConstructorDeclaration) {
+        if (member.externalKeyword != null) {
+          // Classes with an external constructor can't be converted to use a
+          // primary constructor.
+          return;
+        }
+        hasConstructor = true;
+        if (member.factoryKeyword == null) {
+          if (member.redirect == null) {
+            if (root != null) {
+              // If there's more than one non-redirecting generative
+              // constructor, then none of them can be a primary constructor.
+              return;
+            }
+            root = member;
+          }
+        }
+      }
+    }
+    if (!hasConstructor) {
+      // Use an explicit primary constructor rather than a default constructor.
+      rule.reportAtToken(containerName);
+      return;
+    }
+    if (root == null) {
+      // If there aren't any non-redirecting constructors, then there's nothing
+      // to convert.
+      return;
+    }
+    // Otherwise, there's a single non-redirecting generative constructor, so it
+    // can be converted.
+    _reportConstructor(root);
+  }
+
+  void _reportConstructor(ConstructorDeclaration constructor) {
+    var name = constructor.name;
+    if (name != null) {
+      rule.reportAtToken(name);
+      return;
+    }
+    var typeName = constructor.typeName;
+    if (typeName != null) {
+      rule.reportAtNode(typeName);
+      return;
+    }
+    var keyword = constructor.newKeyword;
+    if (keyword != null) {
+      rule.reportAtToken(keyword);
+    }
+  }
+}
+
+extension on ConstructorDeclaration {
+  ConstructorElement? get redirect {
+    var initializer = initializers.lastOrNull;
+    if (initializer is RedirectingConstructorInvocation) {
+      return initializer.element;
+    }
+    return null;
+  }
+}
diff --git a/pkg/linter/lib/src/rules/use_super_parameters.dart b/pkg/linter/lib/src/rules/use_super_parameters.dart
index 24cab6f..074a08b 100644
--- a/pkg/linter/lib/src/rules/use_super_parameters.dart
+++ b/pkg/linter/lib/src/rules/use_super_parameters.dart
@@ -12,7 +12,6 @@
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/error/error.dart';
 import 'package:analyzer/source/source_range.dart';
-import 'package:analyzer/src/dart/ast/extensions.dart'; // ignore: implementation_imports
 import 'package:analyzer/src/utilities/extensions/string.dart'; // ignore: implementation_imports
 
 import '../analyzer.dart';
diff --git a/pkg/linter/lib/src/util/dart_type_utilities.dart b/pkg/linter/lib/src/util/dart_type_utilities.dart
index d09ad5d..1d8b43a 100644
--- a/pkg/linter/lib/src/util/dart_type_utilities.dart
+++ b/pkg/linter/lib/src/util/dart_type_utilities.dart
@@ -162,15 +162,20 @@
 // TODO(srawlins): typedefs and functions in general.
 bool typesAreUnrelated(
   TypeSystem typeSystem,
-  DartType? leftType,
-  DartType? rightType,
+  DartType leftType,
+  DartType rightType,
 ) {
+  // This is harmless.
+  // ignore: parameter_assignments
+  leftType = leftType.extensionTypeErasure;
+  // This is harmless.
+  // ignore: parameter_assignments
+  rightType = rightType.extensionTypeErasure;
+
   // If we don't have enough information, or can't really compare the types,
   // return false as they _might_ be related.
-  if (leftType == null ||
-      leftType.isBottom ||
+  if (leftType.isBottom ||
       leftType is DynamicType ||
-      rightType == null ||
       rightType.isBottom ||
       rightType is DynamicType) {
     return false;
@@ -189,11 +194,11 @@
     );
   } else if (promotedLeftType is TypeParameterType &&
       promotedRightType is TypeParameterType) {
-    return typesAreUnrelated(
-      typeSystem,
-      promotedLeftType.element.bound,
-      promotedRightType.element.bound,
-    );
+    var leftBound = promotedLeftType.element.bound;
+    if (leftBound == null) return false;
+    var rightBound = promotedRightType.element.bound;
+    if (rightBound == null) return false;
+    return typesAreUnrelated(typeSystem, leftBound, rightBound);
   } else if (promotedLeftType is FunctionType) {
     if (_isTypeUnrelatedToFunctionType(promotedRightType)) return true;
   } else if (promotedRightType is FunctionType) {
diff --git a/pkg/linter/messages.yaml b/pkg/linter/messages.yaml
index 01cf153..8f1e967 100644
--- a/pkg/linter/messages.yaml
+++ b/pkg/linter/messages.yaml
@@ -5239,6 +5239,18 @@
         Point(this.x, this.y);
       }
       ```
+  emptyContainerBodies:
+    type: lint
+    parameters:
+      String containerKind: The kind of the container, such as 'class' or 'enum'.
+    problemMessage: "Empty #containerKind bodies should be written using a ';' rather than '{}'."
+    correctionMessage: "Try replacing the #containerKind body with ';'."
+    state:
+      experimental: "3.13"
+    categories: [style]
+    hasPublishedDocs: false
+    deprecatedDetails: |-
+      Use `;` instead of `{}` for empty container (class, enum, etc.) bodies.
   emptyStatements:
     type: lint
     parameters: none
@@ -5853,6 +5865,17 @@
       @reopen
       class C extends I {}
       ```
+  initializeInFieldDeclaration:
+    type: lint
+    parameters: none
+    problemMessage: "Field should be initialized in the field declaration."
+    correctionMessage: "Try initializing the field where it's declared."
+    state:
+      experimental: "3.13"
+    categories: [style]
+    hasPublishedDocs: false
+    deprecatedDetails: |-
+      Initialize fields where they're declared when possible.
   invalidCasePatterns:
     type: lint
     parameters: none
@@ -14854,6 +14877,7 @@
     problemMessage: "Unnecessary use of a null check ('!')."
     correctionMessage: "Try removing the null check."
     state:
+      experimental: "2.12"
       stable: "3.13"
     categories: [brevity, style]
     hasPublishedDocs: true
@@ -16365,6 +16389,17 @@
         );
       }
       ```
+  useDeclaringParameters:
+    type: lint
+    parameters: none
+    problemMessage: "Use a declaring parameter."
+    correctionMessage: "Try using a declaring parameter."
+    state:
+      experimental: "3.13"
+    categories: [style]
+    hasPublishedDocs: false
+    deprecatedDetails: |-
+      Use a declaring parameter everywhere it's valid to do so.
   useDecoratedBox:
     type: lint
     parameters: none
@@ -16917,6 +16952,17 @@
       ```dart
       f(String? key) => {?key: "value"};
       ```
+  usePrimaryConstructors:
+    type: lint
+    parameters: none
+    problemMessage: "Use a primary constructor."
+    correctionMessage: "Try using a primary constructor."
+    state:
+      experimental: "3.13"
+    categories: [style]
+    hasPublishedDocs: false
+    deprecatedDetails: |-
+      Use a primary constructor everywhere it's valid to do so.
   useRawStrings:
     type: lint
     parameters: none
diff --git a/pkg/linter/test/rules/all.dart b/pkg/linter/test/rules/all.dart
index 5d2155a..4d19239 100644
--- a/pkg/linter/test/rules/all.dart
+++ b/pkg/linter/test/rules/all.dart
@@ -114,6 +114,7 @@
 import 'document_ignores_test.dart' as document_ignores;
 import 'empty_catches_test.dart' as empty_catches;
 import 'empty_constructor_bodies_test.dart' as empty_constructor_bodies;
+import 'empty_container_bodies_test.dart' as empty_container_bodies;
 import 'empty_statements_test.dart' as empty_statements;
 import 'eol_at_end_of_file_test.dart' as eol_at_end_of_file;
 import 'erase_dart_type_extension_types_test.dart'
@@ -125,6 +126,8 @@
 import 'implementation_imports_test.dart' as implementation_imports;
 import 'implicit_call_tearoffs_test.dart' as implicit_call_tearoffs;
 import 'implicit_reopen_test.dart' as implicit_reopen;
+import 'initialize_in_field_declaration_test.dart'
+    as initialize_in_field_declaration;
 import 'invalid_case_patterns_test.dart' as invalid_case_patterns;
 import 'invalid_runtime_check_with_js_interop_types_test.dart'
     as invalid_runtime_check_with_js_interop_types;
@@ -308,6 +311,7 @@
 import 'use_build_context_synchronously_test.dart'
     as use_build_context_synchronously;
 import 'use_colored_box_test.dart' as use_colored_box;
+import 'use_declaring_parameters_test.dart' as use_declaring_parameters;
 import 'use_decorated_box_test.dart' as use_decorated_box;
 import 'use_enums_test.dart' as use_enums;
 import 'use_full_hex_values_for_flutter_colors_test.dart'
@@ -324,6 +328,7 @@
     as use_late_for_private_fields_and_variables;
 import 'use_named_constants_test.dart' as use_named_constants;
 import 'use_null_aware_elements_test.dart' as use_null_aware_elements;
+import 'use_primary_constructors_test.dart' as use_primary_constructors;
 import 'use_raw_strings_test.dart' as use_raw_strings;
 import 'use_rethrow_when_possible_test.dart' as use_rethrow_when_possible;
 import 'use_setters_to_change_properties_test.dart'
@@ -415,6 +420,7 @@
   document_ignores.main();
   empty_catches.main();
   empty_constructor_bodies.main();
+  empty_container_bodies.main();
   empty_statements.main();
   eol_at_end_of_file.main();
   erase_dart_type_extension_types.main();
@@ -425,6 +431,7 @@
   implementation_imports.main();
   implicit_call_tearoffs.main();
   implicit_reopen.main();
+  initialize_in_field_declaration.main();
   invalid_case_patterns.main();
   invalid_runtime_check_with_js_interop_types.main();
   join_return_with_assignment.main();
@@ -563,6 +570,7 @@
   unsafe_variance.main();
   use_build_context_synchronously.main();
   use_colored_box.main();
+  use_declaring_parameters.main();
   use_decorated_box.main();
   use_enums.main();
   use_full_hex_values_for_flutter_colors.main();
@@ -573,6 +581,7 @@
   use_late_for_private_fields_and_variables.main();
   use_named_constants.main();
   use_null_aware_elements.main();
+  use_primary_constructors.main();
   use_raw_strings.main();
   use_rethrow_when_possible.main();
   use_setters_to_change_properties.main();
diff --git a/pkg/linter/test/rules/always_declare_return_types_test.dart b/pkg/linter/test/rules/always_declare_return_types_test.dart
index 7d73058..62df182 100644
--- a/pkg/linter/test/rules/always_declare_return_types_test.dart
+++ b/pkg/linter/test/rules/always_declare_return_types_test.dart
@@ -66,7 +66,7 @@
 part of 'a.dart';
 
 augment class A {
-  augment f() { }
+  augment f();
 }
 ''');
 
@@ -84,7 +84,7 @@
     var b = newFile('$testPackageLibPath/b.dart', r'''
 part of 'a.dart';
 
-augment f() { }
+augment f();
 ''');
 
     await assertDiagnosticsInFile(a.path, [lint(16, 1)]);
@@ -101,8 +101,8 @@
     var b = newFile('$testPackageLibPath/b.dart', r'''
 part of 'a.dart';
 
-augment dynamic f() { }
-augment f() { }
+augment dynamic f();
+augment f();
 ''');
 
     await assertDiagnosticsInFile(a.path, [lint(16, 1)]);
diff --git a/pkg/linter/test/rules/annotate_overrides_test.dart b/pkg/linter/test/rules/annotate_overrides_test.dart
index cc227bd..3c0ed95 100644
--- a/pkg/linter/test/rules/annotate_overrides_test.dart
+++ b/pkg/linter/test/rules/annotate_overrides_test.dart
@@ -26,7 +26,7 @@
   int get length;
 }
 
-abstract class C {
+abstract interface class C {
   int get length;
 }
 ''');
@@ -35,7 +35,7 @@
     var b = newFile('$testPackageLibPath/b.dart', r'''
 part of 'a.dart';
 
-augment class C implements HasLength {
+augment abstract interface class C implements HasLength {
   @override
   augment int get length => 42;
 }
@@ -86,7 +86,7 @@
 part of 'a.dart';
 
 augment class B {
-  augment void a() {}
+  augment void a();
 }
 ''');
   }
diff --git a/pkg/linter/test/rules/avoid_annotating_with_dynamic_test.dart b/pkg/linter/test/rules/avoid_annotating_with_dynamic_test.dart
index e6da05a..1ca000a 100644
--- a/pkg/linter/test/rules/avoid_annotating_with_dynamic_test.dart
+++ b/pkg/linter/test/rules/avoid_annotating_with_dynamic_test.dart
@@ -55,7 +55,7 @@
     var a = newFile('$testPackageLibPath/a.dart', r'''
 part 'b.dart';
 
-void f(int i) {}
+void f(int i);
 ''');
 
     var b = newFile('$testPackageLibPath/b.dart', r'''
@@ -84,7 +84,7 @@
 part of 'a.dart';
 
 augment class A {
-  augment void f(dynamic o) { }
+  augment void f(dynamic o);
 }
 ''');
 
@@ -102,7 +102,7 @@
     var b = newFile('$testPackageLibPath/b.dart', r'''
 part of 'a.dart';
 
-augment void f(dynamic o) { }
+augment void f(dynamic o);
 ''');
 
     await assertDiagnosticsInFile(a.path, [lint(23, 9)]);
@@ -119,8 +119,8 @@
     var b = newFile('$testPackageLibPath/b.dart', r'''
 part of 'a.dart';
 
-augment void f(dynamic o) { }
-augment void f(dynamic o) { }
+augment void f(dynamic o);
+augment void f(dynamic o);
 ''');
 
     await assertDiagnosticsInFile(a.path, [lint(23, 9)]);
diff --git a/pkg/linter/test/rules/avoid_equals_and_hash_code_on_mutable_classes_test.dart b/pkg/linter/test/rules/avoid_equals_and_hash_code_on_mutable_classes_test.dart
index 7434884..86bcf0b 100644
--- a/pkg/linter/test/rules/avoid_equals_and_hash_code_on_mutable_classes_test.dart
+++ b/pkg/linter/test/rules/avoid_equals_and_hash_code_on_mutable_classes_test.dart
@@ -115,7 +115,7 @@
 part of 'a.dart';
 
 augment class A {
-  augment int get hashCode => 0;
+  augment int get hashCode;
 }
 ''');
   }
diff --git a/pkg/linter/test/rules/avoid_positional_boolean_parameters_test.dart b/pkg/linter/test/rules/avoid_positional_boolean_parameters_test.dart
index a4de41a..ac5bf4f 100644
--- a/pkg/linter/test/rules/avoid_positional_boolean_parameters_test.dart
+++ b/pkg/linter/test/rules/avoid_positional_boolean_parameters_test.dart
@@ -53,7 +53,7 @@
     await assertNoDiagnostics(r'''
 part of 'a.dart';
 
-augment void f(bool b) { }
+augment void f(bool b);
 ''');
   }
 
@@ -70,7 +70,7 @@
 part of 'a.dart';
 
 augment class A {
-  augment void f(bool b) { }
+  augment void f(bool b);
 }
 ''');
   }
diff --git a/pkg/linter/test/rules/collection_methods_unrelated_type_test.dart b/pkg/linter/test/rules/collection_methods_unrelated_type_test.dart
index d8211b4..dc9cecf 100644
--- a/pkg/linter/test/rules/collection_methods_unrelated_type_test.dart
+++ b/pkg/linter/test/rules/collection_methods_unrelated_type_test.dart
@@ -295,6 +295,47 @@
   @override
   String get lintRule => LintNames.collection_methods_unrelated_type;
 
+  test_contains_extensionType_different_sameRepresentationType() async {
+    await assertNoDiagnostics(r'''
+void m(Set<E1> s, E2 e) {
+  s.contains(e);
+}
+extension type E1(int value) {}
+extension type E2(int value) {}
+''');
+  }
+
+  test_contains_extensionType_different_unrelatedRepresentationType() async {
+    await assertDiagnostics(
+      r'''
+void m(Set<E1> s, E2 e) {
+  s.contains(e);
+}
+extension type E1(int value) {}
+extension type E2(String value) {}
+''',
+      [lint(39, 1)],
+    );
+  }
+
+  test_contains_extensionType_representationType() async {
+    await assertNoDiagnostics(r'''
+void m(Set<int> s, E e) {
+  s.contains(e);
+}
+extension type E(int value) {}
+''');
+  }
+
+  test_contains_extensionType_same() async {
+    await assertNoDiagnostics(r'''
+void m(Set<E> s, E e) {
+  s.contains(e);
+}
+extension type E(int value) {}
+''');
+  }
+
   test_lookup_related_subtype() async {
     await assertNoDiagnostics('var x = <num>{}.lookup(1);');
   }
diff --git a/pkg/linter/test/rules/empty_container_bodies_test.dart b/pkg/linter/test/rules/empty_container_bodies_test.dart
new file mode 100644
index 0000000..50230c1
--- /dev/null
+++ b/pkg/linter/test/rules/empty_container_bodies_test.dart
@@ -0,0 +1,74 @@
+// Copyright (c) 2026, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../rule_test_support.dart';
+
+void main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(EmptyContainerBodiesTest);
+  });
+}
+
+@reflectiveTest
+class EmptyContainerBodiesTest extends LintRuleTest {
+  @override
+  String get lintRule => LintNames.empty_container_bodies;
+
+  test_class_notEmpty() async {
+    await assertNoDiagnostics(r'''
+class C {
+  C();
+}
+''');
+  }
+
+  test_class_onDifferentLines() async {
+    await assertDiagnosticsFromMarkdown(r'''
+class C [!{
+}!]
+''');
+  }
+
+  test_class_onSameLine() async {
+    await assertDiagnosticsFromMarkdown(r'''
+class C [!{}!]
+''');
+  }
+
+  test_class_withComment() async {
+    await assertNoDiagnostics(r'''
+class C {
+  // eol
+}
+''');
+  }
+
+  test_class_withDocComment() async {
+    await assertNoDiagnostics(r'''
+class C {
+  /// doc
+}
+''');
+  }
+
+  test_extension() async {
+    await assertDiagnosticsFromMarkdown(r'''
+extension on String [!{}!]
+''');
+  }
+
+  test_extensionType() async {
+    await assertDiagnosticsFromMarkdown(r'''
+extension type E(String self) [!{}!]
+''');
+  }
+
+  test_mixin() async {
+    await assertDiagnosticsFromMarkdown(r'''
+mixin M [!{}!]
+''');
+  }
+}
diff --git a/pkg/linter/test/rules/initialize_in_field_declaration_test.dart b/pkg/linter/test/rules/initialize_in_field_declaration_test.dart
new file mode 100644
index 0000000..570a118
--- /dev/null
+++ b/pkg/linter/test/rules/initialize_in_field_declaration_test.dart
@@ -0,0 +1,60 @@
+// Copyright (c) 2026, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../rule_test_support.dart';
+
+void main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(InitializeInFieldDeclarationTest);
+  });
+}
+
+@reflectiveTest
+class InitializeInFieldDeclarationTest extends LintRuleTest {
+  @override
+  String get lintRule => LintNames.initialize_in_field_declaration;
+
+  test_class_doesNotReferenceParameter() async {
+    await assertNoDiagnostics(r'''
+class C(int x) {
+  this : y = 0;
+
+  int y;
+}
+''');
+  }
+
+  test_class_lateField() async {
+    await assertNoDiagnostics(r'''
+class C(int x) {
+  this : y = x;
+
+  late int y;
+}
+''');
+  }
+
+  test_class_multipleInitializers() async {
+    await assertDiagnosticsFromMarkdown(r'''
+class C(int x, int z) {
+  this : [!y!] = x, w = 0;
+
+  int y;
+  int w;
+}
+''');
+  }
+
+  test_class_onDifferentLines() async {
+    await assertDiagnosticsFromMarkdown(r'''
+class C(int x) {
+  this : [!y!] = x;
+
+  int y;
+}
+''');
+  }
+}
diff --git a/pkg/linter/test/rules/non_constant_identifier_names_test.dart b/pkg/linter/test/rules/non_constant_identifier_names_test.dart
index 2d341ed..8712690 100644
--- a/pkg/linter/test/rules/non_constant_identifier_names_test.dart
+++ b/pkg/linter/test/rules/non_constant_identifier_names_test.dart
@@ -300,7 +300,7 @@
     await assertNoDiagnostics(r'''
 part of 'a.dart';
 
-augment void Ff() { }
+augment void Ff();
 ''');
   }
 
@@ -314,7 +314,7 @@
     await assertNoDiagnostics(r'''
 part of 'a.dart';
 
-augment void f({String? Ss}) { }
+augment void f({String? Ss});
 ''');
   }
 
@@ -329,7 +329,7 @@
       r'''
 part of 'a.dart';
 
-augment void f(String? Ss, [int? Xx]) { }
+augment void f(String? Ss, [int? Xx]);
 ''',
       [lint(42, 2), lint(52, 2)],
     );
@@ -348,7 +348,7 @@
 part of 'a.dart';
 
 augment class A {
-  augment int get Gg => 2;
+  augment int get Gg;
 }
 ''');
   }
@@ -366,7 +366,7 @@
 part of 'a.dart';
 
 augment class A {
-  augment void Mm() { }
+  augment void Mm();
 }
 ''');
   }
@@ -384,7 +384,7 @@
 part of 'a.dart';
 
 augment class A {
-  augment void m({String? Ss}) { }
+  augment void m({String? Ss});
 }
 ''');
   }
@@ -403,7 +403,7 @@
 part of 'a.dart';
 
 augment class A {
-  augment void m(String? Ss, [int? Xx]) { }
+  augment void m(String? Ss, [int? Xx]);
 }
 ''',
       [lint(62, 2), lint(72, 2)],
diff --git a/pkg/linter/test/rules/prefer_void_to_null_test.dart b/pkg/linter/test/rules/prefer_void_to_null_test.dart
index 262730d..f7f4cb5 100644
--- a/pkg/linter/test/rules/prefer_void_to_null_test.dart
+++ b/pkg/linter/test/rules/prefer_void_to_null_test.dart
@@ -46,7 +46,7 @@
     await assertNoDiagnostics(r'''
 part of 'a.dart';
 
-augment Future<Null>? f() => null;
+augment Future<Null>? f();
 ''');
   }
 
@@ -63,7 +63,7 @@
 part of 'a.dart';
 
 augment class A {
-  augment Future<Null>? get v => null;
+  augment Future<Null>? get v;
 }
 ''');
   }
@@ -81,7 +81,7 @@
 part of 'a.dart';
 
 augment class A {
-  augment Future<Null>? f() => null;
+  augment Future<Null>? f();
 }
 ''');
   }
@@ -96,7 +96,7 @@
     await assertNoDiagnostics(r'''
 part of 'a.dart';
 
-augment Future<Null>? get v => null;
+augment Future<Null>? get v;
 ''');
   }
 
diff --git a/pkg/linter/test/rules/type_annotate_public_apis_test.dart b/pkg/linter/test/rules/type_annotate_public_apis_test.dart
index 7d28824..7794031 100644
--- a/pkg/linter/test/rules/type_annotate_public_apis_test.dart
+++ b/pkg/linter/test/rules/type_annotate_public_apis_test.dart
@@ -121,7 +121,7 @@
 part of 'a.dart';
 
 augment class A {
-  augment void f(x) { }
+  augment void f(x);
 }
 ''');
 
@@ -139,7 +139,7 @@
     var b = newFile('$testPackageLibPath/b.dart', r'''
 part of 'a.dart';
 
-augment void f(x) { }
+augment void f(x);
 ''');
 
     await assertDiagnosticsInFile(a.path, [lint(23, 1)]);
diff --git a/pkg/linter/test/rules/unnecessary_const_in_enum_constructor_test.dart b/pkg/linter/test/rules/unnecessary_const_in_enum_constructor_test.dart
index dc007d7..4387eb8 100644
--- a/pkg/linter/test/rules/unnecessary_const_in_enum_constructor_test.dart
+++ b/pkg/linter/test/rules/unnecessary_const_in_enum_constructor_test.dart
@@ -17,7 +17,13 @@
   @override
   String get lintRule => LintNames.unnecessary_const_in_enum_constructor;
 
-  test_primary() async {
+  test_primary_inClass() async {
+    await assertNoDiagnostics(r'''
+class const C();
+''');
+  }
+
+  test_primary_inEnum() async {
     await assertDiagnosticsFromMarkdown(r'''
 enum [!const!] E(final int i) {
   a(1), b(2);
@@ -25,7 +31,15 @@
 ''');
   }
 
-  test_secondary() async {
+  test_secondary_inClass() async {
+    await assertNoDiagnostics(r'''
+class C {
+  const C();
+}
+''');
+  }
+
+  test_secondary_inEnum() async {
     await assertDiagnosticsFromMarkdown(r'''
 enum E {
   a(1), b(2);
diff --git a/pkg/linter/test/rules/unrelated_type_equality_checks_test.dart b/pkg/linter/test/rules/unrelated_type_equality_checks_test.dart
index b364ecc..1e2ed5d 100644
--- a/pkg/linter/test/rules/unrelated_type_equality_checks_test.dart
+++ b/pkg/linter/test/rules/unrelated_type_equality_checks_test.dart
@@ -46,31 +46,39 @@
 ''');
   }
 
-  test_extension_types() async {
+  test_extensionTypes_same() async {
+    await assertNoDiagnostics(r'''
+void m(A a, B b) {
+  if (a == b) {}
+}
+extension type A(String value) {}
+extension type B(String value) {}
+''');
+  }
+
+  test_extensionTypes_sameRepresentationType() async {
+    await assertNoDiagnostics(r'''
+void m(A a, B b) {
+  if (a == b) {}
+}
+extension type A(String value) {}
+extension type B(String value) {}
+''');
+  }
+
+  test_extensionTypes_unrelatedRepresentationType() async {
     await assertDiagnostics(
       r'''
 void m(A a, B b) {
   if (a == b) {}
 }
 extension type A(String value) {}
-extension type B(String value) {}
+extension type B(int value) {}
 ''',
       [lint(27, 2)],
     );
   }
 
-  test_extension_types_ok() async {
-    await assertNoDiagnostics(r'''
-void m(A a1, A a2, B b) {
-  if (a1 == a2) {}
-  if (a1 == b) {}
-  if (b == a1) {}
-}
-extension type A(String value) {}
-extension type B(String value) implements A {}
-''');
-  }
-
   test_fixnum_int32_leftSide() async {
     await assertNoDiagnostics(r'''
 import 'package:fixnum/fixnum.dart';
diff --git a/pkg/linter/test/rules/use_declaring_parameters_test.dart b/pkg/linter/test/rules/use_declaring_parameters_test.dart
new file mode 100644
index 0000000..aee8f91
--- /dev/null
+++ b/pkg/linter/test/rules/use_declaring_parameters_test.dart
@@ -0,0 +1,207 @@
+// Copyright (c) 2026, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../rule_test_support.dart';
+
+void main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(UseDeclaringParametersTest);
+  });
+}
+
+@reflectiveTest
+class UseDeclaringParametersTest extends LintRuleTest {
+  @override
+  String get lintRule => LintNames.use_declaring_parameters;
+
+  test_assignedInBody_requiredPositional() async {
+    await assertDiagnosticsFromMarkdown(r'''
+class C(int [!i!]) {
+  int i = 0;
+
+  this {
+    this.i = i;
+  }
+}
+''');
+  }
+
+  test_differentName_requiredPositional() async {
+    await assertNoDiagnostics(r'''
+class C(int i) {
+  int x;
+
+  this : x = i;
+}
+''');
+  }
+
+  test_differentType_requiredPositional() async {
+    await assertNoDiagnostics(r'''
+class C(int? i) {
+  int x;
+
+  this : x = i ?? 0;
+}
+''');
+  }
+
+  test_fieldFormalParameter_differentType() async {
+    await assertNoDiagnostics(r'''
+class C(int this.i) {
+  num i;
+}
+''');
+  }
+
+  test_fieldFormalParameter_noType() async {
+    await assertDiagnosticsFromMarkdown(r'''
+class C(this.[!i!]) {
+  int i;
+}
+''');
+  }
+
+  test_fieldFormalParameter_sameType() async {
+    await assertDiagnosticsFromMarkdown(r'''
+class C(int this.[!i!]) {
+  int i;
+}
+''');
+  }
+
+  test_finalPrivateField_requiredPositional() async {
+    await assertDiagnosticsFromMarkdown(r'''
+class C(int [!i!]) {
+  final int _i;
+
+  this : _i = i;
+}
+''');
+  }
+
+  test_finalPublicField_requiredPositional() async {
+    await assertDiagnosticsFromMarkdown(r'''
+class C(int [!i!]) {
+  final int i;
+
+  this : i = i;
+}
+''');
+  }
+
+  test_nonFinalPrivateField_optionalNamed() async {
+    await assertDiagnosticsFromMarkdown(r'''
+class C({int [!i!] = 0}) {
+  int _i;
+
+  this : _i = i;
+}
+''');
+  }
+
+  test_nonFinalPrivateField_optionalPositional() async {
+    await assertDiagnosticsFromMarkdown(r'''
+class C([int [!i!] = 0]) {
+  int _i;
+
+  this : _i = i;
+}
+''');
+  }
+
+  test_nonFinalPrivateField_requiredNamed() async {
+    await assertDiagnosticsFromMarkdown(r'''
+class C({required int [!i!]}) {
+  int _i;
+
+  this : _i = i;
+}
+''');
+  }
+
+  test_nonFinalPrivateField_requiredPositional() async {
+    await assertDiagnosticsFromMarkdown(r'''
+class C(int [!i!]) {
+  int _i;
+
+  this : _i = i;
+}
+''');
+  }
+
+  test_nonFinalPublicField_optionalNamed() async {
+    await assertDiagnosticsFromMarkdown(r'''
+class C({int [!i!] = 0}) {
+  final int i;
+
+  this : i = i;
+}
+''');
+  }
+
+  test_nonFinalPublicField_optionalPositional() async {
+    await assertDiagnosticsFromMarkdown(r'''
+class C([int [!i!] = 0]) {
+  final int i;
+
+  this : i = i;
+}
+''');
+  }
+
+  test_nonFinalPublicField_requiredNamed() async {
+    await assertDiagnosticsFromMarkdown(r'''
+class C({required int [!i!]}) {
+  final int i;
+
+  this : i = i;
+}
+''');
+  }
+
+  test_nonFinalPublicField_requiredPositional() async {
+    await assertDiagnosticsFromMarkdown(r'''
+class C(int [!i!]) {
+  final int i;
+
+  this : i = i;
+}
+''');
+  }
+
+  test_notAssigned_optionalNamed() async {
+    await assertNoDiagnostics(r'''
+class C({int i = 0});
+''');
+  }
+
+  test_notAssigned_optionalPositional() async {
+    await assertNoDiagnostics(r'''
+class C([int i = 0]);
+''');
+  }
+
+  test_notAssigned_requiredNamed() async {
+    await assertNoDiagnostics(r'''
+class C({required int i});
+''');
+  }
+
+  test_notAssigned_requiredPositional() async {
+    await assertNoDiagnostics(r'''
+class C(int i);
+''');
+  }
+
+  test_superParameter() async {
+    await assertNoDiagnostics(r'''
+class C(super.i) extends B;
+
+class B(var int i);
+''');
+  }
+}
diff --git a/pkg/linter/test/rules/use_primary_constructors_test.dart b/pkg/linter/test/rules/use_primary_constructors_test.dart
new file mode 100644
index 0000000..bb16df8
--- /dev/null
+++ b/pkg/linter/test/rules/use_primary_constructors_test.dart
@@ -0,0 +1,162 @@
+// Copyright (c) 2026, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+//import 'package:analyzer/src/diagnostic/diagnostic.dart' as diag;
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../rule_test_support.dart';
+
+void main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(UsePrimaryConstructorsInClassTest);
+    defineReflectiveTests(UsePrimaryConstructorsInEnumTest);
+  });
+}
+
+@reflectiveTest
+class UsePrimaryConstructorsInClassTest extends LintRuleTest {
+  @override
+  String get lintRule => LintNames.use_primary_constructors;
+
+  test_class_withDefaultConstructor() async {
+    await assertDiagnosticsFromMarkdown(r'''
+class [!C!];
+''');
+  }
+
+  test_class_withExternalConstructor() async {
+    await assertNoDiagnostics(r'''
+class C {
+  external C();
+}
+''');
+  }
+
+  test_class_withFactory() async {
+    await assertDiagnosticsFromMarkdown(r'''
+class C {
+  C.[!a!]();
+  factory C.b() => C.a();
+}
+''');
+  }
+
+  test_class_withMultipleLevelsOfRedirect() async {
+    await assertDiagnosticsFromMarkdown(r'''
+class C {
+  C.[!a!]();
+  C.b() : this.a();
+  C.c() : this.b();
+}
+''');
+  }
+
+  test_class_withMultipleRoots() async {
+    await assertNoDiagnostics(r'''
+class C {
+  C.a();
+  C.b();
+}
+''');
+  }
+
+  test_class_withPrimaryConstructor() async {
+    await assertNoDiagnostics(r'''
+class C();
+''');
+  }
+
+  test_class_withSingleGenerativeConstructor() async {
+    await assertDiagnosticsFromMarkdown(r'''
+class C {
+  [!C!]();
+}
+''');
+  }
+
+  test_class_withSingleLevelOfRedirect() async {
+    await assertDiagnosticsFromMarkdown(r'''
+class C {
+  C.[!a!]();
+  C.b() : this.a();
+}
+''');
+  }
+}
+
+@reflectiveTest
+class UsePrimaryConstructorsInEnumTest extends LintRuleTest {
+  @override
+  String get lintRule => LintNames.use_primary_constructors;
+
+  test_enum_withDefaultConstructor() async {
+    await assertDiagnosticsFromMarkdown(r'''
+enum [!E!] {
+  a, b, c
+}
+''');
+  }
+
+  test_enum_withFactory() async {
+    await assertDiagnosticsFromMarkdown(r'''
+enum E {
+  a, b, c;
+
+  [!E!]();
+  factory E.f() => b;
+}
+''');
+  }
+
+  test_enum_withMultipleLevelsOfRedirect() async {
+    await assertDiagnosticsFromMarkdown(r'''
+enum E {
+  a.e(), b.f(), c.g();
+
+  E.[!e!]();
+  E.f() : this.e();
+  E.g() : this.f();
+}
+''');
+  }
+
+  test_enum_withPrimaryConstructor() async {
+    await assertNoDiagnostics(r'''
+enum E() {
+  a, b, c;
+}
+''');
+  }
+
+  test_enum_withSingleGenerativeConstructor() async {
+    await assertDiagnosticsFromMarkdown(r'''
+enum E {
+  a, b, c;
+
+  [!E!]();
+}
+''');
+  }
+
+  test_enum_withSingleLevelOfRedirect() async {
+    await assertDiagnosticsFromMarkdown(r'''
+enum E {
+  a.e(), b.f();
+
+  E.[!e!]();
+  E.f() : this.e();
+}
+''');
+  }
+
+  test_enums_withExternalConstructor() async {
+    await assertNoDiagnostics(r'''
+enum E {
+  a, b, c;
+
+  external E();
+}
+''');
+  }
+}
diff --git a/pkg/linter/tool/machine/rules.json b/pkg/linter/tool/machine/rules.json
index 78355be..74bb0c2 100644
--- a/pkg/linter/tool/machine/rules.json
+++ b/pkg/linter/tool/machine/rules.json
@@ -2315,6 +2315,19 @@
     "sinceDartSdk": "2.16"
   },
   {
+    "name": "simple_directive_paths",
+    "description": "Use simple directive paths.",
+    "categories": [
+      "style"
+    ],
+    "state": "stable",
+    "incompatible": [],
+    "sets": [],
+    "fixStatus": "hasFix",
+    "details": "**PREFER** simple directive paths.\n\nUsing simple directive paths (avoiding redundant `./` or backtracking `../`\nsegments) makes the code cleaner, more consistent, and easier to read. It\nalso reduces the risk of confusion when resolving paths relative to the\nsource file.\n\n**BAD:**\n```dart\nimport '../src/bar.dart';\n```\n\n**GOOD:**\n```dart\nimport 'bar.dart';\n```",
+    "sinceDartSdk": "3.12"
+  },
+  {
     "name": "simplify_variable_pattern",
     "description": "Avoid unnecessary member names in variable patterns.",
     "categories": [
@@ -2324,7 +2337,7 @@
     "incompatible": [],
     "sets": [],
     "fixStatus": "hasFix",
-    "details": "**AVOID** redundant member names in variable patterns.\n\nWhen a variable pattern declares a variable with the same name as a member\nof the matched type, the member name is redundant and can be omitted.\n\n**BAD:**\n```dart\nvoid f(Object o) {\n  if (o case String([!length!]: length)) {\n    print('string is $length characters long');\n  }\n}\n```\n\n**GOOD:**\n```dart\nvoid f(Object o) {\n  if (o case String(:var length)) {\n    print('string is $length characters long');\n  }\n}\n```",
+    "details": "**AVOID** redundant member names in variable patterns.\n\nWhen a variable pattern declares a variable with the same name as a member\nof the matched type, the member name is redundant and can be omitted.\n\n**BAD:**\n```dart\nvoid f(Object o) {\n  if (o case String([!length!]: var length)) {\n    print('string is $length characters long');\n  }\n}\n```\n\n**GOOD:**\n```dart\nvoid f(Object o) {\n  if (o case String(:var length)) {\n    print('string is $length characters long');\n  }\n}\n```",
     "sinceDartSdk": "3.11"
   },
   {
@@ -2667,6 +2680,20 @@
     "sinceDartSdk": "2.0"
   },
   {
+    "name": "unnecessary_const_in_enum_constructor",
+    "description": "Don't use an explicit `const` in a generative enum constructor.",
+    "categories": [
+      "brevity",
+      "style"
+    ],
+    "state": "stable",
+    "incompatible": [],
+    "sets": [],
+    "fixStatus": "hasFix",
+    "details": "Don't use an explicit `const` in a generative enum constructor. Generative\nenum constructors are implicitly `const`.\n\n**BAD:**\n```dart\nenum const E(final int i) {\n  a(1), b(2);\n}\n```\n\n```dart\nenum E {\n  a(1), b(2);\n\n  const E(this.i);\n\n  final int i;\n}\n```\n\n**GOOD:**\n```dart\nenum E(final int i) {\n  a(1), b(2);\n}\n```\n\n```dart\nenum E {\n  a(1), b(2);\n\n  E(this.i);\n\n  final int i;\n}\n```",
+    "sinceDartSdk": "3.13"
+  },
+  {
     "name": "unnecessary_constructor_name",
     "description": "Unnecessary `.new` constructor name.",
     "categories": [
@@ -2818,7 +2845,7 @@
     "state": "stable",
     "incompatible": [],
     "sets": [],
-    "fixStatus": "needsFix",
+    "fixStatus": "hasFix",
     "details": "Avoid null aware operators for members defined in an extension on a nullable\ntype.\n\n**BAD:**\n\n```dart\nextension E on int? {\n  int m() => 1;\n}\nf(int? i) => i?.m();\n```\n\n**GOOD:**\n\n```dart\nextension E on int? {\n  int m() => 1;\n}\nf(int? i) => i.m();\n```",
     "sinceDartSdk": "2.18"
   },
@@ -2829,7 +2856,7 @@
       "brevity",
       "style"
     ],
-    "state": "experimental",
+    "state": "stable",
     "incompatible": [],
     "sets": [],
     "fixStatus": "hasFix",
@@ -2974,6 +3001,20 @@
     "sinceDartSdk": "2.18"
   },
   {
+    "name": "unnecessary_type_name_in_constructor",
+    "description": "Don't use an explicit type name in a constructor.",
+    "categories": [
+      "brevity",
+      "style"
+    ],
+    "state": "stable",
+    "incompatible": [],
+    "sets": [],
+    "fixStatus": "hasFix",
+    "details": "Don't include the type name in a constructor declaration. It isn't\nnecessary, and the code is shorter and cleaner without it.\n\n**BAD:**\n```dart\nclass C {\n  C();\n  C.name();\n}\n```\n\n**GOOD:**\n```dart\nclass C {\n  new ();\n  new name();\n}\n```",
+    "sinceDartSdk": "3.13"
+  },
+  {
     "name": "unnecessary_unawaited",
     "description": "Unnecessary use of 'unawaited'.",
     "categories": [
@@ -3376,4 +3417,4 @@
     "details": "**DON'T** assign to `void`.\n\n**BAD:**\n```dart\nclass A<T> {\n  T value;\n  void test(T arg) { }\n}\n\nvoid main() {\n  A<void> a = A<void>();\n  a.value = 1; // LINT\n  a.test(1); // LINT\n}\n```",
     "sinceDartSdk": "2.0"
   }
-]
+]
\ No newline at end of file
diff --git a/pkg/native_compiler/lib/back_end/arm64/assembler.dart b/pkg/native_compiler/lib/back_end/arm64/assembler.dart
index 324055c..d954bc5 100644
--- a/pkg/native_compiler/lib/back_end/arm64/assembler.dart
+++ b/pkg/native_compiler/lib/back_end/arm64/assembler.dart
@@ -566,6 +566,16 @@
       } else {
         loadFromPool(reg, value as Object);
       }
+    } else if (value.isNull) {
+      mov(reg, nullReg);
+    } else if (value.isBool) {
+      addImmediate(
+        reg,
+        nullReg,
+        value.boolValue
+            ? trueOffsetFromNull(wordSize)
+            : falseOffsetFromNull(wordSize),
+      );
     } else {
       loadFromPool(reg, value as Object);
     }
@@ -932,6 +942,14 @@
     adds(ZR, rn, o, sz);
   }
 
+  void neg(Register rd, Operand o, [OperandSize sz = OperandSize.s64]) {
+    sub(rd, ZR, o, sz);
+  }
+
+  void negs(Register rd, Operand o, [OperandSize sz = OperandSize.s64]) {
+    subs(rd, ZR, o, sz);
+  }
+
   void _emitAddSub(
     Register rd,
     Register rn,
@@ -1090,6 +1108,86 @@
     );
   }
 
+  void csel(
+    Register rd,
+    Register rn,
+    Register rm,
+    Condition condition, [
+    OperandSize sz = OperandSize.s64,
+  ]) {
+    _emitConditionalSelect(B23 | B25 | B27 | B28, rd, rn, rm, condition, sz);
+  }
+
+  void csinc(
+    Register rd,
+    Register rn,
+    Register rm,
+    Condition condition, [
+    OperandSize sz = OperandSize.s64,
+  ]) {
+    _emitConditionalSelect(
+      B10 | B23 | B25 | B27 | B28,
+      rd,
+      rn,
+      rm,
+      condition,
+      sz,
+    );
+  }
+
+  void csinv(
+    Register rd,
+    Register rn,
+    Register rm,
+    Condition condition, [
+    OperandSize sz = OperandSize.s64,
+  ]) {
+    _emitConditionalSelect(
+      B23 | B25 | B27 | B28 | B30,
+      rd,
+      rn,
+      rm,
+      condition,
+      sz,
+    );
+  }
+
+  void csneg(
+    Register rd,
+    Register rn,
+    Register rm,
+    Condition condition, [
+    OperandSize sz = OperandSize.s64,
+  ]) {
+    _emitConditionalSelect(
+      B10 | B23 | B25 | B27 | B28 | B30,
+      rd,
+      rn,
+      rm,
+      condition,
+      sz,
+    );
+  }
+
+  void _emitConditionalSelect(
+    int opcode,
+    Register rd,
+    Register rn,
+    Register rm,
+    Condition condition,
+    OperandSize sz,
+  ) {
+    assert(sz.is32or64);
+    emit(
+      opcode |
+          rd.encodingRd() |
+          rn.encodingRn() |
+          rm.encodingRm() |
+          (condition.encoding << 12) |
+          (sz.is64 ? B31 : 0),
+    );
+  }
+
   void bfm(
     Register rd,
     Register rn,
@@ -1780,6 +1878,28 @@
           rn.encodingRn(),
     );
   }
+
+  void scvtf(
+    FPRegister rd,
+    Register rn, [
+    OperandSize srcSize = OperandSize.s64,
+    OperandSize dstSize = OperandSize.s64,
+  ]) {
+    assert(srcSize.is32or64);
+    assert(dstSize.is16or32or64);
+    emit(
+      B17 |
+          B21 |
+          B25 |
+          B26 |
+          B27 |
+          B28 |
+          rd.encodingRd |
+          rn.encodingRn() |
+          (dstSize.is64 ? B22 : (dstSize.is32 ? 0 : (B22 | B23))) |
+          (srcSize.is64 ? B31 : 0),
+    );
+  }
 }
 
 bool _isUint(int numBits, int value) => (value >>> numBits) == 0;
@@ -1808,6 +1928,7 @@
 }
 
 extension on FPRegister {
+  int get encodingRd => index;
   int get encodingRt => index;
 }
 
diff --git a/pkg/native_compiler/lib/back_end/arm64/code_generator.dart b/pkg/native_compiler/lib/back_end/arm64/code_generator.dart
index d47c2a3..44907d3 100644
--- a/pkg/native_compiler/lib/back_end/arm64/code_generator.dart
+++ b/pkg/native_compiler/lib/back_end/arm64/code_generator.dart
@@ -239,7 +239,8 @@
       argumentsDescriptorReg,
       argumentsDescriptorReg,
       Immediate(
-        vmOffsets.ArgumentsDescriptor_first_named_entry_offset +
+        vmOffsets.ArgumentsDescriptor_first_named_entry_offset -
+            heapObjectTag +
             vmOffsets.ArgumentsDescriptor_position_offset,
       ),
     );
@@ -482,7 +483,38 @@
 
   @override
   void visitComparison(Comparison instr) {
-    _asm.unimplemented('Unimplemented: code generation for Comparison');
+    final left = inputReg(instr, 0);
+    final right = instr.right;
+    final result = outputReg(instr);
+    switch (instr.op) {
+      case ComparisonOpcode.equal:
+      case ComparisonOpcode.notEqual:
+      case ComparisonOpcode.intEqual:
+      case ComparisonOpcode.intNotEqual:
+      case ComparisonOpcode.intLess:
+      case ComparisonOpcode.intLessOrEqual:
+      case ComparisonOpcode.intGreater:
+      case ComparisonOpcode.intGreaterOrEqual:
+        final (operand, negated) = _generateAddSubRightOperand(instr, right);
+        if (negated) {
+          _asm.cmn(left, operand);
+        } else {
+          _asm.cmp(left, operand);
+        }
+        break;
+      case ComparisonOpcode.intTestIsZero:
+      case ComparisonOpcode.intTestIsNotZero:
+        final operand = _generateLogicalRightOperand(instr, right);
+        _asm.tst(left, operand);
+        break;
+      default:
+        _asm.unimplemented(
+          'Unimplemented: code generation for Comparison ${instr.op}',
+        );
+    }
+    _asm.loadConstant(result, ConstantValue.fromBool(true));
+    _asm.loadConstant(tempReg, ConstantValue.fromBool(false));
+    _asm.csel(result, result, tempReg, instr.op.conditionCode);
   }
 
   @override
@@ -687,7 +719,9 @@
 
   bool _canBeSmi(Definition def) => switch (def) {
     Constant(:var value) => value.isInt && objectLayout.isSmi(value.intValue),
-    _ => def.type is IntType || const IntType().isSubtypeOf(def.type),
+    Definition(type: IntType()) => true,
+    Definition(type: ExtendedType()) => false,
+    Definition(:var type) => const IntType().isSubtypeOf(type),
   };
 
   void _writeBarrier(
@@ -1137,7 +1171,11 @@
 
   @override
   void visitTypeArguments(TypeArguments instr) {
-    _asm.unimplemented('Unimplemented: code generation for TypeArguments');
+    _asm.loadConstant(
+      InstantiateTypeArgumentsStub.uninstantiatedTypeArgumentsReg,
+      ConstantValue(TypeArgumentsConstant(instr.types)),
+    );
+    _asm.callVmStub(StubCode.InstantiateTypeArguments);
   }
 
   @override
@@ -1247,37 +1285,16 @@
   @override
   void visitAllocateClosure(AllocateClosure instr) {
     final function = instr.function;
-    final hasDelayedTypeArgs = function.hasFunctionTypeParameters;
-    final hasInstantiatorTypeArgs = switch (function) {
-      LocalFunction() => containsClassTypeParameters(
-        function.functionNode!.computeFunctionType(ast.Nullability.nonNullable),
-      ),
-      TearOffFunction() =>
-        function.member.isInstanceMember &&
-            containsClassTypeParameters(
-              function.member.function!.computeFunctionType(
-                ast.Nullability.nonNullable,
-              ),
-            ),
-    };
-    final hasFunctionTypeArgs = switch (function) {
-      LocalFunction() => hasGenericEnclosingFunction(function.localFunction),
-      TearOffFunction() => false,
-    };
-    final numElements =
-        (hasDelayedTypeArgs ? 1 : 0) +
-        (hasInstantiatorTypeArgs ? 1 : 0) +
-        (hasFunctionTypeArgs ? 1 : 0) +
-        1 /* context */;
+    final closureLayout = instr.closureLayout;
     final lengthAndFlags = vmOffsets.encodeClosureLengthAndFlags(
-      numElements,
-      hasDelayedTypeArgs: hasDelayedTypeArgs,
-      hasInstantiatorTypeArgs: hasInstantiatorTypeArgs,
-      hasFunctionTypeArgs: hasFunctionTypeArgs,
+      closureLayout.length,
+      hasDelayedTypeArgs: closureLayout.hasDelayedTypeArgs,
+      hasInstantiatorTypeArgs: closureLayout.hasClassTypeArgs,
+      hasFunctionTypeArgs: closureLayout.hasFunctionTypeArgs,
     );
     final instanceSize = roundUp(
       vmOffsets.Closure_elementsStartOffset +
-          numElements * objectLayout.compressedWordSize,
+          closureLayout.length * objectLayout.compressedWordSize,
       objectAlignment(wordSize),
     );
 
@@ -1321,8 +1338,7 @@
       _asm.fieldAddress(resultReg, vmOffsets.Closure_length_and_flags_offset),
     );
     _asm.str(ZR, _asm.fieldAddress(resultReg, vmOffsets.Closure_hash_offset));
-    // TODO: initialize the rest of the fields.
-    assert(instr.inputCount == 0);
+    // TODO: initialize delayed type arguments.
     _asm.bind(done);
   }
 
@@ -1673,9 +1689,21 @@
 
   @override
   void visitUnaryIntOp(UnaryIntOp instr) {
-    _asm.unimplemented(
-      'Unimplemented: code generation for UnaryIntOp ${instr.op.token}',
-    );
+    final operandReg = inputReg(instr, 0);
+    switch (instr.op) {
+      case .neg:
+        _asm.neg(outputReg(instr), operandReg);
+        break;
+      case .bitNot:
+        _asm.mvn(outputReg(instr), operandReg);
+        break;
+      case .toDouble:
+        _asm.scvtf(outputFPReg(instr), operandReg);
+      default:
+        _asm.unimplemented(
+          'Unimplemented: code generation for UnaryIntOp ${instr.op.token}',
+        );
+    }
   }
 
   @override
diff --git a/pkg/native_compiler/lib/back_end/arm64/constraints.dart b/pkg/native_compiler/lib/back_end/arm64/constraints.dart
index eef32b1..f7aa4319 100644
--- a/pkg/native_compiler/lib/back_end/arm64/constraints.dart
+++ b/pkg/native_compiler/lib/back_end/arm64/constraints.dart
@@ -296,10 +296,17 @@
 
   @override
   InstructionConstraints? visitTypeArguments(TypeArguments instr) =>
-      InstructionConstraints(anyCpuRegister, [
-        anyRegisterOrImmediate(instr.inputDefAt(0)),
-        anyRegisterOrImmediate(instr.inputDefAt(1)),
-      ]);
+      const InstructionConstraints(
+        InstantiateTypeArgumentsStub.resultTypeArgumentsReg,
+        [
+          InstantiateTypeArgumentsStub.instantiatorTypeArgumentsReg,
+          InstantiateTypeArgumentsStub.functionTypeArgumentsReg,
+        ],
+        [
+          InstantiateTypeArgumentsStub.uninstantiatedTypeArgumentsReg,
+          InstantiateTypeArgumentsStub.scratchReg,
+        ],
+      );
 
   @override
   InstructionConstraints? visitTypeLiteral(TypeLiteral instr) =>
@@ -323,18 +330,11 @@
 
   @override
   InstructionConstraints? visitAllocateClosure(AllocateClosure instr) =>
-      InstructionConstraints(
-        AllocationStub.resultReg,
-        List<Constraint?>.generate(
-          instr.inputCount,
-          (int i) => anyLocationOrImmediate(instr.inputDefAt(i)),
-        ),
-        const [
-          AllocationStub.tagsReg,
-          AllocationStub.scratch1Reg,
-          AllocationStub.scratch2Reg,
-        ],
-      );
+      const InstructionConstraints(AllocationStub.resultReg, [], [
+        AllocationStub.tagsReg,
+        AllocationStub.scratch1Reg,
+        AllocationStub.scratch2Reg,
+      ]);
 
   @override
   InstructionConstraints? visitAllocateContext(AllocateContext instr) =>
diff --git a/pkg/native_compiler/lib/back_end/arm64/stub_code_generator.dart b/pkg/native_compiler/lib/back_end/arm64/stub_code_generator.dart
index e3ca82d..6fab115 100644
--- a/pkg/native_compiler/lib/back_end/arm64/stub_code_generator.dart
+++ b/pkg/native_compiler/lib/back_end/arm64/stub_code_generator.dart
@@ -87,23 +87,43 @@
 }
 
 final class WriteBarrierStub extends Arm64StubCodeGenerator {
-  final Register objectReg;
-  final Register valueReg;
+  static const Register objectReg = R1;
+  static const Register valueReg = R0;
+  static const Register slotReg = R25;
+
+  final Register _objectReg;
+  final Register _valueReg;
 
   WriteBarrierStub(
     super.vmOffsets,
     super.objectLayout,
-    this.objectReg,
-    this.valueReg,
+    this._objectReg,
+    this._valueReg,
   );
 
   @override
   void _generate() {
-    enterStubFrame();
+    _asm.push(LR);
+    _asm.pushPair(objectReg, valueReg);
 
-    _asm.unimplemented('WriteBarrierStub');
+    if (_objectReg != objectReg) {
+      _asm.mov(objectReg, _objectReg);
+    }
+    if (_valueReg != valueReg) {
+      _asm.mov(valueReg, _valueReg);
+    }
 
-    leaveStubFrame();
+    _asm.ldr(
+      tempReg,
+      _asm.address(
+        threadReg,
+        _asm.vmOffsets.Thread_write_barrier_entry_point_offset,
+      ),
+    );
+    _asm.blr(tempReg);
+
+    _asm.popPair(objectReg, valueReg);
+    _asm.pop(LR);
     _asm.ret();
   }
 }
@@ -118,6 +138,14 @@
   static const Register subtypeTestCacheResultReg = R7;
 }
 
+final class InstantiateTypeArgumentsStub {
+  static const Register uninstantiatedTypeArgumentsReg = R3;
+  static const Register instantiatorTypeArgumentsReg = R2;
+  static const Register functionTypeArgumentsReg = R1;
+  static const Register resultTypeArgumentsReg = R0;
+  static const Register scratchReg = R8;
+}
+
 final class InitSuspendableFunctionStub {
   static const Register typeArgsReg = R0;
 }
diff --git a/pkg/native_compiler/lib/back_end/assembler.dart b/pkg/native_compiler/lib/back_end/assembler.dart
index e1c621b..f37fb61 100644
--- a/pkg/native_compiler/lib/back_end/assembler.dart
+++ b/pkg/native_compiler/lib/back_end/assembler.dart
@@ -21,9 +21,11 @@
   s64,
   simd128;
 
+  bool get is16 => (this == u16) || (this == s16);
   bool get is32 => (this == u32) || (this == s32);
   bool get is64 => (this == u64) || (this == s64);
   bool get is32or64 => is32 || is64;
+  bool get is16or32or64 => is16 || is32 || is64;
   bool get is128 => (this == simd128);
 
   bool get isSigned =>
diff --git a/pkg/native_compiler/lib/passes/lowering.dart b/pkg/native_compiler/lib/passes/lowering.dart
index a77bb70..f9add31 100644
--- a/pkg/native_compiler/lib/passes/lowering.dart
+++ b/pkg/native_compiler/lib/passes/lowering.dart
@@ -57,11 +57,7 @@
   );
 
   late final _emptyList = ConstantValue(
-    ast.InstanceConstant(
-      GlobalContext.instance.coreTypes.listClass.reference,
-      const <ast.DartType>[const ast.DynamicType()],
-      const {},
-    ),
+    ast.ListConstant(const ast.DynamicType(), const []),
   );
 
   @override
diff --git a/pkg/native_compiler/lib/runtime/type_utils.dart b/pkg/native_compiler/lib/runtime/type_utils.dart
index c9003ac..70c90d7 100644
--- a/pkg/native_compiler/lib/runtime/type_utils.dart
+++ b/pkg/native_compiler/lib/runtime/type_utils.dart
@@ -150,35 +150,3 @@
     };
   }
 }
-
-/// Returns true if [type] references class type parameters.
-bool containsClassTypeParameters(ast.DartType type) {
-  final visitor = _FindClassTypeParameters();
-  type.accept(visitor);
-  return visitor.containsClassTypeParams;
-}
-
-class _FindClassTypeParameters extends ast.RecursiveVisitor {
-  bool containsClassTypeParams = false;
-
-  _FindClassTypeParameters();
-
-  @override
-  void visitTypeParameterType(ast.TypeParameterType node) {
-    if (node.parameter.declaration is ast.Class) {
-      containsClassTypeParams = true;
-    }
-  }
-}
-
-bool hasGenericEnclosingFunction(ast.TreeNode node) {
-  for (;;) {
-    node = node.parent!;
-    if (node is ast.Member) {
-      return false;
-    }
-    if (node is ast.FunctionNode && node.typeParameters.isNotEmpty) {
-      return true;
-    }
-  }
-}
diff --git a/pkg/native_compiler/lib/runtime/vm_defs.dart b/pkg/native_compiler/lib/runtime/vm_defs.dart
index 952f6d1..f206f3e 100644
--- a/pkg/native_compiler/lib/runtime/vm_defs.dart
+++ b/pkg/native_compiler/lib/runtime/vm_defs.dart
@@ -15,6 +15,12 @@
 /// This bit is 0 for bool 'true', 1 for bool 'false'.
 int boolValueBitPosition(int log2wordSize) => log2objectAlignment(log2wordSize);
 
+/// Offset of bool 'true' object from 'null' object.
+int trueOffsetFromNull(int wordSize) => objectAlignment(wordSize) * 2;
+
+/// Offset of bool 'false' object from 'null' object.
+int falseOffsetFromNull(int wordSize) => objectAlignment(wordSize) * 3;
+
 /// The number of bits in the _magnitude_ of a Smi, not counting the sign bit.
 int smiBits(int compressedWordSize) => (compressedWordSize * 8) - 2;
 
diff --git a/pkg/native_compiler/lib/snapshot/snapshot.dart b/pkg/native_compiler/lib/snapshot/snapshot.dart
index be54fc2..bd28546 100644
--- a/pkg/native_compiler/lib/snapshot/snapshot.dart
+++ b/pkg/native_compiler/lib/snapshot/snapshot.dart
@@ -168,6 +168,7 @@
     addBaseObject(StubCode.Subtype3TestCache);
     addBaseObject(StubCode.Subtype4TestCache);
     addBaseObject(StubCode.Subtype6TestCache);
+    addBaseObject(StubCode.InstantiateTypeArguments);
     addBaseObject(StubCode.InitAsync);
     addBaseObject(StubCode.InitAsyncStar);
     addBaseObject(StubCode.InitSyncStar);
diff --git a/pkg/native_compiler/test/back_end/arm64/assembler_test.dart b/pkg/native_compiler/test/back_end/arm64/assembler_test.dart
index e5731d2..2d70730 100644
--- a/pkg/native_compiler/test/back_end/arm64/assembler_test.dart
+++ b/pkg/native_compiler/test/back_end/arm64/assembler_test.dart
@@ -205,11 +205,17 @@
       asm.loadConstant(R1, ConstantValue(UnboxedIntConstant(42)));
       asm.loadConstant(R2, ConstantValue.fromInt(42));
       asm.loadConstant(R3, ConstantValue.fromInt(0x7fffffff_ffffffff));
+      asm.loadConstant(R4, ConstantValue.fromNull());
+      asm.loadConstant(R5, ConstantValue.fromBool(true));
+      asm.loadConstant(R6, ConstantValue.fromBool(false));
       expectDisassembly(
         'ldr r0, [pp, #${objectPoolBase}]\n'
         'movz r1, #0x2a\n'
         'movz r2, #0x54\n'
-        'ldr r3, [pp, #${objectPoolBase + 8}]\n',
+        'ldr r3, [pp, #${objectPoolBase + 8}]\n'
+        'mov r4, null\n'
+        'add r5, null, #0x${trueOffsetFromNull(wordSize).toRadixString(16)}\n'
+        'add r6, null, #0x${falseOffsetFromNull(wordSize).toRadixString(16)}\n',
       );
     });
     test('loadImmediate', () {
@@ -685,6 +691,86 @@
       });
     });
 
+    test('csel', () {
+      asm.csel(R0, R1, R2, .greater);
+      asm.csel(R1, ZR, R0, .unsignedLessOrEqual);
+      asm.csel(R1, R1, R3, .notEqual, .s32);
+      expectDisassembly(
+        'csel r0, r1, r2, gt\n'
+        'csel r1, zr, r0, ls\n'
+        'cselw r1, r1, r3, ne\n',
+      );
+      expectThrows(() {
+        asm.csel(SP, R1, R2, .greater);
+      });
+      expectThrows(() {
+        asm.csel(R0, SP, R2, .greater);
+      });
+      expectThrows(() {
+        asm.csel(R0, R1, SP, .greater);
+      });
+    });
+
+    test('csinc', () {
+      asm.csinc(R0, R1, R2, .less);
+      asm.csinc(R1, ZR, R0, .noOverflow);
+      asm.csinc(R1, R1, R3, .unsignedGreater, .s32);
+      expectDisassembly(
+        'csinc r0, r1, r2, lt\n'
+        'csinc r1, zr, r0, vc\n'
+        'csincw r1, r1, r3, hi\n',
+      );
+      expectThrows(() {
+        asm.csinc(SP, R1, R2, .less);
+      });
+      expectThrows(() {
+        asm.csinc(R0, SP, R2, .less);
+      });
+      expectThrows(() {
+        asm.csinc(R0, R1, SP, .less);
+      });
+    });
+
+    test('csinv', () {
+      asm.csinv(R5, R6, R7, .negative);
+      asm.csinv(R1, ZR, R0, .equal);
+      asm.csinv(R1, R1, R3, .lessOrEqual, .s32);
+      expectDisassembly(
+        'csinv r5, r6, r7, mi\n'
+        'csinv r1, zr, r0, eq\n'
+        'csinvw r1, r1, r3, le\n',
+      );
+      expectThrows(() {
+        asm.csinv(SP, R1, R2, .negative);
+      });
+      expectThrows(() {
+        asm.csinv(R0, SP, R2, .negative);
+      });
+      expectThrows(() {
+        asm.csinv(R0, R1, SP, .negative);
+      });
+    });
+
+    test('csneg', () {
+      asm.csneg(R5, R6, R7, .greaterOrEqual);
+      asm.csneg(R1, ZR, R0, .unsignedLess);
+      asm.csneg(R1, R1, R3, .positiveOrZero, .s32);
+      expectDisassembly(
+        'csneg r5, r6, r7, ge\n'
+        'csneg r1, zr, r0, cc\n'
+        'csnegw r1, r1, r3, pl\n',
+      );
+      expectThrows(() {
+        asm.csneg(SP, R1, R2, .negative);
+      });
+      expectThrows(() {
+        asm.csneg(R0, SP, R2, .negative);
+      });
+      expectThrows(() {
+        asm.csneg(R0, R1, SP, .negative);
+      });
+    });
+
     test('ubfx', () {
       asm.ubfx(R0, R1, 4, 8);
       expectDisassembly('ubfm r0, r1, #4, #11\n');
@@ -1536,5 +1622,28 @@
         'ret r1\n',
       );
     });
+
+    test('scvtf', () {
+      asm.scvtf(V0, R0);
+      asm.scvtf(V1, R2, .s32);
+      asm.scvtf(V3, ZR);
+      expectDisassembly(
+        'scvtfd v0, r0\n'
+        'scvtfdw v1, r2\n'
+        'scvtfd v3, zr\n',
+      );
+      expectThrows(() {
+        asm.scvtf(V0, R0, .s16);
+      });
+      expectThrows(() {
+        asm.scvtf(V0, R0, .s64, .s8);
+      });
+      expectThrows(() {
+        asm.scvtf(V0, R0, .s64, .simd128);
+      });
+      expectThrows(() {
+        asm.scvtf(V0, SP);
+      });
+    });
   });
 }
diff --git a/pkg/native_compiler/test/back_end/arm64/disassembler.dart b/pkg/native_compiler/test/back_end/arm64/disassembler.dart
index 899d34c..1e19b7f 100644
--- a/pkg/native_compiler/test/back_end/arm64/disassembler.dart
+++ b/pkg/native_compiler/test/back_end/arm64/disassembler.dart
@@ -606,7 +606,8 @@
 
   bool isFPImmOp() => (value & FPImmOp.FPImmMask) == FPImmOp.FPImmFixed;
   bool isFPIntCvtOp() =>
-      (value & FPIntCvtOp.FPIntCvtMask) == FPIntCvtOp.FPIntCvtFixed;
+      (value & FPIntCvtOp.FPIntCvtMask) ==
+      (FPIntCvtOp.FPIntCvtFixed & FPIntCvtOp.FPIntCvtMask);
   bool isFPOneSourceOp() =>
       (value & FPOneSourceOp.FPOneSourceMask) == FPOneSourceOp.FPOneSourceFixed;
   bool isFPTwoSourceOp() =>
diff --git a/pkg/native_compiler/testcases/lowering_test.dart.expect b/pkg/native_compiler/testcases/lowering_test.dart.expect
index ea5b329..8a94559 100644
--- a/pkg/native_compiler/testcases/lowering_test.dart.expect
+++ b/pkg/native_compiler/testcases/lowering_test.dart.expect
@@ -213,8 +213,10 @@
   ParallelMove output(R0 -> vloc:R0)
   DirectCall print(v7)   # RA: R0 <- (R0) temps: [R1, R2, R3, R4, R5, R6, R7, R8, R9, R10, R11, R12, R13, R14, R19, R20, R23, R25, V0, V1, V2, V3, V4, V5, V6, V7, V8, V9, V10, V11, V12, V13, V14, V15, V16, V17, V18, V19, V20, V21, V22, V23, V24, V25, V26, V27, V28, V29, V30]
   ParallelMove output(param[0] -> R1)
-  v10 = TypeArguments(v9, v1, <listLiterals.T%>)   # RA: R0 <- (-, R1)
-  ParallelMove output(R0 -> stack[0])
+  ParallelMove input(NullConstant(null) -> R2, vloc:R1 -> R1)
+  v10 = TypeArguments(v9, v1, <listLiterals.T%>)   # RA: R0 <- (R2, R1) temps: [R3, R8]
+  ParallelMove output(R0 -> vloc:R0)
+  ParallelMove spill(R0 -> stack[0])
   v11 = DirectCall _GrowableList.(v10, v6)   # RA: R0 <- (R0, -) temps: [R1, R2, R3, R4, R5, R6, R7, R8, R9, R10, R11, R12, R13, R14, R19, R20, R23, R25, V0, V1, V2, V3, V4, V5, V6, V7, V8, V9, V10, V11, V12, V13, V14, V15, V16, V17, V18, V19, V20, V21, V22, V23, V24, V25, V26, V27, V28, V29, V30]
   ParallelMove output(R0 -> vloc:R0)
   DirectCall print(v11)   # RA: R0 <- (R0) temps: [R1, R2, R3, R4, R5, R6, R7, R8, R9, R10, R11, R12, R13, R14, R19, R20, R23, R25, V0, V1, V2, V3, V4, V5, V6, V7, V8, V9, V10, V11, V12, V13, V14, V15, V16, V17, V18, V19, V20, V21, V22, V23, V24, V25, V26, V27, V28, V29, V30]
@@ -270,7 +272,7 @@
   v17 = Constant("aa")
   v18 = Constant("b")
   v19 = Constant("bb")
-  v31 = Constant(InstanceConstant(const List<dynamic>{}))
+  v31 = Constant(ListConstant(const <dynamic>[]))
   v34 = Constant(4)
   v36 = Constant(0)
   v38 = Constant(1)
@@ -286,8 +288,10 @@
   ParallelMove output(R0 -> vloc:R0)
   DirectCall print(v32)   # RA: R0 <- (R0) temps: [R1, R2, R3, R4, R5, R6, R7, R8, R9, R10, R11, R12, R13, R14, R19, R20, R23, R25, V0, V1, V2, V3, V4, V5, V6, V7, V8, V9, V10, V11, V12, V13, V14, V15, V16, V17, V18, V19, V20, V21, V22, V23, V24, V25, V26, V27, V28, V29, V30]
   ParallelMove output(param[0] -> R1)
-  v12 = TypeArguments(v11, v1, <mapLiterals.S%, mapLiterals.T%>)   # RA: R0 <- (-, R1)
-  ParallelMove output(R0 -> stack[0])
+  ParallelMove input(NullConstant(null) -> R2, vloc:R1 -> R1)
+  v12 = TypeArguments(v11, v1, <mapLiterals.S%, mapLiterals.T%>)   # RA: R0 <- (R2, R1) temps: [R3, R8]
+  ParallelMove output(R0 -> vloc:R0)
+  ParallelMove spill(R0 -> stack[0])
   v33 = DirectCall Map._fromLiteral(v12, v31)   # RA: R0 <- (R0, -) temps: [R1, R2, R3, R4, R5, R6, R7, R8, R9, R10, R11, R12, R13, R14, R19, R20, R23, R25, V0, V1, V2, V3, V4, V5, V6, V7, V8, V9, V10, V11, V12, V13, V14, V15, V16, V17, V18, V19, V20, V21, V22, V23, V24, V25, V26, V27, V28, V29, V30]
   ParallelMove output(R0 -> vloc:R0)
   DirectCall print(v33)   # RA: R0 <- (R0) temps: [R1, R2, R3, R4, R5, R6, R7, R8, R9, R10, R11, R12, R13, R14, R19, R20, R23, R25, V0, V1, V2, V3, V4, V5, V6, V7, V8, V9, V10, V11, V12, V13, V14, V15, V16, V17, V18, V19, V20, V21, V22, V23, V24, V25, V26, V27, V28, V29, V30]
diff --git a/pkg/native_compiler/testcases/register_allocator_test.dart.expect b/pkg/native_compiler/testcases/register_allocator_test.dart.expect
index e281cec..981a595 100644
--- a/pkg/native_compiler/testcases/register_allocator_test.dart.expect
+++ b/pkg/native_compiler/testcases/register_allocator_test.dart.expect
@@ -245,8 +245,10 @@
   Goto(B25)
 B25 = JoinBlock(B20, B14) idom:B0
   ParallelMove output(stack[0] -> R0)
-  v79 = LoadInstanceField(Stream.#typeArguments, v1)   # RA: R0 <- (R0)
-  v28 = TypeArguments(v79, v12, <AsBroadcastStream.T%>)   # RA: R1 <- (R0, -)
+  v79 = LoadInstanceField(Stream.#typeArguments, v1)   # RA: R2 <- (R0)
+  ParallelMove input(vloc:R2 -> R2, NullConstant(null) -> R1)
+  v28 = TypeArguments(v79, v12, <AsBroadcastStream.T%>)   # RA: R0 <- (R2, R1) temps: [R3, R8]
+  ParallelMove output(R0 -> vloc:R1)
   ParallelMove input(vloc:R1 -> R1)
   v29 = AllocateObject StreamSubscription<AsBroadcastStream.T%>(v28)   # RA: R0 <- (R1) temps: [R2, R3, R4]
   ParallelMove output(R0 -> vloc:R0, stack[3] -> R1)
@@ -504,29 +506,35 @@
   v3 = Parameter(compare)   # RA: R2 <- ()
   v4 = Parameter(isValidKey)   # RA: R3 <- ()
   ParallelMove output(R3 -> vloc:R10, R2 -> vloc:R9, R1 -> vloc:R6, R0 -> vloc:R5)
-  ParallelMove spill(R6 -> stack[0])
+  ParallelMove spill(R5 -> stack[0], R6 -> stack[1])
   ParallelMove input(vloc:R6 -> R0, NullConstant(null) -> R2, vloc:R5 -> R1)
   v9 = TypeTest(v2, v8, v1, Map<SplayTreeMap.from.K%, SplayTreeMap.from.V%>)   # RA: R7 <- (R0, R2, R1) temps: [R8, R3, R4]
   ParallelMove output(R7 -> vloc:R7)
   Branch(v9, true: B10, false: B11)   # RA: (R7)
 B10 = TargetBlock() idom:B0
-  v15 = TypeArguments(v8, v1, <SplayTreeMap.from.K%, SplayTreeMap.from.V%>)   # RA: R0 <- (-, R5)
+  ParallelMove input(NullConstant(null) -> R2, vloc:R5 -> R1)
+  v15 = TypeArguments(v8, v1, <SplayTreeMap.from.K%, SplayTreeMap.from.V%>)   # RA: R0 <- (R2, R1) temps: [R3, R8]
+  ParallelMove output(R0 -> vloc:R0)
   v17 = TypeCast(v2, v8, v1, Map<SplayTreeMap.from.K%, SplayTreeMap.from.V%>, unchecked)   # RA: R1 <- (R6, -, R5)
   v20 = DirectCall SplayTreeMap.of(v15, v17, v3, v4)   # RA: R0 <- (R0, R1, R9, R10) temps: [R1, R2, R3, R4, R5, R6, R7, R8, R9, R10, R11, R12, R13, R14, R19, R20, R23, R25, V0, V1, V2, V3, V4, V5, V6, V7, V8, V9, V10, V11, V12, V13, V14, V15, V16, V17, V18, V19, V20, V21, V22, V23, V24, V25, V26, V27, V28, V29, V30]
   ParallelMove output(R0 -> vloc:R0)
   ParallelMove input(vloc:R0 -> R0)
   Return(v20)   # RA: (R0)
 B11 = TargetBlock() idom:B0
-  v22 = TypeArguments(v8, v1, <SplayTreeMap.from.K%, SplayTreeMap.from.V%>)   # RA: R1 <- (-, R5)
+  ParallelMove input(NullConstant(null) -> R2, vloc:R5 -> R1)
+  v22 = TypeArguments(v8, v1, <SplayTreeMap.from.K%, SplayTreeMap.from.V%>)   # RA: R0 <- (R2, R1) temps: [R3, R8]
+  ParallelMove output(R0 -> vloc:R1)
   ParallelMove input(vloc:R1 -> R1)
   v23 = AllocateObject SplayTreeMap<SplayTreeMap.from.K%, SplayTreeMap.from.V%>(v22)   # RA: R0 <- (R1) temps: [R2, R3, R4]
   ParallelMove output(R0 -> vloc:R0)
-  ParallelMove spill(R0 -> stack[1])
+  ParallelMove spill(R0 -> stack[2])
   DirectCall SplayTreeMap.(v23, v3, v4)   # RA: R0 <- (R0, R9, R10) temps: [R1, R2, R3, R4, R5, R6, R7, R8, R9, R10, R11, R12, R13, R14, R19, R20, R23, R25, V0, V1, V2, V3, V4, V5, V6, V7, V8, V9, V10, V11, V12, V13, V14, V15, V16, V17, V18, V19, V20, V21, V22, V23, V24, V25, V26, V27, V28, V29, V30]
   v29 = AllocateClosure()   # RA: R0 <- () temps: [R2, R3, R4]
-  ParallelMove output(R0 -> vloc:R0, stack[0] -> R1)
-  InterfaceCall Map.forEach(v2, v29)   # RA: R0 <- (R1, R0) temps: [R1, R2, R3, R4, R5, R6, R7, R8, R9, R10, R11, R12, R13, R14, R19, R20, R23, R25, V0, V1, V2, V3, V4, V5, V6, V7, V8, V9, V10, V11, V12, V13, V14, V15, V16, V17, V18, V19, V20, V21, V22, V23, V24, V25, V26, V27, V28, V29, V30]
+  ParallelMove output(R0 -> vloc:R0, stack[0] -> R3)
+  StoreInstanceField(#closure-field[0], v29, v1)   # RA: (R0, R3) temps: [R1, R2]
   ParallelMove output(stack[1] -> R1)
+  InterfaceCall Map.forEach(v2, v29)   # RA: R0 <- (R1, R0) temps: [R1, R2, R3, R4, R5, R6, R7, R8, R9, R10, R11, R12, R13, R14, R19, R20, R23, R25, V0, V1, V2, V3, V4, V5, V6, V7, V8, V9, V10, V11, V12, V13, V14, V15, V16, V17, V18, V19, V20, V21, V22, V23, V24, V25, V26, V27, V28, V29, V30]
+  ParallelMove output(stack[2] -> R1)
   ParallelMove input(vloc:R1 -> R0)
   Return(v23)   # RA: (R0)
 
@@ -546,9 +554,10 @@
   Parameter(other)   # RA: R1 <- ()
   v3 = Parameter(compare)   # RA: R2 <- ()
   v4 = Parameter(isValidKey)   # RA: R3 <- ()
-  ParallelMove output(R3 -> vloc:R3, R2 -> vloc:R2, R0 -> vloc:R0)
-  v8 = TypeArguments(v7, v1, <SplayTreeMap.of.K%, SplayTreeMap.of.V%>)   # RA: R1 <- (-, R0)
-  ParallelMove output(R2 -> R5, R3 -> R6)
+  ParallelMove output(R3 -> vloc:R6, R2 -> vloc:R5, R0 -> vloc:R1)
+  ParallelMove input(NullConstant(null) -> R2, vloc:R1 -> R1)
+  v8 = TypeArguments(v7, v1, <SplayTreeMap.of.K%, SplayTreeMap.of.V%>)   # RA: R0 <- (R2, R1) temps: [R3, R8]
+  ParallelMove output(R0 -> vloc:R1)
   ParallelMove input(vloc:R1 -> R1)
   v9 = AllocateObject SplayTreeMap<SplayTreeMap.of.K%, SplayTreeMap.of.V%>(v8)   # RA: R0 <- (R1) temps: [R2, R3, R4]
   ParallelMove output(R0 -> vloc:R0)
@@ -1777,7 +1786,7 @@
 
 --- closures
 B0 = EntryBlock()
-  v9 = Constant(null)
+  v11 = Constant(null)
   Parameter(a1)   # RA: R0 <- ()
   v2 = Parameter(a2)   # RA: R1 <- ()
   ParallelMove output(R1 -> vloc:R1)
@@ -1785,13 +1794,16 @@
   ParallelMove output(R0 -> vloc:R0)
   StoreInstanceField(#context-field:a2, v3, v2)   # RA: (R0, R1) temps: [R2, R3]
   ParallelMove output(R0 -> R1)
-  v6 = AllocateClosure(v3)   # RA: R0 <- (R1) temps: [R2, R3, R4]
-  ParallelMove output(R0 -> vloc:R5)
-  v7 = AllocateClosure(v3)   # RA: R0 <- (R1) temps: [R2, R3, R4]
+  v6 = AllocateClosure()   # RA: R0 <- () temps: [R2, R3, R4]
   ParallelMove output(R0 -> vloc:R0)
-  DirectCall foo2(v6, v7)   # RA: R0 <- (R5, R0) temps: [R1, R2, R3, R4, R5, R6, R7, R8, R9, R10, R11, R12, R13, R14, R19, R20, R23, R25, V0, V1, V2, V3, V4, V5, V6, V7, V8, V9, V10, V11, V12, V13, V14, V15, V16, V17, V18, V19, V20, V21, V22, V23, V24, V25, V26, V27, V28, V29, V30]
+  StoreInstanceField(#closure-field[0], v6, v3)   # RA: (R0, R1) temps: [R2, R3]
+  ParallelMove output(R0 -> R5)
+  v8 = AllocateClosure()   # RA: R0 <- () temps: [R2, R3, R4]
+  ParallelMove output(R0 -> vloc:R0)
+  StoreInstanceField(#closure-field[0], v8, v3)   # RA: (R0, R1) temps: [R2, R3]
+  DirectCall foo2(v6, v8)   # RA: R0 <- (R5, R0) temps: [R1, R2, R3, R4, R5, R6, R7, R8, R9, R10, R11, R12, R13, R14, R19, R20, R23, R25, V0, V1, V2, V3, V4, V5, V6, V7, V8, V9, V10, V11, V12, V13, V14, V15, V16, V17, V18, V19, V20, V21, V22, V23, V24, V25, V26, V27, V28, V29, V30]
   ParallelMove input(NullConstant(null) -> R0)
-  Return(v9)   # RA: (R0)
+  Return(v11)   # RA: (R0)
 
 --- closure FunctionExpression(Null (dynamic _#wc0#formal) {
   print(a2);
diff --git a/pkg/perf_witness/lib/server.dart b/pkg/perf_witness/lib/server.dart
index d34284b..3ebff8e 100644
--- a/pkg/perf_witness/lib/server.dart
+++ b/pkg/perf_witness/lib/server.dart
@@ -251,7 +251,13 @@
     }
     await _server?.close();
     if (io.FileSystemEntity.typeSync(_controlSocketPath) != .notFound) {
-      io.File(_controlSocketPath).deleteSync();
+      try {
+        // Normally we would not expect this to throw, but on Windows
+        // users reported an occasional ERROR_CANT_ACCESS_FILE thrown here,
+        // possibly due to some sort of NTFS race with deleting the reparse
+        // point after unix domain socket was closed. See dartbug.com/63343.
+        io.File(_controlSocketPath).deleteSync();
+      } catch (_) {}
     }
     calloc.free(_isRecordingTimelineWithAsyncSpans);
   }
diff --git a/pkg/pkg.status b/pkg/pkg.status
index 93460c2..d5eca7e 100644
--- a/pkg/pkg.status
+++ b/pkg/pkg.status
@@ -12,6 +12,7 @@
 analyzer/test/verify_diagnostics_test: Slow, Pass
 analyzer/test/verify_docs_test: Slow, Pass
 analyzer_plugin/test/plugin/folding_mixin_test: Slow, Pass
+api_summary/test/app_test: Slow, Pass
 compiler/test/analyses/analyze_test: Slow, Pass
 compiler/test/analyses/api_dynamic_test: Slow, Pass
 compiler/test/closure/closure_test: Slow, Pass
diff --git a/pkg/reload_test/lib/ddc_helpers.dart b/pkg/reload_test/lib/ddc_helpers.dart
index f34bd76..2f17435 100644
--- a/pkg/reload_test/lib/ddc_helpers.dart
+++ b/pkg/reload_test/lib/ddc_helpers.dart
@@ -136,16 +136,8 @@
 let modifiedFilesPerGeneration = ${_encoder.convert(modifiedFilesPerGeneration)};
 let previousGenerations = new Set();
 
-// Append a helper function for hot restart.
-self.\$dartReloadModifiedModules = async function(subAppName, callback) {
-  let expectedName = "$entrypointModuleName";
-  if (subAppName !== expectedName) {
-    throw Error("Unexpected app name " + subAppName
-        + " (expected: " + expectedName + "). "
-        + "Hot Reload Runner does not support multiple subapps, so only "
-        + "one app name should be provided across reloads/restarts.");
-  }
-
+// Append a helper function to provide reloaded sources information.
+self.\$injectedReloadedSourcesHelper = function() {
   // Resolve the next generation's directory and load all modified files.
   let nextGeneration = self.\$dartLoader.loader.intendedHotRestartGeneration;
   if (previousGenerations.has(nextGeneration)) {
@@ -156,18 +148,37 @@
   let modifiedFilePaths = modifiedFilesPerGeneration[nextGeneration];
   // Stop if the next generation does not exist.
   if (modifiedFilePaths == void 0) {
-    return;
+    return null;
   }
 
-  // Load all modified files.
+  // Collect reload generation resources.
+  let fileDescriptors = [];
   for (let i = 0; i < modifiedFilePaths.length; i++) {
     let modifiedFilePath = modifiedFilePaths[i][1];
-    self.\$dartLoader.forceLoadScript(modifiedFilePath);
+    fileDescriptors.push({src: modifiedFilePath});
   }
+  return fileDescriptors;
+}
 
-  // Run main in an async callback. D8 performs synchronous loads, so we need
-  // to insert an async task to match its semantics to that of Chrome.
-  await Promise.resolve().then(() => { callback(); });
+// Append a helper function for hot restart.
+self.\$dartReloadModifiedModules = function(filesToReload, appName) {
+  let expectedName = "$entrypointModuleName";
+  if (appName !== expectedName) {
+    throw Error("Unexpected app name " + appName
+        + " (expected: " + expectedName + "). "
+        + "Hot Reload Runner does not support multiple subapps, so only "
+        + "one app name should be provided across reloads/restarts.");
+  }
+  return new Promise(function(resolve) {
+    // Load all modified files.
+    for (let i = 0; i < filesToReload.length; i++) {
+      let modifiedFilePath = filesToReload[i].src;
+      self.\$dartLoader.forceLoadScript(modifiedFilePath);
+    }
+    // D8 performs synchronous loads, but we return a Promise to match the
+    // semantics in Chrome.
+    resolve(filesToReload);
+  });
 }
 
 // Append a helper function for hot reload.
@@ -505,15 +516,8 @@
     }
 
     let previousGenerations = new Set();
-    self.\$dartReloadModifiedModules = async function(subAppName, callback) {
-      let expectedName = "$entrypointModuleName";
-      if (subAppName !== expectedName) {
-        throw Error("Unexpected app name " + subAppName
-            + " (expected: " + expectedName + "). "
-            + "Hot Reload Runner does not support multiple subapps, so only "
-            + "one app name should be provided across reloads/restarts.");
-      }
-
+    // Append a helper function to provide reloaded sources information.
+    self.\$injectedReloadedSourcesHelper = function() {
       // Resolve the next generation's directory and load all modified files.
       let nextGeneration = self.\$dartLoader.loader.intendedHotRestartGeneration;
       if (previousGenerations.has(nextGeneration)) {
@@ -524,33 +528,57 @@
       let modifiedFilePaths = modifiedFilesPerGeneration[nextGeneration];
       // Stop if the next generation does not exist.
       if (modifiedFilePaths == void 0) {
-        return;
+        return null;
       }
 
-      // Load all modified files.
-      var numToLoad = 0;
-      var numLoaded = 0;
+      // Collect reload generation resources.
+      let fileDescriptors = [];
       for (let i = 0; i < modifiedFilePaths.length; i++) {
-        numToLoad++
         let modifiedFileId =  modifiedFilePaths[i][0];
         let modifiedFilePath = modifiedFilePaths[i][1];
-
-        // Invalidate DDC state for hot restart.
-        self.\$dartLoader.moduleIdToUrl.set(modifiedFileId, modifiedFilePath);
-        self.\$dartLoader.urlToModuleId.set(modifiedFilePath, modifiedFileId);
-
-        // Remove the old script.
-        var el = document.getElementById(modifiedFileId);
-        if (el) el.remove();
-
-        loadHotRestartScript(modifiedFileId, modifiedFilePath, function() {
-          numLoaded++;
-          if (numToLoad == numLoaded) callback();
-        });
+        fileDescriptors.push({src: modifiedFilePath, id: modifiedFileId});
       }
+      return fileDescriptors;
+    }
 
-      // Call the callback immediately if we found no updated scripts.
-      if (numToLoad == 0) callback();
+    // Append a helper function for hot restart.
+    self.\$dartReloadModifiedModules = async function(filesToReload, subAppName) {
+      let expectedName = "$entrypointModuleName";
+      if (subAppName !== expectedName) {
+        throw Error("Unexpected app name " + subAppName
+            + " (expected: " + expectedName + "). "
+            + "Hot Reload Runner does not support multiple subapps, so only "
+            + "one app name should be provided across reloads/restarts.");
+      }
+      // Load all modified files.
+      return new Promise(function(resolve) {
+        function callback() {
+          resolve(filesToReload);
+        }
+        var numToLoad = 0;
+        var numLoaded = 0;
+        for (let i = 0; i < filesToReload.length; i++) {
+          numToLoad++
+          let modifiedFileId =  filesToReload[i].id;
+          let modifiedFilePath = filesToReload[i].src;
+
+          // Invalidate DDC state for hot restart.
+          self.\$dartLoader.moduleIdToUrl.set(modifiedFileId, modifiedFilePath);
+          self.\$dartLoader.urlToModuleId.set(modifiedFilePath, modifiedFileId);
+
+          // Remove the old script.
+          var el = document.getElementById(modifiedFileId);
+          if (el) el.remove();
+
+          loadHotRestartScript(modifiedFileId, modifiedFilePath, function() {
+            numLoaded++;
+            if (numToLoad == numLoaded) callback();
+          });
+        }
+
+        // Call the callback immediately if we found no updated scripts.
+        if (numToLoad == 0) callback();
+      });
     }
 
     // Begin loading libraries
diff --git a/pkg/reload_test/lib/src/_ddc_reload_utils.dart b/pkg/reload_test/lib/src/_ddc_reload_utils.dart
index 902bd70..ba925d1 100644
--- a/pkg/reload_test/lib/src/_ddc_reload_utils.dart
+++ b/pkg/reload_test/lib/src/_ddc_reload_utils.dart
@@ -26,7 +26,10 @@
 
 extension type _DartDevEmbedder(JSObject _) implements JSObject {
   external JSPromise hotReload(JSArray<JSString> files, JSArray<JSString> ids);
-  external JSPromise hotRestart();
+  external JSPromise<JSArray<JSObject>> hotRestartBegin(
+    JSArray<JSObject> filesToRequest,
+  );
+  external void hotRestartEnd();
   external JSNumber get hotReloadGeneration;
   external JSNumber get hotRestartGeneration;
 }
@@ -39,6 +42,9 @@
   JSNumber requestedFileGeneration,
 );
 
+@JS('\$injectedReloadedSourcesHelper')
+external JSArray<JSObject>? injectedReloadedSourcesHelper();
+
 @JS('\$dartLoader')
 external _DartLoader get _dartLoader;
 
@@ -48,6 +54,12 @@
 
 Future<void> hotRestart() async {
   _ddcLoader.intendedHotRestartGeneration++;
+  final filesToRequest = injectedReloadedSourcesHelper();
+  if (filesToRequest == null) {
+    throw Exception('Restart requested but no remaining generations found.');
+  }
+  await _dartDevEmbedder.hotRestartBegin(filesToRequest).toDart;
+  // Must return the receipt before re-running the main method.
   final restartReceipt = HotReloadReceipt(
     generation: _ddcLoader.intendedHotRestartGeneration,
     status: Status.restarted,
@@ -56,7 +68,7 @@
     '${HotReloadReceipt.hotReloadReceiptTag}'
     '${jsonEncode(restartReceipt.toJson())}',
   );
-  await _dartDevEmbedder.hotRestart().toDart;
+  _dartDevEmbedder.hotRestartEnd();
 }
 
 /// The reload generation of the currently running application.
diff --git a/pkg/test_runner/lib/src/build_configurations.dart b/pkg/test_runner/lib/src/build_configurations.dart
index 4685b56..a210977 100644
--- a/pkg/test_runner/lib/src/build_configurations.dart
+++ b/pkg/test_runner/lib/src/build_configurations.dart
@@ -16,6 +16,7 @@
   final modes = <Mode>{};
   final architectures = <Architecture>{};
   final systems = <System>{};
+  final sanitizers = <Sanitizer>{};
   for (final configuration in configurations) {
     if (!configuration.build) {
       continue;
@@ -25,6 +26,7 @@
     modes.add(inner.mode);
     architectures.add(inner.architecture);
     systems.add(inner.system);
+    sanitizers.add(inner.sanitizer);
   }
 
   if (buildTargets.isEmpty) {
@@ -53,10 +55,12 @@
 
   final command = [
     'tools/build.py',
-    '-m',
+    '--mode',
     modes.join(','),
-    '-a',
+    '--arch',
     architectures.join(','),
+    '--sanitizer',
+    sanitizers.join(','),
     ...osFlags,
     ...buildTargets,
   ];
diff --git a/pkg/test_runner/lib/src/command_output.dart b/pkg/test_runner/lib/src/command_output.dart
index 97f7ae5..7f16e86 100644
--- a/pkg/test_runner/lib/src/command_output.dart
+++ b/pkg/test_runner/lib/src/command_output.dart
@@ -812,7 +812,7 @@
   }
 }
 
-class SpecParseCommandOutput extends CommandOutput {
+class SpecParseCommandOutput extends CommandOutput with _StaticErrorOutput {
   SpecParseCommandOutput(
     Command command,
     int exitCode,
@@ -840,10 +840,54 @@
     if (hasTimedOut) return Expectation.timeout;
     if (hasNonUtf8) return Expectation.nonUtf8Error;
     if (truncatedOutput) return Expectation.truncatedOutput;
-    if (hasSyntaxError) return Expectation.syntaxError;
-    if (exitCode != 0) return Expectation.syntaxError;
+    if (testCase.testFile.isStaticErrorTest) {
+      return _validateExpectedErrors(testCase);
+    }
+    if (hasSyntaxError || exitCode != 0) return Expectation.syntaxError;
     return Expectation.pass;
   }
+
+  /// Parses the ANTLR parser's diagnostic output.
+  ///
+  /// For example: `void main() {(}` in 'foo.dart' yields
+  ///   Syntax error in foo.dart:
+  ///   line 1:14 no viable alternative at input '(}'
+  ///   Parsing failed
+  ///
+  /// The 'Syntax error' line is emitted once for each file with
+  /// a syntax error, and each error gets a 'line ...' message.
+  @override
+  void _parseErrors() {
+    var output = decodeUtf8(stderr);
+    var lines = output.split('\n');
+    String? currentPath;
+    var processCommand = command as ProcessCommand;
+    var fallbackPath = processCommand.arguments.firstWhere(
+      (arg) => arg.endsWith('.dart'),
+      orElse: () => '',
+    );
+    for (var line in lines) {
+      if (_pathRegExp.firstMatch(line) case var match?) {
+        currentPath = match[1];
+      } else if (_errorRegExp.firstMatch(line) case var match?) {
+        var lineNum = int.parse(match[1]!);
+        var column = int.parse(match[2]!) + 1; // ANTLR is 0-based.
+        var message = match[3]!;
+        addError(
+          StaticError(
+            ErrorSource.specParser,
+            message,
+            path: currentPath ?? fallbackPath,
+            line: lineNum,
+            column: column,
+          ),
+        );
+      }
+    }
+  }
+
+  static final RegExp _pathRegExp = .new(r"^Syntax error in (.*):$");
+  static final RegExp _errorRegExp = .new(r"^line (\d+):(\d+) (.*)$");
 }
 
 class VMCommandOutput extends CommandOutput with _UnittestSuiteMessagesMixin {
@@ -1537,6 +1581,7 @@
       Compiler.dart2wasm: ErrorSource.web,
       Compiler.ddc: ErrorSource.web,
       Compiler.fasta: ErrorSource.cfe,
+      Compiler.specParser: ErrorSource.specParser,
     }[testCase.configuration.compiler]!;
 
     var expected = testCase.testFile.expectedErrors.where(
diff --git a/pkg/test_runner/lib/src/compiler_configuration.dart b/pkg/test_runner/lib/src/compiler_configuration.dart
index 7cedafc..c0481c3 100644
--- a/pkg/test_runner/lib/src/compiler_configuration.dart
+++ b/pkg/test_runner/lib/src/compiler_configuration.dart
@@ -1893,7 +1893,8 @@
           arguments.contains('--enable_asserts'))
         '--enable-asserts',
       if (!isProductMode)
-        '--bytecode-options=source-positions,embed-source-text',
+        '--bytecode-options=source-positions,embed-source-text'
+            '${_isAot ? '' : ',record-coverage'}',
     ];
 
     return CompilationCommand(
diff --git a/pkg/test_runner/lib/src/static_error.dart b/pkg/test_runner/lib/src/static_error.dart
index 9036295..a818aa9 100644
--- a/pkg/test_runner/lib/src/static_error.dart
+++ b/pkg/test_runner/lib/src/static_error.dart
@@ -12,6 +12,7 @@
 class ErrorSource {
   static const analyzer = ErrorSource._("analyzer");
   static const cfe = ErrorSource._("CFE", marker: "cfe");
+  static const specParser = ErrorSource._("spec_parser");
   static const web = ErrorSource._("web");
 
   /// Pseudo-front end for context messages.
@@ -21,7 +22,7 @@
   ///
   /// The order is significant here. In static error tests, error expectations
   /// must be in this order for consistency.
-  static const all = [analyzer, cfe, web];
+  static const all = [analyzer, cfe, specParser, web];
 
   /// Gets the source whose lowercase name is [name] or `null` if no source
   /// with that name could be found.
@@ -453,6 +454,9 @@
         // TODO(rnystrom): If the web compilers report warnings, encode that in
         // the message somehow and then look for it here.
         return false;
+      case ErrorSource.specParser:
+        // The spec parser does not report warnings.
+        return false;
       default:
         break;
     }
diff --git a/pkg/test_runner/lib/src/test_file.dart b/pkg/test_runner/lib/src/test_file.dart
index 154150f..47a4e5a 100644
--- a/pkg/test_runner/lib/src/test_file.dart
+++ b/pkg/test_runner/lib/src/test_file.dart
@@ -345,12 +345,18 @@
     }
 
     var errorExpectations = <StaticError>[];
-    try {
-      errorExpectations.addAll(_parseExpectations(filePath));
-    } on FormatException catch (error) {
-      throw FormatException(
-        "Invalid error expectation syntax in $filePath:\n$error",
-      );
+
+    // The analyzer package also uses a similar syntax for expectations, but
+    // we don't want the test_runner to inadvertently think files containing
+    // those are static error tests.
+    if (!filePath.replaceAll('\\', '/').contains('/pkg/analyzer/')) {
+      try {
+        errorExpectations.addAll(_parseExpectations(filePath));
+      } on FormatException catch (error) {
+        throw FormatException(
+          "Invalid error expectation syntax in $filePath:\n$error",
+        );
+      }
     }
 
     return TestFile._(
diff --git a/pkg/vm/lib/modular/transformations/for_in_lowering.dart b/pkg/vm/lib/modular/transformations/for_in_lowering.dart
index 33aec7e..18f32dd 100644
--- a/pkg/vm/lib/modular/transformations/for_in_lowering.dart
+++ b/pkg/vm/lib/modular/transformations/for_in_lowering.dart
@@ -279,7 +279,7 @@
     return Block([syncForIteratorVariableInitialization, forStatement]);
   }
 
-  (VariableDeclaration, VariableInitializationBase)
+  (VariableDeclaration, VariableDeclaration)
   _createSyncForIteratorVariableAndInitialization({
     required Expression initializer,
     required DartType type,
@@ -290,7 +290,7 @@
         cosmeticName: ForInVariables.syncForIterator,
         type: type,
       );
-      final initialization = VariableInitializationBase(
+      final initialization = VariableInitialization(
         variable: variable,
         initializer: initializer,
       );
@@ -306,12 +306,12 @@
     }
   }
 
-  VariableInitializationBase _ensureSyncForLoopVariableInitialization({
+  VariableDeclaration _ensureSyncForLoopVariableInitialization({
     required VariableDeclaration variable,
     required Expression initializer,
   }) {
     if (isClosureContextLoweringEnabled) {
-      return VariableInitializationBase(
+      return VariableInitialization(
         variable: variable,
         initializer: initializer,
       );
diff --git a/pkg/wasm_builder/lib/src/builder/types.dart b/pkg/wasm_builder/lib/src/builder/types.dart
index 0576602..3fdf007 100644
--- a/pkg/wasm_builder/lib/src/builder/types.dart
+++ b/pkg/wasm_builder/lib/src/builder/types.dart
@@ -77,7 +77,7 @@
   late final List<List<ir.DefType>> _allRecursiveGroups =
       _createAllRecursiveGroups();
   final List<ir.DefType> _allDefinedTypes = [];
-  final Map<ir.DefType, int> _brandTypeAssignments = {};
+  final Set<ir.StructType> _brandedStructs = {};
 
   _RecGroupBuilder();
 
@@ -132,7 +132,6 @@
     // (2) length of first struct
     // (3) group structural equality
     final equivalenceGroups = <_RecursionGroupKey, List<List<ir.DefType>>>{};
-
     for (final group in groups) {
       final structIndex = group.indexWhere((g) => g is ir.StructType);
       // Skip groups with no struct types.
@@ -148,14 +147,85 @@
 
     for (final equalGroups in equivalenceGroups.values) {
       // All the groups in `equalGroups` are structurally equivalent.
-      // Skip the first group since we can leave one group as-is.
-      for (int i = 1; i < equalGroups.length; i++) {
-        // Key the assignment on the first element in the group. If a user is
-        // trying to use the brand index to restore the group, then all other
-        // elements are implicitly the same.
-        final typeIndex = _brandTypeAssignments[equalGroups[i].first] ??= i - 1;
-        final brandType = _getBrandType(typeIndex);
-        equalGroups[i].insert(0, brandType);
+      final toBrand = <List<ir.DefType>>[];
+      final noBrand = <List<ir.DefType>>[];
+
+      for (final group in equalGroups) {
+        final hasBrandedStruct = group.any(
+          (t) => t is ir.StructType && _brandedStructs.contains(t),
+        );
+        (hasBrandedStruct ? toBrand : noBrand).add(group);
+      }
+
+      final int startIdx = noBrand.isNotEmpty ? 0 : 1;
+      for (int i = startIdx; i < toBrand.length; i++) {
+        final brandTypeIndex = i - startIdx;
+        final brandType = _getBrandType(brandTypeIndex);
+        toBrand[i].insert(0, brandType);
+      }
+
+      // Rename the types and fields of wasm structs that will not get branded
+      // with a union name.
+      if (noBrand.length > 1) {
+        final groupCount = noBrand.length;
+        final dotDotDotLimit = 10;
+        final typesCount = noBrand.first.length;
+
+        // Equivalent groups must have the same length.
+        assert(noBrand.every((types) => types.length == typesCount));
+
+        for (int typeIndex = 0; typeIndex < typesCount; ++typeIndex) {
+          final structType = noBrand[0][typeIndex];
+          if (structType is! ir.StructType) {
+            continue;
+          }
+
+          // Build new struct names & field names by |-ing the ones from the
+          // individual groups, adding trailing '|...' if it's more than
+          // [dotDotDotLimit].
+          final structNameBuilder = StringBuffer();
+          final List<StringBuffer?> fieldNameBuilder = List.filled(
+            structType.fields.length,
+            null,
+          );
+          for (int group = 0; group < groupCount; ++group) {
+            if (group == dotDotDotLimit) {
+              structNameBuilder.write('|...');
+              for (int field = 0; field < fieldNameBuilder.length; ++field) {
+                if (fieldNameBuilder[field] case final StringBuffer buffer?) {
+                  buffer.write('|...');
+                }
+              }
+              break;
+            }
+
+            final structType = noBrand[group][typeIndex] as ir.StructType;
+            if (structType.name case final String? name) {
+              if (structNameBuilder.isNotEmpty) structNameBuilder.write('|');
+              structNameBuilder.write(name);
+            }
+            structType.fieldNames.forEach((fieldIndex, name) {
+              final buffer = fieldNameBuilder[fieldIndex] ??= StringBuffer();
+              if (buffer.isNotEmpty) buffer.write('|');
+              buffer.write(structType.name ?? '');
+              buffer.write('.');
+              buffer.write(name);
+            });
+          }
+          final newStructName = structNameBuilder.toString();
+          final List<String?> newFieldNames = fieldNameBuilder
+              .map((buffer) => buffer?.toString())
+              .toList();
+          for (int group = 0; group < groupCount; ++group) {
+            final structType = noBrand[group][typeIndex] as ir.StructType;
+            structType.name = newStructName;
+            for (int field = 0; field < structType.fields.length; ++field) {
+              if (newFieldNames[field] case final String name?) {
+                structType.fieldNames[field] = name;
+              }
+            }
+          }
+        }
       }
     }
   }
@@ -249,12 +319,6 @@
   TypesBuilder(this._module, {TypesBuilder? parent})
     : _recGroupBuilder = parent?._recGroupBuilder ?? _RecGroupBuilder();
 
-  Map<ir.DefType, int> get brandTypeAssignments =>
-      _recGroupBuilder._brandTypeAssignments;
-
-  void addBrandTypeAssignment(ir.DefType type, int brandIndex) =>
-      _recGroupBuilder._brandTypeAssignments[type] = brandIndex;
-
   /// Add a new function type to the module.
   ///
   /// All function types are canonicalized, such that identical types become
@@ -287,9 +351,13 @@
     String name, {
     Iterable<ir.FieldType>? fields,
     ir.DefType? superType,
+    required bool brand,
   }) {
     final type = ir.StructType(name, fields: fields, superType: superType);
     _recGroupBuilder.addDefinedType(type);
+    if (brand) {
+      _recGroupBuilder._brandedStructs.add(type);
+    }
     return type;
   }
 
diff --git a/runtime/bin/filter.cc b/runtime/bin/filter.cc
index eb9a35d..18860db 100644
--- a/runtime/bin/filter.cc
+++ b/runtime/bin/filter.cc
@@ -167,10 +167,6 @@
   Dart_Handle data_obj = Dart_GetNativeArgument(args, 1);
   intptr_t start = DartUtils::GetIntptrValue(Dart_GetNativeArgument(args, 2));
   intptr_t end = DartUtils::GetIntptrValue(Dart_GetNativeArgument(args, 3));
-  intptr_t chunk_length = end - start;
-  intptr_t length;
-  Dart_TypedData_Type type;
-  uint8_t* buffer = nullptr;
 
   Filter* filter = nullptr;
   Dart_Handle err = GetFilter(filter_obj, &filter);
@@ -178,39 +174,26 @@
     Dart_PropagateError(err);
   }
 
-  Dart_Handle result = Dart_TypedDataAcquireData(
-      data_obj, &type, reinterpret_cast<void**>(&buffer), &length);
-  if (!Dart_IsError(result)) {
-    ASSERT(type == Dart_TypedData_kUint8 || type == Dart_TypedData_kInt8);
-    if (type != Dart_TypedData_kUint8 && type != Dart_TypedData_kInt8) {
-      Dart_TypedDataReleaseData(data_obj);
-      Dart_ThrowException(DartUtils::NewInternalError(
-          "Invalid argument passed to Filter_Process"));
-    }
-    uint8_t* zlib_buffer = new uint8_t[chunk_length];
-    if (zlib_buffer == nullptr) {
-      Dart_TypedDataReleaseData(data_obj);
-      Dart_PropagateError(Dart_NewApiError("Could not allocate zlib buffer"));
-    }
-
-    memmove(zlib_buffer, buffer + start, chunk_length);
-    Dart_TypedDataReleaseData(data_obj);
-    buffer = zlib_buffer;
-  } else {
-    err = Dart_ListLength(data_obj, &length);
-    if (Dart_IsError(err)) {
-      Dart_PropagateError(err);
-    }
-    buffer = new uint8_t[chunk_length];
-    if (buffer == nullptr) {
-      Dart_PropagateError(Dart_NewApiError("Could not allocate buffer"));
-    }
-    err = Dart_ListGetAsBytes(data_obj, start, buffer, chunk_length);
-    if (Dart_IsError(err)) {
-      delete[] buffer;
-      Dart_PropagateError(err);
-    }
+  intptr_t length;
+  err = Dart_ListLength(data_obj, &length);
+  if (Dart_IsError(err)) {
+    Dart_PropagateError(err);
   }
+  if (!(0 <= start && start <= end && end <= length)) {
+    Dart_PropagateError(Dart_NewApiError("Invalid range"));
+  }
+
+  intptr_t chunk_length = end - start;
+  uint8_t* buffer = new uint8_t[chunk_length];
+  if (buffer == nullptr) {
+    Dart_PropagateError(Dart_NewApiError("Could not allocate buffer"));
+  }
+  err = Dart_ListGetAsBytes(data_obj, start, buffer, chunk_length);
+  if (Dart_IsError(err)) {
+    delete[] buffer;
+    Dart_PropagateError(err);
+  }
+
   // Process will take ownership of buffer, if successful.
   if (!filter->Process(buffer, chunk_length)) {
     delete[] buffer;
diff --git a/runtime/bin/io_natives.cc b/runtime/bin/io_natives.cc
index 8fe803c..5093d9a 100644
--- a/runtime/bin/io_natives.cc
+++ b/runtime/bin/io_natives.cc
@@ -173,7 +173,7 @@
   V(Socket_SetSocketId, 3)                                                     \
   V(Socket_WriteList, 4)                                                       \
   V(Socket_HasPendingWrite, 1)                                                 \
-  V(SocketControlMessage_fromHandles, 2)                                       \
+  V(SocketControlMessage_fromHandles, 1)                                       \
   V(SocketControlMessageImpl_extractHandles, 1)                                \
   V(Stdin_ReadByte, 1)                                                         \
   V(Stdin_GetEchoMode, 1)                                                      \
diff --git a/runtime/bin/socket.cc b/runtime/bin/socket.cc
index 5af1fc4..06c4e8e 100644
--- a/runtime/bin/socket.cc
+++ b/runtime/bin/socket.cc
@@ -828,7 +828,12 @@
     Dart_Handle buffer_dart = Dart_GetNativeArgument(args, 1);
     TypedDataScope data(buffer_dart);
 
-    ASSERT((offset + length) <= data.size_in_bytes());
+    const intptr_t end = offset + length;
+    if (!(0 <= offset && offset <= end && end <= data.size_in_bytes())) {
+      delete os_error;
+      Dart_SetReturnValue(args, Dart_NewApiError("Invalid range"));
+      return;
+    }
     uint8_t* buffer_at_offset =
         reinterpret_cast<uint8_t*>(data.data()) + offset;
     bytes_written = SocketBase::SendMessage(
@@ -1525,8 +1530,7 @@
                       DartUtils::NewDartUnsupportedError(
                           "This is not supported on this operating system"));
 #else
-  ASSERT(Dart_IsNull(Dart_GetNativeArgument(args, 0)));
-  Dart_Handle handles_dart = Dart_GetNativeArgument(args, 1);
+  Dart_Handle handles_dart = Dart_GetNativeArgument(args, 0);
   if (Dart_IsNull(handles_dart)) {
     Dart_ThrowException(
         DartUtils::NewDartArgumentError("handles list can't be null"));
diff --git a/runtime/bin/sync_socket.cc b/runtime/bin/sync_socket.cc
index a3a47d1..a03f474 100644
--- a/runtime/bin/sync_socket.cc
+++ b/runtime/bin/sync_socket.cc
@@ -129,18 +129,27 @@
                                   "First parameter must be a List<int>"));
     return;
   }
-  intptr_t offset = DartUtils::GetIntptrValue(Dart_GetNativeArgument(args, 2));
-  intptr_t length = DartUtils::GetIntptrValue(Dart_GetNativeArgument(args, 3));
+
+  intptr_t start = DartUtils::GetIntptrValue(Dart_GetNativeArgument(args, 2));
+  intptr_t bytes = DartUtils::GetIntptrValue(Dart_GetNativeArgument(args, 3));
   Dart_TypedData_Type type;
   uint8_t* buffer = nullptr;
-  intptr_t len;
-  result = Dart_TypedDataAcquireData(buffer_obj, &type,
-                                     reinterpret_cast<void**>(&buffer), &len);
+  intptr_t buffer_length;
+  result = Dart_TypedDataAcquireData(
+      buffer_obj, &type, reinterpret_cast<void**>(&buffer), &buffer_length);
   DART_CHECK_ERROR(result);
-  ASSERT((offset + length) <= len);
-  buffer += offset;
+
+  const intptr_t end = start + bytes;
+  if (!(0 <= start && start <= end && end <= buffer_length)) {
+    Dart_TypedDataReleaseData(buffer_obj);
+    Dart_SetReturnValue(args, Dart_NewApiError("Invalid range"));
+    return;
+  }
+
+  buffer += start;
   intptr_t bytes_written =
-      SynchronousSocket::Write(socket->fd(), buffer, length);
+      SynchronousSocket::Write(socket->fd(), buffer, bytes);
+
   Dart_TypedDataReleaseData(buffer_obj);
   if (bytes_written >= 0) {
     Dart_SetIntegerReturnValue(args, bytes_written);
diff --git a/runtime/lib/array.cc b/runtime/lib/array.cc
index 362e586..6cb1215 100644
--- a/runtime/lib/array.cc
+++ b/runtime/lib/array.cc
@@ -10,7 +10,7 @@
 
 namespace dart {
 
-DEFINE_NATIVE_ENTRY(List_allocate, 0, 2) {
+DEFINE_NATIVE_ENTRY(List_allocate, 1, 1) {
   // Implemented in FlowGraphBuilder::VisitNativeBody.
   UNREACHABLE();
   return Object::null();
@@ -55,12 +55,11 @@
 }
 
 // Private factory, expects correct arguments.
-DEFINE_NATIVE_ENTRY(ImmutableList_from, 0, 4) {
-  // Ignore first argument of this factory (type argument).
+DEFINE_NATIVE_ENTRY(ImmutableList_from, 1, 3) {
   const Array& from_array =
-      Array::CheckedHandle(zone, arguments->NativeArgAt(1));
-  const Smi& smi_offset = Smi::CheckedHandle(zone, arguments->NativeArgAt(2));
-  const Smi& smi_length = Smi::CheckedHandle(zone, arguments->NativeArgAt(3));
+      Array::CheckedHandle(zone, arguments->NativeArgAt(0));
+  const Smi& smi_offset = Smi::CheckedHandle(zone, arguments->NativeArgAt(1));
+  const Smi& smi_length = Smi::CheckedHandle(zone, arguments->NativeArgAt(2));
   const intptr_t length = smi_length.Value();
   const intptr_t offset = smi_offset.Value();
   const Array& result = Array::Handle(Array::New(length));
diff --git a/runtime/lib/bool.cc b/runtime/lib/bool.cc
index c18a8c3..5b7b46f 100644
--- a/runtime/lib/bool.cc
+++ b/runtime/lib/bool.cc
@@ -16,9 +16,9 @@
 
 namespace dart {
 
-DEFINE_NATIVE_ENTRY(Bool_fromEnvironment, 0, 3) {
-  GET_NON_NULL_NATIVE_ARGUMENT(String, name, arguments->NativeArgAt(1));
-  GET_NATIVE_ARGUMENT(Bool, default_value, arguments->NativeArgAt(2));
+DEFINE_NATIVE_ENTRY(Bool_fromEnvironment, 0, 2) {
+  GET_NON_NULL_NATIVE_ARGUMENT(String, name, arguments->NativeArgAt(0));
+  GET_NATIVE_ARGUMENT(Bool, default_value, arguments->NativeArgAt(1));
   // Call the embedder to supply us with the environment.
   const String& env_value =
       String::Handle(Api::GetEnvironmentValue(thread, name));
@@ -33,8 +33,8 @@
   return default_value.ptr();
 }
 
-DEFINE_NATIVE_ENTRY(Bool_hasEnvironment, 0, 2) {
-  GET_NON_NULL_NATIVE_ARGUMENT(String, name, arguments->NativeArgAt(1));
+DEFINE_NATIVE_ENTRY(Bool_hasEnvironment, 0, 1) {
+  GET_NON_NULL_NATIVE_ARGUMENT(String, name, arguments->NativeArgAt(0));
   // Call the embedder to supply us with the environment.
   const String& env_value =
       String::Handle(Api::GetEnvironmentValue(thread, name));
diff --git a/runtime/lib/double.cc b/runtime/lib/double.cc
index d602adb..f6b7600 100644
--- a/runtime/lib/double.cc
+++ b/runtime/lib/double.cc
@@ -18,10 +18,8 @@
 
 namespace dart {
 
-DEFINE_NATIVE_ENTRY(Double_doubleFromInteger, 0, 2) {
-  ASSERT(
-      TypeArguments::CheckedHandle(zone, arguments->NativeArgAt(0)).IsNull());
-  GET_NON_NULL_NATIVE_ARGUMENT(Integer, value, arguments->NativeArgAt(1));
+DEFINE_NATIVE_ENTRY(Double_doubleFromInteger, 0, 1) {
+  GET_NON_NULL_NATIVE_ARGUMENT(Integer, value, arguments->NativeArgAt(0));
   if (FLAG_trace_intrinsified_natives) {
     OS::PrintErr("Double_doubleFromInteger %s\n", value.ToCString());
   }
diff --git a/runtime/lib/growable_array.cc b/runtime/lib/growable_array.cc
index 4d1518e..0c20c29 100644
--- a/runtime/lib/growable_array.cc
+++ b/runtime/lib/growable_array.cc
@@ -12,10 +12,10 @@
 
 namespace dart {
 
-DEFINE_NATIVE_ENTRY(GrowableList_allocate, 0, 2) {
+DEFINE_NATIVE_ENTRY(GrowableList_allocate, 1, 1) {
   const TypeArguments& type_arguments =
-      TypeArguments::CheckedHandle(zone, arguments->NativeArgAt(0));
-  GET_NON_NULL_NATIVE_ARGUMENT(Array, data, arguments->NativeArgAt(1));
+      TypeArguments::CheckedHandle(zone, arguments->NativeTypeArgs());
+  GET_NON_NULL_NATIVE_ARGUMENT(Array, data, arguments->NativeArgAt(0));
   if (data.Length() < 0) {
     Exceptions::ThrowRangeError("length",
                                 Integer::Handle(Integer::New(data.Length())),
diff --git a/runtime/lib/integers.cc b/runtime/lib/integers.cc
index 8df26e4..4d2ad40 100644
--- a/runtime/lib/integers.cc
+++ b/runtime/lib/integers.cc
@@ -185,9 +185,9 @@
   return ParseInteger(value);
 }
 
-DEFINE_NATIVE_ENTRY(Integer_fromEnvironment, 0, 3) {
-  GET_NON_NULL_NATIVE_ARGUMENT(String, name, arguments->NativeArgAt(1));
-  GET_NATIVE_ARGUMENT(Integer, default_value, arguments->NativeArgAt(2));
+DEFINE_NATIVE_ENTRY(Integer_fromEnvironment, 0, 2) {
+  GET_NON_NULL_NATIVE_ARGUMENT(String, name, arguments->NativeArgAt(0));
+  GET_NATIVE_ARGUMENT(Integer, default_value, arguments->NativeArgAt(1));
   // Call the embedder to supply us with the environment.
   const String& env_value =
       String::Handle(Api::GetEnvironmentValue(thread, name));
@@ -272,6 +272,26 @@
   return Smi::New(result);
 }
 
+// Unified bit-count natives. Receiver is _IntegerImplementation, so the
+// operand can be either Smi or Mint at runtime.
+DEFINE_NATIVE_ENTRY(Integer_trailingZeroBitCount, 0, 1) {
+  const Integer& operand =
+      Integer::CheckedHandle(zone, arguments->NativeArgAt(0));
+  intptr_t result =
+      Utils::CountTrailingZeros64(static_cast<uint64_t>(operand.Value()));
+  ASSERT(Smi::IsValid(result));
+  return Smi::New(result);
+}
+
+DEFINE_NATIVE_ENTRY(Integer_oneBitCount, 0, 1) {
+  const Integer& operand =
+      Integer::CheckedHandle(zone, arguments->NativeArgAt(0));
+  intptr_t result =
+      Utils::CountOneBits64(static_cast<uint64_t>(operand.Value()));
+  ASSERT(Smi::IsValid(result));
+  return Smi::New(result);
+}
+
 // Should be kept in sync with il_*.cc EmitHashIntegerCodeSequence
 uint32_t Multiply64Hash(int64_t ivalue) {
   const uint64_t magic_constant = /*0x1b873593cc9e*/ 0x2d51;
diff --git a/runtime/lib/isolate.cc b/runtime/lib/isolate.cc
index 907828d..d4191b4 100644
--- a/runtime/lib/isolate.cc
+++ b/runtime/lib/isolate.cc
@@ -31,9 +31,7 @@
 
 namespace dart {
 
-DEFINE_NATIVE_ENTRY(Capability_factory, 0, 1) {
-  ASSERT(
-      TypeArguments::CheckedHandle(zone, arguments->NativeArgAt(0)).IsNull());
+DEFINE_NATIVE_ENTRY(Capability_factory, 0, 0) {
   // Keep capability IDs less than 2^53 so web clients of the service
   // protocol can process it properly.
   //
@@ -57,10 +55,8 @@
   return Smi::New(hash);
 }
 
-DEFINE_NATIVE_ENTRY(RawReceivePort_factory, 0, 2) {
-  ASSERT(
-      TypeArguments::CheckedHandle(zone, arguments->NativeArgAt(0)).IsNull());
-  GET_NON_NULL_NATIVE_ARGUMENT(String, debug_name, arguments->NativeArgAt(1));
+DEFINE_NATIVE_ENTRY(RawReceivePort_factory, 0, 1) {
+  GET_NON_NULL_NATIVE_ARGUMENT(String, debug_name, arguments->NativeArgAt(0));
   if (isolate == nullptr) {
     ThrowCantRunWithoutIsolateError();
     UNREACHABLE();
@@ -1363,12 +1359,9 @@
   Exceptions::ThrowArgumentError(instance);
 }
 
-DEFINE_NATIVE_ENTRY(TransferableTypedData_factory, 0, 2) {
-  ASSERT(
-      TypeArguments::CheckedHandle(zone, arguments->NativeArgAt(0)).IsNull());
-
+DEFINE_NATIVE_ENTRY(TransferableTypedData_factory, 0, 1) {
   GET_NON_NULL_NATIVE_ARGUMENT(Instance, array_instance,
-                               arguments->NativeArgAt(1));
+                               arguments->NativeArgAt(0));
 
   Array& array = Array::Handle();
   intptr_t array_length;
diff --git a/runtime/lib/mirrors.cc b/runtime/lib/mirrors.cc
index b24249f..48385a0 100644
--- a/runtime/lib/mirrors.cc
+++ b/runtime/lib/mirrors.cc
@@ -1405,19 +1405,32 @@
   }
 
   ASSERT(!type.IsNull());
-  TypeArguments& type_arguments = TypeArguments::Handle();
   if (!type.IsInstantiated()) {
     // Must have been a declaration type.
-    const Type& rare_type = Type::Handle(klass.RareType());
-    ASSERT(rare_type.IsInstantiated());
-    type_arguments = rare_type.GetInstanceTypeArguments(thread);
-  } else {
-    type_arguments = type.GetInstanceTypeArguments(thread);
+    type = klass.RareType();
+    ASSERT(type.IsInstantiated());
+  }
+
+  const bool is_generic_factory =
+      lookup_constructor.IsFactory() && lookup_constructor.IsGeneric();
+  intptr_t type_args_len = 0;
+  TypeArguments& instantiator_type_arguments = TypeArguments::Handle();
+  TypeArguments& function_type_arguments = TypeArguments::Handle();
+  if (lookup_constructor.IsGenerativeConstructor()) {
+    instantiator_type_arguments = type.GetInstanceTypeArguments(thread);
+  } else if (is_generic_factory) {
+    function_type_arguments = type.arguments();
+    type_args_len = lookup_constructor.NumTypeParameters();
+    ASSERT(function_type_arguments.IsNull() ||
+           function_type_arguments.Length() == type_args_len);
   }
 
   Class& redirected_klass = Class::Handle(klass.ptr());
   const intptr_t num_explicit_args = explicit_args.Length();
-  const intptr_t num_implicit_args = 1;
+  const intptr_t num_implicit_positional_args =
+      lookup_constructor.IsGenerativeConstructor() ? 1 : 0;
+  const intptr_t num_implicit_args =
+      ((type_args_len > 0) ? 1 : 0) + num_implicit_positional_args;
   const Array& args =
       Array::Handle(Array::New(num_implicit_args + num_explicit_args));
 
@@ -1427,10 +1440,14 @@
     explicit_argument = explicit_args.At(i);
     args.SetAt(i + num_implicit_args, explicit_argument);
   }
+  if (is_generic_factory) {
+    args.SetAt(0, function_type_arguments);
+  }
 
-  const int kTypeArgsLen = 0;
-  const Array& args_descriptor_array = Array::Handle(
-      ArgumentsDescriptor::NewBoxed(kTypeArgsLen, args.Length(), arg_names));
+  const Array& args_descriptor_array =
+      Array::Handle(ArgumentsDescriptor::NewBoxed(
+          type_args_len, num_implicit_positional_args + num_explicit_args,
+          arg_names));
 
   ArgumentsDescriptor args_descriptor(args_descriptor_array);
   if (!lookup_constructor.AreValidArguments(args_descriptor, nullptr)) {
@@ -1442,14 +1459,18 @@
     UNREACHABLE();
   }
 #if defined(DEBUG)
-  // Make sure the receiver is the null value, so that DoArgumentTypesMatch does
-  // not attempt to retrieve the instantiator type arguments from the receiver.
-  explicit_argument = args.At(args_descriptor.FirstArgIndex());
-  ASSERT(explicit_argument.IsNull());
+  if (lookup_constructor.IsGenerativeConstructor()) {
+    // Make sure the receiver is the null value, so that DoArgumentTypesMatch
+    // does not attempt to retrieve the instantiator type arguments from
+    // the receiver.
+    explicit_argument = args.At(args_descriptor.FirstArgIndex());
+    ASSERT(explicit_argument.IsNull());
+  }
 #endif
   const Object& type_error =
       Object::Handle(lookup_constructor.DoArgumentTypesMatch(
-          args, args_descriptor, type_arguments));
+          args, args_descriptor, instantiator_type_arguments,
+          function_type_arguments));
   if (!type_error.IsNull()) {
     Exceptions::PropagateError(Error::Cast(type_error));
     UNREACHABLE();
@@ -1461,16 +1482,13 @@
     // Note we have delayed allocation until after the function
     // type and argument matching checks.
     new_object = Instance::New(redirected_klass);
-    if (!type_arguments.IsNull()) {
+    if (!instantiator_type_arguments.IsNull()) {
       // The type arguments will be null if the class has no type parameters, in
       // which case the following call would fail because there is no slot
       // reserved in the object for the type vector.
-      new_object.SetTypeArguments(type_arguments);
+      new_object.SetTypeArguments(instantiator_type_arguments);
     }
     args.SetAt(0, new_object);
-  } else {
-    // Factories get type arguments.
-    args.SetAt(0, type_arguments);
   }
 
   // Invoke the constructor and return the new object.
diff --git a/runtime/lib/profiler.cc b/runtime/lib/profiler.cc
index 939e88e..140d240 100644
--- a/runtime/lib/profiler.cc
+++ b/runtime/lib/profiler.cc
@@ -15,10 +15,8 @@
 
 // Native implementations of the profiler parts of the dart:developer library.
 
-DEFINE_NATIVE_ENTRY(UserTag_new, 0, 2) {
-  ASSERT(
-      TypeArguments::CheckedHandle(zone, arguments->NativeArgAt(0)).IsNull());
-  GET_NON_NULL_NATIVE_ARGUMENT(String, tag_label, arguments->NativeArgAt(1));
+DEFINE_NATIVE_ENTRY(UserTag_new, 0, 1) {
+  GET_NON_NULL_NATIVE_ARGUMENT(String, tag_label, arguments->NativeArgAt(0));
   return UserTag::New(thread, tag_label);
 }
 
diff --git a/runtime/lib/regexp.cc b/runtime/lib/regexp.cc
index 1d3404b..649806a 100644
--- a/runtime/lib/regexp.cc
+++ b/runtime/lib/regexp.cc
@@ -17,15 +17,13 @@
 
 namespace dart {
 
-DEFINE_NATIVE_ENTRY(RegExp_factory, 0, 6) {
-  ASSERT(
-      TypeArguments::CheckedHandle(zone, arguments->NativeArgAt(0)).IsNull());
-  GET_NON_NULL_NATIVE_ARGUMENT(String, pattern, arguments->NativeArgAt(1));
+DEFINE_NATIVE_ENTRY(RegExp_factory, 0, 5) {
+  GET_NON_NULL_NATIVE_ARGUMENT(String, pattern, arguments->NativeArgAt(0));
 
-  bool multi_line = arguments->NativeArgAt(2) == Bool::True().ptr();
-  bool ignore_case = arguments->NativeArgAt(3) != Bool::True().ptr();
-  bool unicode = arguments->NativeArgAt(4) == Bool::True().ptr();
-  bool dot_all = arguments->NativeArgAt(5) == Bool::True().ptr();
+  bool multi_line = arguments->NativeArgAt(1) == Bool::True().ptr();
+  bool ignore_case = arguments->NativeArgAt(2) != Bool::True().ptr();
+  bool unicode = arguments->NativeArgAt(3) == Bool::True().ptr();
+  bool dot_all = arguments->NativeArgAt(4) == Bool::True().ptr();
 
   RegExpFlags flags;
   flags |= RegExpFlag::kGlobal;  // All dart regexps are global.
diff --git a/runtime/lib/simd128.cc b/runtime/lib/simd128.cc
index 9d8f684..45eab70 100644
--- a/runtime/lib/simd128.cc
+++ b/runtime/lib/simd128.cc
@@ -36,19 +36,17 @@
   return Float32x4::New(_v, _v, _v, _v);
 }
 
-DEFINE_NATIVE_ENTRY(Float32x4_zero, 0, 1) {
-  ASSERT(
-      TypeArguments::CheckedHandle(zone, arguments->NativeArgAt(0)).IsNull());
+DEFINE_NATIVE_ENTRY(Float32x4_zero, 0, 0) {
   return Float32x4::New(0.0f, 0.0f, 0.0f, 0.0f);
 }
 
-DEFINE_NATIVE_ENTRY(Float32x4_fromInt32x4Bits, 0, 2) {
-  GET_NON_NULL_NATIVE_ARGUMENT(Int32x4, v, arguments->NativeArgAt(1));
+DEFINE_NATIVE_ENTRY(Float32x4_fromInt32x4Bits, 0, 1) {
+  GET_NON_NULL_NATIVE_ARGUMENT(Int32x4, v, arguments->NativeArgAt(0));
   return Float32x4::New(v.value());
 }
 
-DEFINE_NATIVE_ENTRY(Float32x4_fromFloat64x2, 0, 2) {
-  GET_NON_NULL_NATIVE_ARGUMENT(Float64x2, v, arguments->NativeArgAt(1));
+DEFINE_NATIVE_ENTRY(Float32x4_fromFloat64x2, 0, 1) {
+  GET_NON_NULL_NATIVE_ARGUMENT(Float64x2, v, arguments->NativeArgAt(0));
   float _x = static_cast<float>(v.x());
   float _y = static_cast<float>(v.y());
   return Float32x4::New(_x, _y, 0.0f, 0.0f);
@@ -433,8 +431,8 @@
   return Int32x4::New(_x, _y, _z, _w);
 }
 
-DEFINE_NATIVE_ENTRY(Int32x4_fromFloat32x4Bits, 0, 2) {
-  GET_NON_NULL_NATIVE_ARGUMENT(Float32x4, v, arguments->NativeArgAt(1));
+DEFINE_NATIVE_ENTRY(Int32x4_fromFloat32x4Bits, 0, 1) {
+  GET_NON_NULL_NATIVE_ARGUMENT(Float32x4, v, arguments->NativeArgAt(0));
   return Int32x4::New(v.value());
 }
 
@@ -693,16 +691,12 @@
   return Float64x2::New(v.value(), v.value());
 }
 
-DEFINE_NATIVE_ENTRY(Float64x2_zero, 0, 1) {
-  ASSERT(
-      TypeArguments::CheckedHandle(zone, arguments->NativeArgAt(0)).IsNull());
+DEFINE_NATIVE_ENTRY(Float64x2_zero, 0, 0) {
   return Float64x2::New(0.0, 0.0);
 }
 
-DEFINE_NATIVE_ENTRY(Float64x2_fromFloat32x4, 0, 2) {
-  ASSERT(
-      TypeArguments::CheckedHandle(zone, arguments->NativeArgAt(0)).IsNull());
-  GET_NON_NULL_NATIVE_ARGUMENT(Float32x4, v, arguments->NativeArgAt(1));
+DEFINE_NATIVE_ENTRY(Float64x2_fromFloat32x4, 0, 1) {
+  GET_NON_NULL_NATIVE_ARGUMENT(Float32x4, v, arguments->NativeArgAt(0));
   double _x = v.x();
   double _y = v.y();
   return Float64x2::New(_x, _y);
diff --git a/runtime/lib/string.cc b/runtime/lib/string.cc
index e2da443..05039e0 100644
--- a/runtime/lib/string.cc
+++ b/runtime/lib/string.cc
@@ -16,9 +16,9 @@
 
 namespace dart {
 
-DEFINE_NATIVE_ENTRY(String_fromEnvironment, 0, 3) {
-  GET_NON_NULL_NATIVE_ARGUMENT(String, name, arguments->NativeArgAt(1));
-  GET_NATIVE_ARGUMENT(String, default_value, arguments->NativeArgAt(2));
+DEFINE_NATIVE_ENTRY(String_fromEnvironment, 0, 2) {
+  GET_NON_NULL_NATIVE_ARGUMENT(String, name, arguments->NativeArgAt(0));
+  GET_NATIVE_ARGUMENT(String, default_value, arguments->NativeArgAt(1));
   // Call the embedder to supply us with the environment.
   const String& env_value =
       String::Handle(Api::GetEnvironmentValue(thread, name));
diff --git a/runtime/tests/vm/dart/inline_generic_functions_il_test.dart b/runtime/tests/vm/dart/inline_generic_functions_il_test.dart
new file mode 100644
index 0000000..a1b2f1b
--- /dev/null
+++ b/runtime/tests/vm/dart/inline_generic_functions_il_test.dart
@@ -0,0 +1,98 @@
+// Copyright (c) 2026, 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.
+
+// Verifies that compiler can inline generic functions with optional
+// parameters.
+
+import 'package:vm/testing/il_matchers.dart';
+
+@pragma('vm:never-inline')
+void foo(int x) {
+  print(x);
+}
+
+@pragma('vm:prefer-inline')
+void callee1<T>() {
+  foo(10);
+}
+
+@pragma('vm:testing:print-flow-graph')
+@pragma('vm:never-inline')
+void test1() {
+  callee1<String>();
+}
+
+void matchCallFoo(FlowGraph graph) {
+  graph.dump();
+  graph.match([
+    match.block('Graph', ['v0' << match.Constant(value: null)]),
+    match.block('Function', [
+      match.CheckStackOverflow(),
+      match.StaticCall(function: 'foo'),
+      match.DartReturn('v0'),
+    ]),
+  ]);
+}
+
+void matchIL$test1(FlowGraph graph) {
+  matchCallFoo(graph);
+}
+
+@pragma('vm:prefer-inline')
+void callee2<T>(int a0, [int a1 = 0]) {
+  foo(a0 + a1);
+}
+
+@pragma('vm:testing:print-flow-graph')
+@pragma('vm:never-inline')
+void test2a() {
+  callee2<int>(10);
+}
+
+void matchIL$test2a(FlowGraph graph) {
+  matchCallFoo(graph);
+}
+
+@pragma('vm:testing:print-flow-graph')
+@pragma('vm:never-inline')
+void test2b() {
+  callee2<double>(20, 30);
+}
+
+void matchIL$test2b(FlowGraph graph) {
+  matchCallFoo(graph);
+}
+
+@pragma('vm:prefer-inline')
+void callee3<T>(int a0, {int a1 = 0}) {
+  foo(a0 + a1);
+}
+
+@pragma('vm:testing:print-flow-graph')
+@pragma('vm:never-inline')
+void test3a() {
+  callee3<int>(10);
+}
+
+void matchIL$test3a(FlowGraph graph) {
+  matchCallFoo(graph);
+}
+
+@pragma('vm:testing:print-flow-graph')
+@pragma('vm:never-inline')
+void test3b() {
+  callee3<double>(20, a1: 30);
+}
+
+void matchIL$test3b(FlowGraph graph) {
+  matchCallFoo(graph);
+}
+
+void main() {
+  test1();
+  test2a();
+  test2b();
+  test3a();
+  test3b();
+}
diff --git a/runtime/tests/vm/dart/regress_63336_test.dart b/runtime/tests/vm/dart/regress_63336_test.dart
new file mode 100644
index 0000000..c6e08f0
--- /dev/null
+++ b/runtime/tests/vm/dart/regress_63336_test.dart
@@ -0,0 +1,43 @@
+// Copyright (c) 2026, 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.
+
+// Verify that a load from a catch block is not considered loop invariant
+// and not hoisted out of the loop if there is a store in the try body.
+// Regression test for https://github.com/dart-lang/sdk/issues/63336.
+
+// VMOptions=--optimization-counter-threshold=100 --no-background-compilation
+
+import 'package:expect/expect.dart';
+
+int var63 = 28;
+int var68 = 44;
+
+void test() {
+  int n = 43;
+  while (--n > 0) {
+    try {
+      var63++;
+      // Terminate block without reaching a loop backedge,
+      // so try body won't be included into the loop body
+      // through explicit predecessors of the backedge.
+      throw 'bye';
+      // Make sure load is not immediately in a CatchBlockEntry.
+    } on StackOverflowError {
+      rethrow;
+    } catch (_) {
+      // Load from 'var63' is considered loop invariant if
+      // loop body doesn't include try block body.
+      var68 = var63;
+    }
+  }
+}
+
+void main() {
+  for (int i = 0; i < 200; ++i) {
+    var63 = 28;
+    var68 = 44;
+    test();
+    Expect.equals(70, var68);
+  }
+}
diff --git a/runtime/tests/vm/dart/regress_b508627933_test.dart b/runtime/tests/vm/dart/regress_b508627933_test.dart
new file mode 100644
index 0000000..d7311a7
--- /dev/null
+++ b/runtime/tests/vm/dart/regress_b508627933_test.dart
@@ -0,0 +1,29 @@
+// Copyright (c) 2026, 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.
+
+// Check that RawZLibFilter.process validates its arguments.
+
+import 'dart:io';
+import 'package:expect/expect.dart';
+
+void main() {
+  Expect.throwsRangeError(
+    () => RawZLibFilter.deflateFilter().process([1, 2, 3], -1, 0),
+  );
+  Expect.throwsRangeError(
+    () => RawZLibFilter.deflateFilter().process([1, 2, 3], -2, -1),
+  );
+  Expect.throwsRangeError(
+    () => RawZLibFilter.deflateFilter().process([1, 2, 3], 0, -1),
+  );
+  Expect.throwsRangeError(
+    () => RawZLibFilter.deflateFilter().process([1, 2, 3], 4, 2),
+  );
+  Expect.throwsRangeError(
+    () => RawZLibFilter.deflateFilter().process([1, 2, 3], 2, 4),
+  );
+  Expect.throwsRangeError(
+    () => RawZLibFilter.deflateFilter().process([1, 2, 3], 5, 6),
+  );
+}
diff --git a/runtime/tools/dartfuzz/flag_fuzzer.dart b/runtime/tools/dartfuzz/flag_fuzzer.dart
index 0b638ad..4e01b43 100644
--- a/runtime/tools/dartfuzz/flag_fuzzer.dart
+++ b/runtime/tools/dartfuzz/flag_fuzzer.dart
@@ -142,7 +142,7 @@
 const statusTimeout = Duration(minutes: 5);
 int pendingTaskCount = 0;
 late Timer pendingTimer;
-taskStart() {
+void taskStart() {
   if (pendingTaskCount++ == 0) {
     pendingTimer = new Timer.periodic(statusTimeout, (timer) {
       print(
@@ -153,13 +153,13 @@
   }
 }
 
-taskEnd() {
+void taskEnd() {
   if (--pendingTaskCount == 0) {
     pendingTimer.cancel();
   }
 }
 
-test(
+Future<void> test(
   List<String> Function(String) createDartCommand,
   int taskIndex,
   String extension,
@@ -171,7 +171,7 @@
   var dartArguments = dartCommand.getRange(1, dartCommand.length).toList();
 
   var buildDir = oneOf(buildDirs);
-  var commands;
+  List<List<String>> commands;
   if (random.nextBool()) {
     // JIT
     commands = [
@@ -266,7 +266,7 @@
   taskEnd();
 }
 
-shard(
+Future<void> shard(
   List<String> Function(String) createDartCommand,
   int shardIndex,
   String extension,
@@ -276,7 +276,7 @@
   }
 }
 
-flagFuzz(
+Future<void> flagFuzz(
   List<String> Function(String) createDartCommand,
   String extension,
 ) async {
diff --git a/runtime/tools/dartfuzz/flag_fuzzer_dart2js.dart b/runtime/tools/dartfuzz/flag_fuzzer_dart2js.dart
index 16cb486..7a4d6b3 100644
--- a/runtime/tools/dartfuzz/flag_fuzzer_dart2js.dart
+++ b/runtime/tools/dartfuzz/flag_fuzzer_dart2js.dart
@@ -7,7 +7,7 @@
 
 import "flag_fuzzer.dart";
 
-main() => flagFuzz(
+Future<void> main() => flagFuzz(
   (String output) => [
     "pkg/compiler/lib/src/dart2js.dart",
     "--invoker=test",
diff --git a/runtime/tools/dartfuzz/flag_fuzzer_dart2wasm.dart b/runtime/tools/dartfuzz/flag_fuzzer_dart2wasm.dart
index 56a39c6..27a8f02 100644
--- a/runtime/tools/dartfuzz/flag_fuzzer_dart2wasm.dart
+++ b/runtime/tools/dartfuzz/flag_fuzzer_dart2wasm.dart
@@ -7,7 +7,7 @@
 
 import "flag_fuzzer.dart";
 
-main() => flagFuzz(
+Future<void> main() => flagFuzz(
   (String output) => [
     "pkg/dart2wasm/bin/dart2wasm.dart",
     "--platform=out/ReleaseX64/dart2wasm_platform.dill",
diff --git a/runtime/tools/profiling/lib/src/pprof/generated/profile.pb.dart b/runtime/tools/profiling/lib/src/pprof/generated/profile.pb.dart
index 71199bfd..c2775a0 100644
--- a/runtime/tools/profiling/lib/src/pprof/generated/profile.pb.dart
+++ b/runtime/tools/profiling/lib/src/pprof/generated/profile.pb.dart
@@ -1,19 +1,22 @@
+// This is a generated file - do not edit.
 //
-//  Generated code. Do not modify.
-//  source: profile.proto
-//
-// @dart = 2.12
+// Generated from profile.proto.
+
+// @dart = 3.3
 
 // ignore_for_file: annotate_overrides, camel_case_types, comment_references
-// ignore_for_file: constant_identifier_names, library_prefixes
-// ignore_for_file: non_constant_identifier_names, prefer_final_fields
-// ignore_for_file: unnecessary_import, unnecessary_this, unused_import
+// ignore_for_file: constant_identifier_names
+// ignore_for_file: curly_braces_in_flow_control_structures
+// ignore_for_file: deprecated_member_use_from_same_package, library_prefixes
+// ignore_for_file: non_constant_identifier_names, prefer_relative_imports
 
 import 'dart:core' as $core;
 
 import 'package:fixnum/fixnum.dart' as $fixnum;
 import 'package:protobuf/protobuf.dart' as $pb;
 
+export 'package:protobuf/protobuf.dart' show GeneratedMessageGenericExtensions;
+
 class Profile extends $pb.GeneratedMessage {
   factory Profile({
     $core.Iterable<ValueType>? sampleType,
@@ -31,73 +34,46 @@
     $core.Iterable<$fixnum.Int64>? comment,
     $fixnum.Int64? defaultSampleType,
   }) {
-    final $result = create();
-    if (sampleType != null) {
-      $result.sampleType.addAll(sampleType);
-    }
-    if (sample != null) {
-      $result.sample.addAll(sample);
-    }
-    if (mapping != null) {
-      $result.mapping.addAll(mapping);
-    }
-    if (location != null) {
-      $result.location.addAll(location);
-    }
-    if (function != null) {
-      $result.function.addAll(function);
-    }
-    if (stringTable != null) {
-      $result.stringTable.addAll(stringTable);
-    }
-    if (dropFrames != null) {
-      $result.dropFrames = dropFrames;
-    }
-    if (keepFrames != null) {
-      $result.keepFrames = keepFrames;
-    }
-    if (timeNanos != null) {
-      $result.timeNanos = timeNanos;
-    }
-    if (durationNanos != null) {
-      $result.durationNanos = durationNanos;
-    }
-    if (periodType != null) {
-      $result.periodType = periodType;
-    }
-    if (period != null) {
-      $result.period = period;
-    }
-    if (comment != null) {
-      $result.comment.addAll(comment);
-    }
-    if (defaultSampleType != null) {
-      $result.defaultSampleType = defaultSampleType;
-    }
-    return $result;
+    final result = create();
+    if (sampleType != null) result.sampleType.addAll(sampleType);
+    if (sample != null) result.sample.addAll(sample);
+    if (mapping != null) result.mapping.addAll(mapping);
+    if (location != null) result.location.addAll(location);
+    if (function != null) result.function.addAll(function);
+    if (stringTable != null) result.stringTable.addAll(stringTable);
+    if (dropFrames != null) result.dropFrames = dropFrames;
+    if (keepFrames != null) result.keepFrames = keepFrames;
+    if (timeNanos != null) result.timeNanos = timeNanos;
+    if (durationNanos != null) result.durationNanos = durationNanos;
+    if (periodType != null) result.periodType = periodType;
+    if (period != null) result.period = period;
+    if (comment != null) result.comment.addAll(comment);
+    if (defaultSampleType != null) result.defaultSampleType = defaultSampleType;
+    return result;
   }
-  Profile._() : super();
-  factory Profile.fromBuffer($core.List<$core.int> i,
-          [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
-      create()..mergeFromBuffer(i, r);
-  factory Profile.fromJson($core.String i,
-          [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
-      create()..mergeFromJson(i, r);
+
+  Profile._();
+
+  factory Profile.fromBuffer($core.List<$core.int> data,
+          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>
+      create()..mergeFromBuffer(data, registry);
+  factory Profile.fromJson($core.String json,
+          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>
+      create()..mergeFromJson(json, registry);
 
   static final $pb.BuilderInfo _i = $pb.BuilderInfo(
       _omitMessageNames ? '' : 'Profile',
       package: const $pb.PackageName(
           _omitMessageNames ? '' : 'perfetto.third_party.perftools.profiles'),
       createEmptyInstance: create)
-    ..pc<ValueType>(1, _omitFieldNames ? '' : 'sampleType', $pb.PbFieldType.PM,
+    ..pPM<ValueType>(1, _omitFieldNames ? '' : 'sampleType',
         subBuilder: ValueType.create)
-    ..pc<Sample>(2, _omitFieldNames ? '' : 'sample', $pb.PbFieldType.PM,
-        subBuilder: Sample.create)
-    ..pc<Mapping>(3, _omitFieldNames ? '' : 'mapping', $pb.PbFieldType.PM,
+    ..pPM<Sample>(2, _omitFieldNames ? '' : 'sample', subBuilder: Sample.create)
+    ..pPM<Mapping>(3, _omitFieldNames ? '' : 'mapping',
         subBuilder: Mapping.create)
-    ..pc<Location>(4, _omitFieldNames ? '' : 'location', $pb.PbFieldType.PM,
+    ..pPM<Location>(4, _omitFieldNames ? '' : 'location',
         subBuilder: Location.create)
-    ..pc<Function_>(5, _omitFieldNames ? '' : 'function', $pb.PbFieldType.PM,
+    ..pPM<Function_>(5, _omitFieldNames ? '' : 'function',
         subBuilder: Function_.create)
     ..pPS(6, _omitFieldNames ? '' : 'stringTable')
     ..aInt64(7, _omitFieldNames ? '' : 'dropFrames')
@@ -111,22 +87,19 @@
     ..aInt64(14, _omitFieldNames ? '' : 'defaultSampleType')
     ..hasRequiredFields = false;
 
-  @$core.Deprecated('Using this can add significant overhead to your binary. '
-      'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
-      'Will be removed in next major version')
-  Profile clone() => Profile()..mergeFromMessage(this);
-  @$core.Deprecated('Using this can add significant overhead to your binary. '
-      'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
-      'Will be removed in next major version')
+  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')
+  Profile clone() => deepCopy();
+  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')
   Profile copyWith(void Function(Profile) updates) =>
       super.copyWith((message) => updates(message as Profile)) as Profile;
 
+  @$core.override
   $pb.BuilderInfo get info_ => _i;
 
   @$core.pragma('dart2js:noInline')
   static Profile create() => Profile._();
+  @$core.override
   Profile createEmptyInstance() => create();
-  static $pb.PbList<Profile> createRepeated() => $pb.PbList<Profile>();
   @$core.pragma('dart2js:noInline')
   static Profile getDefault() =>
       _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<Profile>(create);
@@ -141,29 +114,29 @@
   /// by the sample, by convention it should be at index 0 and use
   /// sample_type.unit == "count".
   @$pb.TagNumber(1)
-  $core.List<ValueType> get sampleType => $_getList(0);
+  $pb.PbList<ValueType> get sampleType => $_getList(0);
 
   /// The set of samples recorded in this profile.
   @$pb.TagNumber(2)
-  $core.List<Sample> get sample => $_getList(1);
+  $pb.PbList<Sample> get sample => $_getList(1);
 
   /// Mapping from address ranges to the image/binary/library mapped
   /// into that address range.  mapping[0] will be the main binary.
   @$pb.TagNumber(3)
-  $core.List<Mapping> get mapping => $_getList(2);
+  $pb.PbList<Mapping> get mapping => $_getList(2);
 
   /// Useful program location
   @$pb.TagNumber(4)
-  $core.List<Location> get location => $_getList(3);
+  $pb.PbList<Location> get location => $_getList(3);
 
   /// Functions referenced by locations
   @$pb.TagNumber(5)
-  $core.List<Function_> get function => $_getList(4);
+  $pb.PbList<Function_> get function => $_getList(4);
 
   /// A common table for strings referenced by various messages.
   /// string_table[0] must always be "".
   @$pb.TagNumber(6)
-  $core.List<$core.String> get stringTable => $_getList(5);
+  $pb.PbList<$core.String> get stringTable => $_getList(5);
 
   /// frames with Function.function_name fully matching the following
   /// regexp will be dropped from the samples, along with their successors.
@@ -171,14 +144,11 @@
   @$pb.TagNumber(7)
   $fixnum.Int64 get dropFrames => $_getI64(6);
   @$pb.TagNumber(7)
-  set dropFrames($fixnum.Int64 v) {
-    $_setInt64(6, v);
-  }
-
+  set dropFrames($fixnum.Int64 value) => $_setInt64(6, value);
   @$pb.TagNumber(7)
   $core.bool hasDropFrames() => $_has(6);
   @$pb.TagNumber(7)
-  void clearDropFrames() => clearField(7);
+  void clearDropFrames() => $_clearField(7);
 
   /// frames with Function.function_name fully matching the following
   /// regexp will be kept, even if it matches drop_functions.
@@ -186,54 +156,42 @@
   @$pb.TagNumber(8)
   $fixnum.Int64 get keepFrames => $_getI64(7);
   @$pb.TagNumber(8)
-  set keepFrames($fixnum.Int64 v) {
-    $_setInt64(7, v);
-  }
-
+  set keepFrames($fixnum.Int64 value) => $_setInt64(7, value);
   @$pb.TagNumber(8)
   $core.bool hasKeepFrames() => $_has(7);
   @$pb.TagNumber(8)
-  void clearKeepFrames() => clearField(8);
+  void clearKeepFrames() => $_clearField(8);
 
   /// Time of collection (UTC) represented as nanoseconds past the epoch.
   @$pb.TagNumber(9)
   $fixnum.Int64 get timeNanos => $_getI64(8);
   @$pb.TagNumber(9)
-  set timeNanos($fixnum.Int64 v) {
-    $_setInt64(8, v);
-  }
-
+  set timeNanos($fixnum.Int64 value) => $_setInt64(8, value);
   @$pb.TagNumber(9)
   $core.bool hasTimeNanos() => $_has(8);
   @$pb.TagNumber(9)
-  void clearTimeNanos() => clearField(9);
+  void clearTimeNanos() => $_clearField(9);
 
   /// Duration of the profile, if a duration makes sense.
   @$pb.TagNumber(10)
   $fixnum.Int64 get durationNanos => $_getI64(9);
   @$pb.TagNumber(10)
-  set durationNanos($fixnum.Int64 v) {
-    $_setInt64(9, v);
-  }
-
+  set durationNanos($fixnum.Int64 value) => $_setInt64(9, value);
   @$pb.TagNumber(10)
   $core.bool hasDurationNanos() => $_has(9);
   @$pb.TagNumber(10)
-  void clearDurationNanos() => clearField(10);
+  void clearDurationNanos() => $_clearField(10);
 
   /// The kind of events between sampled ocurrences.
   /// e.g [ "cpu","cycles" ] or [ "heap","bytes" ]
   @$pb.TagNumber(11)
   ValueType get periodType => $_getN(10);
   @$pb.TagNumber(11)
-  set periodType(ValueType v) {
-    setField(11, v);
-  }
-
+  set periodType(ValueType value) => $_setField(11, value);
   @$pb.TagNumber(11)
   $core.bool hasPeriodType() => $_has(10);
   @$pb.TagNumber(11)
-  void clearPeriodType() => clearField(11);
+  void clearPeriodType() => $_clearField(11);
   @$pb.TagNumber(11)
   ValueType ensurePeriodType() => $_ensure(10);
 
@@ -241,33 +199,27 @@
   @$pb.TagNumber(12)
   $fixnum.Int64 get period => $_getI64(11);
   @$pb.TagNumber(12)
-  set period($fixnum.Int64 v) {
-    $_setInt64(11, v);
-  }
-
+  set period($fixnum.Int64 value) => $_setInt64(11, value);
   @$pb.TagNumber(12)
   $core.bool hasPeriod() => $_has(11);
   @$pb.TagNumber(12)
-  void clearPeriod() => clearField(12);
+  void clearPeriod() => $_clearField(12);
 
   /// Freeform text associated to the profile.
   /// Indices into string table.
   @$pb.TagNumber(13)
-  $core.List<$fixnum.Int64> get comment => $_getList(12);
+  $pb.PbList<$fixnum.Int64> get comment => $_getList(12);
 
   /// Index into the string table of the type of the preferred sample
   /// value. If unset, clients should default to the last sample value.
   @$pb.TagNumber(14)
   $fixnum.Int64 get defaultSampleType => $_getI64(13);
   @$pb.TagNumber(14)
-  set defaultSampleType($fixnum.Int64 v) {
-    $_setInt64(13, v);
-  }
-
+  set defaultSampleType($fixnum.Int64 value) => $_setInt64(13, value);
   @$pb.TagNumber(14)
   $core.bool hasDefaultSampleType() => $_has(13);
   @$pb.TagNumber(14)
-  void clearDefaultSampleType() => clearField(14);
+  void clearDefaultSampleType() => $_clearField(14);
 }
 
 /// ValueType describes the semantics and measurement units of a value.
@@ -276,22 +228,20 @@
     $fixnum.Int64? type,
     $fixnum.Int64? unit,
   }) {
-    final $result = create();
-    if (type != null) {
-      $result.type = type;
-    }
-    if (unit != null) {
-      $result.unit = unit;
-    }
-    return $result;
+    final result = create();
+    if (type != null) result.type = type;
+    if (unit != null) result.unit = unit;
+    return result;
   }
-  ValueType._() : super();
-  factory ValueType.fromBuffer($core.List<$core.int> i,
-          [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
-      create()..mergeFromBuffer(i, r);
-  factory ValueType.fromJson($core.String i,
-          [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
-      create()..mergeFromJson(i, r);
+
+  ValueType._();
+
+  factory ValueType.fromBuffer($core.List<$core.int> data,
+          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>
+      create()..mergeFromBuffer(data, registry);
+  factory ValueType.fromJson($core.String json,
+          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>
+      create()..mergeFromJson(json, registry);
 
   static final $pb.BuilderInfo _i = $pb.BuilderInfo(
       _omitMessageNames ? '' : 'ValueType',
@@ -302,22 +252,19 @@
     ..aInt64(2, _omitFieldNames ? '' : 'unit')
     ..hasRequiredFields = false;
 
-  @$core.Deprecated('Using this can add significant overhead to your binary. '
-      'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
-      'Will be removed in next major version')
-  ValueType clone() => ValueType()..mergeFromMessage(this);
-  @$core.Deprecated('Using this can add significant overhead to your binary. '
-      'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
-      'Will be removed in next major version')
+  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')
+  ValueType clone() => deepCopy();
+  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')
   ValueType copyWith(void Function(ValueType) updates) =>
       super.copyWith((message) => updates(message as ValueType)) as ValueType;
 
+  @$core.override
   $pb.BuilderInfo get info_ => _i;
 
   @$core.pragma('dart2js:noInline')
   static ValueType create() => ValueType._();
+  @$core.override
   ValueType createEmptyInstance() => create();
-  static $pb.PbList<ValueType> createRepeated() => $pb.PbList<ValueType>();
   @$core.pragma('dart2js:noInline')
   static ValueType getDefault() =>
       _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<ValueType>(create);
@@ -327,27 +274,21 @@
   @$pb.TagNumber(1)
   $fixnum.Int64 get type => $_getI64(0);
   @$pb.TagNumber(1)
-  set type($fixnum.Int64 v) {
-    $_setInt64(0, v);
-  }
-
+  set type($fixnum.Int64 value) => $_setInt64(0, value);
   @$pb.TagNumber(1)
   $core.bool hasType() => $_has(0);
   @$pb.TagNumber(1)
-  void clearType() => clearField(1);
+  void clearType() => $_clearField(1);
 
   /// Index into string table.
   @$pb.TagNumber(2)
   $fixnum.Int64 get unit => $_getI64(1);
   @$pb.TagNumber(2)
-  set unit($fixnum.Int64 v) {
-    $_setInt64(1, v);
-  }
-
+  set unit($fixnum.Int64 value) => $_setInt64(1, value);
   @$pb.TagNumber(2)
   $core.bool hasUnit() => $_has(1);
   @$pb.TagNumber(2)
-  void clearUnit() => clearField(2);
+  void clearUnit() => $_clearField(2);
 }
 
 /// Each Sample records values encountered in some program
@@ -360,25 +301,21 @@
     $core.Iterable<$fixnum.Int64>? value,
     $core.Iterable<Label>? label,
   }) {
-    final $result = create();
-    if (locationId != null) {
-      $result.locationId.addAll(locationId);
-    }
-    if (value != null) {
-      $result.value.addAll(value);
-    }
-    if (label != null) {
-      $result.label.addAll(label);
-    }
-    return $result;
+    final result = create();
+    if (locationId != null) result.locationId.addAll(locationId);
+    if (value != null) result.value.addAll(value);
+    if (label != null) result.label.addAll(label);
+    return result;
   }
-  Sample._() : super();
-  factory Sample.fromBuffer($core.List<$core.int> i,
-          [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
-      create()..mergeFromBuffer(i, r);
-  factory Sample.fromJson($core.String i,
-          [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
-      create()..mergeFromJson(i, r);
+
+  Sample._();
+
+  factory Sample.fromBuffer($core.List<$core.int> data,
+          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>
+      create()..mergeFromBuffer(data, registry);
+  factory Sample.fromJson($core.String json,
+          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>
+      create()..mergeFromJson(json, registry);
 
   static final $pb.BuilderInfo _i = $pb.BuilderInfo(
       _omitMessageNames ? '' : 'Sample',
@@ -388,26 +325,22 @@
     ..p<$fixnum.Int64>(
         1, _omitFieldNames ? '' : 'locationId', $pb.PbFieldType.KU6)
     ..p<$fixnum.Int64>(2, _omitFieldNames ? '' : 'value', $pb.PbFieldType.K6)
-    ..pc<Label>(3, _omitFieldNames ? '' : 'label', $pb.PbFieldType.PM,
-        subBuilder: Label.create)
+    ..pPM<Label>(3, _omitFieldNames ? '' : 'label', subBuilder: Label.create)
     ..hasRequiredFields = false;
 
-  @$core.Deprecated('Using this can add significant overhead to your binary. '
-      'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
-      'Will be removed in next major version')
-  Sample clone() => Sample()..mergeFromMessage(this);
-  @$core.Deprecated('Using this can add significant overhead to your binary. '
-      'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
-      'Will be removed in next major version')
+  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')
+  Sample clone() => deepCopy();
+  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')
   Sample copyWith(void Function(Sample) updates) =>
       super.copyWith((message) => updates(message as Sample)) as Sample;
 
+  @$core.override
   $pb.BuilderInfo get info_ => _i;
 
   @$core.pragma('dart2js:noInline')
   static Sample create() => Sample._();
+  @$core.override
   Sample createEmptyInstance() => create();
-  static $pb.PbList<Sample> createRepeated() => $pb.PbList<Sample>();
   @$core.pragma('dart2js:noInline')
   static Sample getDefault() =>
       _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<Sample>(create);
@@ -416,7 +349,7 @@
   /// The ids recorded here correspond to a Profile.location.id.
   /// The leaf is at location_id[0].
   @$pb.TagNumber(1)
-  $core.List<$fixnum.Int64> get locationId => $_getList(0);
+  $pb.PbList<$fixnum.Int64> get locationId => $_getList(0);
 
   /// The type and unit of each value is defined by the corresponding
   /// entry in Profile.sample_type. All samples must have the same
@@ -425,12 +358,12 @@
   /// result has a list of values that is the elemntwise sum of the
   /// lists of the originals.
   @$pb.TagNumber(2)
-  $core.List<$fixnum.Int64> get value => $_getList(1);
+  $pb.PbList<$fixnum.Int64> get value => $_getList(1);
 
   /// label includes additional context for this sample. It can include
   /// things like a thread id, allocation size, etc
   @$pb.TagNumber(3)
-  $core.List<Label> get label => $_getList(2);
+  $pb.PbList<Label> get label => $_getList(2);
 }
 
 class Label extends $pb.GeneratedMessage {
@@ -440,28 +373,22 @@
     $fixnum.Int64? num,
     $fixnum.Int64? numUnit,
   }) {
-    final $result = create();
-    if (key != null) {
-      $result.key = key;
-    }
-    if (str != null) {
-      $result.str = str;
-    }
-    if (num != null) {
-      $result.num = num;
-    }
-    if (numUnit != null) {
-      $result.numUnit = numUnit;
-    }
-    return $result;
+    final result = create();
+    if (key != null) result.key = key;
+    if (str != null) result.str = str;
+    if (num != null) result.num = num;
+    if (numUnit != null) result.numUnit = numUnit;
+    return result;
   }
-  Label._() : super();
-  factory Label.fromBuffer($core.List<$core.int> i,
-          [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
-      create()..mergeFromBuffer(i, r);
-  factory Label.fromJson($core.String i,
-          [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
-      create()..mergeFromJson(i, r);
+
+  Label._();
+
+  factory Label.fromBuffer($core.List<$core.int> data,
+          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>
+      create()..mergeFromBuffer(data, registry);
+  factory Label.fromJson($core.String json,
+          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>
+      create()..mergeFromJson(json, registry);
 
   static final $pb.BuilderInfo _i = $pb.BuilderInfo(
       _omitMessageNames ? '' : 'Label',
@@ -474,22 +401,19 @@
     ..aInt64(4, _omitFieldNames ? '' : 'numUnit')
     ..hasRequiredFields = false;
 
-  @$core.Deprecated('Using this can add significant overhead to your binary. '
-      'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
-      'Will be removed in next major version')
-  Label clone() => Label()..mergeFromMessage(this);
-  @$core.Deprecated('Using this can add significant overhead to your binary. '
-      'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
-      'Will be removed in next major version')
+  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')
+  Label clone() => deepCopy();
+  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')
   Label copyWith(void Function(Label) updates) =>
       super.copyWith((message) => updates(message as Label)) as Label;
 
+  @$core.override
   $pb.BuilderInfo get info_ => _i;
 
   @$core.pragma('dart2js:noInline')
   static Label create() => Label._();
+  @$core.override
   Label createEmptyInstance() => create();
-  static $pb.PbList<Label> createRepeated() => $pb.PbList<Label>();
   @$core.pragma('dart2js:noInline')
   static Label getDefault() =>
       _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<Label>(create);
@@ -499,52 +423,40 @@
   @$pb.TagNumber(1)
   $fixnum.Int64 get key => $_getI64(0);
   @$pb.TagNumber(1)
-  set key($fixnum.Int64 v) {
-    $_setInt64(0, v);
-  }
-
+  set key($fixnum.Int64 value) => $_setInt64(0, value);
   @$pb.TagNumber(1)
   $core.bool hasKey() => $_has(0);
   @$pb.TagNumber(1)
-  void clearKey() => clearField(1);
+  void clearKey() => $_clearField(1);
 
   /// Index into string table
   @$pb.TagNumber(2)
   $fixnum.Int64 get str => $_getI64(1);
   @$pb.TagNumber(2)
-  set str($fixnum.Int64 v) {
-    $_setInt64(1, v);
-  }
-
+  set str($fixnum.Int64 value) => $_setInt64(1, value);
   @$pb.TagNumber(2)
   $core.bool hasStr() => $_has(1);
   @$pb.TagNumber(2)
-  void clearStr() => clearField(2);
+  void clearStr() => $_clearField(2);
 
   @$pb.TagNumber(3)
   $fixnum.Int64 get num => $_getI64(2);
   @$pb.TagNumber(3)
-  set num($fixnum.Int64 v) {
-    $_setInt64(2, v);
-  }
-
+  set num($fixnum.Int64 value) => $_setInt64(2, value);
   @$pb.TagNumber(3)
   $core.bool hasNum() => $_has(2);
   @$pb.TagNumber(3)
-  void clearNum() => clearField(3);
+  void clearNum() => $_clearField(3);
 
   /// Index into string table
   @$pb.TagNumber(4)
   $fixnum.Int64 get numUnit => $_getI64(3);
   @$pb.TagNumber(4)
-  set numUnit($fixnum.Int64 v) {
-    $_setInt64(3, v);
-  }
-
+  set numUnit($fixnum.Int64 value) => $_setInt64(3, value);
   @$pb.TagNumber(4)
   $core.bool hasNumUnit() => $_has(3);
   @$pb.TagNumber(4)
-  void clearNumUnit() => clearField(4);
+  void clearNumUnit() => $_clearField(4);
 }
 
 class Mapping extends $pb.GeneratedMessage {
@@ -560,46 +472,28 @@
     $core.bool? hasLineNumbers,
     $core.bool? hasInlineFrames,
   }) {
-    final $result = create();
-    if (id != null) {
-      $result.id = id;
-    }
-    if (memoryStart != null) {
-      $result.memoryStart = memoryStart;
-    }
-    if (memoryLimit != null) {
-      $result.memoryLimit = memoryLimit;
-    }
-    if (fileOffset != null) {
-      $result.fileOffset = fileOffset;
-    }
-    if (filename != null) {
-      $result.filename = filename;
-    }
-    if (buildId != null) {
-      $result.buildId = buildId;
-    }
-    if (hasFunctions != null) {
-      $result.hasFunctions = hasFunctions;
-    }
-    if (hasFilenames != null) {
-      $result.hasFilenames = hasFilenames;
-    }
-    if (hasLineNumbers != null) {
-      $result.hasLineNumbers = hasLineNumbers;
-    }
-    if (hasInlineFrames != null) {
-      $result.hasInlineFrames = hasInlineFrames;
-    }
-    return $result;
+    final result = create();
+    if (id != null) result.id = id;
+    if (memoryStart != null) result.memoryStart = memoryStart;
+    if (memoryLimit != null) result.memoryLimit = memoryLimit;
+    if (fileOffset != null) result.fileOffset = fileOffset;
+    if (filename != null) result.filename = filename;
+    if (buildId != null) result.buildId = buildId;
+    if (hasFunctions != null) result.hasFunctions = hasFunctions;
+    if (hasFilenames != null) result.hasFilenames = hasFilenames;
+    if (hasLineNumbers != null) result.hasLineNumbers = hasLineNumbers;
+    if (hasInlineFrames != null) result.hasInlineFrames = hasInlineFrames;
+    return result;
   }
-  Mapping._() : super();
-  factory Mapping.fromBuffer($core.List<$core.int> i,
-          [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
-      create()..mergeFromBuffer(i, r);
-  factory Mapping.fromJson($core.String i,
-          [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
-      create()..mergeFromJson(i, r);
+
+  Mapping._();
+
+  factory Mapping.fromBuffer($core.List<$core.int> data,
+          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>
+      create()..mergeFromBuffer(data, registry);
+  factory Mapping.fromJson($core.String json,
+          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>
+      create()..mergeFromJson(json, registry);
 
   static final $pb.BuilderInfo _i = $pb.BuilderInfo(
       _omitMessageNames ? '' : 'Mapping',
@@ -625,22 +519,19 @@
     ..aOB(10, _omitFieldNames ? '' : 'hasInlineFrames')
     ..hasRequiredFields = false;
 
-  @$core.Deprecated('Using this can add significant overhead to your binary. '
-      'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
-      'Will be removed in next major version')
-  Mapping clone() => Mapping()..mergeFromMessage(this);
-  @$core.Deprecated('Using this can add significant overhead to your binary. '
-      'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
-      'Will be removed in next major version')
+  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')
+  Mapping clone() => deepCopy();
+  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')
   Mapping copyWith(void Function(Mapping) updates) =>
       super.copyWith((message) => updates(message as Mapping)) as Mapping;
 
+  @$core.override
   $pb.BuilderInfo get info_ => _i;
 
   @$core.pragma('dart2js:noInline')
   static Mapping create() => Mapping._();
+  @$core.override
   Mapping createEmptyInstance() => create();
-  static $pb.PbList<Mapping> createRepeated() => $pb.PbList<Mapping>();
   @$core.pragma('dart2js:noInline')
   static Mapping getDefault() =>
       _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<Mapping>(create);
@@ -650,53 +541,41 @@
   @$pb.TagNumber(1)
   $fixnum.Int64 get id => $_getI64(0);
   @$pb.TagNumber(1)
-  set id($fixnum.Int64 v) {
-    $_setInt64(0, v);
-  }
-
+  set id($fixnum.Int64 value) => $_setInt64(0, value);
   @$pb.TagNumber(1)
   $core.bool hasId() => $_has(0);
   @$pb.TagNumber(1)
-  void clearId() => clearField(1);
+  void clearId() => $_clearField(1);
 
   /// Address at which the binary (or DLL) is loaded into memory.
   @$pb.TagNumber(2)
   $fixnum.Int64 get memoryStart => $_getI64(1);
   @$pb.TagNumber(2)
-  set memoryStart($fixnum.Int64 v) {
-    $_setInt64(1, v);
-  }
-
+  set memoryStart($fixnum.Int64 value) => $_setInt64(1, value);
   @$pb.TagNumber(2)
   $core.bool hasMemoryStart() => $_has(1);
   @$pb.TagNumber(2)
-  void clearMemoryStart() => clearField(2);
+  void clearMemoryStart() => $_clearField(2);
 
   /// The limit of the address range occupied by this mapping.
   @$pb.TagNumber(3)
   $fixnum.Int64 get memoryLimit => $_getI64(2);
   @$pb.TagNumber(3)
-  set memoryLimit($fixnum.Int64 v) {
-    $_setInt64(2, v);
-  }
-
+  set memoryLimit($fixnum.Int64 value) => $_setInt64(2, value);
   @$pb.TagNumber(3)
   $core.bool hasMemoryLimit() => $_has(2);
   @$pb.TagNumber(3)
-  void clearMemoryLimit() => clearField(3);
+  void clearMemoryLimit() => $_clearField(3);
 
   /// Offset in the binary that corresponds to the first mapped address.
   @$pb.TagNumber(4)
   $fixnum.Int64 get fileOffset => $_getI64(3);
   @$pb.TagNumber(4)
-  set fileOffset($fixnum.Int64 v) {
-    $_setInt64(3, v);
-  }
-
+  set fileOffset($fixnum.Int64 value) => $_setInt64(3, value);
   @$pb.TagNumber(4)
   $core.bool hasFileOffset() => $_has(3);
   @$pb.TagNumber(4)
-  void clearFileOffset() => clearField(4);
+  void clearFileOffset() => $_clearField(4);
 
   /// The object this entry is loaded from.  This can be a filename on
   /// disk for the main binary and shared libraries, or virtual
@@ -705,14 +584,11 @@
   @$pb.TagNumber(5)
   $fixnum.Int64 get filename => $_getI64(4);
   @$pb.TagNumber(5)
-  set filename($fixnum.Int64 v) {
-    $_setInt64(4, v);
-  }
-
+  set filename($fixnum.Int64 value) => $_setInt64(4, value);
   @$pb.TagNumber(5)
   $core.bool hasFilename() => $_has(4);
   @$pb.TagNumber(5)
-  void clearFilename() => clearField(5);
+  void clearFilename() => $_clearField(5);
 
   /// A string that uniquely identifies a particular program version
   /// with high probability. E.g., for binaries generated by GNU tools,
@@ -721,63 +597,48 @@
   @$pb.TagNumber(6)
   $fixnum.Int64 get buildId => $_getI64(5);
   @$pb.TagNumber(6)
-  set buildId($fixnum.Int64 v) {
-    $_setInt64(5, v);
-  }
-
+  set buildId($fixnum.Int64 value) => $_setInt64(5, value);
   @$pb.TagNumber(6)
   $core.bool hasBuildId() => $_has(5);
   @$pb.TagNumber(6)
-  void clearBuildId() => clearField(6);
+  void clearBuildId() => $_clearField(6);
 
   /// The following fields indicate the resolution of symbolic info.
   @$pb.TagNumber(7)
   $core.bool get hasFunctions => $_getBF(6);
   @$pb.TagNumber(7)
-  set hasFunctions($core.bool v) {
-    $_setBool(6, v);
-  }
-
+  set hasFunctions($core.bool value) => $_setBool(6, value);
   @$pb.TagNumber(7)
   $core.bool hasHasFunctions() => $_has(6);
   @$pb.TagNumber(7)
-  void clearHasFunctions() => clearField(7);
+  void clearHasFunctions() => $_clearField(7);
 
   @$pb.TagNumber(8)
   $core.bool get hasFilenames => $_getBF(7);
   @$pb.TagNumber(8)
-  set hasFilenames($core.bool v) {
-    $_setBool(7, v);
-  }
-
+  set hasFilenames($core.bool value) => $_setBool(7, value);
   @$pb.TagNumber(8)
   $core.bool hasHasFilenames() => $_has(7);
   @$pb.TagNumber(8)
-  void clearHasFilenames() => clearField(8);
+  void clearHasFilenames() => $_clearField(8);
 
   @$pb.TagNumber(9)
   $core.bool get hasLineNumbers => $_getBF(8);
   @$pb.TagNumber(9)
-  set hasLineNumbers($core.bool v) {
-    $_setBool(8, v);
-  }
-
+  set hasLineNumbers($core.bool value) => $_setBool(8, value);
   @$pb.TagNumber(9)
   $core.bool hasHasLineNumbers() => $_has(8);
   @$pb.TagNumber(9)
-  void clearHasLineNumbers() => clearField(9);
+  void clearHasLineNumbers() => $_clearField(9);
 
   @$pb.TagNumber(10)
   $core.bool get hasInlineFrames => $_getBF(9);
   @$pb.TagNumber(10)
-  set hasInlineFrames($core.bool v) {
-    $_setBool(9, v);
-  }
-
+  set hasInlineFrames($core.bool value) => $_setBool(9, value);
   @$pb.TagNumber(10)
   $core.bool hasHasInlineFrames() => $_has(9);
   @$pb.TagNumber(10)
-  void clearHasInlineFrames() => clearField(10);
+  void clearHasInlineFrames() => $_clearField(10);
 }
 
 /// Describes function and line table debug information.
@@ -789,31 +650,23 @@
     $core.Iterable<Line>? line,
     $core.bool? isFolded,
   }) {
-    final $result = create();
-    if (id != null) {
-      $result.id = id;
-    }
-    if (mappingId != null) {
-      $result.mappingId = mappingId;
-    }
-    if (address != null) {
-      $result.address = address;
-    }
-    if (line != null) {
-      $result.line.addAll(line);
-    }
-    if (isFolded != null) {
-      $result.isFolded = isFolded;
-    }
-    return $result;
+    final result = create();
+    if (id != null) result.id = id;
+    if (mappingId != null) result.mappingId = mappingId;
+    if (address != null) result.address = address;
+    if (line != null) result.line.addAll(line);
+    if (isFolded != null) result.isFolded = isFolded;
+    return result;
   }
-  Location._() : super();
-  factory Location.fromBuffer($core.List<$core.int> i,
-          [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
-      create()..mergeFromBuffer(i, r);
-  factory Location.fromJson($core.String i,
-          [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
-      create()..mergeFromJson(i, r);
+
+  Location._();
+
+  factory Location.fromBuffer($core.List<$core.int> data,
+          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>
+      create()..mergeFromBuffer(data, registry);
+  factory Location.fromJson($core.String json,
+          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>
+      create()..mergeFromJson(json, registry);
 
   static final $pb.BuilderInfo _i = $pb.BuilderInfo(
       _omitMessageNames ? '' : 'Location',
@@ -827,27 +680,23 @@
         defaultOrMaker: $fixnum.Int64.ZERO)
     ..a<$fixnum.Int64>(3, _omitFieldNames ? '' : 'address', $pb.PbFieldType.OU6,
         defaultOrMaker: $fixnum.Int64.ZERO)
-    ..pc<Line>(4, _omitFieldNames ? '' : 'line', $pb.PbFieldType.PM,
-        subBuilder: Line.create)
+    ..pPM<Line>(4, _omitFieldNames ? '' : 'line', subBuilder: Line.create)
     ..aOB(5, _omitFieldNames ? '' : 'isFolded')
     ..hasRequiredFields = false;
 
-  @$core.Deprecated('Using this can add significant overhead to your binary. '
-      'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
-      'Will be removed in next major version')
-  Location clone() => Location()..mergeFromMessage(this);
-  @$core.Deprecated('Using this can add significant overhead to your binary. '
-      'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
-      'Will be removed in next major version')
+  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')
+  Location clone() => deepCopy();
+  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')
   Location copyWith(void Function(Location) updates) =>
       super.copyWith((message) => updates(message as Location)) as Location;
 
+  @$core.override
   $pb.BuilderInfo get info_ => _i;
 
   @$core.pragma('dart2js:noInline')
   static Location create() => Location._();
+  @$core.override
   Location createEmptyInstance() => create();
-  static $pb.PbList<Location> createRepeated() => $pb.PbList<Location>();
   @$core.pragma('dart2js:noInline')
   static Location getDefault() =>
       _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<Location>(create);
@@ -858,14 +707,11 @@
   @$pb.TagNumber(1)
   $fixnum.Int64 get id => $_getI64(0);
   @$pb.TagNumber(1)
-  set id($fixnum.Int64 v) {
-    $_setInt64(0, v);
-  }
-
+  set id($fixnum.Int64 value) => $_setInt64(0, value);
   @$pb.TagNumber(1)
   $core.bool hasId() => $_has(0);
   @$pb.TagNumber(1)
-  void clearId() => clearField(1);
+  void clearId() => $_clearField(1);
 
   /// The id of the corresponding profile.Mapping for this location.
   /// It can be unset if the mapping is unknown or not applicable for
@@ -873,14 +719,11 @@
   @$pb.TagNumber(2)
   $fixnum.Int64 get mappingId => $_getI64(1);
   @$pb.TagNumber(2)
-  set mappingId($fixnum.Int64 v) {
-    $_setInt64(1, v);
-  }
-
+  set mappingId($fixnum.Int64 value) => $_setInt64(1, value);
   @$pb.TagNumber(2)
   $core.bool hasMappingId() => $_has(1);
   @$pb.TagNumber(2)
-  void clearMappingId() => clearField(2);
+  void clearMappingId() => $_clearField(2);
 
   /// The instruction address for this location, if available.  It
   /// should be within [Mapping.memory_start...Mapping.memory_limit]
@@ -890,24 +733,21 @@
   @$pb.TagNumber(3)
   $fixnum.Int64 get address => $_getI64(2);
   @$pb.TagNumber(3)
-  set address($fixnum.Int64 v) {
-    $_setInt64(2, v);
-  }
-
+  set address($fixnum.Int64 value) => $_setInt64(2, value);
   @$pb.TagNumber(3)
   $core.bool hasAddress() => $_has(2);
   @$pb.TagNumber(3)
-  void clearAddress() => clearField(3);
+  void clearAddress() => $_clearField(3);
 
-  ///  Multiple line indicates this location has inlined functions,
-  ///  where the last entry represents the caller into which the
-  ///  preceding entries were inlined.
+  /// Multiple line indicates this location has inlined functions,
+  /// where the last entry represents the caller into which the
+  /// preceding entries were inlined.
   ///
-  ///  E.g., if memcpy() is inlined into printf:
-  ///     line[0].function_name == "memcpy"
-  ///     line[1].function_name == "printf"
+  /// E.g., if memcpy() is inlined into printf:
+  ///    line[0].function_name == "memcpy"
+  ///    line[1].function_name == "printf"
   @$pb.TagNumber(4)
-  $core.List<Line> get line => $_getList(3);
+  $pb.PbList<Line> get line => $_getList(3);
 
   /// Provides an indication that multiple symbols map to this location's
   /// address, for example due to identical code folding by the linker. In that
@@ -917,14 +757,11 @@
   @$pb.TagNumber(5)
   $core.bool get isFolded => $_getBF(4);
   @$pb.TagNumber(5)
-  set isFolded($core.bool v) {
-    $_setBool(4, v);
-  }
-
+  set isFolded($core.bool value) => $_setBool(4, value);
   @$pb.TagNumber(5)
   $core.bool hasIsFolded() => $_has(4);
   @$pb.TagNumber(5)
-  void clearIsFolded() => clearField(5);
+  void clearIsFolded() => $_clearField(5);
 }
 
 class Line extends $pb.GeneratedMessage {
@@ -932,22 +769,20 @@
     $fixnum.Int64? functionId,
     $fixnum.Int64? line,
   }) {
-    final $result = create();
-    if (functionId != null) {
-      $result.functionId = functionId;
-    }
-    if (line != null) {
-      $result.line = line;
-    }
-    return $result;
+    final result = create();
+    if (functionId != null) result.functionId = functionId;
+    if (line != null) result.line = line;
+    return result;
   }
-  Line._() : super();
-  factory Line.fromBuffer($core.List<$core.int> i,
-          [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
-      create()..mergeFromBuffer(i, r);
-  factory Line.fromJson($core.String i,
-          [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
-      create()..mergeFromJson(i, r);
+
+  Line._();
+
+  factory Line.fromBuffer($core.List<$core.int> data,
+          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>
+      create()..mergeFromBuffer(data, registry);
+  factory Line.fromJson($core.String json,
+          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>
+      create()..mergeFromJson(json, registry);
 
   static final $pb.BuilderInfo _i = $pb.BuilderInfo(
       _omitMessageNames ? '' : 'Line',
@@ -960,22 +795,19 @@
     ..aInt64(2, _omitFieldNames ? '' : 'line')
     ..hasRequiredFields = false;
 
-  @$core.Deprecated('Using this can add significant overhead to your binary. '
-      'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
-      'Will be removed in next major version')
-  Line clone() => Line()..mergeFromMessage(this);
-  @$core.Deprecated('Using this can add significant overhead to your binary. '
-      'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
-      'Will be removed in next major version')
+  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')
+  Line clone() => deepCopy();
+  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')
   Line copyWith(void Function(Line) updates) =>
       super.copyWith((message) => updates(message as Line)) as Line;
 
+  @$core.override
   $pb.BuilderInfo get info_ => _i;
 
   @$core.pragma('dart2js:noInline')
   static Line create() => Line._();
+  @$core.override
   Line createEmptyInstance() => create();
-  static $pb.PbList<Line> createRepeated() => $pb.PbList<Line>();
   @$core.pragma('dart2js:noInline')
   static Line getDefault() =>
       _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<Line>(create);
@@ -985,27 +817,21 @@
   @$pb.TagNumber(1)
   $fixnum.Int64 get functionId => $_getI64(0);
   @$pb.TagNumber(1)
-  set functionId($fixnum.Int64 v) {
-    $_setInt64(0, v);
-  }
-
+  set functionId($fixnum.Int64 value) => $_setInt64(0, value);
   @$pb.TagNumber(1)
   $core.bool hasFunctionId() => $_has(0);
   @$pb.TagNumber(1)
-  void clearFunctionId() => clearField(1);
+  void clearFunctionId() => $_clearField(1);
 
   /// Line number in source code.
   @$pb.TagNumber(2)
   $fixnum.Int64 get line => $_getI64(1);
   @$pb.TagNumber(2)
-  set line($fixnum.Int64 v) {
-    $_setInt64(1, v);
-  }
-
+  set line($fixnum.Int64 value) => $_setInt64(1, value);
   @$pb.TagNumber(2)
   $core.bool hasLine() => $_has(1);
   @$pb.TagNumber(2)
-  void clearLine() => clearField(2);
+  void clearLine() => $_clearField(2);
 }
 
 class Function_ extends $pb.GeneratedMessage {
@@ -1016,31 +842,23 @@
     $fixnum.Int64? filename,
     $fixnum.Int64? startLine,
   }) {
-    final $result = create();
-    if (id != null) {
-      $result.id = id;
-    }
-    if (name != null) {
-      $result.name = name;
-    }
-    if (systemName != null) {
-      $result.systemName = systemName;
-    }
-    if (filename != null) {
-      $result.filename = filename;
-    }
-    if (startLine != null) {
-      $result.startLine = startLine;
-    }
-    return $result;
+    final result = create();
+    if (id != null) result.id = id;
+    if (name != null) result.name = name;
+    if (systemName != null) result.systemName = systemName;
+    if (filename != null) result.filename = filename;
+    if (startLine != null) result.startLine = startLine;
+    return result;
   }
-  Function_._() : super();
-  factory Function_.fromBuffer($core.List<$core.int> i,
-          [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
-      create()..mergeFromBuffer(i, r);
-  factory Function_.fromJson($core.String i,
-          [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
-      create()..mergeFromJson(i, r);
+
+  Function_._();
+
+  factory Function_.fromBuffer($core.List<$core.int> data,
+          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>
+      create()..mergeFromBuffer(data, registry);
+  factory Function_.fromJson($core.String json,
+          [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>
+      create()..mergeFromJson(json, registry);
 
   static final $pb.BuilderInfo _i = $pb.BuilderInfo(
       _omitMessageNames ? '' : 'Function',
@@ -1055,22 +873,19 @@
     ..aInt64(5, _omitFieldNames ? '' : 'startLine')
     ..hasRequiredFields = false;
 
-  @$core.Deprecated('Using this can add significant overhead to your binary. '
-      'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
-      'Will be removed in next major version')
-  Function_ clone() => Function_()..mergeFromMessage(this);
-  @$core.Deprecated('Using this can add significant overhead to your binary. '
-      'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
-      'Will be removed in next major version')
+  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')
+  Function_ clone() => deepCopy();
+  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')
   Function_ copyWith(void Function(Function_) updates) =>
       super.copyWith((message) => updates(message as Function_)) as Function_;
 
+  @$core.override
   $pb.BuilderInfo get info_ => _i;
 
   @$core.pragma('dart2js:noInline')
   static Function_ create() => Function_._();
+  @$core.override
   Function_ createEmptyInstance() => create();
-  static $pb.PbList<Function_> createRepeated() => $pb.PbList<Function_>();
   @$core.pragma('dart2js:noInline')
   static Function_ getDefault() =>
       _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<Function_>(create);
@@ -1080,28 +895,22 @@
   @$pb.TagNumber(1)
   $fixnum.Int64 get id => $_getI64(0);
   @$pb.TagNumber(1)
-  set id($fixnum.Int64 v) {
-    $_setInt64(0, v);
-  }
-
+  set id($fixnum.Int64 value) => $_setInt64(0, value);
   @$pb.TagNumber(1)
   $core.bool hasId() => $_has(0);
   @$pb.TagNumber(1)
-  void clearId() => clearField(1);
+  void clearId() => $_clearField(1);
 
   /// Name of the function, in human-readable form if available.
   /// Index into string table
   @$pb.TagNumber(2)
   $fixnum.Int64 get name => $_getI64(1);
   @$pb.TagNumber(2)
-  set name($fixnum.Int64 v) {
-    $_setInt64(1, v);
-  }
-
+  set name($fixnum.Int64 value) => $_setInt64(1, value);
   @$pb.TagNumber(2)
   $core.bool hasName() => $_has(1);
   @$pb.TagNumber(2)
-  void clearName() => clearField(2);
+  void clearName() => $_clearField(2);
 
   /// Name of the function, as identified by the system.
   /// For instance, it can be a C++ mangled name.
@@ -1109,43 +918,35 @@
   @$pb.TagNumber(3)
   $fixnum.Int64 get systemName => $_getI64(2);
   @$pb.TagNumber(3)
-  set systemName($fixnum.Int64 v) {
-    $_setInt64(2, v);
-  }
-
+  set systemName($fixnum.Int64 value) => $_setInt64(2, value);
   @$pb.TagNumber(3)
   $core.bool hasSystemName() => $_has(2);
   @$pb.TagNumber(3)
-  void clearSystemName() => clearField(3);
+  void clearSystemName() => $_clearField(3);
 
   /// Source file containing the function.
   /// Index into string table
   @$pb.TagNumber(4)
   $fixnum.Int64 get filename => $_getI64(3);
   @$pb.TagNumber(4)
-  set filename($fixnum.Int64 v) {
-    $_setInt64(3, v);
-  }
-
+  set filename($fixnum.Int64 value) => $_setInt64(3, value);
   @$pb.TagNumber(4)
   $core.bool hasFilename() => $_has(3);
   @$pb.TagNumber(4)
-  void clearFilename() => clearField(4);
+  void clearFilename() => $_clearField(4);
 
   /// Line number in source file.
   @$pb.TagNumber(5)
   $fixnum.Int64 get startLine => $_getI64(4);
   @$pb.TagNumber(5)
-  set startLine($fixnum.Int64 v) {
-    $_setInt64(4, v);
-  }
-
+  set startLine($fixnum.Int64 value) => $_setInt64(4, value);
   @$pb.TagNumber(5)
   $core.bool hasStartLine() => $_has(4);
   @$pb.TagNumber(5)
-  void clearStartLine() => clearField(5);
+  void clearStartLine() => $_clearField(5);
 }
 
-const _omitFieldNames = $core.bool.fromEnvironment('protobuf.omit_field_names');
-const _omitMessageNames =
+const $core.bool _omitFieldNames =
+    $core.bool.fromEnvironment('protobuf.omit_field_names');
+const $core.bool _omitMessageNames =
     $core.bool.fromEnvironment('protobuf.omit_message_names');
diff --git a/runtime/tools/profiling/lib/src/pprof/generated/profile.pbenum.dart b/runtime/tools/profiling/lib/src/pprof/generated/profile.pbenum.dart
index f04e4f1..2fc774e 100644
--- a/runtime/tools/profiling/lib/src/pprof/generated/profile.pbenum.dart
+++ b/runtime/tools/profiling/lib/src/pprof/generated/profile.pbenum.dart
@@ -1,10 +1,11 @@
+// This is a generated file - do not edit.
 //
-//  Generated code. Do not modify.
-//  source: profile.proto
-//
-// @dart = 2.12
+// Generated from profile.proto.
+
+// @dart = 3.3
 
 // ignore_for_file: annotate_overrides, camel_case_types, comment_references
-// ignore_for_file: constant_identifier_names, library_prefixes
-// ignore_for_file: non_constant_identifier_names, prefer_final_fields
-// ignore_for_file: unnecessary_import, unnecessary_this, unused_import
+// ignore_for_file: constant_identifier_names
+// ignore_for_file: curly_braces_in_flow_control_structures
+// ignore_for_file: deprecated_member_use_from_same_package, library_prefixes
+// ignore_for_file: non_constant_identifier_names, prefer_relative_imports
diff --git a/runtime/tools/profiling/lib/src/pprof/generated/profile.pbjson.dart b/runtime/tools/profiling/lib/src/pprof/generated/profile.pbjson.dart
index dbb0cd4..3d1df71 100644
--- a/runtime/tools/profiling/lib/src/pprof/generated/profile.pbjson.dart
+++ b/runtime/tools/profiling/lib/src/pprof/generated/profile.pbjson.dart
@@ -1,13 +1,15 @@
+// This is a generated file - do not edit.
 //
-//  Generated code. Do not modify.
-//  source: profile.proto
-//
-// @dart = 2.12
+// Generated from profile.proto.
+
+// @dart = 3.3
 
 // ignore_for_file: annotate_overrides, camel_case_types, comment_references
-// ignore_for_file: constant_identifier_names, library_prefixes
-// ignore_for_file: non_constant_identifier_names, prefer_final_fields
-// ignore_for_file: unnecessary_import, unnecessary_this, unused_import
+// ignore_for_file: constant_identifier_names
+// ignore_for_file: curly_braces_in_flow_control_structures
+// ignore_for_file: deprecated_member_use_from_same_package, library_prefixes
+// ignore_for_file: non_constant_identifier_names, prefer_relative_imports
+// ignore_for_file: unused_import
 
 import 'dart:convert' as $convert;
 import 'dart:core' as $core;
diff --git a/runtime/vm/app_snapshot.cc b/runtime/vm/app_snapshot.cc
index 4a017bd..e8d6a0c 100644
--- a/runtime/vm/app_snapshot.cc
+++ b/runtime/vm/app_snapshot.cc
@@ -685,9 +685,9 @@
 
   // Verifies the image alignment.
   //
-  // Returns ApiError::null() on success and an ApiError with an an appropriate
-  // message otherwise.
-  ApiErrorPtr VerifyImageAlignment();
+  // On success, returns nullptr. On failure, returns an error message that the
+  // caller must free.
+  char* VerifyImageAlignment();
 
   ObjectPtr Allocate(intptr_t size);
   static void InitializeHeader(ObjectPtr raw, intptr_t cid, intptr_t size) {
@@ -9720,11 +9720,11 @@
 #endif
 }
 
-ApiErrorPtr Deserializer::VerifyImageAlignment() {
+char* Deserializer::VerifyImageAlignment() {
   if (image_reader_ != nullptr) {
     return image_reader_->VerifyAlignment();
   }
-  return ApiError::null();
+  return nullptr;
 }
 
 void SnapshotHeaderReader::SetCoverageFromSnapshotFeatures(
@@ -9846,17 +9846,6 @@
   return Utils::StrDup(message);
 }
 
-ApiErrorPtr FullSnapshotReader::ConvertToApiError(char* message) {
-  // This can also fail while bringing up the VM isolate, so make sure to
-  // allocate the error message in old space.
-  const String& msg = String::Handle(String::New(message, Heap::kOld));
-
-  // The [message] was constructed with [BuildError] and needs to be freed.
-  free(message);
-
-  return ApiError::New(msg, Heap::kOld);
-}
-
 void Deserializer::ReadInstructions(CodePtr code, bool deferred) {
 #if defined(DART_PRECOMPILED_RUNTIME)
   if (deferred) {
@@ -10384,14 +10373,14 @@
   return nullptr;
 }
 
-ApiErrorPtr FullSnapshotReader::ReadVMSnapshot() {
+char* FullSnapshotReader::ReadVMSnapshot() {
   SnapshotHeaderReader header_reader(kind_, buffer_, size_);
 
   intptr_t offset = 0;
   char* error = header_reader.VerifyVersionAndFeatures(
       /*isolate_group=*/nullptr, &offset);
   if (error != nullptr) {
-    return ConvertToApiError(error);
+    return error;
   }
 
   // Even though there's no concurrent threads we have to guard agains, some
@@ -10402,9 +10391,9 @@
   Deserializer deserializer(thread_, kind_, buffer_, size_, data_image_,
                             instructions_image_, /*is_non_root_unit=*/false,
                             offset);
-  ApiErrorPtr api_error = deserializer.VerifyImageAlignment();
-  if (api_error != ApiError::null()) {
-    return api_error;
+  error = deserializer.VerifyImageAlignment();
+  if (error != nullptr) {
+    return error;
   }
 
   if (Snapshot::IncludesCode(kind_)) {
@@ -10428,17 +10417,17 @@
   }
 #endif  // defined(DART_PRECOMPILED_RUNTIME)
 
-  return ApiError::null();
+  return nullptr;
 }
 
-ApiErrorPtr FullSnapshotReader::ReadProgramSnapshot() {
+char* FullSnapshotReader::ReadProgramSnapshot() {
   SnapshotHeaderReader header_reader(kind_, buffer_, size_);
   header_reader.SetCoverageFromSnapshotFeatures(thread_->isolate_group());
   intptr_t offset = 0;
   char* error =
       header_reader.VerifyVersionAndFeatures(thread_->isolate_group(), &offset);
   if (error != nullptr) {
-    return ConvertToApiError(error);
+    return error;
   }
 
   // Even though there's no concurrent threads we have to guard agains, some
@@ -10449,9 +10438,9 @@
   Deserializer deserializer(thread_, kind_, buffer_, size_, data_image_,
                             instructions_image_, /*is_non_root_unit=*/false,
                             offset);
-  ApiErrorPtr api_error = deserializer.VerifyImageAlignment();
-  if (api_error != ApiError::null()) {
-    return api_error;
+  error = deserializer.VerifyImageAlignment();
+  if (error != nullptr) {
+    return error;
   }
 
   if (Snapshot::IncludesCode(kind_)) {
@@ -10482,24 +10471,24 @@
 
   InitializeBSS();
 
-  return ApiError::null();
+  return nullptr;
 }
 
-ApiErrorPtr FullSnapshotReader::ReadUnitSnapshot(const LoadingUnit& unit) {
+char* FullSnapshotReader::ReadUnitSnapshot(const LoadingUnit& unit) {
   SnapshotHeaderReader header_reader(kind_, buffer_, size_);
   intptr_t offset = 0;
   char* error =
       header_reader.VerifyVersionAndFeatures(thread_->isolate_group(), &offset);
   if (error != nullptr) {
-    return ConvertToApiError(error);
+    return error;
   }
 
   Deserializer deserializer(
       thread_, kind_, buffer_, size_, data_image_, instructions_image_,
       /*is_non_root_unit=*/unit.id() != LoadingUnit::kRootId, offset);
-  ApiErrorPtr api_error = deserializer.VerifyImageAlignment();
-  if (api_error != ApiError::null()) {
-    return api_error;
+  error = deserializer.VerifyImageAlignment();
+  if (error != nullptr) {
+    return nullptr;
   }
   {
     Array& units =
@@ -10507,9 +10496,9 @@
     uint32_t main_program_hash = Smi::Value(Smi::RawCast(units.At(0)));
     uint32_t unit_program_hash = deserializer.Read<uint32_t>();
     if (main_program_hash != unit_program_hash) {
-      return ApiError::New(String::Handle(
-          String::New("Deferred loading unit is from a different "
-                      "program than the main loading unit")));
+      return Utils::StrDup(
+          "Deferred loading unit is from a different "
+          "program than the main loading unit");
     }
   }
 
@@ -10528,7 +10517,7 @@
 
   InitializeBSS();
 
-  return ApiError::null();
+  return nullptr;
 }
 
 void FullSnapshotReader::InitializeBSS() {
diff --git a/runtime/vm/app_snapshot.h b/runtime/vm/app_snapshot.h
index 775de057..f71e050 100644
--- a/runtime/vm/app_snapshot.h
+++ b/runtime/vm/app_snapshot.h
@@ -167,14 +167,15 @@
                      Thread* thread);
   ~FullSnapshotReader() {}
 
-  ApiErrorPtr ReadVMSnapshot();
-  ApiErrorPtr ReadProgramSnapshot();
-  ApiErrorPtr ReadUnitSnapshot(const LoadingUnit& unit);
+  // On success, returns nullptr. On failure, returns an error message that the
+  // caller must free.
+  char* ReadVMSnapshot();
+  char* ReadProgramSnapshot();
+  char* ReadUnitSnapshot(const LoadingUnit& unit);
 
  private:
   IsolateGroup* isolate_group() const { return thread_->isolate_group(); }
 
-  ApiErrorPtr ConvertToApiError(char* message);
   void InitializeBSS();
 
   Snapshot::Kind kind_;
diff --git a/runtime/vm/bootstrap_natives.cc b/runtime/vm/bootstrap_natives.cc
index da421d0..a5c2744 100644
--- a/runtime/vm/bootstrap_natives.cc
+++ b/runtime/vm/bootstrap_natives.cc
@@ -59,8 +59,11 @@
   int num_entries = sizeof(BootStrapEntries) / sizeof(struct NativeEntries);
   for (int i = 0; i < num_entries; i++) {
     const struct NativeEntries* entry = &(BootStrapEntries[i]);
-    if ((strcmp(function_name, entry->name_) == 0) &&
-        (entry->argument_count_ == argument_count)) {
+    if (strcmp(function_name, entry->name_) == 0) {
+      if (entry->argument_count_ != argument_count) {
+        FATAL("Wrong number of arguments of %s (expected %d, actual %d)",
+              function_name, argument_count, entry->argument_count_);
+      }
       return reinterpret_cast<Dart_NativeFunction>(entry->function_);
     }
   }
diff --git a/runtime/vm/bootstrap_natives.h b/runtime/vm/bootstrap_natives.h
index 2ca92bc..11f8512 100644
--- a/runtime/vm/bootstrap_natives.h
+++ b/runtime/vm/bootstrap_natives.h
@@ -45,18 +45,18 @@
   V(Integer_moduloFromInteger, 2)                                              \
   V(Integer_greaterThanFromInteger, 2)                                         \
   V(Integer_equalToInteger, 2)                                                 \
-  V(Integer_fromEnvironment, 3)                                                \
+  V(Integer_fromEnvironment, 2)                                                \
   V(Integer_parse, 1)                                                          \
   V(Integer_shlFromInteger, 2)                                                 \
   V(Integer_shrFromInteger, 2)                                                 \
   V(Integer_ushrFromInteger, 2)                                                \
-  V(Bool_fromEnvironment, 3)                                                   \
-  V(Bool_hasEnvironment, 2)                                                    \
-  V(Capability_factory, 1)                                                     \
+  V(Bool_fromEnvironment, 2)                                                   \
+  V(Bool_hasEnvironment, 1)                                                    \
+  V(Capability_factory, 0)                                                     \
   V(Capability_equals, 2)                                                      \
   V(Capability_get_hashcode, 1)                                                \
   V(createConstMapFromMapOfDeeplyImmutables, 1)                                \
-  V(RawReceivePort_factory, 2)                                                 \
+  V(RawReceivePort_factory, 1)                                                 \
   V(RawReceivePort_get_id, 1)                                                  \
   V(RawReceivePort_closeInternal, 1)                                           \
   V(RawReceivePort_setActive, 2)                                               \
@@ -66,6 +66,8 @@
   V(SendPort_sendInternal_, 2)                                                 \
   V(Smi_bitNegate, 1)                                                          \
   V(Smi_bitLength, 1)                                                          \
+  V(Integer_trailingZeroBitCount, 1)                                           \
+  V(Integer_oneBitCount, 1)                                                    \
   V(SuspendState_instantiateClosureWithFutureTypeArgument, 2)                  \
   V(Mint_bitNegate, 1)                                                         \
   V(Mint_bitLength, 1)                                                         \
@@ -97,14 +99,14 @@
   V(Double_equalToInteger, 2)                                                  \
   V(Double_greaterThan, 2)                                                     \
   V(Double_equal, 2)                                                           \
-  V(Double_doubleFromInteger, 2)                                               \
+  V(Double_doubleFromInteger, 1)                                               \
   V(Double_parse, 3)                                                           \
   V(Double_toString, 1)                                                        \
   V(Double_toStringAsFixed, 2)                                                 \
   V(Double_toStringAsExponential, 2)                                           \
   V(Double_toStringAsPrecision, 2)                                             \
   V(Double_flipSignBit, 1)                                                     \
-  V(RegExp_factory, 6)                                                         \
+  V(RegExp_factory, 5)                                                         \
   V(RegExp_getPattern, 1)                                                      \
   V(RegExp_getIsMultiLine, 1)                                                  \
   V(RegExp_getIsCaseSensitive, 1)                                              \
@@ -114,11 +116,11 @@
   V(RegExp_getGroupNameMap, 1)                                                 \
   V(RegExp_ExecuteMatch, 3)                                                    \
   V(RegExp_ExecuteMatchSticky, 3)                                              \
-  V(List_allocate, 2)                                                          \
+  V(List_allocate, 1)                                                          \
   V(List_setIndexed, 3)                                                        \
   V(List_getLength, 1)                                                         \
   V(List_slice, 4)                                                             \
-  V(ImmutableList_from, 4)                                                     \
+  V(ImmutableList_from, 3)                                                     \
   V(StringBase_createFromCodePoints, 3)                                        \
   V(StringBase_substringUnchecked, 3)                                          \
   V(StringBase_joinReplaceAllResult, 4)                                        \
@@ -131,7 +133,7 @@
   V(String_getLength, 1)                                                       \
   V(String_charAt, 2)                                                          \
   V(String_concat, 2)                                                          \
-  V(String_fromEnvironment, 3)                                                 \
+  V(String_fromEnvironment, 2)                                                 \
   V(String_toLowerCase, 1)                                                     \
   V(String_toUpperCase, 1)                                                     \
   V(String_concatRange, 3)                                                     \
@@ -170,9 +172,9 @@
   V(TypedDataView_typedData, 1)                                                \
   V(Float32x4_fromDoubles, 4)                                                  \
   V(Float32x4_splat, 1)                                                        \
-  V(Float32x4_fromInt32x4Bits, 2)                                              \
-  V(Float32x4_fromFloat64x2, 2)                                                \
-  V(Float32x4_zero, 1)                                                         \
+  V(Float32x4_fromInt32x4Bits, 1)                                              \
+  V(Float32x4_fromFloat64x2, 1)                                                \
+  V(Float32x4_zero, 0)                                                         \
   V(Float32x4_add, 2)                                                          \
   V(Float32x4_negate, 1)                                                       \
   V(Float32x4_sub, 2)                                                          \
@@ -205,8 +207,8 @@
   V(Float32x4_reciprocalSqrt, 1)                                               \
   V(Float64x2_fromDoubles, 2)                                                  \
   V(Float64x2_splat, 1)                                                        \
-  V(Float64x2_zero, 1)                                                         \
-  V(Float64x2_fromFloat32x4, 2)                                                \
+  V(Float64x2_zero, 0)                                                         \
+  V(Float64x2_fromFloat32x4, 1)                                                \
   V(Float64x2_add, 2)                                                          \
   V(Float64x2_negate, 1)                                                       \
   V(Float64x2_sub, 2)                                                          \
@@ -225,7 +227,7 @@
   V(Float64x2_sqrt, 1)                                                         \
   V(Int32x4_fromInts, 4)                                                       \
   V(Int32x4_fromBools, 4)                                                      \
-  V(Int32x4_fromFloat32x4Bits, 2)                                              \
+  V(Int32x4_fromFloat32x4Bits, 1)                                              \
   V(Int32x4_or, 2)                                                             \
   V(Int32x4_and, 2)                                                            \
   V(Int32x4_xor, 2)                                                            \
@@ -258,7 +260,7 @@
   V(Isolate_sendOOB, 2)                                                        \
   V(Isolate_spawnFunction, 10)                                                 \
   V(Isolate_spawnUri, 12)                                                      \
-  V(GrowableList_allocate, 2)                                                  \
+  V(GrowableList_allocate, 1)                                                  \
   V(GrowableList_setIndexed, 3)                                                \
   V(GrowableList_getLength, 1)                                                 \
   V(GrowableList_getCapacity, 1)                                               \
@@ -288,7 +290,7 @@
   V(ThreadLocal_hasValue, 1)                                                   \
   V(ThreadLocal_setValue, 2)                                                   \
   V(Uri_isWindowsPlatform, 0)                                                  \
-  V(UserTag_new, 2)                                                            \
+  V(UserTag_new, 1)                                                            \
   V(UserTag_label, 1)                                                          \
   V(UserTag_makeCurrent, 1)                                                    \
   V(VMService_SendIsolateServiceMessage, 2)                                    \
@@ -320,7 +322,7 @@
   V(DartApiDLMajorVersion, 0)                                                  \
   V(DartApiDLMinorVersion, 0)                                                  \
   V(DartNativeApiFunctionPointer, 1)                                           \
-  V(TransferableTypedData_factory, 2)                                          \
+  V(TransferableTypedData_factory, 1)                                          \
   V(TransferableTypedData_materialize, 1)                                      \
   V(Timer_postTimerEvent, 1)
 
diff --git a/runtime/vm/bytecode_reader.cc b/runtime/vm/bytecode_reader.cc
index 1b08baa..e971f56 100644
--- a/runtime/vm/bytecode_reader.cc
+++ b/runtime/vm/bytecode_reader.cc
@@ -1528,16 +1528,8 @@
         type =
             Class::Cast(parent).TypeParameterAt(index_in_parent, nullability);
       } else if (parent.IsFunction()) {
-        if (Function::Cast(parent).IsFactory()) {
-          // For factory constructors VM uses type parameters of a class
-          // instead of constructor's type parameters.
-          parent = Function::Cast(parent).Owner();
-          type =
-              Class::Cast(parent).TypeParameterAt(index_in_parent, nullability);
-        } else {
-          type = Function::Cast(parent).TypeParameterAt(index_in_parent,
-                                                        nullability);
-        }
+        type = Function::Cast(parent).TypeParameterAt(index_in_parent,
+                                                      nullability);
       } else if (parent.IsNull()) {
         ASSERT(!enclosing_function_types_.is_empty());
         for (intptr_t i = enclosing_function_types_.length() - 1; i >= 0; --i) {
@@ -2124,7 +2116,6 @@
     intptr_t flags = reader_.ReadUInt();
 
     const bool is_static = (flags & kIsStaticFlag) != 0;
-    const bool is_factory = (flags & kIsFactoryFlag) != 0;
     const bool is_native = (flags & kIsNativeFlag) != 0;
     const bool has_pragma = (flags & kHasPragmaFlag) != 0;
     const bool is_extension_member = (flags & kIsExtensionMemberFlag) != 0;
@@ -2204,7 +2195,7 @@
       ReadTypeParametersDeclaration(Class::Handle(Z), signature);
     }
 
-    const intptr_t num_implicit_params = (!is_static || is_factory) ? 1 : 0;
+    const intptr_t num_implicit_params = (!is_static) ? 1 : 0;
     const intptr_t num_params = num_implicit_params + reader_.ReadUInt();
     const bool has_optional_named_params =
         ((flags & kHasOptionalNamedParamsFlag) != 0);
@@ -2241,11 +2232,6 @@
       NOT_IN_PRECOMPILED(
           function.SetParameterNameAt(param_index, Symbols::This()));
       ++param_index;
-    } else if (is_factory) {
-      signature.SetParameterTypeAt(param_index, AbstractType::dynamic_type());
-      NOT_IN_PRECOMPILED(function.SetParameterNameAt(
-          param_index, Symbols::TypeArgumentsParameter()));
-      ++param_index;
     }
 
     for (; param_index < num_params; ++param_index) {
diff --git a/runtime/vm/compiler/backend/flow_graph.cc b/runtime/vm/compiler/backend/flow_graph.cc
index c8a0db4..3a8dd18 100644
--- a/runtime/vm/compiler/backend/flow_graph.cc
+++ b/runtime/vm/compiler/backend/flow_graph.cc
@@ -1477,8 +1477,7 @@
     compiler::ParameterInfoArray* parameter_info /* = nullptr */) {
   return compiler::ComputeCallingConvention(
       zone, function, function.num_fixed_parameters(),
-      [&](intptr_t i) {
-        const intptr_t index = (function.IsFactory() ? (i - 1) : i);
+      [&](intptr_t index) {
         return index >= 0 ? ParameterRepresentationAt(function, index)
                           : kTagged;
       },
@@ -2089,6 +2088,18 @@
         stack.Add(q);
       }
     }
+    if (auto catch_entry = p->AsCatchBlockEntry()) {
+      // Blocks from the try body are implicit predecessors of a catch block.
+      const intptr_t try_index = catch_entry->catch_try_index();
+      for (auto block : reverse_postorder()) {
+        if (block->try_index() == try_index) {
+          if (!loop_blocks->Contains(block->preorder_number())) {
+            loop_blocks->Add(block->preorder_number());
+            stack.Add(block);
+          }
+        }
+      }
+    }
   }
   return loop_blocks;
 }
diff --git a/runtime/vm/compiler/backend/il.cc b/runtime/vm/compiler/backend/il.cc
index b12dbdd..7f88824 100644
--- a/runtime/vm/compiler/backend/il.cc
+++ b/runtime/vm/compiler/backend/il.cc
@@ -2852,22 +2852,21 @@
       // argument passed to the constructor.
       if (call->is_known_list_constructor() &&
           IsFixedLengthArrayCid(call->Type()->ToCid())) {
-        return call->ArgumentAt(1);
+        return call->ArgumentAt(call->FirstArgIndex());
       } else if (call->function().recognized_kind() ==
                  MethodRecognizer::kByteDataFactory) {
         // Similarly, we check for the ByteData constructor and forward its
         // explicit length argument appropriately.
-        return call->ArgumentAt(1);
+        return call->ArgumentAt(call->FirstArgIndex());
       } else if (IsTypedDataViewFactory(call->function())) {
-        // Typed data view factories all take three arguments (after
-        // the implicit type arguments parameter):
+        // Typed data view factories all take three arguments:
         //
         // 1) _TypedList buffer -- the underlying data for the view
         // 2) int offsetInBytes -- the offset into the buffer to start viewing
         // 3) int length        -- the number of elements in the view
         //
         // Here, we forward the third.
-        return call->ArgumentAt(3);
+        return call->ArgumentAt(call->FirstArgIndex() + 2);
       }
     } else if (LoadFieldInstr* load_array = orig_instance->AsLoadField()) {
       // For arrays with guarded lengths, replace the length load
@@ -2901,7 +2900,7 @@
       if (StaticCallInstr* call = orig_instance->AsStaticCall()) {
         if (IsTypedDataViewFactory(call->function()) ||
             IsUnmodifiableTypedDataViewFactory(call->function())) {
-          return call->ArgumentAt(1);
+          return call->ArgumentAt(call->FirstArgIndex());
         }
       }
       break;
@@ -2911,7 +2910,7 @@
       ASSERT(!calls_initializer());
       if (StaticCallInstr* call = orig_instance->AsStaticCall()) {
         if (IsTypedDataViewFactory(call->function())) {
-          return call->ArgumentAt(2);
+          return call->ArgumentAt(call->FirstArgIndex() + 1);
         } else if (call->function().recognized_kind() ==
                    MethodRecognizer::kByteDataFactory) {
           // A _ByteDataView returned from the ByteData constructor always
@@ -2944,7 +2943,8 @@
       }
       if (StaticCallInstr* call = orig_instance->AsStaticCall()) {
         if (call->is_known_list_constructor()) {
-          return call->ArgumentAt(0);
+          return (call->type_args_len() > 0) ? call->ArgumentAt(0)
+                                             : flow_graph->constant_null();
         } else if (IsTypedDataViewFactory(call->function()) ||
                    IsUnmodifiableTypedDataViewFactory(call->function())) {
           return flow_graph->constant_null();
@@ -3942,12 +3942,12 @@
   ConstantInstr* length = nullptr;
   if (call->is_known_list_constructor() &&
       LoadFieldInstr::IsFixedLengthArrayCid(call->Type()->ToCid())) {
-    length = call->ArgumentAt(1)->AsConstant();
+    length = call->ArgumentAt(call->FirstArgIndex())->AsConstant();
   } else if (call->function().recognized_kind() ==
              MethodRecognizer::kByteDataFactory) {
-    length = call->ArgumentAt(1)->AsConstant();
+    length = call->ArgumentAt(call->FirstArgIndex())->AsConstant();
   } else if (LoadFieldInstr::IsTypedDataViewFactory(call->function())) {
-    length = call->ArgumentAt(3)->AsConstant();
+    length = call->ArgumentAt(call->FirstArgIndex() + 2)->AsConstant();
   }
   if ((length != nullptr) && length->value().IsSmi() &&
       Smi::Cast(length->value()).Value() == expected_length) {
@@ -5471,7 +5471,7 @@
     intptr_t idx) const {
   // The first input is the array of types
   // for generic functions
-  if (type_args_len() > 0 || function().IsFactory()) {
+  if (type_args_len() > 0) {
     if (idx == 0) {
       return kTagged;
     }
@@ -5954,14 +5954,6 @@
   compiler->GenerateStaticCall(deopt_id(), source(), function(), args_info,
                                locs(), *call_ic_data, rebind_rule_,
                                entry_kind());
-  if (function().IsFactory()) {
-    TypeUsageInfo* type_usage_info = compiler->thread()->type_usage_info();
-    if (type_usage_info != nullptr) {
-      const Class& klass = Class::Handle(function().Owner());
-      RegisterTypeArgumentsUse(compiler->function(), type_usage_info, klass,
-                               ArgumentAt(0));
-    }
-  }
 }
 
 CachableIdempotentCallInstr::CachableIdempotentCallInstr(
@@ -5997,7 +5989,7 @@
 Representation CachableIdempotentCallInstr::RequiredInputRepresentation(
     intptr_t idx) const {
   // The first input is the array of types for generic functions.
-  if (type_args_len() > 0 || function().IsFactory()) {
+  if (type_args_len() > 0) {
     if (idx == 0) {
       return kTagged;
     }
@@ -8684,11 +8676,10 @@
                                                 Instruction* call) {
   SimdOpInstr* op =
       new (zone) SimdOpInstr(KindForMethod(kind), call->deopt_id());
+  ASSERT(call->ArgumentCount() == op->InputCount());
   for (intptr_t i = 0; i < op->InputCount(); i++) {
-    // Note: ArgumentAt(0) is type arguments which we don't need.
-    op->SetInputAt(i, call->ArgumentValueAt(i + 1)->CopyWithType(zone));
+    op->SetInputAt(i, call->ArgumentValueAt(i)->CopyWithType(zone));
   }
-  ASSERT(call->ArgumentCount() == (op->InputCount() + 1));
   return op;
 }
 
diff --git a/runtime/vm/compiler/backend/inliner.cc b/runtime/vm/compiler/backend/inliner.cc
index d8315a8..d2012d5 100644
--- a/runtime/vm/compiler/backend/inliner.cc
+++ b/runtime/vm/compiler/backend/inliner.cc
@@ -1250,9 +1250,10 @@
 
     if ((function.HasOptionalPositionalParameters() ||
          function.HasOptionalNamedParameters()) &&
-        !function.AreValidArguments(function.NumTypeParameters(),
-                                    arguments->length(), argument_names,
-                                    nullptr)) {
+        !function.AreValidArguments(
+            function.NumTypeParameters(),
+            arguments->length() - call_data->first_arg_index, argument_names,
+            nullptr)) {
       TRACE_INLINING(THR_Print("     Bailout: optional arg mismatch\n"));
       PRINT_INLINING_TREE("Optional arg mismatch", &call_data->caller,
                           &function, call_data->call);
@@ -1858,9 +1859,10 @@
       // Arguments mismatch: Caller supplied unsupported named argument.
       ASSERT(argument_names_count == 0);
       // Create a stub for each optional positional parameters with an actual.
-      for (intptr_t i = first_arg_index + fixed_param_count; i < arg_count;
+      for (intptr_t i = fixed_param_count; i < arg_count - first_arg_index;
            ++i) {
-        param_stubs->Add(CreateParameterStub(i, (*arguments)[i], callee_graph));
+        param_stubs->Add(CreateParameterStub(
+            i, (*arguments)[first_arg_index + i], callee_graph));
       }
       ASSERT(function.NumOptionalPositionalParameters() ==
              (param_count - fixed_param_count));
diff --git a/runtime/vm/compiler/backend/inliner_test.cc b/runtime/vm/compiler/backend/inliner_test.cc
index c6299d6..97e4c9c 100644
--- a/runtime/vm/compiler/backend/inliner_test.cc
+++ b/runtime/vm/compiler/backend/inliner_test.cc
@@ -375,17 +375,20 @@
 // by deopt_id and environment from the call itself.
 ISOLATE_UNIT_TEST_CASE(Inliner_InlineForceOptimized) {
   const char* kScript = R"(
-    import 'dart:ffi';
+    @pragma('vm:force-optimize')
+    @pragma('vm:idempotent')
+    @pragma('vm:prefer-inline')
+    int newHash() => identityHashCode(Object());
 
     @pragma('vm:never-inline')
-    int foo(int x) {
-      dynamic ptr = Pointer.fromAddress(x);
-      return x + ptr.hashCode;
+    int foo() {
+      int x = newHash();
+      return x + 1;
     }
     main() {
       int r = 0;
       for (int i = 0; i < 1000; i++) {
-        r += foo(r);
+        r += foo();
       }
       return r;
     }
@@ -414,8 +417,8 @@
         {kMoveGlob},
         {kMatchAndMoveStaticCall, &call_instr},
     }));
-    EXPECT(strcmp(call_instr->function().UserVisibleNameCString(),
-                  "Pointer.fromAddress") == 0);
+    EXPECT(strcmp(call_instr->function().UserVisibleNameCString(), "newHash") ==
+           0);
   }
 
   pipeline.RunAdditionalPasses({
@@ -438,8 +441,6 @@
 
   auto allocate_object_instr_env = allocate_object_instr->env();
   EXPECT(allocate_object_instr_env->LazyDeoptToBeforeDeoptId());
-  EXPECT(allocate_object_instr_env->Outermost()->GetDeoptId() ==
-         call_instr->deopt_id());
   const auto call_instr_env = call_instr->env();
   const intptr_t call_first_index =
       call_instr_env->Length() - call_instr->InputCount();
diff --git a/runtime/vm/compiler/backend/type_propagator.cc b/runtime/vm/compiler/backend/type_propagator.cc
index 9b008a1..eefab78 100644
--- a/runtime/vm/compiler/backend/type_propagator.cc
+++ b/runtime/vm/compiler/backend/type_propagator.cc
@@ -1507,13 +1507,14 @@
   ASSERT(cid != kDynamicCid);
   if ((cid == kGrowableObjectArrayCid || cid == kArrayCid ||
        cid == kImmutableArrayCid) &&
-      type_args_value->BindsToConstant()) {
+      ((type_args_value == nullptr) || type_args_value->BindsToConstant())) {
     Thread* thread = Thread::Current();
     Zone* zone = thread->zone();
     const Class& cls =
         Class::Handle(zone, thread->isolate_group()->class_table()->At(cid));
     auto& type_args = TypeArguments::Handle(zone);
-    if (!type_args_value->BoundConstant().IsNull()) {
+    if (type_args_value != nullptr &&
+        !type_args_value->BoundConstant().IsNull()) {
       type_args ^= type_args_value->BoundConstant().ptr();
       ASSERT(type_args.Length() >= cls.NumTypeArguments());
       type_args = type_args.FromInstanceTypeArguments(thread, cls);
@@ -1533,7 +1534,8 @@
   // (in optimized mode) and avoid keeping separate result_type.
   CompileType* const inferred_type = result_type();
   if (is_known_list_constructor()) {
-    return ComputeListFactoryType(inferred_type, ArgumentValueAt(0));
+    Value* type_args_value = type_args_len() > 0 ? ArgumentValueAt(0) : nullptr;
+    return ComputeListFactoryType(inferred_type, type_args_value);
   }
 
   intptr_t inferred_cid = kDynamicCid;
diff --git a/runtime/vm/compiler/call_specializer.cc b/runtime/vm/compiler/call_specializer.cc
index a562faa..e5e7fe9 100644
--- a/runtime/vm/compiler/call_specializer.cc
+++ b/runtime/vm/compiler/call_specializer.cc
@@ -1325,14 +1325,14 @@
         if (call->HasICData() && targets.IsMonomorphic() &&
             (call->FirstArgIndex() == 0)) {
           if (binary_feedback.ArgumentIs(kSmiCid)) {
-            Definition* arg = call->ArgumentAt(1);
+            Definition* arg = call->ArgumentAt(0);
             AddCheckSmi(arg, call->deopt_id(), call->env(), call);
             ReplaceCall(call, new (Z) SmiToDoubleInstr(new (Z) Value(arg),
                                                        call->source()));
             return;
           } else if (binary_feedback.ArgumentIs(kMintCid) &&
                      CanConvertInt64ToDouble()) {
-            Definition* arg = call->ArgumentAt(1);
+            Definition* arg = call->ArgumentAt(0);
             ReplaceCall(call, new (Z) Int64ToDoubleInstr(new (Z) Value(arg),
                                                          call->deopt_id()));
             return;
@@ -2688,24 +2688,24 @@
 
       // Mixed
       case MethodRecognizer::kFloat32x4ToFloat64x2: {
-        UnboxVector(0, kUnboxedFloat, kDoubleCid, 4, 1);
+        UnboxVector(0, kUnboxedFloat, kDoubleCid, 4);
         Float32x4ToFloat64x2();
         BoxVector(kUnboxedDouble, 2);
         return true;
       }
       case MethodRecognizer::kFloat64x2ToFloat32x4: {
-        UnboxVector(0, kUnboxedDouble, kDoubleCid, 2, 1);
+        UnboxVector(0, kUnboxedDouble, kDoubleCid, 2);
         Float64x2ToFloat32x4();
         BoxVector(kUnboxedFloat, 4);
         return true;
       }
       case MethodRecognizer::kInt32x4ToFloat32x4:
-        UnboxVector(0, kUnboxedInt32, kMintCid, 4, 1);
+        UnboxVector(0, kUnboxedInt32, kMintCid, 4);
         Int32x4ToFloat32x4();
         BoxVector(kUnboxedFloat, 4);
         return true;
       case MethodRecognizer::kFloat32x4ToInt32x4:
-        UnboxVector(0, kUnboxedFloat, kDoubleCid, 4, 1);
+        UnboxVector(0, kUnboxedFloat, kDoubleCid, 4);
         Float32x4ToInt32x4();
         BoxVector(kUnboxedInt32, 4);
         return true;
@@ -2744,12 +2744,8 @@
     BoxVector(kUnboxedDouble, 2);
   }
 
-  void UnboxVector(intptr_t i,
-                   Representation rep,
-                   intptr_t cid,
-                   intptr_t n,
-                   intptr_t type_args = 0) {
-    Definition* arg = call_->ArgumentAt(i + type_args);
+  void UnboxVector(intptr_t i, Representation rep, intptr_t cid, intptr_t n) {
+    Definition* arg = call_->ArgumentAt(i);
     if (CompilerState::Current().is_aot()) {
       // Add null-checks in case of the arguments are known to be compatible
       // but they are possibly nullable.
@@ -2765,11 +2761,8 @@
     }
   }
 
-  void UnboxScalar(intptr_t i,
-                   Representation rep,
-                   intptr_t n,
-                   intptr_t type_args = 0) {
-    Definition* arg = call_->ArgumentAt(i + type_args);
+  void UnboxScalar(intptr_t i, Representation rep, intptr_t n) {
+    Definition* arg = call_->ArgumentAt(i);
     if (CompilerState::Current().is_aot()) {
       // Add null-checks in case of the arguments are known to be compatible
       // but they are possibly nullable.
diff --git a/runtime/vm/compiler/frontend/kernel_binary_flowgraph.cc b/runtime/vm/compiler/frontend/kernel_binary_flowgraph.cc
index c259aac..d38e557 100644
--- a/runtime/vm/compiler/frontend/kernel_binary_flowgraph.cc
+++ b/runtime/vm/compiler/frontend/kernel_binary_flowgraph.cc
@@ -3415,12 +3415,7 @@
     return instructions;
   }
 
-  const Class& klass = Class::ZoneHandle(Z, target.Owner());
-  if (target.IsGenerativeConstructor() || target.IsFactory()) {
-    // The VM requires a TypeArguments object as first parameter for
-    // every factory constructor.
-    ++argument_count;
-  }
+  ASSERT(!target.IsGenerativeConstructor());
 
   if (target.IsCachableIdempotent()) {
     return BuildCachableIdempotentCall(position, target);
@@ -3469,7 +3464,7 @@
   }
 
   Fragment instructions;
-  LocalVariable* instance_variable = nullptr;
+  const Class& klass = Class::ZoneHandle(Z, target.Owner());
 
   const bool special_case_unchecked_cast =
       klass.IsTopLevel() && (klass.library() == Library::InternalLibrary()) &&
@@ -3482,38 +3477,8 @@
   const bool special_case =
       special_case_identical || special_case_unchecked_cast;
 
-  // If we cross the Kernel -> VM core library boundary, a [StaticInvocation]
-  // can appear, but the thing we're calling is not a static method, but a
-  // factory constructor.
-  // The `H.LookupStaticmethodByKernelProcedure` will potentially resolve to the
-  // forwarded constructor.
-  // In that case we'll make an instance and pass it as first argument.
-  //
-  // TODO(27590): Get rid of this after we're using core libraries compiled
-  // into Kernel.
   intptr_t type_args_len = 0;
-  if (target.IsGenerativeConstructor()) {
-    if (klass.NumTypeArguments() > 0) {
-      const TypeArguments& type_arguments =
-          PeekArgumentsInstantiatedType(klass);
-      instructions += TranslateInstantiatedTypeArguments(type_arguments);
-      instructions += AllocateObject(position, klass, 1);
-    } else {
-      instructions += AllocateObject(position, klass, 0);
-    }
-
-    instance_variable = MakeTemporary();
-
-    instructions += LoadLocal(instance_variable);
-  } else if (target.IsFactory()) {
-    // The VM requires currently a TypeArguments object as first parameter for
-    // every factory constructor :-/ !
-    //
-    // TODO(27590): Get rid of this after we're using core libraries compiled
-    // into Kernel.
-    const TypeArguments& type_arguments = PeekArgumentsInstantiatedType(klass);
-    instructions += TranslateInstantiatedTypeArguments(type_arguments);
-  } else if (!special_case) {
+  if (!special_case) {
     AlternativeReadingScope alt(&reader_);
     ReadUInt();                               // read argument count.
     intptr_t list_length = ReadListLength();  // read types list length.
@@ -4161,7 +4126,10 @@
                                   Symbols::_GrowableListLiteralFactory()));
   ASSERT(!factory_method.IsNull());
 
-  instructions += StaticCall(position, factory_method, 2, ICData::kStatic);
+  instructions += StaticCall(position, factory_method,
+                             /*argument_count=*/1, Array::null_array(),
+                             ICData::kStatic, /*result_type=*/nullptr,
+                             /*type_args_len=*/1);
   instructions += DropTempsPreserveTop(1);  // Instantiated type_arguments.
   return instructions;
 }
@@ -4211,8 +4179,10 @@
         Library::PrivateCoreLibName(Symbols::MapLiteralFactory()));
   }
 
-  return instructions +
-         StaticCall(position, factory_method, 2, ICData::kStatic);
+  return instructions + StaticCall(position, factory_method,
+                                   /*argument_count=*/1, Array::null_array(),
+                                   ICData::kStatic, /*result_type=*/nullptr,
+                                   /*type_args_len=*/2);
 }
 
 Fragment StreamingFlowGraphBuilder::BuildRecordLiteral(TokenPosition* p) {
diff --git a/runtime/vm/compiler/frontend/kernel_to_il.cc b/runtime/vm/compiler/frontend/kernel_to_il.cc
index 2daf19e..d3f4c74 100644
--- a/runtime/vm/compiler/frontend/kernel_to_il.cc
+++ b/runtime/vm/compiler/frontend/kernel_to_il.cc
@@ -164,18 +164,8 @@
 Fragment FlowGraphBuilder::LoadInstantiatorTypeArguments() {
   // TODO(27590): We could use `active_class_->IsGeneric()`.
   Fragment instructions;
-  if (scopes_ != nullptr && scopes_->type_arguments_variable != nullptr) {
-#ifdef DEBUG
-    Function& function =
-        Function::Handle(Z, parsed_function_->function().ptr());
-    while (function.IsClosureFunction()) {
-      function = function.parent_function();
-    }
-    ASSERT(function.IsFactory());
-#endif
-    instructions += LoadLocal(scopes_->type_arguments_variable);
-  } else if (parsed_function_->has_receiver_var() &&
-             active_class_.ClassNumTypeArguments() > 0) {
+  if (parsed_function_->has_receiver_var() &&
+      active_class_.ClassNumTypeArguments() > 0) {
     ASSERT(!parsed_function_->function().IsFactory());
     instructions += LoadLocal(parsed_function_->receiver_var());
     instructions += LoadNativeField(
@@ -1466,14 +1456,14 @@
       break;
     case MethodRecognizer::kGrowableArrayAllocateWithData: {
       ASSERT(function.IsFactory());
-      ASSERT_EQUAL(function.NumParameters(), 2);
+      ASSERT_EQUAL(function.NumParameters(), 1);
       const Class& cls =
           Class::ZoneHandle(Z, compiler::GrowableObjectArrayClass().ptr());
-      body += LoadLocal(parsed_function_->RawParameterVariable(0));
+      body += LoadLocal(parsed_function_->function_type_arguments());
       body += AllocateObject(TokenPosition::kNoSource, cls, 1);
       LocalVariable* object = MakeTemporary();
       body += LoadLocal(object);
-      body += LoadLocal(parsed_function_->RawParameterVariable(1));
+      body += LoadLocal(parsed_function_->RawParameterVariable(0));
       body += StoreNativeField(Slot::GrowableObjectArray_data(),
                                StoreFieldInstr::Kind::kInitializing,
                                kNoStoreBarrier);
@@ -1494,9 +1484,9 @@
       body += Constant(Object::mutable_empty_array());
       break;
     case MethodRecognizer::kObjectArrayAllocate:
-      ASSERT(function.IsFactory() && (function.NumParameters() == 2));
+      ASSERT(function.IsFactory() && (function.NumParameters() == 1));
+      body += LoadLocal(parsed_function_->function_type_arguments());
       body += LoadLocal(parsed_function_->RawParameterVariable(0));
-      body += LoadLocal(parsed_function_->RawParameterVariable(1));
       body += CreateArray();
       break;
     case MethodRecognizer::kCopyRangeFromUint8ListToOneByteString:
@@ -1693,7 +1683,6 @@
       const auto& type_arguments = TypeArguments::ZoneHandle(
           Z, IG->object_store()->type_argument_never());
 
-      ASSERT(function.NumTypeParameters() == 1);
       ASSERT_EQUAL(function.NumParameters(), 1);
       body += Constant(type_arguments);
       body += AllocateObject(TokenPosition::kNoSource, pointer_class, 1);
@@ -2013,10 +2002,10 @@
   ASSERT(class_table->HasValidClassAt(cid));
   const auto& view_class = Class::ZoneHandle(H.zone(), class_table->At(cid));
 
-  ASSERT(function.IsFactory() && (function.NumParameters() == 4));
-  LocalVariable* typed_data = parsed_function_->RawParameterVariable(1);
-  LocalVariable* offset_in_bytes = parsed_function_->RawParameterVariable(2);
-  LocalVariable* length = parsed_function_->RawParameterVariable(3);
+  ASSERT(function.IsFactory() && (function.NumParameters() == 3));
+  LocalVariable* typed_data = parsed_function_->RawParameterVariable(0);
+  LocalVariable* offset_in_bytes = parsed_function_->RawParameterVariable(1);
+  LocalVariable* length = parsed_function_->RawParameterVariable(2);
 
   Fragment body;
 
@@ -2265,8 +2254,8 @@
   ASSERT(
       Thread::Current()->isolate_group()->class_table()->HasValidClassAt(cid));
 
-  ASSERT(function.IsFactory() && (function.NumParameters() == 2));
-  LocalVariable* length = parsed_function_->RawParameterVariable(1);
+  ASSERT(function.IsFactory() && (function.NumParameters() == 1));
+  LocalVariable* length = parsed_function_->RawParameterVariable(0);
 
   Fragment instructions;
   instructions += LoadLocal(length);
@@ -2423,12 +2412,8 @@
     ASSERT(!forwarding_target->IsNull());
   }
 
-  TypeParameters& type_parameters = TypeParameters::Handle(Z);
-  if (dart_function.IsFactory()) {
-    type_parameters = Class::Handle(Z, dart_function.Owner()).type_parameters();
-  } else {
-    type_parameters = dart_function.type_parameters();
-  }
+  TypeParameters& type_parameters =
+      TypeParameters::Handle(Z, dart_function.type_parameters());
   const intptr_t num_type_params = type_parameters.Length();
   if (num_type_params == 0) return;
   // Check type parameter bounds against forwarding stub target, if any.
@@ -2471,8 +2456,6 @@
 
     if (forwarding_target != nullptr) {
       type_param = forwarding_target->TypeParameterAt(i);
-    } else if (dart_function.IsFactory()) {
-      type_param = Class::Handle(Z, dart_function.Owner()).TypeParameterAt(i);
     } else {
       type_param = dart_function.TypeParameterAt(i);
     }
@@ -4351,7 +4334,7 @@
 
   intptr_t type_args_len = 0;
   if (function.IsGeneric()) {
-    if (target.IsConstructor()) {
+    if (target.IsGenerativeConstructor()) {
       const auto& result_type = AbstractType::Handle(Z, function.result_type());
       ASSERT(result_type.IsFinalized());
       // Instantiate a flattened type arguments vector which
@@ -4368,10 +4351,6 @@
       ASSERT(parsed_function_->function_type_arguments() != nullptr);
       closure += LoadLocal(parsed_function_->function_type_arguments());
     }
-  } else if (target.IsFactory()) {
-    // Factories always take an extra implicit argument for
-    // type arguments even if their classes don't have type parameters.
-    closure += NullConstant();
   }
 
   // Push receiver.
diff --git a/runtime/vm/compiler/frontend/kernel_translation_helper.cc b/runtime/vm/compiler/frontend/kernel_translation_helper.cc
index 4d22555..c902d0c 100644
--- a/runtime/vm/compiler/frontend/kernel_translation_helper.cc
+++ b/runtime/vm/compiler/frontend/kernel_translation_helper.cc
@@ -3204,9 +3204,7 @@
 
 intptr_t ActiveClass::MemberTypeParameterCount(Zone* zone) {
   ASSERT(member != nullptr);
-  if (member->IsFactory()) {
-    return klass->NumTypeParameters();
-  } else if (member->IsMethodExtractor()) {
+  if (member->IsMethodExtractor()) {
     Function& extracted =
         Function::Handle(zone, member->extracted_method_closure());
     return extracted.NumTypeParameters();
@@ -3601,35 +3599,8 @@
     parameter_index -= class_type_parameter_count;
 
     if (active_class_->HasMember()) {
-      if (active_class_->MemberIsFactoryProcedure()) {
-        //
-        // WARNING: This is a little hackish:
-        //
-        // We have a static factory constructor. The kernel IR gives the factory
-        // constructor function its own type parameters (which are equal in name
-        // and number to the ones of the enclosing class). I.e.,
-        //
-        //   class A<T> {
-        //     factory A.x() { return new B<T>(); }
-        //   }
-        //
-        //  is basically translated to this:
-        //
-        //   class A<T> {
-        //     static A.x<T'>() { return new B<T'>(); }
-        //   }
-        //
-        if (class_type_parameter_count > parameter_index) {
-          result_ = active_class_->klass->TypeParameterAt(parameter_index,
-                                                          nullability);
-          return;
-        }
-        parameter_index -= class_type_parameter_count;
-      }
-      // Factory function should not be considered as procedure.
       const intptr_t procedure_type_parameter_count =
-          (active_class_->MemberIsProcedure() &&
-           !active_class_->MemberIsFactoryProcedure())
+          active_class_->MemberIsProcedure()
               ? active_class_->MemberTypeParameterCount(Z)
               : 0;
       if (procedure_type_parameter_count > 0) {
@@ -3937,26 +3908,20 @@
     bool is_closure,
     FunctionNodeHelper* function_node_helper) {
   ASSERT(!(is_method && is_closure));
-  bool is_factory = function.IsFactory();
-  intptr_t extra_parameters = (is_method || is_closure || is_factory) ? 1 : 0;
+  intptr_t extra_parameters = (is_method || is_closure) ? 1 : 0;
 
   const FunctionType& signature = FunctionType::Handle(Z, function.signature());
   ASSERT(!signature.IsNull());
-  intptr_t type_parameter_count = 0;
-  if (!is_factory) {
-    type_parameter_count = helper_->ReadListLength();
-    LoadAndSetupTypeParameters(active_class_, function, Class::Handle(Z),
-                               signature, type_parameter_count);
-    function_node_helper->SetJustRead(FunctionNodeHelper::kTypeParameters);
-  }
+  intptr_t type_parameter_count = helper_->ReadListLength();
+  LoadAndSetupTypeParameters(active_class_, function, Class::Handle(Z),
+                             signature, type_parameter_count);
+  function_node_helper->SetJustRead(FunctionNodeHelper::kTypeParameters);
 
   ActiveTypeParametersScope scope(active_class_, function, &signature, Z);
 
-  if (!is_factory) {
-    LoadAndSetupBounds(active_class_, function, Class::Handle(Z), signature,
-                       type_parameter_count);
-    function_node_helper->SetJustRead(FunctionNodeHelper::kTypeParameters);
-  }
+  LoadAndSetupBounds(active_class_, function, Class::Handle(Z), signature,
+                     type_parameter_count);
+  function_node_helper->SetJustRead(FunctionNodeHelper::kTypeParameters);
 
   function_node_helper->ReadUntilExcluding(
       FunctionNodeHelper::kPositionalParameters);
@@ -3996,13 +3961,9 @@
       signature.SetParameterTypeAt(pos, AbstractType::dynamic_type());
       function.SetParameterNameAt(pos, Symbols::ClosureParameter());
       pos++;
-    } else if (is_factory) {
-      signature.SetParameterTypeAt(pos, AbstractType::dynamic_type());
-      function.SetParameterNameAt(pos, Symbols::TypeArgumentsParameter());
-      pos++;
     }
   } else {
-    ASSERT(!is_method && !is_closure && !is_factory);
+    ASSERT(!is_method && !is_closure);
   }
 
   const Library& lib = Library::Handle(Z, active_class_->klass->library());
diff --git a/runtime/vm/compiler/frontend/kernel_translation_helper.h b/runtime/vm/compiler/frontend/kernel_translation_helper.h
index 1231839..4ee60a2 100644
--- a/runtime/vm/compiler/frontend/kernel_translation_helper.h
+++ b/runtime/vm/compiler/frontend/kernel_translation_helper.h
@@ -1429,11 +1429,6 @@
            member->IsFactory();
   }
 
-  bool MemberIsFactoryProcedure() {
-    ASSERT(member != nullptr);
-    return member->IsFactory();
-  }
-
   intptr_t MemberTypeParameterCount(Zone* zone);
 
   intptr_t ClassNumTypeArguments() {
diff --git a/runtime/vm/compiler/frontend/scope_builder.cc b/runtime/vm/compiler/frontend/scope_builder.cc
index 368eb19..ab7f04e 100644
--- a/runtime/vm/compiler/frontend/scope_builder.cc
+++ b/runtime/vm/compiler/frontend/scope_builder.cc
@@ -224,12 +224,6 @@
             }
           }
         }
-      } else if (function.IsFactory()) {
-        LocalVariable* variable = MakeVariable(
-            TokenPosition::kNoSource, TokenPosition::kNoSource,
-            Symbols::TypeArgumentsParameter(), AbstractType::dynamic_type());
-        scope_->InsertParameterAt(pos++, variable);
-        result_->type_arguments_variable = variable;
       }
 
       ParameterTypeCheckMode type_check_mode =
@@ -1570,21 +1564,13 @@
       function = function.parent_function();
     }
 
-    if (function.IsFactory()) {
-      // The type argument vector is passed as the very first argument to the
-      // factory constructor function.
-      HandleSpecialLoad(&result_->type_arguments_variable,
-                        Symbols::TypeArgumentsParameter(),
-                        LocalVariable::kNoKernelOffset);
-    } else {
-      // If the type parameter is a parameter to this or an enclosing function,
-      // we can read it directly from the function type arguments vector later.
-      // Otherwise, the type arguments vector we need is stored on the instance
-      // object, so we need to capture 'this'.
-      Class& parent_class = Class::Handle(Z, function.Owner());
-      if (index < parent_class.NumTypeParameters()) {
-        HandleLoadReceiver();
-      }
+    // If the type parameter is a parameter to this or an enclosing function,
+    // we can read it directly from the function type arguments vector later.
+    // Otherwise, the type arguments vector we need is stored on the instance
+    // object, so we need to capture 'this'.
+    Class& parent_class = Class::Handle(Z, function.Owner());
+    if (index < parent_class.NumTypeParameters()) {
+      HandleLoadReceiver();
     }
   }
 }
diff --git a/runtime/vm/compiler/frontend/scope_builder.h b/runtime/vm/compiler/frontend/scope_builder.h
index f319acc..4052e90 100644
--- a/runtime/vm/compiler/frontend/scope_builder.h
+++ b/runtime/vm/compiler/frontend/scope_builder.h
@@ -181,8 +181,7 @@
 class ScopeBuildingResult : public ZoneObject {
  public:
   ScopeBuildingResult()
-      : type_arguments_variable(nullptr),
-        switch_variable(nullptr),
+      : switch_variable(nullptr),
         finally_return_variable(nullptr),
         setter_value(nullptr),
         raw_variable_counter_(0) {}
@@ -200,9 +199,6 @@
   IntMap<LocalScope*> scopes;
   GrowableArray<FunctionScope> function_scopes;
 
-  // Only non-null for factory constructor functions.
-  LocalVariable* type_arguments_variable;
-
   // Non-nullptr when the function contains a switch statement.
   LocalVariable* switch_variable;
 
diff --git a/runtime/vm/compiler/method_recognizer.cc b/runtime/vm/compiler/method_recognizer.cc
index 9a80dd6..fe72089 100644
--- a/runtime/vm/compiler/method_recognizer.cc
+++ b/runtime/vm/compiler/method_recognizer.cc
@@ -15,6 +15,7 @@
     const Function& function) {
   switch (function.recognized_kind()) {
     case MethodRecognizer::kDoubleFromInteger:
+      return 1;
     case MethodRecognizer::kMathMin:
     case MethodRecognizer::kMathMax:
       return 2;
diff --git a/runtime/vm/compiler/recognized_methods_list.h b/runtime/vm/compiler/recognized_methods_list.h
index 7e0e861..bbcf645 100644
--- a/runtime/vm/compiler/recognized_methods_list.h
+++ b/runtime/vm/compiler/recognized_methods_list.h
@@ -164,7 +164,7 @@
   V(FfiLibrary, ::, _storeDoubleUnaligned, FfiStoreDoubleUnaligned,            \
     0x49ce5c4f)                                                                \
   V(FfiLibrary, ::, _storePointer, FfiStorePointer, 0xa08098b2)                \
-  V(FfiLibrary, ::, _fromAddress, FfiFromAddress, 0x941575ee)                  \
+  V(FfiLibrary, ::, _fromAddress, FfiFromAddress, 0x9415722d)                  \
   V(FfiLibrary, Pointer, get:address, FfiGetAddress, 0x7cc16ffe)               \
   V(FfiLibrary, Native, _addressOf, FfiNativeAddressOf, 0x7f8597d3)            \
   V(FfiLibrary, ::, _asExternalTypedDataInt8, FfiAsExternalTypedDataInt8,      \
diff --git a/runtime/vm/compiler/stub_code_compiler_ia32.cc b/runtime/vm/compiler/stub_code_compiler_ia32.cc
index 884e4eb..22ebe80 100644
--- a/runtime/vm/compiler/stub_code_compiler_ia32.cc
+++ b/runtime/vm/compiler/stub_code_compiler_ia32.cc
@@ -2400,9 +2400,9 @@
 // ECX: ICData
 // ESP[0]: return address
 void StubCodeCompiler::GenerateOneArgUnoptimizedStaticCallStub() {
-  GenerateNArgsCheckInlineCacheStub(
-      2, kStaticCallMissHandlerTwoArgsRuntimeEntry, Token::kILLEGAL,
-      kUnoptimized, kStaticCall, kIgnoreExactness);
+  GenerateNArgsCheckInlineCacheStub(1, kStaticCallMissHandlerOneArgRuntimeEntry,
+                                    Token::kILLEGAL, kUnoptimized, kStaticCall,
+                                    kIgnoreExactness);
 }
 
 // ECX: ICData
diff --git a/runtime/vm/dart.cc b/runtime/vm/dart.cc
index e32f9a0..4dcf4a7 100644
--- a/runtime/vm/dart.cc
+++ b/runtime/vm/dart.cc
@@ -442,10 +442,9 @@
         return Utils::StrDup("Invalid vm isolate snapshot seen");
       }
       FullSnapshotReader reader(snapshot, params->vm_snapshot_instructions, T);
-      const Error& error = Error::Handle(reader.ReadVMSnapshot());
-      if (!error.IsNull()) {
-        // Must copy before leaving the zone.
-        return Utils::StrDup(error.ToErrorCString());
+      char* error = reader.ReadVMSnapshot();
+      if (error != nullptr) {
+        return error;
       }
 
       Object::FinishInit(vm_isolate_->group());
@@ -849,17 +848,16 @@
   return isolate;
 }
 
-ErrorPtr Dart::InitIsolateGroupFromSnapshot(
-    Thread* T,
-    const uint8_t* snapshot_data,
-    const uint8_t* snapshot_instructions,
-    const uint8_t* kernel_buffer,
-    intptr_t kernel_buffer_size) {
+char* Dart::InitIsolateGroupFromSnapshot(Thread* T,
+                                         const uint8_t* snapshot_data,
+                                         const uint8_t* snapshot_instructions,
+                                         const uint8_t* kernel_buffer,
+                                         intptr_t kernel_buffer_size) {
   auto IG = T->isolate_group();
   Error& error = Error::Handle(T->zone());
   error = Object::Init(IG, kernel_buffer, kernel_buffer_size);
   if (!error.IsNull()) {
-    return error.ptr();
+    return Utils::StrDup(error.ToCString());
   }
   if (snapshot_data != nullptr && kernel_buffer == nullptr) {
     // Read the snapshot and setup the initial state.
@@ -869,23 +867,21 @@
 #endif  // defined(SUPPORT_TIMELINE)
     const Snapshot* snapshot = Snapshot::SetupFromBuffer(snapshot_data);
     if (snapshot == nullptr) {
-      const String& message = String::Handle(String::New("Invalid snapshot"));
-      return ApiError::New(message);
+      return Utils::StrDup("Invalid snapshot");
     }
     if (!IsSnapshotCompatible(vm_snapshot_kind_, snapshot->kind())) {
-      const String& message = String::Handle(String::NewFormatted(
-          "Incompatible snapshot kinds: vm '%s', isolate '%s'",
-          Snapshot::KindToCString(vm_snapshot_kind_),
-          Snapshot::KindToCString(snapshot->kind())));
-      return ApiError::New(message);
+      return OS::SCreate(nullptr,
+                         "Incompatible snapshot kinds: vm '%s', isolate '%s'",
+                         Snapshot::KindToCString(vm_snapshot_kind_),
+                         Snapshot::KindToCString(snapshot->kind()));
     }
     if (FLAG_trace_isolates) {
       OS::PrintErr("Size of isolate snapshot = %" Pd "\n", snapshot->length());
     }
     FullSnapshotReader reader(snapshot, snapshot_instructions, T);
-    const Error& error = Error::Handle(reader.ReadProgramSnapshot());
-    if (!error.IsNull()) {
-      return error.ptr();
+    char* error = reader.ReadProgramSnapshot();
+    if (error != nullptr) {
+      return error;
     }
     {
       // Initialize sentinel field table, which should have sentinel values for
@@ -913,16 +909,14 @@
     }
   } else {
     if ((vm_snapshot_kind_ != Snapshot::kNone) && kernel_buffer == nullptr) {
-      const String& message =
-          String::Handle(String::New("Missing isolate snapshot"));
-      return ApiError::New(message);
+      return Utils::StrDup("Missing isolate snapshot");
     }
   }
 #if !defined(PRODUCT) || defined(FORCE_INCLUDE_SAMPLING_HEAP_PROFILER)
   IG->class_table()->PopulateUserVisibleNames();
 #endif
 
-  return Error::null();
+  return nullptr;
 }
 
 #if !defined(DART_PRECOMPILED_RUNTIME)
@@ -946,16 +940,16 @@
 }
 #endif  // !defined(DART_PRECOMPILED_RUNTIME)
 
-ErrorPtr Dart::InitializeIsolateGroup(Thread* T,
-                                      const uint8_t* snapshot_data,
-                                      const uint8_t* snapshot_instructions,
-                                      const uint8_t* kernel_buffer,
-                                      intptr_t kernel_buffer_size) {
-  auto& error = Error::Handle(
+char* Dart::InitializeIsolateGroup(Thread* T,
+                                   const uint8_t* snapshot_data,
+                                   const uint8_t* snapshot_instructions,
+                                   const uint8_t* kernel_buffer,
+                                   intptr_t kernel_buffer_size) {
+  char* error =
       InitIsolateGroupFromSnapshot(T, snapshot_data, snapshot_instructions,
-                                   kernel_buffer, kernel_buffer_size));
-  if (!error.IsNull()) {
-    return error.ptr();
+                                   kernel_buffer, kernel_buffer_size);
+  if (error != nullptr) {
+    return error;
   }
 
   Object::VerifyBuiltinVtables();
@@ -975,9 +969,9 @@
 
   if (snapshot_data == nullptr || kernel_buffer != nullptr) {
     auto object_store = IG->object_store();
-    error ^= object_store->PreallocateObjects();
+    const Error& error = Error::Handle(object_store->PreallocateObjects());
     if (!error.IsNull()) {
-      return error.ptr();
+      return Utils::StrDup(error.ToErrorCString());
     }
   }
 
@@ -988,7 +982,7 @@
   IG->object_store()->set_tag_table(
       GrowableObjectArray::Handle(GrowableObjectArray::New()));
 
-  return Error::null();
+  return nullptr;
 }
 
 ErrorPtr Dart::InitializeIsolate(Thread* T,
diff --git a/runtime/vm/dart.h b/runtime/vm/dart.h
index 0fbf7f2..c30d68e 100644
--- a/runtime/vm/dart.h
+++ b/runtime/vm/dart.h
@@ -46,12 +46,14 @@
                                 IsolateGroup* isolate_group);
 
   // Initialize an isolate group either from a snapshot or from a Kernel binary.
-  static ErrorPtr InitializeIsolateGroup(Thread* T,
-                                         const uint8_t* snapshot_data,
-                                         const uint8_t* snapshot_instructions,
-                                         const uint8_t* kernel_buffer,
-                                         intptr_t kernel_buffer_size);
-  static ErrorPtr InitIsolateGroupFromSnapshot(
+  // On success, returns nullptr. On failure, returns an error message that the
+  // caller must free.
+  static char* InitializeIsolateGroup(Thread* T,
+                                      const uint8_t* snapshot_data,
+                                      const uint8_t* snapshot_instructions,
+                                      const uint8_t* kernel_buffer,
+                                      intptr_t kernel_buffer_size);
+  static char* InitIsolateGroupFromSnapshot(
       Thread* T,
       const uint8_t* snapshot_data,
       const uint8_t* snapshot_instructions,
diff --git a/runtime/vm/dart_api_impl.cc b/runtime/vm/dart_api_impl.cc
index 55dca4b..055e075 100644
--- a/runtime/vm/dart_api_impl.cc
+++ b/runtime/vm/dart_api_impl.cc
@@ -1220,24 +1220,27 @@
     // bootstrap library files which call out to a tag handler that may create
     // Api Handles when an error is encountered.
     T->EnterApiScope();
-    auto& error_obj = Error::Handle(Z);
+    char* error_str = nullptr;
     if (is_new_group) {
-      error_obj = Dart::InitializeIsolateGroup(
+      error_str = Dart::InitializeIsolateGroup(
           T, source->snapshot_data, source->snapshot_instructions,
           source->kernel_buffer, source->kernel_buffer_size);
     }
-    if (error_obj.IsNull()) {
-      error_obj = Dart::InitializeIsolate(T, is_new_group, isolate_data);
-    }
-    if (error_obj.IsNull()) {
+    if (error_str == nullptr) {
+      const Error& error_obj = Error::Handle(
+          Z, Dart::InitializeIsolate(T, is_new_group, isolate_data));
+      if (error_obj.IsNull()) {
 #if defined(DEBUG) && !defined(DART_PRECOMPILED_RUNTIME)
-      if (FLAG_check_function_fingerprints && !FLAG_precompiled_mode) {
-        Library::CheckFunctionFingerprints();
-      }
+        if (FLAG_check_function_fingerprints && !FLAG_precompiled_mode) {
+          Library::CheckFunctionFingerprints();
+        }
 #endif  // defined(DEBUG) && !defined(DART_PRECOMPILED_RUNTIME).
-      success = true;
+        success = true;
+      } else if (error != nullptr) {
+        *error = Utils::StrDup(error_obj.ToErrorCString());
+      }
     } else if (error != nullptr) {
-      *error = Utils::StrDup(error_obj.ToErrorCString());
+      *error = error_str;
     }
     // We exit the API scope entered above.
     T->ExitApiScope();
@@ -3205,11 +3208,14 @@
   Function& factory_method = Function::ZoneHandle(Z);
   factory_method = map_class.LookupFactoryAllowPrivate(
       Library::PrivateCoreLibName(Symbols::MapKeyValuesFactory()));
+  const Array& arguments_descriptor =
+      Array::Handle(Z, ArgumentsDescriptor::NewBoxed(2, 2));
   const Array& args = Array::Handle(Z, Array::New(3));
   args.SetAt(0, type_arguments);
   args.SetAt(1, keys_obj);
   args.SetAt(2, values_obj);
-  return Api::NewHandle(T, DartEntry::InvokeFunction(factory_method, args));
+  return Api::NewHandle(
+      T, DartEntry::InvokeFunction(factory_method, args, arguments_descriptor));
 }
 
 DART_EXPORT Dart_Handle Dart_NewListOfTypeFilled(Dart_Handle element_type,
@@ -3427,7 +3433,7 @@
 static ObjectPtr ResolveConstructor(const char* current_func,
                                     const Class& cls,
                                     const String& class_name,
-                                    const String& dotted_name,
+                                    const String& constr_name,
                                     int num_args);
 
 static ObjectPtr ThrowArgumentError(const char* exception_message) {
@@ -4079,13 +4085,12 @@
   ASSERT(result.IsFunction());
   const Function& factory = Function::Cast(result);
   ASSERT(!factory.IsGenerativeConstructor());
+  ASSERT(factory.NumParameters() == 1);
 
   // Create the argument list.
-  const Array& args = Array::Handle(Z, Array::New(2));
-  // Factories get type arguments.
-  args.SetAt(0, Object::null_type_arguments());
+  const Array& args = Array::Handle(Z, Array::New(1));
   const Object& obj = Object::Handle(Z, Api::UnwrapHandle(typed_data));
-  args.SetAt(1, obj);
+  args.SetAt(0, obj);
 
   // Invoke the factory constructor and return the new object.
   result = DartEntry::InvokeFunction(factory, args);
@@ -4297,10 +4302,11 @@
       return ApiError::New(message);
     }
   }
-  const int kTypeArgsLen = 0;
-  const int extra_args = 1;
+  const int type_args_len =
+      constructor.IsGenerativeConstructor() ? 0 : cls.NumTypeParameters();
+  const int extra_args = constructor.IsGenerativeConstructor() ? 1 : 0;
   String& error_message = String::Handle();
-  if (!constructor.AreValidArgumentCounts(kTypeArgsLen, num_args + extra_args,
+  if (!constructor.AreValidArgumentCounts(type_args_len, num_args + extra_args,
                                           0, &error_message)) {
     const String& message = String::Handle(String::NewFormatted(
         "%s: wrong argument count for "
@@ -4344,9 +4350,6 @@
   Class& cls = Class::Handle(Z, type_obj.type_class());
   CHECK_ERROR_HANDLE(cls.EnsureIsAllocateFinalized(T));
 
-  TypeArguments& type_arguments =
-      TypeArguments::Handle(Z, type_obj.GetInstanceTypeArguments(T));
-
   const String& base_constructor_name = String::Handle(Z, cls.Name());
 
   // And get the name of the constructor to invoke.
@@ -4388,22 +4391,33 @@
   }
 
   // Create the argument list.
+  const intptr_t type_args_len =
+      constructor.IsGenerativeConstructor() ? 0 : cls.NumTypeParameters();
+  const intptr_t num_implicit_positional_args =
+      constructor.IsGenerativeConstructor() ? 1 : 0;
   intptr_t arg_index = 0;
-  int extra_args = 1;
-  const Array& args =
-      Array::Handle(Z, Array::New(number_of_arguments + extra_args));
+  Array& args = Array::Handle(Z);
+  TypeArguments& instantiator_type_arguments = TypeArguments::Handle(Z);
+  TypeArguments& function_type_arguments = TypeArguments::Handle(Z);
   if (constructor.IsGenerativeConstructor()) {
     // Constructors get the uninitialized object.
-    if (!type_arguments.IsNull()) {
+    args = Array::New(number_of_arguments + num_implicit_positional_args);
+    instantiator_type_arguments = type_obj.GetInstanceTypeArguments(T);
+    if (!instantiator_type_arguments.IsNull()) {
       // The type arguments will be null if the class has no type parameters, in
       // which case the following call would fail because there is no slot
       // reserved in the object for the type vector.
-      new_object.SetTypeArguments(type_arguments);
+      new_object.SetTypeArguments(instantiator_type_arguments);
     }
     args.SetAt(arg_index++, new_object);
   } else {
-    // Factories get type arguments.
-    args.SetAt(arg_index++, type_arguments);
+    args = Array::New(number_of_arguments + ((type_args_len > 0) ? 1 : 0));
+    if (type_args_len > 0) {
+      function_type_arguments = type_obj.arguments();
+      ASSERT(function_type_arguments.IsNull() ||
+             function_type_arguments.Length() == type_args_len);
+      args.SetAt(arg_index++, function_type_arguments);
+    }
   }
   Object& argument = Object::Handle(Z);
   for (int i = 0; i < number_of_arguments; i++) {
@@ -4420,19 +4434,21 @@
     args.SetAt(arg_index++, argument);
   }
 
-  const int kTypeArgsLen = 0;
   Array& args_descriptor_array = Array::Handle(
-      Z, ArgumentsDescriptor::NewBoxed(kTypeArgsLen, args.Length()));
+      Z,
+      ArgumentsDescriptor::NewBoxed(
+          type_args_len, number_of_arguments + num_implicit_positional_args));
 
   ArgumentsDescriptor args_descriptor(args_descriptor_array);
   ObjectPtr type_error = constructor.DoArgumentTypesMatch(
-      args, args_descriptor, type_arguments, Object::empty_type_arguments());
+      args, args_descriptor, instantiator_type_arguments,
+      function_type_arguments);
   if (type_error != Error::null()) {
     return Api::NewHandle(T, type_error);
   }
 
   // Invoke the constructor and return the new object.
-  result = DartEntry::InvokeFunction(constructor, args);
+  result = DartEntry::InvokeFunction(constructor, args, args_descriptor_array);
   if (result.IsError()) {
     return Api::NewHandle(T, result.ptr());
   }
@@ -5650,10 +5666,12 @@
     return Api::NewError("Invalid snapshot kind");
   }
 
-  const Error& error = Error::Handle(
-      module_snapshot::ReadModuleSnapshot(T, snapshot, snapshot_instructions));
-  if (!error.IsNull()) {
-    return Api::NewHandle(T, error.ptr());
+  char* error =
+      module_snapshot::ReadModuleSnapshot(T, snapshot, snapshot_instructions);
+  if (error != nullptr) {
+    const String& message = String::Handle(String::New(error));
+    free(error);
+    return Api::NewHandle(T, ApiError::New(message));
   }
 
   return Api::Success();
@@ -6100,9 +6118,11 @@
     }
 
     FullSnapshotReader reader(snapshot, snapshot_instructions, T);
-    const Error& error = Error::Handle(reader.ReadUnitSnapshot(unit));
-    if (!error.IsNull()) {
-      return Api::NewHandle(T, error.ptr());
+    char* error = reader.ReadUnitSnapshot(unit);
+    if (error != nullptr) {
+      const String& message = String::Handle(Z, String::New(error));
+      free(error);
+      return Api::NewHandle(T, ApiError::New(message));
     }
 
     return Api::NewHandle(T, unit.CompleteLoad(String::Handle(), false));
diff --git a/runtime/vm/image_snapshot.cc b/runtime/vm/image_snapshot.cc
index 22f119e..26f0125 100644
--- a/runtime/vm/image_snapshot.cc
+++ b/runtime/vm/image_snapshot.cc
@@ -2095,17 +2095,15 @@
     : data_image_(ASSERT_NOTNULL(data_image)),
       instructions_image_(ASSERT_NOTNULL(instructions_image)) {}
 
-ApiErrorPtr ImageReader::VerifyAlignment() const {
+char* ImageReader::VerifyAlignment() const {
   // If this changes, bin_to_assembly.py and bin_to_coff.py must also change.
   COMPILE_ASSERT(kObjectStartAlignment == 64);
 
   if (!Utils::IsAligned(data_image_, kObjectStartAlignment) ||
       !Utils::IsAligned(instructions_image_, kObjectStartAlignment)) {
-    return ApiError::New(
-        String::Handle(String::New("Snapshot is misaligned", Heap::kOld)),
-        Heap::kOld);
+    return Utils::StrDup("Snapshot is misaligned");
   }
-  return ApiError::null();
+  return nullptr;
 }
 
 #if defined(DART_PRECOMPILED_RUNTIME)
diff --git a/runtime/vm/image_snapshot.h b/runtime/vm/image_snapshot.h
index 4379c86..25cedde 100644
--- a/runtime/vm/image_snapshot.h
+++ b/runtime/vm/image_snapshot.h
@@ -170,7 +170,7 @@
  public:
   ImageReader(const uint8_t* data_image, const uint8_t* instructions_image);
 
-  ApiErrorPtr VerifyAlignment() const;
+  char* VerifyAlignment() const;
 
   ONLY_IN_PRECOMPILED(uword GetBareInstructionsAt(uint32_t offset) const);
   ONLY_IN_PRECOMPILED(uword GetBareInstructionsEnd() const);
diff --git a/runtime/vm/module_snapshot.cc b/runtime/vm/module_snapshot.cc
index cf138db5..1c74bf1 100644
--- a/runtime/vm/module_snapshot.cc
+++ b/runtime/vm/module_snapshot.cc
@@ -155,7 +155,7 @@
                const uint8_t* instructions_buffer);
   ~Deserializer();
 
-  ApiErrorPtr VerifyVersionAndFeatures();
+  char* VerifyVersionAndFeatures();
 
   ObjectPtr Allocate(intptr_t size);
   static void InitializeHeader(ObjectPtr raw,
@@ -1338,14 +1338,15 @@
   delete[] clusters_;
 }
 
-ApiErrorPtr Deserializer::VerifyVersionAndFeatures() {
+char* Deserializer::VerifyVersionAndFeatures() {
   stream_.SetPosition(Snapshot::kHeaderSize);
 
   const intptr_t format_version = stream_.ReadUnsigned();
   if (format_version != ModuleSnapshot::kFormatVersion) {
-    return ApiError::New(String::Handle(String::NewFormatted(
-        "Invalid module snapshot format version %" Pd " (expected %" Pd ")",
-        format_version, ModuleSnapshot::kFormatVersion)));
+    return OS::SCreate(nullptr,
+                       "Invalid module snapshot format version %" Pd
+                       " (expected %" Pd ")",
+                       format_version, ModuleSnapshot::kFormatVersion);
   }
 
   const char* features =
@@ -1353,19 +1354,18 @@
   const intptr_t features_length =
       Utils::StrNLen(features, stream_.PendingBytes());
   if (features_length == stream_.PendingBytes()) {
-    return ApiError::New(
-        String::Handle(String::New("The features string in the module snapshot "
-                                   "was not zero-terminated.")));
+    return Utils::StrDup(
+        "The features string in the module snapshot was not zero-terminated.");
   }
   stream_.Advance(features_length + 1);
 
   const char* expected_features = kHostArchitectureName;
   if (strcmp(expected_features, features) != 0) {
-    return ApiError::New(String::Handle(String::NewFormatted(
-        "Invalid module snapshot configuration '%s' (expected '%s')", features,
-        expected_features)));
+    return OS::SCreate(
+        nullptr, "Invalid module snapshot configuration '%s' (expected '%s')",
+        features, expected_features);
   }
-  return ApiError::null();
+  return nullptr;
 }
 
 DeserializationCluster* Deserializer::ReadCluster() {
@@ -1493,6 +1493,7 @@
   AddBaseObject(StubCode::Subtype3TestCache());
   AddBaseObject(StubCode::Subtype4TestCache());
   AddBaseObject(StubCode::Subtype6TestCache());
+  AddBaseObject(StubCode::InstantiateTypeArguments());
   AddBaseObject(Code::Handle(zone(), object_store->init_async_stub()));
   AddBaseObject(Code::Handle(zone(), object_store->init_async_star_stub()));
   AddBaseObject(Code::Handle(zone(), object_store->init_sync_star_stub()));
@@ -1580,22 +1581,22 @@
   }
 }
 
-ApiErrorPtr ReadModuleSnapshot(Thread* thread,
-                               const Snapshot* snapshot,
-                               const uint8_t* instructions_buffer) {
+char* ReadModuleSnapshot(Thread* thread,
+                         const Snapshot* snapshot,
+                         const uint8_t* instructions_buffer) {
   ASSERT(snapshot->kind() == Snapshot::kModule);
 
   Deserializer deserializer(thread, snapshot->Addr(), snapshot->length(),
                             instructions_buffer);
 
-  ApiErrorPtr api_error = deserializer.VerifyVersionAndFeatures();
-  if (api_error != ApiError::null()) {
-    return api_error;
+  char* error = deserializer.VerifyVersionAndFeatures();
+  if (error != nullptr) {
+    return error;
   }
 
   deserializer.Deserialize();
 
-  return ApiError::null();
+  return nullptr;
 }
 
 }  // namespace module_snapshot
diff --git a/runtime/vm/module_snapshot.h b/runtime/vm/module_snapshot.h
index 214a0c1..53d5024 100644
--- a/runtime/vm/module_snapshot.h
+++ b/runtime/vm/module_snapshot.h
@@ -16,9 +16,11 @@
 namespace dart {
 namespace module_snapshot {
 
-ApiErrorPtr ReadModuleSnapshot(Thread* thread,
-                               const Snapshot* snapshot,
-                               const uint8_t* instructions_buffer);
+// On success, returns nullptr. On failure, returns an error message that the
+// caller must free.
+char* ReadModuleSnapshot(Thread* thread,
+                         const Snapshot* snapshot,
+                         const uint8_t* instructions_buffer);
 
 }  // namespace module_snapshot
 }  // namespace dart
diff --git a/runtime/vm/native_api_impl.cc b/runtime/vm/native_api_impl.cc
index 0c15da9..57b7ebf 100644
--- a/runtime/vm/native_api_impl.cc
+++ b/runtime/vm/native_api_impl.cc
@@ -21,28 +21,6 @@
 
 // --- Message sending/receiving from native code ---
 
-class IsolateLeaveScope {
- public:
-  explicit IsolateLeaveScope(Isolate* current_isolate)
-      : saved_isolate_(current_isolate) {
-    if (current_isolate != nullptr) {
-      ASSERT(current_isolate == Isolate::Current());
-      Dart_ExitIsolate();
-    }
-  }
-  ~IsolateLeaveScope() {
-    if (saved_isolate_ != nullptr) {
-      Dart_Isolate I = reinterpret_cast<Dart_Isolate>(saved_isolate_);
-      Dart_EnterIsolate(I);
-    }
-  }
-
- private:
-  Isolate* saved_isolate_;
-
-  DISALLOW_COPY_AND_ASSIGN(IsolateLeaveScope);
-};
-
 class DartApiCallScope : public ValueObject {
  public:
   DartApiCallScope() : active_(Dart::SetActiveApiCall()) {}
@@ -110,8 +88,6 @@
     return ILLEGAL_PORT;
   }
   ENTER_API_CALL_OR_RETURN(ILLEGAL_PORT);
-  // Start the native port without a current isolate.
-  IsolateLeaveScope saver(Isolate::Current());
 
   NativeMessageHandler* nmh =
       new NativeMessageHandler(name, handler, max_concurrency);
@@ -122,9 +98,6 @@
 DART_EXPORT bool Dart_CloseNativePort(Dart_Port native_port_id) {
   ENTER_API_CALL_OR_RETURN(false)
 
-  // Close the native port without a current isolate.
-  IsolateLeaveScope saver(Isolate::Current());
-
   PortHandler* handler = nullptr;
   const bool was_closed = PortMap::ClosePort(native_port_id, &handler);
   if (was_closed) {
@@ -148,7 +121,6 @@
 
   Isolate* isolate = Isolate::Current();
   ASSERT(isolate == nullptr || !isolate->is_service_isolate());
-  IsolateLeaveScope saver(isolate);
 
   // We only allow one isolate reload at a time.  If this turns out to be on the
   // critical path, we can change it to have a global datastructure which is
diff --git a/runtime/vm/native_message_handler.cc b/runtime/vm/native_message_handler.cc
index dcc8c33..a0647dc 100644
--- a/runtime/vm/native_message_handler.cc
+++ b/runtime/vm/native_message_handler.cc
@@ -25,12 +25,6 @@
 
 NativeMessageHandler::~NativeMessageHandler() {}
 
-#if defined(DEBUG)
-void NativeMessageHandler::CheckAccess() const {
-  ASSERT(Isolate::Current() == nullptr);
-}
-#endif
-
 namespace {
 class HandleMessage : public ThreadPool::Task {
  public:
diff --git a/runtime/vm/native_message_handler.h b/runtime/vm/native_message_handler.h
index 1e8474f..9659b3d 100644
--- a/runtime/vm/native_message_handler.h
+++ b/runtime/vm/native_message_handler.h
@@ -28,11 +28,6 @@
   const char* name() const override { return name_.get(); }
   Dart_NativeMessageHandler func() const { return func_; }
 
-#if defined(DEBUG)
-  // Check that it is safe to access this handler.
-  void CheckAccess() const override;
-#endif
-
   void OnPortClosed(Dart_Port port) override {}
 
   Isolate* isolate() const override { return nullptr; }
diff --git a/runtime/vm/object.cc b/runtime/vm/object.cc
index a64a849..29c6933 100644
--- a/runtime/vm/object.cc
+++ b/runtime/vm/object.cc
@@ -9713,10 +9713,6 @@
 
 intptr_t Function::NumImplicitParameters() const {
   const UntaggedFunction::Kind k = kind();
-  if (k == UntaggedFunction::kConstructor) {
-    // Type arguments for factory; instance for generative constructor.
-    return 1;
-  }
   if ((k == UntaggedFunction::kClosureFunction) ||
       (k == UntaggedFunction::kImplicitClosureFunction) ||
       (k == UntaggedFunction::kFfiTrampoline)) {
@@ -10910,7 +10906,7 @@
   }
 
   const intptr_t num_type_params =
-      IsConstructor() ? cls.NumTypeParameters() : NumTypeParameters();
+      IsGenerativeConstructor() ? cls.NumTypeParameters() : NumTypeParameters();
 
   TypeArguments& instantiator_type_arguments = TypeArguments::Handle(zone);
   TypeArguments& function_type_arguments = TypeArguments::Handle(zone);
@@ -10922,7 +10918,7 @@
 
   auto transform_type = [&](AbstractType& type) {
     if (num_type_params > 0) {
-      if (IsConstructor()) {
+      if (IsGenerativeConstructor()) {
         type = type.UpdateFunctionTypes(num_type_params, kAllFree, Heap::kOld,
                                         nullptr);
         if (!type.IsInstantiated(kCurrentClass)) {
@@ -10940,7 +10936,7 @@
   auto transform_type_args = [&](TypeArguments& type_args) {
     ASSERT(num_type_params > 0);
     if (!type_args.IsNull()) {
-      if (IsConstructor()) {
+      if (IsGenerativeConstructor()) {
         type_args = type_args.UpdateFunctionTypes(num_type_params, kAllFree,
                                                   Heap::kOld, nullptr);
         if (!type_args.IsInstantiated(kCurrentClass)) {
@@ -10958,7 +10954,8 @@
   // Set closure function's type parameters.
   if (num_type_params > 0) {
     const TypeParameters& old_type_params = TypeParameters::Handle(
-        zone, IsConstructor() ? cls.type_parameters() : type_parameters());
+        zone,
+        IsGenerativeConstructor() ? cls.type_parameters() : type_parameters());
     const TypeParameters& new_type_params =
         TypeParameters::Handle(zone, TypeParameters::New());
     // No need to set names that are ignored in a signature, however, the
@@ -10977,7 +10974,7 @@
       type_args.SetTypeAt(i, type_param);
     }
 
-    if (IsConstructor()) {
+    if (IsGenerativeConstructor()) {
       instantiator_type_arguments =
           type_args.ToInstantiatorTypeArguments(thread, cls);
     } else {
@@ -10996,7 +10993,7 @@
 
   // Set closure function's result type.
   AbstractType& result_type = AbstractType::Handle(zone);
-  if (IsConstructor()) {
+  if (IsGenerativeConstructor()) {
     result_type = cls.DeclarationType();
   } else {
     result_type = this->result_type();
@@ -18123,14 +18120,13 @@
                                    intptr_t num_args_tested,
                                    RebindRule rebind_rule) {
   // See `MethodRecognizer::NumArgsCheckedForStaticCall`.
-  ASSERT(num_args_tested == 0 || num_args_tested == 2);
+  ASSERT(num_args_tested == 0 || num_args_tested == 1 || num_args_tested == 2);
   ASSERT(!target.IsNull());
 
   Zone* zone = Thread::Current()->zone();
   const auto& target_name = String::Handle(zone, target.name());
   GrowableArray<intptr_t> cids(num_args_tested);
-  if (num_args_tested == 2) {
-    cids.Add(kObjectCid);
+  for (intptr_t i = 0; i < num_args_tested; ++i) {
     cids.Add(kObjectCid);
   }
   return ICData::NewWithCheck(owner, target_name, arguments_descriptor,
diff --git a/runtime/vm/runtime_entry.cc b/runtime/vm/runtime_entry.cc
index f974fc9..8e2bb3d 100644
--- a/runtime/vm/runtime_entry.cc
+++ b/runtime/vm/runtime_entry.cc
@@ -1064,13 +1064,8 @@
   intptr_t num_arguments = args_desc.Count();
 
   if (target.is_static()) {
-    if (target.IsFactory()) {
-      // Factory always takes type arguments via a positional parameter.
-      type_args_len = 0;
-    } else {
-      // Drop closure receiver.
-      --num_arguments;
-    }
+    // Drop closure receiver.
+    --num_arguments;
   } else {
     if (target.IsGenerativeConstructor()) {
       // Type arguments are not passed to a generative constructor.
@@ -2496,7 +2491,7 @@
   const Instance& arg = Instance::CheckedHandle(zone, arguments.ArgAt(0));
   const ICData& ic_data = ICData::CheckedHandle(zone, arguments.ArgAt(1));
   // IC data for static call is prepopulated with the statically known target.
-  ASSERT(ic_data.NumberOfChecksIs(1));
+  ASSERT(!ic_data.NumberOfChecksIs(0));
   const Function& target = Function::Handle(zone, ic_data.GetTargetAt(0));
   target.EnsureHasCode();
   ASSERT(!target.IsNull() && target.HasCode());
diff --git a/samples/embedder/BUILD.gn b/samples/embedder/BUILD.gn
index 0b41610..885be5f 100644
--- a/samples/embedder/BUILD.gn
+++ b/samples/embedder/BUILD.gn
@@ -70,14 +70,6 @@
     dart_shared_lib = "../../runtime/engine:dart_engine_aot_shared"
     dart_static_lib = "../../runtime/engine:dart_engine_aot_static"
     snapshot_target = "aot_snapshot"
-
-    # AOT snapshots as shared libraries on Windows are not
-    # supported, and in fact we don't build AOT samples on
-    # Windows. However, GN evaluation model will still
-    # evaluate the `aot_snapshot` template on Windows,
-    # and it will fail the assert if as_shared_library is
-    # true, and the current platform is Windows.
-    as_shared_library = !is_win
   },
 ]
 
diff --git a/sdk.code-workspace b/sdk.code-workspace
index 4b5558b..207dc34 100644
--- a/sdk.code-workspace
+++ b/sdk.code-workspace
@@ -72,6 +72,9 @@
       // since it's in .gitignore, but it doesn't seem to.
       "xcodebuild",
       "out",
+
+      // A VERY old benchmark that has not been updated for the latest SDK
+      "pkg/compiler/test/codesize/swarm",
     ],
   },
 }
diff --git a/sdk/lib/_internal/js_dev_runtime/private/js_number.dart b/sdk/lib/_internal/js_dev_runtime/private/js_number.dart
index 0a1db65..5278910 100644
--- a/sdk/lib/_internal/js_dev_runtime/private/js_number.dart
+++ b/sdk/lib/_internal/js_dev_runtime/private/js_number.dart
@@ -458,6 +458,26 @@
     return JS('!', 'Math.clz32(#)', uint32);
   }
 
+  @notNull
+  int get trailingZeroBitCount {
+    int v = JS<int>('!', '# | 0', this);
+    if (v == 0) return 32;
+    return JS<int>('!', '31 - Math.clz32(# & -#)', v, v);
+  }
+
+  @notNull
+  int get oneBitCount {
+    // The number of bits set in the least significant 32 bits of `this`,
+    // also known as the "Hamming weight". See:
+    // https://en.wikipedia.org/wiki/Hamming_weight for an explanation of the
+    // following algorithm.
+    int v = JS<int>('!', '# | 0', this);
+    v -= (v >>> 1) & 0x5555_5555;
+    v = (v & 0x3333_3333) + ((v >>> 2) & 0x3333_3333);
+    v = (v + (v >>> 4)) & 0x0f0f_0f0f;
+    return JS<int>('!', '(Math.imul(#, 0x01010101) >>> 24)', v);
+  }
+
   // Returns pow(this, e) % m.
   @notNull
   int modPow(@nullCheck int e, @nullCheck int m) {
diff --git a/sdk/lib/_internal/js_runtime/lib/js_number.dart b/sdk/lib/_internal/js_runtime/lib/js_number.dart
index 33572a3..3895fe1 100644
--- a/sdk/lib/_internal/js_runtime/lib/js_number.dart
+++ b/sdk/lib/_internal/js_runtime/lib/js_number.dart
@@ -547,6 +547,24 @@
     return JS('JSUInt31', 'Math.clz32(#)', uint32);
   }
 
+  int get trailingZeroBitCount {
+    int v = JS<int>('int', '# | 0', this);
+    if (v == 0) return 32;
+    return JS<int>('JSUInt31', '31 - Math.clz32(# & -#)', v, v);
+  }
+
+  int get oneBitCount {
+    // The number of bits set in the least significant 32 bits of `this`,
+    // also known as the "Hamming weight". See:
+    // https://en.wikipedia.org/wiki/Hamming_weight for an explanation of the
+    // following algorithm.
+    int v = JS<int>('int', '# | 0', this);
+    v -= (v >>> 1) & 0x5555_5555;
+    v = (v & 0x3333_3333) + ((v >>> 2) & 0x3333_3333);
+    v = (v + (v >>> 4)) & 0x0f0f_0f0f;
+    return JS<int>('JSUInt31', '(Math.imul(#, 0x01010101) >>> 24)', v);
+  }
+
   // Returns pow(this, e) % m.
   int modPow(int e, int m) {
     if (e is! int) {
diff --git a/sdk/lib/_internal/vm/bin/filter_patch.dart b/sdk/lib/_internal/vm/bin/filter_patch.dart
index c822273..34d496a 100644
--- a/sdk/lib/_internal/vm/bin/filter_patch.dart
+++ b/sdk/lib/_internal/vm/bin/filter_patch.dart
@@ -7,7 +7,12 @@
 base class _FilterImpl extends NativeFieldWrapperClass1
     implements RawZLibFilter {
   @pragma("vm:external-name", "Filter_Process")
-  external void process(List<int> data, int start, int end);
+  external void _process(List<int> data, int start, int end);
+
+  void process(List<int> data, int start, int end) {
+    RangeError.checkValidRange(start, end, data.length);
+    _process(data, start, end);
+  }
 
   @pragma("vm:external-name", "Filter_Processed")
   external List<int>? processed({bool flush = true, bool end = false});
diff --git a/sdk/lib/_internal/vm/bin/socket_patch.dart b/sdk/lib/_internal/vm/bin/socket_patch.dart
index 7c3e88b..fcde7a6 100644
--- a/sdk/lib/_internal/vm/bin/socket_patch.dart
+++ b/sdk/lib/_internal/vm/bin/socket_patch.dart
@@ -1524,7 +1524,7 @@
       _BufferAndStart bufferAndStart = _ensureFastAndSerializableByteData(
         buffer,
         offset,
-        bytes,
+        offset + bytes,
       );
       if (!const bool.fromEnvironment("dart.vm.product")) {
         _SocketProfile.collectStatistic(
@@ -1568,7 +1568,7 @@
       _BufferAndStart bufferAndStart = _ensureFastAndSerializableByteData(
         buffer,
         offset,
-        bytes,
+        offset + bytes,
       );
       if (!const bool.fromEnvironment("dart.vm.product")) {
         _SocketProfile.collectStatistic(
diff --git a/sdk/lib/_internal/vm/bin/sync_socket_patch.dart b/sdk/lib/_internal/vm/bin/sync_socket_patch.dart
index 52b237d..8405f33 100644
--- a/sdk/lib/_internal/vm/bin/sync_socket_patch.dart
+++ b/sdk/lib/_internal/vm/bin/sync_socket_patch.dart
@@ -300,10 +300,11 @@
       start,
       end,
     );
+
     var result = _nativeWrite(
       bufferAndStart.buffer,
       bufferAndStart.start,
-      end - (start - bufferAndStart.start),
+      end - start,
     );
     if (result is OSError) {
       throw SocketException("writeFromSync failed", osError: result);
diff --git a/sdk/lib/_internal/vm/lib/ffi_patch.dart b/sdk/lib/_internal/vm/lib/ffi_patch.dart
index a46067e..d6da8e4 100644
--- a/sdk/lib/_internal/vm/lib/ffi_patch.dart
+++ b/sdk/lib/_internal/vm/lib/ffi_patch.dart
@@ -81,7 +81,6 @@
   throw UnimplementedError("$T");
 }
 
-@pragma("vm:idempotent")
 @pragma("vm:recognized", "other")
 @pragma("vm:idempotent")
 external Pointer<T> _fromAddress<T extends NativeType>(int ptr);
diff --git a/sdk/lib/_internal/vm/lib/integers.dart b/sdk/lib/_internal/vm/lib/integers.dart
index ad9a38f..80dcd34 100644
--- a/sdk/lib/_internal/vm/lib/integers.dart
+++ b/sdk/lib/_internal/vm/lib/integers.dart
@@ -162,6 +162,15 @@
   @pragma("vm:exact-result-type", bool)
   @pragma("vm:external-name", "Integer_equalToInteger")
   external bool _equalToInteger(int other);
+
+  @pragma("vm:exact-result-type", "dart:core#_Smi")
+  @pragma("vm:external-name", "Integer_trailingZeroBitCount")
+  external int get trailingZeroBitCount;
+
+  @pragma("vm:exact-result-type", "dart:core#_Smi")
+  @pragma("vm:external-name", "Integer_oneBitCount")
+  external int get oneBitCount;
+
   int abs() {
     return this < 0 ? -this : this;
   }
diff --git a/sdk/lib/_internal/wasm/lib/boxed_bool.dart b/sdk/lib/_internal/wasm/lib/boxed_bool.dart
index cb9ba59..6723eda 100644
--- a/sdk/lib/_internal/wasm/lib/boxed_bool.dart
+++ b/sdk/lib/_internal/wasm/lib/boxed_bool.dart
@@ -2,14 +2,15 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+import 'dart:_wasm';
+
 @pragma("wasm:entry-point")
 final class BoxedBool extends bool {
-  // A boxed bool contains an unboxed bool.
   @pragma("wasm:entry-point")
-  bool value = false;
+  final WasmI32 value;
 
-  /// Dummy factory to silence error about missing superclass constructor.
-  external factory BoxedBool();
+  @pragma("wasm:entry-point")
+  external BoxedBool();
 
   @override
   bool operator ==(Object other) {
diff --git a/sdk/lib/_internal/wasm/lib/boxed_int.dart b/sdk/lib/_internal/wasm/lib/boxed_int.dart
index e7526e4..be8ac45 100644
--- a/sdk/lib/_internal/wasm/lib/boxed_int.dart
+++ b/sdk/lib/_internal/wasm/lib/boxed_int.dart
@@ -432,6 +432,8 @@
   @pragma("wasm:intrinsic")
   external int operator ~();
   external int get bitLength;
+  external int get trailingZeroBitCount;
+  external int get oneBitCount;
 
   @override
   external String toString();
diff --git a/sdk/lib/_internal/wasm/lib/invoke_main_patch.dart b/sdk/lib/_internal/wasm/lib/invoke_main_patch.dart
index 9f2b3cb..af0f2e2 100644
--- a/sdk/lib/_internal/wasm/lib/invoke_main_patch.dart
+++ b/sdk/lib/_internal/wasm/lib/invoke_main_patch.dart
@@ -41,9 +41,10 @@
 /// Used to invoke the `main` function from JS, printing any exceptions that
 /// escape.
 @pragma("wasm:export", "\$invokeMain")
-void _invokeMain(WasmExternRef jsArrayRef) {
+WasmVoid _invokeMain(WasmExternRef jsArrayRef) {
   try {
     _invokeMainInternal(jsArrayRef);
+    return WasmVoid();
   } catch (e, s) {
     print(e);
     print(s);
diff --git a/sdk/lib/_internal/wasm/lib/js_helper_patch.dart b/sdk/lib/_internal/wasm/lib/js_helper_patch.dart
index fca34f1..ca8902b 100644
--- a/sdk/lib/_internal/wasm/lib/js_helper_patch.dart
+++ b/sdk/lib/_internal/wasm/lib/js_helper_patch.dart
@@ -455,11 +455,12 @@
 }
 
 @pragma("wasm:weak-export", "\$wasmI8ArraySet")
-void _wasmI8ArraySet(WasmExternRef? ref, WasmI32 index, WasmI32 value) {
+WasmVoid _wasmI8ArraySet(WasmExternRef? ref, WasmI32 index, WasmI32 value) {
   final array = unsafeCastOpaque<WasmArray<WasmI8>>(
     unsafeCast<WasmExternRef>(ref).internalize(),
   );
   array.write(index.toIntUnsigned(), value.toIntUnsigned());
+  return WasmVoid();
 }
 
 @pragma("wasm:export", "\$wasmI16ArrayGet")
@@ -471,11 +472,12 @@
 }
 
 @pragma("wasm:export", "\$wasmI16ArraySet")
-void _wasmI16ArraySet(WasmExternRef? ref, WasmI32 index, WasmI32 value) {
+WasmVoid _wasmI16ArraySet(WasmExternRef? ref, WasmI32 index, WasmI32 value) {
   final array = unsafeCastOpaque<WasmArray<WasmI16>>(
     unsafeCast<WasmExternRef>(ref).internalize(),
   );
   array.write(index.toIntUnsigned(), value.toIntUnsigned());
+  return WasmVoid();
 }
 
 @pragma("wasm:weak-export", "\$wasmI32ArrayGet")
@@ -487,11 +489,12 @@
 }
 
 @pragma("wasm:weak-export", "\$wasmI32ArraySet")
-void _wasmI32ArraySet(WasmExternRef? ref, WasmI32 index, WasmI32 value) {
+WasmVoid _wasmI32ArraySet(WasmExternRef? ref, WasmI32 index, WasmI32 value) {
   final array = unsafeCastOpaque<WasmArray<WasmI32>>(
     unsafeCast<WasmExternRef>(ref).internalize(),
   );
   array.write(index.toIntUnsigned(), value.toIntUnsigned());
+  return WasmVoid();
 }
 
 @pragma("wasm:weak-export", "\$wasmF32ArrayGet")
@@ -503,11 +506,12 @@
 }
 
 @pragma("wasm:weak-export", "\$wasmF32ArraySet")
-void _wasmF32ArraySet(WasmExternRef? ref, WasmI32 index, WasmF32 value) {
+WasmVoid _wasmF32ArraySet(WasmExternRef? ref, WasmI32 index, WasmF32 value) {
   final array = unsafeCastOpaque<WasmArray<WasmF32>>(
     unsafeCast<WasmExternRef>(ref).internalize(),
   );
   array[index.toIntUnsigned()] = value;
+  return WasmVoid();
 }
 
 @pragma("wasm:weak-export", "\$wasmF64ArrayGet")
@@ -519,9 +523,10 @@
 }
 
 @pragma("wasm:weak-export", "\$wasmF64ArraySet")
-void _wasmF64ArraySet(WasmExternRef? ref, WasmI32 index, WasmF64 value) {
+WasmVoid _wasmF64ArraySet(WasmExternRef? ref, WasmI32 index, WasmF64 value) {
   final array = unsafeCastOpaque<WasmArray<WasmF64>>(
     unsafeCast<WasmExternRef>(ref).internalize(),
   );
   array[index.toIntUnsigned()] = value;
+  return WasmVoid();
 }
diff --git a/sdk/lib/_internal/wasm/lib/js_string.dart b/sdk/lib/_internal/wasm/lib/js_string.dart
index 40bd866..401e924 100644
--- a/sdk/lib/_internal/wasm/lib/js_string.dart
+++ b/sdk/lib/_internal/wasm/lib/js_string.dart
@@ -239,7 +239,6 @@
   }
 
   @override
-  @pragma('dyn-module:callable')
   @pragma('wasm:pure-function')
   String operator +(String other) {
     return JSStringImpl.fromRefUnchecked(
diff --git a/sdk/lib/_internal/wasm/lib/record_patch.dart b/sdk/lib/_internal/wasm/lib/record_patch.dart
index 37076ec..3c92518 100644
--- a/sdk/lib/_internal/wasm/lib/record_patch.dart
+++ b/sdk/lib/_internal/wasm/lib/record_patch.dart
@@ -12,7 +12,6 @@
   _RecordType get _masqueradedRecordRuntimeType;
   _RecordType get _recordRuntimeType;
 
-  @pragma('dyn-module:can-be-overridden')
   bool _checkRecordType(
     WasmArray<_Type> types,
     ImmutableWasmArray<String> names,
diff --git a/sdk/lib/_internal/wasm/lib/type.dart b/sdk/lib/_internal/wasm/lib/type.dart
index 5153a13..dc6909c 100644
--- a/sdk/lib/_internal/wasm/lib/type.dart
+++ b/sdk/lib/_internal/wasm/lib/type.dart
@@ -581,7 +581,6 @@
   _Type get _asNullable => _RecordType(names, fieldTypes, true);
 
   @override
-  @pragma('dyn-module:callable')
   @pragma("wasm:static-dispatch")
   bool _checkInstance(Object o) {
     if (!_isRecordClassId(ClassID.getID(o))) return false;
@@ -1953,7 +1952,6 @@
 }
 
 @pragma("wasm:prefer-inline")
-@pragma('dyn-module:callable')
 _Type _getActualRuntimeTypeNullable(Object? object) =>
     object == null ? _literal<Null>() : _getActualRuntimeType(object);
 
diff --git a/sdk/lib/core/int.dart b/sdk/lib/core/int.dart
index a1a2b68..7de0a25 100644
--- a/sdk/lib/core/int.dart
+++ b/sdk/lib/core/int.dart
@@ -256,6 +256,46 @@
   /// ```
   int get bitLength;
 
+  /// The number of trailing (least significant) zero bits in the binary
+  /// representation of this integer.
+  ///
+  /// On JavaScript platforms, only the least significant 32 bits are used.
+  /// On native platforms, the 64-bit signed integer is used directly.
+  ///
+  /// The trailing zero-bit count is the position of the least significant
+  /// 1-bit in the binary representation of the integer. If the integer is
+  /// zero, the value is the size of integer that the platform uses for bit
+  /// operations (64-bit on native, 32-bit on the web).
+  /// ```dart
+  /// 1.trailingZeroBitCount;  // 0
+  /// 2.trailingZeroBitCount;  // 1
+  /// 8.trailingZeroBitCount;  // 3
+  /// 0.trailingZeroBitCount;  // 64 on native, 32 on the web
+  /// ```
+  @Since("3.13")
+  int get trailingZeroBitCount;
+
+  /// The number of `1` bits in the binary representation of this integer.
+  ///
+  /// On JavaScript platforms, only the least significant 32 bits are used.
+  /// On native platforms, the 64-bit signed integer is used directly.
+  ///
+  /// The one-bit count is the number of `1` digits in the binary
+  /// representation of that integer. A negative integer has one-digits up to
+  /// the size of integer that the platform uses for bit operations (64-bit
+  /// on native, 32-bit on the web).
+  /// The value of `n.oneBitCount + (~n).oneBitCount` is always the size the
+  /// platform uses for bit operations (on the web, at least if the value
+  /// starts out as a 32-bit integer).
+  /// ```dart
+  /// 0.oneBitCount;    // 0
+  /// 1.oneBitCount;    // 1
+  /// 7.oneBitCount;    // 3
+  /// (-1).oneBitCount; // 64 on native, 32 on the web
+  /// ```
+  @Since("3.13")
+  int get oneBitCount;
+
   /// Returns the least significant [width] bits of this integer as a
   /// non-negative number (i.e. unsigned representation).  The returned value has
   /// zeros in all bit positions higher than [width].
diff --git a/tests/corelib/int_bit_count_test.dart b/tests/corelib/int_bit_count_test.dart
new file mode 100644
index 0000000..6d0322d
--- /dev/null
+++ b/tests/corelib/int_bit_count_test.dart
@@ -0,0 +1,239 @@
+// Copyright (c) 2026, 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.
+//
+// Testing int.trailingZeroBitCount and int.oneBitCount.
+
+import "package:expect/expect.dart";
+import "package:expect/variations.dart" show jsNumbers;
+
+// Platform width for bit operations: 64 with native integer semantics
+// (VM, dart2wasm), 32 with JS-number semantics (dart2js, DDC).
+const int width = jsNumbers ? 32 : 64;
+
+// `js == null` means the case is only meaningful on a native (64-bit)
+// implementation and the JS assertion is skipped.
+void checkTrailing(int i, int native, int? js) {
+  final expected = jsNumbers ? js : native;
+  if (expected == null) return;
+  Expect.equals(expected, i.trailingZeroBitCount, '$i.trailingZeroBitCount');
+}
+
+void checkOne(int i, int native, int? js) {
+  final expected = jsNumbers ? js : native;
+  if (expected == null) return;
+  Expect.equals(expected, i.oneBitCount, '$i.oneBitCount');
+}
+
+void testTrailingZeroBitCount() {
+  // Zero: trailing count equals full platform width.
+  checkTrailing(0, 64, 32);
+
+  // Positive values.
+  checkTrailing(1, 0, 0);
+  checkTrailing(2, 1, 1);
+  checkTrailing(3, 0, 0);
+  checkTrailing(4, 2, 2);
+  checkTrailing(8, 3, 3);
+  checkTrailing(0x10, 4, 4);
+  checkTrailing(4096, 12, 12);
+  checkTrailing(0x8000_0000, 31, 31);
+  checkTrailing(0x7fff_ffff, 0, 0);
+
+  // Negative values: two's complement preserves low bits.
+  checkTrailing(-1, 0, 0);
+  checkTrailing(-2, 1, 1);
+  checkTrailing(-4, 2, 2);
+  checkTrailing(-1024, 10, 10);
+  checkTrailing(-0x4000_0000, 30, 30);
+  checkTrailing(-0x8000_0000, 31, 31);
+
+  // Values above the 32-bit range. On JS the operation is defined as
+  // counting trailing zeros of the low 32 bits, so any value whose low
+  // 32 bits are zero yields the JS platform width (32) regardless of
+  // what's above.
+  checkTrailing(0x1_0000_0000, 32, 32);
+  checkTrailing(0x2_0000_0000, 33, 32);
+  checkTrailing(0x4_0000_0000, 34, 32);
+  checkTrailing(0x100_0000_0000, 40, 32);
+  checkTrailing(0x8000_0000_0000_0000, 63, 32);
+
+  // 64-bit-range values whose low 32 bits are non-zero: the JS result
+  // is determined entirely by the low half.
+  checkTrailing(0x1_0000_0001, 0, 0);
+  checkTrailing(0x2_0000_0080, 7, 7);
+
+  // Near 2^63, JS doubles only have enough precision for values that
+  // differ by 2048 (= 2^11), so consecutive integers can't all be
+  // represented.
+  // `2^63 + 4096` is exactly representable.
+  // `2^63 + 4095` rounds up to the same value.
+  checkTrailing(0x8000_0000_0000_0000 + 4096, 12, 12);
+  checkTrailing(0x8000_0000_0000_0000 + 4095, 0, 12);
+}
+
+void testOneBitCount() {
+  checkOne(0, 0, 0);
+  checkOne(1, 1, 1);
+  checkOne(2, 1, 1);
+  checkOne(3, 2, 2);
+  checkOne(7, 3, 3);
+  checkOne(0x55, 4, 4);
+  checkOne(0xff, 8, 8);
+  checkOne(0xffff_ffff, 32, 32);
+
+  // Negative values: sign-extend to platform width.
+  checkOne(-1, 64, 32);
+  checkOne(-2, 63, 31);
+  checkOne(-3, 63, 31);
+  checkOne(~0x55, 60, 28);
+  checkOne(-0x5555_5555, 49, 17);
+  checkOne(-0x7fff_ffff, 34, 2);
+  checkOne(-0x8000_0000, 33, 1);
+
+  // Values above the 32-bit range. JS counts only the low 32 bits, so
+  // a single bit above bit 31 is invisible to JS oneBitCount.
+  checkOne(0x1_0000_0000, 1, 0);
+  checkOne(0x8000_0000_0000_0000, 1, 0);
+  checkOne(0x2_0000_0001, 2, 1);
+  checkOne(0x1_0000_FFFF, 17, 16);
+
+  // `0x5555_5555_0000_0000 + 0x5555_5555` constructs
+  // 0x5555_5555_5555_5555 on native, but the runtime addition overflows
+  // JS double precision so the result on JS is unpredictable. Only the
+  // native expectation is asserted.
+  if (!jsNumbers) {
+    final pattern = 0x5555_5555_0000_0000 + 0x5555_5555;
+    checkOne(pattern, 32, null);
+    checkOne(~0x8000_0000_0000_0000, 63, null);
+    // Setting any odd-position bit on the alternating pattern should
+    // raise the count from 32 to 33, exercising the 64-bit popcount path
+    // across all positions.
+    for (int i = 1; i < 64; i += 2) {
+      Expect.equals(
+        33,
+        (pattern | (1 << i)).oneBitCount,
+        '(pattern | (1<<$i)).oneBitCount',
+      );
+    }
+  }
+}
+
+// Exhaustive single-bit coverage across the full platform width.
+void testSingleBitCoverage() {
+  for (int b = 0; b < width; b++) {
+    final n = 1 << b;
+    Expect.equals(b, n.trailingZeroBitCount, '(1<<$b).trailingZeroBitCount');
+    Expect.equals(1, n.oneBitCount, '(1<<$b).oneBitCount');
+  }
+}
+
+// Dart-on-JS guarantees that bit operations performed on unsigned 32-bit
+// values produce the same answer as on a native 64-bit Dart implementation.
+// Verify the new getters honor that for a representative set of inputs that
+// span the full 32-bit unsigned range.
+void testUnsigned32BitConsistency() {
+  const cases = <(int, int, int)>[
+    (0x0000_0001, 0, 1),
+    (0x0000_0002, 1, 1),
+    (0x0000_0080, 7, 1),
+    (0x0000_FFFF, 0, 16),
+    (0x5555_5555, 0, 16),
+    (0xAAAA_AAAA, 1, 16),
+    (0xCCCC_CCCC, 2, 16),
+    (0xF0F0_F0F0, 4, 16),
+    (0x4000_0000, 30, 1),
+    (0x4000_0001, 0, 2),
+    (0x8000_0000, 31, 1),
+    (0x8000_0001, 0, 2),
+    (0xC000_0000, 30, 2),
+    (0xFFFF_FFFE, 1, 31),
+    (0xFFFF_FFFF, 0, 32),
+  ];
+  for (final (n, tzc, obc) in cases) {
+    Expect.equals(tzc, n.trailingZeroBitCount, '$n.trailingZeroBitCount');
+    Expect.equals(obc, n.oneBitCount, '$n.oneBitCount');
+  }
+}
+
+void testIdentities() {
+  // n.oneBitCount + (~n).oneBitCount == platform width.
+  for (final n in const [
+    0,
+    1,
+    2,
+    7,
+    42,
+    0x7fff_ffff,
+    0x8000_0000,
+    0xffff_ffff,
+    -1,
+    -2,
+    -42,
+  ]) {
+    Expect.equals(
+      width,
+      n.oneBitCount + (~n).oneBitCount,
+      '$n.oneBitCount + ~$n.oneBitCount',
+    );
+  }
+
+  // Cross-check: for any nonzero n, `(n & -n) - 1` is a mask of exactly
+  // `trailingZeroBitCount(n)` ones, so counting them recovers that count.
+  // Exercises both getters against each other.
+  void checkIdentity(int n) {
+    Expect.equals(
+      ((n & -n) - 1).oneBitCount,
+      n.trailingZeroBitCount,
+      '(($n & -$n) - 1).oneBitCount == $n.trailingZeroBitCount',
+    );
+  }
+
+  // Small values + unsigned 32-bit boundaries + sign-extended negatives.
+  // Identity holds on every backend.
+  for (final n in const [
+    1,
+    2,
+    3,
+    7,
+    42,
+    0x4000_0000,
+    0x8000_0000,
+    0xffff_ffff,
+    -1,
+    -2,
+    -42,
+  ]) {
+    checkIdentity(n);
+  }
+
+  // Values above the 32-bit range but within JS double mantissa precision
+  // (≤ 2^52). Under Dart's "operate on the low 32 bits" web semantics
+  // both sides of the identity collapse to 32, so the identity still
+  // holds on dart2js / DDC.
+  for (final n in const [
+    0x1_0000_0000, // 2^32
+    0x100_0000_0000, // 2^40
+    0x10_0000_0000_0000, // 2^52
+  ]) {
+    checkIdentity(n);
+  }
+
+  // Native-only: values whose source bit pattern is not preserved by JS
+  // doubles. Exercised only on backends with native 64-bit ints. The
+  // `+ 1` form is used to keep `0x20_0000_0000_0000` as the literal,
+  // since the dart2js analyzer rejects literals that can't be
+  // represented exactly as a JS Number.
+  if (!jsNumbers) {
+    checkIdentity(0x20_0000_0000_0000 + 1); // 2^53 + 1
+    checkIdentity(0x8000_0000_0000_0000); // 2^63
+  }
+}
+
+void main() {
+  testTrailingZeroBitCount();
+  testOneBitCount();
+  testSingleBitCoverage();
+  testUnsigned32BitConsistency();
+  testIdentities();
+}
diff --git a/tests/language/anonymous_methods/block/condition_variable_test.dart b/tests/language/anonymous_methods/block/condition_variable_test.dart
new file mode 100644
index 0000000..53ee64c
--- /dev/null
+++ b/tests/language/anonymous_methods/block/condition_variable_test.dart
@@ -0,0 +1,17 @@
+// Copyright (c) 2026, 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.
+
+// SharedOptions=--enable-experiment=anonymous-methods
+
+import 'package:expect/expect.dart';
+
+void main() {
+  final int? x = 2;
+  (x != null).{
+    Expect.isTrue(this ? x.isEven : false);
+  };
+  (x != null).(b) {
+    Expect.isTrue(b ? x.isEven : false);
+  };
+}
diff --git a/tests/language/anonymous_methods/block/private_field_promotion_test.dart b/tests/language/anonymous_methods/block/private_field_promotion_test.dart
index b31bd7d..2589b89 100644
--- a/tests/language/anonymous_methods/block/private_field_promotion_test.dart
+++ b/tests/language/anonymous_methods/block/private_field_promotion_test.dart
@@ -56,19 +56,20 @@
   }
 }
 
-void testParameterfulPromotionsCarriedIn(C c) {
+void testParameterfulPromotionsNotCarriedIn(C c) {
   if (c._x != null) {
     c._x.expectStaticType<Exactly<Object>>;
     c.(p) {
-      // `p` refers to the same object as `c`, so `p._x` is promoted.
-      p._x.expectStaticType<Exactly<Object>>;
+      // `p` refers to the same object as `c`, but `p._x` is not promoted
+      // because `p` is treated like a normal local variable.
+      p._x.expectStaticType<Exactly<Object?>>;
     };
   }
 }
 
 main() {
-  testParameterlessPromotionsCarriedIn(C(0));
-  testParameterfulPromotionsCarriedIn(C(0));
   C(0).testParameterlessRebindsThis();
   C(0).testParameterfulDoesNotRebindThis();
+  testParameterlessPromotionsCarriedIn(C(0));
+  testParameterfulPromotionsNotCarriedIn(C(0));
 }
diff --git a/tests/language/anonymous_methods/expression/condition_variable_test.dart b/tests/language/anonymous_methods/expression/condition_variable_test.dart
new file mode 100644
index 0000000..6c5f0e9
--- /dev/null
+++ b/tests/language/anonymous_methods/expression/condition_variable_test.dart
@@ -0,0 +1,13 @@
+// Copyright (c) 2026, 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.
+
+// SharedOptions=--enable-experiment=anonymous-methods
+
+import 'package:expect/expect.dart';
+
+void main() {
+  final int? x = 2;
+  Expect.isTrue((x != null).=> this ? x.isEven : false);
+  Expect.isTrue((x != null).(p) => p ? x.isEven : false);
+}
diff --git a/tests/language/anonymous_methods/expression/extension_member_test.dart b/tests/language/anonymous_methods/expression/extension_member_test.dart
index 1438599..014da99 100644
--- a/tests/language/anonymous_methods/expression/extension_member_test.dart
+++ b/tests/language/anonymous_methods/expression/extension_member_test.dart
@@ -6,7 +6,6 @@
 // SharedOptions=--enable-experiment=anonymous-methods
 
 import 'package:expect/expect.dart';
-import '../../static_type_helper.dart';
 
 extension on int {
   int get g1 => this + '$this'.=> this.length;
diff --git a/tests/language/anonymous_methods/expression/private_field_promotion_test.dart b/tests/language/anonymous_methods/expression/private_field_promotion_test.dart
index 418adf9..81e6159 100644
--- a/tests/language/anonymous_methods/expression/private_field_promotion_test.dart
+++ b/tests/language/anonymous_methods/expression/private_field_promotion_test.dart
@@ -43,7 +43,7 @@
   }
 }
 
-void testParameterlessPromotionsCarriedIn(C c) {
+void testParameterlessPromotionsCarriedInAndOut(C c) {
   if (c._x != null) {
     c._x.expectStaticType<Exactly<Object>>;
     // Inside the anonymous method, `this` refers to the same object as `c`, so
@@ -51,20 +51,29 @@
     c.=> _x.expectStaticType<Exactly<Object>>;
     c.=> this._x.expectStaticType<Exactly<Object>>;
   }
+  // The promotion is carried out again.
+  c._x.expectStaticType<Exactly<Object?>>;
+  if (c.=> _x is Object) {
+    c._x.expectStaticType<Exactly<Object>>;
+  }
+  if (c.=> this._x is Object) {
+    c._x.expectStaticType<Exactly<Object>>;
+  }
 }
 
-void testParameterfulPromotionsCarriedIn(C c) {
+void testParameterfulPromotionsNotCarriedIn(C c) {
   if (c._x != null) {
     c._x.expectStaticType<Exactly<Object>>;
-    // Inside the anonymous method, `p` refers to the same object as `c`, so
-    // `p._x` is promoted.
-    c.(p) => p._x.expectStaticType<Exactly<Object>>;
+    // Inside the anonymous method, `p` refers to the same object as `c`, but
+    // `p._x` is not promoted because `p` is treated like a normal local
+    // variable.
+    c.(p) => p._x.expectStaticType<Exactly<Object?>>;
   }
 }
 
 main() {
-  testParameterlessPromotionsCarriedIn(C(0));
-  testParameterfulPromotionsCarriedIn(C(0));
   C(0).testParameterlessRebindsThis();
   C(0).testParameterfulDoesNotRebindThis();
+  testParameterlessPromotionsCarriedInAndOut(C(0));
+  testParameterfulPromotionsNotCarriedIn(C(0));
 }
diff --git a/tests/language/anonymous_methods/expression/this_access_test.dart b/tests/language/anonymous_methods/expression/this_access_test.dart
index 1a55235..b9e3288 100644
--- a/tests/language/anonymous_methods/expression/this_access_test.dart
+++ b/tests/language/anonymous_methods/expression/this_access_test.dart
@@ -6,7 +6,6 @@
 // SharedOptions=--enable-experiment=anonymous-methods
 
 import 'package:expect/expect.dart';
-import '../../static_type_helper.dart';
 
 class A {
   final int x = 'first'.=> this.length + length;
diff --git a/tests/standalone/io/regress_sendmessage_overread_test.dart b/tests/standalone/io/regress_sendmessage_overread_test.dart
new file mode 100644
index 0000000..0389082
--- /dev/null
+++ b/tests/standalone/io/regress_sendmessage_overread_test.dart
@@ -0,0 +1,41 @@
+// Copyright (c) 2026, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:async';
+import 'dart:io';
+
+import 'package:expect/expect.dart';
+
+Future<void> main() async {
+  // sendMessage with control messages is POSIX-only.
+  if (!(Platform.isLinux || Platform.isMacOS)) {
+    return;
+  }
+
+  final server = await ServerSocket.bind(InternetAddress.loopbackIPv4, 0);
+  final got = Completer<List<int>>();
+
+  server.listen((sock) {
+    sock.close();
+    got.complete(sock.expand((v) => v).toList());
+  });
+
+  final client = await RawSocket.connect(
+    InternetAddress.loopbackIPv4,
+    server.port,
+  );
+
+  // `data` is a plain `List<int>` (not a `Uint8List`), forcing the helper
+  // to take its copy path.
+  final data = List<int>.generate(16, (i) => i);
+
+  client.sendMessage(const <SocketControlMessage>[], data, 5, 10);
+  client.close();
+
+  final received = await got.future.timeout(const Duration(seconds: 5));
+  await server.close();
+
+  Expect.equals(10, received.length);
+  Expect.listEquals(<int>[5, 6, 7, 8, 9, 10, 11, 12, 13, 14], received);
+}
diff --git a/tests/standalone/io/regress_writefromsync_overread_test.dart b/tests/standalone/io/regress_writefromsync_overread_test.dart
new file mode 100644
index 0000000..0aff1c6
--- /dev/null
+++ b/tests/standalone/io/regress_writefromsync_overread_test.dart
@@ -0,0 +1,35 @@
+// Copyright (c) 2026, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:async';
+import 'dart:io';
+import 'dart:typed_data';
+
+import 'package:expect/expect.dart';
+
+Future<void> main() async {
+  final server = await ServerSocket.bind(InternetAddress.loopbackIPv4, 0);
+  final got = Completer<List<int>>();
+
+  server.listen((sock) {
+    sock.close();
+    got.complete(sock.expand((v) => v).toList());
+  });
+
+  final c = RawSynchronousSocket.connectSync(
+    InternetAddress.loopbackIPv4,
+    server.port,
+  );
+
+  final buf = Uint8List.fromList(List.generate(16, (i) => i));
+
+  c.writeFromSync(buf, 5, 10);
+  c.closeSync();
+
+  final received = await got.future.timeout(const Duration(seconds: 5));
+  await server.close();
+
+  Expect.equals(5, received.length);
+  Expect.listEquals(<int>[5, 6, 7, 8, 9], received);
+}
diff --git a/tests/web/wasm/deferred_dynamic_table_test.dart b/tests/web/wasm/deferred_dynamic_table_test.dart
new file mode 100644
index 0000000..a35dfc0
--- /dev/null
+++ b/tests/web/wasm/deferred_dynamic_table_test.dart
@@ -0,0 +1,65 @@
+///// Copyright (c) 2026, 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.
+//
+// dart2wasmOptions=--enable-deferred-loading
+
+import '' deferred as lib0;
+import '' deferred as lib1;
+
+class A {
+  void foo() {
+    print('A.foo');
+  }
+}
+
+class B {
+  void foo() {
+    print('B.foo');
+  }
+}
+
+class C {
+  void foo() {
+    print('C.foo');
+  }
+}
+
+class D {
+  void foo() {
+    print('D.foo');
+  }
+}
+
+class E {
+  void foo() {
+    print('E.foo');
+  }
+}
+
+class F {
+  void foo() {
+    print('F.foo');
+  }
+}
+
+dynamic confuse(dynamic x) {
+  return x;
+}
+
+Future<void> main() async {
+  dynamic a = confuse(A());
+  dynamic b = confuse(B());
+  confuse(a).foo();
+  confuse(b).foo();
+  await lib0.loadLibrary();
+  dynamic c = confuse(lib0.C());
+  dynamic d = confuse(lib0.D());
+  confuse(c).foo();
+  confuse(d).foo();
+  await lib1.loadLibrary();
+  dynamic e = confuse(lib1.E());
+  dynamic f = confuse(lib1.F());
+  confuse(e).foo();
+  confuse(f).foo();
+}
diff --git a/tests/web/wasm/regress_63264_test.dart b/tests/web/wasm/regress_63264_test.dart
new file mode 100644
index 0000000..cc84000
--- /dev/null
+++ b/tests/web/wasm/regress_63264_test.dart
@@ -0,0 +1,23 @@
+// Copyright (c) 2026, 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() {
+  print(another());
+}
+
+Iterable<Object?> another() sync* {
+  for (int i = 0; i < 1; i++) {
+    // Add another scope
+    yield Object();
+  }
+  // Declare i before the closure.
+  int i = 23;
+  yield test(() => [1]);
+  // Use i after the closure.
+  print(i);
+}
+
+Object? test(Iterable<Object?> Function() f) {
+  return f();
+}
diff --git a/tools/VERSION b/tools/VERSION
index 38b9fb0..8870255 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 3
 MINOR 13
 PATCH 0
-PRERELEASE 106
+PRERELEASE 107
 PRERELEASE_PATCH 0
diff --git a/utils/aot_snapshot.gni b/utils/aot_snapshot.gni
index 25e84ed..48198a5 100644
--- a/utils/aot_snapshot.gni
+++ b/utils/aot_snapshot.gni
@@ -104,104 +104,39 @@
     }
   }
 
-  # Whether to build an AOT snapshot, which can be opened by dlopen.
-  # Ignore this option on Linux, as the default app-aot-elf AOT
-  # snapshot already can be used with dlopen on Linux.
-  as_shared_library = defined(invoker.as_shared_library) &&
-                      invoker.as_shared_library && !is_linux
+  # Create a snapshot from kernel built above.
+  gen_snapshot_action(target_name) {
+    if (defined(invoker.pool)) {
+      pool = invoker.pool
+    }
+    deps = extra_deps + [ ":${target_name}_dill" ]
 
-  assert(!(as_shared_library && is_win),
-         "AOT Snapshots as shared libraries are not supported on Windows")
+    inputs = extra_inputs
 
-  if (!as_shared_library) {
-    # Create a snapshot from kernel built above.
-    gen_snapshot_action(target_name) {
-      if (defined(invoker.pool)) {
-        pool = invoker.pool
-      }
-      deps = extra_deps + [ ":${target_name}_dill" ]
+    outputs = [ output ]
 
-      inputs = extra_inputs
+    abs_output = rebase_path(output)
 
-      outputs = [ output ]
-
-      abs_output = rebase_path(output)
-
+    # TODO(60813): Generate PE DLL on Windows.
+    if (is_mac) {
+      vm_args = [
+                  "--deterministic",
+                  "--snapshot-kind=app-aot-macho-dylib",
+                  "--macho=$abs_output",
+                ] + gen_snapshot_args
+    } else {
       vm_args = [
                   "--deterministic",
                   "--snapshot-kind=app-aot-elf",
                   "--elf=$abs_output",
                 ] + gen_snapshot_args
-      if (defined(invoker.vm_args)) {
-        vm_args += invoker.vm_args
-      }
-
-      args = [ rebase_path(dill) ]
-
-      force_product_mode = product_mode
     }
-  } else {
-    assembly = "$target_gen_dir/$name.S"
-    dill_target_name = ":${target_name}_dill"
-
-    # Create an assembly snapshot from kernel built above.
-    assembly_target_name = target_name + "_assembly"
-    gen_snapshot_action(assembly_target_name) {
-      if (defined(invoker.pool)) {
-        pool = invoker.pool
-      }
-      deps = extra_deps + [ dill_target_name ]
-
-      inputs = extra_inputs
-
-      outputs = [ assembly ]
-
-      abs_output = rebase_path(assembly)
-      vm_args = [
-                  "--deterministic",
-                  "--snapshot-kind=app-aot-assembly",
-                  "--assembly=$abs_output",
-                ] + gen_snapshot_args
-
-      args = [ rebase_path(dill) ]
-
-      force_product_mode = product_mode
+    if (defined(invoker.vm_args)) {
+      vm_args += invoker.vm_args
     }
 
-    # build a shared library from assembly.
-    shared_library_target_name = target_name + "_shared_library"
-    shared_library(shared_library_target_name) {
-      sources = [ assembly ]
-      deps = [ ":${assembly_target_name}" ]
-    }
+    args = [ rebase_path(dill) ]
 
-    output_prefix = "lib"
-    output_extension = ""
-
-    if (current_os == "mac" || current_os == "ios" || current_os == "watchos") {
-      output_extension = "dylib"
-    } else if (current_os == "win") {
-      output_extension = "dll"
-      output_prefix = ""
-    } else if (current_os == "unknown" && current_cpu == "wasm32") {
-      output_extension = "wasm"
-    } else {
-      output_extension = "so"
-    }
-
-    shared_library_output_file_name =
-        "$output_prefix$shared_library_target_name"
-    if (output_extension != "") {
-      shared_library_output_file_name += ".$output_extension"
-    }
-
-    # copy shared library to the same output, as when
-    # `as_shared_library` is False.
-    copy(target_name) {
-      sources = [ "$root_out_dir/$shared_library_output_file_name" ]
-      outputs = [ output ]
-
-      deps = [ ":${shared_library_target_name}" ]
-    }
+    force_product_mode = product_mode
   }
 }
